Reland "[Lighthouse] Rename Audits panel to Lighthouse"

This reverts commit 065146856295c7ebf01d538820d3f2e60c383335.

Reason for revert: Cause of failure has been remedied. See: https://chromium-review.googlesource.com/c/chromium/src/+/2055398

Original change's description:
> Revert "[Lighthouse] Rename Audits panel to Lighthouse"
>
> This reverts commit 2ae53ef04d84c4201836eb63238e97bc180ea54d.
>
> Reason for revert: This CL breaks CI: https://ci.chromium.org/p/devtools-frontend/builders/ci/DevTools%20Linux/453. It looks like the layout test expects audits not lighthouse in the name, so it's probably in need of a 3-way merge.
>
> Original change's description:
> > [Lighthouse] Rename Audits panel to Lighthouse
> >
> > Change-Id: Ia2ab175d2a3b6c8ded73aff8ff0f5582f5a8fa0c
> > Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/2044605
> > Commit-Queue: Connor Clark <cjamcl@chromium.org>
> > Reviewed-by: Tim van der Lippe <tvanderlippe@chromium.org>
> > Reviewed-by: Paul Irish <paulirish@chromium.org>
>
> TBR=paulirish@chromium.org,aerotwist@chromium.org,tvanderlippe@chromium.org,cjamcl@chromium.org
>
> Change-Id: Ia6d5f42a0e6ece4352696c51bf0de5754774cb0a
> No-Presubmit: true
> No-Tree-Checks: true
> No-Try: true
> Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/2051983
> Reviewed-by: Paul Lewis <aerotwist@chromium.org>
> Commit-Queue: Paul Lewis <aerotwist@chromium.org>

TBR=paulirish@chromium.org,aerotwist@chromium.org,tvanderlippe@chromium.org,cjamcl@chromium.org

# Not skipping CQ checks because original CL landed > 1 day ago.

Bug: 1052111
Change-Id: I638ca9bd5cd94e02fb7318f2a7d7c66fca40e6c8
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/2056866
Reviewed-by: Connor Clark <cjamcl@chromium.org>
Reviewed-by: Paul Irish <paulirish@chromium.org>
Reviewed-by: Tim van der Lippe <tvanderlippe@chromium.org>
Commit-Queue: Connor Clark <cjamcl@chromium.org>
diff --git a/.eslintignore b/.eslintignore
index 4bb706d..67c015b 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -8,8 +8,8 @@
 front_end/InspectorBackendCommands.js
 front_end/SupportedCSSProperties.js
 front_end/accessibility/ARIAProperties.js
-front_end/audits_worker/lighthouse/
-front_end/audits/lighthouse/
+front_end/lighthouse_worker/lighthouse/
+front_end/lighthouse/lighthouse/
 front_end/cm/
 front_end/cm_headless/
 front_end/cm_modes/
diff --git a/BUILD.gn b/BUILD.gn
index 290ff1f..4c37562 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -21,21 +21,21 @@
   "front_end/application_test_runner/ResourcesTestRunner.js",
   "front_end/application_test_runner/ResourceTreeTestRunner.js",
   "front_end/application_test_runner/ServiceWorkersTestRunner.js",
-  "front_end/audits_test_runner/AuditsTestRunner.js",
-  "front_end/audits_test_runner/module.json",
-  "front_end/audits_worker.js",
-  "front_end/audits_worker.json",
-  "front_end/audits_worker/AuditsService.js",
-  "front_end/audits_worker/lighthouse/lighthouse-dt-bundle.js",
-  "front_end/audits_worker/module.json",
-  "front_end/audits/auditsDialog.css",
-  "front_end/audits/auditsPanel.css",
-  "front_end/audits/auditsStartView.css",
-  "front_end/audits/lighthouse/report.css",
-  "front_end/audits/lighthouse/report.js",
-  "front_end/audits/lighthouse/template.html",
-  "front_end/audits/lighthouse/templates.html",
-  "front_end/audits/module.json",
+  "front_end/lighthouse_test_runner/LighthouseTestRunner.js",
+  "front_end/lighthouse_test_runner/module.json",
+  "front_end/lighthouse_worker.js",
+  "front_end/lighthouse_worker.json",
+  "front_end/lighthouse_worker/LighthouseService.js",
+  "front_end/lighthouse_worker/lighthouse/lighthouse-dt-bundle.js",
+  "front_end/lighthouse_worker/module.json",
+  "front_end/lighthouse/lighthouseDialog.css",
+  "front_end/lighthouse/lighthousePanel.css",
+  "front_end/lighthouse/lighthouseStartView.css",
+  "front_end/lighthouse/lighthouse/report.css",
+  "front_end/lighthouse/lighthouse/report.js",
+  "front_end/lighthouse/lighthouse/template.html",
+  "front_end/lighthouse/lighthouse/templates.html",
+  "front_end/lighthouse/module.json",
   "front_end/axe_core_test_runner/AxeCoreTestRunner.js",
   "front_end/axe_core_test_runner/module.json",
   "front_end/bindings_test_runner/AutomappingTestRunner.js",
@@ -381,54 +381,54 @@
 ]
 
 lighthouse_locale_files = [
-  "front_end/audits_worker/lighthouse/locales/ar-XB.json",
-  "front_end/audits_worker/lighthouse/locales/ar.json",
-  "front_end/audits_worker/lighthouse/locales/bg.json",
-  "front_end/audits_worker/lighthouse/locales/ca.json",
-  "front_end/audits_worker/lighthouse/locales/cs.json",
-  "front_end/audits_worker/lighthouse/locales/da.json",
-  "front_end/audits_worker/lighthouse/locales/de.json",
-  "front_end/audits_worker/lighthouse/locales/el.json",
-  "front_end/audits_worker/lighthouse/locales/en-GB.json",
-  "front_end/audits_worker/lighthouse/locales/en-US.json",
-  "front_end/audits_worker/lighthouse/locales/en-XA.json",
-  "front_end/audits_worker/lighthouse/locales/en-XL.json",
-  "front_end/audits_worker/lighthouse/locales/es-419.json",
-  "front_end/audits_worker/lighthouse/locales/es.json",
-  "front_end/audits_worker/lighthouse/locales/fi.json",
-  "front_end/audits_worker/lighthouse/locales/fil.json",
-  "front_end/audits_worker/lighthouse/locales/fr.json",
-  "front_end/audits_worker/lighthouse/locales/he.json",
-  "front_end/audits_worker/lighthouse/locales/hi.json",
-  "front_end/audits_worker/lighthouse/locales/hr.json",
-  "front_end/audits_worker/lighthouse/locales/hu.json",
-  "front_end/audits_worker/lighthouse/locales/id.json",
-  "front_end/audits_worker/lighthouse/locales/it.json",
-  "front_end/audits_worker/lighthouse/locales/ja.json",
-  "front_end/audits_worker/lighthouse/locales/ko.json",
-  "front_end/audits_worker/lighthouse/locales/lt.json",
-  "front_end/audits_worker/lighthouse/locales/lv.json",
-  "front_end/audits_worker/lighthouse/locales/nl.json",
-  "front_end/audits_worker/lighthouse/locales/no.json",
-  "front_end/audits_worker/lighthouse/locales/pl.json",
-  "front_end/audits_worker/lighthouse/locales/pt-PT.json",
-  "front_end/audits_worker/lighthouse/locales/pt.json",
-  "front_end/audits_worker/lighthouse/locales/ro.json",
-  "front_end/audits_worker/lighthouse/locales/ru.json",
-  "front_end/audits_worker/lighthouse/locales/sk.json",
-  "front_end/audits_worker/lighthouse/locales/sl.json",
-  "front_end/audits_worker/lighthouse/locales/sr-Latn.json",
-  "front_end/audits_worker/lighthouse/locales/sr.json",
-  "front_end/audits_worker/lighthouse/locales/sv.json",
-  "front_end/audits_worker/lighthouse/locales/ta.json",
-  "front_end/audits_worker/lighthouse/locales/te.json",
-  "front_end/audits_worker/lighthouse/locales/th.json",
-  "front_end/audits_worker/lighthouse/locales/tr.json",
-  "front_end/audits_worker/lighthouse/locales/uk.json",
-  "front_end/audits_worker/lighthouse/locales/vi.json",
-  "front_end/audits_worker/lighthouse/locales/zh-HK.json",
-  "front_end/audits_worker/lighthouse/locales/zh-TW.json",
-  "front_end/audits_worker/lighthouse/locales/zh.json",
+  "front_end/lighthouse_worker/lighthouse/locales/ar-XB.json",
+  "front_end/lighthouse_worker/lighthouse/locales/ar.json",
+  "front_end/lighthouse_worker/lighthouse/locales/bg.json",
+  "front_end/lighthouse_worker/lighthouse/locales/ca.json",
+  "front_end/lighthouse_worker/lighthouse/locales/cs.json",
+  "front_end/lighthouse_worker/lighthouse/locales/da.json",
+  "front_end/lighthouse_worker/lighthouse/locales/de.json",
+  "front_end/lighthouse_worker/lighthouse/locales/el.json",
+  "front_end/lighthouse_worker/lighthouse/locales/en-GB.json",
+  "front_end/lighthouse_worker/lighthouse/locales/en-US.json",
+  "front_end/lighthouse_worker/lighthouse/locales/en-XA.json",
+  "front_end/lighthouse_worker/lighthouse/locales/en-XL.json",
+  "front_end/lighthouse_worker/lighthouse/locales/es-419.json",
+  "front_end/lighthouse_worker/lighthouse/locales/es.json",
+  "front_end/lighthouse_worker/lighthouse/locales/fi.json",
+  "front_end/lighthouse_worker/lighthouse/locales/fil.json",
+  "front_end/lighthouse_worker/lighthouse/locales/fr.json",
+  "front_end/lighthouse_worker/lighthouse/locales/he.json",
+  "front_end/lighthouse_worker/lighthouse/locales/hi.json",
+  "front_end/lighthouse_worker/lighthouse/locales/hr.json",
+  "front_end/lighthouse_worker/lighthouse/locales/hu.json",
+  "front_end/lighthouse_worker/lighthouse/locales/id.json",
+  "front_end/lighthouse_worker/lighthouse/locales/it.json",
+  "front_end/lighthouse_worker/lighthouse/locales/ja.json",
+  "front_end/lighthouse_worker/lighthouse/locales/ko.json",
+  "front_end/lighthouse_worker/lighthouse/locales/lt.json",
+  "front_end/lighthouse_worker/lighthouse/locales/lv.json",
+  "front_end/lighthouse_worker/lighthouse/locales/nl.json",
+  "front_end/lighthouse_worker/lighthouse/locales/no.json",
+  "front_end/lighthouse_worker/lighthouse/locales/pl.json",
+  "front_end/lighthouse_worker/lighthouse/locales/pt-PT.json",
+  "front_end/lighthouse_worker/lighthouse/locales/pt.json",
+  "front_end/lighthouse_worker/lighthouse/locales/ro.json",
+  "front_end/lighthouse_worker/lighthouse/locales/ru.json",
+  "front_end/lighthouse_worker/lighthouse/locales/sk.json",
+  "front_end/lighthouse_worker/lighthouse/locales/sl.json",
+  "front_end/lighthouse_worker/lighthouse/locales/sr-Latn.json",
+  "front_end/lighthouse_worker/lighthouse/locales/sr.json",
+  "front_end/lighthouse_worker/lighthouse/locales/sv.json",
+  "front_end/lighthouse_worker/lighthouse/locales/ta.json",
+  "front_end/lighthouse_worker/lighthouse/locales/te.json",
+  "front_end/lighthouse_worker/lighthouse/locales/th.json",
+  "front_end/lighthouse_worker/lighthouse/locales/tr.json",
+  "front_end/lighthouse_worker/lighthouse/locales/uk.json",
+  "front_end/lighthouse_worker/lighthouse/locales/vi.json",
+  "front_end/lighthouse_worker/lighthouse/locales/zh-HK.json",
+  "front_end/lighthouse_worker/lighthouse/locales/zh-TW.json",
+  "front_end/lighthouse_worker/lighthouse/locales/zh.json",
 ]
 
 all_devtools_files += lighthouse_locale_files
@@ -451,18 +451,18 @@
   "front_end/animation/AnimationScreenshotPopover.js",
   "front_end/animation/AnimationTimeline.js",
   "front_end/animation/AnimationUI.js",
-  "front_end/audits/audits.js",
-  "front_end/audits/audits-legacy.js",
-  "front_end/audits/AuditsController.js",
-  "front_end/audits/AuditsPanel.js",
-  "front_end/audits/AuditsProtocolService.js",
-  "front_end/audits/AuditsReportRenderer.js",
-  "front_end/audits/AuditsReportSelector.js",
-  "front_end/audits/AuditsStartView.js",
-  "front_end/audits/AuditsStatusView.js",
-  "front_end/audits/lighthouse/report-generator.js",
-  "front_end/audits/lighthouse/report.js",
-  "front_end/audits/RadioSetting.js",
+  "front_end/lighthouse/lighthouse.js",
+  "front_end/lighthouse/lighthouse-legacy.js",
+  "front_end/lighthouse/LighthouseController.js",
+  "front_end/lighthouse/LighthousePanel.js",
+  "front_end/lighthouse/LighthouseProtocolService.js",
+  "front_end/lighthouse/LighthouseReportRenderer.js",
+  "front_end/lighthouse/LighthouseReportSelector.js",
+  "front_end/lighthouse/LighthouseStartView.js",
+  "front_end/lighthouse/LighthouseStatusView.js",
+  "front_end/lighthouse/lighthouse/report-generator.js",
+  "front_end/lighthouse/lighthouse/report.js",
+  "front_end/lighthouse/RadioSetting.js",
   "front_end/bindings/bindings.js",
   "front_end/bindings/bindings-legacy.js",
   "front_end/bindings/BlackboxManager.js",
@@ -1178,8 +1178,8 @@
   "front_end/application_test_runner/ResourcesTestRunner.js",
   "front_end/application_test_runner/ResourceTreeTestRunner.js",
   "front_end/application_test_runner/ServiceWorkersTestRunner.js",
-  "front_end/audits_test_runner/AuditsTestRunner.js",
-  "front_end/audits_test_runner/module.json",
+  "front_end/lighthouse_test_runner/LighthouseTestRunner.js",
+  "front_end/lighthouse_test_runner/module.json",
   "front_end/axe_core_test_runner/AxeCoreTestRunner.js",
   "front_end/axe_core_test_runner/module.json",
   "front_end/bindings_test_runner/AutomappingTestRunner.js",
@@ -1286,7 +1286,7 @@
   "front_end/Images/accelerometer-left.png",
   "front_end/Images/accelerometer-right.png",
   "front_end/Images/accelerometer-top.png",
-  "front_end/Images/audits_logo.svg",
+  "front_end/Images/lighthouse_logo.svg",
   "front_end/Images/breakpoint.svg",
   "front_end/Images/breakpointConditional.svg",
   "front_end/Images/checkboxCheckmark.svg",
@@ -1378,18 +1378,18 @@
   "$resources_out_dir/animation/AnimationScreenshotPopover.js",
   "$resources_out_dir/animation/AnimationTimeline.js",
   "$resources_out_dir/animation/AnimationUI.js",
-  "$resources_out_dir/audits/audits.js",
-  "$resources_out_dir/audits/audits-legacy.js",
-  "$resources_out_dir/audits/AuditsController.js",
-  "$resources_out_dir/audits/AuditsPanel.js",
-  "$resources_out_dir/audits/AuditsProtocolService.js",
-  "$resources_out_dir/audits/AuditsReportRenderer.js",
-  "$resources_out_dir/audits/AuditsReportSelector.js",
-  "$resources_out_dir/audits/AuditsStartView.js",
-  "$resources_out_dir/audits/AuditsStatusView.js",
-  "$resources_out_dir/audits/lighthouse/report-generator.js",
-  "$resources_out_dir/audits/lighthouse/report.js",
-  "$resources_out_dir/audits/RadioSetting.js",
+  "$resources_out_dir/lighthouse/lighthouse.js",
+  "$resources_out_dir/lighthouse/lighthouse-legacy.js",
+  "$resources_out_dir/lighthouse/LighthouseController.js",
+  "$resources_out_dir/lighthouse/LighthousePanel.js",
+  "$resources_out_dir/lighthouse/LighthouseProtocolService.js",
+  "$resources_out_dir/lighthouse/LighthouseReportRenderer.js",
+  "$resources_out_dir/lighthouse/LighthouseReportSelector.js",
+  "$resources_out_dir/lighthouse/LighthouseStartView.js",
+  "$resources_out_dir/lighthouse/LighthouseStatusView.js",
+  "$resources_out_dir/lighthouse/lighthouse/report-generator.js",
+  "$resources_out_dir/lighthouse/lighthouse/report.js",
+  "$resources_out_dir/lighthouse/RadioSetting.js",
   "$resources_out_dir/bindings/bindings.js",
   "$resources_out_dir/bindings/bindings-legacy.js",
   "$resources_out_dir/bindings/BlackboxManager.js",
@@ -2093,7 +2093,7 @@
 ]
 
 generated_applications = [
-  "$resources_out_dir/audits_worker.js",
+  "$resources_out_dir/lighthouse_worker.js",
   "$resources_out_dir/devtools_app.html",
   "$resources_out_dir/devtools_app.js",
   "$resources_out_dir/inspector.html",
@@ -2112,7 +2112,7 @@
 generated_non_autostart_non_remote_modules = [
   "$resources_out_dir/accessibility/accessibility_module.js",
   "$resources_out_dir/animation/animation_module.js",
-  "$resources_out_dir/audits/audits_module.js",
+  "$resources_out_dir/lighthouse/lighthouse_module.js",
   "$resources_out_dir/browser_debugger/browser_debugger_module.js",
   "$resources_out_dir/changes/changes_module.js",
   "$resources_out_dir/cm_modes/cm_modes_module.js",
@@ -2163,7 +2163,7 @@
 ]
 
 generated_remote_modules = [
-  "$resources_out_dir/audits_worker/audits_worker_module.js",
+  "$resources_out_dir/lighthouse_worker/lighthouse_worker_module.js",
   "$resources_out_dir/dagre_layout/dagre_layout_module.js",
   "$resources_out_dir/emulated_devices/emulated_devices_module.js",
 ]
@@ -2171,7 +2171,7 @@
 generated_test_modules = [
   "$resources_out_dir/accessibility_test_runner/accessibility_test_runner_module.js",
   "$resources_out_dir/application_test_runner/application_test_runner_module.js",
-  "$resources_out_dir/audits_test_runner/audits_test_runner_module.js",
+  "$resources_out_dir/lighthouse_test_runner/lighthouse_test_runner_module.js",
   "$resources_out_dir/axe_core_test_runner/axe_core_test_runner_module.js",
   "$resources_out_dir/bindings_test_runner/bindings_test_runner_module.js",
   "$resources_out_dir/console_test_runner/console_test_runner_module.js",
@@ -2206,7 +2206,7 @@
 ]
 
 devtools_applications = [
-  "audits_worker",
+  "lighthouse_worker",
   "devtools_app",
   "formatter_worker_entrypoint",
   "heap_snapshot_worker_entrypoint",
@@ -2289,7 +2289,7 @@
 copy("copy_lighthouse_locale_files") {
   sources = lighthouse_locale_files
   outputs = [
-    "$resources_out_dir/audits_worker/lighthouse/locales/{{source_file_part}}",
+    "$resources_out_dir/lighthouse_worker/lighthouse/locales/{{source_file_part}}",
   ]
 }
 
diff --git a/AUDITS_OWNERS b/LIGHTHOUSE_OWNERS
similarity index 100%
rename from AUDITS_OWNERS
rename to LIGHTHOUSE_OWNERS
diff --git a/front_end/Images/audits_logo.svg b/front_end/Images/lighthouse_logo.svg
similarity index 100%
rename from front_end/Images/audits_logo.svg
rename to front_end/Images/lighthouse_logo.svg
diff --git a/front_end/Images/src/audits_logo.svg b/front_end/Images/src/lighthouse_logo.svg
similarity index 100%
rename from front_end/Images/src/audits_logo.svg
rename to front_end/Images/src/lighthouse_logo.svg
diff --git a/front_end/Images/src/optimize_svg.hashes b/front_end/Images/src/optimize_svg.hashes
index d3d6e10..104b059 100644
--- a/front_end/Images/src/optimize_svg.hashes
+++ b/front_end/Images/src/optimize_svg.hashes
@@ -11,6 +11,6 @@
     "largeIcons.svg": "647bfea907de08e009edcb5ee9214b42",
     "treeoutlineTriangles.svg": "2d26ab85d919f83d5021f2f385dffd0b",
     "chevrons.svg": "79b4b527771e30b6388ce664077b3409",
-    "audits_logo.svg": "b889aaf8631e71e3427eb96d3433e319",
+    "lighthouse_logo.svg": "b889aaf8631e71e3427eb96d3433e319",
     "accelerometer-front.svg": "a4dcdac47131aa923346c15e01bc644a"
 }
\ No newline at end of file
diff --git a/front_end/OWNERS b/front_end/OWNERS
index 7578a99..52ccbb5 100644
--- a/front_end/OWNERS
+++ b/front_end/OWNERS
@@ -1,4 +1,4 @@
 alph@chromium.org
 caseq@chromium.org
 
-per-file audits*=file://AUDITS_OWNERS
+per-file audits*=file://LIGHTHOUSE_OWNERS
diff --git a/front_end/Runtime.js b/front_end/Runtime.js
index 2d23675..1396121 100644
--- a/front_end/Runtime.js
+++ b/front_end/Runtime.js
@@ -132,7 +132,7 @@
     return Runtime.loadResourcePromise(url).catch(err => {
       const urlWithFallbackVersion = url.replace(/@[0-9a-f]{40}/, REMOTE_MODULE_FALLBACK_REVISION);
       // TODO(phulce): mark fallbacks in module.json and modify build script instead
-      if (urlWithFallbackVersion === url || !url.includes('audits_worker_module')) {
+      if (urlWithFallbackVersion === url || !url.includes('lighthouse_worker_module')) {
         throw err;
       }
       return Runtime.loadResourcePromise(urlWithFallbackVersion);
diff --git a/front_end/audits/OWNERS b/front_end/audits/OWNERS
deleted file mode 100644
index e9dca12..0000000
--- a/front_end/audits/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-file://AUDITS_OWNERS
diff --git a/front_end/audits/audits-legacy.js b/front_end/audits/audits-legacy.js
deleted file mode 100644
index 1ff6bfe..0000000
--- a/front_end/audits/audits-legacy.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import * as AuditsModule from './audits.js';
-
-self.Audits = self.Audits || {};
-Audits = Audits || {};
-
-/**
- * @constructor
- */
-Audits.AuditsPanel = AuditsModule.AuditsPanel.AuditsPanel;
-
-/**
- * @constructor
- */
-Audits.ReportSelector = AuditsModule.AuditsReportSelector.ReportSelector;
-
-/**
-* @constructor
-*/
-Audits.StatusView = AuditsModule.AuditsStatusView.StatusView;
-
-/** @typedef {{setting: !Common.Setting, configID: string, title: string, description: string}} */
-Audits.Preset;
-
-/** @typedef {{setting: !Common.Setting, description: string, setFlags: function(!Object, string), options: (!Array|undefined), title: (string|undefined)}} */
-Audits.RuntimeSetting;
diff --git a/front_end/audits/audits.js b/front_end/audits/audits.js
deleted file mode 100644
index acb0639..0000000
--- a/front_end/audits/audits.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import './lighthouse/report.js';
-import './lighthouse/report-generator.js';
-
-import * as AuditsController from './AuditsController.js';
-import * as AuditsPanel from './AuditsPanel.js';
-import * as AuditsProtocolService from './AuditsProtocolService.js';
-import * as AuditsReportRenderer from './AuditsReportRenderer.js';
-import * as AuditsReportSelector from './AuditsReportSelector.js';
-import * as AuditsStartView from './AuditsStartView.js';
-import * as AuditsStatusView from './AuditsStatusView.js';
-import * as RadioSetting from './RadioSetting.js';
-
-export {
-  AuditsController,
-  AuditsPanel,
-  AuditsProtocolService,
-  AuditsReportRenderer,
-  AuditsReportSelector,
-  AuditsStartView,
-  AuditsStatusView,
-  RadioSetting,
-};
diff --git a/front_end/audits/module.json b/front_end/audits/module.json
deleted file mode 100644
index 82fb6ef..0000000
--- a/front_end/audits/module.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
-    "extensions": [
-        {
-            "type": "view",
-            "location": "panel",
-            "id": "audits",
-            "title": "Audits",
-            "order": 90,
-            "className": "Audits.AuditsPanel",
-            "tags": "lighthouse, pwa"
-        }
-    ],
-    "dependencies": [
-        "components",
-        "emulation",
-        "timeline",
-        "inspector_main",
-        "sdk",
-        "services",
-        "ui"
-    ],
-    "scripts": [],
-    "modules": [
-        "audits.js",
-        "audits-legacy.js",
-        "lighthouse/report.js",
-        "lighthouse/report-generator.js",
-        "RadioSetting.js",
-        "AuditsPanel.js",
-        "AuditsController.js",
-        "AuditsReportSelector.js",
-        "AuditsReportRenderer.js",
-        "AuditsStartView.js",
-        "AuditsStatusView.js",
-        "AuditsProtocolService.js"
-    ],
-    "resources": [
-        "auditsDialog.css",
-        "auditsPanel.css",
-        "auditsStartView.css",
-        "lighthouse/template.html",
-        "lighthouse/templates.html",
-        "lighthouse/report.css",
-        "lighthouse/report.js"
-    ],
-    "skip_compilation": [
-      "lighthouse/report.js",
-      "lighthouse/report-generator.js"
-  ]
-}
diff --git a/front_end/audits_test_runner/AuditsTestRunner.js b/front_end/audits_test_runner/AuditsTestRunner.js
deleted file mode 100644
index 4e67de7..0000000
--- a/front_end/audits_test_runner/AuditsTestRunner.js
+++ /dev/null
@@ -1,136 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-/**
- * @fileoverview using private properties isn't a Closure violation in tests.
- * @suppress {accessControls}
- */
-
-/**
- * @return {!Audits.AuditsPanel}
- */
-AuditsTestRunner._panel = function() {
-  return /** @type {!Object} **/ (UI.panels).audits;
-};
-
-/**
- * @return {?Element}
- */
-AuditsTestRunner.getContainerElement = function() {
-  return AuditsTestRunner._panel().contentElement;
-};
-
-/**
- * @return {?Element}
- */
-AuditsTestRunner.getResultsElement = function() {
-  return AuditsTestRunner._panel()._auditResultsElement;
-};
-
-/**
- * @return {?Element}
- */
-AuditsTestRunner.getDialogElement = function() {
-  return AuditsTestRunner._panel()._statusView._dialog.contentElement.shadowRoot.querySelector('.audits-view');
-};
-
-/**
- * @return {?Element}
- */
-AuditsTestRunner.getSettingsElement = function() {
-  return AuditsTestRunner._panel()._settingsPane.element;
-};
-
-/**
- * @return {?Element}
- */
-AuditsTestRunner.getRunButton = function() {
-  const dialog = AuditsTestRunner.getContainerElement();
-  return dialog && dialog.querySelectorAll('button')[0];
-};
-
-/**
- * @return {?Element}
- */
-AuditsTestRunner.getCancelButton = function() {
-  const dialog = AuditsTestRunner.getDialogElement();
-  return dialog && dialog.querySelectorAll('button')[0];
-};
-
-AuditsTestRunner.openStartAudit = function() {
-  AuditsTestRunner._panel()._renderStartView();
-};
-
-/**
- * @param {function(string)} onMessage
- */
-AuditsTestRunner.addStatusListener = function(onMessage) {
-  TestRunner.addSniffer(Audits.StatusView.prototype, 'updateStatus', onMessage, true);
-};
-
-/**
- * @return {!Promise<!Object>}
- */
-AuditsTestRunner.waitForResults = function() {
-  return new Promise(resolve => {
-    TestRunner.addSniffer(Audits.AuditsPanel.prototype, '_buildReportUI',
-      (lhr, artifacts) => resolve({lhr, artifacts}));
-  });
-};
-
-AuditsTestRunner.forcePageAuditabilityCheck = function() {
-  AuditsTestRunner._panel()._controller.recomputePageAuditability();
-};
-
-/**
- * @param {?Element} checkboxContainer
- * @return {string}
- */
-AuditsTestRunner._checkboxStateLabel = function(checkboxContainer) {
-  if (!checkboxContainer) {
-    return 'missing';
-  }
-
-  const label = checkboxContainer.textElement.textContent;
-  const checkedLabel = checkboxContainer.checkboxElement.checked ? 'x' : ' ';
-  return `[${checkedLabel}] ${label}`;
-};
-
-/**
- * @param {?Element} button
- * @return {string}
- */
-AuditsTestRunner._buttonStateLabel = function(button) {
-  if (!button) {
-    return 'missing';
-  }
-
-  const enabledLabel = button.disabled ? 'disabled' : 'enabled';
-  const hiddenLabel = window.getComputedStyle(button).getPropertyValue('visibility');
-  return `${button.textContent}: ${enabledLabel} ${hiddenLabel}`;
-};
-
-AuditsTestRunner.dumpStartAuditState = function() {
-  TestRunner.addResult('\n========== Audits Start Audit State ==========');
-
-  const containerElement = AuditsTestRunner.getContainerElement();
-  const checkboxes = [...containerElement.querySelectorAll('.checkbox')];
-
-  const toolbarShadowRoot =
-    AuditsTestRunner.getSettingsElement().querySelector('.audits-settings-pane > div').shadowRoot;
-  for (const checkbox of toolbarShadowRoot.querySelectorAll('.checkbox')) {
-    checkboxes.push(checkbox);
-  }
-
-  checkboxes.forEach(element => {
-    TestRunner.addResult(AuditsTestRunner._checkboxStateLabel(element));
-  });
-
-  const helpText = containerElement.querySelector('.audits-help-text');
-  if (!helpText.classList.contains('hidden')) {
-    TestRunner.addResult(`Help text: ${helpText.textContent}`);
-  }
-
-  TestRunner.addResult(AuditsTestRunner._buttonStateLabel(AuditsTestRunner.getRunButton()));
-};
diff --git a/front_end/audits_test_runner/OWNERS b/front_end/audits_test_runner/OWNERS
deleted file mode 100644
index e9dca12..0000000
--- a/front_end/audits_test_runner/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-file://AUDITS_OWNERS
diff --git a/front_end/audits_test_runner/module.json b/front_end/audits_test_runner/module.json
deleted file mode 100644
index 24aa8c5..0000000
--- a/front_end/audits_test_runner/module.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "dependencies": [
-    "test_runner",
-    "audits"
-  ],
-  "scripts": [
-    "AuditsTestRunner.js"
-  ]
-}
\ No newline at end of file
diff --git a/front_end/audits_worker/OWNERS b/front_end/audits_worker/OWNERS
deleted file mode 100644
index e9dca12..0000000
--- a/front_end/audits_worker/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-file://AUDITS_OWNERS
diff --git a/front_end/audits_worker/lighthouse/lighthouse-dt-bundle.js b/front_end/audits_worker/lighthouse/lighthouse-dt-bundle.js
deleted file mode 100644
index ca529b9..0000000
--- a/front_end/audits_worker/lighthouse/lighthouse-dt-bundle.js
+++ /dev/null
@@ -1,71336 +0,0 @@
-// lighthouse, browserified. 5.7.0 (005c2e6f48e7cc4bfefaa4b0551122edbe04a993)
-require=function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a;}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r);},p,p.exports,r,e,n,t);}return n[i].exports;}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o;}return r;}()({"../audits/accessibility/accesskeys":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'`[accesskey]` values are unique',
-
-failureTitle:'`[accesskey]` values are not unique',
-
-description:'Access keys let users quickly focus a part of the page. For proper '+
-'navigation, each access key must be unique. '+
-'[Learn more](https://web.dev/accesskeys/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class Accesskeys extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'accesskeys',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=Accesskeys;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/accesskeys.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-allowed-attr":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'`[aria-*]` attributes match their roles',
-
-failureTitle:'`[aria-*]` attributes do not match their roles',
-
-description:'Each ARIA `role` supports a specific subset of `aria-*` attributes. '+
-'Mismatching these invalidates the `aria-*` attributes. [Learn '+
-'more](https://web.dev/aria-allowed-attr/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class ARIAAllowedAttr extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'aria-allowed-attr',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=ARIAAllowedAttr;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/aria-allowed-attr.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-required-attr":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'`[role]`s have all required `[aria-*]` attributes',
-
-failureTitle:'`[role]`s do not have all required `[aria-*]` attributes',
-
-description:'Some ARIA roles have required attributes that describe the state '+
-'of the element to screen readers. [Learn more](https://web.dev/aria-required-attr/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class ARIARequiredAttr extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'aria-required-attr',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=ARIARequiredAttr;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/aria-required-attr.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-required-children":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Elements with an ARIA `[role]` that require children to contain a specific '+
-'`[role]` have all required children.',
-
-failureTitle:'Elements with an ARIA `[role]` that require children to contain a specific '+
-'`[role]` are missing some or all of those required children.',
-
-description:'Some ARIA parent roles must contain specific child roles to perform '+
-'their intended accessibility functions. '+
-'[Learn more](https://web.dev/aria-required-children/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class AriaRequiredChildren extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'aria-required-children',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=AriaRequiredChildren;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/aria-required-children.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-required-parent":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'`[role]`s are contained by their required parent element',
-
-failureTitle:'`[role]`s are not contained by their required parent element',
-
-description:'Some ARIA child roles must be contained by specific parent roles to '+
-'properly perform their intended accessibility functions. '+
-'[Learn more](https://web.dev/aria-required-parent/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class AriaRequiredParent extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'aria-required-parent',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=AriaRequiredParent;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/aria-required-parent.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-roles":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'`[role]` values are valid',
-
-failureTitle:'`[role]` values are not valid',
-
-description:'ARIA roles must have valid values in order to perform their '+
-'intended accessibility functions. '+
-'[Learn more](https://web.dev/aria-roles/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class AriaRoles extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'aria-roles',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=AriaRoles;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/aria-roles.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-valid-attr-value":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'`[aria-*]` attributes have valid values',
-
-failureTitle:'`[aria-*]` attributes do not have valid values',
-
-description:'Assistive technologies, like screen readers, can\'t interpret ARIA '+
-'attributes with invalid values. [Learn '+
-'more](https://web.dev/aria-valid-attr-value/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class ARIAValidAttr extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'aria-valid-attr-value',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=ARIAValidAttr;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/aria-valid-attr-value.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-valid-attr":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'`[aria-*]` attributes are valid and not misspelled',
-
-failureTitle:'`[aria-*]` attributes are not valid or misspelled',
-
-description:'Assistive technologies, like screen readers, can\'t interpret ARIA '+
-'attributes with invalid names. [Learn '+
-'more](https://web.dev/aria-valid-attr/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class ARIAValidAttr extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'aria-valid-attr',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=ARIAValidAttr;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/aria-valid-attr.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/audio-caption":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'`<audio>` elements contain a `<track>` element with `[kind="captions"]`',
-
-failureTitle:'`<audio>` elements are missing a `<track>` element with '+
-'`[kind="captions"]`.',
-
-description:'Captions make audio elements usable for deaf or hearing-impaired users, '+
-'providing critical information such as who is talking, what they\'re saying, '+
-'and other non-speech information. '+
-'[Learn more](https://web.dev/audio-caption/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class AudioCaption extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'audio-caption',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=AudioCaption;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/audio-caption.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/button-name":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Buttons have an accessible name',
-
-failureTitle:'Buttons do not have an accessible name',
-
-description:'When a button doesn\'t have an accessible name, screen readers announce it '+
-'as "button", making it unusable for users who rely on screen readers. '+
-'[Learn more](https://web.dev/button-name/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class ButtonName extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'button-name',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=ButtonName;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/button-name.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/bypass":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'The page contains a heading, skip link, or landmark region',
-
-failureTitle:'The page does not contain a heading, skip link, or landmark region',
-
-description:'Adding ways to bypass repetitive content lets keyboard users navigate the '+
-'page more efficiently. '+
-'[Learn more](https://web.dev/bypass/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class Bypass extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'bypass',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=Bypass;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/bypass.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/color-contrast":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Background and foreground colors have a sufficient contrast ratio',
-
-failureTitle:'Background and foreground colors do not have a '+
-'sufficient contrast ratio.',
-
-description:'Low-contrast text is difficult or impossible for many users to read. '+
-'[Learn more](https://web.dev/color-contrast/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class ColorContrast extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'color-contrast',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=ColorContrast;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/color-contrast.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/definition-list":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'`<dl>`\'s contain only properly-ordered `<dt>` and `<dd>` groups, `<script>` '+
-'or `<template>` elements.',
-
-failureTitle:'`<dl>`\'s do not contain only properly-ordered `<dt>` and `<dd>` '+
-'groups, `<script>` or `<template>` elements.',
-
-description:'When definition lists are not properly marked up, screen readers may produce '+
-'confusing or inaccurate output. '+
-'[Learn more](https://web.dev/definition-list/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class DefinitionList extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'definition-list',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=DefinitionList;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/definition-list.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/dlitem":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Definition list items are wrapped in `<dl>` elements',
-
-failureTitle:'Definition list items are not wrapped in `<dl>` elements',
-
-description:'Definition list items (`<dt>` and `<dd>`) must be wrapped in a '+
-'parent `<dl>` element to ensure that screen readers can properly announce them. '+
-'[Learn more](https://web.dev/dlitem/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class DLItem extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'dlitem',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=DLItem;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/dlitem.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/document-title":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Document has a `<title>` element',
-
-failureTitle:'Document doesn\'t have a `<title>` element',
-
-description:'The title gives screen reader users an overview of the page, and search '+
-'engine users rely on it heavily to determine if a page is relevant to their search. '+
-'[Learn more](https://web.dev/document-title/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class DocumentTitle extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'document-title',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=DocumentTitle;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/document-title.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/duplicate-id":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'`[id]` attributes on the page are unique',
-
-failureTitle:'`[id]` attributes on the page are not unique',
-
-description:'The value of an id attribute must be unique to prevent '+
-'other instances from being overlooked by assistive technologies. '+
-'[Learn more](https://web.dev/duplicate-id/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class DuplicateId extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'duplicate-id',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=DuplicateId;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/duplicate-id.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/frame-title":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'`<frame>` or `<iframe>` elements have a title',
-
-failureTitle:'`<frame>` or `<iframe>` elements do not have a title',
-
-description:'Screen reader users rely on frame titles to describe the contents of frames. '+
-'[Learn more](https://web.dev/frame-title/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class FrameTitle extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'frame-title',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=FrameTitle;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/frame-title.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/html-has-lang":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'`<html>` element has a `[lang]` attribute',
-
-failureTitle:'`<html>` element does not have a `[lang]` attribute',
-
-description:'If a page doesn\'t specify a lang attribute, a screen reader assumes '+
-'that the page is in the default language that the user chose when setting up the '+
-'screen reader. If the page isn\'t actually in the default language, then the screen '+
-'reader might not announce the page\'s text correctly. '+
-'[Learn more](https://web.dev/html-has-lang/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class HTMLHasLang extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'html-has-lang',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=HTMLHasLang;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/html-has-lang.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/html-lang-valid":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'`<html>` element has a valid value for its `[lang]` attribute',
-
-failureTitle:'`<html>` element does not have a valid value for '+
-'its `[lang]` attribute.',
-
-description:'Specifying a valid [BCP 47 language](https://www.w3.org/International/questions/qa-choosing-language-tags#question) '+
-'helps screen readers announce text properly. '+
-'[Learn more](https://web.dev/html-lang-valid/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class HTMLLangValid extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'html-lang-valid',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=HTMLLangValid;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/html-lang-valid.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/image-alt":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Image elements have `[alt]` attributes',
-
-failureTitle:'Image elements do not have `[alt]` attributes',
-
-description:'Informative elements should aim for short, descriptive alternate text. '+
-'Decorative elements can be ignored with an empty alt attribute. '+
-'[Learn more](https://web.dev/image-alt/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class ImageAlt extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'image-alt',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=ImageAlt;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/image-alt.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/input-image-alt":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'`<input type="image">` elements have `[alt]` text',
-
-failureTitle:'`<input type="image">` elements do not have `[alt]` text',
-
-description:'When an image is being used as an `<input>` button, providing alternative '+
-'text can help screen reader users understand the purpose of the button. '+
-'[Learn more](https://web.dev/input-image-alt/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class InputImageAlt extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'input-image-alt',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=InputImageAlt;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/input-image-alt.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/label":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Form elements have associated labels',
-
-failureTitle:'Form elements do not have associated labels',
-
-description:'Labels ensure that form controls are announced properly by assistive '+
-'technologies, like screen readers. [Learn '+
-'more](https://web.dev/label/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class Label extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'label',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=Label;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/label.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/layout-table":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Presentational `<table>` elements avoid using `<th>`, `<caption>` or the '+
-'`[summary]` attribute.',
-
-failureTitle:'Presentational `<table>` elements do not avoid using `<th>`, '+
-'`<caption>` or the `[summary]` attribute.',
-
-description:'A table being used for layout purposes should not include data elements, '+
-'such as the th or caption elements or the summary attribute, because this can '+
-'create a confusing experience for screen reader users. '+
-'[Learn more](https://web.dev/layout-table/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class LayoutTable extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'layout-table',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=LayoutTable;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/layout-table.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/link-name":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Links have a discernible name',
-
-failureTitle:'Links do not have a discernible name',
-
-description:'Link text (and alternate text for images, when used as links) that is '+
-'discernible, unique, and focusable improves the navigation experience for '+
-'screen reader users. '+
-'[Learn more](https://web.dev/link-name/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class LinkName extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'link-name',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=LinkName;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/link-name.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/listitem":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'List items (`<li>`) are contained within `<ul>` or `<ol>` parent elements',
-
-failureTitle:'List items (`<li>`) are not contained within `<ul>` '+
-'or `<ol>` parent elements.',
-
-description:'Screen readers require list items (`<li>`) to be contained within a '+
-'parent `<ul>` or `<ol>` to be announced properly. '+
-'[Learn more](https://web.dev/listitem/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class ListItem extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'listitem',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=ListItem;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/listitem.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/list":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Lists contain only `<li>` elements and script supporting elements '+
-'(`<script>` and `<template>`).',
-
-failureTitle:'Lists do not contain only `<li>` elements and script '+
-'supporting elements (`<script>` and `<template>`).',
-
-description:'Screen readers have a specific way of announcing lists. Ensuring proper list '+
-'structure aids screen reader output. '+
-'[Learn more](https://web.dev/list/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class List extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'list',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=List;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/list.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/manual/custom-controls-labels":[function(require,module,exports){
-
-
-
-
-
-
-'use strict';
-
-const ManualAudit=require('../../manual/manual-audit.js');
-
-
-
-
-
-class CustomControlsLabels extends ManualAudit{
-
-
-
-static get meta(){
-return Object.assign({
-id:'custom-controls-labels',
-description:'Custom interactive controls have associated labels, provided by aria-label or aria-labelledby. [Learn more](https://web.dev/custom-controls-labels/).',
-title:'Custom controls have associated labels'},
-super.partialMeta);
-}}
-
-
-module.exports=CustomControlsLabels;
-
-},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/custom-controls-roles":[function(require,module,exports){
-
-
-
-
-
-
-'use strict';
-
-const ManualAudit=require('../../manual/manual-audit.js');
-
-
-
-
-
-class CustomControlsRoles extends ManualAudit{
-
-
-
-static get meta(){
-return Object.assign({
-id:'custom-controls-roles',
-description:'Custom interactive controls have appropriate ARIA roles. [Learn more](https://web.dev/custom-control-roles/).',
-title:'Custom controls have ARIA roles'},
-super.partialMeta);
-}}
-
-
-module.exports=CustomControlsRoles;
-
-},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/focus-traps":[function(require,module,exports){
-
-
-
-
-
-
-'use strict';
-
-const ManualAudit=require('../../manual/manual-audit.js');
-
-
-
-
-
-class FocusTraps extends ManualAudit{
-
-
-
-static get meta(){
-return Object.assign({
-id:'focus-traps',
-description:'A user can tab into and out of any control or region without accidentally trapping their focus. [Learn more](https://web.dev/focus-traps/).',
-title:'User focus is not accidentally trapped in a region'},
-super.partialMeta);
-}}
-
-
-module.exports=FocusTraps;
-
-},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/focusable-controls":[function(require,module,exports){
-
-
-
-
-
-
-'use strict';
-
-const ManualAudit=require('../../manual/manual-audit.js');
-
-
-
-
-
-class FocusableControls extends ManualAudit{
-
-
-
-static get meta(){
-return Object.assign({
-id:'focusable-controls',
-description:'Custom interactive controls are keyboard focusable and display a focus indicator. [Learn more](https://web.dev/focusable-controls/).',
-title:'Interactive controls are keyboard focusable'},
-super.partialMeta);
-}}
-
-
-module.exports=FocusableControls;
-
-},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/heading-levels":[function(require,module,exports){
-
-
-
-
-
-
-'use strict';
-
-const ManualAudit=require('../../manual/manual-audit.js');
-
-
-
-
-
-class HeadingLevels extends ManualAudit{
-
-
-
-static get meta(){
-return Object.assign({
-id:'heading-levels',
-description:'Headings are used to create an outline for the page and heading levels are not skipped. [Learn more](https://web.dev/heading-levels/).',
-title:'Headings don\'t skip levels'},
-super.partialMeta);
-}}
-
-
-module.exports=HeadingLevels;
-
-},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/interactive-element-affordance":[function(require,module,exports){
-
-
-
-
-
-
-'use strict';
-
-const ManualAudit=require('../../manual/manual-audit.js');
-
-
-
-
-
-class InteractiveElementAffordance extends ManualAudit{
-
-
-
-static get meta(){
-return Object.assign({
-id:'interactive-element-affordance',
-description:'Interactive elements, such as links and buttons, should indicate their state and be distinguishable from non-interactive elements. [Learn more](https://web.dev/interactive-element-affordance/).',
-title:'Interactive elements indicate their purpose and state'},
-super.partialMeta);
-}}
-
-
-module.exports=InteractiveElementAffordance;
-
-},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/logical-tab-order":[function(require,module,exports){
-
-
-
-
-
-
-'use strict';
-
-const ManualAudit=require('../../manual/manual-audit.js');
-
-
-
-
-
-class LogicalTabOrder extends ManualAudit{
-
-
-
-static get meta(){
-return Object.assign({
-id:'logical-tab-order',
-description:'Tabbing through the page follows the visual layout. Users cannot focus elements that are offscreen. [Learn more](https://web.dev/logical-tab-order/).',
-title:'The page has a logical tab order'},
-super.partialMeta);
-}}
-
-
-module.exports=LogicalTabOrder;
-
-},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/managed-focus":[function(require,module,exports){
-
-
-
-
-
-
-'use strict';
-
-const ManualAudit=require('../../manual/manual-audit.js');
-
-
-
-
-
-class ManagedFocus extends ManualAudit{
-
-
-
-static get meta(){
-return Object.assign({
-id:'managed-focus',
-description:'If new content, such as a dialog, is added to the page, the user\'s focus is directed to it. [Learn more](https://web.dev/managed-focus/).',
-title:'The user\'s focus is directed to new content added to the page'},
-super.partialMeta);
-}}
-
-
-module.exports=ManagedFocus;
-
-},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/offscreen-content-hidden":[function(require,module,exports){
-
-
-
-
-
-
-'use strict';
-
-const ManualAudit=require('../../manual/manual-audit.js');
-
-
-
-
-
-
-class OffscreenContentHidden extends ManualAudit{
-
-
-
-static get meta(){
-return Object.assign({
-id:'offscreen-content-hidden',
-description:'Offscreen content is hidden with display: none or aria-hidden=true. [Learn more](https://web.dev/offscreen-content-hidden/).',
-title:'Offscreen content is hidden from assistive technology'},
-super.partialMeta);
-}}
-
-
-module.exports=OffscreenContentHidden;
-
-},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/use-landmarks":[function(require,module,exports){
-
-
-
-
-
-
-'use strict';
-
-const ManualAudit=require('../../manual/manual-audit.js');
-
-
-
-
-
-class UseLandmarks extends ManualAudit{
-
-
-
-static get meta(){
-return Object.assign({
-id:'use-landmarks',
-description:'Landmark elements (<main>, <nav>, etc.) are used to improve the keyboard navigation of the page for assistive technology. [Learn more](https://web.dev/use-landmarks/).',
-title:'HTML5 landmark elements are used to improve navigation'},
-super.partialMeta);
-}}
-
-
-module.exports=UseLandmarks;
-
-},{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/visual-order-follows-dom":[function(require,module,exports){
-
-
-
-
-
-
-'use strict';
-
-const ManualAudit=require('../../manual/manual-audit.js');
-
-
-
-
-
-class VisualOrderFollowsDOM extends ManualAudit{
-
-
-
-static get meta(){
-return Object.assign({
-id:'visual-order-follows-dom',
-description:'DOM order matches the visual order, improving navigation for assistive technology. [Learn more](https://web.dev/visual-order-follows-dom/).',
-title:'Visual order on the page follows DOM order'},
-super.partialMeta);
-}}
-
-
-module.exports=VisualOrderFollowsDOM;
-
-},{"../../manual/manual-audit.js":5}],"../audits/accessibility/meta-refresh":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'The document does not use `<meta http-equiv="refresh">`',
-
-failureTitle:'The document uses `<meta http-equiv="refresh">`',
-
-description:'Users do not expect a page to refresh automatically, and doing so will move '+
-'focus back to the top of the page. This may create a frustrating or '+
-'confusing experience. '+
-'[Learn more](https://web.dev/meta-refresh/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class MetaRefresh extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'meta-refresh',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=MetaRefresh;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/meta-refresh.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/meta-viewport":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'`[user-scalable="no"]` is not used in the `<meta name="viewport">` '+
-'element and the `[maximum-scale]` attribute is not less than 5.',
-
-failureTitle:'`[user-scalable="no"]` is used in the `<meta name="viewport">` '+
-'element or the `[maximum-scale]` attribute is less than 5.',
-
-description:'Disabling zooming is problematic for users with low vision who rely on '+
-'screen magnification to properly see the contents of a web page. '+
-'[Learn more](https://web.dev/meta-viewport/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class MetaViewport extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'meta-viewport',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=MetaViewport;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/meta-viewport.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/object-alt":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'`<object>` elements have `[alt]` text',
-
-failureTitle:'`<object>` elements do not have `[alt]` text',
-
-description:'Screen readers cannot translate non-text content. Adding alt text to '+
-'`<object>` elements helps screen readers convey meaning to users. '+
-'[Learn more](https://web.dev/object-alt/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class ObjectAlt extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'object-alt',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=ObjectAlt;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/object-alt.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/tabindex":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'No element has a `[tabindex]` value greater than 0',
-
-failureTitle:'Some elements have a `[tabindex]` value greater than 0',
-
-description:'A value greater than 0 implies an explicit navigation ordering. '+
-'Although technically valid, this often creates frustrating experiences '+
-'for users who rely on assistive technologies. [Learn more](https://web.dev/tabindex/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class TabIndex extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'tabindex',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=TabIndex;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/tabindex.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/td-headers-attr":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Cells in a `<table>` element that use the `[headers]` attribute refer '+
-'to table cells within the same table.',
-
-failureTitle:'Cells in a `<table>` element that use the `[headers]` attribute refer '+
-'to an element `id` not found within the same table.',
-
-description:'Screen readers have features to make navigating tables easier. Ensuring '+
-'`<td>` cells using the `[headers]` attribute only refer to other cells in the same '+
-'table may improve the experience for screen reader users. '+
-'[Learn more](https://web.dev/td-headers-attr/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class TDHeadersAttr extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'td-headers-attr',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=TDHeadersAttr;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/td-headers-attr.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/th-has-data-cells":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'`<th>` elements and elements with `[role="columnheader"/"rowheader"]` have '+
-'data cells they describe.',
-
-failureTitle:'`<th>` elements and elements with '+
-'`[role="columnheader"/"rowheader"]` do not have data cells they describe.',
-
-description:'Screen readers have features to make navigating tables easier. Ensuring '+
-'table headers always refer to some set of cells may improve the experience for screen '+
-'reader users. '+
-'[Learn more](https://web.dev/th-has-data-cells/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class THHasDataCells extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'th-has-data-cells',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=THHasDataCells;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/th-has-data-cells.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/valid-lang":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'`[lang]` attributes have a valid value',
-
-failureTitle:'`[lang]` attributes do not have a valid value',
-
-description:'Specifying a valid [BCP 47 language](https://www.w3.org/International/questions/qa-choosing-language-tags#question) '+
-'on elements helps ensure that text is pronounced correctly by a screen reader. '+
-'[Learn more](https://web.dev/valid-lang/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class ValidLang extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'valid-lang',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=ValidLang;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/valid-lang.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/video-caption":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'`<video>` elements contain a `<track>` element with `[kind="captions"]`',
-
-failureTitle:'`<video>` elements do not contain a `<track>` element '+
-'with `[kind="captions"]`.',
-
-description:'When a video provides a caption it is easier for deaf and hearing impaired '+
-'users to access its information. '+
-'[Learn more](https://web.dev/video-caption/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class VideoCaption extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'video-caption',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=VideoCaption;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/video-caption.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/video-description":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const AxeAudit=require('./axe-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'`<video>` elements contain a `<track>` element with `[kind="description"]`',
-
-failureTitle:'`<video>` elements do not contain a `<track>` element with '+
-'`[kind="description"]`.',
-
-description:'Audio descriptions provide relevant information for videos that dialogue '+
-'cannot, such as facial expressions and scenes. '+
-'[Learn more](https://web.dev/video-description/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class VideoDescription extends AxeAudit{
-
-
-
-static get meta(){
-return{
-id:'video-description',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Accessibility']};
-
-}}
-
-
-module.exports=VideoDescription;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/video-description.js");
-},{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/apple-touch-icon":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const i18n=require('../lib/i18n/i18n.js');
-
-
-
-
-
-const UIStrings={
-
-title:'Provides a valid `apple-touch-icon`',
-
-failureTitle:'Does not provide a valid `apple-touch-icon`',
-
-description:'For ideal appearance on iOS when users add a progressive web app to the home '+
-'screen, define an `apple-touch-icon`. It must point to a non-transparent 192px (or 180px) '+
-'square PNG. [Learn More](https://web.dev/apple-touch-icon/).',
-
-precomposedWarning:'`apple-touch-icon-precomposed` is out of date; '+
-'`apple-touch-icon` is preferred.'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class AppleTouchIcon extends Audit{
-
-
-
-static get meta(){
-return{
-id:'apple-touch-icon',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['LinkElements']};
-
-}
-
-
-
-
-
-static audit(artifacts){
-const appleTouchIcons=artifacts.LinkElements.
-filter(el=>el.rel==='apple-touch-icon'||el.rel==='apple-touch-icon-precomposed').
-filter(el=>!!el.href);
-
-
-const passed=appleTouchIcons.length!==0;
-
-const warnings=[];
-if(appleTouchIcons.filter(el=>el.rel==='apple-touch-icon-precomposed').length!==0&&
-appleTouchIcons.filter(el=>el.rel==='apple-touch-icon').length===0){
-warnings.push(str_(UIStrings.precomposedWarning));
-}
-
-return{
-score:passed?1:0,
-warnings};
-
-}}
-
-
-module.exports=AppleTouchIcon;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/apple-touch-icon.js");
-},{"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/bootup-time":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const NetworkRequest=require('../lib/network-request.js');
-const{taskGroups}=require('../lib/tracehouse/task-groups.js');
-const i18n=require('../lib/i18n/i18n.js');
-const NetworkRecords=require('../computed/network-records.js');
-const MainThreadTasks=require('../computed/main-thread-tasks.js');
-
-const UIStrings={
-
-title:'JavaScript execution time',
-
-failureTitle:'Reduce JavaScript execution time',
-
-description:'Consider reducing the time spent parsing, compiling, and executing JS. '+
-'You may find delivering smaller JS payloads helps with this. [Learn '+
-'more](https://web.dev/bootup-time).',
-
-columnTotal:'Total CPU Time',
-
-columnScriptEval:'Script Evaluation',
-
-columnScriptParse:'Script Parse',
-
-chromeExtensionsWarning:'Chrome extensions negatively affected this page\'s load performance. '+
-'Try auditing the page in incognito mode or from a Chrome profile without extensions.'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class BootupTime extends Audit{
-
-
-
-static get meta(){
-return{
-id:'bootup-time',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['traces','devtoolsLogs']};
-
-}
-
-
-
-
-static get defaultOptions(){
-return{
-
-
-scorePODR:600,
-scoreMedian:3500,
-thresholdInMs:50};
-
-}
-
-
-
-
-static getJavaScriptURLs(records){
-
-const urls=new Set();
-for(const record of records){
-if(record.resourceType===NetworkRequest.TYPES.Script){
-urls.add(record.url);
-}
-}
-
-return urls;
-}
-
-
-
-
-
-
-static getAttributableURLForTask(task,jsURLs){
-const jsURL=task.attributableURLs.find(url=>jsURLs.has(url));
-const fallbackURL=task.attributableURLs[0];
-let attributableURL=jsURL||fallbackURL;
-
-if(!attributableURL||attributableURL==='about:blank')attributableURL='Other';
-return attributableURL;
-}
-
-
-
-
-
-
-static getExecutionTimingsByURL(tasks,jsURLs){
-
-const result=new Map();
-
-for(const task of tasks){
-const attributableURL=BootupTime.getAttributableURLForTask(task,jsURLs);
-const timingByGroupId=result.get(attributableURL)||{};
-const originalTime=timingByGroupId[task.group.id]||0;
-timingByGroupId[task.group.id]=originalTime+task.selfTime;
-result.set(attributableURL,timingByGroupId);
-}
-
-return result;
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const settings=context.settings||{};
-const trace=artifacts.traces[BootupTime.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[BootupTime.DEFAULT_PASS];
-const networkRecords=await NetworkRecords.request(devtoolsLog,context);
-const tasks=await MainThreadTasks.request(trace,context);
-const multiplier=settings.throttlingMethod==='simulate'?
-settings.throttling.cpuSlowdownMultiplier:1;
-
-const jsURLs=BootupTime.getJavaScriptURLs(networkRecords);
-const executionTimings=BootupTime.getExecutionTimingsByURL(tasks,jsURLs);
-
-let hadExcessiveChromeExtension=false;
-let totalBootupTime=0;
-const results=Array.from(executionTimings).
-map(([url,timingByGroupId])=>{
-
-let totalExecutionTimeForURL=0;
-for(const[groupId,timespanMs]of Object.entries(timingByGroupId)){
-timingByGroupId[groupId]=timespanMs*multiplier;
-totalExecutionTimeForURL+=timespanMs*multiplier;
-}
-
-const scriptingTotal=timingByGroupId[taskGroups.scriptEvaluation.id]||0;
-const parseCompileTotal=timingByGroupId[taskGroups.scriptParseCompile.id]||0;
-
-
-if(totalExecutionTimeForURL>=context.options.thresholdInMs){
-totalBootupTime+=scriptingTotal+parseCompileTotal;
-}
-
-hadExcessiveChromeExtension=hadExcessiveChromeExtension||
-url.startsWith('chrome-extension:')&&scriptingTotal>100;
-
-return{
-url:url,
-total:totalExecutionTimeForURL,
-
-scripting:scriptingTotal,
-scriptParseCompile:parseCompileTotal};
-
-}).
-filter(result=>result.total>=context.options.thresholdInMs).
-sort((a,b)=>b.total-a.total);
-
-
-
-if(hadExcessiveChromeExtension){
-context.LighthouseRunWarnings.push(str_(UIStrings.chromeExtensionsWarning));
-}
-
-const summary={wastedMs:totalBootupTime};
-
-
-const headings=[
-{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
-{key:'total',granularity:1,itemType:'ms',text:str_(UIStrings.columnTotal)},
-{key:'scripting',granularity:1,itemType:'ms',text:str_(UIStrings.columnScriptEval)},
-{key:'scriptParseCompile',granularity:1,itemType:'ms',
-text:str_(UIStrings.columnScriptParse)}];
-
-
-const details=BootupTime.makeTableDetails(headings,results,summary);
-
-const score=Audit.computeLogNormalScore(
-totalBootupTime,
-context.options.scorePODR,
-context.options.scoreMedian);
-
-
-return{
-score,
-numericValue:totalBootupTime,
-displayValue:totalBootupTime>0?
-str_(i18n.UIStrings.seconds,{timeInMs:totalBootupTime}):'',
-details};
-
-}}
-
-
-module.exports=BootupTime;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/bootup-time.js");
-},{"../computed/main-thread-tasks.js":12,"../computed/network-records.js":34,"../lib/i18n/i18n.js":66,"../lib/network-request.js":75,"../lib/tracehouse/task-groups.js":84,"./audit.js":3}],"../audits/byte-efficiency/efficient-animated-content":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-'use strict';
-
-const NetworkRequest=require('../../lib/network-request.js');
-const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Use video formats for animated content',
-
-description:'Large GIFs are inefficient for delivering animated content. Consider using '+
-'MPEG4/WebM videos for animations and PNG/WebP for static images instead of GIF to save '+
-'network bytes. [Learn more](https://web.dev/efficient-animated-content)'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-const GIF_BYTE_THRESHOLD=100*1024;
-
-class EfficientAnimatedContent extends ByteEfficiencyAudit{
-
-
-
-static get meta(){
-return{
-id:'efficient-animated-content',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['devtoolsLogs','traces']};
-
-}
-
-
-
-
-
-
-
-static getPercentSavings(bytes){
-return Math.round(29.1*Math.log10(bytes)-100.7)/100;
-}
-
-
-
-
-
-
-static audit_(artifacts,networkRecords){
-const unoptimizedContent=networkRecords.filter(
-record=>record.mimeType==='image/gif'&&
-record.resourceType===NetworkRequest.TYPES.Image&&
-(record.resourceSize||0)>GIF_BYTE_THRESHOLD);
-
-
-
-const items=unoptimizedContent.map(record=>{
-const resourceSize=record.resourceSize||0;
-return{
-url:record.url,
-totalBytes:resourceSize,
-wastedBytes:Math.round(resourceSize*
-EfficientAnimatedContent.getPercentSavings(resourceSize))};
-
-});
-
-
-const headings=[
-{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
-{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
-{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
-
-
-return{
-items,
-headings};
-
-}}
-
-
-module.exports=EfficientAnimatedContent;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/byte-efficiency/efficient-animated-content.js");
-},{"../../lib/i18n/i18n.js":66,"../../lib/network-request.js":75,"./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/offscreen-images":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-'use strict';
-
-const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
-const Sentry=require('../../lib/sentry.js');
-const URL=require('../../lib/url-shim.js');
-const i18n=require('../../lib/i18n/i18n.js');
-const Interactive=require('../../computed/metrics/interactive.js');
-const TraceOfTab=require('../../computed/trace-of-tab.js');
-
-const UIStrings={
-
-title:'Defer offscreen images',
-
-description:
-'Consider lazy-loading offscreen and hidden images after all critical resources have '+
-'finished loading to lower time to interactive. '+
-'[Learn more](https://web.dev/offscreen-images).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-const ALLOWABLE_OFFSCREEN_X=100;
-const ALLOWABLE_OFFSCREEN_Y=200;
-
-const IGNORE_THRESHOLD_IN_BYTES=2048;
-const IGNORE_THRESHOLD_IN_PERCENT=75;
-const IGNORE_THRESHOLD_IN_MS=50;
-
-
-
-class OffscreenImages extends ByteEfficiencyAudit{
-
-
-
-static get meta(){
-return{
-id:'offscreen-images',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['ImageElements','ViewportDimensions','devtoolsLogs','traces']};
-
-}
-
-
-
-
-
-
-static computeVisiblePixels(imageRect,viewportDimensions){
-const innerWidth=viewportDimensions.innerWidth;
-const innerHeight=viewportDimensions.innerHeight;
-
-const top=Math.max(imageRect.top,-1*ALLOWABLE_OFFSCREEN_Y);
-const right=Math.min(imageRect.right,innerWidth+ALLOWABLE_OFFSCREEN_X);
-const bottom=Math.min(imageRect.bottom,innerHeight+ALLOWABLE_OFFSCREEN_Y);
-const left=Math.max(imageRect.left,-1*ALLOWABLE_OFFSCREEN_X);
-
-return Math.max(right-left,0)*Math.max(bottom-top,0);
-}
-
-
-
-
-
-
-
-static computeWaste(image,viewportDimensions,networkRecords){
-const networkRecord=networkRecords.find(record=>record.url===image.src);
-if(!image.resourceSize||!networkRecord){
-return null;
-}
-
-const url=URL.elideDataURI(image.src);
-const totalPixels=image.displayedWidth*image.displayedHeight;
-const visiblePixels=this.computeVisiblePixels(image.clientRect,viewportDimensions);
-
-const wastedRatio=totalPixels===0?1:1-visiblePixels/totalPixels;
-const totalBytes=image.resourceSize;
-const wastedBytes=Math.round(totalBytes*wastedRatio);
-
-if(!Number.isFinite(wastedRatio)){
-return new Error(`Invalid image sizing information ${url}`);
-}
-
-return{
-url,
-requestStartTime:networkRecord.startTime,
-totalBytes,
-wastedBytes,
-wastedPercent:100*wastedRatio};
-
-}
-
-
-
-
-
-
-
-static filterLanternResults(images,lanternMetricData){
-const nodeTimings=lanternMetricData.pessimisticEstimate.nodeTimings;
-
-
-let lastLongTaskStartTime=0;
-
-
-const startTimesByURL=new Map();
-for(const[node,timing]of nodeTimings){
-if(node.type==='cpu'&&timing.duration>=50){
-lastLongTaskStartTime=Math.max(lastLongTaskStartTime,timing.startTime);
-}else if(node.type==='network'){
-const networkNode=node;
-startTimesByURL.set(networkNode.record.url,timing.startTime);
-}
-}
-
-return images.filter(image=>{
-
-if(image.wastedBytes<IGNORE_THRESHOLD_IN_BYTES)return false;
-if(image.wastedPercent<IGNORE_THRESHOLD_IN_PERCENT)return false;
-
-const imageRequestStartTime=startTimesByURL.get(image.url)||0;
-return imageRequestStartTime<lastLongTaskStartTime-IGNORE_THRESHOLD_IN_MS;
-});
-}
-
-
-
-
-
-
-
-static filterObservedResults(images,interactiveTimestamp){
-return images.filter(image=>{
-if(image.wastedBytes<IGNORE_THRESHOLD_IN_BYTES)return false;
-if(image.wastedPercent<IGNORE_THRESHOLD_IN_PERCENT)return false;
-return image.requestStartTime<interactiveTimestamp/1e6-IGNORE_THRESHOLD_IN_MS/1000;
-});
-}
-
-
-
-
-
-
-
-
-
-
-
-static computeWasteWithTTIGraph(results,graph,simulator){
-return super.computeWasteWithTTIGraph(results,graph,simulator,
-{includeLoad:false});
-}
-
-
-
-
-
-
-
-static async audit_(artifacts,networkRecords,context){
-const images=artifacts.ImageElements;
-const viewportDimensions=artifacts.ViewportDimensions;
-const trace=artifacts.traces[ByteEfficiencyAudit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[ByteEfficiencyAudit.DEFAULT_PASS];
-
-
-const warnings=[];
-const resultsMap=images.reduce((results,image)=>{
-const processed=OffscreenImages.computeWaste(image,viewportDimensions,networkRecords);
-if(processed===null){
-return results;
-}
-
-if(processed instanceof Error){
-warnings.push(processed.message);
-Sentry.captureException(processed,{tags:{audit:this.meta.id},level:'warning'});
-return results;
-}
-
-
-const existing=results.get(processed.url);
-if(!existing||existing.wastedBytes>processed.wastedBytes){
-results.set(processed.url,processed);
-}
-
-return results;
-},new Map());
-
-const settings=context.settings;
-
-let items;
-const unfilteredResults=Array.from(resultsMap.values());
-
-try{
-const interactive=await Interactive.request({trace,devtoolsLog,settings},context);
-
-
-const lanternInteractive=interactive;
-
-items=context.settings.throttlingMethod==='simulate'?
-OffscreenImages.filterLanternResults(unfilteredResults,lanternInteractive):
-
-OffscreenImages.filterObservedResults(unfilteredResults,interactive.timestamp);
-}catch(err){
-
-if(context.settings.throttlingMethod==='simulate'){
-throw err;
-}
-
-items=OffscreenImages.filterObservedResults(unfilteredResults,(
-await TraceOfTab.request(trace,context).then(tot=>tot.timestamps.traceEnd)));
-}
-
-
-const headings=[
-{key:'url',valueType:'thumbnail',label:''},
-{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
-{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
-{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
-
-
-return{
-warnings,
-items,
-headings};
-
-}}
-
-
-module.exports=OffscreenImages;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/byte-efficiency/offscreen-images.js");
-},{"../../computed/metrics/interactive.js":18,"../../computed/trace-of-tab.js":39,"../../lib/i18n/i18n.js":66,"../../lib/sentry.js":78,"../../lib/url-shim.js":"url","./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/render-blocking-resources":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-'use strict';
-
-const Audit=require('../audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-const BaseNode=require('../../lib/dependency-graph/base-node.js');
-const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
-const UnusedCSS=require('./unused-css-rules.js');
-const NetworkRequest=require('../../lib/network-request.js');
-const TraceOfTab=require('../../computed/trace-of-tab.js');
-const LoadSimulator=require('../../computed/load-simulator.js');
-const FirstContentfulPaint=require('../../computed/metrics/first-contentful-paint.js');
-
-
-
-
-
-
-
-
-
-const MINIMUM_WASTED_MS=50;
-
-const UIStrings={
-
-title:'Eliminate render-blocking resources',
-
-description:'Resources are blocking the first paint of your page. Consider '+
-'delivering critical JS/CSS inline and deferring all non-critical '+
-'JS/styles. [Learn more](https://web.dev/render-blocking-resources).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-
-function getNodesAndTimingByUrl(nodeTimings){
-
-const urlMap={};
-const nodes=Array.from(nodeTimings.keys());
-nodes.forEach(node=>{
-if(node.type!=='network')return;
-const nodeTiming=nodeTimings.get(node);
-if(!nodeTiming)return;
-
-urlMap[node.record.url]={node,nodeTiming};
-});
-
-return urlMap;
-}
-
-class RenderBlockingResources extends Audit{
-
-
-
-static get meta(){
-return{
-id:'render-blocking-resources',
-title:str_(UIStrings.title),
-scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-description:str_(UIStrings.description),
-
-
-requiredArtifacts:['URL','TagsBlockingFirstPaint','traces','devtoolsLogs','CSSUsage']};
-
-}
-
-
-
-
-
-
-static async computeResults(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const simulatorData={devtoolsLog,settings:context.settings};
-const traceOfTab=await TraceOfTab.request(trace,context);
-const simulator=await LoadSimulator.request(simulatorData,context);
-const wastedCssBytes=await RenderBlockingResources.computeWastedCSSBytes(artifacts,context);
-
-const metricSettings={throttlingMethod:'simulate'};
-const metricComputationData={trace,devtoolsLog,simulator,settings:metricSettings};
-
-const fcpSimulation=await FirstContentfulPaint.request(metricComputationData,context);
-const fcpTsInMs=traceOfTab.timestamps.firstContentfulPaint/1000;
-
-const nodesByUrl=getNodesAndTimingByUrl(fcpSimulation.optimisticEstimate.nodeTimings);
-
-const results=[];
-const deferredNodeIds=new Set();
-for(const resource of artifacts.TagsBlockingFirstPaint){
-
-if(resource.endTime*1000>fcpTsInMs)continue;
-
-if(!nodesByUrl[resource.tag.url])continue;
-
-const{node,nodeTiming}=nodesByUrl[resource.tag.url];
-
-
-node.traverse(node=>deferredNodeIds.add(node.id));
-
-
-const wastedMs=Math.round(nodeTiming.duration);
-if(wastedMs<MINIMUM_WASTED_MS)continue;
-
-results.push({
-url:resource.tag.url,
-totalBytes:resource.transferSize,
-wastedMs});
-
-}
-
-if(!results.length){
-return{results,wastedMs:0};
-}
-
-const wastedMs=RenderBlockingResources.estimateSavingsWithGraphs(
-simulator,
-fcpSimulation.optimisticGraph,
-deferredNodeIds,
-wastedCssBytes);
-
-
-return{results,wastedMs};
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-static estimateSavingsWithGraphs(simulator,fcpGraph,deferredIds,wastedCssBytesByUrl){
-const originalEstimate=simulator.simulate(fcpGraph).timeInMs;
-
-let totalChildNetworkBytes=0;
-const minimalFCPGraph=fcpGraph.cloneWithRelationships(node=>{
-
-const canDeferRequest=deferredIds.has(node.id);
-if(node.type!==BaseNode.TYPES.NETWORK)return!canDeferRequest;
-
-const isStylesheet=
-node.record.resourceType===NetworkRequest.TYPES.Stylesheet;
-if(canDeferRequest&&isStylesheet){
-
-const wastedBytes=wastedCssBytesByUrl.get(node.record.url)||0;
-totalChildNetworkBytes+=(node.record.transferSize||0)-wastedBytes;
-}
-return!canDeferRequest;
-});
-
-
-const originalTransferSize=minimalFCPGraph.record.transferSize;
-const safeTransferSize=originalTransferSize||0;
-minimalFCPGraph.record.transferSize=safeTransferSize+totalChildNetworkBytes;
-const estimateAfterInline=simulator.simulate(minimalFCPGraph).timeInMs;
-minimalFCPGraph.record.transferSize=originalTransferSize;
-return Math.round(Math.max(originalEstimate-estimateAfterInline,0));
-}
-
-
-
-
-
-
-static async computeWastedCSSBytes(artifacts,context){
-const wastedBytesByUrl=new Map();
-try{
-const results=await UnusedCSS.audit(artifacts,context);
-if(results.details&&results.details.type==='opportunity'){
-for(const item of results.details.items){
-wastedBytesByUrl.set(item.url,item.wastedBytes);
-}
-}
-}catch(_){}
-
-return wastedBytesByUrl;
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const{results,wastedMs}=await RenderBlockingResources.computeResults(artifacts,context);
-
-let displayValue='';
-if(results.length>0){
-displayValue=str_(i18n.UIStrings.displayValueMsSavings,{wastedMs});
-}
-
-
-const headings=[
-{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
-{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
-{key:'wastedMs',valueType:'timespanMs',label:str_(i18n.UIStrings.columnWastedMs)}];
-
-
-const details=Audit.makeOpportunityDetails(headings,results,wastedMs);
-
-return{
-displayValue,
-score:ByteEfficiencyAudit.scoreForWastedMs(wastedMs),
-numericValue:wastedMs,
-details};
-
-}}
-
-
-module.exports=RenderBlockingResources;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/byte-efficiency/render-blocking-resources.js");
-},{"../../computed/load-simulator.js":10,"../../computed/metrics/first-contentful-paint.js":15,"../../computed/trace-of-tab.js":39,"../../lib/dependency-graph/base-node.js":57,"../../lib/i18n/i18n.js":66,"../../lib/network-request.js":75,"../audit.js":3,"./byte-efficiency-audit.js":4,"./unused-css-rules.js":"../audits/byte-efficiency/unused-css-rules"}],"../audits/byte-efficiency/total-byte-weight":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-const NetworkRecords=require('../../computed/network-records.js');
-
-const UIStrings={
-
-title:'Avoids enormous network payloads',
-
-failureTitle:'Avoid enormous network payloads',
-
-description:
-'Large network payloads cost users real money and are highly correlated with '+
-'long load times. [Learn '+
-'more](https://web.dev/total-byte-weight).',
-
-displayValue:'Total size was {totalBytes, number, bytes}\xa0KB'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class TotalByteWeight extends ByteEfficiencyAudit{
-
-
-
-static get meta(){
-return{
-id:'total-byte-weight',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['devtoolsLogs','traces']};
-
-}
-
-
-
-
-static get defaultOptions(){
-return{
-
-
-scorePODR:2500*1024,
-scoreMedian:4000*1024};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const devtoolsLog=artifacts.devtoolsLogs[ByteEfficiencyAudit.DEFAULT_PASS];
-const records=await NetworkRecords.request(devtoolsLog,context);
-
-let totalBytes=0;
-
-let results=[];
-records.forEach(record=>{
-
-
-if(record.parsedURL.scheme==='data'||!record.finished)return;
-
-const result={
-url:record.url,
-totalBytes:record.transferSize};
-
-
-totalBytes+=result.totalBytes;
-results.push(result);
-});
-const totalCompletedRequests=results.length;
-results=results.sort((itemA,itemB)=>{
-return itemB.totalBytes-itemA.totalBytes||
-itemA.url.localeCompare(itemB.url);
-}).slice(0,10);
-
-const score=ByteEfficiencyAudit.computeLogNormalScore(
-totalBytes,
-context.options.scorePODR,
-context.options.scoreMedian);
-
-
-
-const headings=[
-{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
-{key:'totalBytes',itemType:'bytes',text:str_(i18n.UIStrings.columnSize)}];
-
-
-const tableDetails=ByteEfficiencyAudit.makeTableDetails(headings,results);
-
-return{
-score,
-numericValue:totalBytes,
-displayValue:str_(UIStrings.displayValue,{totalBytes}),
-extendedInfo:{
-value:{
-results,
-totalCompletedRequests}},
-
-
-details:tableDetails};
-
-}}
-
-
-module.exports=TotalByteWeight;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/byte-efficiency/total-byte-weight.js");
-},{"../../computed/network-records.js":34,"../../lib/i18n/i18n.js":66,"./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/unminified-css":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
-const UnusedCSSRules=require('./unused-css-rules.js');
-const i18n=require('../../lib/i18n/i18n.js');
-const computeTokenLength=require('../../lib/minification-estimator.js').computeCSSTokenLength;
-
-const UIStrings={
-
-title:'Minify CSS',
-
-description:'Minifying CSS files can reduce network payload sizes. '+
-'[Learn more](https://web.dev/unminified-css).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-const IGNORE_THRESHOLD_IN_PERCENT=5;
-const IGNORE_THRESHOLD_IN_BYTES=2048;
-
-
-
-
-class UnminifiedCSS extends ByteEfficiencyAudit{
-
-
-
-static get meta(){
-return{
-id:'unminified-css',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['CSSUsage','devtoolsLogs','traces','URL']};
-
-}
-
-
-
-
-
-
-
-static computeTokenLength(content){
-return computeTokenLength(content);
-}
-
-
-
-
-
-
-
-static computeWaste(stylesheet,networkRecord,pageUrl){
-const content=stylesheet.content;
-const totalTokenLength=UnminifiedCSS.computeTokenLength(content);
-
-let url=stylesheet.header.sourceURL;
-if(!url||url===pageUrl){
-const contentPreview=UnusedCSSRules.determineContentPreview(stylesheet.content);
-url=contentPreview;
-}
-
-const totalBytes=ByteEfficiencyAudit.estimateTransferSize(networkRecord,content.length,
-'Stylesheet');
-const wastedRatio=1-totalTokenLength/content.length;
-const wastedBytes=Math.round(totalBytes*wastedRatio);
-
-return{
-url,
-totalBytes,
-wastedBytes,
-wastedPercent:100*wastedRatio};
-
-}
-
-
-
-
-
-
-static audit_(artifacts,networkRecords){
-const pageUrl=artifacts.URL.finalUrl;
-const items=[];
-for(const stylesheet of artifacts.CSSUsage.stylesheets){
-const networkRecord=networkRecords.
-find(record=>record.url===stylesheet.header.sourceURL);
-if(!stylesheet.content)continue;
-
-const result=UnminifiedCSS.computeWaste(stylesheet,networkRecord,pageUrl);
-
-
-
-if(result.wastedPercent<IGNORE_THRESHOLD_IN_PERCENT||
-result.wastedBytes<IGNORE_THRESHOLD_IN_BYTES||
-!Number.isFinite(result.wastedBytes))continue;
-items.push(result);
-}
-
-
-const headings=[
-{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
-{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
-{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
-
-
-return{items,headings};
-}}
-
-
-module.exports=UnminifiedCSS;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/byte-efficiency/unminified-css.js");
-},{"../../lib/i18n/i18n.js":66,"../../lib/minification-estimator.js":73,"./byte-efficiency-audit.js":4,"./unused-css-rules.js":"../audits/byte-efficiency/unused-css-rules"}],"../audits/byte-efficiency/unminified-javascript":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-const computeTokenLength=require('../../lib/minification-estimator.js').computeJSTokenLength;
-
-const UIStrings={
-
-title:'Minify JavaScript',
-
-description:'Minifying JavaScript files can reduce payload sizes and script parse time. '+
-'[Learn more](https://web.dev/unminified-javascript).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-const IGNORE_THRESHOLD_IN_PERCENT=10;
-const IGNORE_THRESHOLD_IN_BYTES=2048;
-
-
-
-
-
-
-
-
-
-
-
-class UnminifiedJavaScript extends ByteEfficiencyAudit{
-
-
-
-static get meta(){
-return{
-id:'unminified-javascript',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['ScriptElements','devtoolsLogs','traces']};
-
-}
-
-
-
-
-
-
-
-static computeWaste(scriptContent,displayUrl,networkRecord){
-const contentLength=scriptContent.length;
-const totalTokenLength=computeTokenLength(scriptContent);
-
-const totalBytes=ByteEfficiencyAudit.estimateTransferSize(networkRecord,contentLength,
-'Script');
-const wastedRatio=1-totalTokenLength/contentLength;
-const wastedBytes=Math.round(totalBytes*wastedRatio);
-
-return{
-url:displayUrl,
-totalBytes,
-wastedBytes,
-wastedPercent:100*wastedRatio};
-
-}
-
-
-
-
-
-
-static audit_(artifacts,networkRecords){
-
-const items=[];
-const warnings=[];
-for(const{requestId,src,content}of artifacts.ScriptElements){
-if(!content)continue;
-
-const networkRecord=networkRecords.find(record=>record.requestId===requestId);
-const displayUrl=!src||!networkRecord?
-`inline: ${content.substr(0,40)}...`:
-networkRecord.url;
-try{
-const result=UnminifiedJavaScript.computeWaste(content,displayUrl,networkRecord);
-
-
-if(result.wastedPercent<IGNORE_THRESHOLD_IN_PERCENT||
-result.wastedBytes<IGNORE_THRESHOLD_IN_BYTES||
-!Number.isFinite(result.wastedBytes))continue;
-items.push(result);
-}catch(err){
-const url=networkRecord?networkRecord.url:'?';
-warnings.push(`Unable to process script ${url}: ${err.message}`);
-}
-}
-
-
-const headings=[
-{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
-{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
-{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
-
-
-return{
-items,
-warnings,
-headings};
-
-}}
-
-
-module.exports=UnminifiedJavaScript;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/byte-efficiency/unminified-javascript.js");
-},{"../../lib/i18n/i18n.js":66,"../../lib/minification-estimator.js":73,"./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/unused-css-rules":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Remove unused CSS',
-
-description:'Remove dead rules from stylesheets and defer the loading of CSS not used for '+
-'above-the-fold content to reduce unnecessary bytes consumed by network activity. '+
-'[Learn more](https://web.dev/unused-css-rules).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-const IGNORE_THRESHOLD_IN_BYTES=10*1024;
-const PREVIEW_LENGTH=100;
-
-
-
-class UnusedCSSRules extends ByteEfficiencyAudit{
-
-
-
-static get meta(){
-return{
-id:'unused-css-rules',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['CSSUsage','URL','devtoolsLogs','traces']};
-
-}
-
-
-
-
-
-
-static indexStylesheetsById(styles,networkRecords){
-const indexedNetworkRecords=networkRecords.
-
-
-
-filter(record=>record.resourceSize>0).
-reduce((indexed,record)=>{
-indexed[record.url]=record;
-return indexed;
-},{});
-
-return styles.reduce((indexed,stylesheet)=>{
-indexed[stylesheet.header.styleSheetId]=Object.assign({
-usedRules:[],
-networkRecord:indexedNetworkRecords[stylesheet.header.sourceURL]},
-stylesheet);
-return indexed;
-},{});
-}
-
-
-
-
-
-
-static indexUsedRules(rules,indexedStylesheets){
-rules.forEach(rule=>{
-const stylesheetInfo=indexedStylesheets[rule.styleSheetId];
-
-if(!stylesheetInfo){
-return;
-}
-
-if(rule.used){
-stylesheetInfo.usedRules.push(rule);
-}
-});
-}
-
-
-
-
-
-static computeUsage(stylesheetInfo){
-let usedUncompressedBytes=0;
-const totalUncompressedBytes=stylesheetInfo.content.length;
-
-for(const usedRule of stylesheetInfo.usedRules){
-usedUncompressedBytes+=usedRule.endOffset-usedRule.startOffset;
-}
-
-const totalTransferredBytes=ByteEfficiencyAudit.estimateTransferSize(
-stylesheetInfo.networkRecord,totalUncompressedBytes,'Stylesheet');
-const percentUnused=(totalUncompressedBytes-usedUncompressedBytes)/totalUncompressedBytes;
-const wastedBytes=Math.round(percentUnused*totalTransferredBytes);
-
-return{
-wastedBytes,
-wastedPercent:percentUnused*100,
-totalBytes:totalTransferredBytes};
-
-}
-
-
-
-
-
-
-static determineContentPreview(content){
-let preview=(content||'').
-slice(0,PREVIEW_LENGTH*5).
-replace(/( {2,}|\t)+/g,'  ').
-replace(/\n\s+}/g,'\n}').
-trim();
-
-if(preview.length>PREVIEW_LENGTH){
-const firstRuleStart=preview.indexOf('{');
-const firstRuleEnd=preview.indexOf('}');
-
-if(firstRuleStart===-1||firstRuleEnd===-1||
-firstRuleStart>firstRuleEnd||
-firstRuleStart>PREVIEW_LENGTH){
-
-preview=preview.slice(0,PREVIEW_LENGTH)+'...';
-}else if(firstRuleEnd<PREVIEW_LENGTH){
-
-preview=preview.slice(0,firstRuleEnd+1)+' ...';
-}else{
-
-const lastSemicolonIndex=preview.slice(0,PREVIEW_LENGTH).lastIndexOf(';');
-preview=lastSemicolonIndex<firstRuleStart?
-preview.slice(0,PREVIEW_LENGTH)+'... } ...':
-preview.slice(0,lastSemicolonIndex+1)+' ... } ...';
-}
-}
-
-return preview;
-}
-
-
-
-
-
-
-static mapSheetToResult(stylesheetInfo,pageUrl){
-let url=stylesheetInfo.header.sourceURL;
-if(!url||url===pageUrl){
-const contentPreview=UnusedCSSRules.determineContentPreview(stylesheetInfo.content);
-url=contentPreview;
-}
-
-const usage=UnusedCSSRules.computeUsage(stylesheetInfo);
-return{url,...usage};
-}
-
-
-
-
-
-
-static audit_(artifacts,networkRecords){
-const styles=artifacts.CSSUsage.stylesheets;
-const usage=artifacts.CSSUsage.rules;
-const pageUrl=artifacts.URL.finalUrl;
-
-return Promise.resolve(networkRecords).then(networkRecords=>{
-const indexedSheets=UnusedCSSRules.indexStylesheetsById(styles,networkRecords);
-UnusedCSSRules.indexUsedRules(usage,indexedSheets);
-
-const items=Object.keys(indexedSheets).
-map(sheetId=>UnusedCSSRules.mapSheetToResult(indexedSheets[sheetId],pageUrl)).
-filter(sheet=>sheet&&sheet.wastedBytes>IGNORE_THRESHOLD_IN_BYTES);
-
-
-const headings=[
-{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
-{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
-{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
-
-
-return{
-items,
-headings};
-
-});
-}}
-
-
-module.exports=UnusedCSSRules;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/byte-efficiency/unused-css-rules.js");
-},{"../../lib/i18n/i18n.js":66,"./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/unused-javascript":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Remove unused JavaScript',
-
-description:'Remove unused JavaScript to reduce bytes consumed by network activity.'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-const IGNORE_THRESHOLD_IN_BYTES=2048;
-
-class UnusedJavaScript extends ByteEfficiencyAudit{
-
-
-
-static get meta(){
-return{
-id:'unused-javascript',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['JsUsage','devtoolsLogs','traces']};
-
-}
-
-
-
-
-
-static computeWaste(script){
-let maximumEndOffset=0;
-for(const func of script.functions){
-for(const range of func.ranges){
-maximumEndOffset=Math.max(maximumEndOffset,range.endOffset);
-}
-}
-
-
-
-const unusedByIndex=new Uint8Array(maximumEndOffset);
-for(const func of script.functions){
-for(const range of func.ranges){
-if(range.count===0){
-for(let i=range.startOffset;i<range.endOffset;i++){
-unusedByIndex[i]=1;
-}
-}
-}
-}
-
-let unused=0;
-for(const x of unusedByIndex){
-unused+=x;
-}
-
-return{
-unusedLength:unused,
-contentLength:maximumEndOffset};
-
-}
-
-
-
-
-
-
-static mergeWaste(wasteData,networkRecord){
-let unusedLength=0;
-let contentLength=0;
-for(const usage of wasteData){
-unusedLength+=usage.unusedLength;
-contentLength+=usage.contentLength;
-}
-
-const totalBytes=ByteEfficiencyAudit.estimateTransferSize(networkRecord,contentLength,
-'Script');
-const wastedRatio=unusedLength/contentLength||0;
-const wastedBytes=Math.round(totalBytes*wastedRatio);
-
-return{
-url:networkRecord.url,
-totalBytes,
-wastedBytes,
-wastedPercent:100*wastedRatio};
-
-}
-
-
-
-
-
-
-static audit_(artifacts,networkRecords){
-
-const scriptsByUrl=new Map();
-for(const script of artifacts.JsUsage){
-const scripts=scriptsByUrl.get(script.url)||[];
-scripts.push(script);
-scriptsByUrl.set(script.url,scripts);
-}
-
-const items=[];
-for(const[url,scripts]of scriptsByUrl.entries()){
-const networkRecord=networkRecords.find(record=>record.url===url);
-if(!networkRecord)continue;
-const wasteData=scripts.map(UnusedJavaScript.computeWaste);
-const item=UnusedJavaScript.mergeWaste(wasteData,networkRecord);
-if(item.wastedBytes<=IGNORE_THRESHOLD_IN_BYTES)continue;
-items.push(item);
-}
-
-return{
-items,
-headings:[
-{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
-{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
-{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}]};
-
-
-}}
-
-
-module.exports=UnusedJavaScript;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/byte-efficiency/unused-javascript.js");
-},{"../../lib/i18n/i18n.js":66,"./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/uses-long-cache-ttl":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const assert=require('assert');
-const parseCacheControl=require('parse-cache-control');
-const Audit=require('../audit.js');
-const NetworkRequest=require('../../lib/network-request.js');
-const URL=require('../../lib/url-shim.js');
-const linearInterpolation=require('../../lib/statistics.js').linearInterpolation;
-const i18n=require('../../lib/i18n/i18n.js');
-const NetworkRecords=require('../../computed/network-records.js');
-
-const UIStrings={
-
-title:'Uses efficient cache policy on static assets',
-
-failureTitle:'Serve static assets with an efficient cache policy',
-
-description:
-'A long cache lifetime can speed up repeat visits to your page. '+
-'[Learn more](https://web.dev/uses-long-cache-ttl).',
-
-displayValue:`{itemCount, plural,
-    =1 {1 resource found}
-    other {# resources found}
-    }`};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-const IGNORE_THRESHOLD_IN_PERCENT=0.925;
-
-class CacheHeaders extends Audit{
-
-
-
-static get meta(){
-return{
-id:'uses-long-cache-ttl',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['devtoolsLogs','traces']};
-
-}
-
-
-
-
-static get defaultOptions(){
-return{
-
-
-
-scorePODR:4*1024,
-scoreMedian:128*1024};
-
-}
-
-
-
-
-
-
-
-static getCacheHitProbability(maxAgeInSeconds){
-
-
-
-
-
-const RESOURCE_AGE_IN_HOURS_DECILES=[0,0.2,1,3,8,12,24,48,72,168,8760,Infinity];
-assert.ok(RESOURCE_AGE_IN_HOURS_DECILES.length===12,'deciles 0-10 and 1 for overflow');
-
-const maxAgeInHours=maxAgeInSeconds/3600;
-const upperDecileIndex=RESOURCE_AGE_IN_HOURS_DECILES.findIndex(
-decile=>decile>=maxAgeInHours);
-
-
-
-if(upperDecileIndex===RESOURCE_AGE_IN_HOURS_DECILES.length-1)return 1;
-if(upperDecileIndex===0)return 0;
-
-
-const upperDecileValue=RESOURCE_AGE_IN_HOURS_DECILES[upperDecileIndex];
-const lowerDecileValue=RESOURCE_AGE_IN_HOURS_DECILES[upperDecileIndex-1];
-const upperDecile=upperDecileIndex/10;
-const lowerDecile=(upperDecileIndex-1)/10;
-
-
-return linearInterpolation(
-lowerDecileValue,
-lowerDecile,
-upperDecileValue,
-upperDecile,
-maxAgeInHours);
-
-}
-
-
-
-
-
-
-
-static computeCacheLifetimeInSeconds(headers,cacheControl){
-if(cacheControl&&cacheControl['max-age']!==undefined){
-return cacheControl['max-age'];
-}
-
-const expiresHeaders=headers.get('expires');
-if(expiresHeaders){
-const expires=new Date(expiresHeaders).getTime();
-
-if(!expires)return 0;
-return Math.ceil((expires-Date.now())/1000);
-}
-
-return null;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-static isCacheableAsset(record){
-const CACHEABLE_STATUS_CODES=new Set([200,203,206]);
-
-
-const STATIC_RESOURCE_TYPES=new Set([
-NetworkRequest.TYPES.Font,
-NetworkRequest.TYPES.Image,
-NetworkRequest.TYPES.Media,
-NetworkRequest.TYPES.Script,
-NetworkRequest.TYPES.Stylesheet]);
-
-
-
-if(URL.NON_NETWORK_PROTOCOLS.includes(record.protocol))return false;
-
-return(
-CACHEABLE_STATUS_CODES.has(record.statusCode)&&
-STATIC_RESOURCE_TYPES.has(record.resourceType||'Other'));
-
-}
-
-
-
-
-
-
-
-static shouldSkipRecord(headers,cacheControl){
-
-if(!cacheControl&&(headers.get('pragma')||'').includes('no-cache')){
-return true;
-}
-
-
-if(cacheControl&&(
-
-cacheControl['must-revalidate']||
-cacheControl['no-cache']||
-cacheControl['no-store']||
-cacheControl['private'])){
-return true;
-}
-
-return false;
-}
-
-
-
-
-
-
-static audit(artifacts,context){
-const devtoolsLogs=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-return NetworkRecords.request(devtoolsLogs,context).then(records=>{
-const results=[];
-let queryStringCount=0;
-let totalWastedBytes=0;
-
-for(const record of records){
-if(!CacheHeaders.isCacheableAsset(record))continue;
-
-
-const headers=new Map();
-for(const header of record.responseHeaders||[]){
-if(headers.has(header.name.toLowerCase())){
-const previousHeaderValue=headers.get(header.name.toLowerCase());
-headers.set(header.name.toLowerCase(),
-`${previousHeaderValue}, ${header.value}`);
-}else{
-headers.set(header.name.toLowerCase(),header.value);
-}
-}
-
-const cacheControl=parseCacheControl(headers.get('cache-control'));
-if(this.shouldSkipRecord(headers,cacheControl)){
-continue;
-}
-
-
-let cacheLifetimeInSeconds=CacheHeaders.computeCacheLifetimeInSeconds(
-headers,cacheControl);
-if(cacheLifetimeInSeconds!==null&&(
-!Number.isFinite(cacheLifetimeInSeconds)||cacheLifetimeInSeconds<=0)){
-continue;
-}
-cacheLifetimeInSeconds=cacheLifetimeInSeconds||0;
-
-
-const cacheHitProbability=CacheHeaders.getCacheHitProbability(cacheLifetimeInSeconds);
-if(cacheHitProbability>IGNORE_THRESHOLD_IN_PERCENT)continue;
-
-const url=URL.elideDataURI(record.url);
-const totalBytes=record.transferSize||0;
-const wastedBytes=(1-cacheHitProbability)*totalBytes;
-
-totalWastedBytes+=wastedBytes;
-if(url.includes('?'))queryStringCount++;
-
-
-
-let debugData;
-if(cacheControl){
-debugData={
-type:'debugdata',
-...cacheControl};
-
-}
-
-results.push({
-url,
-debugData,
-cacheLifetimeMs:cacheLifetimeInSeconds*1000,
-cacheHitProbability,
-totalBytes,
-wastedBytes});
-
-}
-
-results.sort((a,b)=>{
-return a.cacheLifetimeMs-b.cacheLifetimeMs||
-b.totalBytes-a.totalBytes||
-a.url.localeCompare(b.url);
-});
-
-const score=Audit.computeLogNormalScore(
-totalWastedBytes,
-context.options.scorePODR,
-context.options.scoreMedian);
-
-
-
-const headings=[
-{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
-
-{key:'cacheLifetimeMs',itemType:'ms',text:str_(i18n.UIStrings.columnCacheTTL),
-displayUnit:'duration'},
-{key:'totalBytes',itemType:'bytes',text:str_(i18n.UIStrings.columnSize),
-displayUnit:'kb',granularity:1}];
-
-
-const summary={wastedBytes:totalWastedBytes};
-const details=Audit.makeTableDetails(headings,results,summary);
-
-return{
-score,
-numericValue:totalWastedBytes,
-displayValue:str_(UIStrings.displayValue,{itemCount:results.length}),
-extendedInfo:{
-value:{
-results,
-queryStringCount}},
-
-
-details};
-
-});
-}}
-
-
-module.exports=CacheHeaders;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js");
-},{"../../computed/network-records.js":34,"../../lib/i18n/i18n.js":66,"../../lib/network-request.js":75,"../../lib/statistics.js":81,"../../lib/url-shim.js":"url","../audit.js":3,"assert":92,"parse-cache-control":155}],"../audits/byte-efficiency/uses-optimized-images":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-'use strict';
-
-const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
-const URL=require('../../lib/url-shim.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Efficiently encode images',
-
-description:'Optimized images load faster and consume less cellular data. '+
-'[Learn more](https://web.dev/uses-optimized-images).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-const IGNORE_THRESHOLD_IN_BYTES=4096;
-
-class UsesOptimizedImages extends ByteEfficiencyAudit{
-
-
-
-static get meta(){
-return{
-id:'uses-optimized-images',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['OptimizedImages','ImageElements','devtoolsLogs','traces','URL']};
-
-}
-
-
-
-
-
-static computeSavings(image){
-const bytes=image.originalSize-image.jpegSize;
-const percent=100*bytes/image.originalSize;
-return{bytes,percent};
-}
-
-
-
-
-
-static estimateJPEGSizeFromDimensions(imageElement){
-const totalPixels=imageElement.naturalWidth*imageElement.naturalHeight;
-
-
-
-
-const expectedBytesPerPixel=2*1/8;
-return Math.round(totalPixels*expectedBytesPerPixel);
-}
-
-
-
-
-
-static audit_(artifacts){
-const pageURL=artifacts.URL.finalUrl;
-const images=artifacts.OptimizedImages;
-const imageElements=artifacts.ImageElements;
-
-const imageElementsByURL=new Map();
-imageElements.forEach(img=>imageElementsByURL.set(img.src,img));
-
-
-const items=[];
-const warnings=[];
-for(const image of images){
-if(image.failed){
-warnings.push(`Unable to decode ${URL.getURLDisplayName(image.url)}`);
-continue;
-}else if(/(jpeg|bmp)/.test(image.mimeType)===false){
-continue;
-}
-
-let jpegSize=image.jpegSize;
-let fromProtocol=true;
-
-if(typeof jpegSize==='undefined'){
-const imageElement=imageElementsByURL.get(image.url);
-if(!imageElement){
-warnings.push(`Unable to locate resource ${URL.getURLDisplayName(image.url)}`);
-continue;
-}
-
-jpegSize=UsesOptimizedImages.estimateJPEGSizeFromDimensions(imageElement);
-fromProtocol=false;
-}
-
-if(image.originalSize<jpegSize+IGNORE_THRESHOLD_IN_BYTES)continue;
-
-const url=URL.elideDataURI(image.url);
-const isCrossOrigin=!URL.originsMatch(pageURL,image.url);
-const jpegSavings=UsesOptimizedImages.computeSavings({...image,jpegSize});
-
-items.push({
-url,
-fromProtocol,
-isCrossOrigin,
-totalBytes:image.originalSize,
-wastedBytes:jpegSavings.bytes});
-
-}
-
-
-const headings=[
-{key:'url',valueType:'thumbnail',label:''},
-{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
-{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
-{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
-
-
-return{
-warnings,
-items,
-headings};
-
-}}
-
-
-module.exports=UsesOptimizedImages;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/byte-efficiency/uses-optimized-images.js");
-},{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/uses-responsive-images":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
-const Sentry=require('../../lib/sentry.js');
-const URL=require('../../lib/url-shim.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Properly size images',
-
-description:
-'Serve images that are appropriately-sized to save cellular data '+
-'and improve load time. '+
-'[Learn more](https://web.dev/uses-responsive-images).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-const IGNORE_THRESHOLD_IN_BYTES=2048;
-
-class UsesResponsiveImages extends ByteEfficiencyAudit{
-
-
-
-static get meta(){
-return{
-id:'uses-responsive-images',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['ImageElements','ViewportDimensions','devtoolsLogs','traces']};
-
-}
-
-
-
-
-
-
-static computeWaste(image,DPR){
-
-if(!image.resourceSize){
-return null;
-}
-
-const url=URL.elideDataURI(image.src);
-const actualPixels=image.naturalWidth*image.naturalHeight;
-const usedPixels=image.displayedWidth*image.displayedHeight*Math.pow(DPR,2);
-const wastedRatio=1-usedPixels/actualPixels;
-const totalBytes=image.resourceSize;
-const wastedBytes=Math.round(totalBytes*wastedRatio);
-
-
-
-if(!usedPixels){
-return null;
-}
-
-if(!Number.isFinite(wastedRatio)){
-return new Error(`Invalid image sizing information ${url}`);
-}
-
-return{
-url,
-totalBytes,
-wastedBytes,
-wastedPercent:100*wastedRatio};
-
-}
-
-
-
-
-
-static audit_(artifacts){
-const images=artifacts.ImageElements;
-const DPR=artifacts.ViewportDimensions.devicePixelRatio;
-
-
-const warnings=[];
-
-const resultsMap=new Map();
-for(const image of images){
-
-
-
-
-if(!image.resourceSize||image.mimeType==='image/svg+xml'||image.isCss){
-continue;
-}
-
-const processed=UsesResponsiveImages.computeWaste(image,DPR);
-if(!processed)continue;
-
-if(processed instanceof Error){
-warnings.push(processed.message);
-Sentry.captureException(processed,{tags:{audit:this.meta.id},level:'warning'});
-continue;
-}
-
-
-const existing=resultsMap.get(processed.url);
-if(!existing||existing.wastedBytes>processed.wastedBytes){
-resultsMap.set(processed.url,processed);
-}
-}
-
-const items=Array.from(resultsMap.values()).
-filter(item=>item.wastedBytes>IGNORE_THRESHOLD_IN_BYTES);
-
-
-const headings=[
-{key:'url',valueType:'thumbnail',label:''},
-{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
-{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
-{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
-
-
-return{
-warnings,
-items,
-headings};
-
-}}
-
-
-module.exports=UsesResponsiveImages;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/byte-efficiency/uses-responsive-images.js");
-},{"../../lib/i18n/i18n.js":66,"../../lib/sentry.js":78,"../../lib/url-shim.js":"url","./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/uses-text-compression":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-'use strict';
-
-const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
-const URL=require('../../lib/url-shim.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Enable text compression',
-
-description:'Text-based resources should be served with compression (gzip, deflate or'+
-' brotli) to minimize total network bytes.'+
-' [Learn more](https://web.dev/uses-text-compression).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-const IGNORE_THRESHOLD_IN_BYTES=1400;
-const IGNORE_THRESHOLD_IN_PERCENT=0.1;
-
-class ResponsesAreCompressed extends ByteEfficiencyAudit{
-
-
-
-static get meta(){
-return{
-id:'uses-text-compression',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['ResponseCompression','devtoolsLogs','traces']};
-
-}
-
-
-
-
-
-static audit_(artifacts){
-const uncompressedResponses=artifacts.ResponseCompression;
-
-
-const items=[];
-uncompressedResponses.forEach(record=>{
-
-if(!record.gzipSize||record.gzipSize<0)return;
-
-const originalSize=record.resourceSize;
-const gzipSize=record.gzipSize;
-const gzipSavings=originalSize-gzipSize;
-
-
-
-if(1-gzipSize/originalSize<IGNORE_THRESHOLD_IN_PERCENT||
-gzipSavings<IGNORE_THRESHOLD_IN_BYTES||
-record.transferSize<gzipSize)
-{
-return;
-}
-
-
-const url=URL.elideDataURI(record.url);
-const isDuplicate=items.find(item=>item.url===url&&
-item.totalBytes===record.resourceSize);
-if(isDuplicate){
-return;
-}
-
-items.push({
-url,
-totalBytes:originalSize,
-wastedBytes:gzipSavings});
-
-});
-
-
-const headings=[
-{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
-{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
-{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
-
-
-return{
-items,
-headings};
-
-}}
-
-
-module.exports=ResponsesAreCompressed;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/byte-efficiency/uses-text-compression.js");
-},{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/uses-webp-images":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-'use strict';
-
-const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
-const URL=require('../../lib/url-shim.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Serve images in next-gen formats',
-
-description:'Image formats like JPEG 2000, JPEG XR, and WebP often provide better '+
-'compression than PNG or JPEG, which means faster downloads and less data consumption. '+
-'[Learn more](https://web.dev/uses-webp-images).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-const IGNORE_THRESHOLD_IN_BYTES=8192;
-
-class UsesWebPImages extends ByteEfficiencyAudit{
-
-
-
-static get meta(){
-return{
-id:'uses-webp-images',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['OptimizedImages','devtoolsLogs','traces','URL','ImageElements']};
-
-}
-
-
-
-
-
-static computeSavings(image){
-const bytes=image.originalSize-image.webpSize;
-const percent=100*bytes/image.originalSize;
-return{bytes,percent};
-}
-
-
-
-
-
-static estimateWebPSizeFromDimensions(imageElement){
-const totalPixels=imageElement.naturalWidth*imageElement.naturalHeight;
-
-
-
-
-
-const expectedBytesPerPixel=2*1/10;
-return Math.round(totalPixels*expectedBytesPerPixel);
-}
-
-
-
-
-
-static audit_(artifacts){
-const pageURL=artifacts.URL.finalUrl;
-const images=artifacts.OptimizedImages;
-const imageElements=artifacts.ImageElements;
-
-const imageElementsByURL=new Map();
-imageElements.forEach(img=>imageElementsByURL.set(img.src,img));
-
-
-const items=[];
-const warnings=[];
-for(const image of images){
-if(image.failed){
-warnings.push(`Unable to decode ${URL.getURLDisplayName(image.url)}`);
-continue;
-}
-
-let webpSize=image.webpSize;
-let fromProtocol=true;
-
-if(typeof webpSize==='undefined'){
-const imageElement=imageElementsByURL.get(image.url);
-if(!imageElement){
-warnings.push(`Unable to locate resource ${URL.getURLDisplayName(image.url)}`);
-continue;
-}
-
-webpSize=UsesWebPImages.estimateWebPSizeFromDimensions(imageElement);
-fromProtocol=false;
-}
-
-if(image.originalSize<webpSize+IGNORE_THRESHOLD_IN_BYTES)continue;
-
-const url=URL.elideDataURI(image.url);
-const isCrossOrigin=!URL.originsMatch(pageURL,image.url);
-const webpSavings=UsesWebPImages.computeSavings({...image,webpSize:webpSize});
-
-items.push({
-url,
-fromProtocol,
-isCrossOrigin,
-totalBytes:image.originalSize,
-wastedBytes:webpSavings.bytes});
-
-}
-
-
-const headings=[
-{key:'url',valueType:'thumbnail',label:''},
-{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
-{key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
-{key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
-
-
-return{
-warnings,
-items,
-headings};
-
-}}
-
-
-module.exports=UsesWebPImages;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/byte-efficiency/uses-webp-images.js");
-},{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","./byte-efficiency-audit.js":4}],"../audits/content-width":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const i18n=require('../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Content is sized correctly for the viewport',
-
-failureTitle:'Content is not sized correctly for the viewport',
-
-description:'If the width of your app\'s content doesn\'t match the width '+
-'of the viewport, your app might not be optimized for mobile screens. '+
-'[Learn more](https://web.dev/content-width).',
-
-
-
-
-
-explanation:'The viewport size of {innerWidth}px does not match the window '+
-'size of {outerWidth}px.'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class ContentWidth extends Audit{
-
-
-
-static get meta(){
-return{
-id:'content-width',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['ViewportDimensions','TestedAsMobileDevice']};
-
-}
-
-
-
-
-
-static audit(artifacts){
-const IsMobile=artifacts.TestedAsMobileDevice;
-const viewportWidth=artifacts.ViewportDimensions.innerWidth;
-const windowWidth=artifacts.ViewportDimensions.outerWidth;
-const widthsMatch=viewportWidth===windowWidth;
-
-if(!IsMobile){
-return{
-score:1,
-notApplicable:true};
-
-}
-
-let explanation='';
-if(!widthsMatch){
-explanation=str_(UIStrings.explanation,
-{innerWidth:artifacts.ViewportDimensions.innerWidth,
-outerWidth:artifacts.ViewportDimensions.outerWidth});
-}
-
-return{
-score:Number(widthsMatch),
-explanation};
-
-}}
-
-
-module.exports=ContentWidth;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/content-width.js");
-},{"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/critical-request-chains":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const i18n=require('../lib/i18n/i18n.js');
-const ComputedChains=require('../computed/critical-request-chains.js');
-
-const UIStrings={
-
-title:'Avoid chaining critical requests',
-
-description:'The Critical Request Chains below show you what resources are '+
-'loaded with a high priority. Consider reducing '+
-'the length of chains, reducing the download size of resources, or '+
-'deferring the download of unnecessary resources to improve page load. '+
-'[Learn more](https://web.dev/critical-request-chains).',
-
-displayValue:`{itemCount, plural,
-    =1 {1 chain found}
-    other {# chains found}
-    }`};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class CriticalRequestChains extends Audit{
-
-
-
-static get meta(){
-return{
-id:'critical-request-chains',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
-requiredArtifacts:['devtoolsLogs','URL']};
-
-}
-
-
-
-
-
-
-
-static _traverse(tree,cb){
-
-
-
-
-
-
-function walk(node,depth,startTime,transferSize=0){
-const children=Object.keys(node);
-if(children.length===0){
-return;
-}
-children.forEach(id=>{
-const child=node[id];
-if(!startTime){
-startTime=child.request.startTime;
-}
-
-
-cb({
-depth,
-id,
-node:child,
-chainDuration:(child.request.endTime-startTime)*1000,
-chainTransferSize:transferSize+child.request.transferSize});
-
-
-
-if(child.children){
-walk(child.children,depth+1,startTime);
-}
-},'');
-}
-
-walk(tree,0);
-}
-
-
-
-
-
-
-static _getLongestChain(tree){
-const longest={
-duration:0,
-length:0,
-transferSize:0};
-
-CriticalRequestChains._traverse(tree,opts=>{
-const duration=opts.chainDuration;
-if(duration>longest.duration){
-longest.duration=duration;
-longest.transferSize=opts.chainTransferSize;
-longest.length=opts.depth;
-}
-});
-
-longest.length++;
-return longest;
-}
-
-
-
-
-
-static flattenRequests(tree){
-
-const flattendChains={};
-
-const chainMap=new Map();
-
-
-function flatten(opts){
-const request=opts.node.request;
-const simpleRequest={
-url:request.url,
-startTime:request.startTime,
-endTime:request.endTime,
-responseReceivedTime:request.responseReceivedTime,
-transferSize:request.transferSize};
-
-
-let chain=chainMap.get(opts.id);
-if(chain){
-chain.request=simpleRequest;
-}else{
-chain={
-request:simpleRequest};
-
-flattendChains[opts.id]=chain;
-}
-
-if(opts.node.children){
-for(const chainId of Object.keys(opts.node.children)){
-
-const childChain={
-request:{}};
-
-chainMap.set(chainId,childChain);
-if(!chain.children){
-chain.children={};
-}
-chain.children[chainId]=childChain;
-}
-}
-chainMap.set(opts.id,chain);
-}
-
-CriticalRequestChains._traverse(tree,flatten);
-
-return flattendChains;
-}
-
-
-
-
-
-
-
-static audit(artifacts,context){
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const URL=artifacts.URL;
-return ComputedChains.request({devtoolsLog,URL},context).then(chains=>{
-let chainCount=0;
-
-
-
-
-function walk(node,depth){
-const childIds=Object.keys(node);
-
-childIds.forEach(id=>{
-const child=node[id];
-if(child.children){
-walk(child.children,depth+1);
-}else{
-
-chainCount++;
-}
-},'');
-}
-
-const flattenedChains=CriticalRequestChains.flattenRequests(chains);
-
-
-const initialNavKey=Object.keys(flattenedChains)[0];
-const initialNavChildren=initialNavKey&&flattenedChains[initialNavKey].children;
-if(initialNavChildren&&Object.keys(initialNavChildren).length>0){
-walk(initialNavChildren,0);
-}
-
-const longestChain=CriticalRequestChains._getLongestChain(flattenedChains);
-
-return{
-score:Number(chainCount===0),
-notApplicable:chainCount===0,
-displayValue:chainCount?str_(UIStrings.displayValue,{itemCount:chainCount}):'',
-extendedInfo:{
-value:{
-chains:flattenedChains,
-longestChain}},
-
-
-details:{
-type:'criticalrequestchain',
-chains:flattenedChains,
-longestChain}};
-
-
-});
-}}
-
-
-module.exports=CriticalRequestChains;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/critical-request-chains.js");
-},{"../computed/critical-request-chains.js":9,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/deprecations":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-
-const Audit=require('./audit.js');
-const i18n=require('../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Avoids deprecated APIs',
-
-failureTitle:'Uses deprecated APIs',
-
-description:'Deprecated APIs will eventually be removed from the browser. '+
-'[Learn more](https://web.dev/deprecations).',
-
-displayValue:`{itemCount, plural,
-    =1 {1 warning found}
-    other {# warnings found}
-    }`,
-
-columnDeprecate:'Deprecation / Warning',
-
-columnLine:'Line'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class Deprecations extends Audit{
-
-
-
-static get meta(){
-return{
-id:'deprecations',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['ConsoleMessages']};
-
-}
-
-
-
-
-
-static audit(artifacts){
-const entries=artifacts.ConsoleMessages;
-
-const deprecations=entries.filter(log=>log.entry.source==='deprecation').map(log=>{
-return{
-value:log.entry.text,
-url:log.entry.url||'',
-source:log.entry.source,
-lineNumber:log.entry.lineNumber};
-
-});
-
-
-const headings=[
-{key:'value',itemType:'text',text:str_(UIStrings.columnDeprecate)},
-{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
-{key:'lineNumber',itemType:'text',text:str_(UIStrings.columnLine)}];
-
-const details=Audit.makeTableDetails(headings,deprecations);
-
-let displayValue='';
-if(deprecations.length>0){
-displayValue=str_(UIStrings.displayValue,{itemCount:deprecations.length});
-}
-
-return{
-score:Number(deprecations.length===0),
-displayValue,
-extendedInfo:{
-value:deprecations},
-
-details};
-
-}}
-
-
-module.exports=Deprecations;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/deprecations.js");
-},{"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/diagnostics":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const MainThreadTasksComputed=require('../computed/main-thread-tasks.js');
-const NetworkRecordsComputed=require('../computed/network-records.js');
-const NetworkAnalysisComputed=require('../computed/network-analysis.js');
-const NetworkAnalyzer=require('../lib/dependency-graph/simulator/network-analyzer.js');
-
-class Diagnostics extends Audit{
-
-
-
-static get meta(){
-return{
-id:'diagnostics',
-scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
-title:'Diagnostics',
-description:'Collection of useful page vitals.',
-requiredArtifacts:['traces','devtoolsLogs']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const tasks=await MainThreadTasksComputed.request(trace,context);
-const records=await NetworkRecordsComputed.request(devtoolsLog,context);
-const analysis=await NetworkAnalysisComputed.request(devtoolsLog,context);
-
-const toplevelTasks=tasks.filter(t=>!t.parent);
-const mainDocumentTransferSize=NetworkAnalyzer.findMainDocument(records).transferSize;
-const totalByteWeight=records.reduce((sum,r)=>sum+(r.transferSize||0),0);
-const totalTaskTime=toplevelTasks.reduce((sum,t)=>sum+(t.duration||0),0);
-const maxRtt=Math.max(...analysis.additionalRttByOrigin.values())+analysis.rtt;
-const maxServerLatency=Math.max(...analysis.serverResponseTimeByOrigin.values());
-
-const diagnostics={
-numRequests:records.length,
-numScripts:records.filter(r=>r.resourceType==='Script').length,
-numStylesheets:records.filter(r=>r.resourceType==='Stylesheet').length,
-numFonts:records.filter(r=>r.resourceType==='Font').length,
-numTasks:toplevelTasks.length,
-numTasksOver10ms:toplevelTasks.filter(t=>t.duration>10).length,
-numTasksOver25ms:toplevelTasks.filter(t=>t.duration>25).length,
-numTasksOver50ms:toplevelTasks.filter(t=>t.duration>50).length,
-numTasksOver100ms:toplevelTasks.filter(t=>t.duration>100).length,
-numTasksOver500ms:toplevelTasks.filter(t=>t.duration>500).length,
-rtt:analysis.rtt,
-throughput:analysis.throughput,
-maxRtt,
-maxServerLatency,
-totalByteWeight,
-totalTaskTime,
-mainDocumentTransferSize};
-
-
-return{
-score:1,
-details:{
-type:'debugdata',
-
-items:[diagnostics]}};
-
-
-}}
-
-
-module.exports=Diagnostics;
-
-},{"../computed/main-thread-tasks.js":12,"../computed/network-analysis.js":33,"../computed/network-records.js":34,"../lib/dependency-graph/simulator/network-analyzer.js":62,"./audit.js":3}],"../audits/dobetterweb/appcache-manifest":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-const Audit=require('../audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Avoids Application Cache',
-
-failureTitle:'Uses Application Cache',
-
-description:'Application Cache is deprecated. '+
-'[Learn more](https://web.dev/appcache-manifest).',
-
-
-
-
-displayValue:'Found "{AppCacheManifest}"'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class AppCacheManifestAttr extends Audit{
-
-
-
-static get meta(){
-return{
-id:'appcache-manifest',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['AppCacheManifest']};
-
-}
-
-
-
-
-
-static audit(artifacts){
-
-if(artifacts.AppCacheManifest!==null){
-return{
-score:0,
-displayValue:str_(UIStrings.displayValue,{AppCacheManifest:artifacts.AppCacheManifest})};
-
-}
-
-return{
-score:1};
-
-}}
-
-
-module.exports=AppCacheManifestAttr;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/dobetterweb/appcache-manifest.js");
-},{"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/dobetterweb/doctype":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('../audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Page has the HTML doctype',
-
-failureTitle:'Page lacks the HTML doctype, thus triggering quirks-mode',
-
-description:'Specifying a doctype prevents the browser '+
-'from switching to quirks-mode. '+
-'[Learn more](https://web.dev/doctype).',
-
-explanationNoDoctype:'Document must contain a doctype',
-
-explanationPublicId:'Expected publicId to be an empty string',
-
-explanationSystemId:'Expected systemId to be an empty string',
-
-explanationBadDoctype:'Doctype name must be the lowercase string `html`'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class Doctype extends Audit{
-
-
-
-static get meta(){
-return{
-id:'doctype',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Doctype']};
-
-}
-
-
-
-
-
-static audit(artifacts){
-if(!artifacts.Doctype){
-return{
-score:0,
-explanation:str_(UIStrings.explanationNoDoctype)};
-
-}
-
-
-const doctypeName=artifacts.Doctype.name.trim();
-const doctypePublicId=artifacts.Doctype.publicId;
-const doctypeSystemId=artifacts.Doctype.systemId;
-
-if(doctypePublicId!==''){
-return{
-score:0,
-explanation:str_(UIStrings.explanationPublicId)};
-
-}
-
-if(doctypeSystemId!==''){
-return{
-score:0,
-explanation:str_(UIStrings.explanationSystemId)};
-
-}
-
-
-
-
-if(doctypeName==='html'){
-return{
-score:1};
-
-}else{
-return{
-score:0,
-explanation:str_(UIStrings.explanationBadDoctype)};
-
-}
-}}
-
-
-module.exports=Doctype;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/dobetterweb/doctype.js");
-},{"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/dobetterweb/dom-size":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-const Audit=require('../audit.js');
-const Util=require('../../report/html/renderer/util.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Avoids an excessive DOM size',
-
-failureTitle:'Avoid an excessive DOM size',
-
-description:'A large DOM will increase memory usage, cause longer '+
-'[style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), '+
-'and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn more](https://web.dev/dom-size).',
-
-columnStatistic:'Statistic',
-
-columnElement:'Element',
-
-columnValue:'Value',
-
-displayValue:`{itemCount, plural,
-    =1 {1 element}
-    other {# elements}
-    }`,
-
-statisticDOMElements:'Total DOM Elements',
-
-statisticDOMDepth:'Maximum DOM Depth',
-
-statisticDOMWidth:'Maximum Child Elements'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-class DOMSize extends Audit{
-
-
-
-static get meta(){
-return{
-id:'dom-size',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['DOMStats']};
-
-}
-
-
-
-
-static get defaultOptions(){
-return{
-
-
-
-scorePODR:700,
-scoreMedian:1400};
-
-}
-
-
-
-
-
-
-
-static audit(artifacts,context){
-const stats=artifacts.DOMStats;
-
-const score=Audit.computeLogNormalScore(
-stats.totalBodyElements,
-context.options.scorePODR,
-context.options.scoreMedian);
-
-
-
-const headings=[
-{key:'statistic',itemType:'text',text:str_(UIStrings.columnStatistic)},
-{key:'element',itemType:'code',text:str_(UIStrings.columnElement)},
-{key:'value',itemType:'numeric',text:str_(UIStrings.columnValue)}];
-
-
-
-const items=[
-{
-statistic:str_(UIStrings.statisticDOMElements),
-element:'',
-value:Util.formatNumber(stats.totalBodyElements)},
-
-{
-statistic:str_(UIStrings.statisticDOMDepth),
-element:{
-type:'code',
-value:stats.depth.snippet},
-
-value:Util.formatNumber(stats.depth.max)},
-
-{
-statistic:str_(UIStrings.statisticDOMWidth),
-element:{
-type:'code',
-value:stats.width.snippet},
-
-value:Util.formatNumber(stats.width.max)}];
-
-
-
-return{
-score,
-numericValue:stats.totalBodyElements,
-displayValue:str_(UIStrings.displayValue,{itemCount:stats.totalBodyElements}),
-extendedInfo:{
-value:items},
-
-details:Audit.makeTableDetails(headings,items)};
-
-}}
-
-
-module.exports=DOMSize;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/dobetterweb/dom-size.js");
-},{"../../lib/i18n/i18n.js":66,"../../report/html/renderer/util.js":87,"../audit.js":3}],"../audits/dobetterweb/external-anchors-use-rel-noopener":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const URL=require('../../lib/url-shim.js');
-const Audit=require('../audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Links to cross-origin destinations are safe',
-
-failureTitle:'Links to cross-origin destinations are unsafe',
-
-description:'Add `rel="noopener"` or `rel="noreferrer"` to any external links to improve '+
-'performance and prevent security vulnerabilities. '+
-'[Learn more](https://web.dev/external-anchors-use-rel-noopener).',
-
-
-
-
-warning:'Unable to determine the destination for anchor ({anchorHTML}). '+
-'If not used as a hyperlink, consider removing target=_blank.',
-
-columnTarget:'Target',
-
-columnRel:'Rel'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class ExternalAnchorsUseRelNoopenerAudit extends Audit{
-
-
-
-static get meta(){
-return{
-id:'external-anchors-use-rel-noopener',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['URL','AnchorElements']};
-
-}
-
-
-
-
-
-static audit(artifacts){
-
-const warnings=[];
-const pageHost=new URL(artifacts.URL.finalUrl).host;
-const failingAnchors=artifacts.AnchorElements.
-filter(anchor=>anchor.target==='_blank'&&!anchor.rel.includes('noopener')&&
-!anchor.rel.includes('noreferrer')).
-
-filter(anchor=>{
-try{
-return new URL(anchor.href).host!==pageHost;
-}catch(err){
-warnings.push(str_(UIStrings.warning,{anchorHTML:anchor.outerHTML}));
-return true;
-}
-}).
-filter(anchor=>{
-return!anchor.href||anchor.href.toLowerCase().startsWith('http');
-}).
-map(anchor=>{
-return{
-href:anchor.href||'Unknown',
-target:anchor.target||'',
-rel:anchor.rel||'',
-outerHTML:anchor.outerHTML||''};
-
-});
-
-
-const headings=[
-{key:'href',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
-{key:'target',itemType:'text',text:str_(UIStrings.columnTarget)},
-{key:'rel',itemType:'text',text:str_(UIStrings.columnRel)}];
-
-
-const details=Audit.makeTableDetails(headings,failingAnchors);
-
-return{
-score:Number(failingAnchors.length===0),
-extendedInfo:{
-value:failingAnchors},
-
-details,
-warnings};
-
-}}
-
-
-module.exports=ExternalAnchorsUseRelNoopenerAudit;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js");
-},{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/dobetterweb/geolocation-on-start":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-const ViolationAudit=require('../violation-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Avoids requesting the geolocation permission on page load',
-
-failureTitle:'Requests the geolocation permission on page load',
-
-description:'Users are mistrustful of or confused by sites that request their '+
-'location without context. Consider tying the request to a user action instead. '+
-'[Learn more](https://web.dev/geolocation-on-start).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class GeolocationOnStart extends ViolationAudit{
-
-
-
-static get meta(){
-return{
-id:'geolocation-on-start',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['ConsoleMessages']};
-
-}
-
-
-
-
-
-static audit(artifacts){
-
-const results=ViolationAudit.getViolationResults(artifacts,/geolocation/);
-
-
-const headings=[
-{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
-{key:'label',itemType:'text',text:str_(i18n.UIStrings.columnLocation)}];
-
-
-
-const details=ViolationAudit.makeTableDetails(headings,results);
-
-return{
-score:Number(results.length===0),
-extendedInfo:{
-value:results},
-
-details};
-
-}}
-
-
-module.exports=GeolocationOnStart;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/dobetterweb/geolocation-on-start.js");
-},{"../../lib/i18n/i18n.js":66,"../violation-audit.js":7}],"../audits/dobetterweb/js-libraries":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-const Audit=require('../audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Detected JavaScript libraries',
-
-description:'All front-end JavaScript libraries detected on the page. [Learn more](https://web.dev/js-libraries).',
-
-columnVersion:'Version'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class JsLibrariesAudit extends Audit{
-
-
-
-static get meta(){
-return{
-id:'js-libraries',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-requiredArtifacts:['Stacks']};
-
-}
-
-
-
-
-
-static audit(artifacts){
-const libDetails=artifacts.Stacks.
-filter(stack=>stack.detector==='js').
-map(stack=>({
-name:stack.name,
-version:stack.version,
-npm:stack.npm}));
-
-
-
-const headings=[
-{key:'name',itemType:'text',text:str_(i18n.UIStrings.columnName)},
-{key:'version',itemType:'text',text:str_(UIStrings.columnVersion)}];
-
-const details=Audit.makeTableDetails(headings,libDetails,{});
-
-return{
-score:1,
-details};
-
-}}
-
-
-module.exports=JsLibrariesAudit;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/dobetterweb/js-libraries.js");
-},{"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/dobetterweb/no-document-write":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-const ViolationAudit=require('../violation-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Avoids `document.write()`',
-
-failureTitle:'Uses `document.write()`',
-
-description:'For users on slow connections, external scripts dynamically injected via '+
-'`document.write()` can delay page load by tens of seconds. '+
-'[Learn more](https://web.dev/no-document-write).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class NoDocWriteAudit extends ViolationAudit{
-
-
-
-static get meta(){
-return{
-id:'no-document-write',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['ConsoleMessages']};
-
-}
-
-
-
-
-
-static audit(artifacts){
-const results=ViolationAudit.getViolationResults(artifacts,/document\.write/);
-
-
-const headings=[
-{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
-{key:'label',itemType:'text',text:str_(i18n.UIStrings.columnLocation)}];
-
-
-const details=ViolationAudit.makeTableDetails(headings,results);
-
-return{
-score:Number(results.length===0),
-extendedInfo:{
-value:results},
-
-details};
-
-}}
-
-
-module.exports=NoDocWriteAudit;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/dobetterweb/no-document-write.js");
-},{"../../lib/i18n/i18n.js":66,"../violation-audit.js":7}],"../audits/dobetterweb/no-vulnerable-libraries":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-const Audit=require('../audit.js');
-const Sentry=require('../../lib/sentry.js');
-const semver=require('semver');
-const snykDatabase=require('../../../third-party/snyk/snapshot.json');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Avoids front-end JavaScript libraries'+
-' with known security vulnerabilities',
-
-failureTitle:'Includes front-end JavaScript libraries'+
-' with known security vulnerabilities',
-
-description:'Some third-party scripts may contain known security vulnerabilities '+
-'that are easily identified and exploited by attackers. '+
-'[Learn more](https://web.dev/no-vulnerable-libraries).',
-
-displayValue:`{itemCount, plural,
-    =1 {1 vulnerability detected}
-    other {# vulnerabilities detected}
-    }`,
-
-columnVersion:'Library Version',
-
-columnVuln:'Vulnerability Count',
-
-columnSeverity:'Highest Severity',
-
-rowSeverityLow:'Low',
-
-rowSeverityMedium:'Medium',
-
-rowSeverityHigh:'High'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-const SEMVER_REGEX=/^(\d+\.\d+\.\d+)[^-0-9]+/;
-
-
-const rowMap={
-'low':str_(UIStrings.rowSeverityLow),
-'medium':str_(UIStrings.rowSeverityMedium),
-'high':str_(UIStrings.rowSeverityHigh)};
-
-
-
-
-
-class NoVulnerableLibrariesAudit extends Audit{
-
-
-
-static get meta(){
-return{
-id:'no-vulnerable-libraries',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Stacks']};
-
-}
-
-
-
-
-static get snykDB(){
-return snykDatabase;
-}
-
-
-
-
-static get severityMap(){
-return{
-high:3,
-medium:2,
-low:1};
-
-}
-
-
-
-
-
-
-static normalizeVersion(version){
-if(!version)return version;
-if(semver.valid(version))return version;
-
-
-if(/^\d+\.\d+$/.test(version))return`${version}.0`;
-
-const versionMatch=version.match(SEMVER_REGEX);
-if(versionMatch)return versionMatch[1];
-
-return version;
-}
-
-
-
-
-
-
-
-static getVulnerabilities(normalizedVersion,lib,snykDB){
-if(!lib.npm||!snykDB.npm[lib.npm]){
-return[];
-}
-
-
-try{
-semver.satisfies(normalizedVersion,'*');
-}catch(err){
-err.pkgName=lib.npm;
-
-Sentry.captureException(err,{level:'warning'});
-return[];
-}
-
-
-const vulnCandidatesForLib=snykDB.npm[lib.npm];
-const matchingVulns=vulnCandidatesForLib.filter(vulnCandidate=>{
-
-
-const hasMatchingVersion=vulnCandidate.semver.vulnerable.some(vulnSemverRange=>
-semver.satisfies(normalizedVersion,vulnSemverRange));
-
-return hasMatchingVersion;
-});
-
-const vulns=matchingVulns.map(vuln=>{
-return{
-severity:rowMap[vuln.severity],
-numericSeverity:this.severityMap[vuln.severity],
-library:`${lib.name}@${normalizedVersion}`,
-url:'https://snyk.io/vuln/'+vuln.id};
-
-});
-
-return vulns;
-}
-
-
-
-
-
-static highestSeverity(vulnerabilities){
-const sortedVulns=vulnerabilities.
-sort((a,b)=>b.numericSeverity-a.numericSeverity);
-return sortedVulns[0].severity;
-}
-
-
-
-
-
-static audit(artifacts){
-const foundLibraries=artifacts.Stacks.filter(stack=>stack.detector==='js');
-const snykDB=NoVulnerableLibrariesAudit.snykDB;
-
-if(!foundLibraries.length){
-return{
-score:1};
-
-}
-
-let totalVulns=0;
-
-const vulnerabilityResults=[];
-
-const libraryVulns=foundLibraries.map(lib=>{
-const version=this.normalizeVersion(lib.version)||'';
-const vulns=this.getVulnerabilities(version,lib,snykDB);
-const vulnCount=vulns.length;
-totalVulns+=vulnCount;
-
-let highestSeverity;
-if(vulns.length>0){
-highestSeverity=this.highestSeverity(vulns);
-
-vulnerabilityResults.push({
-highestSeverity,
-vulnCount,
-detectedLib:{
-text:lib.name+'@'+version,
-url:`https://snyk.io/vuln/npm:${lib.npm}?lh=${version}&utm_source=lighthouse&utm_medium=ref&utm_campaign=audit`,
-type:'link'}});
-
-
-}
-
-return{
-name:lib.name,
-npmPkgName:lib.npm,
-version,
-vulns,
-highestSeverity};
-
-});
-
-let displayValue='';
-if(totalVulns>0){
-displayValue=str_(UIStrings.displayValue,{itemCount:totalVulns});
-}
-
-
-const headings=[
-{key:'detectedLib',itemType:'link',text:str_(UIStrings.columnVersion)},
-{key:'vulnCount',itemType:'text',text:str_(UIStrings.columnVuln)},
-{key:'highestSeverity',itemType:'text',text:str_(UIStrings.columnSeverity)}];
-
-const details=Audit.makeTableDetails(headings,vulnerabilityResults,{});
-
-return{
-score:Number(totalVulns===0),
-displayValue,
-extendedInfo:{
-jsLibs:libraryVulns,
-vulnerabilities:vulnerabilityResults},
-
-details};
-
-}}
-
-
-module.exports=NoVulnerableLibrariesAudit;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/dobetterweb/no-vulnerable-libraries.js");
-},{"../../../third-party/snyk/snapshot.json":199,"../../lib/i18n/i18n.js":66,"../../lib/sentry.js":78,"../audit.js":3,"semver":179}],"../audits/dobetterweb/notification-on-start":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-const ViolationAudit=require('../violation-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Avoids requesting the notification permission on page load',
-
-failureTitle:'Requests the notification permission on page load',
-
-description:'Users are mistrustful of or confused by sites that request to send '+
-'notifications without context. Consider tying the request to user gestures '+
-'instead. [Learn more](https://web.dev/notification-on-start).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class NotificationOnStart extends ViolationAudit{
-
-
-
-static get meta(){
-return{
-id:'notification-on-start',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['ConsoleMessages']};
-
-}
-
-
-
-
-
-static audit(artifacts){
-const results=ViolationAudit.getViolationResults(artifacts,/notification permission/);
-
-
-const headings=[
-{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
-{key:'label',itemType:'text',text:str_(i18n.UIStrings.columnLocation)}];
-
-
-const details=ViolationAudit.makeTableDetails(headings,results);
-
-return{
-score:Number(results.length===0),
-extendedInfo:{
-value:results},
-
-details};
-
-}}
-
-
-module.exports=NotificationOnStart;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/dobetterweb/notification-on-start.js");
-},{"../../lib/i18n/i18n.js":66,"../violation-audit.js":7}],"../audits/dobetterweb/password-inputs-can-be-pasted-into":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('../audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Allows users to paste into password fields',
-
-failureTitle:'Prevents users to paste into password fields',
-
-description:'Preventing password pasting undermines good security policy. '+
-'[Learn more](https://web.dev/password-inputs-can-be-pasted-into).',
-
-columnFailingElem:'Failing Elements'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class PasswordInputsCanBePastedIntoAudit extends Audit{
-
-
-
-static get meta(){
-return{
-id:'password-inputs-can-be-pasted-into',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['PasswordInputsWithPreventedPaste']};
-
-}
-
-
-
-
-
-static audit(artifacts){
-const passwordInputsWithPreventedPaste=artifacts.PasswordInputsWithPreventedPaste;
-
-
-const items=[];
-passwordInputsWithPreventedPaste.forEach(input=>{
-items.push({
-node:{type:'node',snippet:input.snippet}});
-
-});
-
-
-const headings=[
-{key:'node',itemType:'node',text:str_(UIStrings.columnFailingElem)}];
-
-
-return{
-score:Number(passwordInputsWithPreventedPaste.length===0),
-extendedInfo:{
-value:passwordInputsWithPreventedPaste},
-
-details:Audit.makeTableDetails(headings,items)};
-
-}}
-
-
-module.exports=PasswordInputsCanBePastedIntoAudit;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/dobetterweb/password-inputs-can-be-pasted-into.js");
-},{"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/dobetterweb/uses-http2":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-const URL=require('../../lib/url-shim.js');
-const Audit=require('../audit.js');
-const NetworkRecords=require('../../computed/network-records.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Uses HTTP/2 for its own resources',
-
-failureTitle:'Does not use HTTP/2 for all of its resources',
-
-description:'HTTP/2 offers many benefits over HTTP/1.1, including binary headers, '+
-'multiplexing, and server push. [Learn more](https://web.dev/uses-http2).',
-
-displayValue:`{itemCount, plural,
-    =1 {1 request not served via HTTP/2}
-    other {# requests not served via HTTP/2}
-    }`,
-
-columnProtocol:'Protocol'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class UsesHTTP2Audit extends Audit{
-
-
-
-static get meta(){
-return{
-id:'uses-http2',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['URL','devtoolsLogs']};
-
-}
-
-
-
-
-
-
-static audit(artifacts,context){
-const devtoolsLogs=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-return NetworkRecords.request(devtoolsLogs,context).then(networkRecords=>{
-const finalHost=new URL(artifacts.URL.finalUrl).host;
-
-const seenURLs=new Set();
-
-const resources=networkRecords.filter(record=>{
-
-
-if(record.fetchedViaServiceWorker)return false;
-
-const isOldHttp=/HTTP\/[01][.\d]?/i.test(record.protocol);
-if(!isOldHttp)return false;
-const requestHost=new URL(record.url).host;
-return requestHost===finalHost;
-}).map(record=>{
-return{
-protocol:record.protocol,
-url:record.url};
-
-}).filter(record=>{
-if(seenURLs.has(record.url))return false;
-seenURLs.add(record.url);
-return true;
-});
-
-let displayValue='';
-if(resources.length>0){
-displayValue=str_(UIStrings.displayValue,{itemCount:resources.length});
-}
-
-
-const headings=[
-{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
-{key:'protocol',itemType:'text',text:str_(UIStrings.columnProtocol)}];
-
-const details=Audit.makeTableDetails(headings,resources);
-
-return{
-score:Number(resources.length===0),
-displayValue:displayValue,
-extendedInfo:{
-value:{
-results:resources}},
-
-
-details};
-
-});
-}}
-
-
-module.exports=UsesHTTP2Audit;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/dobetterweb/uses-http2.js");
-},{"../../computed/network-records.js":34,"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/dobetterweb/uses-passive-event-listeners":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-const ViolationAudit=require('../violation-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Uses passive listeners to improve scrolling performance',
-
-failureTitle:'Does not use passive listeners to improve scrolling performance',
-
-description:'Consider marking your touch and wheel event listeners as `passive` '+
-'to improve your page\'s scroll performance. '+
-'[Learn more](https://web.dev/uses-passive-event-listeners).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class PassiveEventsAudit extends ViolationAudit{
-
-
-
-static get meta(){
-return{
-id:'uses-passive-event-listeners',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['ConsoleMessages']};
-
-}
-
-
-
-
-
-static audit(artifacts){
-const results=ViolationAudit.getViolationResults(artifacts,/passive event listener/);
-
-
-const headings=[
-{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
-{key:'label',itemType:'text',text:str_(i18n.UIStrings.columnLocation)}];
-
-
-const details=ViolationAudit.makeTableDetails(headings,results);
-
-return{
-score:Number(results.length===0),
-extendedInfo:{
-value:results},
-
-details};
-
-}}
-
-
-module.exports=PassiveEventsAudit;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/dobetterweb/uses-passive-event-listeners.js");
-},{"../../lib/i18n/i18n.js":66,"../violation-audit.js":7}],"../audits/errors-in-console":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const log=require('lighthouse-logger');
-const Audit=require('./audit.js');
-const i18n=require('../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'No browser errors logged to the console',
-
-failureTitle:'Browser errors were logged to the console',
-
-description:'Errors logged to the console indicate unresolved problems. '+
-'They can come from network request failures and other browser concerns. '+
-'[Learn more](https://web.dev/errors-in-console)',
-
-columnDesc:'Description'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-class ErrorLogs extends Audit{
-
-
-
-static get meta(){
-return{
-id:'errors-in-console',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['ConsoleMessages','RuntimeExceptions']};
-
-}
-
-
-static defaultOptions(){
-return{};
-}
-
-
-
-
-
-
-
-
-static filterAccordingToOptions(items,options){
-const{ignoredPatterns,...restOfOptions}=options;
-const otherOptionKeys=Object.keys(restOfOptions);
-if(otherOptionKeys.length)log.warn(this.meta.id,'Unrecognized options',otherOptionKeys);
-if(!ignoredPatterns)return items;
-
-return items.filter(({description})=>{
-if(!description)return true;
-for(const pattern of ignoredPatterns){
-if(pattern instanceof RegExp&&pattern.test(description))return false;
-if(typeof pattern==='string'&&description.includes(pattern))return false;
-}
-
-return true;
-});
-}
-
-
-
-
-
-
-static audit(artifacts,context){
-const auditOptions=context.options;
-
-const consoleEntries=artifacts.ConsoleMessages;
-const runtimeExceptions=artifacts.RuntimeExceptions;
-
-const consoleRows=
-consoleEntries.filter(log=>log.entry&&log.entry.level==='error').
-map(item=>{
-return{
-source:item.entry.source,
-description:item.entry.text,
-url:item.entry.url};
-
-});
-
-const runtimeExRows=
-runtimeExceptions.filter(entry=>entry.exceptionDetails!==undefined).
-map(entry=>{
-const description=entry.exceptionDetails.exception?
-entry.exceptionDetails.exception.description:entry.exceptionDetails.text;
-
-return{
-source:'Runtime.exception',
-description,
-url:entry.exceptionDetails.url};
-
-});
-
-const tableRows=ErrorLogs.filterAccordingToOptions(
-consoleRows.concat(runtimeExRows),
-auditOptions).
-sort((a,b)=>(a.description||'').localeCompare(b.description||''));
-
-
-const headings=[
-{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
-{key:'description',itemType:'code',text:str_(UIStrings.columnDesc)}];
-
-
-const details=Audit.makeTableDetails(headings,tableRows);
-const numErrors=tableRows.length;
-
-return{
-score:Number(numErrors===0),
-numericValue:numErrors,
-details};
-
-}}
-
-
-module.exports=ErrorLogs;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/errors-in-console.js");
-},{"../lib/i18n/i18n.js":66,"./audit.js":3,"lighthouse-logger":125}],"../audits/final-screenshot":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const LHError=require('../lib/lh-error.js');
-const TraceOfTab=require('../computed/trace-of-tab.js');
-const Screenshots=require('../computed/screenshots.js');
-
-class FinalScreenshot extends Audit{
-
-
-
-static get meta(){
-return{
-id:'final-screenshot',
-scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
-title:'Final Screenshot',
-description:'The last screenshot captured of the pageload.',
-requiredArtifacts:['traces']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const traceOfTab=await TraceOfTab.request(trace,context);
-const screenshots=await Screenshots.request(trace,context);
-const{navigationStart}=traceOfTab.timestamps;
-const finalScreenshot=screenshots[screenshots.length-1];
-
-if(!finalScreenshot){
-throw new LHError(LHError.errors.NO_SCREENSHOTS);
-}
-
-return{
-score:1,
-details:{
-type:'screenshot',
-timing:Math.round((finalScreenshot.timestamp-navigationStart)/1000),
-timestamp:finalScreenshot.timestamp,
-data:finalScreenshot.datauri}};
-
-
-}}
-
-
-module.exports=FinalScreenshot;
-
-},{"../computed/screenshots.js":37,"../computed/trace-of-tab.js":39,"../lib/lh-error.js":71,"./audit.js":3}],"../audits/font-display":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const URL=require('../lib/url-shim.js');
-const PASSING_FONT_DISPLAY_REGEX=/^(block|fallback|optional|swap)$/;
-const CSS_URL_REGEX=/url\((.*?)\)/;
-const CSS_URL_GLOBAL_REGEX=new RegExp(CSS_URL_REGEX,'g');
-const i18n=require('../lib/i18n/i18n.js');
-const Sentry=require('../lib/sentry.js');
-const NetworkRecords=require('../computed/network-records.js');
-
-const UIStrings={
-
-title:'All text remains visible during webfont loads',
-
-failureTitle:'Ensure text remains visible during webfont load',
-
-description:
-'Leverage the font-display CSS feature to ensure text is user-visible while '+
-'webfonts are loading. '+
-'[Learn more](https://web.dev/font-display).',
-
-
-
-
-undeclaredFontURLWarning:'Lighthouse was unable to automatically check the font-display value '+
-'for the following URL: {fontURL}.'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class FontDisplay extends Audit{
-
-
-
-static get meta(){
-return{
-id:'font-display',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['devtoolsLogs','CSSUsage','URL']};
-
-}
-
-
-
-
-
-static findFontDisplayDeclarations(artifacts){
-
-const passingURLs=new Set();
-
-const failingURLs=new Set();
-
-
-for(const stylesheet of artifacts.CSSUsage.stylesheets){
-
-const newlinesStripped=stylesheet.content.replace(/(\r|\n)+/g,' ');
-
-const fontFaceDeclarations=newlinesStripped.match(/@font-face\s*{(.*?)}/g)||[];
-
-for(const declaration of fontFaceDeclarations){
-
-const rawFontURLs=declaration.match(CSS_URL_GLOBAL_REGEX);
-
-if(!rawFontURLs)continue;
-
-
-const fontDisplayMatch=declaration.match(/font-display\s*:\s*(\w+)\s*(;|\})/);
-const rawFontDisplay=fontDisplayMatch&&fontDisplayMatch[1]||'';
-const hasPassingFontDisplay=PASSING_FONT_DISPLAY_REGEX.test(rawFontDisplay);
-const targetURLSet=hasPassingFontDisplay?passingURLs:failingURLs;
-
-
-const relativeURLs=rawFontURLs.
-
-map(s=>s.match(CSS_URL_REGEX)[1].trim()).
-map(s=>{
-
-if(/^('|").*\1$/.test(s)){
-return s.substr(1,s.length-2);
-}
-
-return s;
-});
-
-
-for(const relativeURL of relativeURLs){
-try{
-const relativeRoot=URL.isValid(stylesheet.header.sourceURL)?
-stylesheet.header.sourceURL:artifacts.URL.finalUrl;
-const absoluteURL=new URL(relativeURL,relativeRoot);
-targetURLSet.add(absoluteURL.href);
-}catch(err){
-Sentry.captureException(err,{tags:{audit:this.meta.id}});
-}
-}
-}
-}
-
-return{passingURLs,failingURLs};
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const devtoolsLogs=artifacts.devtoolsLogs[this.DEFAULT_PASS];
-const networkRecords=await NetworkRecords.request(devtoolsLogs,context);
-const{passingURLs,failingURLs}=FontDisplay.findFontDisplayDeclarations(artifacts);
-
-const warningURLs=[];
-
-const results=networkRecords.
-
-filter(record=>record.resourceType==='Font').
-
-filter(record=>!/^data:/.test(record.url)).
-filter(record=>!/^blob:/.test(record.url)).
-
-filter(record=>{
-
-if(failingURLs.has(record.url))return true;
-
-if(!passingURLs.has(record.url))warningURLs.push(record.url);
-return false;
-}).
-map(record=>{
-
-
-const wastedMs=Math.min((record.endTime-record.startTime)*1000,3000);
-
-return{
-url:record.url,
-wastedMs};
-
-});
-
-
-const headings=[
-{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
-{key:'wastedMs',itemType:'ms',text:str_(i18n.UIStrings.columnWastedMs)}];
-
-
-const details=Audit.makeTableDetails(headings,results);
-
-return{
-score:Number(results.length===0),
-details,
-warnings:warningURLs.map(fontURL=>str_(UIStrings.undeclaredFontURLWarning,{fontURL}))};
-
-}}
-
-
-module.exports=FontDisplay;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/font-display.js");
-},{"../computed/network-records.js":34,"../lib/i18n/i18n.js":66,"../lib/sentry.js":78,"../lib/url-shim.js":"url","./audit.js":3}],"../audits/image-aspect-ratio":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const URL=require('../lib/url-shim.js');
-const i18n=require('../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Displays images with correct aspect ratio',
-
-failureTitle:'Displays images with incorrect aspect ratio',
-
-description:'Image display dimensions should match natural aspect ratio. '+
-'[Learn more](https://web.dev/image-aspect-ratio).',
-
-
-
-
-warningCompute:'Invalid image sizing information {url}',
-
-columnDisplayed:'Aspect Ratio (Displayed)',
-
-columnActual:'Aspect Ratio (Actual)'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-const THRESHOLD_PX=2;
-
-
-
-class ImageAspectRatio extends Audit{
-
-
-
-static get meta(){
-return{
-id:'image-aspect-ratio',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['ImageElements']};
-
-}
-
-
-
-
-
-static computeAspectRatios(image){
-const url=URL.elideDataURI(image.src);
-const actualAspectRatio=image.naturalWidth/image.naturalHeight;
-const displayedAspectRatio=image.displayedWidth/image.displayedHeight;
-
-const targetDisplayHeight=image.displayedWidth/actualAspectRatio;
-const doRatiosMatch=Math.abs(targetDisplayHeight-image.displayedHeight)<THRESHOLD_PX;
-
-if(!Number.isFinite(actualAspectRatio)||
-!Number.isFinite(displayedAspectRatio)){
-return new Error(str_(UIStrings.warningCompute,{url}));
-}
-
-return{
-url,
-displayedAspectRatio:`${image.displayedWidth} x ${image.displayedHeight}
-        (${displayedAspectRatio.toFixed(2)})`,
-actualAspectRatio:`${image.naturalWidth} x ${image.naturalHeight}
-        (${actualAspectRatio.toFixed(2)})`,
-doRatiosMatch};
-
-}
-
-
-
-
-
-static audit(artifacts){
-const images=artifacts.ImageElements;
-
-
-const warnings=[];
-
-const results=[];
-images.filter(image=>{
-
-
-
-
-
-return!image.isCss&&
-image.mimeType&&
-image.mimeType!=='image/svg+xml'&&
-image.naturalHeight>5&&
-image.naturalWidth>5&&
-image.displayedWidth&&
-image.displayedHeight&&
-!image.usesObjectFit;
-}).forEach(image=>{
-const wellDefinedImage=image;
-const processed=ImageAspectRatio.computeAspectRatios(wellDefinedImage);
-if(processed instanceof Error){
-warnings.push(processed.message);
-return;
-}
-
-if(!processed.doRatiosMatch)results.push(processed);
-});
-
-
-const headings=[
-{key:'url',itemType:'thumbnail',text:''},
-{key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
-{key:'displayedAspectRatio',itemType:'text',text:str_(UIStrings.columnDisplayed)},
-{key:'actualAspectRatio',itemType:'text',text:str_(UIStrings.columnActual)}];
-
-
-return{
-score:Number(results.length===0),
-warnings,
-details:Audit.makeTableDetails(headings,results)};
-
-}}
-
-
-module.exports=ImageAspectRatio;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/image-aspect-ratio.js");
-},{"../lib/i18n/i18n.js":66,"../lib/url-shim.js":"url","./audit.js":3}],"../audits/installable-manifest":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const MultiCheckAudit=require('./multi-check-audit.js');
-const ManifestValues=require('../computed/manifest-values.js');
-const i18n=require('../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Web app manifest meets the installability requirements',
-
-failureTitle:'Web app manifest does not meet the installability requirements',
-
-description:'Browsers can proactively prompt users to add your app to their homescreen, '+
-'which can lead to higher engagement. '+
-'[Learn more](https://web.dev/installable-manifest).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-class InstallableManifest extends MultiCheckAudit{
-
-
-
-static get meta(){
-return{
-id:'installable-manifest',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['URL','WebAppManifest']};
-
-}
-
-
-
-
-
-static assessManifest(manifestValues){
-if(manifestValues.isParseFailure&&manifestValues.parseFailureReason){
-return[manifestValues.parseFailureReason];
-}
-
-
-const failures=[];
-const bannerCheckIds=[
-'hasName',
-
-
-
-
-
-
-'hasShortName',
-'hasStartUrl',
-'hasPWADisplayValue',
-'hasIconsAtLeast192px'];
-
-manifestValues.allChecks.
-filter(item=>bannerCheckIds.includes(item.id)).
-forEach(item=>{
-if(!item.passing){
-failures.push(item.failureText);
-}
-});
-
-return failures;
-}
-
-
-
-
-
-
-static async audit_(artifacts,context){
-const manifestValues=await ManifestValues.request(artifacts.WebAppManifest,context);
-const manifestFailures=InstallableManifest.assessManifest(manifestValues);
-
-return{
-failures:[
-...manifestFailures],
-
-manifestValues};
-
-}}
-
-
-module.exports=InstallableManifest;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/installable-manifest.js");
-},{"../computed/manifest-values.js":13,"../lib/i18n/i18n.js":66,"./multi-check-audit.js":6}],"../audits/is-on-https":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const URL=require('../lib/url-shim.js');
-const NetworkRecords=require('../computed/network-records.js');
-const i18n=require('../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Uses HTTPS',
-
-failureTitle:'Does not use HTTPS',
-
-description:'All sites should be protected with HTTPS, even ones that don\'t handle '+
-'sensitive data. HTTPS prevents intruders from tampering with or passively listening '+
-'in on the communications between your app and your users, and is a prerequisite for '+
-'HTTP/2 and many new web platform APIs. '+
-'[Learn more](https://web.dev/is-on-https).',
-
-displayValue:`{itemCount, plural,
-    =1 {1 insecure request found}
-    other {# insecure requests found}
-    }`,
-
-columnInsecureURL:'Insecure URL'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-const SECURE_SCHEMES=['data','https','wss','blob','chrome','chrome-extension','about'];
-const SECURE_DOMAINS=['localhost','127.0.0.1'];
-
-class HTTPS extends Audit{
-
-
-
-static get meta(){
-return{
-id:'is-on-https',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['devtoolsLogs']};
-
-}
-
-
-
-
-
-static isSecureRecord(record){
-return SECURE_SCHEMES.includes(record.parsedURL.scheme)||
-SECURE_SCHEMES.includes(record.protocol)||
-SECURE_DOMAINS.includes(record.parsedURL.host);
-}
-
-
-
-
-
-
-static audit(artifacts,context){
-const devtoolsLogs=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-return NetworkRecords.request(devtoolsLogs,context).then(networkRecords=>{
-const insecureURLs=networkRecords.
-filter(record=>!HTTPS.isSecureRecord(record)).
-map(record=>URL.elideDataURI(record.url));
-
-const items=Array.from(new Set(insecureURLs)).map(url=>({url}));
-
-let displayValue='';
-if(items.length>0){
-displayValue=str_(UIStrings.displayValue,{itemCount:items.length});
-}
-
-
-const headings=[
-{key:'url',itemType:'url',text:str_(UIStrings.columnInsecureURL)}];
-
-
-return{
-score:Number(items.length===0),
-displayValue,
-extendedInfo:{
-value:items},
-
-details:Audit.makeTableDetails(headings,items)};
-
-});
-}}
-
-
-module.exports=HTTPS;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/is-on-https.js");
-},{"../computed/network-records.js":34,"../lib/i18n/i18n.js":66,"../lib/url-shim.js":"url","./audit.js":3}],"../audits/load-fast-enough-for-pwa":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-
-const isDeepEqual=require('lodash.isequal');
-const Audit=require('./audit.js');
-const mobileThrottling=require('../config/constants.js').throttling.mobileSlow4G;
-const Interactive=require('../computed/metrics/interactive.js');
-const i18n=require('../lib/i18n/i18n.js');
-
-
-
-const MAXIMUM_TTI=10*1000;
-
-const UIStrings={
-
-title:'Page load is fast enough on mobile networks',
-
-failureTitle:'Page load is not fast enough on mobile networks',
-
-description:'A fast page load over a cellular network ensures a good mobile user experience. [Learn more](https://web.dev/load-fast-enough-for-pwa).',
-
-displayValueText:'Interactive at {timeInMs, number, seconds}\xa0s',
-
-displayValueTextWithOverride:'Interactive on simulated mobile network at '+
-'{timeInMs, number, seconds}\xa0s',
-
-explanationLoadSlow:'Your page loads too slowly and is not interactive within 10 seconds. '+
-'Look at the opportunities and diagnostics in the "Performance" section to learn how to '+
-'improve.'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class LoadFastEnough4Pwa extends Audit{
-
-
-
-static get meta(){
-return{
-id:'load-fast-enough-for-pwa',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['traces','devtoolsLogs']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-
-
-
-const settingOverrides={throttlingMethod:'simulate',throttling:mobileThrottling};
-
-
-
-const override=context.settings.throttlingMethod==='provided'||
-!isDeepEqual(context.settings.throttling,mobileThrottling);
-
-const displayValueTemplate=override?
-UIStrings.displayValueTextWithOverride:UIStrings.displayValueText;
-
-const settings=override?Object.assign({},context.settings,settingOverrides):
-context.settings;
-
-const metricComputationData={trace,devtoolsLog,settings};
-const tti=await Interactive.request(metricComputationData,context);
-
-const score=Number(tti.timing<MAXIMUM_TTI);
-
-
-let displayValue;
-
-let explanation;
-if(!score){
-displayValue=str_(displayValueTemplate,{timeInMs:tti.timing});
-explanation=str_(UIStrings.explanationLoadSlow);
-}
-
-return{
-score,
-displayValue,
-explanation,
-numericValue:tti.timing};
-
-}}
-
-
-module.exports=LoadFastEnough4Pwa;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/load-fast-enough-for-pwa.js");
-},{"../computed/metrics/interactive.js":18,"../config/constants.js":46,"../lib/i18n/i18n.js":66,"./audit.js":3,"lodash.isequal":142}],"../audits/main-thread-tasks":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const MainThreadTasksComputed=require('../computed/main-thread-tasks.js');
-
-class MainThreadTasks extends Audit{
-
-
-
-static get meta(){
-return{
-id:'main-thread-tasks',
-scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
-title:'Tasks',
-description:'Lists the toplevel main thread tasks that executed during page load.',
-requiredArtifacts:['traces']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const tasks=await MainThreadTasksComputed.request(trace,context);
-
-const results=tasks.
-
-filter(task=>task.duration>5&&!task.parent).
-map(task=>{
-return{
-duration:task.duration,
-startTime:task.startTime};
-
-});
-
-
-const headings=[
-{key:'startTime',itemType:'ms',granularity:1,text:'Start Time'},
-{key:'duration',itemType:'ms',granularity:1,text:'End Time'}];
-
-
-const tableDetails=Audit.makeTableDetails(headings,results);
-
-return{
-score:1,
-numericValue:results.length,
-details:tableDetails};
-
-}}
-
-
-module.exports=MainThreadTasks;
-
-},{"../computed/main-thread-tasks.js":12,"./audit.js":3}],"../audits/mainthread-work-breakdown":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const{taskGroups}=require('../lib/tracehouse/task-groups.js');
-const i18n=require('../lib/i18n/i18n.js');
-const MainThreadTasks=require('../computed/main-thread-tasks.js');
-
-const UIStrings={
-
-title:'Minimizes main-thread work',
-
-failureTitle:'Minimize main-thread work',
-
-description:'Consider reducing the time spent parsing, compiling and executing JS. '+
-'You may find delivering smaller JS payloads helps with this. '+
-'[Learn more](https://web.dev/mainthread-work-breakdown)',
-
-columnCategory:'Category'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-class MainThreadWorkBreakdown extends Audit{
-
-
-
-static get meta(){
-return{
-id:'mainthread-work-breakdown',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['traces']};
-
-}
-
-
-
-
-static get defaultOptions(){
-return{
-
-scorePODR:1500,
-scoreMedian:4000};
-
-}
-
-
-
-
-
-static getExecutionTimingsByGroup(tasks){
-
-const result=new Map();
-
-for(const task of tasks){
-const originalTime=result.get(task.group.id)||0;
-result.set(task.group.id,originalTime+task.selfTime);
-}
-
-return result;
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const settings=context.settings||{};
-const trace=artifacts.traces[MainThreadWorkBreakdown.DEFAULT_PASS];
-
-const tasks=await MainThreadTasks.request(trace,context);
-const multiplier=settings.throttlingMethod==='simulate'?
-settings.throttling.cpuSlowdownMultiplier:1;
-
-const executionTimings=MainThreadWorkBreakdown.getExecutionTimingsByGroup(tasks);
-
-let totalExecutionTime=0;
-
-const categoryTotals={};
-const results=Array.from(executionTimings).map(([groupId,rawDuration])=>{
-const duration=rawDuration*multiplier;
-totalExecutionTime+=duration;
-
-const categoryTotal=categoryTotals[groupId]||0;
-categoryTotals[groupId]=categoryTotal+duration;
-
-return{
-group:groupId,
-groupLabel:taskGroups[groupId].label,
-duration:duration};
-
-});
-
-
-const headings=[
-{key:'groupLabel',itemType:'text',text:str_(UIStrings.columnCategory)},
-{key:'duration',itemType:'ms',granularity:1,text:str_(i18n.UIStrings.columnTimeSpent)}];
-
-
-results.sort((a,b)=>categoryTotals[b.group]-categoryTotals[a.group]);
-const tableDetails=MainThreadWorkBreakdown.makeTableDetails(headings,results);
-
-const score=Audit.computeLogNormalScore(
-totalExecutionTime,
-context.options.scorePODR,
-context.options.scoreMedian);
-
-
-return{
-score,
-numericValue:totalExecutionTime,
-displayValue:str_(i18n.UIStrings.seconds,{timeInMs:totalExecutionTime}),
-details:tableDetails};
-
-}}
-
-
-module.exports=MainThreadWorkBreakdown;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/mainthread-work-breakdown.js");
-},{"../computed/main-thread-tasks.js":12,"../lib/i18n/i18n.js":66,"../lib/tracehouse/task-groups.js":84,"./audit.js":3}],"../audits/manual/pwa-cross-browser":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-'use strict';
-
-const ManualAudit=require('./manual-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Site works cross-browser',
-
-description:'To reach the most number of users, sites should work across '+
-'every major browser. [Learn more](https://web.dev/pwa-cross-browser).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-class PWACrossBrowser extends ManualAudit{
-
-
-
-static get meta(){
-return Object.assign({
-id:'pwa-cross-browser',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description)},
-super.partialMeta);
-}}
-
-
-module.exports=PWACrossBrowser;
-module.exports.UIStrings=UIStrings;
-
-
-}).call(this,"/lighthouse-core/audits/manual/pwa-cross-browser.js");
-},{"../../lib/i18n/i18n.js":66,"./manual-audit.js":5}],"../audits/manual/pwa-each-page-has-url":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const ManualAudit=require('./manual-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Each page has a URL',
-
-description:'Ensure individual pages are deep linkable via URL and that URLs are '+
-'unique for the purpose of shareability on social media. [Learn more](https://web.dev/pwa-each-page-has-url).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-class PWAEachPageHasURL extends ManualAudit{
-
-
-
-static get meta(){
-return Object.assign({
-id:'pwa-each-page-has-url',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description)},
-super.partialMeta);
-}}
-
-
-module.exports=PWAEachPageHasURL;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/manual/pwa-each-page-has-url.js");
-},{"../../lib/i18n/i18n.js":66,"./manual-audit.js":5}],"../audits/manual/pwa-page-transitions":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const ManualAudit=require('./manual-audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Page transitions don\'t feel like they block on the network',
-
-description:'Transitions should feel snappy as you tap around, even on a slow network. '+
-'This experience is key to a user\'s perception of performance. [Learn more](https://web.dev/pwa-page-transitions).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-class PWAPageTransitions extends ManualAudit{
-
-
-
-static get meta(){
-return Object.assign({
-id:'pwa-page-transitions',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description)},
-super.partialMeta);
-}}
-
-
-module.exports=PWAPageTransitions;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/manual/pwa-page-transitions.js");
-},{"../../lib/i18n/i18n.js":66,"./manual-audit.js":5}],"../audits/metrics/estimated-input-latency":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('../audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-const ComputedEil=require('../../computed/metrics/estimated-input-latency.js');
-
-const UIStrings={
-
-title:'Estimated Input Latency',
-
-description:'Estimated Input Latency is an estimate of how long your app takes to respond to '+
-'user input, in milliseconds, during the busiest 5s window of page load. If your '+
-'latency is higher than 50 ms, users may perceive your app as laggy. '+
-'[Learn more](https://web.dev/estimated-input-latency).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class EstimatedInputLatency extends Audit{
-
-
-
-static get meta(){
-return{
-id:'estimated-input-latency',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['traces','devtoolsLogs']};
-
-}
-
-
-
-
-static get defaultOptions(){
-return{
-
-scorePODR:50,
-scoreMedian:100};
-
-}
-
-
-
-
-
-
-
-
-
-static async audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const metricComputationData={trace,devtoolsLog,settings:context.settings};
-const metricResult=await ComputedEil.request(metricComputationData,context);
-
-return{
-score:Audit.computeLogNormalScore(
-metricResult.timing,
-context.options.scorePODR,
-context.options.scoreMedian),
-
-numericValue:metricResult.timing,
-displayValue:str_(i18n.UIStrings.ms,{timeInMs:metricResult.timing})};
-
-}}
-
-
-module.exports=EstimatedInputLatency;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/metrics/estimated-input-latency.js");
-},{"../../computed/metrics/estimated-input-latency.js":14,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/first-contentful-paint-3g":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Audit=require('../audit.js');
-const regular3G=require('../../config/constants.js').throttling.mobileRegluar3G;
-const ComputedFcp=require('../../computed/metrics/first-contentful-paint.js');
-
-class FirstContentfulPaint3G extends Audit{
-
-
-
-static get meta(){
-return{
-id:'first-contentful-paint-3g',
-title:'First Contentful Paint (3G)',
-description:'First Contentful Paint 3G marks the time at which the first text or image is '+
-`painted while on a 3G network. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint).`,
-scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['traces','devtoolsLogs']};
-
-}
-
-
-
-
-static get defaultOptions(){
-return{
-
-
-scorePODR:3000,
-scoreMedian:6000};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-
-const settings={...context.settings,throttlingMethod:'simulate',throttling:regular3G};
-const metricComputationData={trace,devtoolsLog,settings};
-const metricResult=await ComputedFcp.request(metricComputationData,context);
-
-return{
-score:Audit.computeLogNormalScore(
-metricResult.timing,
-context.options.scorePODR,
-context.options.scoreMedian),
-
-numericValue:metricResult.timing,
-displayValue:`${metricResult.timing}\xa0ms`};
-
-}}
-
-
-module.exports=FirstContentfulPaint3G;
-
-},{"../../computed/metrics/first-contentful-paint.js":15,"../../config/constants.js":46,"../audit.js":3}],"../audits/metrics/first-contentful-paint":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('../audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-const ComputedFcp=require('../../computed/metrics/first-contentful-paint.js');
-
-const UIStrings={
-
-title:'First Contentful Paint',
-
-description:'First Contentful Paint marks the time at which the first text or image is '+
-`painted. [Learn more](https://web.dev/first-contentful-paint).`};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class FirstContentfulPaint extends Audit{
-
-
-
-static get meta(){
-return{
-id:'first-contentful-paint',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['traces','devtoolsLogs']};
-
-}
-
-
-
-
-static get defaultOptions(){
-return{
-
-
-
-scorePODR:2000,
-scoreMedian:4000};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const metricComputationData={trace,devtoolsLog,settings:context.settings};
-const metricResult=await ComputedFcp.request(metricComputationData,context);
-
-return{
-score:Audit.computeLogNormalScore(
-metricResult.timing,
-context.options.scorePODR,
-context.options.scoreMedian),
-
-numericValue:metricResult.timing,
-displayValue:str_(i18n.UIStrings.seconds,{timeInMs:metricResult.timing})};
-
-}}
-
-
-module.exports=FirstContentfulPaint;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/metrics/first-contentful-paint.js");
-},{"../../computed/metrics/first-contentful-paint.js":15,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/first-cpu-idle":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('../audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-const ComputedFci=require('../../computed/metrics/first-cpu-idle.js');
-
-const UIStrings={
-
-title:'First CPU Idle',
-
-description:'First CPU Idle marks the first time at which the page\'s main thread is '+
-'quiet enough to handle input.  [Learn more](https://web.dev/first-cpu-idle).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class FirstCPUIdle extends Audit{
-
-
-
-static get meta(){
-return{
-id:'first-cpu-idle',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['traces','devtoolsLogs']};
-
-}
-
-
-
-
-static get defaultOptions(){
-return{
-
-
-
-scorePODR:2900,
-scoreMedian:6500};
-
-}
-
-
-
-
-
-
-
-
-
-static async audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const metricComputationData={trace,devtoolsLog,settings:context.settings};
-const metricResult=await ComputedFci.request(metricComputationData,context);
-
-return{
-score:Audit.computeLogNormalScore(
-metricResult.timing,
-context.options.scorePODR,
-context.options.scoreMedian),
-
-numericValue:metricResult.timing,
-displayValue:str_(i18n.UIStrings.seconds,{timeInMs:metricResult.timing})};
-
-}}
-
-
-module.exports=FirstCPUIdle;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/metrics/first-cpu-idle.js");
-},{"../../computed/metrics/first-cpu-idle.js":16,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/first-meaningful-paint":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('../audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-const ComputedFmp=require('../../computed/metrics/first-meaningful-paint.js');
-
-const UIStrings={
-
-title:'First Meaningful Paint',
-
-description:'First Meaningful Paint measures when the primary content of a page is '+
-'visible. [Learn more](https://web.dev/first-meaningful-paint).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class FirstMeaningfulPaint extends Audit{
-
-
-
-static get meta(){
-return{
-id:'first-meaningful-paint',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['traces','devtoolsLogs']};
-
-}
-
-
-
-
-static get defaultOptions(){
-return{
-
-
-
-scorePODR:2000,
-scoreMedian:4000};
-
-}
-
-
-
-
-
-
-
-
-
-static async audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const metricComputationData={trace,devtoolsLog,settings:context.settings};
-const metricResult=await ComputedFmp.request(metricComputationData,context);
-
-return{
-score:Audit.computeLogNormalScore(
-metricResult.timing,
-context.options.scorePODR,
-context.options.scoreMedian),
-
-numericValue:metricResult.timing,
-displayValue:str_(i18n.UIStrings.seconds,{timeInMs:metricResult.timing})};
-
-}}
-
-
-module.exports=FirstMeaningfulPaint;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/metrics/first-meaningful-paint.js");
-},{"../../computed/metrics/first-meaningful-paint.js":17,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/interactive":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('../audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-const Interactive=require('../../computed/metrics/interactive.js');
-
-const UIStrings={
-
-title:'Time to Interactive',
-
-description:'Time to interactive is the amount of time it takes for the page to become fully '+
-'interactive. [Learn more](https://web.dev/interactive).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-
-
-class InteractiveMetric extends Audit{
-
-
-
-static get meta(){
-return{
-id:'interactive',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['traces','devtoolsLogs']};
-
-}
-
-
-
-
-static get defaultOptions(){
-return{
-
-
-
-scorePODR:2900,
-scoreMedian:7300};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const metricComputationData={trace,devtoolsLog,settings:context.settings};
-const metricResult=await Interactive.request(metricComputationData,context);
-const timeInMs=metricResult.timing;
-const extendedInfo={
-timeInMs,
-timestamp:metricResult.timestamp,
-
-optimistic:metricResult.optimisticEstimate&&metricResult.optimisticEstimate.timeInMs,
-
-pessimistic:metricResult.pessimisticEstimate&&metricResult.pessimisticEstimate.timeInMs};
-
-
-return{
-score:Audit.computeLogNormalScore(
-timeInMs,
-context.options.scorePODR,
-context.options.scoreMedian),
-
-numericValue:timeInMs,
-displayValue:str_(i18n.UIStrings.seconds,{timeInMs}),
-extendedInfo:{
-value:extendedInfo}};
-
-
-}}
-
-
-module.exports=InteractiveMetric;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/metrics/interactive.js");
-},{"../../computed/metrics/interactive.js":18,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/max-potential-fid":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('../audit.js');
-const ComputedFid=require('../../computed/metrics/max-potential-fid.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Max Potential First Input Delay',
-
-description:'The maximum potential First Input Delay that your users could experience is the '+
-'duration, in milliseconds, of the longest task. [Learn more](https://developers.google.com/web/updates/2018/05/first-input-delay).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-
-class MaxPotentialFID extends Audit{
-
-
-
-static get meta(){
-return{
-id:'max-potential-fid',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['traces','devtoolsLogs']};
-
-}
-
-
-
-
-static get defaultOptions(){
-return{
-
-scorePODR:100,
-scoreMedian:250};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const metricComputationData={trace,devtoolsLog,settings:context.settings};
-const metricResult=await ComputedFid.request(metricComputationData,context);
-
-return{
-score:Audit.computeLogNormalScore(
-metricResult.timing,
-context.options.scorePODR,
-context.options.scoreMedian),
-
-numericValue:metricResult.timing,
-displayValue:str_(i18n.UIStrings.ms,{timeInMs:metricResult.timing})};
-
-}}
-
-
-module.exports=MaxPotentialFID;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/metrics/max-potential-fid.js");
-},{"../../computed/metrics/max-potential-fid.js":29,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/speed-index":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('../audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-const ComputedSi=require('../../computed/metrics/speed-index.js');
-
-const UIStrings={
-
-title:'Speed Index',
-
-description:'Speed Index shows how quickly the contents of a page are visibly populated. '+
-'[Learn more](https://web.dev/speed-index).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class SpeedIndex extends Audit{
-
-
-
-static get meta(){
-return{
-id:'speed-index',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['traces','devtoolsLogs']};
-
-}
-
-
-
-
-static get defaultOptions(){
-return{
-
-
-
-scorePODR:2900,
-scoreMedian:5800};
-
-}
-
-
-
-
-
-
-
-
-static async audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const metricComputationData={trace,devtoolsLog,settings:context.settings};
-const metricResult=await ComputedSi.request(metricComputationData,context);
-
-return{
-score:Audit.computeLogNormalScore(
-metricResult.timing,
-context.options.scorePODR,
-context.options.scoreMedian),
-
-numericValue:metricResult.timing,
-displayValue:str_(i18n.UIStrings.seconds,{timeInMs:metricResult.timing})};
-
-}}
-
-
-module.exports=SpeedIndex;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/metrics/speed-index.js");
-},{"../../computed/metrics/speed-index.js":31,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/total-blocking-time":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('../audit.js');
-const ComputedTBT=require('../../computed/metrics/total-blocking-time.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Total Blocking Time',
-
-description:'Sum of all time periods between FCP and Time to Interactive, '+
-'when task length exceeded 50ms, expressed in milliseconds.'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class TotalBlockingTime extends Audit{
-
-
-
-static get meta(){
-return{
-id:'total-blocking-time',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['traces','devtoolsLogs']};
-
-}
-
-
-
-
-static get defaultOptions(){
-return{
-
-
-
-
-
-
-scoreMedian:600,
-scorePODR:200};
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-static async audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const metricComputationData={trace,devtoolsLog,settings:context.settings};
-const metricResult=await ComputedTBT.request(metricComputationData,context);
-
-return{
-score:Audit.computeLogNormalScore(
-metricResult.timing,
-context.options.scorePODR,
-context.options.scoreMedian),
-
-numericValue:metricResult.timing,
-displayValue:str_(i18n.UIStrings.ms,{timeInMs:metricResult.timing})};
-
-}}
-
-
-module.exports=TotalBlockingTime;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/metrics/total-blocking-time.js");
-},{"../../computed/metrics/total-blocking-time.js":32,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const TraceOfTab=require('../computed/trace-of-tab.js');
-const Speedline=require('../computed/speedline.js');
-const FirstContentfulPaint=require('../computed/metrics/first-contentful-paint.js');
-const FirstMeaningfulPaint=require('../computed/metrics/first-meaningful-paint.js');
-const LargestContentfulPaint=require('../computed/metrics/largest-contentful-paint.js');
-const FirstCPUIdle=require('../computed/metrics/first-cpu-idle.js');
-const Interactive=require('../computed/metrics/interactive.js');
-const SpeedIndex=require('../computed/metrics/speed-index.js');
-const EstimatedInputLatency=require('../computed/metrics/estimated-input-latency.js');
-const TotalBlockingTime=require('../computed/metrics/total-blocking-time.js');
-
-class Metrics extends Audit{
-
-
-
-static get meta(){
-return{
-id:'metrics',
-scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
-title:'Metrics',
-description:'Collects all available metrics.',
-requiredArtifacts:['traces','devtoolsLogs']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const metricComputationData={trace,devtoolsLog,settings:context.settings};
-
-
-
-
-
-
-
-
-const requestOrUndefined=(Artifact,artifact)=>{
-return Artifact.request(artifact,context).catch(_=>undefined);
-};
-
-const traceOfTab=await TraceOfTab.request(trace,context);
-const speedline=await Speedline.request(trace,context);
-const firstContentfulPaint=await FirstContentfulPaint.request(metricComputationData,context);
-const firstMeaningfulPaint=await FirstMeaningfulPaint.request(metricComputationData,context);
-const largestContentfulPaint=await requestOrUndefined(LargestContentfulPaint,metricComputationData);
-const firstCPUIdle=await requestOrUndefined(FirstCPUIdle,metricComputationData);
-const interactive=await requestOrUndefined(Interactive,metricComputationData);
-const speedIndex=await requestOrUndefined(SpeedIndex,metricComputationData);
-const estimatedInputLatency=await EstimatedInputLatency.request(metricComputationData,context);
-const totalBlockingTime=await TotalBlockingTime.request(metricComputationData,context);
-
-
-const metrics={
-
-firstContentfulPaint:firstContentfulPaint.timing,
-firstContentfulPaintTs:firstContentfulPaint.timestamp,
-firstMeaningfulPaint:firstMeaningfulPaint.timing,
-firstMeaningfulPaintTs:firstMeaningfulPaint.timestamp,
-largestContentfulPaint:largestContentfulPaint&&largestContentfulPaint.timing,
-largestContentfulPaintTs:largestContentfulPaint&&largestContentfulPaint.timestamp,
-firstCPUIdle:firstCPUIdle&&firstCPUIdle.timing,
-firstCPUIdleTs:firstCPUIdle&&firstCPUIdle.timestamp,
-interactive:interactive&&interactive.timing,
-interactiveTs:interactive&&interactive.timestamp,
-speedIndex:speedIndex&&speedIndex.timing,
-speedIndexTs:speedIndex&&speedIndex.timestamp,
-estimatedInputLatency:estimatedInputLatency.timing,
-estimatedInputLatencyTs:estimatedInputLatency.timestamp,
-totalBlockingTime:totalBlockingTime.timing,
-
-
-observedNavigationStart:traceOfTab.timings.navigationStart,
-observedNavigationStartTs:traceOfTab.timestamps.navigationStart,
-observedFirstPaint:traceOfTab.timings.firstPaint,
-observedFirstPaintTs:traceOfTab.timestamps.firstPaint,
-observedFirstContentfulPaint:traceOfTab.timings.firstContentfulPaint,
-observedFirstContentfulPaintTs:traceOfTab.timestamps.firstContentfulPaint,
-observedFirstMeaningfulPaint:traceOfTab.timings.firstMeaningfulPaint,
-observedFirstMeaningfulPaintTs:traceOfTab.timestamps.firstMeaningfulPaint,
-observedLargestContentfulPaint:traceOfTab.timings.largestContentfulPaint,
-observedLargestContentfulPaintTs:traceOfTab.timestamps.largestContentfulPaint,
-observedTraceEnd:traceOfTab.timings.traceEnd,
-observedTraceEndTs:traceOfTab.timestamps.traceEnd,
-observedLoad:traceOfTab.timings.load,
-observedLoadTs:traceOfTab.timestamps.load,
-observedDomContentLoaded:traceOfTab.timings.domContentLoaded,
-observedDomContentLoadedTs:traceOfTab.timestamps.domContentLoaded,
-
-
-observedFirstVisualChange:speedline.first,
-observedFirstVisualChangeTs:(speedline.first+speedline.beginning)*1000,
-observedLastVisualChange:speedline.complete,
-observedLastVisualChangeTs:(speedline.complete+speedline.beginning)*1000,
-observedSpeedIndex:speedline.speedIndex,
-observedSpeedIndexTs:(speedline.speedIndex+speedline.beginning)*1000};
-
-
-for(const[name,value]of Object.entries(metrics)){
-const key=name;
-if(typeof value!=='undefined'){
-metrics[key]=Math.round(value);
-}
-}
-
-
-const details={
-type:'debugdata',
-
-items:[metrics,{lcpInvalidated:traceOfTab.lcpInvalidated}]};
-
-
-return{
-score:1,
-numericValue:interactive&&interactive.timing||0,
-details};
-
-}}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-module.exports=Metrics;
-
-},{"../computed/metrics/estimated-input-latency.js":14,"../computed/metrics/first-contentful-paint.js":15,"../computed/metrics/first-cpu-idle.js":16,"../computed/metrics/first-meaningful-paint.js":17,"../computed/metrics/interactive.js":18,"../computed/metrics/largest-contentful-paint.js":28,"../computed/metrics/speed-index.js":31,"../computed/metrics/total-blocking-time.js":32,"../computed/speedline.js":38,"../computed/trace-of-tab.js":39,"./audit.js":3}],"../audits/mixed-content":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const URL=require('../lib/url-shim.js');
-const Util=require('../report/html/renderer/util.js');
-const NetworkRecords=require('../computed/network-records.js');
-
-
-
-
-
-
-
-class MixedContent extends Audit{
-
-
-
-static get meta(){
-return{
-id:'mixed-content',
-title:'All resources loaded are secure',
-failureTitle:'Some insecure resources can be upgraded to HTTPS',
-description:`Mixed content warnings can prevent you from upgrading to HTTPS.
-      This audit shows which insecure resources this page uses that can be
-      upgraded to HTTPS. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/mixed-content)`,
-requiredArtifacts:['devtoolsLogs','MixedContent']};
-
-}
-
-
-
-
-
-
-
-static upgradeURL(url){
-const parsedURL=new URL(url);
-parsedURL.protocol='https:';
-return parsedURL.href;
-}
-
-
-
-
-
-
-
-static simplifyURL(url){
-const parsedURL=new URL(url);
-parsedURL.hash='';
-parsedURL.search='';
-return parsedURL.href;
-}
-
-
-
-
-
-
-
-static displayURL(url=''){
-const displayOptions={
-numPathParts:4,
-preserveQuery:false,
-preserveHost:true};
-
-return URL.getURLDisplayName(url,displayOptions);
-}
-
-
-
-
-
-
-static audit(artifacts,context){
-const defaultLogs=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const upgradeLogs=artifacts.devtoolsLogs['mixedContentPass'];
-const baseHostname=new URL(artifacts.MixedContent.url).host;
-
-const computedArtifacts=[
-NetworkRecords.request(defaultLogs,context),
-NetworkRecords.request(upgradeLogs,context)];
-
-
-return Promise.all(computedArtifacts).then(([defaultRecords,upgradedRecords])=>{
-const insecureRecords=defaultRecords.filter(
-record=>!record.isSecure);
-const secureRecords=defaultRecords.filter(
-record=>record.isSecure);
-
-const upgradePassHosts=new Set();
-const upgradePassSecureHosts=new Set();
-upgradedRecords.forEach(record=>{
-upgradePassHosts.add(new URL(record.url).hostname);
-if(record.isSecure&&record.finished&&!record.failed){
-upgradePassSecureHosts.add(new URL(record.url).hostname);
-}
-});
-
-
-
-
-const seen=new Set();
-const upgradeableResources=[];
-
-for(const record of insecureRecords){
-const simpleUrl=this.simplifyURL(record.url);
-if(seen.has(simpleUrl))continue;
-seen.add(simpleUrl);
-
-const resource={
-host:new URL(record.url).hostname,
-fullUrl:record.url,
-referrerDocUrl:this.displayURL(record.documentURL)};
-
-
-if(!upgradePassSecureHosts.has(resource.host))continue;
-
-if(!resource.referrerDocUrl.includes(baseHostname))continue;
-
-upgradeableResources.push(resource);
-}
-
-const displayValue=`${Util.formatNumber(upgradeableResources.length)}
-          ${upgradeableResources.length===1?'request':'requests'}`;
-
-
-const headings=[
-{key:'fullUrl',itemType:'url',text:'URL'}];
-
-const details=Audit.makeTableDetails(headings,upgradeableResources);
-
-const totalRecords=defaultRecords.length;
-const score=(secureRecords.length+0.5*upgradeableResources.length)/totalRecords;
-
-return{
-score,
-displayValue:displayValue,
-details};
-
-});
-}}
-
-
-module.exports=MixedContent;
-
-},{"../computed/network-records.js":34,"../lib/url-shim.js":"url","../report/html/renderer/util.js":87,"./audit.js":3}],"../audits/network-requests":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const URL=require('../lib/url-shim.js');
-const NetworkRecords=require('../computed/network-records.js');
-
-class NetworkRequests extends Audit{
-
-
-
-static get meta(){
-return{
-id:'network-requests',
-scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
-title:'Network Requests',
-description:'Lists the network requests that were made during page load.',
-requiredArtifacts:['devtoolsLogs']};
-
-}
-
-
-
-
-
-
-static audit(artifacts,context){
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-return NetworkRecords.request(devtoolsLog,context).then(records=>{
-const earliestStartTime=records.reduce(
-(min,record)=>Math.min(min,record.startTime),
-Infinity);
-
-
-
-const timeToMs=time=>time<earliestStartTime||!Number.isFinite(time)?
-undefined:(time-earliestStartTime)*1000;
-
-const results=records.map(record=>{
-const endTimeDeltaMs=record.lrStatistics&&record.lrStatistics.endTimeDeltaMs;
-const TCPMs=record.lrStatistics&&record.lrStatistics.TCPMs;
-const requestMs=record.lrStatistics&&record.lrStatistics.requestMs;
-const responseMs=record.lrStatistics&&record.lrStatistics.responseMs;
-
-return{
-url:URL.elideDataURI(record.url),
-startTime:timeToMs(record.startTime),
-endTime:timeToMs(record.endTime),
-transferSize:record.transferSize,
-resourceSize:record.resourceSize,
-statusCode:record.statusCode,
-mimeType:record.mimeType,
-resourceType:record.resourceType,
-lrEndTimeDeltaMs:endTimeDeltaMs,
-lrTCPMs:TCPMs,
-lrRequestMs:requestMs,
-lrResponseMs:responseMs};
-
-});
-
-
-const headings=[
-{key:'url',itemType:'url',text:'URL'},
-{key:'startTime',itemType:'ms',granularity:1,text:'Start Time'},
-{key:'endTime',itemType:'ms',granularity:1,text:'End Time'},
-{
-key:'transferSize',
-itemType:'bytes',
-displayUnit:'kb',
-granularity:1,
-text:'Transfer Size'},
-
-{
-key:'resourceSize',
-itemType:'bytes',
-displayUnit:'kb',
-granularity:1,
-text:'Resource Size'},
-
-{key:'statusCode',itemType:'text',text:'Status Code'},
-{key:'mimeType',itemType:'text',text:'MIME Type'},
-{key:'resourceType',itemType:'text',text:'Resource Type'}];
-
-
-const tableDetails=Audit.makeTableDetails(headings,results);
-
-return{
-score:1,
-numericValue:results.length,
-details:tableDetails};
-
-});
-}}
-
-
-module.exports=NetworkRequests;
-
-},{"../computed/network-records.js":34,"../lib/url-shim.js":"url","./audit.js":3}],"../audits/network-rtt":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const i18n=require('../lib/i18n/i18n.js');
-const NetworkAnalysisComputed=require('../computed/network-analysis.js');
-
-const UIStrings={
-
-title:'Network Round Trip Times',
-
-description:'Network round trip times (RTT) have a large impact on performance. '+
-'If the RTT to an origin is high, it\'s an indication that servers closer to the user could '+
-'improve performance. [Learn more](https://hpbn.co/primer-on-latency-and-bandwidth/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class NetworkRTT extends Audit{
-
-
-
-static get meta(){
-return{
-id:'network-rtt',
-scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-requiredArtifacts:['devtoolsLogs']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const analysis=await NetworkAnalysisComputed.request(devtoolsLog,context);
-
-
-let maxRtt=0;
-const baseRtt=analysis.rtt;
-
-const results=[];
-for(const[origin,additionalRtt]of analysis.additionalRttByOrigin.entries()){
-
-if(!origin.startsWith('http'))continue;
-
-const rtt=additionalRtt+baseRtt;
-results.push({origin,rtt});
-maxRtt=Number.isFinite(rtt)?Math.max(rtt,maxRtt):maxRtt;
-}
-
-results.sort((a,b)=>b.rtt-a.rtt);
-
-
-const headings=[
-{key:'origin',itemType:'text',text:str_(i18n.UIStrings.columnURL)},
-{key:'rtt',itemType:'ms',granularity:1,text:str_(i18n.UIStrings.columnTimeSpent)}];
-
-
-const tableDetails=Audit.makeTableDetails(headings,results);
-
-return{
-score:1,
-numericValue:maxRtt,
-displayValue:str_(i18n.UIStrings.ms,{timeInMs:maxRtt}),
-details:tableDetails};
-
-}}
-
-
-module.exports=NetworkRTT;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/network-rtt.js");
-},{"../computed/network-analysis.js":33,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/network-server-latency":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const i18n=require('../lib/i18n/i18n.js');
-const NetworkAnalysisComputed=require('../computed/network-analysis.js');
-
-const UIStrings={
-
-title:'Server Backend Latencies',
-
-description:'Server latencies can impact web performance. '+
-'If the server latency of an origin is high, it\'s an indication the server is overloaded '+
-'or has poor backend performance. [Learn more](https://hpbn.co/primer-on-web-performance/#analyzing-the-resource-waterfall).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class NetworkServerLatency extends Audit{
-
-
-
-static get meta(){
-return{
-id:'network-server-latency',
-scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-requiredArtifacts:['devtoolsLogs']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const analysis=await NetworkAnalysisComputed.request(devtoolsLog,context);
-
-
-let maxLatency=0;
-
-const results=[];
-for(const[origin,serverResponseTime]of analysis.serverResponseTimeByOrigin.entries()){
-
-if(!origin.startsWith('http'))continue;
-
-maxLatency=Math.max(serverResponseTime,maxLatency);
-results.push({origin,serverResponseTime});
-}
-
-results.sort((a,b)=>b.serverResponseTime-a.serverResponseTime);
-
-
-const headings=[
-{key:'origin',itemType:'text',text:str_(i18n.UIStrings.columnURL)},
-{key:'serverResponseTime',itemType:'ms',granularity:1,
-text:str_(i18n.UIStrings.columnTimeSpent)}];
-
-
-const tableDetails=Audit.makeTableDetails(headings,results);
-
-return{
-score:Math.max(1-maxLatency/500,0),
-numericValue:maxLatency,
-displayValue:str_(i18n.UIStrings.ms,{timeInMs:maxLatency}),
-details:tableDetails};
-
-}}
-
-
-module.exports=NetworkServerLatency;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/network-server-latency.js");
-},{"../computed/network-analysis.js":33,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/offline-start-url":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const i18n=require('../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'`start_url` responds with a 200 when offline',
-
-failureTitle:'`start_url` does not respond with a 200 when offline',
-
-description:'A service worker enables your web app to be reliable in unpredictable '+
-'network conditions. [Learn more](https://web.dev/offline-start-url).',
-
-
-
-
-warningCantStart:'Lighthouse couldn\'t read the `start_url` from the manifest. As a result, '+
-'the `start_url` was assumed to be the document\'s URL. Error message: \'{manifestWarning}\'.'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class OfflineStartUrl extends Audit{
-
-
-
-static get meta(){
-return{
-id:'offline-start-url',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['WebAppManifest','StartUrl']};
-
-}
-
-
-
-
-
-static audit(artifacts){
-
-
-const warnings=[];
-const manifest=artifacts.WebAppManifest;
-if(manifest&&manifest.value&&manifest.value.start_url.warning){
-const manifestWarning=manifest.value.start_url.warning;
-warnings.push(str_(UIStrings.warningCantStart,{manifestWarning}));
-}
-
-const hasOfflineStartUrl=artifacts.StartUrl.statusCode===200;
-
-return{
-score:Number(hasOfflineStartUrl),
-explanation:artifacts.StartUrl.explanation,
-warnings};
-
-}}
-
-
-module.exports=OfflineStartUrl;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/offline-start-url.js");
-},{"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/performance-budget":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const ResourceSummary=require('../computed/resource-summary.js');
-const MainResource=require('../computed/main-resource.js');
-const Budget=require('../config/budget.js');
-const i18n=require('../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Performance budget',
-
-description:'Keep the quantity and size of network requests under the targets '+
-'set by the provided performance budget. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/budgets).',
-
-requestCountOverBudget:`{count, plural,
-    =1 {1 request}
-    other {# requests}
-   }`,
-
-columnOverBudget:'Over Budget'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-class ResourceBudget extends Audit{
-
-
-
-static get meta(){
-return{
-id:'performance-budget',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
-requiredArtifacts:['devtoolsLogs','URL']};
-
-}
-
-
-
-
-
-static getRowLabel(resourceType){
-
-const strMappings={
-'total':i18n.UIStrings.totalResourceType,
-'document':i18n.UIStrings.documentResourceType,
-'script':i18n.UIStrings.scriptResourceType,
-'stylesheet':i18n.UIStrings.stylesheetResourceType,
-'image':i18n.UIStrings.imageResourceType,
-'media':i18n.UIStrings.mediaResourceType,
-'font':i18n.UIStrings.fontResourceType,
-'other':i18n.UIStrings.otherResourceType,
-'third-party':i18n.UIStrings.thirdPartyResourceType};
-
-return strMappings[resourceType];
-}
-
-
-
-
-
-
-static tableItems(budget,summary){
-const resourceTypes=Object.keys(summary);
-return resourceTypes.map(resourceType=>{
-const label=str_(this.getRowLabel(resourceType));
-const requestCount=summary[resourceType].count;
-const size=summary[resourceType].size;
-
-let sizeOverBudget;
-let countOverBudget;
-
-if(budget.resourceSizes){
-const sizeBudget=budget.resourceSizes.find(b=>b.resourceType===resourceType);
-if(sizeBudget&&size>sizeBudget.budget*1024){
-sizeOverBudget=size-sizeBudget.budget*1024;
-}
-}
-if(budget.resourceCounts){
-const countBudget=budget.resourceCounts.find(b=>b.resourceType===resourceType);
-if(countBudget&&requestCount>countBudget.budget){
-const requestDifference=requestCount-countBudget.budget;
-countOverBudget=str_(UIStrings.requestCountOverBudget,{count:requestDifference});
-}
-}
-return{
-resourceType,
-label,
-requestCount,
-size,
-countOverBudget,
-sizeOverBudget};
-
-}).filter(row=>{
-
-if(budget.resourceSizes){
-if(budget.resourceSizes.some(b=>b.resourceType===row.resourceType))return true;
-}
-if(budget.resourceCounts){
-if(budget.resourceCounts.some(b=>b.resourceType===row.resourceType))return true;
-}
-return false;
-}).sort((a,b)=>{
-return(b.sizeOverBudget||0)-(a.sizeOverBudget||0);
-});
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const summary=await ResourceSummary.request({devtoolsLog,URL:artifacts.URL},context);
-const mainResource=await MainResource.request({URL:artifacts.URL,devtoolsLog},context);
-
-
-const budgets=Array.from(context.settings.budgets||[]);
-
-const budget=budgets?budgets.reverse().find(b=>{
-return Budget.urlMatchesPattern(mainResource.url,b.path);
-}):undefined;
-
-if(!budget){
-return{
-score:0,
-notApplicable:true};
-
-}
-
-
-const headers=[
-{key:'label',itemType:'text',text:str_(i18n.UIStrings.columnResourceType)},
-{key:'requestCount',itemType:'numeric',text:str_(i18n.UIStrings.columnRequests)},
-{key:'size',itemType:'bytes',text:str_(i18n.UIStrings.columnTransferSize)},
-{key:'countOverBudget',itemType:'text',text:''},
-{key:'sizeOverBudget',itemType:'bytes',text:str_(UIStrings.columnOverBudget)}];
-
-
-return{
-details:Audit.makeTableDetails(headers,this.tableItems(budget,summary)),
-score:1};
-
-}}
-
-
-module.exports=ResourceBudget;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/performance-budget.js");
-},{"../computed/main-resource.js":11,"../computed/resource-summary.js":36,"../config/budget.js":42,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/predictive-perf":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const Util=require('../report/html/renderer/util.js');
-
-const LanternFcp=require('../computed/metrics/lantern-first-contentful-paint.js');
-const LanternFmp=require('../computed/metrics/lantern-first-meaningful-paint.js');
-const LanternInteractive=require('../computed/metrics/lantern-interactive.js');
-const LanternFirstCPUIdle=require('../computed/metrics/lantern-first-cpu-idle.js');
-const LanternSpeedIndex=require('../computed/metrics/lantern-speed-index.js');
-const LanternEil=require('../computed/metrics/lantern-estimated-input-latency.js');
-
-
-
-const SCORING_POINT_OF_DIMINISHING_RETURNS=1700;
-const SCORING_MEDIAN=10000;
-
-class PredictivePerf extends Audit{
-
-
-
-static get meta(){
-return{
-id:'predictive-perf',
-title:'Predicted Performance (beta)',
-description:
-'Predicted performance evaluates how your site will perform under '+
-'a cellular connection on a mobile device.',
-scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['traces','devtoolsLogs']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-
-
-const settings={};
-const fcp=await LanternFcp.request({trace,devtoolsLog,settings},context);
-const fmp=await LanternFmp.request({trace,devtoolsLog,settings},context);
-const tti=await LanternInteractive.request({trace,devtoolsLog,settings},context);
-const ttfcpui=await LanternFirstCPUIdle.request({trace,devtoolsLog,settings},context);
-const si=await LanternSpeedIndex.request({trace,devtoolsLog,settings},context);
-const eil=await LanternEil.request({trace,devtoolsLog,settings},context);
-
-const values={
-roughEstimateOfFCP:fcp.timing,
-optimisticFCP:fcp.optimisticEstimate.timeInMs,
-pessimisticFCP:fcp.pessimisticEstimate.timeInMs,
-
-roughEstimateOfFMP:fmp.timing,
-optimisticFMP:fmp.optimisticEstimate.timeInMs,
-pessimisticFMP:fmp.pessimisticEstimate.timeInMs,
-
-roughEstimateOfTTI:tti.timing,
-optimisticTTI:tti.optimisticEstimate.timeInMs,
-pessimisticTTI:tti.pessimisticEstimate.timeInMs,
-
-roughEstimateOfTTFCPUI:ttfcpui.timing,
-optimisticTTFCPUI:ttfcpui.optimisticEstimate.timeInMs,
-pessimisticTTFCPUI:ttfcpui.pessimisticEstimate.timeInMs,
-
-roughEstimateOfSI:si.timing,
-optimisticSI:si.optimisticEstimate.timeInMs,
-pessimisticSI:si.pessimisticEstimate.timeInMs,
-
-roughEstimateOfEIL:eil.timing,
-optimisticEIL:eil.optimisticEstimate.timeInMs,
-pessimisticEIL:eil.pessimisticEstimate.timeInMs};
-
-
-const score=Audit.computeLogNormalScore(
-values.roughEstimateOfTTI,
-SCORING_POINT_OF_DIMINISHING_RETURNS,
-SCORING_MEDIAN);
-
-
-return{
-score,
-numericValue:values.roughEstimateOfTTI,
-displayValue:Util.formatMilliseconds(values.roughEstimateOfTTI),
-details:{
-type:'debugdata',
-
-items:[values]}};
-
-
-}}
-
-
-module.exports=PredictivePerf;
-
-},{"../computed/metrics/lantern-estimated-input-latency.js":19,"../computed/metrics/lantern-first-contentful-paint.js":20,"../computed/metrics/lantern-first-cpu-idle.js":21,"../computed/metrics/lantern-first-meaningful-paint.js":22,"../computed/metrics/lantern-interactive.js":23,"../computed/metrics/lantern-speed-index.js":26,"../report/html/renderer/util.js":87,"./audit.js":3}],"../audits/redirects-http":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const i18n=require('../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Redirects HTTP traffic to HTTPS',
-
-failureTitle:'Does not redirect HTTP traffic to HTTPS',
-
-description:'If you\'ve already set up HTTPS, make sure that you redirect all HTTP '+
-'traffic to HTTPS in order to enable secure web features for all your users. [Learn more](https://web.dev/redirects-http).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class RedirectsHTTP extends Audit{
-
-
-
-static get meta(){
-return{
-id:'redirects-http',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['HTTPRedirect']};
-
-}
-
-
-
-
-
-static audit(artifacts){
-return{
-score:Number(artifacts.HTTPRedirect.value)};
-
-}}
-
-
-module.exports=RedirectsHTTP;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/redirects-http.js");
-},{"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/redirects":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const UnusedBytes=require('./byte-efficiency/byte-efficiency-audit.js');
-const i18n=require('../lib/i18n/i18n.js');
-const TraceOfTab=require('../computed/trace-of-tab.js');
-const NetworkRecords=require('../computed/network-records.js');
-const MainResource=require('../computed/main-resource.js');
-const LanternInteractive=require('../computed/metrics/lantern-interactive.js');
-
-const UIStrings={
-
-title:'Avoid multiple page redirects',
-
-description:'Redirects introduce additional delays before the page can be loaded. [Learn more](https://web.dev/redirects).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class Redirects extends Audit{
-
-
-
-static get meta(){
-return{
-id:'redirects',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['URL','devtoolsLogs','traces']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const settings=context.settings;
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-
-const traceOfTab=await TraceOfTab.request(trace,context);
-const networkRecords=await NetworkRecords.request(devtoolsLog,context);
-const mainResource=await MainResource.request({URL:artifacts.URL,devtoolsLog},context);
-
-const metricComputationData={trace,devtoolsLog,traceOfTab,networkRecords,settings};
-const metricResult=await LanternInteractive.request(metricComputationData,context);
-
-
-const nodeTimingsByUrl=new Map();
-for(const[node,timing]of metricResult.pessimisticEstimate.nodeTimings.entries()){
-if(node.type==='network'){
-const networkNode=node;
-nodeTimingsByUrl.set(networkNode.record.url,timing);
-}
-}
-
-
-const redirectRequests=Array.from(mainResource.redirects||[]);
-
-
-redirectRequests.push(mainResource);
-
-let totalWastedMs=0;
-const pageRedirects=[];
-
-
-if(redirectRequests.length>1){
-pageRedirects.push({
-url:`(Initial: ${redirectRequests[0].url})`,
-wastedMs:0});
-
-}
-
-for(let i=1;i<redirectRequests.length;i++){
-const initialRequest=redirectRequests[i-1];
-const redirectedRequest=redirectRequests[i];
-
-const initialTiming=nodeTimingsByUrl.get(initialRequest.url);
-const redirectedTiming=nodeTimingsByUrl.get(redirectedRequest.url);
-if(!initialTiming||!redirectedTiming){
-throw new Error('Could not find redirects in graph');
-}
-
-const wastedMs=redirectedTiming.startTime-initialTiming.startTime;
-totalWastedMs+=wastedMs;
-
-pageRedirects.push({
-url:redirectedRequest.url,
-wastedMs});
-
-}
-
-
-const headings=[
-{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
-{key:'wastedMs',valueType:'timespanMs',label:str_(i18n.UIStrings.columnTimeSpent)}];
-
-const details=Audit.makeOpportunityDetails(headings,pageRedirects,totalWastedMs);
-
-return{
-
-score:redirectRequests.length<=2?1:UnusedBytes.scoreForWastedMs(totalWastedMs),
-numericValue:totalWastedMs,
-displayValue:totalWastedMs?
-str_(i18n.UIStrings.displayValueMsSavings,{wastedMs:totalWastedMs}):
-'',
-extendedInfo:{
-value:{
-wastedMs:totalWastedMs}},
-
-
-details};
-
-}}
-
-
-module.exports=Redirects;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/redirects.js");
-},{"../computed/main-resource.js":11,"../computed/metrics/lantern-interactive.js":23,"../computed/network-records.js":34,"../computed/trace-of-tab.js":39,"../lib/i18n/i18n.js":66,"./audit.js":3,"./byte-efficiency/byte-efficiency-audit.js":4}],"../audits/resource-summary":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const ComputedResourceSummary=require('../computed/resource-summary.js');
-const i18n=require('../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Keep request counts low and transfer sizes small',
-
-description:'To set budgets for the quantity and size of page resources,'+
-' add a budget.json file. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/budgets).',
-
-displayValue:`{requestCount, plural, `+
-`=1 {1 request • {byteCount, number, bytes} KB} `+
-`other {# requests • {byteCount, number, bytes} KB}}`};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class ResourceSummary extends Audit{
-
-
-
-static get meta(){
-return{
-id:'resource-summary',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
-requiredArtifacts:['devtoolsLogs','URL']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const summary=await ComputedResourceSummary.
-request({devtoolsLog,URL:artifacts.URL},context);
-
-
-const headings=[
-{key:'label',itemType:'text',text:str_(i18n.UIStrings.columnResourceType)},
-{key:'requestCount',itemType:'numeric',text:str_(i18n.UIStrings.columnRequests)},
-{key:'size',itemType:'bytes',text:str_(i18n.UIStrings.columnTransferSize)}];
-
-
-
-
-const strMappings={
-'total':str_(i18n.UIStrings.totalResourceType),
-'document':str_(i18n.UIStrings.documentResourceType),
-'script':str_(i18n.UIStrings.scriptResourceType),
-'stylesheet':str_(i18n.UIStrings.stylesheetResourceType),
-'image':str_(i18n.UIStrings.imageResourceType),
-'media':str_(i18n.UIStrings.mediaResourceType),
-'font':str_(i18n.UIStrings.fontResourceType),
-'other':str_(i18n.UIStrings.otherResourceType),
-'third-party':str_(i18n.UIStrings.thirdPartyResourceType)};
-
-
-const types=Object.keys(summary);
-const rows=types.map(type=>{
-return{
-
-
-resourceType:type,
-label:strMappings[type],
-requestCount:summary[type].count,
-size:summary[type].size};
-
-});
-
-const thirdPartyRow=rows.find(r=>r.resourceType==='third-party')||[];
-const otherRows=rows.filter(r=>r.resourceType!=='third-party').
-sort((a,b)=>{
-return b.size-a.size;
-});
-const tableItems=otherRows.concat(thirdPartyRow);
-
-const tableDetails=Audit.makeTableDetails(headings,tableItems);
-
-return{
-details:tableDetails,
-score:1,
-displayValue:str_(UIStrings.displayValue,{
-requestCount:summary.total.count,
-byteCount:summary.total.size})};
-
-
-}}
-
-
-module.exports=ResourceSummary;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/resource-summary.js");
-},{"../computed/resource-summary.js":36,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/screenshot-thumbnails":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const LHError=require('../lib/lh-error.js');
-const jpeg=require('jpeg-js');
-const Speedline=require('../computed/speedline.js');
-const Interactive=require('../computed/metrics/interactive.js');
-
-const NUMBER_OF_THUMBNAILS=10;
-const THUMBNAIL_WIDTH=120;
-
-
-
-class ScreenshotThumbnails extends Audit{
-
-
-
-static get meta(){
-return{
-id:'screenshot-thumbnails',
-scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
-title:'Screenshot Thumbnails',
-description:'This is what the load of your site looked like.',
-requiredArtifacts:['traces','devtoolsLogs']};
-
-}
-
-
-
-
-
-
-
-
-static scaleImageToThumbnail(imageData){
-const scaledWidth=THUMBNAIL_WIDTH;
-const scaleFactor=imageData.width/scaledWidth;
-const scaledHeight=Math.floor(imageData.height/scaleFactor);
-
-const outPixels=new Uint8Array(scaledWidth*scaledHeight*4);
-
-for(let i=0;i<scaledWidth;i++){
-for(let j=0;j<scaledHeight;j++){
-const origX=Math.floor(i*scaleFactor);
-const origY=Math.floor(j*scaleFactor);
-
-const origPos=(origY*imageData.width+origX)*4;
-const outPos=(j*scaledWidth+i)*4;
-
-outPixels[outPos]=imageData.data[origPos];
-outPixels[outPos+1]=imageData.data[origPos+1];
-outPixels[outPos+2]=imageData.data[origPos+2];
-outPixels[outPos+3]=imageData.data[origPos+3];
-}
-}
-
-return{
-width:scaledWidth,
-height:scaledHeight,
-data:outPixels};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-
-const cachedThumbnails=new Map();
-
-const speedline=await Speedline.request(trace,context);
-
-
-let minimumTimelineDuration=context.options.minimumTimelineDuration||3000;
-
-if(context.settings.throttlingMethod!=='simulate'){
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const metricComputationData={trace,devtoolsLog,settings:context.settings};
-const tti=Interactive.request(metricComputationData,context);
-try{
-minimumTimelineDuration=Math.max((await tti).timing,minimumTimelineDuration);
-}catch(_){}
-}
-
-const thumbnails=[];
-const analyzedFrames=speedline.frames.filter(frame=>!frame.isProgressInterpolated());
-const maxFrameTime=
-speedline.complete||
-Math.max(...speedline.frames.map(frame=>frame.getTimeStamp()-speedline.beginning));
-const timelineEnd=Math.max(maxFrameTime,minimumTimelineDuration);
-
-if(!analyzedFrames.length||!Number.isFinite(timelineEnd)){
-throw new LHError(LHError.errors.INVALID_SPEEDLINE);
-}
-
-for(let i=1;i<=NUMBER_OF_THUMBNAILS;i++){
-const targetTimestamp=speedline.beginning+timelineEnd*i/NUMBER_OF_THUMBNAILS;
-
-
-
-let frameForTimestamp=null;
-if(i===NUMBER_OF_THUMBNAILS){
-frameForTimestamp=analyzedFrames[analyzedFrames.length-1];
-}else{
-analyzedFrames.forEach(frame=>{
-if(frame.getTimeStamp()<=targetTimestamp){
-frameForTimestamp=frame;
-}
-});
-}
-
-let base64Data;
-const cachedThumbnail=cachedThumbnails.get(frameForTimestamp);
-if(cachedThumbnail){
-base64Data=cachedThumbnail;
-}else{
-const imageData=frameForTimestamp.getParsedImage();
-const thumbnailImageData=ScreenshotThumbnails.scaleImageToThumbnail(imageData);
-base64Data=jpeg.encode(thumbnailImageData,90).data.toString('base64');
-cachedThumbnails.set(frameForTimestamp,base64Data);
-}
-thumbnails.push({
-timing:Math.round(targetTimestamp-speedline.beginning),
-timestamp:targetTimestamp*1000,
-data:`data:image/jpeg;base64,${base64Data}`});
-
-}
-
-return{
-score:1,
-details:{
-type:'filmstrip',
-scale:timelineEnd,
-items:thumbnails}};
-
-
-}}
-
-
-module.exports=ScreenshotThumbnails;
-
-},{"../computed/metrics/interactive.js":18,"../computed/speedline.js":38,"../lib/lh-error.js":71,"./audit.js":3,"jpeg-js":122}],"../audits/seo/canonical":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('../audit.js');
-const URL=require('../../lib/url-shim.js');
-const MainResource=require('../../computed/main-resource.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Document has a valid `rel=canonical`',
-
-failureTitle:'Document does not have a valid `rel=canonical`',
-
-description:'Canonical links suggest which URL to show in search results. '+
-'[Learn more](https://web.dev/canonical).',
-
-
-
-
-explanationConflict:'Multiple conflicting URLs ({urlList})',
-
-
-
-
-explanationInvalid:'Invalid URL ({url})',
-
-
-
-
-explanationRelative:'Relative URL ({url})',
-
-
-
-
-explanationPointsElsewhere:'Points to another `hreflang` location ({url})',
-
-
-
-
-explanationDifferentDomain:'Points to a different domain ({url})',
-
-explanationRoot:'Points to the domain\'s root URL (the homepage), '+
-'instead of an equivalent page of content'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-
-
-
-
-class Canonical extends Audit{
-
-
-
-static get meta(){
-return{
-id:'canonical',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['LinkElements','URL','devtoolsLogs']};
-
-}
-
-
-
-
-
-static collectCanonicalURLs(linkElements){
-
-const uniqueCanonicalURLs=new Set();
-
-const hreflangURLs=new Set();
-
-
-let invalidCanonicalLink;
-
-let relativeCanonicallink;
-for(const link of linkElements){
-
-
-if(link.source==='body')continue;
-
-if(link.rel==='canonical'){
-
-if(!link.hrefRaw)continue;
-
-
-if(!link.href)invalidCanonicalLink=link;else
-
-if(!URL.isValid(link.hrefRaw))relativeCanonicallink=link;else
-
-uniqueCanonicalURLs.add(link.href);
-}else if(link.rel==='alternate'){
-if(link.href&&link.hreflang)hreflangURLs.add(link.href);
-}
-}
-
-return{uniqueCanonicalURLs,hreflangURLs,invalidCanonicalLink,relativeCanonicallink};
-}
-
-
-
-
-
-static findInvalidCanonicalURLReason(canonicalURLData){
-const{uniqueCanonicalURLs,invalidCanonicalLink,relativeCanonicallink}=canonicalURLData;
-
-
-if(invalidCanonicalLink){
-return{
-score:0,
-explanation:str_(UIStrings.explanationInvalid,{url:invalidCanonicalLink.hrefRaw})};
-
-}
-
-
-if(relativeCanonicallink){
-return{
-score:0,
-explanation:str_(UIStrings.explanationRelative,{url:relativeCanonicallink.hrefRaw})};
-
-}
-
-
-const canonicalURLs=Array.from(uniqueCanonicalURLs);
-
-
-if(canonicalURLs.length===0){
-return{
-score:1,
-notApplicable:true};
-
-}
-
-
-if(canonicalURLs.length>1){
-return{
-score:0,
-explanation:str_(UIStrings.explanationConflict,{urlList:canonicalURLs.join(', ')})};
-
-}
-}
-
-
-
-
-
-
-
-static findCommonCanonicalURLMistakes(canonicalURLData,canonicalURL,baseURL){
-const{hreflangURLs}=canonicalURLData;
-
-
-if(
-hreflangURLs.has(baseURL.href)&&
-hreflangURLs.has(canonicalURL.href)&&
-baseURL.href!==canonicalURL.href)
-{
-return{
-score:0,
-explanation:str_(UIStrings.explanationPointsElsewhere,{url:baseURL.href})};
-
-}
-
-
-
-if(!URL.rootDomainsMatch(canonicalURL,baseURL)){
-return{
-score:0,
-explanation:str_(UIStrings.explanationDifferentDomain,{url:canonicalURL.href})};
-
-}
-
-
-if(
-canonicalURL.origin===baseURL.origin&&
-canonicalURL.pathname==='/'&&
-baseURL.pathname!=='/')
-{
-return{
-score:0,
-explanation:str_(UIStrings.explanationRoot)};
-
-}
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-
-const mainResource=await MainResource.request({devtoolsLog,URL:artifacts.URL},context);
-const baseURL=new URL(mainResource.url);
-const canonicalURLData=Canonical.collectCanonicalURLs(artifacts.LinkElements);
-
-
-const invalidURLAuditProduct=Canonical.findInvalidCanonicalURLReason(canonicalURLData);
-if(invalidURLAuditProduct)return invalidURLAuditProduct;
-
-
-const canonicalURL=new URL([...canonicalURLData.uniqueCanonicalURLs][0]);
-const mistakeAuditProduct=Canonical.findCommonCanonicalURLMistakes(
-canonicalURLData,
-canonicalURL,
-baseURL);
-
-
-if(mistakeAuditProduct)return mistakeAuditProduct;
-
-return{
-score:1};
-
-}}
-
-
-module.exports=Canonical;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/seo/canonical.js");
-},{"../../computed/main-resource.js":11,"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/seo/font-size":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-const URL=require('../../lib/url-shim.js');
-const i18n=require('../../lib/i18n/i18n.js');
-const Audit=require('../audit.js');
-const ComputedViewportMeta=require('../../computed/viewport-meta.js');
-const MINIMAL_PERCENTAGE_OF_LEGIBLE_TEXT=60;
-
-const UIStrings={
-
-title:'Document uses legible font sizes',
-
-failureTitle:'Document doesn\'t use legible font sizes',
-
-description:'Font sizes less than 12px are too small to be legible and require mobile visitors to “pinch to zoom” in order to read. Strive to have >60% of page text ≥12px. [Learn more](https://web.dev/font-size).',
-
-displayValue:'{decimalProportion, number, extendedPercent} legible text',
-
-explanationViewport:'Text is illegible because there\'s no viewport meta tag optimized '+
-'for mobile screens.',
-
-explanationWithDisclaimer:'{decimalProportion, number, extendedPercent} of text is too '+
-'small (based on {decimalProportionVisited, number, extendedPercent} sample).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-function getUniqueFailingRules(fontSizeArtifact){
-
-const failingRules=new Map();
-
-fontSizeArtifact.forEach(({cssRule,fontSize,textLength,node})=>{
-const artifactId=getFontArtifactId(cssRule,node);
-const failingRule=failingRules.get(artifactId);
-
-if(!failingRule){
-failingRules.set(artifactId,{
-node,
-cssRule,
-fontSize,
-textLength});
-
-}else{
-failingRule.textLength+=textLength;
-}
-});
-
-return[...failingRules.values()];
-}
-
-
-
-
-
-function getAttributeMap(attributes=[]){
-const map=new Map();
-
-for(let i=0;i<attributes.length;i+=2){
-const name=attributes[i].toLowerCase();
-const value=attributes[i+1].trim();
-
-if(value){
-map.set(name,value);
-}
-}
-
-return map;
-}
-
-
-
-
-
-
-function getSelector(node){
-const attributeMap=getAttributeMap(node.attributes);
-
-if(attributeMap.has('id')){
-return'#'+attributeMap.get('id');
-}else{
-const attrClass=attributeMap.get('class');
-if(attrClass){
-return'.'+attrClass.split(/\s+/).join('.');
-}
-}
-
-return node.localName.toLowerCase();
-}
-
-
-
-
-
-function nodeToTableNode(node){
-const attributes=node.attributes||[];
-const attributesString=attributes.map((value,idx)=>
-idx%2===0?` ${value}`:`="${value}"`).
-join('');
-
-return{
-type:'node',
-selector:node.parentNode?getSelector(node.parentNode):'',
-snippet:`<${node.localName}${attributesString}>`};
-
-}
-
-
-
-
-
-
-
-function findStyleRuleSource(baseURL,styleDeclaration,node){
-if(
-!styleDeclaration||
-styleDeclaration.type==='Attributes'||
-styleDeclaration.type==='Inline')
-{
-return{
-selector:nodeToTableNode(node),
-source:baseURL};
-
-}
-
-if(styleDeclaration.parentRule&&
-styleDeclaration.parentRule.origin==='user-agent'){
-return{
-selector:styleDeclaration.parentRule.selectors.map(item=>item.text).join(', '),
-source:'User Agent Stylesheet'};
-
-}
-
-if(styleDeclaration.type==='Regular'&&styleDeclaration.parentRule){
-const rule=styleDeclaration.parentRule;
-const stylesheet=styleDeclaration.stylesheet;
-
-if(stylesheet){
-let source;
-const selector=rule.selectors.map(item=>item.text).join(', ');
-
-if(stylesheet.sourceURL){
-const url=new URL(stylesheet.sourceURL,baseURL);
-const range=styleDeclaration.range;
-source=`${url.href}`;
-
-
-if(range){
-let line=range.startLine+1;
-let column=range.startColumn;
-
-
-
-
-
-
-
-const addHtmlLocationOffset=stylesheet.isInline&&!stylesheet.hasSourceURL;
-if(addHtmlLocationOffset){
-line+=stylesheet.startLine;
-
-if(range.startLine===0){
-column+=stylesheet.startColumn;
-}
-}
-
-source+=`:${line}:${column}`;
-}
-}else{
-
-source='dynamic';
-}
-
-return{
-selector,
-source};
-
-}
-}
-
-
-
-return{
-selector:'',
-source:'Unknown'};
-
-}
-
-
-
-
-
-
-function getFontArtifactId(styleDeclaration,node){
-if(styleDeclaration&&styleDeclaration.type==='Regular'){
-const startLine=styleDeclaration.range?styleDeclaration.range.startLine:0;
-const startColumn=styleDeclaration.range?styleDeclaration.range.startColumn:0;
-return`${styleDeclaration.styleSheetId}@${startLine}:${startColumn}`;
-}else{
-return`node_${node.nodeId}`;
-}
-}
-
-class FontSize extends Audit{
-
-
-
-static get meta(){
-return{
-id:'font-size',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['FontSize','URL','MetaElements','TestedAsMobileDevice']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-if(!artifacts.TestedAsMobileDevice){
-
-return{
-score:1,
-notApplicable:true};
-
-}
-
-const viewportMeta=await ComputedViewportMeta.request(artifacts.MetaElements,context);
-if(!viewportMeta.isMobileOptimized){
-return{
-score:0,
-explanation:str_(UIStrings.explanationViewport)};
-
-}
-
-const{
-analyzedFailingNodesData,
-analyzedFailingTextLength,
-failingTextLength,
-visitedTextLength,
-totalTextLength}=
-artifacts.FontSize;
-
-if(totalTextLength===0){
-return{
-score:1};
-
-}
-
-const failingRules=getUniqueFailingRules(analyzedFailingNodesData);
-const percentageOfPassingText=
-(visitedTextLength-failingTextLength)/visitedTextLength*100;
-const pageUrl=artifacts.URL.finalUrl;
-
-
-const headings=[
-{key:'source',itemType:'url',text:'Source'},
-{key:'selector',itemType:'code',text:'Selector'},
-{key:'coverage',itemType:'text',text:'% of Page Text'},
-{key:'fontSize',itemType:'text',text:'Font Size'}];
-
-
-const tableData=failingRules.sort((a,b)=>b.textLength-a.textLength).
-map(({cssRule,textLength,fontSize,node})=>{
-const percentageOfAffectedText=textLength/visitedTextLength*100;
-const origin=findStyleRuleSource(pageUrl,cssRule,node);
-
-return{
-source:origin.source,
-selector:origin.selector,
-coverage:`${percentageOfAffectedText.toFixed(2)}%`,
-fontSize:`${fontSize}px`};
-
-});
-
-
-if(analyzedFailingTextLength<failingTextLength){
-const percentageOfUnanalyzedFailingText=
-(failingTextLength-analyzedFailingTextLength)/visitedTextLength*100;
-
-tableData.push({
-source:'Add\'l illegible text',
-selector:'',
-coverage:`${percentageOfUnanalyzedFailingText.toFixed(2)}%`,
-fontSize:'< 12px'});
-
-}
-
-if(percentageOfPassingText>0){
-tableData.push({
-source:'Legible text',
-selector:'',
-coverage:`${percentageOfPassingText.toFixed(2)}%`,
-fontSize:'≥ 12px'});
-
-}
-
-const decimalProportion=percentageOfPassingText/100;
-const displayValue=str_(UIStrings.displayValue,{decimalProportion});
-const details=Audit.makeTableDetails(headings,tableData);
-const passed=percentageOfPassingText>=MINIMAL_PERCENTAGE_OF_LEGIBLE_TEXT;
-
-let explanation;
-if(!passed){
-const percentageOfFailingText=(100-percentageOfPassingText)/100;
-
-
-if(visitedTextLength<totalTextLength){
-const percentageOfVisitedText=visitedTextLength/totalTextLength;
-explanation=str_(UIStrings.explanationWithDisclaimer,
-{
-decimalProportion:percentageOfFailingText,
-decimalProportionVisited:percentageOfVisitedText});
-
-}
-}
-
-return{
-score:Number(passed),
-details,
-displayValue,
-explanation};
-
-}}
-
-
-module.exports=FontSize;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/seo/font-size.js");
-},{"../../computed/viewport-meta.js":41,"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/seo/hreflang":[function(require,module,exports){
-(function(global,__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('../audit.js');
-const VALID_LANGS=importValidLangs();
-const NO_LANGUAGE='x-default';
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Document has a valid `hreflang`',
-
-failureTitle:'Document doesn\'t have a valid `hreflang`',
-
-description:'hreflang links tell search engines what version of a page they should '+
-'list in search results for a given language or region. [Learn more]'+
-'(https://web.dev/hreflang).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-
-
-function importValidLangs(){
-
-const axeCache=global.axe;
-
-global.axe={utils:{}};
-
-require('axe-core/lib/core/utils/valid-langs.js');
-
-const validLangs=global.axe.utils.validLangs();
-
-global.axe=axeCache;
-
-return validLangs;
-}
-
-
-
-
-
-function isValidHreflang(hreflang){
-if(hreflang.toLowerCase()===NO_LANGUAGE){
-return true;
-}
-
-
-const[lang]=hreflang.split('-');
-return VALID_LANGS.includes(lang.toLowerCase());
-}
-
-class Hreflang extends Audit{
-
-
-
-static get meta(){
-return{
-id:'hreflang',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['LinkElements','URL']};
-
-}
-
-
-
-
-
-static audit(artifacts){
-
-const invalidHreflangs=[];
-
-for(const link of artifacts.LinkElements){
-if(link.rel!=='alternate')continue;
-if(!link.hreflang||isValidHreflang(link.hreflang))continue;
-if(link.source==='body')continue;
-
-if(link.source==='head'){
-invalidHreflangs.push({
-source:{
-type:'node',
-snippet:`<link rel="alternate" hreflang="${link.hreflang}" href="${link.href}" />`}});
-
-
-}else if(link.source==='headers'){
-invalidHreflangs.push({
-source:`Link: <${link.href}>; rel="alternate"; hreflang="${link.hreflang}"`});
-
-}
-}
-
-
-const headings=[
-{key:'source',itemType:'code',text:'Source'}];
-
-const details=Audit.makeTableDetails(headings,invalidHreflangs);
-
-return{
-score:Number(invalidHreflangs.length===0),
-details};
-
-}}
-
-
-module.exports=Hreflang;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{},"/lighthouse-core/audits/seo/hreflang.js");
-},{"../../lib/i18n/i18n.js":66,"../audit.js":3,"axe-core/lib/core/utils/valid-langs.js":96}],"../audits/seo/http-status-code":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('../audit.js');
-const MainResource=require('../../computed/main-resource.js');
-const HTTP_UNSUCCESSFUL_CODE_LOW=400;
-const HTTP_UNSUCCESSFUL_CODE_HIGH=599;
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Page has successful HTTP status code',
-
-failureTitle:'Page has unsuccessful HTTP status code',
-
-description:'Pages with unsuccessful HTTP status codes may not be indexed properly. '+
-'[Learn more](https://web.dev/http-status-code).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class HTTPStatusCode extends Audit{
-
-
-
-static get meta(){
-return{
-id:'http-status-code',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['devtoolsLogs','URL']};
-
-}
-
-
-
-
-
-
-static audit(artifacts,context){
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const URL=artifacts.URL;
-
-return MainResource.request({devtoolsLog,URL},context).
-then(mainResource=>{
-const statusCode=mainResource.statusCode;
-
-if(statusCode>=HTTP_UNSUCCESSFUL_CODE_LOW&&
-statusCode<=HTTP_UNSUCCESSFUL_CODE_HIGH){
-return{
-score:0,
-displayValue:`${statusCode}`};
-
-}
-
-return{
-score:1};
-
-});
-}}
-
-
-module.exports=HTTPStatusCode;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/seo/http-status-code.js");
-},{"../../computed/main-resource.js":11,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/seo/is-crawlable":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('../audit.js');
-const robotsParser=require('robots-parser');
-const URL=require('../../lib/url-shim.js');
-const MainResource=require('../../computed/main-resource.js');
-const BLOCKLIST=new Set([
-'noindex',
-'none']);
-
-const ROBOTS_HEADER='x-robots-tag';
-const UNAVAILABLE_AFTER='unavailable_after';
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Page isn’t blocked from indexing',
-
-failureTitle:'Page is blocked from indexing',
-
-description:'Search engines are unable to include your pages in search results '+
-'if they don\'t have permission to crawl them. [Learn more](https://web.dev/is-crawable).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-
-function isUnavailable(directive){
-const parts=directive.split(':');
-
-if(parts.length<=1||parts[0]!==UNAVAILABLE_AFTER){
-return false;
-}
-
-const date=Date.parse(parts.slice(1).join(':'));
-
-return!isNaN(date)&&date<Date.now();
-}
-
-
-
-
-
-
-function hasBlockingDirective(directives){
-return directives.split(',').
-map(d=>d.toLowerCase().trim()).
-some(d=>BLOCKLIST.has(d)||isUnavailable(d));
-}
-
-
-
-
-
-
-function hasUserAgent(directives){
-const parts=directives.match(/^([^,:]+):/);
-
-
-
-return!!parts&&parts[1].toLowerCase()!==UNAVAILABLE_AFTER;
-}
-
-class IsCrawlable extends Audit{
-
-
-
-static get meta(){
-return{
-id:'is-crawlable',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['MetaElements','RobotsTxt','URL','devtoolsLogs']};
-
-}
-
-
-
-
-
-
-static audit(artifacts,context){
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const metaRobots=artifacts.MetaElements.find(meta=>meta.name==='robots');
-
-return MainResource.request({devtoolsLog,URL:artifacts.URL},context).
-then(mainResource=>{
-
-const blockingDirectives=[];
-
-if(metaRobots){
-const metaRobotsContent=metaRobots.content||'';
-const isBlocking=hasBlockingDirective(metaRobotsContent);
-
-if(isBlocking){
-blockingDirectives.push({
-source:{
-type:'node',
-snippet:`<meta name="robots" content="${metaRobotsContent}" />`}});
-
-
-}
-}
-
-mainResource.responseHeaders&&mainResource.responseHeaders.
-filter(h=>h.name.toLowerCase()===ROBOTS_HEADER&&!hasUserAgent(h.value)&&
-hasBlockingDirective(h.value)).
-forEach(h=>blockingDirectives.push({source:`${h.name}: ${h.value}`}));
-
-if(artifacts.RobotsTxt.content){
-const robotsFileUrl=new URL('/robots.txt',mainResource.url);
-const robotsTxt=robotsParser(robotsFileUrl.href,artifacts.RobotsTxt.content);
-
-if(!robotsTxt.isAllowed(mainResource.url)){
-blockingDirectives.push({
-source:{
-type:'url',
-value:robotsFileUrl.href}});
-
-
-}
-}
-
-
-const headings=[
-{key:'source',itemType:'code',text:'Blocking Directive Source'}];
-
-const details=Audit.makeTableDetails(headings,blockingDirectives);
-
-return{
-score:Number(blockingDirectives.length===0),
-details};
-
-});
-}}
-
-
-module.exports=IsCrawlable;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/seo/is-crawlable.js");
-},{"../../computed/main-resource.js":11,"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3,"robots-parser":177}],"../audits/seo/link-text":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('../audit.js');
-const URL=require('../../lib/url-shim.js');
-const BLOCKLIST=new Set([
-
-'click here',
-'click this',
-'go',
-'here',
-'this',
-'start',
-'right here',
-'more',
-'learn more',
-
-'ここをクリック',
-'こちらをクリック',
-'リンク',
-'続きを読む',
-'続く',
-'全文表示',
-
-'click aquí',
-'click aqui',
-'clicka aquí',
-'clicka aqui',
-'pincha aquí',
-'pincha aqui',
-'aquí',
-'aqui',
-'más',
-'mas',
-'más información',
-'más informacion',
-'mas información',
-'mas informacion',
-'este',
-'enlace',
-'este enlace',
-'empezar',
-
-'clique aqui',
-'inicio',
-'início',
-'ir',
-'mais informação',
-'mais informações',
-'mais',
-'veja mais',
-
-'여기',
-'여기를 클릭',
-'클릭',
-'링크',
-'자세히',
-'자세히 보기',
-'계속',
-'이동',
-'전체 보기']);
-
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Links have descriptive text',
-
-failureTitle:'Links do not have descriptive text',
-
-description:'Descriptive link text helps search engines understand your content. '+
-'[Learn more](https://web.dev/link-text).',
-
-displayValue:`{itemCount, plural,
-    =1 {1 link found}
-    other {# links found}
-    }`};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class LinkText extends Audit{
-
-
-
-static get meta(){
-return{
-id:'link-text',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['URL','AnchorElements']};
-
-}
-
-
-
-
-
-static audit(artifacts){
-const failingLinks=artifacts.AnchorElements.
-filter(link=>link.href&&!link.rel.includes('nofollow')).
-filter(link=>{
-const href=link.href.toLowerCase();
-if(
-href.startsWith('javascript:')||
-href.startsWith('mailto:')||
-URL.equalWithExcludedFragments(link.href,artifacts.URL.finalUrl))
-{
-return false;
-}
-
-return BLOCKLIST.has(link.text.trim().toLowerCase());
-}).
-map(link=>{
-return{
-href:link.href,
-text:link.text.trim()};
-
-});
-
-
-const headings=[
-{key:'href',itemType:'url',text:'Link destination'},
-{key:'text',itemType:'text',text:'Link Text'}];
-
-
-const details=Audit.makeTableDetails(headings,failingLinks,{});
-let displayValue;
-
-if(failingLinks.length){
-displayValue=str_(UIStrings.displayValue,{itemCount:failingLinks.length});
-}
-
-return{
-score:Number(failingLinks.length===0),
-details,
-displayValue};
-
-}}
-
-
-module.exports=LinkText;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/seo/link-text.js");
-},{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/seo/manual/structured-data":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const ManualAudit=require('../../manual/manual-audit.js');
-const i18n=require('../../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-description:'Run the [Structured Data Testing Tool](https://search.google.com/structured-data/testing-tool/) and the [Structured Data Linter](http://linter.structured-data.org/) to validate structured data. [Learn more](https://web.dev/structured-data).',
-
-title:'Structured data is valid'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-class StructuredData extends ManualAudit{
-
-
-
-static get meta(){
-return Object.assign({
-id:'structured-data',
-description:str_(UIStrings.description),
-title:str_(UIStrings.title)},
-super.partialMeta);
-}}
-
-
-module.exports=StructuredData;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/seo/manual/structured-data.js");
-},{"../../../lib/i18n/i18n.js":66,"../../manual/manual-audit.js":5}],"../audits/seo/meta-description":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('../audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Document has a meta description',
-
-failureTitle:'Document does not have a meta description',
-
-description:'Meta descriptions may be included in search results to concisely summarize '+
-'page content. '+
-'[Learn more](https://web.dev/meta-description).',
-
-explanation:'Description text is empty.'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class Description extends Audit{
-
-
-
-static get meta(){
-return{
-id:'meta-description',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['MetaElements']};
-
-}
-
-
-
-
-
-static audit(artifacts){
-const metaDescription=artifacts.MetaElements.find(meta=>meta.name==='description');
-if(!metaDescription){
-return{
-score:0};
-
-}
-
-const description=metaDescription.content||'';
-if(description.trim().length===0){
-return{
-score:0,
-explanation:str_(UIStrings.explanation)};
-
-}
-
-return{
-score:1};
-
-}}
-
-
-module.exports=Description;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/seo/meta-description.js");
-},{"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/seo/plugins":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('../audit.js');
-const URL=require('../../lib/url-shim.js');
-
-const JAVA_APPLET_TYPE='application/x-java-applet';
-const JAVA_BEAN_TYPE='application/x-java-bean';
-const TYPE_BLOCKLIST=new Set([
-'application/x-shockwave-flash',
-
-JAVA_APPLET_TYPE,
-JAVA_BEAN_TYPE,
-
-'application/x-silverlight',
-'application/x-silverlight-2']);
-
-const FILE_EXTENSION_BLOCKLIST=new Set([
-'swf',
-'flv',
-'class',
-'xap']);
-
-const SOURCE_PARAMS=new Set([
-'code',
-'movie',
-'source',
-'src']);
-
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Document avoids plugins',
-
-failureTitle:'Document uses plugins',
-
-description:'Search engines can\'t index plugin content, and '+
-'many devices restrict plugins or don\'t support them. '+
-'[Learn more](https://web.dev/plugins).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-
-function isPluginType(type){
-type=type.trim().toLowerCase();
-
-return TYPE_BLOCKLIST.has(type)||
-type.startsWith(JAVA_APPLET_TYPE)||
-type.startsWith(JAVA_BEAN_TYPE);
-}
-
-
-
-
-
-
-function isPluginURL(url){
-try{
-
-const filePath=new URL(url,'http://example.com').pathname;
-const parts=filePath.split('.');
-
-if(parts.length<2){
-return false;
-}
-const part=parts.pop();
-return FILE_EXTENSION_BLOCKLIST.has(part.trim().toLowerCase());
-}catch(e){
-return false;
-}
-}
-
-class Plugins extends Audit{
-
-
-
-static get meta(){
-return{
-id:'plugins',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['EmbeddedContent']};
-
-}
-
-
-
-
-
-static audit(artifacts){
-const plugins=artifacts.EmbeddedContent.
-filter(item=>{
-if(item.tagName==='APPLET'){
-return true;
-}
-
-if(
-(item.tagName==='EMBED'||item.tagName==='OBJECT')&&
-item.type&&
-isPluginType(item.type))
-{
-return true;
-}
-
-const embedSrc=item.src||item.code;
-if(item.tagName==='EMBED'&&embedSrc&&isPluginURL(embedSrc)){
-return true;
-}
-
-if(item.tagName==='OBJECT'&&item.data&&isPluginURL(item.data)){
-return true;
-}
-
-const failingParams=item.params.filter(param=>
-SOURCE_PARAMS.has(param.name.trim().toLowerCase())&&isPluginURL(param.value));
-
-
-return failingParams.length>0;
-}).
-map(plugin=>{
-const tagName=plugin.tagName.toLowerCase();
-
-const attributeKeys=['src','data','code','type'];
-const attributes=attributeKeys.
-reduce((result,attr)=>{
-if(plugin[attr]!==null){
-result+=` ${attr}="${plugin[attr]}"`;
-}
-return result;
-},'');
-const params=plugin.params.
-filter(param=>SOURCE_PARAMS.has(param.name.trim().toLowerCase())).
-map(param=>`<param ${param.name}="${param.value}" />`).
-join('');
-
-return{
-source:{
-type:'node',
-snippet:`<${tagName}${attributes}>${params}</${tagName}>`}};
-
-
-});
-
-
-const headings=[
-{key:'source',itemType:'code',text:'Element source'}];
-
-
-const details=Audit.makeTableDetails(headings,plugins);
-
-return{
-score:Number(plugins.length===0),
-details};
-
-}}
-
-
-module.exports=Plugins;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/seo/plugins.js");
-},{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/seo/robots-txt":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-
-
-const Audit=require('../audit.js');
-const URL=require('../../lib/url-shim.js');
-
-const HTTP_CLIENT_ERROR_CODE_LOW=400;
-const HTTP_SERVER_ERROR_CODE_LOW=500;
-
-const DIRECTIVE_SITEMAP='sitemap';
-const DIRECTIVE_USER_AGENT='user-agent';
-const DIRECTIVE_ALLOW='allow';
-const DIRECTIVE_DISALLOW='disallow';
-const DIRECTIVES_GROUP_MEMBERS=new Set([DIRECTIVE_ALLOW,DIRECTIVE_DISALLOW]);
-const DIRECTIVE_SAFELIST=new Set([
-DIRECTIVE_USER_AGENT,DIRECTIVE_DISALLOW,
-DIRECTIVE_ALLOW,DIRECTIVE_SITEMAP,
-'crawl-delay',
-'clean-param','host',
-'request-rate','visit-time','noindex']);
-
-const SITEMAP_VALID_PROTOCOLS=new Set(['https:','http:','ftp:']);
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'robots.txt is valid',
-
-failureTitle:'robots.txt is not valid',
-
-description:'If your robots.txt file is malformed, crawlers may not be able to understand '+
-'how you want your website to be crawled or indexed. [Learn more](https://web.dev/robots-txt).',
-
-
-
-
-displayValueHttpBadCode:'Request for robots.txt returned HTTP status: {statusCode}',
-
-displayValueValidationError:`{itemCount, plural,
-    =1 {1 error found}
-    other {# errors found}
-    }`,
-
-explanation:'Lighthouse was unable to download a robots.txt file'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-
-function verifyDirective(directiveName,directiveValue){
-if(!DIRECTIVE_SAFELIST.has(directiveName)){
-throw new Error('Unknown directive');
-}
-
-if(directiveName===DIRECTIVE_SITEMAP){
-let sitemapUrl;
-
-try{
-sitemapUrl=new URL(directiveValue);
-}catch(e){
-throw new Error('Invalid sitemap URL');
-}
-
-if(!SITEMAP_VALID_PROTOCOLS.has(sitemapUrl.protocol)){
-throw new Error('Invalid sitemap URL protocol');
-}
-}
-
-if(directiveName===DIRECTIVE_USER_AGENT&&!directiveValue){
-throw new Error('No user-agent specified');
-}
-
-if(directiveName===DIRECTIVE_ALLOW||directiveName===DIRECTIVE_DISALLOW){
-if(directiveValue!==''&&directiveValue[0]!=='/'&&directiveValue[0]!=='*'){
-throw new Error('Pattern should either be empty, start with "/" or "*"');
-}
-
-const dollarIndex=directiveValue.indexOf('$');
-
-if(dollarIndex!==-1&&dollarIndex!==directiveValue.length-1){
-throw new Error('"$" should only be used at the end of the pattern');
-}
-}
-}
-
-
-
-
-
-
-function parseLine(line){
-const hashIndex=line.indexOf('#');
-
-if(hashIndex!==-1){
-line=line.substr(0,hashIndex);
-}
-
-line=line.trim();
-
-if(line.length===0){
-return null;
-}
-
-const colonIndex=line.indexOf(':');
-
-if(colonIndex===-1){
-throw new Error('Syntax not understood');
-}
-
-const directiveName=line.slice(0,colonIndex).trim().toLowerCase();
-const directiveValue=line.slice(colonIndex+1).trim();
-
-verifyDirective(directiveName,directiveValue);
-
-return{
-directive:directiveName,
-value:directiveValue};
-
-}
-
-
-
-
-
-function validateRobots(content){
-
-
-
-const errors=[];
-let inGroup=false;
-
-content.
-split(/\r\n|\r|\n/).
-forEach((line,index)=>{
-let parsedLine;
-
-try{
-parsedLine=parseLine(line);
-}catch(e){
-errors.push({
-index:(index+1).toString(),
-line:line,
-message:e.message.toString()});
-
-}
-
-if(!parsedLine){
-return;
-}
-
-
-
-if(parsedLine.directive===DIRECTIVE_USER_AGENT){
-inGroup=true;
-}else if(!inGroup&&DIRECTIVES_GROUP_MEMBERS.has(parsedLine.directive)){
-errors.push({
-index:(index+1).toString(),
-line:line,
-message:'No user-agent specified'});
-
-}
-});
-
-return errors;
-}
-
-class RobotsTxt extends Audit{
-
-
-
-static get meta(){
-return{
-id:'robots-txt',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['RobotsTxt']};
-
-}
-
-
-
-
-
-static audit(artifacts){
-const{
-status,
-content}=
-artifacts.RobotsTxt;
-
-if(!status){
-return{
-score:0,
-explanation:str_(UIStrings.explanation)};
-
-}
-
-if(status>=HTTP_SERVER_ERROR_CODE_LOW){
-return{
-score:0,
-displayValue:str_(UIStrings.displayValueHttpBadCode,{statusCode:status})};
-
-}else if(status>=HTTP_CLIENT_ERROR_CODE_LOW||content===''){
-return{
-score:1,
-notApplicable:true};
-
-}
-
-
-if(content===null){
-throw new Error(`Status ${status} was valid, but content was null`);
-}
-
-const validationErrors=validateRobots(content);
-
-
-const headings=[
-{key:'index',itemType:'text',text:'Line #'},
-{key:'line',itemType:'code',text:'Content'},
-{key:'message',itemType:'code',text:'Error'}];
-
-
-const details=Audit.makeTableDetails(headings,validationErrors,{});
-let displayValue;
-
-if(validationErrors.length){
-displayValue=
-str_(UIStrings.displayValueValidationError,{itemCount:validationErrors.length});
-}
-
-return{
-score:Number(validationErrors.length===0),
-details,
-displayValue};
-
-}}
-
-
-module.exports=RobotsTxt;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/seo/robots-txt.js");
-},{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/seo/tap-targets":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-const Audit=require('../audit.js');
-const ComputedViewportMeta=require('../../computed/viewport-meta.js');
-const{
-rectsTouchOrOverlap,
-getRectOverlapArea,
-getRectAtCenter,
-allRectsContainedWithinEachOther,
-getLargestRect,
-getBoundingRectWithPadding}=
-require('../../lib/rect-helpers.js');
-const{getTappableRectsFromClientRects}=require('../../lib/tappable-rects.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Tap targets are sized appropriately',
-
-failureTitle:'Tap targets are not sized appropriately',
-
-description:'Interactive elements like buttons and links should be large enough (48x48px), and have enough space around them, to be easy enough to tap without overlapping onto other elements. [Learn more](https://web.dev/tap-targets).',
-
-tapTargetHeader:'Tap Target',
-
-overlappingTargetHeader:'Overlapping Target',
-
-
-explanationViewportMetaNotOptimized:'Tap targets are too small because there\'s no viewport meta tag optimized for mobile screens',
-
-displayValue:'{decimalProportion, number, percent} appropriately sized tap targets'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-const FINGER_SIZE_PX=48;
-
-
-const MAX_ACCEPTABLE_OVERLAP_SCORE_RATIO=0.25;
-
-
-
-
-
-
-
-function getBoundedTapTargets(targets){
-return targets.map(tapTarget=>{
-return{
-tapTarget,
-paddedBoundsRect:getBoundingRectWithPadding(tapTarget.clientRects,FINGER_SIZE_PX)};
-
-});
-}
-
-
-
-
-function clientRectBelowMinimumSize(cr){
-return cr.width<FINGER_SIZE_PX||cr.height<FINGER_SIZE_PX;
-}
-
-
-
-
-
-
-function getTooSmallTargets(targets){
-return targets.filter(target=>{
-return target.tapTarget.clientRects.every(clientRectBelowMinimumSize);
-});
-}
-
-
-
-
-
-
-function getAllOverlapFailures(tooSmallTargets,allTargets){
-
-const failures=[];
-
-tooSmallTargets.forEach(target=>{
-
-const tappableRects=getTappableRectsFromClientRects(target.tapTarget.clientRects);
-
-for(const maybeOverlappingTarget of allTargets){
-if(maybeOverlappingTarget===target){
-
-continue;
-}
-
-if(!rectsTouchOrOverlap(target.paddedBoundsRect,maybeOverlappingTarget.paddedBoundsRect)){
-
-continue;
-}
-
-if(target.tapTarget.href===maybeOverlappingTarget.tapTarget.href){
-const isHttpOrHttpsLink=/https?:\/\//.test(target.tapTarget.href);
-if(isHttpOrHttpsLink){
-
-continue;
-}
-}
-
-const maybeOverlappingRects=maybeOverlappingTarget.tapTarget.clientRects;
-if(allRectsContainedWithinEachOther(tappableRects,maybeOverlappingRects)){
-
-
-
-
-continue;
-}
-
-const rectFailure=getOverlapFailureForTargetPair(tappableRects,maybeOverlappingRects);
-if(rectFailure){
-failures.push({
-...rectFailure,
-tapTarget:target.tapTarget,
-overlappingTarget:maybeOverlappingTarget.tapTarget});
-
-}
-}
-});
-
-return failures;
-}
-
-
-
-
-
-
-function getOverlapFailureForTargetPair(tappableRects,maybeOverlappingRects){
-
-let greatestFailure=null;
-
-for(const targetCR of tappableRects){
-const fingerRect=getRectAtCenter(targetCR,FINGER_SIZE_PX);
-
-
-const tapTargetScore=getRectOverlapArea(fingerRect,targetCR);
-
-for(const maybeOverlappingCR of maybeOverlappingRects){
-const overlappingTargetScore=getRectOverlapArea(fingerRect,maybeOverlappingCR);
-
-const overlapScoreRatio=overlappingTargetScore/tapTargetScore;
-if(overlapScoreRatio<MAX_ACCEPTABLE_OVERLAP_SCORE_RATIO){
-
-
-continue;
-}
-
-
-if(!greatestFailure||overlapScoreRatio>greatestFailure.overlapScoreRatio){
-greatestFailure={
-overlapScoreRatio,
-tapTargetScore,
-overlappingTargetScore};
-
-}
-}
-}
-return greatestFailure;
-}
-
-
-
-
-
-
-function mergeSymmetricFailures(overlapFailures){
-
-const failuresAfterMerging=[];
-
-overlapFailures.forEach((failure,overlapFailureIndex)=>{
-const symmetricFailure=overlapFailures.find(f=>
-f.tapTarget===failure.overlappingTarget&&
-f.overlappingTarget===failure.tapTarget);
-
-
-if(!symmetricFailure){
-failuresAfterMerging.push(failure);
-return;
-}
-
-const{overlapScoreRatio:failureOSR}=failure;
-const{overlapScoreRatio:symmetricOSR}=symmetricFailure;
-
-
-
-
-if(failureOSR>symmetricOSR||
-failureOSR===symmetricOSR&&
-overlapFailureIndex<overlapFailures.indexOf(symmetricFailure))
-{
-failuresAfterMerging.push(failure);
-}
-});
-
-return failuresAfterMerging;
-}
-
-
-
-
-
-function getTableItems(overlapFailures){
-const tableItems=overlapFailures.map(failure=>{
-const largestCR=getLargestRect(failure.tapTarget.clientRects);
-const width=Math.floor(largestCR.width);
-const height=Math.floor(largestCR.height);
-const size=width+'x'+height;
-return{
-tapTarget:targetToTableNode(failure.tapTarget),
-overlappingTarget:targetToTableNode(failure.overlappingTarget),
-tapTargetScore:failure.tapTargetScore,
-overlappingTargetScore:failure.overlappingTargetScore,
-overlapScoreRatio:failure.overlapScoreRatio,
-size,
-width,
-height};
-
-});
-
-tableItems.sort((a,b)=>{
-return b.overlapScoreRatio-a.overlapScoreRatio;
-});
-
-return tableItems;
-}
-
-
-
-
-
-function targetToTableNode(target){
-return{
-type:'node',
-snippet:target.snippet,
-path:target.path,
-selector:target.selector,
-nodeLabel:target.nodeLabel};
-
-}
-
-class TapTargets extends Audit{
-
-
-
-static get meta(){
-return{
-id:'tap-targets',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['MetaElements','TapTargets','TestedAsMobileDevice']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-if(!artifacts.TestedAsMobileDevice){
-
-
-return{
-score:1,
-notApplicable:true};
-
-}
-
-const viewportMeta=await ComputedViewportMeta.request(artifacts.MetaElements,context);
-if(!viewportMeta.isMobileOptimized){
-return{
-score:0,
-explanation:str_(UIStrings.explanationViewportMetaNotOptimized)};
-
-}
-
-
-const boundedTapTargets=getBoundedTapTargets(artifacts.TapTargets);
-
-const tooSmallTargets=getTooSmallTargets(boundedTapTargets);
-const overlapFailures=getAllOverlapFailures(tooSmallTargets,boundedTapTargets);
-const overlapFailuresForDisplay=mergeSymmetricFailures(overlapFailures);
-const tableItems=getTableItems(overlapFailuresForDisplay);
-
-
-const headings=[
-{key:'tapTarget',itemType:'node',text:str_(UIStrings.tapTargetHeader)},
-{key:'size',itemType:'text',text:str_(i18n.UIStrings.columnSize)},
-{key:'overlappingTarget',itemType:'node',text:str_(UIStrings.overlappingTargetHeader)}];
-
-
-const details=Audit.makeTableDetails(headings,tableItems);
-
-const tapTargetCount=artifacts.TapTargets.length;
-const failingTapTargetCount=new Set(overlapFailures.map(f=>f.tapTarget)).size;
-const passingTapTargetCount=tapTargetCount-failingTapTargetCount;
-
-let score=1;
-let passingTapTargetRatio=1;
-if(failingTapTargetCount>0){
-passingTapTargetRatio=passingTapTargetCount/tapTargetCount;
-
-
-score=passingTapTargetRatio*0.89;
-}
-const displayValue=str_(UIStrings.displayValue,{decimalProportion:passingTapTargetRatio});
-
-return{
-score,
-details,
-displayValue};
-
-}}
-
-
-TapTargets.FINGER_SIZE_PX=FINGER_SIZE_PX;
-
-module.exports=TapTargets;
-module.exports.UIStrings=UIStrings;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}).call(this,"/lighthouse-core/audits/seo/tap-targets.js");
-},{"../../computed/viewport-meta.js":41,"../../lib/i18n/i18n.js":66,"../../lib/rect-helpers.js":77,"../../lib/tappable-rects.js":82,"../audit.js":3}],"../audits/service-worker":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const URL=require('../lib/url-shim.js');
-const Audit=require('./audit.js');
-const i18n=require('../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Registers a service worker that controls page and `start_url`',
-
-failureTitle:'Does not register a service worker that controls page and `start_url`',
-
-description:'The service worker is the technology that enables your app to use many '+
-'Progressive Web App features, such as offline, add to homescreen, and push '+
-'notifications. [Learn more](https://web.dev/service-worker).',
-
-
-
-
-explanationOutOfScope:'This origin has one or more service workers, however the page '+
-'({pageUrl}) is not in scope.',
-
-explanationNoManifest:'This page is controlled by a service worker, however '+
-'no `start_url` was found because no manifest was fetched.',
-
-explanationBadManifest:'This page is controlled by a service worker, however '+
-'no `start_url` was found because manifest failed to parse as valid JSON',
-
-
-
-
-
-explanationBadStartUrl:'This page is controlled by a service worker, however '+
-'the `start_url` ({startUrl}) is not in the service worker\'s scope ({scopeUrl})'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class ServiceWorker extends Audit{
-
-
-
-static get meta(){
-return{
-id:'service-worker',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['URL','ServiceWorker','WebAppManifest']};
-
-}
-
-
-
-
-
-
-
-static getVersionsForOrigin(versions,pageUrl){
-return versions.
-filter(v=>v.status==='activated').
-filter(v=>new URL(v.scriptURL).origin===pageUrl.origin);
-}
-
-
-
-
-
-
-
-
-
-static getControllingScopeUrl(matchingSWVersions,registrations,pageUrl){
-
-const matchingScopeUrls=matchingSWVersions.
-map(v=>registrations.find(r=>r.registrationId===v.registrationId)).
-filter(r=>!!r).
-map(r=>new URL(r.scopeURL).href);
-
-
-
-const pageControllingScope=matchingScopeUrls.
-filter(scopeUrl=>pageUrl.href.startsWith(scopeUrl)).
-sort((scopeA,scopeB)=>scopeA.length-scopeB.length).
-pop();
-
-return pageControllingScope;
-}
-
-
-
-
-
-
-
-
-static checkStartUrl(manifest,scopeUrl){
-if(!manifest){
-return str_(UIStrings.explanationNoManifest);
-}
-if(!manifest.value){
-return str_(UIStrings.explanationBadManifest);
-}
-
-const startUrl=manifest.value.start_url.value;
-if(!startUrl.startsWith(scopeUrl)){
-return str_(UIStrings.explanationBadStartUrl,{startUrl,scopeUrl});
-}
-}
-
-
-
-
-
-static audit(artifacts){
-
-const pageUrl=new URL(artifacts.URL.finalUrl);
-const{versions,registrations}=artifacts.ServiceWorker;
-
-const versionsForOrigin=ServiceWorker.getVersionsForOrigin(versions,pageUrl);
-if(versionsForOrigin.length===0){
-return{
-score:0};
-
-}
-
-const controllingScopeUrl=ServiceWorker.getControllingScopeUrl(versionsForOrigin,
-registrations,pageUrl);
-if(!controllingScopeUrl){
-return{
-score:0,
-explanation:str_(UIStrings.explanationOutOfScope,{pageUrl:pageUrl.href})};
-
-}
-
-const startUrlFailure=ServiceWorker.checkStartUrl(artifacts.WebAppManifest,
-controllingScopeUrl);
-if(startUrlFailure){
-return{
-score:0,
-explanation:startUrlFailure};
-
-}
-
-
-return{
-score:1};
-
-}}
-
-
-module.exports=ServiceWorker;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/service-worker.js");
-},{"../lib/i18n/i18n.js":66,"../lib/url-shim.js":"url","./audit.js":3}],"../audits/splash-screen":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const MultiCheckAudit=require('./multi-check-audit.js');
-const ManifestValues=require('../computed/manifest-values.js');
-const i18n=require('../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Configured for a custom splash screen',
-
-failureTitle:'Is not configured for a custom splash screen',
-
-description:'A themed splash screen ensures a high-quality experience when '+
-'users launch your app from their homescreens. [Learn '+
-'more](https://web.dev/splash-screen).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-class SplashScreen extends MultiCheckAudit{
-
-
-
-static get meta(){
-return{
-id:'splash-screen',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['WebAppManifest']};
-
-}
-
-
-
-
-
-static assessManifest(manifestValues,failures){
-if(manifestValues.isParseFailure&&manifestValues.parseFailureReason){
-failures.push(manifestValues.parseFailureReason);
-return;
-}
-
-const splashScreenCheckIds=[
-'hasName',
-'hasBackgroundColor',
-'hasThemeColor',
-'hasIconsAtLeast512px'];
-
-
-manifestValues.allChecks.
-filter(item=>splashScreenCheckIds.includes(item.id)).
-forEach(item=>{
-if(!item.passing){
-failures.push(item.failureText);
-}
-});
-}
-
-
-
-
-
-
-static async audit_(artifacts,context){
-
-const failures=[];
-
-const manifestValues=await ManifestValues.request(artifacts.WebAppManifest,context);
-SplashScreen.assessManifest(manifestValues,failures);
-
-return{
-failures,
-manifestValues};
-
-}}
-
-
-module.exports=SplashScreen;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/splash-screen.js");
-},{"../computed/manifest-values.js":13,"../lib/i18n/i18n.js":66,"./multi-check-audit.js":6}],"../audits/themed-omnibox":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const MultiCheckAudit=require('./multi-check-audit.js');
-const ManifestValues=require('../computed/manifest-values.js');
-const cssParsers=require('cssstyle/lib/parsers');
-const i18n=require('../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Sets a theme color for the address bar.',
-
-failureTitle:'Does not set a theme color for the address bar.',
-
-description:'The browser address bar can be themed to match your site. '+
-'[Learn more](https://web.dev/themed-omnibox).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-
-
-
-
-
-
-class ThemedOmnibox extends MultiCheckAudit{
-
-
-
-static get meta(){
-return{
-id:'themed-omnibox',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['WebAppManifest','MetaElements']};
-
-}
-
-
-
-
-
-static isValidColor(color){
-return cssParsers.valueType(color)===cssParsers.TYPES.COLOR;
-}
-
-
-
-
-
-static assessMetaThemecolor(themeColorMeta,failures){
-if(!themeColorMeta){
-
-failures.push('No `<meta name="theme-color">` tag found');
-}else if(!ThemedOmnibox.isValidColor(themeColorMeta.content||'')){
-failures.push('The theme-color meta tag did not contain a valid CSS color');
-}
-}
-
-
-
-
-
-static assessManifest(manifestValues,failures){
-if(manifestValues.isParseFailure&&manifestValues.parseFailureReason){
-failures.push(manifestValues.parseFailureReason);
-return;
-}
-
-const themeColorCheck=manifestValues.allChecks.find(i=>i.id==='hasThemeColor');
-if(themeColorCheck&&!themeColorCheck.passing){
-failures.push(themeColorCheck.failureText);
-}
-}
-
-
-
-
-
-
-static async audit_(artifacts,context){
-
-const failures=[];
-
-const themeColorMeta=artifacts.MetaElements.find(meta=>meta.name==='theme-color');
-const manifestValues=await ManifestValues.request(artifacts.WebAppManifest,context);
-ThemedOmnibox.assessManifest(manifestValues,failures);
-ThemedOmnibox.assessMetaThemecolor(themeColorMeta,failures);
-
-return{
-failures,
-manifestValues,
-themeColor:themeColorMeta&&themeColorMeta.content||null};
-
-}}
-
-
-module.exports=ThemedOmnibox;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/themed-omnibox.js");
-},{"../computed/manifest-values.js":13,"../lib/i18n/i18n.js":66,"./multi-check-audit.js":6,"cssstyle/lib/parsers":105}],"../audits/third-party-summary":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const thirdPartyWeb=require('third-party-web/httparchive-nostats-subset');
-
-const Audit=require('./audit.js');
-const BootupTime=require('./bootup-time.js');
-const i18n=require('../lib/i18n/i18n.js');
-const NetworkRecords=require('../computed/network-records.js');
-const MainThreadTasks=require('../computed/main-thread-tasks.js');
-
-const UIStrings={
-
-title:'Minimize third-party usage',
-
-failureTitle:'Reduce the impact of third-party code',
-
-description:'Third-party code can significantly impact load performance. '+
-'Limit the number of redundant third-party providers and try to load third-party code after '+
-'your page has primarily finished loading. [Learn more](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/loading-third-party-javascript/).',
-
-columnThirdParty:'Third-Party',
-
-columnBlockingTime:'Main-Thread Blocking Time',
-
-displayValue:'Third-party code blocked the main thread for '+
-`{timeInMs, number, milliseconds}\xa0ms`};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-const PASS_THRESHOLD_IN_MS=250;
-
-
-
-class ThirdPartySummary extends Audit{
-
-
-
-static get meta(){
-return{
-id:'third-party-summary',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['traces','devtoolsLogs']};
-
-}
-
-
-
-
-
-
-
-static getEntitySafe(url){
-try{
-return thirdPartyWeb.getEntity(url);
-}catch(_){
-return undefined;
-}
-}
-
-
-
-
-
-
-
-
-
-static getSummaryByEntity(networkRecords,mainThreadTasks,cpuMultiplier){
-
-const entities=new Map();
-const defaultEntityStat={mainThreadTime:0,blockingTime:0,transferSize:0};
-
-for(const request of networkRecords){
-const entity=ThirdPartySummary.getEntitySafe(request.url);
-if(!entity)continue;
-
-const entityStats=entities.get(entity)||{...defaultEntityStat};
-entityStats.transferSize+=request.transferSize;
-entities.set(entity,entityStats);
-}
-
-const jsURLs=BootupTime.getJavaScriptURLs(networkRecords);
-
-for(const task of mainThreadTasks){
-const attributeableURL=BootupTime.getAttributableURLForTask(task,jsURLs);
-const entity=ThirdPartySummary.getEntitySafe(attributeableURL);
-if(!entity)continue;
-
-const entityStats=entities.get(entity)||{...defaultEntityStat};
-const taskDuration=task.selfTime*cpuMultiplier;
-
-entityStats.mainThreadTime+=taskDuration;
-
-
-
-entityStats.blockingTime+=Math.max(taskDuration-50,0);
-entities.set(entity,entityStats);
-}
-
-return entities;
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const settings=context.settings||{};
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const networkRecords=await NetworkRecords.request(devtoolsLog,context);
-const tasks=await MainThreadTasks.request(trace,context);
-const multiplier=settings.throttlingMethod==='simulate'?
-settings.throttling.cpuSlowdownMultiplier:1;
-
-const summaryByEntity=ThirdPartySummary.getSummaryByEntity(networkRecords,tasks,multiplier);
-
-const summary={wastedBytes:0,wastedMs:0};
-
-const results=Array.from(summaryByEntity.entries()).
-map(([entity,stats])=>{
-summary.wastedBytes+=stats.transferSize;
-summary.wastedMs+=stats.blockingTime;
-
-return{
-entity:{
-type:'link',
-text:entity.name,
-url:entity.homepage||''},
-
-transferSize:stats.transferSize,
-mainThreadTime:stats.mainThreadTime,
-blockingTime:stats.blockingTime};
-
-}).
-
-sort((a,b)=>b.blockingTime-a.blockingTime||b.transferSize-a.transferSize);
-
-
-const headings=[
-{key:'entity',itemType:'link',text:str_(UIStrings.columnThirdParty)},
-{key:'transferSize',granularity:1,itemType:'bytes',
-text:str_(i18n.UIStrings.columnSize)},
-{key:'blockingTime',granularity:1,itemType:'ms',
-text:str_(UIStrings.columnBlockingTime)}];
-
-
-if(!results.length){
-return{
-score:1,
-notApplicable:true};
-
-}
-
-return{
-score:Number(summary.wastedMs<=PASS_THRESHOLD_IN_MS),
-displayValue:str_(UIStrings.displayValue,{
-timeInMs:summary.wastedMs}),
-
-details:Audit.makeTableDetails(headings,results,summary)};
-
-}}
-
-
-module.exports=ThirdPartySummary;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/third-party-summary.js");
-},{"../computed/main-thread-tasks.js":12,"../computed/network-records.js":34,"../lib/i18n/i18n.js":66,"./audit.js":3,"./bootup-time.js":"../audits/bootup-time","third-party-web/httparchive-nostats-subset":185}],"../audits/time-to-first-byte":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const i18n=require('../lib/i18n/i18n.js');
-const MainResource=require('../computed/main-resource.js');
-
-const UIStrings={
-
-title:'Server response times are low (TTFB)',
-
-failureTitle:'Reduce server response times (TTFB)',
-
-description:'Time To First Byte identifies the time at which your server sends a response.'+
-' [Learn more](https://web.dev/time-to-first-byte).',
-
-displayValue:`Root document took {timeInMs, number, milliseconds}\xa0ms`};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-const TTFB_THRESHOLD=600;
-
-class TTFBMetric extends Audit{
-
-
-
-static get meta(){
-return{
-id:'time-to-first-byte',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['devtoolsLogs','URL']};
-
-}
-
-
-
-
-static caclulateTTFB(record){
-const timing=record.timing;
-return timing?timing.receiveHeadersEnd-timing.sendEnd:0;
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const mainResource=await MainResource.request({devtoolsLog,URL:artifacts.URL},context);
-
-const ttfb=TTFBMetric.caclulateTTFB(mainResource);
-const passed=ttfb<TTFB_THRESHOLD;
-const displayValue=str_(UIStrings.displayValue,{timeInMs:ttfb});
-
-
-const details={
-type:'opportunity',
-overallSavingsMs:ttfb-TTFB_THRESHOLD,
-headings:[],
-items:[]};
-
-
-return{
-numericValue:ttfb,
-score:Number(passed),
-displayValue,
-details,
-extendedInfo:{
-value:{
-wastedMs:ttfb-TTFB_THRESHOLD}}};
-
-
-
-}}
-
-
-module.exports=TTFBMetric;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/time-to-first-byte.js");
-},{"../computed/main-resource.js":11,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/user-timings":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const i18n=require('../lib/i18n/i18n.js');
-const ComputedUserTimings=require('../computed/user-timings.js');
-
-const UIStrings={
-
-title:'User Timing marks and measures',
-
-description:'Consider instrumenting your app with the User Timing API to measure your '+
-'app\'s real-world performance during key user experiences. '+
-'[Learn more](https://web.dev/user-timings).',
-
-displayValue:`{itemCount, plural,
-    =1 {1 user timing}
-    other {# user timings}
-    }`,
-
-columnType:'Type',
-
-columnStartTime:'Start Time',
-
-columnDuration:'Duration'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-class UserTimings extends Audit{
-
-
-
-static get meta(){
-return{
-id:'user-timings',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
-requiredArtifacts:['traces']};
-
-}
-
-
-
-
-static get blacklistedPrefixes(){
-return['goog_'];
-}
-
-
-
-
-
-
-static excludeBlacklisted(evt){
-return UserTimings.blacklistedPrefixes.every(prefix=>!evt.name.startsWith(prefix));
-}
-
-
-
-
-
-
-static audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-return ComputedUserTimings.request(trace,context).then(computedUserTimings=>{
-const userTimings=computedUserTimings.filter(UserTimings.excludeBlacklisted);
-const tableRows=userTimings.map(item=>{
-return{
-name:item.name,
-startTime:item.startTime,
-duration:item.isMark?undefined:item.duration,
-timingType:item.isMark?'Mark':'Measure'};
-
-}).sort((itemA,itemB)=>{
-if(itemA.timingType===itemB.timingType){
-
-return itemA.startTime-itemB.startTime;
-}else if(itemA.timingType==='Measure'){
-
-return-1;
-}else{
-return 1;
-}
-});
-
-
-const headings=[
-{key:'name',itemType:'text',text:str_(i18n.UIStrings.columnName)},
-{key:'timingType',itemType:'text',text:str_(UIStrings.columnType)},
-{key:'startTime',itemType:'ms',granularity:0.01,
-text:str_(UIStrings.columnStartTime)},
-{key:'duration',itemType:'ms',granularity:0.01,text:str_(UIStrings.columnDuration)}];
-
-
-const details=Audit.makeTableDetails(headings,tableRows);
-
-
-let displayValue;
-if(userTimings.length){
-displayValue=str_(UIStrings.displayValue,{itemCount:userTimings.length});
-}
-
-return{
-
-score:Number(userTimings.length===0),
-notApplicable:userTimings.length===0,
-displayValue,
-extendedInfo:{
-value:userTimings},
-
-details};
-
-});
-}}
-
-
-module.exports=UserTimings;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/user-timings.js");
-},{"../computed/user-timings.js":40,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/uses-rel-preconnect":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const UnusedBytes=require('./byte-efficiency/byte-efficiency-audit.js');
-const URL=require('../lib/url-shim.js');
-const i18n=require('../lib/i18n/i18n.js');
-const NetworkRecords=require('../computed/network-records.js');
-const MainResource=require('../computed/main-resource.js');
-const LoadSimulator=require('../computed/load-simulator.js');
-
-
-
-
-
-const PRECONNECT_SOCKET_MAX_IDLE=15;
-
-const IGNORE_THRESHOLD_IN_MS=50;
-
-const UIStrings={
-
-title:'Preconnect to required origins',
-
-description:
-'Consider adding `preconnect` or `dns-prefetch` resource hints to establish early '+
-`connections to important third-party origins. [Learn more](https://web.dev/uses-rel-preconnect).`,
-
-
-
-
-crossoriginWarning:'A preconnect <link> was found for "{securityOrigin}" but was not used '+
-'by the browser. Check that you are using the `crossorigin` attribute properly.'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class UsesRelPreconnectAudit extends Audit{
-
-
-
-static get meta(){
-return{
-id:'uses-rel-preconnect',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-requiredArtifacts:['devtoolsLogs','URL','LinkElements'],
-scoreDisplayMode:Audit.SCORING_MODES.NUMERIC};
-
-}
-
-
-
-
-
-
-static hasValidTiming(record){
-return!!record.timing&&record.timing.connectEnd>0&&record.timing.connectStart>0;
-}
-
-
-
-
-
-
-static hasAlreadyConnectedToOrigin(record){
-return(
-!!record.timing&&
-record.timing.dnsEnd-record.timing.dnsStart===0&&
-record.timing.connectEnd-record.timing.connectStart===0);
-
-}
-
-
-
-
-
-
-
-static socketStartTimeIsBelowThreshold(record,mainResource){
-return Math.max(0,record.startTime-mainResource.endTime)<PRECONNECT_SOCKET_MAX_IDLE;
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const devtoolsLog=artifacts.devtoolsLogs[UsesRelPreconnectAudit.DEFAULT_PASS];
-const settings=context.settings;
-let maxWasted=0;
-
-const warnings=[];
-
-const[networkRecords,mainResource,loadSimulator]=await Promise.all([
-NetworkRecords.request(devtoolsLog,context),
-MainResource.request({devtoolsLog,URL:artifacts.URL},context),
-LoadSimulator.request({devtoolsLog,settings},context)]);
-
-
-const{rtt,additionalRttByOrigin}=loadSimulator.getOptions();
-
-
-const origins=new Map();
-networkRecords.
-forEach(record=>{
-if(
-
-!UsesRelPreconnectAudit.hasValidTiming(record)||
-
-record.initiator.url===mainResource.url||
-
-!record.parsedURL||!record.parsedURL.securityOrigin||
-
-mainResource.parsedURL.securityOrigin===record.parsedURL.securityOrigin||
-
-UsesRelPreconnectAudit.hasAlreadyConnectedToOrigin(record)||
-
-!UsesRelPreconnectAudit.socketStartTimeIsBelowThreshold(record,mainResource))
-{
-return;
-}
-
-const securityOrigin=record.parsedURL.securityOrigin;
-const records=origins.get(securityOrigin)||[];
-records.push(record);
-origins.set(securityOrigin,records);
-});
-
-const preconnectLinks=artifacts.LinkElements.filter(el=>el.rel==='preconnect');
-const preconnectOrigins=new Set(preconnectLinks.map(link=>URL.getOrigin(link.href||'')));
-
-
-let results=[];
-origins.forEach(records=>{
-
-
-const firstRecordOfOrigin=records.reduce((firstRecord,record)=>{
-return record.startTime<firstRecord.startTime?record:firstRecord;
-});
-
-
-if(!firstRecordOfOrigin.timing)return;
-
-const securityOrigin=firstRecordOfOrigin.parsedURL.securityOrigin;
-
-
-
-
-const additionalRtt=additionalRttByOrigin.get(securityOrigin)||0;
-let connectionTime=rtt+additionalRtt;
-
-if(firstRecordOfOrigin.parsedURL.scheme==='https')connectionTime=connectionTime*2;
-
-const timeBetweenMainResourceAndDnsStart=
-firstRecordOfOrigin.startTime*1000-
-mainResource.endTime*1000+
-firstRecordOfOrigin.timing.dnsStart;
-
-const wastedMs=Math.min(connectionTime,timeBetweenMainResourceAndDnsStart);
-if(wastedMs<IGNORE_THRESHOLD_IN_MS)return;
-
-if(preconnectOrigins.has(securityOrigin)){
-
-warnings.push(str_(UIStrings.crossoriginWarning,{securityOrigin}));
-return;
-}
-
-maxWasted=Math.max(wastedMs,maxWasted);
-results.push({
-url:securityOrigin,
-wastedMs:wastedMs});
-
-});
-
-results=results.
-sort((a,b)=>b.wastedMs-a.wastedMs);
-
-
-const headings=[
-{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
-{key:'wastedMs',valueType:'timespanMs',label:str_(i18n.UIStrings.columnWastedMs)}];
-
-
-const details=Audit.makeOpportunityDetails(headings,results,maxWasted);
-
-return{
-score:UnusedBytes.scoreForWastedMs(maxWasted),
-numericValue:maxWasted,
-displayValue:maxWasted?
-str_(i18n.UIStrings.displayValueMsSavings,{wastedMs:maxWasted}):
-'',
-extendedInfo:{
-value:results},
-
-warnings,
-details};
-
-}}
-
-
-module.exports=UsesRelPreconnectAudit;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/uses-rel-preconnect.js");
-},{"../computed/load-simulator.js":10,"../computed/main-resource.js":11,"../computed/network-records.js":34,"../lib/i18n/i18n.js":66,"../lib/url-shim.js":"url","./audit.js":3,"./byte-efficiency/byte-efficiency-audit.js":4}],"../audits/uses-rel-preload":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const URL=require('../lib/url-shim.js');
-const Audit=require('./audit.js');
-const UnusedBytes=require('./byte-efficiency/byte-efficiency-audit.js');
-const CriticalRequestChains=require('../computed/critical-request-chains.js');
-const i18n=require('../lib/i18n/i18n.js');
-const MainResource=require('../computed/main-resource.js');
-const PageDependencyGraph=require('../computed/page-dependency-graph.js');
-const LoadSimulator=require('../computed/load-simulator.js');
-
-const UIStrings={
-
-title:'Preload key requests',
-
-description:'Consider using `<link rel=preload>` to prioritize fetching resources that are '+
-'currently requested later in page load. [Learn more](https://web.dev/uses-rel-preload).',
-
-
-
-
-crossoriginWarning:'A preload <link> was found for "{preloadURL}" but was not used '+
-'by the browser. Check that you are using the `crossorigin` attribute properly.'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-const THRESHOLD_IN_MS=100;
-
-class UsesRelPreloadAudit extends Audit{
-
-
-
-static get meta(){
-return{
-id:'uses-rel-preload',
-title:str_(UIStrings.title),
-description:str_(UIStrings.description),
-requiredArtifacts:['devtoolsLogs','traces','URL'],
-scoreDisplayMode:Audit.SCORING_MODES.NUMERIC};
-
-}
-
-
-
-
-
-
-static getURLsToPreload(mainResource,graph){
-
-const urls=new Set();
-
-graph.traverse((node,traversalPath)=>{
-if(node.type!=='network')return;
-
-const path=traversalPath.slice(1).filter(initiator=>initiator.type==='network');
-if(!UsesRelPreloadAudit.shouldPreloadRequest(node.record,mainResource,path))return;
-urls.add(node.record.url);
-});
-
-return urls;
-}
-
-
-
-
-
-
-
-static getURLsFailedToPreload(graph){
-
-const requests=[];
-graph.traverse(node=>node.type==='network'&&requests.push(node.record));
-
-const preloadRequests=requests.filter(req=>req.isLinkPreload);
-const preloadURLs=new Set(preloadRequests.map(req=>req.url));
-
-
-const failedRequests=requests.filter(req=>preloadURLs.has(req.url)&&!req.isLinkPreload);
-return new Set(failedRequests.map(req=>req.url));
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-static shouldPreloadRequest(request,mainResource,initiatorPath){
-const mainResourceDepth=mainResource.redirects?mainResource.redirects.length:0;
-
-
-if(request.isLinkPreload)return false;
-
-if(!CriticalRequestChains.isCritical(request,mainResource))return false;
-
-if(URL.NON_NETWORK_PROTOCOLS.includes(request.protocol))return false;
-
-if(initiatorPath.length!==mainResourceDepth+2)return false;
-
-return URL.rootDomainsMatch(request.url,mainResource.url);
-}
-
-
-
-
-
-
-
-
-static computeWasteWithGraph(urls,graph,simulator){
-if(!urls.size){
-return{wastedMs:0,results:[]};
-}
-
-
-
-const simulationBeforeChanges=simulator.simulate(graph,{flexibleOrdering:true});
-const modifiedGraph=graph.cloneWithRelationships();
-
-
-const nodesToPreload=[];
-
-let mainDocumentNode=null;
-modifiedGraph.traverse(node=>{
-if(node.type!=='network')return;
-
-const networkNode=node;
-if(node.isMainDocument()){
-mainDocumentNode=networkNode;
-}else if(networkNode.record&&urls.has(networkNode.record.url)){
-nodesToPreload.push(networkNode);
-}
-});
-
-if(!mainDocumentNode){
-
-throw new Error('Could not find main document node');
-}
-
-
-
-for(const node of nodesToPreload){
-node.removeAllDependencies();
-node.addDependency(mainDocumentNode);
-}
-
-
-const simulationAfterChanges=simulator.simulate(modifiedGraph,{flexibleOrdering:true});
-const originalNodesByRecord=Array.from(simulationBeforeChanges.nodeTimings.keys()).
-
-reduce((map,node)=>map.set(node.record,node),new Map());
-
-const results=[];
-for(const node of nodesToPreload){
-const originalNode=originalNodesByRecord.get(node.record);
-const timingAfter=simulationAfterChanges.nodeTimings.get(node);
-const timingBefore=simulationBeforeChanges.nodeTimings.get(originalNode);
-if(!timingBefore||!timingAfter)throw new Error('Missing preload node');
-
-const wastedMs=Math.round(timingBefore.endTime-timingAfter.endTime);
-if(wastedMs<THRESHOLD_IN_MS)continue;
-results.push({url:node.record.url,wastedMs});
-}
-
-if(!results.length){
-return{wastedMs:0,results};
-}
-
-return{
-
-
-wastedMs:Math.max(...results.map(item=>item.wastedMs)),
-results};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const trace=artifacts.traces[UsesRelPreloadAudit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[UsesRelPreloadAudit.DEFAULT_PASS];
-const URL=artifacts.URL;
-const simulatorOptions={trace,devtoolsLog,settings:context.settings};
-
-const[mainResource,graph,simulator]=await Promise.all([
-MainResource.request({devtoolsLog,URL},context),
-PageDependencyGraph.request({trace,devtoolsLog},context),
-LoadSimulator.request(simulatorOptions,context)]);
-
-
-const urls=UsesRelPreloadAudit.getURLsToPreload(mainResource,graph);
-const{results,wastedMs}=UsesRelPreloadAudit.computeWasteWithGraph(urls,graph,simulator);
-
-results.sort((a,b)=>b.wastedMs-a.wastedMs);
-
-
-let warnings;
-const failedURLs=UsesRelPreloadAudit.getURLsFailedToPreload(graph);
-if(failedURLs.size){
-warnings=Array.from(failedURLs).
-map(preloadURL=>str_(UIStrings.crossoriginWarning,{preloadURL}));
-}
-
-
-const headings=[
-{key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
-{key:'wastedMs',valueType:'timespanMs',label:str_(i18n.UIStrings.columnWastedMs)}];
-
-const details=Audit.makeOpportunityDetails(headings,results,wastedMs);
-
-return{
-score:UnusedBytes.scoreForWastedMs(wastedMs),
-numericValue:wastedMs,
-displayValue:wastedMs?
-str_(i18n.UIStrings.displayValueMsSavings,{wastedMs}):
-'',
-extendedInfo:{
-value:results},
-
-details,
-warnings};
-
-}}
-
-
-module.exports=UsesRelPreloadAudit;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/uses-rel-preload.js");
-},{"../computed/critical-request-chains.js":9,"../computed/load-simulator.js":10,"../computed/main-resource.js":11,"../computed/page-dependency-graph.js":35,"../lib/i18n/i18n.js":66,"../lib/url-shim.js":"url","./audit.js":3,"./byte-efficiency/byte-efficiency-audit.js":4}],"../audits/viewport":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const ComputedViewportMeta=require('../computed/viewport-meta.js');
-const i18n=require('../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Has a `<meta name="viewport">` tag with `width` or `initial-scale`',
-
-failureTitle:'Does not have a `<meta name="viewport">` tag with `width` '+
-'or `initial-scale`',
-
-description:'Add a `<meta name="viewport">` tag to optimize your app for mobile screens. '+
-'[Learn more](https://web.dev/viewport).',
-
-explanationNoTag:'No `<meta name="viewport">` tag found'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class Viewport extends Audit{
-
-
-
-static get meta(){
-return{
-id:'viewport',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['MetaElements']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const viewportMeta=await ComputedViewportMeta.request(artifacts.MetaElements,context);
-
-if(!viewportMeta.hasViewportTag){
-return{
-score:0,
-explanation:str_(UIStrings.explanationNoTag)};
-
-}
-
-return{
-score:Number(viewportMeta.isMobileOptimized),
-warnings:viewportMeta.parserWarnings};
-
-}}
-
-
-module.exports=Viewport;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/viewport.js");
-},{"../computed/viewport-meta.js":41,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/without-javascript":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-const i18n=require('../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Contains some content when JavaScript is not available',
-
-failureTitle:'Does not provide fallback content when JavaScript is not available',
-
-description:'Your app should display some content when JavaScript is disabled, even if '+
-'it\'s just a warning to the user that JavaScript is required to use the app. '+
-'[Learn more](https://web.dev/without-javascript).',
-
-explanation:'The page body should render some content if its scripts are not available.'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class WithoutJavaScript extends Audit{
-
-
-
-static get meta(){
-return{
-id:'without-javascript',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['HTMLWithoutJavaScript']};
-
-}
-
-
-
-
-
-static audit(artifacts){
-const artifact=artifacts.HTMLWithoutJavaScript;
-
-
-if(artifact.bodyText.trim()===''&&!artifact.hasNoScript){
-return{
-score:0,
-explanation:str_(UIStrings.explanation)};
-
-}
-
-return{
-score:1};
-
-}}
-
-
-module.exports=WithoutJavaScript;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/without-javascript.js");
-},{"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/works-offline":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const URL=require('../lib/url-shim.js');
-const Audit=require('./audit.js');
-const i18n=require('../lib/i18n/i18n.js');
-
-const UIStrings={
-
-title:'Current page responds with a 200 when offline',
-
-failureTitle:'Current page does not respond with a 200 when offline',
-
-description:'If you\'re building a Progressive Web App, consider using a service worker '+
-'so that your app can work offline. '+
-'[Learn more](https://web.dev/works-offline).',
-
-
-
-
-
-warningNoLoad:'The page may not be loading offline because your test URL '+
-`({requested}) was redirected to "{final}". `+
-'Try testing the second URL directly.'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class WorksOffline extends Audit{
-
-
-
-static get meta(){
-return{
-id:'works-offline',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['Offline','URL']};
-
-}
-
-
-
-
-
-static audit(artifacts){
-const warnings=[];
-const passed=artifacts.Offline===200;
-if(!passed&&
-!URL.equalWithExcludedFragments(artifacts.URL.requestedUrl,artifacts.URL.finalUrl)){
-warnings.push(str_(UIStrings.warningNoLoad,
-{requested:artifacts.URL.requestedUrl,final:artifacts.URL.finalUrl}));
-}
-
-return{
-score:Number(passed),
-warnings};
-
-}}
-
-
-module.exports=WorksOffline;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/works-offline.js");
-},{"../lib/i18n/i18n.js":66,"../lib/url-shim.js":"url","./audit.js":3}],"../gather/gatherers/accessibility":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-
-
-const Gatherer=require('./gatherer.js');
-
-const axeLibSource="/*! axe v3.3.0\n * Copyright (c) 2019 Deque Systems, Inc.\n *\n * Your use of this Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n *\n * This entire copyright notice must appear in every copy of this file you\n * distribute or in any file that contains substantial portions of this source\n * code.\n */\n!function e(window){var a=window,document=window.document;function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function l(e){this.name=\"SupportError\",this.cause=e.cause,this.message=\"`\".concat(e.cause,\"` - feature unsupported in your environment.\"),e.ruleId&&(this.ruleId=e.ruleId,this.message+=\" Skipping \".concat(this.ruleId,\" rule.\")),this.stack=(new Error).stack}(axe=axe||{}).version=\"3.3.0\",\"function\"==typeof define&&define.amd&&define(\"axe-core\",[],function(){\"use strict\";return axe}),\"object\"===(\"undefined\"==typeof module?\"undefined\":S(module))&&module.exports&&\"function\"==typeof e.toString&&(axe.source=\"(\"+e.toString()+')(typeof window === \"object\" ? window : this);',module.exports=axe),\"function\"==typeof window.getComputedStyle&&(window.axe=axe),(l.prototype=Object.create(Error.prototype)).constructor=l,function o(i,u,s){function l(t,e){if(!u[t]){if(!i[t]){var n=\"function\"==typeof require&&require;if(!e&&n)return n(t,!0);if(c)return c(t,!0);var r=new Error(\"Cannot find module '\"+t+\"'\");throw r.code=\"MODULE_NOT_FOUND\",r}var a=u[t]={exports:{}};i[t][0].call(a.exports,function(e){return l(i[t][1][e]||e)},a,a.exports,o,i,u,s)}return u[t].exports}for(var c=\"function\"==typeof require&&require,e=0;e<s.length;e++)l(s[e]);return l}({1:[function(e,t,n){\"Promise\"in window||e(\"es6-promise\").polyfill(),e(\"weakmap-polyfill\"),axe.imports={axios:e(\"axios\"),CssSelectorParser:e(\"css-selector-parser\").CssSelectorParser,doT:e(\"dot\"),emojiRegexText:e(\"emoji-regex\")}},{axios:2,\"css-selector-parser\":28,dot:30,\"emoji-regex\":31,\"es6-promise\":32,\"weakmap-polyfill\":34}],2:[function(e,t,n){t.exports=e(\"./lib/axios\")},{\"./lib/axios\":4}],3:[function(c,e,t){\"use strict\";var utils=c(\"./../utils\"),d=c(\"./../core/settle\"),m=c(\"./../helpers/buildURL\"),p=c(\"./../helpers/parseHeaders\"),f=c(\"./../helpers/isURLSameOrigin\"),h=c(\"../core/createError\");e.exports=function(l){return new Promise(function(n,r){var a=l.data,o=l.headers;utils.isFormData(a)&&delete o[\"Content-Type\"];var i=new XMLHttpRequest;if(l.auth){var e=l.auth.username||\"\",t=l.auth.password||\"\";o.Authorization=\"Basic \"+btoa(e+\":\"+t)}if(i.open(l.method.toUpperCase(),m(l.url,l.params,l.paramsSerializer),!0),i.timeout=l.timeout,i.onreadystatechange=function(){if(i&&4===i.readyState&&(0!==i.status||i.responseURL&&0===i.responseURL.indexOf(\"file:\"))){var e=\"getAllResponseHeaders\"in i?p(i.getAllResponseHeaders()):null,t={data:l.responseType&&\"text\"!==l.responseType?i.response:i.responseText,status:i.status,statusText:i.statusText,headers:e,config:l,request:i};d(n,r,t),i=null}},i.onabort=function(){i&&(r(h(\"Request aborted\",l,\"ECONNABORTED\",i)),i=null)},i.onerror=function(){r(h(\"Network Error\",l,null,i)),i=null},i.ontimeout=function(){r(h(\"timeout of \"+l.timeout+\"ms exceeded\",l,\"ECONNABORTED\",i)),i=null},utils.isStandardBrowserEnv()){var u=c(\"./../helpers/cookies\"),s=(l.withCredentials||f(l.url))&&l.xsrfCookieName?u.read(l.xsrfCookieName):void 0;s&&(o[l.xsrfHeaderName]=s)}if(\"setRequestHeader\"in i&&utils.forEach(o,function(e,t){void 0===a&&\"content-type\"===t.toLowerCase()?delete o[t]:i.setRequestHeader(t,e)}),l.withCredentials&&(i.withCredentials=!0),l.responseType)try{i.responseType=l.responseType}catch(e){if(\"json\"!==l.responseType)throw e}\"function\"==typeof l.onDownloadProgress&&i.addEventListener(\"progress\",l.onDownloadProgress),\"function\"==typeof l.onUploadProgress&&i.upload&&i.upload.addEventListener(\"progress\",l.onUploadProgress),l.cancelToken&&l.cancelToken.promise.then(function(e){i&&(i.abort(),r(e),i=null)}),void 0===a&&(a=null),i.send(a)})}},{\"../core/createError\":10,\"./../core/settle\":14,\"./../helpers/buildURL\":18,\"./../helpers/cookies\":20,\"./../helpers/isURLSameOrigin\":22,\"./../helpers/parseHeaders\":24,\"./../utils\":26}],4:[function(e,t,n){\"use strict\";var utils=e(\"./utils\"),r=e(\"./helpers/bind\"),a=e(\"./core/Axios\"),o=e(\"./core/mergeConfig\");function i(e){var t=new a(e),n=r(a.prototype.request,t);return utils.extend(n,a.prototype,t),utils.extend(n,t),n}var u=i(e(\"./defaults\"));u.Axios=a,u.create=function(e){return i(o(u.defaults,e))},u.Cancel=e(\"./cancel/Cancel\"),u.CancelToken=e(\"./cancel/CancelToken\"),u.isCancel=e(\"./cancel/isCancel\"),u.all=function(e){return Promise.all(e)},u.spread=e(\"./helpers/spread\"),t.exports=u,t.exports.default=u},{\"./cancel/Cancel\":5,\"./cancel/CancelToken\":6,\"./cancel/isCancel\":7,\"./core/Axios\":8,\"./core/mergeConfig\":13,\"./defaults\":16,\"./helpers/bind\":17,\"./helpers/spread\":25,\"./utils\":26}],5:[function(e,t,n){\"use strict\";function r(e){this.message=e}r.prototype.toString=function(){return\"Cancel\"+(this.message?\": \"+this.message:\"\")},r.prototype.__CANCEL__=!0,t.exports=r},{}],6:[function(e,t,n){\"use strict\";var r=e(\"./Cancel\");function a(e){if(\"function\"!=typeof e)throw new TypeError(\"executor must be a function.\");var t;this.promise=new Promise(function(e){t=e});var n=this;e(function(e){n.reason||(n.reason=new r(e),t(n.reason))})}a.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},a.source=function(){var t;return{token:new a(function(e){t=e}),cancel:t}},t.exports=a},{\"./Cancel\":5}],7:[function(e,t,n){\"use strict\";t.exports=function(e){return!(!e||!e.__CANCEL__)}},{}],8:[function(e,t,n){\"use strict\";var utils=e(\"./../utils\"),r=e(\"../helpers/buildURL\"),a=e(\"./InterceptorManager\"),o=e(\"./dispatchRequest\"),i=e(\"./mergeConfig\");function u(e){this.defaults=e,this.interceptors={request:new a,response:new a}}u.prototype.request=function(e,t){\"string\"==typeof e?(e=t||{}).url=arguments[0]:e=e||{},(e=i(this.defaults,e)).method=e.method?e.method.toLowerCase():\"get\";var n=[o,void 0],r=Promise.resolve(e);for(this.interceptors.request.forEach(function(e){n.unshift(e.fulfilled,e.rejected)}),this.interceptors.response.forEach(function(e){n.push(e.fulfilled,e.rejected)});n.length;)r=r.then(n.shift(),n.shift());return r},u.prototype.getUri=function(e){return e=i(this.defaults,e),r(e.url,e.params,e.paramsSerializer).replace(/^\\?/,\"\")},utils.forEach([\"delete\",\"get\",\"head\",\"options\"],function(n){u.prototype[n]=function(e,t){return this.request(utils.merge(t||{},{method:n,url:e}))}}),utils.forEach([\"post\",\"put\",\"patch\"],function(r){u.prototype[r]=function(e,t,n){return this.request(utils.merge(n||{},{method:r,url:e,data:t}))}}),t.exports=u},{\"../helpers/buildURL\":18,\"./../utils\":26,\"./InterceptorManager\":9,\"./dispatchRequest\":11,\"./mergeConfig\":13}],9:[function(e,t,n){\"use strict\";var utils=e(\"./../utils\");function r(){this.handlers=[]}r.prototype.use=function(e,t){return this.handlers.push({fulfilled:e,rejected:t}),this.handlers.length-1},r.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},r.prototype.forEach=function(t){utils.forEach(this.handlers,function(e){null!==e&&t(e)})},t.exports=r},{\"./../utils\":26}],10:[function(e,t,n){\"use strict\";var i=e(\"./enhanceError\");t.exports=function(e,t,n,r,a){var o=new Error(e);return i(o,t,n,r,a)}},{\"./enhanceError\":12}],11:[function(e,t,n){\"use strict\";var utils=e(\"./../utils\"),r=e(\"./transformData\"),a=e(\"../cancel/isCancel\"),o=e(\"../defaults\"),i=e(\"./../helpers/isAbsoluteURL\"),u=e(\"./../helpers/combineURLs\");function s(e){e.cancelToken&&e.cancelToken.throwIfRequested()}t.exports=function(t){return s(t),t.baseURL&&!i(t.url)&&(t.url=u(t.baseURL,t.url)),t.headers=t.headers||{},t.data=r(t.data,t.headers,t.transformRequest),t.headers=utils.merge(t.headers.common||{},t.headers[t.method]||{},t.headers||{}),utils.forEach([\"delete\",\"get\",\"head\",\"post\",\"put\",\"patch\",\"common\"],function(e){delete t.headers[e]}),(t.adapter||o.adapter)(t).then(function(e){return s(t),e.data=r(e.data,e.headers,t.transformResponse),e},function(e){return a(e)||(s(t),e&&e.response&&(e.response.data=r(e.response.data,e.response.headers,t.transformResponse))),Promise.reject(e)})}},{\"../cancel/isCancel\":7,\"../defaults\":16,\"./../helpers/combineURLs\":19,\"./../helpers/isAbsoluteURL\":21,\"./../utils\":26,\"./transformData\":15}],12:[function(e,t,n){\"use strict\";t.exports=function(e,t,n,r,a){return e.config=t,n&&(e.code=n),e.request=r,e.response=a,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},{}],13:[function(e,t,n){\"use strict\";var utils=e(\"../utils\");t.exports=function(t,n){n=n||{};var r={};return utils.forEach([\"url\",\"method\",\"params\",\"data\"],function(e){void 0!==n[e]&&(r[e]=n[e])}),utils.forEach([\"headers\",\"auth\",\"proxy\"],function(e){utils.isObject(n[e])?r[e]=utils.deepMerge(t[e],n[e]):void 0!==n[e]?r[e]=n[e]:utils.isObject(t[e])?r[e]=utils.deepMerge(t[e]):void 0!==t[e]&&(r[e]=t[e])}),utils.forEach([\"baseURL\",\"transformRequest\",\"transformResponse\",\"paramsSerializer\",\"timeout\",\"withCredentials\",\"adapter\",\"responseType\",\"xsrfCookieName\",\"xsrfHeaderName\",\"onUploadProgress\",\"onDownloadProgress\",\"maxContentLength\",\"validateStatus\",\"maxRedirects\",\"httpAgent\",\"httpsAgent\",\"cancelToken\",\"socketPath\"],function(e){void 0!==n[e]?r[e]=n[e]:void 0!==t[e]&&(r[e]=t[e])}),r}},{\"../utils\":26}],14:[function(e,t,n){\"use strict\";var a=e(\"./createError\");t.exports=function(e,t,n){var r=n.config.validateStatus;!r||r(n.status)?e(n):t(a(\"Request failed with status code \"+n.status,n.config,null,n.request,n))}},{\"./createError\":10}],15:[function(e,t,n){\"use strict\";var utils=e(\"./../utils\");t.exports=function(t,n,e){return utils.forEach(e,function(e){t=e(t,n)}),t}},{\"./../utils\":26}],16:[function(i,u,e){(function(e){\"use strict\";var utils=i(\"./utils\"),n=i(\"./helpers/normalizeHeaderName\"),t={\"Content-Type\":\"application/x-www-form-urlencoded\"};function r(e,t){!utils.isUndefined(e)&&utils.isUndefined(e[\"Content-Type\"])&&(e[\"Content-Type\"]=t)}var a,o={adapter:(void 0!==e&&\"[object process]\"===Object.prototype.toString.call(e)?a=i(\"./adapters/http\"):\"undefined\"!=typeof XMLHttpRequest&&(a=i(\"./adapters/xhr\")),a),transformRequest:[function(e,t){return n(t,\"Accept\"),n(t,\"Content-Type\"),utils.isFormData(e)||utils.isArrayBuffer(e)||utils.isBuffer(e)||utils.isStream(e)||utils.isFile(e)||utils.isBlob(e)?e:utils.isArrayBufferView(e)?e.buffer:utils.isURLSearchParams(e)?(r(t,\"application/x-www-form-urlencoded;charset=utf-8\"),e.toString()):utils.isObject(e)?(r(t,\"application/json;charset=utf-8\"),JSON.stringify(e)):e}],transformResponse:[function(e){if(\"string\"==typeof e)try{e=JSON.parse(e)}catch(e){}return e}],timeout:0,xsrfCookieName:\"XSRF-TOKEN\",xsrfHeaderName:\"X-XSRF-TOKEN\",maxContentLength:-1,validateStatus:function(e){return 200<=e&&e<300}};o.headers={common:{Accept:\"application/json, text/plain, */*\"}},utils.forEach([\"delete\",\"get\",\"head\"],function(e){o.headers[e]={}}),utils.forEach([\"post\",\"put\",\"patch\"],function(e){o.headers[e]=utils.merge(t)}),u.exports=o}).call(this,i(\"_process\"))},{\"./adapters/http\":3,\"./adapters/xhr\":3,\"./helpers/normalizeHeaderName\":23,\"./utils\":26,_process:33}],17:[function(e,t,n){\"use strict\";t.exports=function(n,r){return function(){for(var e=new Array(arguments.length),t=0;t<e.length;t++)e[t]=arguments[t];return n.apply(r,e)}}},{}],18:[function(e,t,n){\"use strict\";var utils=e(\"./../utils\");function i(e){return encodeURIComponent(e).replace(/%40/gi,\"@\").replace(/%3A/gi,\":\").replace(/%24/g,\"$\").replace(/%2C/gi,\",\").replace(/%20/g,\"+\").replace(/%5B/gi,\"[\").replace(/%5D/gi,\"]\")}t.exports=function(e,t,n){if(!t)return e;var r;if(n)r=n(t);else if(utils.isURLSearchParams(t))r=t.toString();else{var a=[];utils.forEach(t,function(e,t){null!=e&&(utils.isArray(e)?t+=\"[]\":e=[e],utils.forEach(e,function(e){utils.isDate(e)?e=e.toISOString():utils.isObject(e)&&(e=JSON.stringify(e)),a.push(i(t)+\"=\"+i(e))}))}),r=a.join(\"&\")}if(r){var o=e.indexOf(\"#\");-1!==o&&(e=e.slice(0,o)),e+=(-1===e.indexOf(\"?\")?\"?\":\"&\")+r}return e}},{\"./../utils\":26}],19:[function(e,t,n){\"use strict\";t.exports=function(e,t){return t?e.replace(/\\/+$/,\"\")+\"/\"+t.replace(/^\\/+/,\"\"):e}},{}],20:[function(e,t,n){\"use strict\";var utils=e(\"./../utils\");t.exports=utils.isStandardBrowserEnv()?{write:function(e,t,n,r,a,o){var i=[];i.push(e+\"=\"+encodeURIComponent(t)),utils.isNumber(n)&&i.push(\"expires=\"+new Date(n).toGMTString()),utils.isString(r)&&i.push(\"path=\"+r),utils.isString(a)&&i.push(\"domain=\"+a),!0===o&&i.push(\"secure\"),document.cookie=i.join(\"; \")},read:function(e){var t=document.cookie.match(new RegExp(\"(^|;\\\\s*)(\"+e+\")=([^;]*)\"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,\"\",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},{\"./../utils\":26}],21:[function(e,t,n){\"use strict\";t.exports=function(e){return/^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(e)}},{}],22:[function(e,t,n){\"use strict\";var r,a,o,utils=e(\"./../utils\");function i(e){var t=e;return a&&(o.setAttribute(\"href\",t),t=o.href),o.setAttribute(\"href\",t),{href:o.href,protocol:o.protocol?o.protocol.replace(/:$/,\"\"):\"\",host:o.host,search:o.search?o.search.replace(/^\\?/,\"\"):\"\",hash:o.hash?o.hash.replace(/^#/,\"\"):\"\",hostname:o.hostname,port:o.port,pathname:\"/\"===o.pathname.charAt(0)?o.pathname:\"/\"+o.pathname}}t.exports=utils.isStandardBrowserEnv()?(a=/(msie|trident)/i.test(navigator.userAgent),o=document.createElement(\"a\"),r=i(window.location.href),function(e){var t=utils.isString(e)?i(e):e;return t.protocol===r.protocol&&t.host===r.host}):function(){return!0}},{\"./../utils\":26}],23:[function(e,t,n){\"use strict\";var utils=e(\"../utils\");t.exports=function(n,r){utils.forEach(n,function(e,t){t!==r&&t.toUpperCase()===r.toUpperCase()&&(n[r]=e,delete n[t])})}},{\"../utils\":26}],24:[function(e,t,n){\"use strict\";var utils=e(\"./../utils\"),o=[\"age\",\"authorization\",\"content-length\",\"content-type\",\"etag\",\"expires\",\"from\",\"host\",\"if-modified-since\",\"if-unmodified-since\",\"last-modified\",\"location\",\"max-forwards\",\"proxy-authorization\",\"referer\",\"retry-after\",\"user-agent\"];t.exports=function(e){var t,n,r,a={};return e&&utils.forEach(e.split(\"\\n\"),function(e){if(r=e.indexOf(\":\"),t=utils.trim(e.substr(0,r)).toLowerCase(),n=utils.trim(e.substr(r+1)),t){if(a[t]&&0<=o.indexOf(t))return;a[t]=\"set-cookie\"===t?(a[t]?a[t]:[]).concat([n]):a[t]?a[t]+\", \"+n:n}}),a}},{\"./../utils\":26}],25:[function(e,t,n){\"use strict\";t.exports=function(t){return function(e){return t.apply(null,e)}}},{}],26:[function(e,t,n){\"use strict\";var a=e(\"./helpers/bind\"),r=e(\"is-buffer\"),o=Object.prototype.toString;function i(e){return\"[object Array]\"===o.call(e)}function u(e){return null!==e&&\"object\"==typeof e}function s(e){return\"[object Function]\"===o.call(e)}function l(e,t){if(null!=e)if(\"object\"!=typeof e&&(e=[e]),i(e))for(var n=0,r=e.length;n<r;n++)t.call(null,e[n],n,e);else for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.call(null,e[a],a,e)}t.exports={isArray:i,isArrayBuffer:function(e){return\"[object ArrayBuffer]\"===o.call(e)},isBuffer:r,isFormData:function(e){return\"undefined\"!=typeof FormData&&e instanceof FormData},isArrayBufferView:function(e){return\"undefined\"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&e.buffer instanceof ArrayBuffer},isString:function(e){return\"string\"==typeof e},isNumber:function(e){return\"number\"==typeof e},isObject:u,isUndefined:function(e){return void 0===e},isDate:function(e){return\"[object Date]\"===o.call(e)},isFile:function(e){return\"[object File]\"===o.call(e)},isBlob:function(e){return\"[object Blob]\"===o.call(e)},isFunction:s,isStream:function(e){return u(e)&&s(e.pipe)},isURLSearchParams:function(e){return\"undefined\"!=typeof URLSearchParams&&e instanceof URLSearchParams},isStandardBrowserEnv:function(){return(\"undefined\"==typeof navigator||\"ReactNative\"!==navigator.product&&\"NativeScript\"!==navigator.product&&\"NS\"!==navigator.product)&&(void 0!==window&&void 0!==document)},forEach:l,merge:function n(){var r={};function e(e,t){\"object\"==typeof r[t]&&\"object\"==typeof e?r[t]=n(r[t],e):r[t]=e}for(var t=0,a=arguments.length;t<a;t++)l(arguments[t],e);return r},deepMerge:function n(){var r={};function e(e,t){\"object\"==typeof r[t]&&\"object\"==typeof e?r[t]=n(r[t],e):r[t]=\"object\"==typeof e?n({},e):e}for(var t=0,a=arguments.length;t<a;t++)l(arguments[t],e);return r},extend:function(n,e,r){return l(e,function(e,t){n[t]=r&&\"function\"==typeof e?a(e,r):e}),n},trim:function(e){return e.replace(/^\\s*/,\"\").replace(/\\s*$/,\"\")}}},{\"./helpers/bind\":17,\"is-buffer\":27}],27:[function(e,t,n){t.exports=function(e){return null!=e&&null!=e.constructor&&\"function\"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}},{}],28:[function(e,t,n){t.exports={CssSelectorParser:e(\"./lib/css-selector-parser.js\").CssSelectorParser}},{\"./lib/css-selector-parser.js\":29}],29:[function(e,t,n){function r(){this.pseudos={},this.attrEqualityMods={},this.ruleNestingOperators={},this.substitutesEnabled=!1}function o(e){return\"a\"<=e&&e<=\"f\"||\"A\"<=e&&e<=\"F\"||\"0\"<=e&&e<=\"9\"}r.prototype.registerSelectorPseudos=function(e){for(var t=0,n=arguments.length;t<n;t++)e=arguments[t],this.pseudos[e]=\"selector\";return this},r.prototype.unregisterSelectorPseudos=function(e){for(var t=0,n=arguments.length;t<n;t++)e=arguments[t],delete this.pseudos[e];return this},r.prototype.registerNumericPseudos=function(e){for(var t=0,n=arguments.length;t<n;t++)e=arguments[t],this.pseudos[e]=\"numeric\";return this},r.prototype.unregisterNumericPseudos=function(e){for(var t=0,n=arguments.length;t<n;t++)e=arguments[t],delete this.pseudos[e];return this},r.prototype.registerNestingOperators=function(e){for(var t=0,n=arguments.length;t<n;t++)e=arguments[t],this.ruleNestingOperators[e]=!0;return this},r.prototype.unregisterNestingOperators=function(e){for(var t=0,n=arguments.length;t<n;t++)e=arguments[t],delete this.ruleNestingOperators[e];return this},r.prototype.registerAttrEqualityMods=function(e){for(var t=0,n=arguments.length;t<n;t++)e=arguments[t],this.attrEqualityMods[e]=!0;return this},r.prototype.unregisterAttrEqualityMods=function(e){for(var t=0,n=arguments.length;t<n;t++)e=arguments[t],delete this.attrEqualityMods[e];return this},r.prototype.enableSubstitutes=function(){return this.substitutesEnabled=!0,this},r.prototype.disableSubstitutes=function(){return this.substitutesEnabled=!1,this};var u={\"!\":!0,'\"':!0,\"#\":!0,$:!0,\"%\":!0,\"&\":!0,\"'\":!0,\"(\":!0,\")\":!0,\"*\":!0,\"+\":!0,\",\":!0,\".\":!0,\"/\":!0,\";\":!0,\"<\":!0,\"=\":!0,\">\":!0,\"?\":!0,\"@\":!0,\"[\":!0,\"\\\\\":!0,\"]\":!0,\"^\":!0,\"`\":!0,\"{\":!0,\"|\":!0,\"}\":!0,\"~\":!0},i={\"\\n\":\"\\\\n\",\"\\r\":\"\\\\r\",\"\\t\":\"\\\\t\",\"\\f\":\"\\\\f\",\"\\v\":\"\\\\v\"},y={n:\"\\n\",r:\"\\r\",t:\"\\t\",f:\"\\f\",\"\\\\\":\"\\\\\",\"'\":\"'\"},v={n:\"\\n\",r:\"\\r\",t:\"\\t\",f:\"\\f\",\"\\\\\":\"\\\\\",'\"':'\"'};function a(s,l,c,d,a,m){var p,f,h,b,g;return b=s.length,p=null,h=function(e,t){var n,r,a;for(a=\"\",l++,p=s.charAt(l);l<b;){if(p===e)return l++,a;if(\"\\\\\"===p)if(l++,(p=s.charAt(l))===e)a+=e;else if(n=t[p])a+=n;else{if(o(p)){for(r=p,l++,p=s.charAt(l);o(p);)r+=p,l++,p=s.charAt(l);\" \"===p&&(l++,p=s.charAt(l)),a+=String.fromCharCode(parseInt(r,16));continue}a+=p}else a+=p;l++,p=s.charAt(l)}return a},f=function(){var e,t=\"\";for(p=s.charAt(l);l<b;){if(\"a\"<=(e=p)&&e<=\"z\"||\"A\"<=e&&e<=\"Z\"||\"0\"<=e&&e<=\"9\"||\"-\"===e||\"_\"===e)t+=p;else{if(\"\\\\\"!==p)return t;if(b<=++l)throw Error(\"Expected symbol but end of file reached.\");if(p=s.charAt(l),u[p])t+=p;else{if(o(p)){var n=p;for(l++,p=s.charAt(l);o(p);)n+=p,l++,p=s.charAt(l);\" \"===p&&(l++,p=s.charAt(l)),t+=String.fromCharCode(parseInt(n,16));continue}t+=p}}l++,p=s.charAt(l)}return t},g=function(){p=s.charAt(l);for(var e=!1;\" \"===p||\"\\t\"===p||\"\\n\"===p||\"\\r\"===p||\"\\f\"===p;)e=!0,l++,p=s.charAt(l);return e},this.parse=function(){var e=this.parseSelector();if(l<b)throw Error('Rule expected but \"'+s.charAt(l)+'\" found.');return e},this.parseSelector=function(){var e,t=e=this.parseSingleSelector();for(p=s.charAt(l);\",\"===p;){if(l++,g(),\"selectors\"!==e.type&&(e={type:\"selectors\",selectors:[t]}),!(t=this.parseSingleSelector()))throw Error('Rule expected after \",\".');e.selectors.push(t)}return e},this.parseSingleSelector=function(){g();var e={type:\"ruleSet\"},t=this.parseRule();if(!t)return null;for(var n=e;t&&(t.type=\"rule\",n.rule=t,n=t,g(),p=s.charAt(l),!(b<=l||\",\"===p||\")\"===p));)if(a[p]){var r=p;if(l++,g(),!(t=this.parseRule()))throw Error('Rule expected after \"'+r+'\".');t.nestingOperator=r}else(t=this.parseRule())&&(t.nestingOperator=null);return e},this.parseRule=function(){for(var e,t=null;l<b;)if(\"*\"===(p=s.charAt(l)))l++,(t=t||{}).tagName=\"*\";else if(\"a\"<=(e=p)&&e<=\"z\"||\"A\"<=e&&e<=\"Z\"||\"-\"===e||\"_\"===e||\"\\\\\"===p)(t=t||{}).tagName=f();else if(\".\"===p)l++,((t=t||{}).classNames=t.classNames||[]).push(f());else if(\"#\"===p)l++,(t=t||{}).id=f();else if(\"[\"===p){l++,g();var n={name:f()};if(g(),\"]\"===p)l++;else{var r=\"\";if(d[p]&&(r=p,l++,p=s.charAt(l)),b<=l)throw Error('Expected \"=\" but end of file reached.');if(\"=\"!==p)throw Error('Expected \"=\" but \"'+p+'\" found.');n.operator=r+\"=\",l++,g();var a=\"\";if(n.valueType=\"string\",'\"'===p)a=h('\"',v);else if(\"'\"===p)a=h(\"'\",y);else if(m&&\"$\"===p)l++,a=f(),n.valueType=\"substitute\";else{for(;l<b&&\"]\"!==p;)a+=p,l++,p=s.charAt(l);a=a.trim()}if(g(),b<=l)throw Error('Expected \"]\" but end of file reached.');if(\"]\"!==p)throw Error('Expected \"]\" but \"'+p+'\" found.');l++,n.value=a}((t=t||{}).attrs=t.attrs||[]).push(n)}else{if(\":\"!==p)break;l++;var o=f(),i={name:o};if(\"(\"===p){l++;var u=\"\";if(g(),\"selector\"===c[o])i.valueType=\"selector\",u=this.parseSelector();else{if(i.valueType=c[o]||\"string\",'\"'===p)u=h('\"',v);else if(\"'\"===p)u=h(\"'\",y);else if(m&&\"$\"===p)l++,u=f(),i.valueType=\"substitute\";else{for(;l<b&&\")\"!==p;)u+=p,l++,p=s.charAt(l);u=u.trim()}g()}if(b<=l)throw Error('Expected \")\" but end of file reached.');if(\")\"!==p)throw Error('Expected \")\" but \"'+p+'\" found.');l++,i.value=u}((t=t||{}).pseudos=t.pseudos||[]).push(i)}return t},this}r.prototype.parse=function(e){return new a(e,0,this.pseudos,this.attrEqualityMods,this.ruleNestingOperators,this.substitutesEnabled).parse()},r.prototype.escapeIdentifier=function(e){for(var t=\"\",n=0,r=e.length;n<r;){var a=e.charAt(n);if(u[a])t+=\"\\\\\"+a;else if(\"_\"===a||\"-\"===a||\"A\"<=a&&a<=\"Z\"||\"a\"<=a&&a<=\"z\"||0!==n&&\"0\"<=a&&a<=\"9\")t+=a;else{var o=a.charCodeAt(0);if(55296==(63488&o)){var i=e.charCodeAt(n++);if(55296!=(64512&o)||56320!=(64512&i))throw Error(\"UCS-2(decode): illegal sequence\");o=((1023&o)<<10)+(1023&i)+65536}t+=\"\\\\\"+o.toString(16)+\" \"}n++}return t},r.prototype.escapeStr=function(e){for(var t,n,r=\"\",a=0,o=e.length;a<o;)'\"'===(t=e.charAt(a))?t='\\\\\"':\"\\\\\"===t?t=\"\\\\\\\\\":(n=i[t])&&(t=n),r+=t,a++;return'\"'+r+'\"'},r.prototype.render=function(e){return this._renderEntity(e).trim()},r.prototype._renderEntity=function(e){var t,n,r;switch(r=\"\",e.type){case\"ruleSet\":for(t=e.rule,n=[];t;)t.nestingOperator&&n.push(t.nestingOperator),n.push(this._renderEntity(t)),t=t.rule;r=n.join(\" \");break;case\"selectors\":r=e.selectors.map(this._renderEntity,this).join(\", \");break;case\"rule\":e.tagName&&(r=\"*\"===e.tagName?\"*\":this.escapeIdentifier(e.tagName)),e.id&&(r+=\"#\"+this.escapeIdentifier(e.id)),e.classNames&&(r+=e.classNames.map(function(e){return\".\"+this.escapeIdentifier(e)},this).join(\"\")),e.attrs&&(r+=e.attrs.map(function(e){return e.operator?\"substitute\"===e.valueType?\"[\"+this.escapeIdentifier(e.name)+e.operator+\"$\"+e.value+\"]\":\"[\"+this.escapeIdentifier(e.name)+e.operator+this.escapeStr(e.value)+\"]\":\"[\"+this.escapeIdentifier(e.name)+\"]\"},this).join(\"\")),e.pseudos&&(r+=e.pseudos.map(function(e){return e.valueType?\"selector\"===e.valueType?\":\"+this.escapeIdentifier(e.name)+\"(\"+this._renderEntity(e.value)+\")\":\"substitute\"===e.valueType?\":\"+this.escapeIdentifier(e.name)+\"($\"+e.value+\")\":\"numeric\"===e.valueType?\":\"+this.escapeIdentifier(e.name)+\"(\"+e.value+\")\":\":\"+this.escapeIdentifier(e.name)+\"(\"+this.escapeIdentifier(e.value)+\")\":\":\"+this.escapeIdentifier(e.name)},this).join(\"\"));break;default:throw Error('Unknown entity type: \"'+e.type(NaN))}return r},n.CssSelectorParser=r},{}],30:[function(e,t,n){!function(){\"use strict\";var s,l={name:\"doT\",version:\"1.1.1\",templateSettings:{evaluate:/\\{\\{([\\s\\S]+?(\\}?)+)\\}\\}/g,interpolate:/\\{\\{=([\\s\\S]+?)\\}\\}/g,encode:/\\{\\{!([\\s\\S]+?)\\}\\}/g,use:/\\{\\{#([\\s\\S]+?)\\}\\}/g,useParams:/(^|[^\\w$])def(?:\\.|\\[[\\'\\\"])([\\w$\\.]+)(?:[\\'\\\"]\\])?\\s*\\:\\s*([\\w$\\.]+|\\\"[^\\\"]+\\\"|\\'[^\\']+\\'|\\{[^\\}]+\\})/g,define:/\\{\\{##\\s*([\\w\\.$]+)\\s*(\\:|=)([\\s\\S]+?)#\\}\\}/g,defineParams:/^\\s*([\\w$]+):([\\s\\S]+)/,conditional:/\\{\\{\\?(\\?)?\\s*([\\s\\S]*?)\\s*\\}\\}/g,iterate:/\\{\\{~\\s*(?:\\}\\}|([\\s\\S]+?)\\s*\\:\\s*([\\w$]+)\\s*(?:\\:\\s*([\\w$]+))?\\s*\\}\\})/g,varname:\"it\",strip:!0,append:!0,selfcontained:!1,doNotSkipEncoded:!1},template:void 0,compile:void 0,log:!0};l.encodeHTMLSource=function(e){var t={\"&\":\"&#38;\",\"<\":\"&#60;\",\">\":\"&#62;\",'\"':\"&#34;\",\"'\":\"&#39;\",\"/\":\"&#47;\"},n=e?/[&<>\"'\\/]/g:/&(?!#?\\w+;)|<|>|\"|'|\\//g;return function(e){return e?e.toString().replace(n,function(e){return t[e]||e}):\"\"}},s=function(){return this||(0,eval)(\"this\")}(),void 0!==t&&t.exports?t.exports=l:\"function\"==typeof define&&define.amd?define(function(){return l}):s.doT=l;var c={append:{start:\"'+(\",end:\")+'\",startencode:\"'+encodeHTML(\"},split:{start:\"';out+=(\",end:\");out+='\",startencode:\"';out+=encodeHTML(\"}},d=/$^/;function m(e){return e.replace(/\\\\('|\\\\)/g,\"$1\").replace(/[\\r\\t\\n]/g,\" \")}l.template=function(e,t,n){var r,a,o=(t=t||l.templateSettings).append?c.append:c.split,i=0,u=t.use||t.define?function r(a,e,o){return(\"string\"==typeof e?e:e.toString()).replace(a.define||d,function(e,r,t,n){return 0===r.indexOf(\"def.\")&&(r=r.substring(4)),r in o||(\":\"===t?(a.defineParams&&n.replace(a.defineParams,function(e,t,n){o[r]={arg:t,text:n}}),r in o||(o[r]=n)):new Function(\"def\",\"def['\"+r+\"']=\"+n)(o)),\"\"}).replace(a.use||d,function(e,t){a.useParams&&(t=t.replace(a.useParams,function(e,t,n,r){if(o[n]&&o[n].arg&&r){var a=(n+\":\"+r).replace(/'|\\\\/g,\"_\");return o.__exp=o.__exp||{},o.__exp[a]=o[n].text.replace(new RegExp(\"(^|[^\\\\w$])\"+o[n].arg+\"([^\\\\w$])\",\"g\"),\"$1\"+r+\"$2\"),t+\"def.__exp['\"+a+\"']\"}}));var n=new Function(\"def\",\"return \"+t)(o);return n?r(a,n,o):n})}(t,e,n||{}):e;u=(\"var out='\"+(t.strip?u.replace(/(^|\\r|\\n)\\t* +| +\\t*(\\r|\\n|$)/g,\" \").replace(/\\r|\\n|\\t|\\/\\*[\\s\\S]*?\\*\\//g,\"\"):u).replace(/'|\\\\/g,\"\\\\$&\").replace(t.interpolate||d,function(e,t){return o.start+m(t)+o.end}).replace(t.encode||d,function(e,t){return r=!0,o.startencode+m(t)+o.end}).replace(t.conditional||d,function(e,t,n){return t?n?\"';}else if(\"+m(n)+\"){out+='\":\"';}else{out+='\":n?\"';if(\"+m(n)+\"){out+='\":\"';}out+='\"}).replace(t.iterate||d,function(e,t,n,r){return t?(i+=1,a=r||\"i\"+i,t=m(t),\"';var arr\"+i+\"=\"+t+\";if(arr\"+i+\"){var \"+n+\",\"+a+\"=-1,l\"+i+\"=arr\"+i+\".length-1;while(\"+a+\"<l\"+i+\"){\"+n+\"=arr\"+i+\"[\"+a+\"+=1];out+='\"):\"';} } out+='\"}).replace(t.evaluate||d,function(e,t){return\"';\"+m(t)+\"out+='\"})+\"';return out;\").replace(/\\n/g,\"\\\\n\").replace(/\\t/g,\"\\\\t\").replace(/\\r/g,\"\\\\r\").replace(/(\\s|;|\\}|^|\\{)out\\+='';/g,\"$1\").replace(/\\+''/g,\"\"),r&&(t.selfcontained||!s||s._encodeHTML||(s._encodeHTML=l.encodeHTMLSource(t.doNotSkipEncoded)),u=\"var encodeHTML = typeof _encodeHTML !== 'undefined' ? _encodeHTML : (\"+l.encodeHTMLSource.toString()+\"(\"+(t.doNotSkipEncoded||\"\")+\"));\"+u);try{return new Function(t.varname,u)}catch(e){throw\"undefined\"!=typeof console&&console.log(\"Could not create a template function: \"+u),e}},l.compile=function(e,t){return l.template(e,null,t)}}()},{}],31:[function(e,t,n){\"use strict\";t.exports=function(){return/\\uD83C\\uDFF4\\uDB40\\uDC67\\uDB40\\uDC62(?:\\uDB40\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67|\\uDB40\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDB40\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73)\\uDB40\\uDC7F|\\uD83D\\uDC68(?:\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C\\uDFFB|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFE])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83D\\uDC68|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D[\\uDC66\\uDC67])|[\\u2695\\u2696\\u2708]\\uFE0F|\\uD83D[\\uDC66\\uDC67]|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|(?:\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708])\\uFE0F|\\uD83C\\uDFFB\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C[\\uDFFB-\\uDFFF])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFB\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)\\uD83C\\uDFFB|\\uD83E\\uDDD1(?:\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1)|(?:\\uD83E\\uDDD1\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69]))(?:\\uD83C[\\uDFFB-\\uDFFE])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83D\\uDC69(?:\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFB\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFC-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D(?:\\uD83D[\\uDC68\\uDC69])|\\uD83D[\\uDC68\\uDC69])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]))|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|(?:\\uD83E\\uDDD1\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8|\\uD83D\\uDC69(?:\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\u200D[\\u2695\\u2696\\u2708])|(?:(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)\\uFE0F|\\uD83D\\uDC6F|\\uD83E[\\uDD3C\\uDDDE\\uDDDF])\\u200D[\\u2640\\u2642]|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|\\u200D[\\u2640\\u2642])|\\uD83C\\uDFF4\\u200D\\u2620)\\uFE0F|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83C\\uDFF3\\uFE0F\\u200D\\uD83C\\uDF08|\\uD83D\\uDC15\\u200D\\uD83E\\uDDBA|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67|\\uD83C\\uDDFD\\uD83C\\uDDF0|\\uD83C\\uDDF4\\uD83C\\uDDF2|\\uD83C\\uDDF6\\uD83C\\uDDE6|[#\\*0-9]\\uFE0F\\u20E3|\\uD83C\\uDDE7(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDF9(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF])|\\uD83C\\uDDEA(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA])|\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF7(?:\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC])|\\uD83D\\uDC69(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF2(?:\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF])|\\uD83C\\uDDE6(?:\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF])|\\uD83C\\uDDF0(?:\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDED(?:\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA])|\\uD83C\\uDDE9(?:\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF])|\\uD83C\\uDDFE(?:\\uD83C[\\uDDEA\\uDDF9])|\\uD83C\\uDDEC(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE])|\\uD83C\\uDDF8(?:\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF])|\\uD83C\\uDDEB(?:\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7])|\\uD83C\\uDDF5(?:\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE])|\\uD83C\\uDDFB(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA])|\\uD83C\\uDDF3(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF])|\\uD83C\\uDDE8(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF5\\uDDF7\\uDDFA-\\uDDFF])|\\uD83C\\uDDF1(?:\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE])|\\uD83C\\uDDFF(?:\\uD83C[\\uDDE6\\uDDF2\\uDDFC])|\\uD83C\\uDDFC(?:\\uD83C[\\uDDEB\\uDDF8])|\\uD83C\\uDDFA(?:\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF])|\\uD83C\\uDDEE(?:\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9])|\\uD83C\\uDDEF(?:\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5])|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u261D\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2\\uDFC7]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC70\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDCAA\\uDD74\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1C\\uDD1E\\uDD1F\\uDD30-\\uDD36\\uDDB5\\uDDB6\\uDDBB\\uDDD2-\\uDDD5])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u231A\\u231B\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u25FE\\u2614\\u2615\\u2648-\\u2653\\u267F\\u2693\\u26A1\\u26AA\\u26AB\\u26BD\\u26BE\\u26C4\\u26C5\\u26CE\\u26D4\\u26EA\\u26F2\\u26F3\\u26F5\\u26FA\\u26FD\\u2705\\u270A\\u270B\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2795-\\u2797\\u27B0\\u27BF\\u2B1B\\u2B1C\\u2B50\\u2B55]|\\uD83C[\\uDC04\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF7C\\uDF7E-\\uDF93\\uDFA0-\\uDFCA\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF4\\uDFF8-\\uDFFF]|\\uD83D[\\uDC00-\\uDC3E\\uDC40\\uDC42-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDD7A\\uDD95\\uDD96\\uDDA4\\uDDFB-\\uDE4F\\uDE80-\\uDEC5\\uDECC\\uDED0-\\uDED2\\uDED5\\uDEEB\\uDEEC\\uDEF4-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])|(?:[#\\*0-9\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23E9-\\u23F3\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB-\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u261D\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A1\\u26AA\\u26AB\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C5\\u26C8\\u26CE\\u26CF\\u26D1\\u26D3\\u26D4\\u26E9\\u26EA\\u26F0-\\u26F5\\u26F7-\\u26FA\\u26FD\\u2702\\u2705\\u2708-\\u270D\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2728\\u2733\\u2734\\u2744\\u2747\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2763\\u2764\\u2795-\\u2797\\u27A1\\u27B0\\u27BF\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B50\\u2B55\\u3030\\u303D\\u3297\\u3299]|\\uD83C[\\uDC04\\uDCCF\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE1A\\uDE2F\\uDE32-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF21\\uDF24-\\uDF93\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E-\\uDFF0\\uDFF3-\\uDFF5\\uDFF7-\\uDFFF]|\\uD83D[\\uDC00-\\uDCFD\\uDCFF-\\uDD3D\\uDD49-\\uDD4E\\uDD50-\\uDD67\\uDD6F\\uDD70\\uDD73-\\uDD7A\\uDD87\\uDD8A-\\uDD8D\\uDD90\\uDD95\\uDD96\\uDDA4\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA-\\uDE4F\\uDE80-\\uDEC5\\uDECB-\\uDED2\\uDED5\\uDEE0-\\uDEE5\\uDEE9\\uDEEB\\uDEEC\\uDEF0\\uDEF3-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])\\uFE0F|(?:[\\u261D\\u26F9\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2-\\uDFC4\\uDFC7\\uDFCA-\\uDFCC]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66-\\uDC78\\uDC7C\\uDC81-\\uDC83\\uDC85-\\uDC87\\uDC8F\\uDC91\\uDCAA\\uDD74\\uDD75\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE45-\\uDE47\\uDE4B-\\uDE4F\\uDEA3\\uDEB4-\\uDEB6\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1F\\uDD26\\uDD30-\\uDD39\\uDD3C-\\uDD3E\\uDDB5\\uDDB6\\uDDB8\\uDDB9\\uDDBB\\uDDCD-\\uDDCF\\uDDD1-\\uDDDD])/g}},{}],32:[function(V,n,r){(function(P,U){var e,t;e=this,t=function(){\"use strict\";function s(e){return\"function\"==typeof e}var n=Array.isArray?Array.isArray:function(e){return\"[object Array]\"===Object.prototype.toString.call(e)},r=0,t=void 0,a=void 0,i=function(e,t){m[r]=e,m[r+1]=t,2===(r+=2)&&(a?a(p):y())};var e=void 0!==window?window:void 0,o=e||{},u=o.MutationObserver||o.WebKitMutationObserver,l=\"undefined\"==typeof self&&void 0!==P&&\"[object process]\"==={}.toString.call(P),c=\"undefined\"!=typeof Uint8ClampedArray&&\"undefined\"!=typeof importScripts&&\"undefined\"!=typeof MessageChannel;function d(){var e=setTimeout;return function(){return e(p,1)}}var m=new Array(1e3);function p(){for(var e=0;e<r;e+=2){(0,m[e])(m[e+1]),m[e]=void 0,m[e+1]=void 0}r=0}var f,h,b,g,y=void 0;function v(e,t){var n=this,r=new this.constructor(k);void 0===r[w]&&O(r);var a=n._state;if(a){var o=arguments[a-1];i(function(){return S(a,r,o,n._result)})}else N(n,r,e,t);return r}function D(e){if(e&&\"object\"==typeof e&&e.constructor===this)return e;var t=new this(k);return F(t,e),t}y=l?function(){return P.nextTick(p)}:u?(h=0,b=new u(p),g=document.createTextNode(\"\"),b.observe(g,{characterData:!0}),function(){g.data=h=++h%2}):c?((f=new MessageChannel).port1.onmessage=p,function(){return f.port2.postMessage(0)}):void 0===e&&\"function\"==typeof V?function(){try{var e=Function(\"return this\")().require(\"vertx\");return void 0!==(t=e.runOnLoop||e.runOnContext)?function(){t(p)}:d()}catch(e){return d()}}():d();var w=Math.random().toString(36).substring(2);function k(){}var x=void 0,E=1,C=2;function A(e,t,n){t.constructor===e.constructor&&n===v&&t.constructor.resolve===D?function(t,e){e._state===E?z(t,e._result):e._state===C?q(t,e._result):N(e,void 0,function(e){return F(t,e)},function(e){return q(t,e)})}(e,t):void 0===n?z(e,t):s(n)?function(e,r,a){i(function(t){var n=!1,e=function(e,t,n,r){try{e.call(t,n,r)}catch(e){return e}}(a,r,function(e){n||(n=!0,r!==e?F(t,e):z(t,e))},function(e){n||(n=!0,q(t,e))},t._label);!n&&e&&(n=!0,q(t,e))},e)}(e,t,n):z(e,t)}function F(t,e){if(t===e)q(t,new TypeError(\"You cannot resolve a promise with itself\"));else if(function(e){var t=typeof e;return null!==e&&(\"object\"==t||\"function\"==t)}(e)){var n=void 0;try{n=e.then}catch(e){return void q(t,e)}A(t,e,n)}else z(t,e)}function j(e){e._onerror&&e._onerror(e._result),T(e)}function z(e,t){e._state===x&&(e._result=t,e._state=E,0!==e._subscribers.length&&i(T,e))}function q(e,t){e._state===x&&(e._state=C,e._result=t,i(j,e))}function N(e,t,n,r){var a=e._subscribers,o=a.length;e._onerror=null,a[o]=t,a[o+E]=n,a[o+C]=r,0===o&&e._state&&i(T,e)}function T(e){var t=e._subscribers,n=e._state;if(0!==t.length){for(var r=void 0,a=void 0,o=e._result,i=0;i<t.length;i+=3)r=t[i],a=t[i+n],r?S(n,r,a,o):a(o);e._subscribers.length=0}}function S(e,t,n,r){var a=s(n),o=void 0,i=void 0,u=!0;if(a){try{o=n(r)}catch(e){u=!1,i=e}if(t===o)return void q(t,new TypeError(\"A promises callback cannot return that same promise.\"))}else o=r;t._state!==x||(a&&u?F(t,o):!1===u?q(t,i):e===E?z(t,o):e===C&&q(t,o))}var R=0;function O(e){e[w]=R++,e._state=void 0,e._result=void 0,e._subscribers=[]}var _=(B.prototype._enumerate=function(e){for(var t=0;this._state===x&&t<e.length;t++)this._eachEntry(e[t],t)},B.prototype._eachEntry=function(t,e){var n=this._instanceConstructor,r=n.resolve;if(r===D){var a=void 0,o=void 0,i=!1;try{a=t.then}catch(e){i=!0,o=e}if(a===v&&t._state!==x)this._settledAt(t._state,e,t._result);else if(\"function\"!=typeof a)this._remaining--,this._result[e]=t;else if(n===L){var u=new n(k);i?q(u,o):A(u,t,a),this._willSettleAt(u,e)}else this._willSettleAt(new n(function(e){return e(t)}),e)}else this._willSettleAt(r(t),e)},B.prototype._settledAt=function(e,t,n){var r=this.promise;r._state===x&&(this._remaining--,e===C?q(r,n):this._result[t]=n),0===this._remaining&&z(r,this._result)},B.prototype._willSettleAt=function(e,t){var n=this;N(e,void 0,function(e){return n._settledAt(E,t,e)},function(e){return n._settledAt(C,t,e)})},B);function B(e,t){this._instanceConstructor=e,this.promise=new e(k),this.promise[w]||O(this.promise),n(t)?(this.length=t.length,this._remaining=t.length,this._result=new Array(this.length),0===this.length?z(this.promise,this._result):(this.length=this.length||0,this._enumerate(t),0===this._remaining&&z(this.promise,this._result))):q(this.promise,new Error(\"Array Methods must be provided an Array\"))}var L=(I.prototype.catch=function(e){return this.then(null,e)},I.prototype.finally=function(t){var n=this.constructor;return s(t)?this.then(function(e){return n.resolve(t()).then(function(){return e})},function(e){return n.resolve(t()).then(function(){throw e})}):this.then(t,t)},I);function I(e){this[w]=R++,this._result=this._state=void 0,this._subscribers=[],k!==e&&(\"function\"!=typeof e&&function(){throw new TypeError(\"You must pass a resolver function as the first argument to the promise constructor\")}(),this instanceof I?function(t,e){try{e(function(e){F(t,e)},function(e){q(t,e)})}catch(e){q(t,e)}}(this,e):function(){throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\")}())}return L.prototype.then=v,L.all=function(e){return new _(this,e).promise},L.race=function(a){var o=this;return n(a)?new o(function(e,t){for(var n=a.length,r=0;r<n;r++)o.resolve(a[r]).then(e,t)}):new o(function(e,t){return t(new TypeError(\"You must pass an array to race.\"))})},L.resolve=D,L.reject=function(e){var t=new this(k);return q(t,e),t},L._setScheduler=function(e){a=e},L._setAsap=function(e){i=e},L._asap=i,L.polyfill=function(){var e=void 0;if(void 0!==U)e=U;else if(\"undefined\"!=typeof self)e=self;else try{e=Function(\"return this\")()}catch(e){throw new Error(\"polyfill failed because global object is unavailable in this environment\")}var t=e.Promise;if(t){var n=null;try{n=Object.prototype.toString.call(t.resolve())}catch(e){}if(\"[object Promise]\"===n&&!t.cast)return}e.Promise=L},L.Promise=L},\"object\"==typeof r&&void 0!==n?n.exports=t():\"function\"==typeof define&&define.amd?define(t):e.ES6Promise=t()}).call(this,V(\"_process\"),void 0!==a?a:\"undefined\"!=typeof self?self:void 0!==window?window:{})},{_process:33}],33:[function(e,t,n){var r,a,o=t.exports={};function i(){throw new Error(\"setTimeout has not been defined\")}function u(){throw new Error(\"clearTimeout has not been defined\")}function s(t){if(r===setTimeout)return setTimeout(t,0);if((r===i||!r)&&setTimeout)return r=setTimeout,setTimeout(t,0);try{return r(t,0)}catch(e){try{return r.call(null,t,0)}catch(e){return r.call(this,t,0)}}}!function(){try{r=\"function\"==typeof setTimeout?setTimeout:i}catch(e){r=i}try{a=\"function\"==typeof clearTimeout?clearTimeout:u}catch(e){a=u}}();var l,c=[],d=!1,m=-1;function p(){d&&l&&(d=!1,l.length?c=l.concat(c):m=-1,c.length&&f())}function f(){if(!d){var e=s(p);d=!0;for(var t=c.length;t;){for(l=c,c=[];++m<t;)l&&l[m].run();m=-1,t=c.length}l=null,d=!1,function(t){if(a===clearTimeout)return clearTimeout(t);if((a===u||!a)&&clearTimeout)return a=clearTimeout,clearTimeout(t);try{a(t)}catch(e){try{return a.call(null,t)}catch(e){return a.call(this,t)}}}(e)}}function h(e,t){this.fun=e,this.array=t}function b(){}o.nextTick=function(e){var t=new Array(arguments.length-1);if(1<arguments.length)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];c.push(new h(e,t)),1!==c.length||d||s(f)},h.prototype.run=function(){this.fun.apply(null,this.array)},o.title=\"browser\",o.browser=!0,o.env={},o.argv=[],o.version=\"\",o.versions={},o.on=b,o.addListener=b,o.once=b,o.off=b,o.removeListener=b,o.removeAllListeners=b,o.emit=b,o.prependListener=b,o.prependOnceListener=b,o.listeners=function(e){return[]},o.binding=function(e){throw new Error(\"process.binding is not supported\")},o.cwd=function(){return\"/\"},o.chdir=function(e){throw new Error(\"process.chdir is not supported\")},o.umask=function(){return 0}},{}],34:[function(e,t,n){(function(e){!function(e){\"use strict\";if(!e.WeakMap){var n=Object.prototype.hasOwnProperty,r=function(e,t,n){Object.defineProperty?Object.defineProperty(e,t,{configurable:!0,writable:!0,value:n}):e[t]=n};e.WeakMap=(r(t.prototype,\"delete\",function(e){if(a(this,\"delete\"),!i(e))return!1;var t=e[this._id];return!(!t||t[0]!==e||(delete e[this._id],0))}),r(t.prototype,\"get\",function(e){if(a(this,\"get\"),i(e)){var t=e[this._id];return t&&t[0]===e?t[1]:void 0}}),r(t.prototype,\"has\",function(e){if(a(this,\"has\"),!i(e))return!1;var t=e[this._id];return!(!t||t[0]!==e)}),r(t.prototype,\"set\",function(e,t){if(a(this,\"set\"),!i(e))throw new TypeError(\"Invalid value used as weak map key\");var n=e[this._id];return n&&n[0]===e?n[1]=t:r(e,this._id,[e,t]),this}),r(t,\"_polyfill\",!0),t)}function t(){if(void 0===this)throw new TypeError(\"Constructor WeakMap requires 'new'\");if(r(this,\"_id\",function(e){return e+\"_\"+o()+\".\"+o()}(\"_WeakMap\")),0<arguments.length)throw new TypeError(\"WeakMap iterable is not supported\")}function a(e,t){if(!i(e)||!n.call(e,\"_id\"))throw new TypeError(t+\" method called on incompatible receiver \"+typeof e)}function o(){return Math.random().toString().substring(2)}function i(e){return Object(e)===e}}(\"undefined\"!=typeof self?self:void 0!==window?window:void 0!==e?e:this)}).call(this,void 0!==a?a:\"undefined\"!=typeof self?self:void 0!==window?window:{})},{}]},{},[1]);var utils=axe.utils={},u={};function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function t(e,t,n){\"use strict\";var r,a;for(r=0,a=e.length;r<a;r++)t[n](e[r])}function n(e){this.brand=\"axe\",this.application=\"axeAPI\",this.tagExclude=[\"experimental\"],this.defaultConfig=e,this._init(),this._defaultLocale=null}n.prototype._setDefaultLocale=function(){if(!this._defaultLocale){for(var e={checks:{},rules:{}},t=Object.keys(this.data.checks),n=0;n<t.length;n++){var r=t[n],a=this.data.checks[r].messages,o=a.pass,i=a.fail,u=a.incomplete;e.checks[r]={pass:o,fail:i,incomplete:u}}for(var s=Object.keys(this.data.rules),l=0;l<s.length;l++){var c=s[l],d=this.data.rules[c],m=d.description,p=d.help;e.rules[c]={description:m,help:p}}this._defaultLocale=e}},n.prototype._resetLocale=function(){var e=this._defaultLocale;e&&this.applyLocale(e)};function c(a,e,o){return o.performanceTimer&&axe.utils.performanceTimer.mark(\"mark_rule_start_\"+a.id),function(n,r){a.run(e,o,function(e){n(e)},function(e){if(o.debug)r(e);else{var t=Object.assign(new f(a),{result:axe.constants.CANTTELL,description:\"An error occured while running this rule\",message:e.message,stack:e.stack,error:e,errorNode:e.errorNode});n(t)}})}}function o(e,t,n){var r=e.brand,a=e.application;return axe.constants.helpUrlBase+r+\"/\"+(n||axe.version.substring(0,axe.version.lastIndexOf(\".\")))+\"/\"+t+\"?application=\"+a}function d(e){\"use strict\";this.id=e.id,this.data=null,this.relatedNodes=[],this.result=null}function r(e){\"use strict\";return\"string\"==typeof e?new Function(\"return \"+e+\";\")():e}function i(e){e&&(this.id=e.id,this.configure(e))}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function s(e,t,n){\"use strict\";var r,a;e.frames=e.frames||[];var o=document.querySelectorAll(n.shift());e:for(var i=0,u=o.length;i<u;i++){a=o[i];for(var s=0,l=e.frames.length;s<l;s++)if(e.frames[s].node===a){e.frames[s][t].push(n);break e}r={node:a,include:[],exclude:[]},n&&r[t].push(n),e.frames.push(r)}}function m(e,t){\"use strict\";for(var n,r,a=[],o=0,i=e[t].length;o<i;o++){if(\"string\"==typeof(n=e[t][o])){r=Array.from(document.querySelectorAll(n)),a=a.concat(r.map(function(e){return axe.utils.getNodeFromTree(e)}));break}!n||!n.length||n instanceof Node?n instanceof Node&&(n.documentElement instanceof Node?a.push(e.flatTree[0]):a.push(axe.utils.getNodeFromTree(n))):1<n.length?s(e,t,n):(r=Array.from(document.querySelectorAll(n[0])),a=a.concat(r.map(function(e){return axe.utils.getNodeFromTree(e)})))}return a.filter(function(e){return e})}function p(e){\"use strict\";var t=this;this.frames=[],this.initiator=!e||\"boolean\"!=typeof e.initiator||e.initiator,this.page=!1,e=function(e){\"use strict\";if(e&&\"object\"===S(e)||e instanceof NodeList){if(e instanceof Node)return{include:[e],exclude:[]};if(e.hasOwnProperty(\"include\")||e.hasOwnProperty(\"exclude\"))return{include:e.include&&+e.include.length?e.include:[document],exclude:e.exclude||[]};if(e.length===+e.length)return{include:e,exclude:[]}}return\"string\"==typeof e?{include:[e],exclude:[]}:{include:[document],exclude:[]}}(e),this.flatTree=axe.utils.getFlattenedTree(function(e){var t=e.include,n=e.exclude;return(Array.from(t).concat(Array.from(n)).reduce(function(e,t){return e||(t instanceof Element?t.ownerDocument:t instanceof Document?t:void 0)},null)||document).documentElement}(e)),this.exclude=e.exclude,this.include=e.include,this.include=m(this,\"include\"),this.exclude=m(this,\"exclude\"),axe.utils.select(\"frame, iframe\",this).forEach(function(e){Be(e,t)&&function(e,t){\"use strict\";axe.utils.isHidden(t)||axe.utils.findBy(e,\"node\",t)||e.push({node:t,include:[],exclude:[]})}(t.frames,e.actualNode)}),1===this.include.length&&this.include[0].actualNode===document.documentElement&&(this.page=!0);var n=function(e){\"use strict\";if(0===e.include.length){if(0===e.frames.length){var t=axe.utils.respondable.isInFrame()?\"frame\":\"page\";return new Error(\"No elements found for include in \"+t+\" Context\")}e.frames.forEach(function(e,t){if(0===e.include.length)return new Error(\"No elements found for include in Context of frame \"+t)})}}(this);if(n instanceof Error)throw n;Array.isArray(this.include)||(this.include=Array.from(this.include)),this.include.sort(axe.utils.nodeSorter)}function f(e){\"use strict\";this.id=e.id,this.result=axe.constants.NA,this.pageLevel=e.pageLevel,this.impact=null,this.nodes=[]}function h(e,t){\"use strict\";this._audit=t,this.id=e.id,this.selector=e.selector||\"*\",this.excludeHidden=\"boolean\"!=typeof e.excludeHidden||e.excludeHidden,this.enabled=\"boolean\"!=typeof e.enabled||e.enabled,this.pageLevel=\"boolean\"==typeof e.pageLevel&&e.pageLevel,this.any=e.any||[],this.all=e.all||[],this.none=e.none||[],this.tags=e.tags||[],this.preload=!!e.preload,e.matches&&(this.matches=r(e.matches))}function b(e){if(e.length){var n=!1,r={};return e.forEach(function(e){var t=e.results.filter(function(e){return e});(r[e.type]=t).length&&(n=!0)}),n?r:null}}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function g(e){return(g=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function y(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}function v(e,t){return(v=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function D(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function w(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function k(e,t,n){return t&&w(e.prototype,t),n&&w(e,n),e}n.prototype._applyCheckLocale=function(e){for(var t,n,r,a,o=Object.keys(e),i=0;i<o.length;i++){var u=o[i];if(!this.data.checks[u])throw new Error('Locale provided for unknown check: \"'.concat(u,'\"'));this.data.checks[u]=(t=this.data.checks[u],n=e[u],a=r=void 0,r=n.pass,a=n.fail,\"string\"==typeof r&&(r=axe.imports.doT.compile(r)),\"string\"==typeof a&&(a=axe.imports.doT.compile(a)),R({},t,{messages:{pass:r||t.messages.pass,fail:a||t.messages.fail,incomplete:\"object\"===S(t.messages.incomplete)?R({},t.messages.incomplete,n.incomplete):n.incomplete}}))}},n.prototype._applyRuleLocale=function(e){for(var t,n,r,a,o=Object.keys(e),i=0;i<o.length;i++){var u=o[i];if(!this.data.rules[u])throw new Error('Locale provided for unknown rule: \"'.concat(u,'\"'));this.data.rules[u]=(t=this.data.rules[u],n=e[u],a=r=void 0,r=n.help,a=n.description,\"string\"==typeof r&&(r=axe.imports.doT.compile(r)),\"string\"==typeof a&&(a=axe.imports.doT.compile(a)),R({},t,{help:r||t.help,description:a||t.description}))}},n.prototype.applyLocale=function(e){this._setDefaultLocale(),e.checks&&this._applyCheckLocale(e.checks),e.rules&&this._applyRuleLocale(e.rules)},n.prototype._init=function(){var e=function(e){\"use strict\";var t;return e?(t=axe.utils.clone(e)).commons=e.commons:t={},t.reporter=t.reporter||null,t.rules=t.rules||[],t.checks=t.checks||[],t.data=R({checks:{},rules:{}},t.data),t}(this.defaultConfig);axe.commons=e.commons,this.reporter=e.reporter,this.commands={},this.rules=[],this.checks={},t(e.rules,this,\"addRule\"),t(e.checks,this,\"addCheck\"),this.data={},this.data.checks=e.data&&e.data.checks||{},this.data.rules=e.data&&e.data.rules||{},this.data.failureSummaries=e.data&&e.data.failureSummaries||{},this.data.incompleteFallbackMessage=e.data&&e.data.incompleteFallbackMessage||\"\",this._constructHelpUrls()},n.prototype.registerCommand=function(e){\"use strict\";this.commands[e.id]=e.callback},n.prototype.addRule=function(e){\"use strict\";e.metadata&&(this.data.rules[e.id]=e.metadata);var t=this.getRule(e.id);t?t.configure(e):this.rules.push(new h(e,this))},n.prototype.addCheck=function(e){\"use strict\";var t=e.metadata;\"object\"===S(t)&&(this.data.checks[e.id]=t,\"object\"===S(t.messages)&&Object.keys(t.messages).filter(function(e){return t.messages.hasOwnProperty(e)&&\"string\"==typeof t.messages[e]}).forEach(function(e){0===t.messages[e].indexOf(\"function\")&&(t.messages[e]=new Function(\"return \"+t.messages[e]+\";\")())})),this.checks[e.id]?this.checks[e.id].configure(e):this.checks[e.id]=new i(e)},n.prototype.run=function(o,i,u,s){\"use strict\";this.normalizeOptions(i),axe._selectCache=[];var e=function(e,n,r){return e.reduce(function(e,t){return axe.utils.ruleShouldRun(t,n,r)&&(t.preload?e.later.push(t):e.now.push(t)),e},{now:[],later:[]})}(this.rules,o,i),t=e.now,l=e.later,n=axe.utils.queue();t.forEach(function(e){n.defer(c(e,o,i))});var r=axe.utils.queue();l.length&&r.defer(function(t){axe.utils.preload(i).then(function(e){return t(e)}).catch(function(e){console.warn(\"Couldn't load preload assets: \",e),t(void 0)})});var a=axe.utils.queue();a.defer(n),a.defer(r),a.then(function(e){var t=e.pop();if(t&&t.length){var n=t[0];n&&(o=R({},o,n))}var r=e[0];if(!l.length)return axe._selectCache=void 0,void u(r.filter(function(e){return!!e}));var a=axe.utils.queue();l.forEach(function(e){var t=c(e,o,i);a.defer(t)}),a.then(function(e){axe._selectCache=void 0,u(r.concat(e).filter(function(e){return!!e}))}).catch(s)}).catch(s)},n.prototype.after=function(e,n){\"use strict\";var r=this.rules;return e.map(function(e){var t=axe.utils.findBy(r,\"id\",e.id);if(!t)throw new Error(\"Result for unknown rule. You may be running mismatch axe-core versions\");return t.after(e,n)})},n.prototype.getRule=function(t){return this.rules.find(function(e){return e.id===t})},n.prototype.normalizeOptions=function(e){\"use strict\";var t=this;if(\"object\"===S(e.runOnly)){Array.isArray(e.runOnly)&&(e.runOnly={type:\"tag\",values:e.runOnly});var n=e.runOnly;if(n.value&&!n.values&&(n.values=n.value,delete n.value),!Array.isArray(n.values)||0===n.values.length)throw new Error(\"runOnly.values must be a non-empty array\");if([\"rule\",\"rules\"].includes(n.type))n.type=\"rule\",n.values.forEach(function(e){if(!t.getRule(e))throw new Error(\"unknown rule `\"+e+\"` in options.runOnly\")});else{if(![\"tag\",\"tags\",void 0].includes(n.type))throw new Error(\"Unknown runOnly type '\".concat(n.type,\"'\"));n.type=\"tag\";var r=t.rules.reduce(function(e,t){return e.length?e.filter(function(e){return!t.tags.includes(e)}):e},n.values);0!==r.length&&axe.log(\"Could not find tags `\"+r.join(\"`, `\")+\"`\")}}return\"object\"===S(e.rules)&&Object.keys(e.rules).forEach(function(e){if(!t.getRule(e))throw new Error(\"unknown rule `\"+e+\"` in options.rules\")}),e},n.prototype.setBranding=function(e){\"use strict\";var t={brand:this.brand,application:this.application};e&&e.hasOwnProperty(\"brand\")&&e.brand&&\"string\"==typeof e.brand&&(this.brand=e.brand),e&&e.hasOwnProperty(\"application\")&&e.application&&\"string\"==typeof e.application&&(this.application=e.application),this._constructHelpUrls(t)},n.prototype._constructHelpUrls=function(){var n=this,r=0<arguments.length&&void 0!==arguments[0]?arguments[0]:null,a=(axe.version.match(/^[1-9][0-9]*\\.[0-9]+/)||[\"x.y\"])[0];this.rules.forEach(function(e){n.data.rules[e.id]||(n.data.rules[e.id]={});var t=n.data.rules[e.id];(\"string\"!=typeof t.helpUrl||r&&t.helpUrl===o(r,e.id,a))&&(t.helpUrl=o(n,e.id,a))})},n.prototype.resetRulesAndChecks=function(){\"use strict\";this._init(),this._resetLocale()},function(){\"use strict\";var n={},e={set:function(e,t){n[e]=t},get:function(e){return n[e]},clear:function(){n={}}};axe._cache=e}(),i.prototype.enabled=!0,i.prototype.run=function(t,e,n,r,a){\"use strict\";var o=(e=e||{}).hasOwnProperty(\"enabled\")?e.enabled:this.enabled,i=e.options||this.options;if(o){var u,s=new d(this),l=axe.utils.checkHelper(s,e,r,a);try{u=this.evaluate.call(l,t.actualNode,i,t,n)}catch(e){return t&&t.actualNode&&(e.errorNode=new X(t.actualNode).toJSON()),void a(e)}l.isAsync||(s.result=u,r(s))}else r(null)},i.prototype.runSync=function(t,e,n){var r=(e=e||{}).enabled;if(!(void 0===r?this.enabled:r))return null;var a,o=e.options||this.options,i=new d(this),u=axe.utils.checkHelper(i,e);u.async=function(){throw new Error(\"Cannot run async check while in a synchronous run\")};try{a=this.evaluate.call(u,t.actualNode,o,t,n)}catch(e){throw t&&t.actualNode&&(e.errorNode=new X(t.actualNode).toJSON()),e}return i.result=a,i},i.prototype.configure=function(t){var n=this;[\"options\",\"enabled\"].filter(function(e){return t.hasOwnProperty(e)}).forEach(function(e){return n[e]=t[e]}),[\"evaluate\",\"after\"].filter(function(e){return t.hasOwnProperty(e)}).forEach(function(e){return n[e]=r(t[e])})},h.prototype.matches=function(){\"use strict\";return!0},h.prototype.gather=function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},n=\"mark_gather_start_\"+this.id,r=\"mark_gather_end_\"+this.id,a=\"mark_isHidden_start_\"+this.id,o=\"mark_isHidden_end_\"+this.id;t.performanceTimer&&axe.utils.performanceTimer.mark(n);var i=axe.utils.select(this.selector,e);return this.excludeHidden&&(t.performanceTimer&&axe.utils.performanceTimer.mark(a),i=i.filter(function(e){return!axe.utils.isHidden(e.actualNode)}),t.performanceTimer&&(axe.utils.performanceTimer.mark(o),axe.utils.performanceTimer.measure(\"rule_\"+this.id+\"#gather_axe.utils.isHidden\",a,o))),t.performanceTimer&&(axe.utils.performanceTimer.mark(r),axe.utils.performanceTimer.measure(\"rule_\"+this.id+\"#gather\",n,r)),i},h.prototype.runChecks=function(t,a,o,i,n,e){\"use strict\";var u=this,s=axe.utils.queue();this[t].forEach(function(e){var n=u._audit.checks[e.id||e],r=axe.utils.getCheckOption(n,u.id,o);s.defer(function(e,t){n.run(a,r,i,e,t)})}),s.then(function(e){e=e.filter(function(e){return e}),n({type:t,results:e})}).catch(e)},h.prototype.runChecksSync=function(e,r,a,o){\"use strict\";var i=this,u=[];return this[e].forEach(function(e){var t=i._audit.checks[e.id||e],n=axe.utils.getCheckOption(t,i.id,a);u.push(t.runSync(r,n,o))}),{type:e,results:u=u.filter(function(e){return e})}},h.prototype.run=function(a){var o=this,i=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},e=2<arguments.length?arguments[2]:void 0,t=3<arguments.length?arguments[3]:void 0;i.performanceTimer&&this._trackPerformance();var n,u=axe.utils.queue(),s=new f(this);try{n=this.gatherAndMatchNodes(a,i)}catch(e){return void t(new l({cause:e,ruleId:this.id}))}i.performanceTimer&&this._logGatherPerformance(n),n.forEach(function(r){u.defer(function(n,t){var e=axe.utils.queue();[\"any\",\"all\",\"none\"].forEach(function(n){e.defer(function(e,t){o.runChecks(n,r,i,a,e,t)})}),e.then(function(e){var t=b(e);t&&(t.node=new axe.utils.DqElement(r.actualNode,i),s.nodes.push(t)),n()}).catch(function(e){return t(e)})})}),u.defer(function(e){return setTimeout(e,0)}),i.performanceTimer&&this._logRulePerformance(),u.then(function(){return e(s)}).catch(function(e){return t(e)})},h.prototype.runSync=function(r){var a=this,o=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};o.performanceTimer&&this._trackPerformance();var e,i=new f(this);try{e=this.gatherAndMatchNodes(r,o)}catch(e){throw new l({cause:e,ruleId:this.id})}return o.performanceTimer&&this._logGatherPerformance(e),e.forEach(function(t){var n=[];[\"any\",\"all\",\"none\"].forEach(function(e){n.push(a.runChecksSync(e,t,o,r))});var e=b(n);e&&(e.node=t.actualNode?new axe.utils.DqElement(t.actualNode,o):null,i.nodes.push(e))}),o.performanceTimer&&this._logRulePerformance(),i},h.prototype._trackPerformance=function(){this._markStart=\"mark_rule_start_\"+this.id,this._markEnd=\"mark_rule_end_\"+this.id,this._markChecksStart=\"mark_runchecks_start_\"+this.id,this._markChecksEnd=\"mark_runchecks_end_\"+this.id},h.prototype._logGatherPerformance=function(e){axe.log(\"gather (\",e.length,\"):\",axe.utils.performanceTimer.timeElapsed()+\"ms\"),axe.utils.performanceTimer.mark(this._markChecksStart)},h.prototype._logRulePerformance=function(){axe.utils.performanceTimer.mark(this._markChecksEnd),axe.utils.performanceTimer.mark(this._markEnd),axe.utils.performanceTimer.measure(\"runchecks_\"+this.id,this._markChecksStart,this._markChecksEnd),axe.utils.performanceTimer.measure(\"rule_\"+this.id,this._markStart,this._markEnd)},h.prototype.gatherAndMatchNodes=function(t,e){var n=this,r=\"mark_matches_start_\"+this.id,a=\"mark_matches_end_\"+this.id,o=this.gather(t,e);return e.performanceTimer&&axe.utils.performanceTimer.mark(r),o=o.filter(function(e){return n.matches(e.actualNode,e,t)}),e.performanceTimer&&(axe.utils.performanceTimer.mark(a),axe.utils.performanceTimer.measure(\"rule_\"+this.id+\"#matches\",r,a)),o},h.prototype.after=function(a,o){\"use strict\";var e=function(n){\"use strict\";return axe.utils.getAllChecks(n).map(function(e){var t=n._audit.checks[e.id||e];return t&&\"function\"==typeof t.after?t:null}).filter(Boolean)}(this),i=this.id;return e.forEach(function(e){var t=function(e,t){\"use strict\";var n=[];return e.forEach(function(e){axe.utils.getAllChecks(e).forEach(function(e){e.id===t&&n.push(e)})}),n}(a.nodes,e.id),n=axe.utils.getCheckOption(e,i,o),r=e.after(t,n);t.forEach(function(e){-1===r.indexOf(e)&&(e.filtered=!0)})}),a.nodes=function(e){\"use strict\";var r=[\"any\",\"all\",\"none\"],t=e.nodes.filter(function(t){var n=0;return r.forEach(function(e){t[e]=function(e){\"use strict\";return e.filter(function(e){return!0!==e.filtered})}(t[e]),n+=t[e].length}),0<n});return e.pageLevel&&t.length&&(t=[t.reduce(function(t,n){if(t)return r.forEach(function(e){t[e].push.apply(t[e],n[e])}),t})]),t}(a),a},h.prototype.configure=function(e){\"use strict\";e.hasOwnProperty(\"selector\")&&(this.selector=e.selector),e.hasOwnProperty(\"excludeHidden\")&&(this.excludeHidden=\"boolean\"!=typeof e.excludeHidden||e.excludeHidden),e.hasOwnProperty(\"enabled\")&&(this.enabled=\"boolean\"!=typeof e.enabled||e.enabled),e.hasOwnProperty(\"pageLevel\")&&(this.pageLevel=\"boolean\"==typeof e.pageLevel&&e.pageLevel),e.hasOwnProperty(\"any\")&&(this.any=e.any),e.hasOwnProperty(\"all\")&&(this.all=e.all),e.hasOwnProperty(\"none\")&&(this.none=e.none),e.hasOwnProperty(\"tags\")&&(this.tags=e.tags),e.hasOwnProperty(\"matches\")&&(\"string\"==typeof e.matches?this.matches=new Function(\"return \"+e.matches+\";\")():this.matches=e.matches)};var x=/[\\t\\r\\n\\f]/g,E=(k(C,[{key:\"hasClass\",value:function(){throw new Error('VirtualNode class must have a \"hasClass\" function')}},{key:\"attr\",value:function(){throw new Error('VirtualNode class must have a \"attr\" function')}},{key:\"hasAttr\",value:function(){throw new Error('VirtualNode class must have a \"hasAttr\" function')}},{key:\"props\",get:function(){throw new Error('VirtualNode class must have a \"props\" object consisting of \"nodeType\" and \"nodeName\" properties')}}]),C);function C(){D(this,C),this.children=[],this.parent=null}var A=(function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&v(e,t)}(F,E),k(F,[{key:\"hasClass\",value:function(e){var t=this.attr(\"class\");if(!t)return!1;var n=\" \"+e+\" \";return 0<=(\" \"+t+\" \").replace(x,\" \").indexOf(n)}},{key:\"attr\",value:function(e){return\"function\"!=typeof this.actualNode.getAttribute?null:this.actualNode.getAttribute(e)}},{key:\"hasAttr\",value:function(e){return\"function\"==typeof this.actualNode.hasAttribute&&this.actualNode.hasAttribute(e)}},{key:\"props\",get:function(){var e=this.actualNode,t=e.nodeType,n=e.nodeName,r=e.id,a=e.type;return{nodeType:t,nodeName:n.toLowerCase(),id:r,type:a}}},{key:\"isFocusable\",get:function(){return this._cache.hasOwnProperty(\"isFocusable\")||(this._cache.isFocusable=axe.commons.dom.isFocusable(this.actualNode)),this._cache.isFocusable}},{key:\"tabbableElements\",get:function(){return this._cache.hasOwnProperty(\"tabbableElements\")||(this._cache.tabbableElements=axe.commons.dom.getTabbableElements(this)),this._cache.tabbableElements}}]),F);function F(e,t,n){var r;return D(this,F),(r=function(e,t){return!t||\"object\"!==S(t)&&\"function\"!=typeof t?y(e):t}(this,g(F).call(this))).shadowId=n,r.children=[],r.actualNode=e,r.parent=t,r._isHidden=null,r._cache={},axe._cache.get(\"nodeMap\")&&axe._cache.get(\"nodeMap\").set(e,y(r)),r}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function j(t,n){\"use strict\";if(t=t||function(){},n=n||axe.log,!axe._audit)throw new Error(\"No audit configured\");var r=axe.utils.queue(),a=[];Object.keys(axe.plugins).forEach(function(e){r.defer(function(t){function n(e){a.push(e),t()}try{axe.plugins[e].cleanup(t,n)}catch(e){n(e)}})});var e=axe.utils.getFlattenedTree(document.body);axe.utils.querySelectorAll(e,\"iframe, frame\").forEach(function(n){r.defer(function(e,t){return axe.utils.sendCommandToFrame(n.actualNode,{command:\"cleanup-plugin\"},e,t)})}),r.then(function(e){0===a.length?t(e):n(a)}).catch(n)}function z(e,t,n){\"use strict\";function r(e){e instanceof Error==!1&&(e=new Error(e)),n(e)}var a=n,o=e&&e.context||{};o.hasOwnProperty(\"include\")&&!o.include.length&&(o.include=[document]);var i=e&&e.options||{};switch(e.command){case\"rules\":return _(o,i,function(e,t){a(e),t()},r);case\"cleanup-plugin\":return j(a,r);default:if(axe._audit&&axe._audit.commands&&axe._audit.commands[e.command])return axe._audit.commands[e.command](e,n)}}function q(e){\"use strict\";this._run=e.run,this._collect=e.collect,this._registry={},e.commands.forEach(function(e){axe._audit.registerCommand(e)})}axe.AbstractVirtualNode=E,function(axe){var o={helpUrlBase:\"https://dequeuniversity.com/rules/\",results:[],resultGroups:[],resultGroupMap:{},impact:Object.freeze([\"minor\",\"moderate\",\"serious\",\"critical\"]),preload:Object.freeze({assets:[\"cssom\"],timeout:1e4})};[{name:\"NA\",value:\"inapplicable\",priority:0,group:\"inapplicable\"},{name:\"PASS\",value:\"passed\",priority:1,group:\"passes\"},{name:\"CANTTELL\",value:\"cantTell\",priority:2,group:\"incomplete\"},{name:\"FAIL\",value:\"failed\",priority:3,group:\"violations\"}].forEach(function(e){var t=e.name,n=e.value,r=e.priority,a=e.group;o[t]=n,o[t+\"_PRIO\"]=r,o[t+\"_GROUP\"]=a,o.results[r]=n,o.resultGroups[r]=a,o.resultGroupMap[n]=a}),Object.freeze(o.results),Object.freeze(o.resultGroups),Object.freeze(o.resultGroupMap),Object.freeze(o),Object.defineProperty(axe,\"constants\",{value:o,enumerable:!0,configurable:!1,writable:!1})}(axe),axe.log=function(){\"use strict\";\"object\"===(\"undefined\"==typeof console?\"undefined\":S(console))&&console.log&&Function.prototype.apply.call(console.log,console,arguments)},axe.cleanup=j,axe.configure=function(e){\"use strict\";var t;if(!(t=axe._audit))throw new Error(\"No audit configured\");e.reporter&&(\"function\"==typeof e.reporter||T[e.reporter])&&(t.reporter=e.reporter),e.checks&&e.checks.forEach(function(e){t.addCheck(e)});var n=[];e.rules&&e.rules.forEach(function(e){n.push(e.id),t.addRule(e)}),e.disableOtherRules&&t.rules.forEach(function(e){!1===n.includes(e.id)&&(e.enabled=!1)}),void 0!==e.branding?t.setBranding(e.branding):t._constructHelpUrls(),e.tagExclude&&(t.tagExclude=e.tagExclude),e.locale&&t.applyLocale(e.locale)},axe.getRules=function(e){\"use strict\";var t=(e=e||[]).length?axe._audit.rules.filter(function(t){return!!e.filter(function(e){return-1!==t.tags.indexOf(e)}).length}):axe._audit.rules,n=axe._audit.data.rules||{};return t.map(function(e){var t=n[e.id]||{};return{ruleId:e.id,description:t.description,help:t.help,helpUrl:t.helpUrl,tags:e.tags}})},axe._load=function(e){\"use strict\";axe.utils.respondable.subscribe(\"axe.ping\",function(e,t,n){n({axe:!0})}),axe.utils.respondable.subscribe(\"axe.start\",z),axe._audit=new n(e)},(axe=axe||{}).plugins={},q.prototype.run=function(){\"use strict\";return this._run.apply(this,arguments)},q.prototype.collect=function(){\"use strict\";return this._collect.apply(this,arguments)},q.prototype.cleanup=function(e){\"use strict\";var n=axe.utils.queue(),r=this;Object.keys(this._registry).forEach(function(t){n.defer(function(e){r._registry[t].cleanup(e)})}),n.then(function(){e()})},q.prototype.add=function(e){\"use strict\";this._registry[e.id]=e},axe.registerPlugin=function(e){\"use strict\";axe.plugins[e.id]=new q(e)};var N,T={};function O(){axe._cache.clear(),axe._tree=void 0,axe._selectorData=void 0}function _(n,r,a,o){\"use strict\";try{n=new p(n),axe._tree=n.flatTree,axe._selectorData=axe.utils.getSelectorData(n.flatTree)}catch(e){return O(),o(e)}var i,e=axe.utils.queue(),u=axe._audit;r.performanceTimer&&axe.utils.performanceTimer.auditStart(),n.frames.length&&!1!==r.iframes&&e.defer(function(e,t){axe.utils.collectResultsFromFrames(n,r,\"rules\",null,e,t)}),e.defer(function(e,t){r.restoreScroll&&(i=axe.utils.getScrollState()),u.run(n,r,e,t)}),e.then(function(e){try{i&&axe.utils.setScrollState(i),r.performanceTimer&&axe.utils.performanceTimer.auditEnd();var t=axe.utils.mergeResults(e.map(function(e){return{results:e}}));n.initiator&&((t=u.after(t,r)).forEach(axe.utils.publishMetaData),t=t.map(axe.utils.finalizeRuleResult));try{a(t,O)}catch(e){O(),axe.log(e)}}catch(e){O(),o(e)}}).catch(function(e){O(),o(e)})}function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}axe.getReporter=function(e){\"use strict\";return\"string\"==typeof e&&T[e]?T[e]:\"function\"==typeof e?e:N},axe.addReporter=function(e,t,n){\"use strict\";T[e]=t,n&&(N=t)},axe.reset=function(){\"use strict\";var e=axe._audit;if(!e)throw new Error(\"No audit configured\");e.resetRulesAndChecks()},axe._runRules=_,axe.runVirtualRule=function(t,e){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};n.reporter=n.reporter||axe._audit.reporter||\"v1\",axe._selectorData={};var r=axe._audit.rules.find(function(e){return e.id===t});if(!r)throw new Error(\"unknown rule `\"+t+\"`\");var a={include:[e]},o=(r=Object.create(r,{excludeHidden:{value:!1}})).runSync(a,n);axe.utils.publishMetaData(o),axe.utils.finalizeRuleResult(o);var i=axe.utils.aggregateResult([o]);return i.violations.forEach(function(e){return e.nodes.forEach(function(e){e.failureSummary=u.failureSummary(e)})}),R({},u.getEnvironmentData(),i,{toolOptions:n})};function B(){}function L(e,t,n){\"use strict\";var r=new TypeError(\"axe.run arguments are invalid\");if(!function(e){\"use strict\";switch(!0){case\"string\"==typeof e:case Array.isArray(e):case Node&&e instanceof Node:case NodeList&&e instanceof NodeList:return!0;case\"object\"!==S(e):return!1;case void 0!==e.include:case void 0!==e.exclude:case\"number\"==typeof e.length:return!0;default:return!1}}(e)){if(void 0!==n)throw r;n=t,t=e,e=document}if(\"object\"!==S(t)){if(void 0!==n)throw r;n=t,t={}}if(\"function\"!=typeof n&&void 0!==n)throw r;return{context:e,options:t,callback:n||B}}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}axe.run=function(e,a,o){\"use strict\";if(!axe._audit)throw new Error(\"No audit configured\");var t,n=L(e,a,o);e=n.context,a=n.options,o=n.callback,a.reporter=a.reporter||axe._audit.reporter||\"v1\",a.performanceTimer&&axe.utils.performanceTimer.start();var i=B,u=B;return\"function\"==typeof Promise&&o===B&&(t=new Promise(function(e,t){i=t,u=e})),axe._runRules(e,a,function(e,t){function n(e){t();try{o(null,e)}catch(e){axe.log(e)}u(e)}a.performanceTimer&&axe.utils.performanceTimer.end();try{var r=axe.getReporter(a.reporter)(e,a,n);void 0!==r&&n(r)}catch(e){t(),o(e),i(e)}},function(e){o(e),i(e)}),t},u.failureSummary=function(e){\"use strict\";var n={};return n.none=e.none.concat(e.all),n.any=e.any,Object.keys(n).map(function(e){if(n[e].length){var t=axe._audit.data.failureSummaries[e];return t&&\"function\"==typeof t.failureMessage?t.failureMessage(n[e].map(function(e){return e.message||\"\"})):void 0}}).filter(function(e){return void 0!==e}).join(\"\\n\\n\")},u.getEnvironmentData=function(e){var t=0<arguments.length&&void 0!==e?e:window,n=t.screen,r=void 0===n?{}:n,a=t.navigator,o=void 0===a?{}:a,i=t.location,u=void 0===i?{}:i,s=t.innerHeight,l=t.innerWidth,c=r.msOrientation||r.orientation||r.mozOrientation||{};return{testEngine:{name:\"axe-core\",version:axe.version},testRunner:{name:axe._audit.brand},testEnvironment:{userAgent:o.userAgent,windowWidth:l,windowHeight:s,orientationAngle:c.angle,orientationType:c.type},timestamp:(new Date).toISOString(),url:u.href}},u.incompleteFallbackMessage=function(){\"use strict\";return axe._audit.data.incompleteFallbackMessage()};var I=axe.constants.resultGroups;function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}u.processAggregate=function(e,n){var t=axe.utils.aggregateResult(e);return I.forEach(function(e){n.resultTypes&&!n.resultTypes.includes(e)&&(t[e]||[]).forEach(function(e){Array.isArray(e.nodes)&&0<e.nodes.length&&(e.nodes=[e.nodes[0]])}),t[e]=(t[e]||[]).map(function(t){return t=Object.assign({},t),Array.isArray(t.nodes)&&0<t.nodes.length&&(t.nodes=t.nodes.map(function(e){return\"object\"===S(e.node)&&(e.html=e.node.source,n.elementRef&&!e.node.fromFrame&&(e.element=e.node.element),!1===n.selectors&&!e.node.fromFrame||(e.target=e.node.selector),n.xpath&&(e.xpath=e.node.xpath)),delete e.result,delete e.node,function(t,n){\"use strict\";[\"any\",\"all\",\"none\"].forEach(function(e){Array.isArray(t[e])&&t[e].filter(function(e){return Array.isArray(e.relatedNodes)}).forEach(function(e){e.relatedNodes=e.relatedNodes.map(function(e){var t={html:e.source};return n.elementRef&&!e.fromFrame&&(t.element=e.element),!1===n.selectors&&!e.fromFrame||(t.target=e.selector),n.xpath&&(t.xpath=e.xpath),t})})})}(e,n),e})),I.forEach(function(e){return delete t[e]}),delete t.pageLevel,delete t.result,t})}),t},axe.addReporter(\"na\",function(e,t,n){\"use strict\";console.warn('\"na\" reporter will be deprecated in axe v4.0. Use the \"v2\" reporter instead.'),\"function\"==typeof t&&(n=t,t={});var r=u.processAggregate(e,t);n(R({},u.getEnvironmentData(),{toolOptions:t,violations:r.violations,passes:r.passes,incomplete:r.incomplete,inapplicable:r.inapplicable}))}),axe.addReporter(\"no-passes\",function(e,t,n){\"use strict\";\"function\"==typeof t&&(n=t,t={}),t.resultTypes=[\"violations\"];var r=u.processAggregate(e,t);n(R({},u.getEnvironmentData(),{toolOptions:t,violations:r.violations}))}),axe.addReporter(\"rawEnv\",function(e,t,n){\"function\"==typeof t&&(n=t,t={}),axe.getReporter(\"raw\")(e,t,function(e){var t=u.getEnvironmentData();n({raw:e,env:t})})}),axe.addReporter(\"raw\",function(e,t,n){\"use strict\";if(\"function\"==typeof t&&(n=t,t={}),!e||!Array.isArray(e))return n(e);n(e.map(function(e){for(var t=R({},e),n=0,r=[\"passes\",\"violations\",\"incomplete\",\"inapplicable\"];n<r.length;n++){var a=r[n];t[a]&&Array.isArray(t[a])&&(t[a]=t[a].map(function(e){return R({},e,{node:e.node.toJSON()})}))}return t}))}),axe.addReporter(\"v1\",function(e,t,n){\"use strict\";\"function\"==typeof t&&(n=t,t={});var r=u.processAggregate(e,t);r.violations.forEach(function(e){return e.nodes.forEach(function(e){e.failureSummary=u.failureSummary(e)})}),n(R({},u.getEnvironmentData(),{toolOptions:t,violations:r.violations,passes:r.passes,incomplete:r.incomplete,inapplicable:r.inapplicable}))}),axe.addReporter(\"v2\",function(e,t,n){\"use strict\";\"function\"==typeof t&&(n=t,t={});var r=u.processAggregate(e,t);n(R({},u.getEnvironmentData(),{toolOptions:t,violations:r.violations,passes:r.passes,incomplete:r.incomplete,inapplicable:r.inapplicable}))},!0),axe.utils.aggregate=function(t,e,n){e=e.slice(),n&&e.push(n);var r=e.map(function(e){return t.indexOf(e)}).sort();return t[r.pop()]};var P=axe.constants,U=P.CANTTELL_PRIO,V=P.FAIL_PRIO,M=[];M[axe.constants.PASS_PRIO]=!0,M[axe.constants.CANTTELL_PRIO]=null,M[axe.constants.FAIL_PRIO]=!1;var axe,H=[\"any\",\"all\",\"none\"];function G(n,r){return H.reduce(function(e,t){return e[t]=(n[t]||[]).map(function(e){return r(e,t)}),e},{})}function W(e,t,n){var r=Object.assign({},t);r.nodes=(r[n]||[]).concat(),axe.constants.resultGroups.forEach(function(e){delete r[e]}),e[n].push(r)}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function $(e,t){\"use strict\";var n;return axe._tree&&(n=axe.utils.getSelector(t)),new Error(e+\": \"+(n||t))}function X(e,t,n){this._fromFrame=!!n,this.spec=n||{},t&&t.absolutePaths&&(this._options={toRoot:!0}),this.source=void 0!==this.spec.source?this.spec.source:function(e){var t=e.outerHTML;return t||\"function\"!=typeof XMLSerializer||(t=(new XMLSerializer).serializeToString(e)),function(e,t){if(t=t||300,e.length>t){var n=e.indexOf(\">\");e=e.substring(0,n+1)}return e}(t||\"\")}(e),this._element=e}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function Y(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=[],r=!0,a=!1,o=void 0;try{for(var i,u=e[Symbol.iterator]();!(r=(i=u.next()).done)&&(n.push(i.value),!t||n.length!==t);r=!0);}catch(e){a=!0,o=e}finally{try{r||null==u.return||u.return()}finally{if(a)throw o}}return n}(e,t)||function(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}()}function J(e,t){return[e.substring(0,t),e.substring(t)]}function K(e){return e.replace(/\\s+$/,\"\")}axe.utils.aggregateChecks=function(e){var n=Object.assign({},e);G(n,function(e,t){var n=void 0===e.result?-1:M.indexOf(e.result);e.priority=-1!==n?n:axe.constants.CANTTELL_PRIO,\"none\"===t&&(e.priority===axe.constants.PASS_PRIO?e.priority=axe.constants.FAIL_PRIO:e.priority===axe.constants.FAIL_PRIO&&(e.priority=axe.constants.PASS_PRIO))});var r={all:n.all.reduce(function(e,t){return Math.max(e,t.priority)},0),none:n.none.reduce(function(e,t){return Math.max(e,t.priority)},0),any:n.any.reduce(function(e,t){return Math.min(e,t.priority)},4)%4};n.priority=Math.max(r.all,r.none,r.any);var a=[];return H.forEach(function(t){n[t]=n[t].filter(function(e){return e.priority===n.priority&&e.priority===r[t]}),n[t].forEach(function(e){return a.push(e.impact)})}),[U,V].includes(n.priority)?n.impact=axe.utils.aggregate(axe.constants.impact,a):n.impact=null,G(n,function(e){delete e.result,delete e.priority}),n.result=axe.constants.results[n.priority],delete n.priority,n},axe.utils.aggregateNodeResults=function(e){var n={};if((e=e.map(function(e){if(e.any&&e.all&&e.none)return axe.utils.aggregateChecks(e);if(Array.isArray(e.node))return axe.utils.finalizeRuleResult(e);throw new TypeError(\"Invalid Result type\")}))&&e.length){var t=e.map(function(e){return e.result});n.result=axe.utils.aggregate(axe.constants.results,t,n.result)}else n.result=\"inapplicable\";axe.constants.resultGroups.forEach(function(e){return n[e]=[]}),e.forEach(function(e){var t=axe.constants.resultGroupMap[e.result];n[t].push(e)});var r=axe.constants.FAIL_GROUP;if(0===n[r].length&&(r=axe.constants.CANTTELL_GROUP),0<n[r].length){var a=n[r].map(function(e){return e.impact});n.impact=axe.utils.aggregate(axe.constants.impact,a)||null}else n.impact=null;return n},axe.utils.aggregateResult=function(e){var n={};return axe.constants.resultGroups.forEach(function(e){return n[e]=[]}),e.forEach(function(t){t.error?W(n,t,axe.constants.CANTTELL_GROUP):t.result===axe.constants.NA?W(n,t,axe.constants.NA_GROUP):axe.constants.resultGroups.forEach(function(e){Array.isArray(t[e])&&0<t[e].length&&W(n,t,e)})}),n},axe.utils.areStylesSet=function e(t,n,r){\"use strict\";var a=window.getComputedStyle(t,null),o=!1;return!!a&&(n.forEach(function(e){a.getPropertyValue(e.property)===e.value&&(o=!0)}),!!o||!(t.nodeName.toUpperCase()===r.toUpperCase()||!t.parentNode)&&e(t.parentNode,n,r))},axe.utils.checkHelper=function(t,n,r,a){\"use strict\";return{isAsync:!1,async:function(){return this.isAsync=!0,function(e){e instanceof Error==!1?(t.result=e,r(t)):a(e)}},data:function(e){t.data=e},relatedNodes:function(e){e=e instanceof Node?[e]:axe.utils.toArray(e),t.relatedNodes=e.map(function(e){return new axe.utils.DqElement(e,n)})}}},axe.utils.clone=function(e){\"use strict\";var t,n,r=e;if(null!==e&&\"object\"===S(e))if(Array.isArray(e))for(r=[],t=0,n=e.length;t<n;t++)r[t]=axe.utils.clone(e[t]);else for(t in r={},e)r[t]=axe.utils.clone(e[t]);return r},axe.utils.sendCommandToFrame=function(t,n,r,a){\"use strict\";var o=t.contentWindow;if(!o)return axe.log(\"Frame does not have a content window\",t),void r(null);var i=setTimeout(function(){i=setTimeout(function(){n.debug?a($(\"No response from frame\",t)):r(null)},0)},500);axe.utils.respondable(o,\"axe.ping\",null,void 0,function(){clearTimeout(i);var e=n.options&&n.options.frameWaitTime||6e4;i=setTimeout(function(){a($(\"Axe in frame timed out\",t))},e),axe.utils.respondable(o,\"axe.start\",n,void 0,function(e){clearTimeout(i),e instanceof Error==!1?r(e):a(e)})})},axe.utils.collectResultsFromFrames=function(e,t,n,o,r,a){\"use strict\";var i=axe.utils.queue();e.frames.forEach(function(r){var a={options:t,command:n,parameter:o,context:{initiator:!1,page:e.page,include:r.include||[],exclude:r.exclude||[]}};i.defer(function(t,e){var n=r.node;axe.utils.sendCommandToFrame(n,a,function(e){if(e)return t({results:e,frameElement:n,frame:axe.utils.getSelector(n)});t(null)},e)})}),i.then(function(e){r(axe.utils.mergeResults(e,t))}).catch(a)},axe.utils.contains=function(e,t){\"use strict\";if(e.shadowId||t.shadowId)return function t(e,n){return e.shadowId===n.shadowId||!!e.children.find(function(e){return t(e,n)})}(e,t);if(e.actualNode)return\"function\"==typeof e.actualNode.contains?e.actualNode.contains(t.actualNode):!!(16&e.actualNode.compareDocumentPosition(t.actualNode));do{if(t===e)return!0}while(t=t&&t.parent);return!1},function(axe){var e=new axe.imports.CssSelectorParser;e.registerSelectorPseudos(\"not\"),e.registerNestingOperators(\">\"),e.registerAttrEqualityMods(\"^\",\"$\",\"*\"),axe.utils.cssParser=e}(axe),X.prototype={get selector(){return this.spec.selector||[axe.utils.getSelector(this.element,this._options)]},get xpath(){return this.spec.xpath||[axe.utils.getXpath(this.element)]},get element(){return this._element},get fromFrame(){return this._fromFrame},toJSON:function(){\"use strict\";return{selector:this.selector,source:this.source,xpath:this.xpath}}},X.fromFrame=function(e,t,n){return e.selector.unshift(n.selector),e.xpath.unshift(n.xpath),new axe.utils.DqElement(n.element,t,e)},axe.utils.DqElement=X,axe.utils.matchesSelector=function(){\"use strict\";var n;return function(e,t){return n&&e[n]||(n=function(e){var t,n,r=[\"matches\",\"matchesSelector\",\"mozMatchesSelector\",\"webkitMatchesSelector\",\"msMatchesSelector\"],a=r.length;for(t=0;t<a;t++)if(e[n=r[t]])return n}(e)),!!e[n]&&e[n](t)}}(),axe.utils.escapeSelector=function(e){\"use strict\";for(var t,n=String(e),r=n.length,a=-1,o=\"\",i=n.charCodeAt(0);++a<r;)0!=(t=n.charCodeAt(a))?o+=1<=t&&t<=31||127==t||0==a&&48<=t&&t<=57||1==a&&48<=t&&t<=57&&45==i?\"\\\\\"+t.toString(16)+\" \":(0!=a||1!=r||45!=t)&&(128<=t||45==t||95==t||48<=t&&t<=57||65<=t&&t<=90||97<=t&&t<=122)?n.charAt(a):\"\\\\\"+n.charAt(a):o+=\"�\";return o},axe.utils.extendMetaData=function(t,n){Object.assign(t,n),Object.keys(n).filter(function(e){return\"function\"==typeof n[e]}).forEach(function(e){t[e]=null;try{t[e]=n[e](t)}catch(e){}})},axe.utils.finalizeRuleResult=function(e){return Object.assign(e,axe.utils.aggregateNodeResults(e.nodes)),delete e.nodes,e},axe.utils.findBy=function(e,t,n){if(Array.isArray(e))return e.find(function(e){return\"object\"===S(e)&&e[t]===n})},(axe=axe||{utils:{}}).utils.getFlattenedTree=function(e,t){return axe._cache.set(\"nodeMap\",new WeakMap),function a(e,o,n){var r,t,i;function u(e,t,n){var r=a(t,o,n);return r&&(e=e.concat(r)),e}if(e.documentElement&&(e=e.documentElement),i=e.nodeName.toLowerCase(),axe.utils.isShadowRoot(e))return r=new A(e,n,o),o=\"a\"+Math.random().toString().substring(2),t=Array.from(e.shadowRoot.childNodes),r.children=t.reduce(function(e,t){return u(e,t,r)},[]),[r];if(\"content\"===i)return(t=Array.from(e.getDistributedNodes())).reduce(function(e,t){return u(e,t,n)},[]);if(\"slot\"!==i||\"function\"!=typeof e.assignedNodes)return 1===e.nodeType?(r=new A(e,n,o),t=Array.from(e.childNodes),r.children=t.reduce(function(e,t){return u(e,t,r)},[]),[r]):3===e.nodeType?[new A(e,n)]:void 0;(t=Array.from(e.assignedNodes())).length||(t=function(e){var t=[];for(e=e.firstChild;e;)t.push(e),e=e.nextSibling;return t}(e));window.getComputedStyle(e);return t.reduce(function(e,t){return u(e,t,n)},[])}(e,t)},axe.utils.getNodeFromTree=function(e,t){var n=t||e;return axe._cache.get(\"nodeMap\")?axe._cache.get(\"nodeMap\").get(n):null},axe.utils.getAllChecks=function(e){\"use strict\";return[].concat(e.any||[]).concat(e.all||[]).concat(e.none||[])},axe.utils.getBaseLang=function(e){return e?e.trim().split(\"-\")[0].toLowerCase():\"\"},axe.utils.getCheckOption=function(e,t,n){var r=((n.rules&&n.rules[t]||{}).checks||{})[e.id],a=(n.checks||{})[e.id],o=e.enabled,i=e.options;return a&&(a.hasOwnProperty(\"enabled\")&&(o=a.enabled),a.hasOwnProperty(\"options\")&&(i=a.options)),r&&(r.hasOwnProperty(\"enabled\")&&(o=r.enabled),r.hasOwnProperty(\"options\")&&(i=r.options)),{enabled:o,options:i,absolutePaths:n.absolutePaths}},axe.utils.getFriendlyUriEnd=function(e,t){var n=0<arguments.length&&void 0!==e?e:\"\",r=1<arguments.length&&void 0!==t?t:{};if(!(n.length<=1||\"data:\"===n.substr(0,5)||\"javascript:\"===n.substr(0,11)||n.includes(\"?\"))){var a=r.currentDomain,o=r.maxLength,i=void 0===o?25:o,u=function(e){var t=e,n=\"\",r=\"\",a=\"\",o=\"\",i=\"\";if(e.includes(\"#\")){var u=Y(J(e,e.indexOf(\"#\")),2);e=u[0],i=u[1]}if(e.includes(\"?\")){var s=Y(J(e,e.indexOf(\"?\")),2);e=s[0],o=s[1]}if(e.includes(\"://\")){var l=Y(e.split(\"://\"),2);n=l[0];var c=Y(J(e=l[1],e.indexOf(\"/\")),2);r=c[0],e=c[1]}else if(\"//\"===e.substr(0,2)){var d=Y(J(e=e.substr(2),e.indexOf(\"/\")),2);r=d[0],e=d[1]}if(\"www.\"===r.substr(0,4)&&(r=r.substr(4)),r&&r.includes(\":\")){var m=Y(J(r,r.indexOf(\":\")),2);r=m[0],a=m[1]}return{original:t,protocol:n,domain:r,port:a,path:e,query:o,hash:i}}(n),s=u.path,l=u.domain,c=u.hash,d=s.substr(s.substr(0,s.length-2).lastIndexOf(\"/\")+1);if(c)return d&&(d+c).length<=i?K(d+c):d.length<2&&2<c.length&&c.length<=i?K(c):void 0;if(l&&l.length<i&&s.length<=1)return K(l+s);if(s===\"/\"+d&&l&&a&&l!==a&&(l+s).length<=i)return K(l+s);var m=d.lastIndexOf(\".\");return(-1===m||1<m)&&(-1!==m||2<d.length)&&d.length<=i&&!d.match(/index(\\.[a-zA-Z]{2-4})?/)&&!function(e){var t=0<arguments.length&&void 0!==e?e:\"\";return 0!==t.length&&(t.match(/[0-9]/g)||\"\").length>=t.length/2}(d)?K(d):void 0}},axe.utils.getNodeAttributes=function(e){return e.attributes instanceof window.NamedNodeMap?e.attributes:e.cloneNode(!1).attributes},axe.utils.getRootNode=function(e){var t=e.getRootNode&&e.getRootNode()||document;return t===e&&(t=document),t},axe.utils.getScroll=function(e,t){var n=1<arguments.length&&void 0!==t?t:0,r=e.scrollWidth>e.clientWidth+n,a=e.scrollHeight>e.clientHeight+n;if(r||a){var o=window.getComputedStyle(e),i=o.getPropertyValue(\"overflow-x\"),u=o.getPropertyValue(\"overflow-y\");return r&&(\"visible\"!==i&&\"hidden\"!==i)||a&&(\"visible\"!==u&&\"hidden\"!==u)?{elm:e,top:e.scrollTop,left:e.scrollLeft}:void 0}};var Z,Q,ee=axe.utils.escapeSelector,te=[\"class\",\"style\",\"id\",\"selected\",\"checked\",\"disabled\",\"tabindex\",\"aria-checked\",\"aria-selected\",\"aria-invalid\",\"aria-activedescendant\",\"aria-busy\",\"aria-disabled\",\"aria-expanded\",\"aria-grabbed\",\"aria-pressed\",\"aria-valuenow\"],ne=31;function re(e,t){var n,r=t.name;if(-1!==r.indexOf(\"href\")||-1!==r.indexOf(\"src\")){var a=axe.utils.getFriendlyUriEnd(e.getAttribute(r));if(a){var o=encodeURI(a);if(!o)return;n=ee(t.name)+'$=\"'+ee(o)+'\"'}else n=ee(t.name)+'=\"'+ee(e.getAttribute(r))+'\"'}else n=ee(r)+'=\"'+ee(t.value)+'\"';return n}function ae(e,t){return e.count<t.count?-1:e.count===t.count?0:1}function oe(e){return!te.includes(e.name)&&-1===e.name.indexOf(\":\")&&(!e.value||e.value.length<ne)}function ie(t,n){var e=t.parentNode&&Array.from(t.parentNode.children||\"\")||[];return e.find(function(e){return e!==t&&axe.utils.matchesSelector(e,n)})?\":nth-child(\"+(1+e.indexOf(t))+\")\":\"\"}function ue(e){if(e.getAttribute(\"id\")){var t=e.getRootNode&&e.getRootNode()||document,n=\"#\"+ee(e.getAttribute(\"id\")||\"\");return n.match(/player_uid_/)||1!==t.querySelectorAll(n).length?void 0:n}}function se(e){return void 0===Z&&(Z=axe.utils.isXHTML(document)),ee(Z?e.localName:e.nodeName.toLowerCase())}function le(e,t){var n,r=\"\",a=function(n,e){var r=[],a=e.classes,o=e.tags;return n.classList&&Array.from(n.classList).forEach(function(e){var t=ee(e);a[t]<o[n.nodeName]&&r.push({name:t,count:a[t],species:\"class\"})}),r.sort(ae)}(e,t),o=function(n,e){var r=[],a=e.attributes,o=e.tags;return n.hasAttributes()&&Array.from(axe.utils.getNodeAttributes(n)).filter(oe).forEach(function(e){var t=re(n,e);t&&a[t]<o[n.nodeName]&&r.push({name:t,count:a[t],species:\"attribute\"})}),r.sort(ae)}(e,t);return a.length&&1===a[0].count?n=[a[0]]:o.length&&1===o[0].count?(n=[o[0]],r=se(e)):((n=a.concat(o)).sort(ae),(n=n.slice(0,3)).some(function(e){return\"class\"===e.species})?n.sort(function(e,t){return e.species!==t.species&&\"class\"===e.species?-1:e.species===t.species?0:1}):r=se(e)),r+n.reduce(function(e,t){switch(t.species){case\"class\":return e+\".\"+t.name;case\"attribute\":return e+\"[\"+t.name+\"]\"}return e},\"\")}function ce(e,t,n){if(!axe._selectorData)throw new Error(\"Expect axe._selectorData to be set up\");var r,a,o=t.toRoot,i=void 0!==o&&o;do{var u=ue(e);u||(u=le(e,axe._selectorData),u+=ie(e,u)),r=r?u+\" > \"+r:u,a=a?a.filter(function(e){return axe.utils.matchesSelector(e,r)}):Array.from(n.querySelectorAll(r)),e=e.parentElement}while((1<a.length||i)&&e&&11!==e.nodeType);return 1===a.length?r:-1!==r.indexOf(\" > \")?\":root\"+r.substring(r.indexOf(\" > \")):\":root\"}axe.utils.getSelectorData=function(e){function t(){var e=a.pop(),n=e.actualNode;if(n.querySelectorAll){var t=n.nodeName;r.tags[t]?r.tags[t]++:r.tags[t]=1,n.classList&&Array.from(n.classList).forEach(function(e){var t=ee(e);r.classes[t]?r.classes[t]++:r.classes[t]=1}),n.hasAttributes()&&Array.from(axe.utils.getNodeAttributes(n)).filter(oe).forEach(function(e){var t=re(n,e);t&&(r.attributes[t]?r.attributes[t]++:r.attributes[t]=1)})}for(e.children.length&&(o.push(a),a=e.children.slice());!a.length&&o.length;)a=o.pop()}for(var r={classes:{},tags:{},attributes:{}},a=(e=Array.isArray(e)?e:[e]).slice(),o=[];a.length;)t();return r},axe.utils.getSelector=function(e,t){var n=1<arguments.length&&void 0!==t?t:{};if(!e)return\"\";var r=e.getRootNode&&e.getRootNode()||document;if(11!==r.nodeType)return ce(e,n,r);for(var a=[];11===r.nodeType;)a.push({elm:e,doc:r}),r=(e=r.host).getRootNode();return a.push({elm:e,doc:r}),a.reverse().map(function(e){return ce(e.elm,n,e.doc)})},axe.utils.getStyleSheetFactory=function(d){if(!d)throw new Error(\"axe.utils.getStyleSheetFactory should be invoked with an argument\");return function(e){var t=e.data,n=e.isCrossOrigin,r=void 0!==n&&n,a=e.shadowId,o=e.root,i=e.priority,u=e.isLink,s=void 0!==u&&u,l=d.createElement(\"style\");if(s){var c=d.createTextNode('@import \"'.concat(t.href,'\"'));l.appendChild(c)}else l.appendChild(d.createTextNode(t));return d.head.appendChild(l),{sheet:l.sheet,isCrossOrigin:r,shadowId:a,root:o,priority:i}}},axe.utils.getXpath=function(e){return function(e){return e.reduce(function(e,t){return t.id?\"/\".concat(t.str,\"[@id='\").concat(t.id,\"']\"):e+\"/\".concat(t.str)+(0<t.count?\"[\".concat(t.count,\"]\"):\"\")},\"\")}(function e(t,n){var r,a;if(!t)return[];if(!n&&9===t.nodeType)return n=[{str:\"html\"}];if(n=n||[],t.parentNode&&t.parentNode!==t&&(n=e(t.parentNode,n)),t.previousSibling){for(a=1,r=t.previousSibling;1===r.nodeType&&r.nodeName===t.nodeName&&a++,r=r.previousSibling;);1===a&&(a=null)}else if(t.nextSibling)for(r=t.nextSibling;r=1===r.nodeType&&r.nodeName===t.nodeName?(a=1,null):(a=null,r.previousSibling););if(1===t.nodeType){var o={};o.str=t.nodeName.toLowerCase();var i=t.getAttribute&&axe.utils.escapeSelector(t.getAttribute(\"id\"));i&&1===t.ownerDocument.querySelectorAll(\"#\"+i).length&&(o.id=t.getAttribute(\"id\")),1<a&&(o.count=a),n.push(o)}return n}(e))},axe.utils.injectStyle=function(e){\"use strict\";if(Q&&Q.parentNode)return void 0===Q.styleSheet?Q.appendChild(document.createTextNode(e)):Q.styleSheet.cssText+=e,Q;if(e){var t=document.head||document.getElementsByTagName(\"head\")[0];return(Q=document.createElement(\"style\")).type=\"text/css\",void 0===Q.styleSheet?Q.appendChild(document.createTextNode(e)):Q.styleSheet.cssText=e,t.appendChild(Q),Q}},axe.utils.isHidden=function(e,t){\"use strict\";var n=axe.utils.getNodeFromTree(e);if(9===e.nodeType)return!1;if(11===e.nodeType&&(e=e.host),n&&null!==n._isHidden)return n._isHidden;var r=window.getComputedStyle(e,null);if(!r||!e.parentNode||\"none\"===r.getPropertyValue(\"display\")||!t&&\"hidden\"===r.getPropertyValue(\"visibility\")||\"true\"===e.getAttribute(\"aria-hidden\"))return!0;var a=e.assignedSlot?e.assignedSlot:e.parentNode,o=axe.utils.isHidden(a,!0);return n&&(n._isHidden=o),o};var de=[\"a\",\"abbr\",\"address\",\"area\",\"article\",\"aside\",\"audio\",\"b\",\"base\",\"bdi\",\"bdo\",\"blockquote\",\"body\",\"br\",\"button\",\"canvas\",\"caption\",\"cite\",\"code\",\"col\",\"colgroup\",\"data\",\"datalist\",\"dd\",\"del\",\"details\",\"dfn\",\"dialog\",\"div\",\"dl\",\"dt\",\"em\",\"embed\",\"fieldset\",\"figcaption\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"head\",\"header\",\"hgroup\",\"hr\",\"html\",\"i\",\"iframe\",\"img\",\"input\",\"ins\",\"kbd\",\"keygen\",\"label\",\"legend\",\"li\",\"link\",\"main\",\"map\",\"mark\",\"math\",\"menu\",\"menuitem\",\"meta\",\"meter\",\"nav\",\"noscript\",\"object\",\"ol\",\"optgroup\",\"option\",\"output\",\"p\",\"param\",\"picture\",\"pre\",\"progress\",\"q\",\"rb\",\"rp\",\"rt\",\"rtc\",\"ruby\",\"s\",\"samp\",\"script\",\"section\",\"select\",\"slot\",\"small\",\"source\",\"span\",\"strong\",\"style\",\"sub\",\"summary\",\"sup\",\"svg\",\"table\",\"tbody\",\"td\",\"template\",\"textarea\",\"tfoot\",\"th\",\"thead\",\"time\",\"title\",\"tr\",\"track\",\"u\",\"ul\",\"var\",\"video\",\"wbr\"];axe.utils.isHtmlElement=function(e){var t=e.nodeName.toLowerCase();return de.includes(t)&&\"http://www.w3.org/2000/svg\"!==e.namespaceURI};var me,pe,fe=[\"article\",\"aside\",\"blockquote\",\"body\",\"div\",\"footer\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"main\",\"nav\",\"p\",\"section\",\"span\"];function he(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}(e)||function(e){if(Symbol.iterator in Object(e)||\"[object Arguments]\"===Object.prototype.toString.call(e))return Array.from(e)}(e)||function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance\")}()}function be(){throw new TypeError(\"Invalid attempt to spread non-iterable instance\")}function ge(e){if(Symbol.iterator in Object(e)||\"[object Arguments]\"===Object.prototype.toString.call(e))return Array.from(e)}function ye(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}function ve(e){return\"function\"==typeof e||\"[object Function]\"===me.call(e)}function De(e){var t=function(e){var t=Number(e);return isNaN(t)?0:0!==t&&isFinite(t)?(0<t?1:-1)*Math.floor(Math.abs(t)):t}(e);return Math.min(Math.max(t,0),pe)}function we(e){var t=e.nodeName.toUpperCase(),n=e.getAttribute(\"href\"),r=e.getAttribute(\"rel\"),a=\"LINK\"===t&&n&&r&&e.rel.toUpperCase().includes(\"STYLESHEET\");return\"STYLE\"===t||a&&ke(e.media)}function ke(e){return!e||!e.toUpperCase().includes(\"PRINT\")}function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function xe(a,o){\"use strict\";return function(e){var t=a[e.id]||{},n=t.messages||{},r=Object.assign({},t);delete r.messages,void 0===e.result?\"object\"===S(n.incomplete)?r.message=function(){return function(t,n){function r(e){return e.incomplete&&e.incomplete.default?e.incomplete.default:u.incompleteFallbackMessage()}if(!t||!t.missingData)return r(n);try{var e=n.incomplete[t.missingData[0].reason];if(!e)throw new Error;return e}catch(e){return\"string\"==typeof t.missingData?n.incomplete[t.missingData]:r(n)}}(e.data,n)}:r.message=n.incomplete:r.message=e.result===o?n.pass:n.fail,axe.utils.extendMetaData(e,r)}}axe.utils.isShadowRoot=function(e){var t=e.nodeName.toLowerCase();return!(!e.shadowRoot||!/^[a-z][a-z0-9_.-]*-[a-z0-9_.-]*$/.test(t)&&!fe.includes(t))},axe.utils.isXHTML=function(e){\"use strict\";return!!e.createElement&&\"A\"===e.createElement(\"A\").localName},axe.utils.mergeResults=function(e,r){\"use strict\";var a=[];return e.forEach(function(n){var e=function(e){\"use strict\";return e&&e.results?Array.isArray(e.results)?e.results.length?e.results:null:[e.results]:null}(n);e&&e.length&&e.forEach(function(e){e.nodes&&n.frame&&function(e,n,t,r){\"use strict\";var a={element:t,selector:r,xpath:axe.utils.getXpath(t)};e.forEach(function(e){e.node=axe.utils.DqElement.fromFrame(e.node,n,a);var t=axe.utils.getAllChecks(e);t.length&&t.forEach(function(e){e.relatedNodes=e.relatedNodes.map(function(e){return axe.utils.DqElement.fromFrame(e,n,a)})})})}(e.nodes,r,n.frameElement,n.frame);var t=axe.utils.findBy(a,\"id\",e.id);t?e.nodes.length&&function(e,t){\"use strict\";for(var n,r,a=t[0].node,o=0,i=e.length;o<i;o++)if(r=e[o].node,0<(n=axe.utils.nodeSorter({actualNode:r.element},{actualNode:a.element}))||0===n&&a.selector.length<r.selector.length)return e.splice.apply(e,[o,0].concat(t));e.push.apply(e,t)}(t.nodes,e.nodes):a.push(e)})}),a},axe.utils.nodeSorter=function(e,t){return(e=e.actualNode||e)===(t=t.actualNode||t)?0:4&e.compareDocumentPosition(t)?-1:1},axe.utils.parseCrossOriginStylesheet=function(e,r,a,o,i){var t={method:\"get\",url:e};return o.push(e),axe.imports.axios(t).then(function(e){var t=e.data,n=r.convertDataToStylesheet({data:t,isCrossOrigin:i,priority:a,root:r.rootNode,shadowId:r.shadowId});return axe.utils.parseStylesheet(n.sheet,r,a,o,n.isCrossOrigin)})},axe.utils.parseSameOriginStylesheet=function(e,a,o,i,t){var n=4<arguments.length&&void 0!==t&&t,r=Array.from(e.cssRules);if(!r)return Promise.resolve();var u=r.filter(function(e){return 3===e.type});if(!u.length)return Promise.resolve({isCrossOrigin:n,priority:o,root:a.rootNode,shadowId:a.shadowId,sheet:e});var s=u.filter(function(e){return e.href}).map(function(e){return e.href}).filter(function(e){return!i.includes(e)}).map(function(e,t){var n=[].concat(he(o),[t]),r=/^https?:\\/\\/|^\\/\\//i.test(e);return axe.utils.parseCrossOriginStylesheet(e,a,n,i,r)}),l=r.filter(function(e){return 3!==e.type});return l.length&&s.push(Promise.resolve(a.convertDataToStylesheet({data:l.map(function(e){return e.cssText}).join(),isCrossOrigin:n,priority:o,root:a.rootNode,shadowId:a.shadowId}))),Promise.all(s)},axe.utils.parseStylesheet=function(e,t,n,r,a){var o=4<arguments.length&&void 0!==a&&a;return function(e){try{return!(!e.cssRules&&e.href)}catch(e){return!1}}(e)?axe.utils.parseSameOriginStylesheet(e,t,n,r,o):axe.utils.parseCrossOriginStylesheet(e.href,t,n,r,!0)},utils.performanceTimer=function(){\"use strict\";function e(){if(window.performance&&window.performance)return window.performance.now()}var t=null,n=e();return{start:function(){this.mark(\"mark_axe_start\")},end:function(){this.mark(\"mark_axe_end\"),this.measure(\"axe\",\"mark_axe_start\",\"mark_axe_end\"),this.logMeasures(\"axe\")},auditStart:function(){this.mark(\"mark_audit_start\")},auditEnd:function(){this.mark(\"mark_audit_end\"),this.measure(\"audit_start_to_end\",\"mark_audit_start\",\"mark_audit_end\"),this.logMeasures()},mark:function(e){window.performance&&void 0!==window.performance.mark&&window.performance.mark(e)},measure:function(e,t,n){window.performance&&void 0!==window.performance.measure&&window.performance.measure(e,t,n)},logMeasures:function(e){function t(e){axe.log(\"Measure \"+e.name+\" took \"+e.duration+\"ms\")}if(window.performance&&void 0!==window.performance.getEntriesByType)for(var n=window.performance.getEntriesByName(\"mark_axe_start\")[0],r=window.performance.getEntriesByType(\"measure\").filter(function(e){return e.startTime>=n.startTime}),a=0;a<r.length;++a){var o=r[a];if(o.name===e)return void t(o);t(o)}},timeElapsed:function(){return e()-n},reset:function(){t=t||e(),n=e()}}}(),\"function\"!=typeof Object.assign&&(Object.assign=function(e){\"use strict\";if(null==e)throw new TypeError(\"Cannot convert undefined or null to object\");for(var t=Object(e),n=1;n<arguments.length;n++){var r=arguments[n];if(null!=r)for(var a in r)r.hasOwnProperty(a)&&(t[a]=r[a])}return t}),Array.prototype.find||Object.defineProperty(Array.prototype,\"find\",{value:function(e){if(null===this)throw new TypeError(\"Array.prototype.find called on null or undefined\");if(\"function\"!=typeof e)throw new TypeError(\"predicate must be a function\");for(var t,n=Object(this),r=n.length>>>0,a=arguments[1],o=0;o<r;o++)if(t=n[o],e.call(a,t,o,n))return t}}),axe.utils.pollyfillElementsFromPoint=function(){if(document.elementsFromPoint)return document.elementsFromPoint;if(document.msElementsFromPoint)return document.msElementsFromPoint;var e,t=((e=document.createElement(\"x\")).style.cssText=\"pointer-events:auto\",\"auto\"===e.style.pointerEvents),u=t?\"pointer-events\":\"visibility\",s=t?\"none\":\"hidden\",l=document.createElement(\"style\");return l.innerHTML=t?\"* { pointer-events: all }\":\"* { visibility: visible }\",function(e,t){var n,r,a,o=[],i=[];for(document.head.appendChild(l);(n=document.elementFromPoint(e,t))&&-1===o.indexOf(n);)o.push(n),i.push({value:n.style.getPropertyValue(u),priority:n.style.getPropertyPriority(u)}),n.style.setProperty(u,s,\"important\");for(o.indexOf(document.documentElement)<o.length-1&&(o.splice(o.indexOf(document.documentElement),1),o.push(document.documentElement)),r=i.length;a=i[--r];)o[r].style.setProperty(u,a.value?a.value:\"\",a.priority);return document.head.removeChild(l),o}},\"function\"==typeof window.addEventListener&&(document.elementsFromPoint=axe.utils.pollyfillElementsFromPoint()),Array.prototype.includes||Object.defineProperty(Array.prototype,\"includes\",{value:function(e,t){\"use strict\";var n=Object(this),r=parseInt(n.length,10)||0;if(0===r)return!1;var a,o,i=parseInt(t,10)||0;for(0<=i?a=i:(a=r+i)<0&&(a=0);a<r;){if(e===(o=n[a])||e!=e&&o!=o)return!0;a++}return!1}}),Array.prototype.some||Object.defineProperty(Array.prototype,\"some\",{value:function(e,t){\"use strict\";if(null==this)throw new TypeError(\"Array.prototype.some called on null or undefined\");if(\"function\"!=typeof e)throw new TypeError;for(var n=Object(this),r=n.length>>>0,a=2<=arguments.length?t:void 0,o=0;o<r;o++)if(o in n&&e.call(a,n[o],o,n))return!0;return!1}}),Array.from||Object.defineProperty(Array,\"from\",{value:(me=Object.prototype.toString,pe=Math.pow(2,53)-1,function(e,t,n){var r=Object(e);if(null==e)throw new TypeError(\"Array.from requires an array-like object - not null or undefined\");var a,o=1<arguments.length?t:void 0;if(void 0!==o){if(!ve(o))throw new TypeError(\"Array.from: when provided, the second argument must be a function\");2<arguments.length&&(a=n)}for(var i,u=De(r.length),s=ve(this)?Object(new this(u)):new Array(u),l=0;l<u;)i=r[l],s[l]=o?void 0===a?o(i,l):o.call(a,i,l):i,l+=1;return s.length=u,s})}),String.prototype.includes||(String.prototype.includes=function(e,t){return\"number\"!=typeof t&&(t=0),!(t+e.length>this.length)&&-1!==this.indexOf(e,t)}),axe.utils.preloadCssom=function(e){var t=e.treeRoot,n=function(e){var t=[],n=axe.utils.querySelectorAllFilter(e,\"*\",function(e){return!t.includes(e.shadowId)&&(t.push(e.shadowId),!0)}).map(function(e){return{shadowId:e.shadowId,rootNode:axe.utils.getRootNode(e.actualNode)}});return axe.utils.uniqueArray(n,[])}(void 0===t?axe._tree[0]:t);if(!n.length)return Promise.resolve();var r=document.implementation.createHTMLDocument(\"Dynamic document for loading cssom\");return function(e,l){var c=[];return e.forEach(function(e,t){var n=e.rootNode,r=e.shadowId,a=function(e,t,n){var r;r=11===e.nodeType&&t?function(o,i){return Array.from(o.children).filter(we).reduce(function(e,t){var n=t.nodeName.toUpperCase(),r=\"STYLE\"===n?t.textContent:t,a=i({data:r,isLink:\"LINK\"===n,root:o});return e.push(a.sheet),e},[])}(e,n):function(e){return Array.from(e.styleSheets).filter(function(e){return ke(e.media.mediaText)})}(e);return function(e){var t=[];return e.filter(function(e){return!e.href||!t.includes(e.href)&&(t.push(e.href),!0)})}(r)}(n,r,l);if(!a)return Promise.all(c);var o=t+1,i={rootNode:n,shadowId:r,convertDataToStylesheet:l,rootIndex:o},u=[],s=Promise.all(a.map(function(e,t){var n=[o,t];return axe.utils.parseStylesheet(e,i,n,u)}));c.push(s)}),Promise.all(c)}(n,axe.utils.getStyleSheetFactory(r)).then(function(e){return function n(e){return e.reduce(function(e,t){return Array.isArray(t)?e.concat(n(t)):e.concat(t)},[])}(e)})},axe.utils.shouldPreload=function(e){return!e||void 0===e.preload||null===e.preload||(\"boolean\"==typeof e.preload?e.preload:function(e){return\"object\"===S(e)&&Array.isArray(e.assets)}(e.preload))},axe.utils.getPreloadConfig=function(e){var t=axe.constants.preload,n=t.assets,r=t.timeout,a={assets:n,timeout:r};if(!e.preload)return a;if(\"boolean\"==typeof e.preload)return a;if(!e.preload.assets.every(function(e){return n.includes(e.toLowerCase())}))throw new Error(\"Requested assets, not supported. \"+\"Supported assets are: \".concat(n.join(\", \"),\".\"));return a.assets=axe.utils.uniqueArray(e.preload.assets.map(function(e){return e.toLowerCase()}),[]),e.preload.timeout&&\"number\"==typeof e.preload.timeout&&!Number.isNaN(e.preload.timeout)&&(a.timeout=e.preload.timeout),a},axe.utils.preload=function(o){var i={cssom:axe.utils.preloadCssom};return axe.utils.shouldPreload(o)?new Promise(function(n,e){var t=axe.utils.getPreloadConfig(o),r=t.assets,a=t.timeout;setTimeout(function(){return e(\"Preload assets timed out.\")},a),Promise.all(r.map(function(t){return i[t](o).then(function(e){return function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}({},t,e)})})).then(function(e){var t=e.reduce(function(e,t){return R({},e,t)},{});n(t)})}):Promise.resolve()},axe.utils.publishMetaData=function(e){\"use strict\";var t=axe._audit.data.checks||{},n=axe._audit.data.rules||{},r=axe.utils.findBy(axe._audit.rules,\"id\",e.id)||{};e.tags=axe.utils.clone(r.tags||[]);var a=xe(t,!0),o=xe(t,!1);e.nodes.forEach(function(e){e.any.forEach(a),e.all.forEach(a),e.none.forEach(o)}),axe.utils.extendMetaData(e,axe.utils.clone(n[e.id]||{}))};var Ee=function(){},Ce=function(){};var Ae,Fe,je=(Ae=/(?=[\\-\\[\\]{}()*+?.\\\\\\^$|,#\\s])/g,function(e){return e.replace(Ae,\"\\\\\")}),ze=/\\\\/g;function qe(e){if(e)return e.map(function(e){var t,n,r=e.name.replace(ze,\"\"),a=(e.value||\"\").replace(ze,\"\");switch(e.operator){case\"^=\":n=new RegExp(\"^\"+je(a));break;case\"$=\":n=new RegExp(je(a)+\"$\");break;case\"~=\":n=new RegExp(\"(^|\\\\s)\"+je(a)+\"(\\\\s|$)\");break;case\"|=\":n=new RegExp(\"^\"+je(a)+\"(-|$)\");break;case\"=\":t=function(e){return a===e};break;case\"*=\":t=function(e){return e&&e.includes(a)};break;case\"!=\":t=function(e){return a!==e};break;default:t=function(e){return!!e}}return\"\"===a&&/^[*$^]=$/.test(e.operator)&&(t=function(){return!1}),{key:r,value:a,test:t=t||function(e){return e&&n.test(e)}}})}function Ne(e){if(e)return e.map(function(e){return{value:e=e.replace(ze,\"\"),regexp:new RegExp(\"(^|\\\\s)\"+je(e)+\"(\\\\s|$)\")}})}function Te(e){if(e)return e.map(function(e){var t;return\"not\"===e.name&&(t=(t=e.value).selectors?t.selectors:[t],t=Ee(t)),{name:e.name,expressions:t,value:e.value}})}function Se(e,t,n,r){var a={vNodes:e.slice(),anyLevel:t,thisLevel:n,parentShadowId:r};return a.vNodes.reverse(),a}function Re(e,t){return function(e,t){return 1===e.props.nodeType&&(\"*\"===t.tag||e.props.nodeName===t.tag)}(e,t[0])&&function(t,e){return!e.classes||e.classes.every(function(e){return t.hasClass(e.value)})}(e,t[0])&&function(r,e){return!e.attributes||e.attributes.reduce(function(e,t){var n=r.attr(t.key);return e&&null!==n&&(!t.value||t.test(n))},!0)}(e,t[0])&&function(e,t){return!t.id||e.props.id===t.id}(e,t[0])&&function(n,e){return!(e.pseudos&&!e.pseudos.reduce(function(e,t){if(\"not\"===t.name)return e&&!Ce([n],t.expressions,!1).length;throw new Error(\"the pseudo selector \"+t.name+\" has not yet been implemented\")},!0))}(e,t[0])}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function Oe(t,e){\"use strict\";var n,r,a=axe._audit&&axe._audit.tagExclude?axe._audit.tagExclude:[];return r=e.hasOwnProperty(\"include\")||e.hasOwnProperty(\"exclude\")?(n=e.include||[],n=Array.isArray(n)?n:[n],r=e.exclude||[],(r=Array.isArray(r)?r:[r]).concat(a.filter(function(e){return-1===n.indexOf(e)}))):(n=Array.isArray(e)?e:[e],a.filter(function(e){return-1===n.indexOf(e)})),!!(n.some(function(e){return-1!==t.tags.indexOf(e)})||0===n.length&&!1!==t.enabled)&&r.every(function(e){return-1===t.tags.indexOf(e)})}function _e(e){\"use strict\";return e.sort(function(e,t){return axe.utils.contains(e,t)?1:-1})[0]}function Be(t,e){\"use strict\";var n=e.include&&_e(e.include.filter(function(e){return axe.utils.contains(e,t)})),r=e.exclude&&_e(e.exclude.filter(function(e){return axe.utils.contains(e,t)}));return!!(!r&&n||r&&axe.utils.contains(r,n))}function Le(e,t){\"use strict\";var n;if(0===e.length)return t;e.length<t.length&&(n=e,e=t,t=n);for(var r=0,a=t.length;r<a;r++)e.includes(t[r])||e.push(t[r]);return e}Ee=function(e){return e.map(function(e){for(var t=[],n=e.rule;n;)t.push({tag:n.tagName?n.tagName.toLowerCase():\"*\",combinator:n.nestingOperator?n.nestingOperator:\" \",id:n.id,attributes:qe(n.attrs),classes:Ne(n.classNames),pseudos:Te(n.pseudos)}),n=n.rule;return t})},Ce=function(e,t,n,r){for(var a=[],o=Se(Array.isArray(e)?e:[e],t,[],e[0].shadowId),i=[];o.vNodes.length;){for(var u=o.vNodes.pop(),s=[],l=[],c=o.anyLevel.slice().concat(o.thisLevel),d=!1,m=0;m<c.length;m++){var p=c[m];if(Re(u,p)&&(!p[0].id||u.shadowId===o.parentShadowId))if(1===p.length)d||r&&!r(u)||(i.push(u),d=!0);else{var f=p.slice(1);if(!1===[\" \",\">\"].includes(f[0].combinator))throw new Error(\"axe.utils.querySelectorAll does not support the combinator: \"+p[1].combinator);\">\"===f[0].combinator?s.push(f):l.push(f)}!o.anyLevel.includes(p)||p[0].id&&u.shadowId!==o.parentShadowId||l.push(p)}for(u.children&&u.children.length&&n&&(a.push(o),o=Se(u.children,l,s,u.shadowId));!o.vNodes.length&&a.length;)o=a.pop()}return i},axe.utils.querySelectorAll=function(e,t){return axe.utils.querySelectorAllFilter(e,t)},axe.utils.querySelectorAllFilter=function(e,t,n){e=Array.isArray(e)?e:[e];var r=axe.utils.cssParser.parse(t);return r=r.selectors?r.selectors:[r],r=Ee(r),Ce(e,r,!0,n)},function(){\"use strict\";function m(){}function p(e){if(\"function\"!=typeof e)throw new TypeError(\"Queue methods require functions as arguments\")}axe.utils.queue=function(){function t(e){r=e,setTimeout(function(){null!=r&&axe.log(\"Uncaught error (of queue)\",r)},1)}var r,a=[],o=0,i=0,n=m,u=!1,s=t;function l(t){return function(e){a[t]=e,(i-=1)||n===m||(u=!0,n(a))}}function c(e){return n=m,s(e),a}var d={defer:function(e){if(\"object\"===S(e)&&e.then&&e.catch){var n=e;e=function(e,t){n.then(e).catch(t)}}if(p(e),void 0===r){if(u)throw new Error(\"Queue already completed\");return a.push(e),++i,function(){for(var e=a.length;o<e;o++){var t=a[o];try{t.call(null,l(o),c)}catch(e){c(e)}}}(),d}},then:function(e){if(p(e),n!==m)throw new Error(\"queue `then` already set\");return r||(n=e,i||(u=!0,n(a))),d},catch:function(e){if(p(e),s!==t)throw new Error(\"queue `catch` already set\");return r?(e(r),r=null):s=e,d},abort:c};return d}}(),function(e){\"use strict\";var s={},i={},a=Object.freeze([\"EvalError\",\"RangeError\",\"ReferenceError\",\"SyntaxError\",\"TypeError\",\"URIError\"]);function l(){var e=\"axeAPI\",t=\"\";return void 0!==axe&&axe._audit&&axe._audit.application&&(e=axe._audit.application),void 0!==axe&&(t=axe.version),e+\".\"+t}function u(e,t,n,r,a,o){var i;n instanceof Error&&(i={name:n.name,message:n.message,stack:n.stack},n=void 0);var u={uuid:r,topic:t,message:n,error:i,_respondable:!0,_source:l(),_keepalive:a};\"function\"==typeof o&&(s[r]=o),e.postMessage(JSON.stringify(u),\"*\")}function t(e,t,n,r,a){u(e,t,n,Fe.v1(),r,a)}function c(r,a,o){return function(e,t,n){u(r,a,e,o,t,n)}}function o(e){var t;if(\"string\"==typeof e){try{t=JSON.parse(e)}catch(e){}if(function(e){if(\"object\"!==S(e)||\"string\"!=typeof e.uuid||!0!==e._respondable)return!1;var t=l();return e._source===t||\"axeAPI.x.y.z\"===e._source||\"axeAPI.x.y.z\"===t}(t))return\"object\"===S(t.error)?t.error=function(e){var t=e.message||\"Unknown error occurred\",n=a.includes(e.name)?e.name:\"Error\",r=window[n]||Error;return e.stack&&(t+=\"\\n\"+e.stack.replace(e.message,\"\")),new r(t)}(t.error):t.error=void 0,t}}t.subscribe=function(e,t){i[e]=t},t.isInFrame=function(e){return!!(e=e||window).frameElement},\"function\"==typeof window.addEventListener&&window.addEventListener(\"message\",function(t){var n=o(t.data);if(n){var r=n.uuid,e=n._keepalive,a=s[r];if(a)a(n.error||n.message,e,c(t.source,n.topic,r)),e||delete s[r];if(!n.error)try{!function(e,t,n){var r=t.topic,a=i[r];if(a){var o=c(e,null,t.uuid);a(t.message,n,o)}}(t.source,n,e)}catch(e){u(t.source,n.topic,e,r,!1)}}},!1),e.respondable=t}(utils),axe.utils.ruleShouldRun=function(e,t,n){\"use strict\";var r=n.runOnly||{},a=(n.rules||{})[e.id];return!(e.pageLevel&&!t.page)&&(\"rule\"===r.type?-1!==r.values.indexOf(e.id):a&&\"boolean\"==typeof a.enabled?a.enabled:\"tag\"===r.type&&r.values?Oe(e,r.values):Oe(e,[]))},axe.utils.getScrollState=function(e){var t=0<arguments.length&&void 0!==e?e:window,n=t.document.documentElement;return[void 0!==t.pageXOffset?{elm:t,top:t.pageYOffset,left:t.pageXOffset}:{elm:n,top:n.scrollTop,left:n.scrollLeft}].concat(function r(e){return Array.from(e.children).reduce(function(e,t){var n=axe.utils.getScroll(t);return n&&e.push(n),e.concat(r(t))},[])}(document.body))},axe.utils.setScrollState=function(e){e.forEach(function(e){return function(e,t,n){if(e===window)return e.scroll(n,t);e.scrollTop=t,e.scrollLeft=n}(e.elm,e.top,e.left)})},axe.utils.select=function(e,t){\"use strict\";var n,r=[];if(axe._selectCache)for(var a=0,o=axe._selectCache.length;a<o;a++){var i=axe._selectCache[a];if(i.selector===e)return i.result}for(var u,s=(u=t,function(e){return Be(e,u)}),l=function(e){return e.reduce(function(e,t){return e.length&&axe.utils.contains(e[e.length-1],t)||e.push(t),e},[])}(t.include),c=0;c<l.length;c++)n=l[c],r=Le(r,axe.utils.querySelectorAllFilter(n,e,s));return axe._selectCache&&axe._selectCache.push({selector:e,result:r}),r},axe.utils.toArray=function(e){\"use strict\";return Array.prototype.slice.call(e)},axe.utils.uniqueArray=function(e,t){return e.concat(t).filter(function(e,t,n){return n.indexOf(e)===t})},axe.utils.tokenList=function(e){\"use strict\";return e.trim().replace(/\\s{2,}/g,\" \").split(\" \")},function(e){var i,t=e.crypto||e.msCrypto;if(!i&&t&&t.getRandomValues){var n=new Uint8Array(16);i=function(){return t.getRandomValues(n),n}}if(!i){var r=new Array(16);i=function(){for(var e,t=0;t<16;t++)0==(3&t)&&(e=4294967296*Math.random()),r[t]=e>>>((3&t)<<3)&255;return r}}for(var u=\"function\"==typeof e.Buffer?e.Buffer:Array,a=[],o={},s=0;s<256;s++)a[s]=(s+256).toString(16).substr(1),o[a[s]]=s;function p(e,t){var n=t||0,r=a;return r[e[n++]]+r[e[n++]]+r[e[n++]]+r[e[n++]]+\"-\"+r[e[n++]]+r[e[n++]]+\"-\"+r[e[n++]]+r[e[n++]]+\"-\"+r[e[n++]]+r[e[n++]]+\"-\"+r[e[n++]]+r[e[n++]]+r[e[n++]]+r[e[n++]]+r[e[n++]]+r[e[n++]]}var l=i(),f=[1|l[0],l[1],l[2],l[3],l[4],l[5]],h=16383&(l[6]<<8|l[7]),b=0,g=0;function c(e,t,n){var r=t&&n||0;\"string\"==typeof e&&(t=\"binary\"==e?new u(16):null,e=null);var a=(e=e||{}).random||(e.rng||i)();if(a[6]=15&a[6]|64,a[8]=63&a[8]|128,t)for(var o=0;o<16;o++)t[r+o]=a[o];return t||p(a)}(Fe=c).v1=function(e,t,n){var r=t&&n||0,a=t||[],o=null!=(e=e||{}).clockseq?e.clockseq:h,i=null!=e.msecs?e.msecs:(new Date).getTime(),u=null!=e.nsecs?e.nsecs:g+1,s=i-b+(u-g)/1e4;if(s<0&&null==e.clockseq&&(o=o+1&16383),(s<0||b<i)&&null==e.nsecs&&(u=0),1e4<=u)throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");b=i,h=o;var l=(1e4*(268435455&(i+=122192928e5))+(g=u))%4294967296;a[r++]=l>>>24&255,a[r++]=l>>>16&255,a[r++]=l>>>8&255,a[r++]=255&l;var c=i/4294967296*1e4&268435455;a[r++]=c>>>8&255,a[r++]=255&c,a[r++]=c>>>24&15|16,a[r++]=c>>>16&255,a[r++]=o>>>8|128,a[r++]=255&o;for(var d=e.node||f,m=0;m<6;m++)a[r+m]=d[m];return t||p(a)},Fe.v4=c,Fe.parse=function(e,t,n){var r=t&&n||0,a=0;for(t=t||[],e.toLowerCase().replace(/[0-9a-f]{2}/g,function(e){a<16&&(t[r+a++]=o[e])});a<16;)t[r+a++]=0;return t},Fe.unparse=p,Fe.BufferClass=u}(window),axe.utils.validInputTypes=function(){\"use strict\";return[\"hidden\",\"text\",\"search\",\"tel\",\"url\",\"email\",\"password\",\"date\",\"month\",\"week\",\"time\",\"datetime-local\",\"number\",\"range\",\"color\",\"checkbox\",\"radio\",\"file\",\"submit\",\"image\",\"reset\",\"button\"]};var Ie=[\"aa\",\"ab\",\"ae\",\"af\",\"ak\",\"am\",\"an\",\"ar\",\"as\",\"av\",\"ay\",\"az\",\"ba\",\"be\",\"bg\",\"bh\",\"bi\",\"bm\",\"bn\",\"bo\",\"br\",\"bs\",\"ca\",\"ce\",\"ch\",\"co\",\"cr\",\"cs\",\"cu\",\"cv\",\"cy\",\"da\",\"de\",\"dv\",\"dz\",\"ee\",\"el\",\"en\",\"eo\",\"es\",\"et\",\"eu\",\"fa\",\"ff\",\"fi\",\"fj\",\"fo\",\"fr\",\"fy\",\"ga\",\"gd\",\"gl\",\"gn\",\"gu\",\"gv\",\"ha\",\"he\",\"hi\",\"ho\",\"hr\",\"ht\",\"hu\",\"hy\",\"hz\",\"ia\",\"id\",\"ie\",\"ig\",\"ii\",\"ik\",\"in\",\"io\",\"is\",\"it\",\"iu\",\"iw\",\"ja\",\"ji\",\"jv\",\"jw\",\"ka\",\"kg\",\"ki\",\"kj\",\"kk\",\"kl\",\"km\",\"kn\",\"ko\",\"kr\",\"ks\",\"ku\",\"kv\",\"kw\",\"ky\",\"la\",\"lb\",\"lg\",\"li\",\"ln\",\"lo\",\"lt\",\"lu\",\"lv\",\"mg\",\"mh\",\"mi\",\"mk\",\"ml\",\"mn\",\"mo\",\"mr\",\"ms\",\"mt\",\"my\",\"na\",\"nb\",\"nd\",\"ne\",\"ng\",\"nl\",\"nn\",\"no\",\"nr\",\"nv\",\"ny\",\"oc\",\"oj\",\"om\",\"or\",\"os\",\"pa\",\"pi\",\"pl\",\"ps\",\"pt\",\"qu\",\"rm\",\"rn\",\"ro\",\"ru\",\"rw\",\"sa\",\"sc\",\"sd\",\"se\",\"sg\",\"sh\",\"si\",\"sk\",\"sl\",\"sm\",\"sn\",\"so\",\"sq\",\"sr\",\"ss\",\"st\",\"su\",\"sv\",\"sw\",\"ta\",\"te\",\"tg\",\"th\",\"ti\",\"tk\",\"tl\",\"tn\",\"to\",\"tr\",\"ts\",\"tt\",\"tw\",\"ty\",\"ug\",\"uk\",\"ur\",\"uz\",\"ve\",\"vi\",\"vo\",\"wa\",\"wo\",\"xh\",\"yi\",\"yo\",\"za\",\"zh\",\"zu\",\"aaa\",\"aab\",\"aac\",\"aad\",\"aae\",\"aaf\",\"aag\",\"aah\",\"aai\",\"aak\",\"aal\",\"aam\",\"aan\",\"aao\",\"aap\",\"aaq\",\"aas\",\"aat\",\"aau\",\"aav\",\"aaw\",\"aax\",\"aaz\",\"aba\",\"abb\",\"abc\",\"abd\",\"abe\",\"abf\",\"abg\",\"abh\",\"abi\",\"abj\",\"abl\",\"abm\",\"abn\",\"abo\",\"abp\",\"abq\",\"abr\",\"abs\",\"abt\",\"abu\",\"abv\",\"abw\",\"abx\",\"aby\",\"abz\",\"aca\",\"acb\",\"acd\",\"ace\",\"acf\",\"ach\",\"aci\",\"ack\",\"acl\",\"acm\",\"acn\",\"acp\",\"acq\",\"acr\",\"acs\",\"act\",\"acu\",\"acv\",\"acw\",\"acx\",\"acy\",\"acz\",\"ada\",\"adb\",\"add\",\"ade\",\"adf\",\"adg\",\"adh\",\"adi\",\"adj\",\"adl\",\"adn\",\"ado\",\"adp\",\"adq\",\"adr\",\"ads\",\"adt\",\"adu\",\"adw\",\"adx\",\"ady\",\"adz\",\"aea\",\"aeb\",\"aec\",\"aed\",\"aee\",\"aek\",\"ael\",\"aem\",\"aen\",\"aeq\",\"aer\",\"aes\",\"aeu\",\"aew\",\"aey\",\"aez\",\"afa\",\"afb\",\"afd\",\"afe\",\"afg\",\"afh\",\"afi\",\"afk\",\"afn\",\"afo\",\"afp\",\"afs\",\"aft\",\"afu\",\"afz\",\"aga\",\"agb\",\"agc\",\"agd\",\"age\",\"agf\",\"agg\",\"agh\",\"agi\",\"agj\",\"agk\",\"agl\",\"agm\",\"agn\",\"ago\",\"agp\",\"agq\",\"agr\",\"ags\",\"agt\",\"agu\",\"agv\",\"agw\",\"agx\",\"agy\",\"agz\",\"aha\",\"ahb\",\"ahg\",\"ahh\",\"ahi\",\"ahk\",\"ahl\",\"ahm\",\"ahn\",\"aho\",\"ahp\",\"ahr\",\"ahs\",\"aht\",\"aia\",\"aib\",\"aic\",\"aid\",\"aie\",\"aif\",\"aig\",\"aih\",\"aii\",\"aij\",\"aik\",\"ail\",\"aim\",\"ain\",\"aio\",\"aip\",\"aiq\",\"air\",\"ais\",\"ait\",\"aiw\",\"aix\",\"aiy\",\"aja\",\"ajg\",\"aji\",\"ajn\",\"ajp\",\"ajt\",\"aju\",\"ajw\",\"ajz\",\"akb\",\"akc\",\"akd\",\"ake\",\"akf\",\"akg\",\"akh\",\"aki\",\"akj\",\"akk\",\"akl\",\"akm\",\"ako\",\"akp\",\"akq\",\"akr\",\"aks\",\"akt\",\"aku\",\"akv\",\"akw\",\"akx\",\"aky\",\"akz\",\"ala\",\"alc\",\"ald\",\"ale\",\"alf\",\"alg\",\"alh\",\"ali\",\"alj\",\"alk\",\"all\",\"alm\",\"aln\",\"alo\",\"alp\",\"alq\",\"alr\",\"als\",\"alt\",\"alu\",\"alv\",\"alw\",\"alx\",\"aly\",\"alz\",\"ama\",\"amb\",\"amc\",\"ame\",\"amf\",\"amg\",\"ami\",\"amj\",\"amk\",\"aml\",\"amm\",\"amn\",\"amo\",\"amp\",\"amq\",\"amr\",\"ams\",\"amt\",\"amu\",\"amv\",\"amw\",\"amx\",\"amy\",\"amz\",\"ana\",\"anb\",\"anc\",\"and\",\"ane\",\"anf\",\"ang\",\"anh\",\"ani\",\"anj\",\"ank\",\"anl\",\"anm\",\"ann\",\"ano\",\"anp\",\"anq\",\"anr\",\"ans\",\"ant\",\"anu\",\"anv\",\"anw\",\"anx\",\"any\",\"anz\",\"aoa\",\"aob\",\"aoc\",\"aod\",\"aoe\",\"aof\",\"aog\",\"aoh\",\"aoi\",\"aoj\",\"aok\",\"aol\",\"aom\",\"aon\",\"aor\",\"aos\",\"aot\",\"aou\",\"aox\",\"aoz\",\"apa\",\"apb\",\"apc\",\"apd\",\"ape\",\"apf\",\"apg\",\"aph\",\"api\",\"apj\",\"apk\",\"apl\",\"apm\",\"apn\",\"apo\",\"app\",\"apq\",\"apr\",\"aps\",\"apt\",\"apu\",\"apv\",\"apw\",\"apx\",\"apy\",\"apz\",\"aqa\",\"aqc\",\"aqd\",\"aqg\",\"aql\",\"aqm\",\"aqn\",\"aqp\",\"aqr\",\"aqt\",\"aqz\",\"arb\",\"arc\",\"ard\",\"are\",\"arh\",\"ari\",\"arj\",\"ark\",\"arl\",\"arn\",\"aro\",\"arp\",\"arq\",\"arr\",\"ars\",\"art\",\"aru\",\"arv\",\"arw\",\"arx\",\"ary\",\"arz\",\"asa\",\"asb\",\"asc\",\"asd\",\"ase\",\"asf\",\"asg\",\"ash\",\"asi\",\"asj\",\"ask\",\"asl\",\"asn\",\"aso\",\"asp\",\"asq\",\"asr\",\"ass\",\"ast\",\"asu\",\"asv\",\"asw\",\"asx\",\"asy\",\"asz\",\"ata\",\"atb\",\"atc\",\"atd\",\"ate\",\"atg\",\"ath\",\"ati\",\"atj\",\"atk\",\"atl\",\"atm\",\"atn\",\"ato\",\"atp\",\"atq\",\"atr\",\"ats\",\"att\",\"atu\",\"atv\",\"atw\",\"atx\",\"aty\",\"atz\",\"aua\",\"aub\",\"auc\",\"aud\",\"aue\",\"auf\",\"aug\",\"auh\",\"aui\",\"auj\",\"auk\",\"aul\",\"aum\",\"aun\",\"auo\",\"aup\",\"auq\",\"aur\",\"aus\",\"aut\",\"auu\",\"auw\",\"aux\",\"auy\",\"auz\",\"avb\",\"avd\",\"avi\",\"avk\",\"avl\",\"avm\",\"avn\",\"avo\",\"avs\",\"avt\",\"avu\",\"avv\",\"awa\",\"awb\",\"awc\",\"awd\",\"awe\",\"awg\",\"awh\",\"awi\",\"awk\",\"awm\",\"awn\",\"awo\",\"awr\",\"aws\",\"awt\",\"awu\",\"awv\",\"aww\",\"awx\",\"awy\",\"axb\",\"axe\",\"axg\",\"axk\",\"axl\",\"axm\",\"axx\",\"aya\",\"ayb\",\"ayc\",\"ayd\",\"aye\",\"ayg\",\"ayh\",\"ayi\",\"ayk\",\"ayl\",\"ayn\",\"ayo\",\"ayp\",\"ayq\",\"ayr\",\"ays\",\"ayt\",\"ayu\",\"ayx\",\"ayy\",\"ayz\",\"aza\",\"azb\",\"azc\",\"azd\",\"azg\",\"azj\",\"azm\",\"azn\",\"azo\",\"azt\",\"azz\",\"baa\",\"bab\",\"bac\",\"bad\",\"bae\",\"baf\",\"bag\",\"bah\",\"bai\",\"baj\",\"bal\",\"ban\",\"bao\",\"bap\",\"bar\",\"bas\",\"bat\",\"bau\",\"bav\",\"baw\",\"bax\",\"bay\",\"baz\",\"bba\",\"bbb\",\"bbc\",\"bbd\",\"bbe\",\"bbf\",\"bbg\",\"bbh\",\"bbi\",\"bbj\",\"bbk\",\"bbl\",\"bbm\",\"bbn\",\"bbo\",\"bbp\",\"bbq\",\"bbr\",\"bbs\",\"bbt\",\"bbu\",\"bbv\",\"bbw\",\"bbx\",\"bby\",\"bbz\",\"bca\",\"bcb\",\"bcc\",\"bcd\",\"bce\",\"bcf\",\"bcg\",\"bch\",\"bci\",\"bcj\",\"bck\",\"bcl\",\"bcm\",\"bcn\",\"bco\",\"bcp\",\"bcq\",\"bcr\",\"bcs\",\"bct\",\"bcu\",\"bcv\",\"bcw\",\"bcy\",\"bcz\",\"bda\",\"bdb\",\"bdc\",\"bdd\",\"bde\",\"bdf\",\"bdg\",\"bdh\",\"bdi\",\"bdj\",\"bdk\",\"bdl\",\"bdm\",\"bdn\",\"bdo\",\"bdp\",\"bdq\",\"bdr\",\"bds\",\"bdt\",\"bdu\",\"bdv\",\"bdw\",\"bdx\",\"bdy\",\"bdz\",\"bea\",\"beb\",\"bec\",\"bed\",\"bee\",\"bef\",\"beg\",\"beh\",\"bei\",\"bej\",\"bek\",\"bem\",\"beo\",\"bep\",\"beq\",\"ber\",\"bes\",\"bet\",\"beu\",\"bev\",\"bew\",\"bex\",\"bey\",\"bez\",\"bfa\",\"bfb\",\"bfc\",\"bfd\",\"bfe\",\"bff\",\"bfg\",\"bfh\",\"bfi\",\"bfj\",\"bfk\",\"bfl\",\"bfm\",\"bfn\",\"bfo\",\"bfp\",\"bfq\",\"bfr\",\"bfs\",\"bft\",\"bfu\",\"bfw\",\"bfx\",\"bfy\",\"bfz\",\"bga\",\"bgb\",\"bgc\",\"bgd\",\"bge\",\"bgf\",\"bgg\",\"bgi\",\"bgj\",\"bgk\",\"bgl\",\"bgm\",\"bgn\",\"bgo\",\"bgp\",\"bgq\",\"bgr\",\"bgs\",\"bgt\",\"bgu\",\"bgv\",\"bgw\",\"bgx\",\"bgy\",\"bgz\",\"bha\",\"bhb\",\"bhc\",\"bhd\",\"bhe\",\"bhf\",\"bhg\",\"bhh\",\"bhi\",\"bhj\",\"bhk\",\"bhl\",\"bhm\",\"bhn\",\"bho\",\"bhp\",\"bhq\",\"bhr\",\"bhs\",\"bht\",\"bhu\",\"bhv\",\"bhw\",\"bhx\",\"bhy\",\"bhz\",\"bia\",\"bib\",\"bic\",\"bid\",\"bie\",\"bif\",\"big\",\"bij\",\"bik\",\"bil\",\"bim\",\"bin\",\"bio\",\"bip\",\"biq\",\"bir\",\"bit\",\"biu\",\"biv\",\"biw\",\"bix\",\"biy\",\"biz\",\"bja\",\"bjb\",\"bjc\",\"bjd\",\"bje\",\"bjf\",\"bjg\",\"bjh\",\"bji\",\"bjj\",\"bjk\",\"bjl\",\"bjm\",\"bjn\",\"bjo\",\"bjp\",\"bjq\",\"bjr\",\"bjs\",\"bjt\",\"bju\",\"bjv\",\"bjw\",\"bjx\",\"bjy\",\"bjz\",\"bka\",\"bkb\",\"bkc\",\"bkd\",\"bkf\",\"bkg\",\"bkh\",\"bki\",\"bkj\",\"bkk\",\"bkl\",\"bkm\",\"bkn\",\"bko\",\"bkp\",\"bkq\",\"bkr\",\"bks\",\"bkt\",\"bku\",\"bkv\",\"bkw\",\"bkx\",\"bky\",\"bkz\",\"bla\",\"blb\",\"blc\",\"bld\",\"ble\",\"blf\",\"blg\",\"blh\",\"bli\",\"blj\",\"blk\",\"bll\",\"blm\",\"bln\",\"blo\",\"blp\",\"blq\",\"blr\",\"bls\",\"blt\",\"blv\",\"blw\",\"blx\",\"bly\",\"blz\",\"bma\",\"bmb\",\"bmc\",\"bmd\",\"bme\",\"bmf\",\"bmg\",\"bmh\",\"bmi\",\"bmj\",\"bmk\",\"bml\",\"bmm\",\"bmn\",\"bmo\",\"bmp\",\"bmq\",\"bmr\",\"bms\",\"bmt\",\"bmu\",\"bmv\",\"bmw\",\"bmx\",\"bmy\",\"bmz\",\"bna\",\"bnb\",\"bnc\",\"bnd\",\"bne\",\"bnf\",\"bng\",\"bni\",\"bnj\",\"bnk\",\"bnl\",\"bnm\",\"bnn\",\"bno\",\"bnp\",\"bnq\",\"bnr\",\"bns\",\"bnt\",\"bnu\",\"bnv\",\"bnw\",\"bnx\",\"bny\",\"bnz\",\"boa\",\"bob\",\"boe\",\"bof\",\"bog\",\"boh\",\"boi\",\"boj\",\"bok\",\"bol\",\"bom\",\"bon\",\"boo\",\"bop\",\"boq\",\"bor\",\"bot\",\"bou\",\"bov\",\"bow\",\"box\",\"boy\",\"boz\",\"bpa\",\"bpb\",\"bpd\",\"bpg\",\"bph\",\"bpi\",\"bpj\",\"bpk\",\"bpl\",\"bpm\",\"bpn\",\"bpo\",\"bpp\",\"bpq\",\"bpr\",\"bps\",\"bpt\",\"bpu\",\"bpv\",\"bpw\",\"bpx\",\"bpy\",\"bpz\",\"bqa\",\"bqb\",\"bqc\",\"bqd\",\"bqf\",\"bqg\",\"bqh\",\"bqi\",\"bqj\",\"bqk\",\"bql\",\"bqm\",\"bqn\",\"bqo\",\"bqp\",\"bqq\",\"bqr\",\"bqs\",\"bqt\",\"bqu\",\"bqv\",\"bqw\",\"bqx\",\"bqy\",\"bqz\",\"bra\",\"brb\",\"brc\",\"brd\",\"brf\",\"brg\",\"brh\",\"bri\",\"brj\",\"brk\",\"brl\",\"brm\",\"brn\",\"bro\",\"brp\",\"brq\",\"brr\",\"brs\",\"brt\",\"bru\",\"brv\",\"brw\",\"brx\",\"bry\",\"brz\",\"bsa\",\"bsb\",\"bsc\",\"bse\",\"bsf\",\"bsg\",\"bsh\",\"bsi\",\"bsj\",\"bsk\",\"bsl\",\"bsm\",\"bsn\",\"bso\",\"bsp\",\"bsq\",\"bsr\",\"bss\",\"bst\",\"bsu\",\"bsv\",\"bsw\",\"bsx\",\"bsy\",\"bta\",\"btb\",\"btc\",\"btd\",\"bte\",\"btf\",\"btg\",\"bth\",\"bti\",\"btj\",\"btk\",\"btl\",\"btm\",\"btn\",\"bto\",\"btp\",\"btq\",\"btr\",\"bts\",\"btt\",\"btu\",\"btv\",\"btw\",\"btx\",\"bty\",\"btz\",\"bua\",\"bub\",\"buc\",\"bud\",\"bue\",\"buf\",\"bug\",\"buh\",\"bui\",\"buj\",\"buk\",\"bum\",\"bun\",\"buo\",\"bup\",\"buq\",\"bus\",\"but\",\"buu\",\"buv\",\"buw\",\"bux\",\"buy\",\"buz\",\"bva\",\"bvb\",\"bvc\",\"bvd\",\"bve\",\"bvf\",\"bvg\",\"bvh\",\"bvi\",\"bvj\",\"bvk\",\"bvl\",\"bvm\",\"bvn\",\"bvo\",\"bvp\",\"bvq\",\"bvr\",\"bvt\",\"bvu\",\"bvv\",\"bvw\",\"bvx\",\"bvy\",\"bvz\",\"bwa\",\"bwb\",\"bwc\",\"bwd\",\"bwe\",\"bwf\",\"bwg\",\"bwh\",\"bwi\",\"bwj\",\"bwk\",\"bwl\",\"bwm\",\"bwn\",\"bwo\",\"bwp\",\"bwq\",\"bwr\",\"bws\",\"bwt\",\"bwu\",\"bww\",\"bwx\",\"bwy\",\"bwz\",\"bxa\",\"bxb\",\"bxc\",\"bxd\",\"bxe\",\"bxf\",\"bxg\",\"bxh\",\"bxi\",\"bxj\",\"bxk\",\"bxl\",\"bxm\",\"bxn\",\"bxo\",\"bxp\",\"bxq\",\"bxr\",\"bxs\",\"bxu\",\"bxv\",\"bxw\",\"bxx\",\"bxz\",\"bya\",\"byb\",\"byc\",\"byd\",\"bye\",\"byf\",\"byg\",\"byh\",\"byi\",\"byj\",\"byk\",\"byl\",\"bym\",\"byn\",\"byo\",\"byp\",\"byq\",\"byr\",\"bys\",\"byt\",\"byv\",\"byw\",\"byx\",\"byy\",\"byz\",\"bza\",\"bzb\",\"bzc\",\"bzd\",\"bze\",\"bzf\",\"bzg\",\"bzh\",\"bzi\",\"bzj\",\"bzk\",\"bzl\",\"bzm\",\"bzn\",\"bzo\",\"bzp\",\"bzq\",\"bzr\",\"bzs\",\"bzt\",\"bzu\",\"bzv\",\"bzw\",\"bzx\",\"bzy\",\"bzz\",\"caa\",\"cab\",\"cac\",\"cad\",\"cae\",\"caf\",\"cag\",\"cah\",\"cai\",\"caj\",\"cak\",\"cal\",\"cam\",\"can\",\"cao\",\"cap\",\"caq\",\"car\",\"cas\",\"cau\",\"cav\",\"caw\",\"cax\",\"cay\",\"caz\",\"cba\",\"cbb\",\"cbc\",\"cbd\",\"cbe\",\"cbg\",\"cbh\",\"cbi\",\"cbj\",\"cbk\",\"cbl\",\"cbn\",\"cbo\",\"cbq\",\"cbr\",\"cbs\",\"cbt\",\"cbu\",\"cbv\",\"cbw\",\"cby\",\"cca\",\"ccc\",\"ccd\",\"cce\",\"ccg\",\"cch\",\"ccj\",\"ccl\",\"ccm\",\"ccn\",\"cco\",\"ccp\",\"ccq\",\"ccr\",\"ccs\",\"cda\",\"cdc\",\"cdd\",\"cde\",\"cdf\",\"cdg\",\"cdh\",\"cdi\",\"cdj\",\"cdm\",\"cdn\",\"cdo\",\"cdr\",\"cds\",\"cdy\",\"cdz\",\"cea\",\"ceb\",\"ceg\",\"cek\",\"cel\",\"cen\",\"cet\",\"cfa\",\"cfd\",\"cfg\",\"cfm\",\"cga\",\"cgc\",\"cgg\",\"cgk\",\"chb\",\"chc\",\"chd\",\"chf\",\"chg\",\"chh\",\"chj\",\"chk\",\"chl\",\"chm\",\"chn\",\"cho\",\"chp\",\"chq\",\"chr\",\"cht\",\"chw\",\"chx\",\"chy\",\"chz\",\"cia\",\"cib\",\"cic\",\"cid\",\"cie\",\"cih\",\"cik\",\"cim\",\"cin\",\"cip\",\"cir\",\"ciw\",\"ciy\",\"cja\",\"cje\",\"cjh\",\"cji\",\"cjk\",\"cjm\",\"cjn\",\"cjo\",\"cjp\",\"cjr\",\"cjs\",\"cjv\",\"cjy\",\"cka\",\"ckb\",\"ckh\",\"ckl\",\"ckn\",\"cko\",\"ckq\",\"ckr\",\"cks\",\"ckt\",\"cku\",\"ckv\",\"ckx\",\"cky\",\"ckz\",\"cla\",\"clc\",\"cld\",\"cle\",\"clh\",\"cli\",\"clj\",\"clk\",\"cll\",\"clm\",\"clo\",\"clt\",\"clu\",\"clw\",\"cly\",\"cma\",\"cmc\",\"cme\",\"cmg\",\"cmi\",\"cmk\",\"cml\",\"cmm\",\"cmn\",\"cmo\",\"cmr\",\"cms\",\"cmt\",\"cna\",\"cnb\",\"cnc\",\"cng\",\"cnh\",\"cni\",\"cnk\",\"cnl\",\"cno\",\"cnr\",\"cns\",\"cnt\",\"cnu\",\"cnw\",\"cnx\",\"coa\",\"cob\",\"coc\",\"cod\",\"coe\",\"cof\",\"cog\",\"coh\",\"coj\",\"cok\",\"col\",\"com\",\"con\",\"coo\",\"cop\",\"coq\",\"cot\",\"cou\",\"cov\",\"cow\",\"cox\",\"coy\",\"coz\",\"cpa\",\"cpb\",\"cpc\",\"cpe\",\"cpf\",\"cpg\",\"cpi\",\"cpn\",\"cpo\",\"cpp\",\"cps\",\"cpu\",\"cpx\",\"cpy\",\"cqd\",\"cqu\",\"cra\",\"crb\",\"crc\",\"crd\",\"crf\",\"crg\",\"crh\",\"cri\",\"crj\",\"crk\",\"crl\",\"crm\",\"crn\",\"cro\",\"crp\",\"crq\",\"crr\",\"crs\",\"crt\",\"crv\",\"crw\",\"crx\",\"cry\",\"crz\",\"csa\",\"csb\",\"csc\",\"csd\",\"cse\",\"csf\",\"csg\",\"csh\",\"csi\",\"csj\",\"csk\",\"csl\",\"csm\",\"csn\",\"cso\",\"csq\",\"csr\",\"css\",\"cst\",\"csu\",\"csv\",\"csw\",\"csy\",\"csz\",\"cta\",\"ctc\",\"ctd\",\"cte\",\"ctg\",\"cth\",\"ctl\",\"ctm\",\"ctn\",\"cto\",\"ctp\",\"cts\",\"ctt\",\"ctu\",\"ctz\",\"cua\",\"cub\",\"cuc\",\"cug\",\"cuh\",\"cui\",\"cuj\",\"cuk\",\"cul\",\"cum\",\"cuo\",\"cup\",\"cuq\",\"cur\",\"cus\",\"cut\",\"cuu\",\"cuv\",\"cuw\",\"cux\",\"cuy\",\"cvg\",\"cvn\",\"cwa\",\"cwb\",\"cwd\",\"cwe\",\"cwg\",\"cwt\",\"cya\",\"cyb\",\"cyo\",\"czh\",\"czk\",\"czn\",\"czo\",\"czt\",\"daa\",\"dac\",\"dad\",\"dae\",\"daf\",\"dag\",\"dah\",\"dai\",\"daj\",\"dak\",\"dal\",\"dam\",\"dao\",\"dap\",\"daq\",\"dar\",\"das\",\"dau\",\"dav\",\"daw\",\"dax\",\"day\",\"daz\",\"dba\",\"dbb\",\"dbd\",\"dbe\",\"dbf\",\"dbg\",\"dbi\",\"dbj\",\"dbl\",\"dbm\",\"dbn\",\"dbo\",\"dbp\",\"dbq\",\"dbr\",\"dbt\",\"dbu\",\"dbv\",\"dbw\",\"dby\",\"dcc\",\"dcr\",\"dda\",\"ddd\",\"dde\",\"ddg\",\"ddi\",\"ddj\",\"ddn\",\"ddo\",\"ddr\",\"dds\",\"ddw\",\"dec\",\"ded\",\"dee\",\"def\",\"deg\",\"deh\",\"dei\",\"dek\",\"del\",\"dem\",\"den\",\"dep\",\"deq\",\"der\",\"des\",\"dev\",\"dez\",\"dga\",\"dgb\",\"dgc\",\"dgd\",\"dge\",\"dgg\",\"dgh\",\"dgi\",\"dgk\",\"dgl\",\"dgn\",\"dgo\",\"dgr\",\"dgs\",\"dgt\",\"dgu\",\"dgw\",\"dgx\",\"dgz\",\"dha\",\"dhd\",\"dhg\",\"dhi\",\"dhl\",\"dhm\",\"dhn\",\"dho\",\"dhr\",\"dhs\",\"dhu\",\"dhv\",\"dhw\",\"dhx\",\"dia\",\"dib\",\"dic\",\"did\",\"dif\",\"dig\",\"dih\",\"dii\",\"dij\",\"dik\",\"dil\",\"dim\",\"din\",\"dio\",\"dip\",\"diq\",\"dir\",\"dis\",\"dit\",\"diu\",\"diw\",\"dix\",\"diy\",\"diz\",\"dja\",\"djb\",\"djc\",\"djd\",\"dje\",\"djf\",\"dji\",\"djj\",\"djk\",\"djl\",\"djm\",\"djn\",\"djo\",\"djr\",\"dju\",\"djw\",\"dka\",\"dkk\",\"dkl\",\"dkr\",\"dks\",\"dkx\",\"dlg\",\"dlk\",\"dlm\",\"dln\",\"dma\",\"dmb\",\"dmc\",\"dmd\",\"dme\",\"dmg\",\"dmk\",\"dml\",\"dmm\",\"dmn\",\"dmo\",\"dmr\",\"dms\",\"dmu\",\"dmv\",\"dmw\",\"dmx\",\"dmy\",\"dna\",\"dnd\",\"dne\",\"dng\",\"dni\",\"dnj\",\"dnk\",\"dnn\",\"dnr\",\"dnt\",\"dnu\",\"dnv\",\"dnw\",\"dny\",\"doa\",\"dob\",\"doc\",\"doe\",\"dof\",\"doh\",\"doi\",\"dok\",\"dol\",\"don\",\"doo\",\"dop\",\"doq\",\"dor\",\"dos\",\"dot\",\"dov\",\"dow\",\"dox\",\"doy\",\"doz\",\"dpp\",\"dra\",\"drb\",\"drc\",\"drd\",\"dre\",\"drg\",\"drh\",\"dri\",\"drl\",\"drn\",\"dro\",\"drq\",\"drr\",\"drs\",\"drt\",\"dru\",\"drw\",\"dry\",\"dsb\",\"dse\",\"dsh\",\"dsi\",\"dsl\",\"dsn\",\"dso\",\"dsq\",\"dta\",\"dtb\",\"dtd\",\"dth\",\"dti\",\"dtk\",\"dtm\",\"dtn\",\"dto\",\"dtp\",\"dtr\",\"dts\",\"dtt\",\"dtu\",\"dty\",\"dua\",\"dub\",\"duc\",\"dud\",\"due\",\"duf\",\"dug\",\"duh\",\"dui\",\"duj\",\"duk\",\"dul\",\"dum\",\"dun\",\"duo\",\"dup\",\"duq\",\"dur\",\"dus\",\"duu\",\"duv\",\"duw\",\"dux\",\"duy\",\"duz\",\"dva\",\"dwa\",\"dwl\",\"dwr\",\"dws\",\"dwu\",\"dww\",\"dwy\",\"dya\",\"dyb\",\"dyd\",\"dyg\",\"dyi\",\"dym\",\"dyn\",\"dyo\",\"dyu\",\"dyy\",\"dza\",\"dzd\",\"dze\",\"dzg\",\"dzl\",\"dzn\",\"eaa\",\"ebg\",\"ebk\",\"ebo\",\"ebr\",\"ebu\",\"ecr\",\"ecs\",\"ecy\",\"eee\",\"efa\",\"efe\",\"efi\",\"ega\",\"egl\",\"ego\",\"egx\",\"egy\",\"ehu\",\"eip\",\"eit\",\"eiv\",\"eja\",\"eka\",\"ekc\",\"eke\",\"ekg\",\"eki\",\"ekk\",\"ekl\",\"ekm\",\"eko\",\"ekp\",\"ekr\",\"eky\",\"ele\",\"elh\",\"eli\",\"elk\",\"elm\",\"elo\",\"elp\",\"elu\",\"elx\",\"ema\",\"emb\",\"eme\",\"emg\",\"emi\",\"emk\",\"emm\",\"emn\",\"emo\",\"emp\",\"ems\",\"emu\",\"emw\",\"emx\",\"emy\",\"ena\",\"enb\",\"enc\",\"end\",\"enf\",\"enh\",\"enl\",\"enm\",\"enn\",\"eno\",\"enq\",\"enr\",\"enu\",\"env\",\"enw\",\"enx\",\"eot\",\"epi\",\"era\",\"erg\",\"erh\",\"eri\",\"erk\",\"ero\",\"err\",\"ers\",\"ert\",\"erw\",\"ese\",\"esg\",\"esh\",\"esi\",\"esk\",\"esl\",\"esm\",\"esn\",\"eso\",\"esq\",\"ess\",\"esu\",\"esx\",\"esy\",\"etb\",\"etc\",\"eth\",\"etn\",\"eto\",\"etr\",\"ets\",\"ett\",\"etu\",\"etx\",\"etz\",\"euq\",\"eve\",\"evh\",\"evn\",\"ewo\",\"ext\",\"eya\",\"eyo\",\"eza\",\"eze\",\"faa\",\"fab\",\"fad\",\"faf\",\"fag\",\"fah\",\"fai\",\"faj\",\"fak\",\"fal\",\"fam\",\"fan\",\"fap\",\"far\",\"fat\",\"fau\",\"fax\",\"fay\",\"faz\",\"fbl\",\"fcs\",\"fer\",\"ffi\",\"ffm\",\"fgr\",\"fia\",\"fie\",\"fil\",\"fip\",\"fir\",\"fit\",\"fiu\",\"fiw\",\"fkk\",\"fkv\",\"fla\",\"flh\",\"fli\",\"fll\",\"fln\",\"flr\",\"fly\",\"fmp\",\"fmu\",\"fnb\",\"fng\",\"fni\",\"fod\",\"foi\",\"fom\",\"fon\",\"for\",\"fos\",\"fox\",\"fpe\",\"fqs\",\"frc\",\"frd\",\"frk\",\"frm\",\"fro\",\"frp\",\"frq\",\"frr\",\"frs\",\"frt\",\"fse\",\"fsl\",\"fss\",\"fub\",\"fuc\",\"fud\",\"fue\",\"fuf\",\"fuh\",\"fui\",\"fuj\",\"fum\",\"fun\",\"fuq\",\"fur\",\"fut\",\"fuu\",\"fuv\",\"fuy\",\"fvr\",\"fwa\",\"fwe\",\"gaa\",\"gab\",\"gac\",\"gad\",\"gae\",\"gaf\",\"gag\",\"gah\",\"gai\",\"gaj\",\"gak\",\"gal\",\"gam\",\"gan\",\"gao\",\"gap\",\"gaq\",\"gar\",\"gas\",\"gat\",\"gau\",\"gav\",\"gaw\",\"gax\",\"gay\",\"gaz\",\"gba\",\"gbb\",\"gbc\",\"gbd\",\"gbe\",\"gbf\",\"gbg\",\"gbh\",\"gbi\",\"gbj\",\"gbk\",\"gbl\",\"gbm\",\"gbn\",\"gbo\",\"gbp\",\"gbq\",\"gbr\",\"gbs\",\"gbu\",\"gbv\",\"gbw\",\"gbx\",\"gby\",\"gbz\",\"gcc\",\"gcd\",\"gce\",\"gcf\",\"gcl\",\"gcn\",\"gcr\",\"gct\",\"gda\",\"gdb\",\"gdc\",\"gdd\",\"gde\",\"gdf\",\"gdg\",\"gdh\",\"gdi\",\"gdj\",\"gdk\",\"gdl\",\"gdm\",\"gdn\",\"gdo\",\"gdq\",\"gdr\",\"gds\",\"gdt\",\"gdu\",\"gdx\",\"gea\",\"geb\",\"gec\",\"ged\",\"geg\",\"geh\",\"gei\",\"gej\",\"gek\",\"gel\",\"gem\",\"geq\",\"ges\",\"gev\",\"gew\",\"gex\",\"gey\",\"gez\",\"gfk\",\"gft\",\"gfx\",\"gga\",\"ggb\",\"ggd\",\"gge\",\"ggg\",\"ggk\",\"ggl\",\"ggn\",\"ggo\",\"ggr\",\"ggt\",\"ggu\",\"ggw\",\"gha\",\"ghc\",\"ghe\",\"ghh\",\"ghk\",\"ghl\",\"ghn\",\"gho\",\"ghr\",\"ghs\",\"ght\",\"gia\",\"gib\",\"gic\",\"gid\",\"gie\",\"gig\",\"gih\",\"gil\",\"gim\",\"gin\",\"gio\",\"gip\",\"giq\",\"gir\",\"gis\",\"git\",\"giu\",\"giw\",\"gix\",\"giy\",\"giz\",\"gji\",\"gjk\",\"gjm\",\"gjn\",\"gjr\",\"gju\",\"gka\",\"gkd\",\"gke\",\"gkn\",\"gko\",\"gkp\",\"gku\",\"glc\",\"gld\",\"glh\",\"gli\",\"glj\",\"glk\",\"gll\",\"glo\",\"glr\",\"glu\",\"glw\",\"gly\",\"gma\",\"gmb\",\"gmd\",\"gme\",\"gmg\",\"gmh\",\"gml\",\"gmm\",\"gmn\",\"gmq\",\"gmu\",\"gmv\",\"gmw\",\"gmx\",\"gmy\",\"gmz\",\"gna\",\"gnb\",\"gnc\",\"gnd\",\"gne\",\"gng\",\"gnh\",\"gni\",\"gnj\",\"gnk\",\"gnl\",\"gnm\",\"gnn\",\"gno\",\"gnq\",\"gnr\",\"gnt\",\"gnu\",\"gnw\",\"gnz\",\"goa\",\"gob\",\"goc\",\"god\",\"goe\",\"gof\",\"gog\",\"goh\",\"goi\",\"goj\",\"gok\",\"gol\",\"gom\",\"gon\",\"goo\",\"gop\",\"goq\",\"gor\",\"gos\",\"got\",\"gou\",\"gow\",\"gox\",\"goy\",\"goz\",\"gpa\",\"gpe\",\"gpn\",\"gqa\",\"gqi\",\"gqn\",\"gqr\",\"gqu\",\"gra\",\"grb\",\"grc\",\"grd\",\"grg\",\"grh\",\"gri\",\"grj\",\"grk\",\"grm\",\"gro\",\"grq\",\"grr\",\"grs\",\"grt\",\"gru\",\"grv\",\"grw\",\"grx\",\"gry\",\"grz\",\"gse\",\"gsg\",\"gsl\",\"gsm\",\"gsn\",\"gso\",\"gsp\",\"gss\",\"gsw\",\"gta\",\"gti\",\"gtu\",\"gua\",\"gub\",\"guc\",\"gud\",\"gue\",\"guf\",\"gug\",\"guh\",\"gui\",\"guk\",\"gul\",\"gum\",\"gun\",\"guo\",\"gup\",\"guq\",\"gur\",\"gus\",\"gut\",\"guu\",\"guv\",\"guw\",\"gux\",\"guz\",\"gva\",\"gvc\",\"gve\",\"gvf\",\"gvj\",\"gvl\",\"gvm\",\"gvn\",\"gvo\",\"gvp\",\"gvr\",\"gvs\",\"gvy\",\"gwa\",\"gwb\",\"gwc\",\"gwd\",\"gwe\",\"gwf\",\"gwg\",\"gwi\",\"gwj\",\"gwm\",\"gwn\",\"gwr\",\"gwt\",\"gwu\",\"gww\",\"gwx\",\"gxx\",\"gya\",\"gyb\",\"gyd\",\"gye\",\"gyf\",\"gyg\",\"gyi\",\"gyl\",\"gym\",\"gyn\",\"gyo\",\"gyr\",\"gyy\",\"gza\",\"gzi\",\"gzn\",\"haa\",\"hab\",\"hac\",\"had\",\"hae\",\"haf\",\"hag\",\"hah\",\"hai\",\"haj\",\"hak\",\"hal\",\"ham\",\"han\",\"hao\",\"hap\",\"haq\",\"har\",\"has\",\"hav\",\"haw\",\"hax\",\"hay\",\"haz\",\"hba\",\"hbb\",\"hbn\",\"hbo\",\"hbu\",\"hca\",\"hch\",\"hdn\",\"hds\",\"hdy\",\"hea\",\"hed\",\"heg\",\"heh\",\"hei\",\"hem\",\"hgm\",\"hgw\",\"hhi\",\"hhr\",\"hhy\",\"hia\",\"hib\",\"hid\",\"hif\",\"hig\",\"hih\",\"hii\",\"hij\",\"hik\",\"hil\",\"him\",\"hio\",\"hir\",\"hit\",\"hiw\",\"hix\",\"hji\",\"hka\",\"hke\",\"hkk\",\"hkn\",\"hks\",\"hla\",\"hlb\",\"hld\",\"hle\",\"hlt\",\"hlu\",\"hma\",\"hmb\",\"hmc\",\"hmd\",\"hme\",\"hmf\",\"hmg\",\"hmh\",\"hmi\",\"hmj\",\"hmk\",\"hml\",\"hmm\",\"hmn\",\"hmp\",\"hmq\",\"hmr\",\"hms\",\"hmt\",\"hmu\",\"hmv\",\"hmw\",\"hmx\",\"hmy\",\"hmz\",\"hna\",\"hnd\",\"hne\",\"hnh\",\"hni\",\"hnj\",\"hnn\",\"hno\",\"hns\",\"hnu\",\"hoa\",\"hob\",\"hoc\",\"hod\",\"hoe\",\"hoh\",\"hoi\",\"hoj\",\"hok\",\"hol\",\"hom\",\"hoo\",\"hop\",\"hor\",\"hos\",\"hot\",\"hov\",\"how\",\"hoy\",\"hoz\",\"hpo\",\"hps\",\"hra\",\"hrc\",\"hre\",\"hrk\",\"hrm\",\"hro\",\"hrp\",\"hrr\",\"hrt\",\"hru\",\"hrw\",\"hrx\",\"hrz\",\"hsb\",\"hsh\",\"hsl\",\"hsn\",\"hss\",\"hti\",\"hto\",\"hts\",\"htu\",\"htx\",\"hub\",\"huc\",\"hud\",\"hue\",\"huf\",\"hug\",\"huh\",\"hui\",\"huj\",\"huk\",\"hul\",\"hum\",\"huo\",\"hup\",\"huq\",\"hur\",\"hus\",\"hut\",\"huu\",\"huv\",\"huw\",\"hux\",\"huy\",\"huz\",\"hvc\",\"hve\",\"hvk\",\"hvn\",\"hvv\",\"hwa\",\"hwc\",\"hwo\",\"hya\",\"hyw\",\"hyx\",\"iai\",\"ian\",\"iap\",\"iar\",\"iba\",\"ibb\",\"ibd\",\"ibe\",\"ibg\",\"ibh\",\"ibi\",\"ibl\",\"ibm\",\"ibn\",\"ibr\",\"ibu\",\"iby\",\"ica\",\"ich\",\"icl\",\"icr\",\"ida\",\"idb\",\"idc\",\"idd\",\"ide\",\"idi\",\"idr\",\"ids\",\"idt\",\"idu\",\"ifa\",\"ifb\",\"ife\",\"iff\",\"ifk\",\"ifm\",\"ifu\",\"ify\",\"igb\",\"ige\",\"igg\",\"igl\",\"igm\",\"ign\",\"igo\",\"igs\",\"igw\",\"ihb\",\"ihi\",\"ihp\",\"ihw\",\"iin\",\"iir\",\"ijc\",\"ije\",\"ijj\",\"ijn\",\"ijo\",\"ijs\",\"ike\",\"iki\",\"ikk\",\"ikl\",\"iko\",\"ikp\",\"ikr\",\"iks\",\"ikt\",\"ikv\",\"ikw\",\"ikx\",\"ikz\",\"ila\",\"ilb\",\"ilg\",\"ili\",\"ilk\",\"ill\",\"ilm\",\"ilo\",\"ilp\",\"ils\",\"ilu\",\"ilv\",\"ilw\",\"ima\",\"ime\",\"imi\",\"iml\",\"imn\",\"imo\",\"imr\",\"ims\",\"imy\",\"inb\",\"inc\",\"ine\",\"ing\",\"inh\",\"inj\",\"inl\",\"inm\",\"inn\",\"ino\",\"inp\",\"ins\",\"int\",\"inz\",\"ior\",\"iou\",\"iow\",\"ipi\",\"ipo\",\"iqu\",\"iqw\",\"ira\",\"ire\",\"irh\",\"iri\",\"irk\",\"irn\",\"iro\",\"irr\",\"iru\",\"irx\",\"iry\",\"isa\",\"isc\",\"isd\",\"ise\",\"isg\",\"ish\",\"isi\",\"isk\",\"ism\",\"isn\",\"iso\",\"isr\",\"ist\",\"isu\",\"itb\",\"itc\",\"itd\",\"ite\",\"iti\",\"itk\",\"itl\",\"itm\",\"ito\",\"itr\",\"its\",\"itt\",\"itv\",\"itw\",\"itx\",\"ity\",\"itz\",\"ium\",\"ivb\",\"ivv\",\"iwk\",\"iwm\",\"iwo\",\"iws\",\"ixc\",\"ixl\",\"iya\",\"iyo\",\"iyx\",\"izh\",\"izi\",\"izr\",\"izz\",\"jaa\",\"jab\",\"jac\",\"jad\",\"jae\",\"jaf\",\"jah\",\"jaj\",\"jak\",\"jal\",\"jam\",\"jan\",\"jao\",\"jaq\",\"jar\",\"jas\",\"jat\",\"jau\",\"jax\",\"jay\",\"jaz\",\"jbe\",\"jbi\",\"jbj\",\"jbk\",\"jbn\",\"jbo\",\"jbr\",\"jbt\",\"jbu\",\"jbw\",\"jcs\",\"jct\",\"jda\",\"jdg\",\"jdt\",\"jeb\",\"jee\",\"jeg\",\"jeh\",\"jei\",\"jek\",\"jel\",\"jen\",\"jer\",\"jet\",\"jeu\",\"jgb\",\"jge\",\"jgk\",\"jgo\",\"jhi\",\"jhs\",\"jia\",\"jib\",\"jic\",\"jid\",\"jie\",\"jig\",\"jih\",\"jii\",\"jil\",\"jim\",\"jio\",\"jiq\",\"jit\",\"jiu\",\"jiv\",\"jiy\",\"jje\",\"jjr\",\"jka\",\"jkm\",\"jko\",\"jkp\",\"jkr\",\"jku\",\"jle\",\"jls\",\"jma\",\"jmb\",\"jmc\",\"jmd\",\"jmi\",\"jml\",\"jmn\",\"jmr\",\"jms\",\"jmw\",\"jmx\",\"jna\",\"jnd\",\"jng\",\"jni\",\"jnj\",\"jnl\",\"jns\",\"job\",\"jod\",\"jog\",\"jor\",\"jos\",\"jow\",\"jpa\",\"jpr\",\"jpx\",\"jqr\",\"jra\",\"jrb\",\"jrr\",\"jrt\",\"jru\",\"jsl\",\"jua\",\"jub\",\"juc\",\"jud\",\"juh\",\"jui\",\"juk\",\"jul\",\"jum\",\"jun\",\"juo\",\"jup\",\"jur\",\"jus\",\"jut\",\"juu\",\"juw\",\"juy\",\"jvd\",\"jvn\",\"jwi\",\"jya\",\"jye\",\"jyy\",\"kaa\",\"kab\",\"kac\",\"kad\",\"kae\",\"kaf\",\"kag\",\"kah\",\"kai\",\"kaj\",\"kak\",\"kam\",\"kao\",\"kap\",\"kaq\",\"kar\",\"kav\",\"kaw\",\"kax\",\"kay\",\"kba\",\"kbb\",\"kbc\",\"kbd\",\"kbe\",\"kbf\",\"kbg\",\"kbh\",\"kbi\",\"kbj\",\"kbk\",\"kbl\",\"kbm\",\"kbn\",\"kbo\",\"kbp\",\"kbq\",\"kbr\",\"kbs\",\"kbt\",\"kbu\",\"kbv\",\"kbw\",\"kbx\",\"kby\",\"kbz\",\"kca\",\"kcb\",\"kcc\",\"kcd\",\"kce\",\"kcf\",\"kcg\",\"kch\",\"kci\",\"kcj\",\"kck\",\"kcl\",\"kcm\",\"kcn\",\"kco\",\"kcp\",\"kcq\",\"kcr\",\"kcs\",\"kct\",\"kcu\",\"kcv\",\"kcw\",\"kcx\",\"kcy\",\"kcz\",\"kda\",\"kdc\",\"kdd\",\"kde\",\"kdf\",\"kdg\",\"kdh\",\"kdi\",\"kdj\",\"kdk\",\"kdl\",\"kdm\",\"kdn\",\"kdo\",\"kdp\",\"kdq\",\"kdr\",\"kdt\",\"kdu\",\"kdv\",\"kdw\",\"kdx\",\"kdy\",\"kdz\",\"kea\",\"keb\",\"kec\",\"ked\",\"kee\",\"kef\",\"keg\",\"keh\",\"kei\",\"kej\",\"kek\",\"kel\",\"kem\",\"ken\",\"keo\",\"kep\",\"keq\",\"ker\",\"kes\",\"ket\",\"keu\",\"kev\",\"kew\",\"kex\",\"key\",\"kez\",\"kfa\",\"kfb\",\"kfc\",\"kfd\",\"kfe\",\"kff\",\"kfg\",\"kfh\",\"kfi\",\"kfj\",\"kfk\",\"kfl\",\"kfm\",\"kfn\",\"kfo\",\"kfp\",\"kfq\",\"kfr\",\"kfs\",\"kft\",\"kfu\",\"kfv\",\"kfw\",\"kfx\",\"kfy\",\"kfz\",\"kga\",\"kgb\",\"kgc\",\"kgd\",\"kge\",\"kgf\",\"kgg\",\"kgh\",\"kgi\",\"kgj\",\"kgk\",\"kgl\",\"kgm\",\"kgn\",\"kgo\",\"kgp\",\"kgq\",\"kgr\",\"kgs\",\"kgt\",\"kgu\",\"kgv\",\"kgw\",\"kgx\",\"kgy\",\"kha\",\"khb\",\"khc\",\"khd\",\"khe\",\"khf\",\"khg\",\"khh\",\"khi\",\"khj\",\"khk\",\"khl\",\"khn\",\"kho\",\"khp\",\"khq\",\"khr\",\"khs\",\"kht\",\"khu\",\"khv\",\"khw\",\"khx\",\"khy\",\"khz\",\"kia\",\"kib\",\"kic\",\"kid\",\"kie\",\"kif\",\"kig\",\"kih\",\"kii\",\"kij\",\"kil\",\"kim\",\"kio\",\"kip\",\"kiq\",\"kis\",\"kit\",\"kiu\",\"kiv\",\"kiw\",\"kix\",\"kiy\",\"kiz\",\"kja\",\"kjb\",\"kjc\",\"kjd\",\"kje\",\"kjf\",\"kjg\",\"kjh\",\"kji\",\"kjj\",\"kjk\",\"kjl\",\"kjm\",\"kjn\",\"kjo\",\"kjp\",\"kjq\",\"kjr\",\"kjs\",\"kjt\",\"kju\",\"kjv\",\"kjx\",\"kjy\",\"kjz\",\"kka\",\"kkb\",\"kkc\",\"kkd\",\"kke\",\"kkf\",\"kkg\",\"kkh\",\"kki\",\"kkj\",\"kkk\",\"kkl\",\"kkm\",\"kkn\",\"kko\",\"kkp\",\"kkq\",\"kkr\",\"kks\",\"kkt\",\"kku\",\"kkv\",\"kkw\",\"kkx\",\"kky\",\"kkz\",\"kla\",\"klb\",\"klc\",\"kld\",\"kle\",\"klf\",\"klg\",\"klh\",\"kli\",\"klj\",\"klk\",\"kll\",\"klm\",\"kln\",\"klo\",\"klp\",\"klq\",\"klr\",\"kls\",\"klt\",\"klu\",\"klv\",\"klw\",\"klx\",\"kly\",\"klz\",\"kma\",\"kmb\",\"kmc\",\"kmd\",\"kme\",\"kmf\",\"kmg\",\"kmh\",\"kmi\",\"kmj\",\"kmk\",\"kml\",\"kmm\",\"kmn\",\"kmo\",\"kmp\",\"kmq\",\"kmr\",\"kms\",\"kmt\",\"kmu\",\"kmv\",\"kmw\",\"kmx\",\"kmy\",\"kmz\",\"kna\",\"knb\",\"knc\",\"knd\",\"kne\",\"knf\",\"kng\",\"kni\",\"knj\",\"knk\",\"knl\",\"knm\",\"knn\",\"kno\",\"knp\",\"knq\",\"knr\",\"kns\",\"knt\",\"knu\",\"knv\",\"knw\",\"knx\",\"kny\",\"knz\",\"koa\",\"koc\",\"kod\",\"koe\",\"kof\",\"kog\",\"koh\",\"koi\",\"koj\",\"kok\",\"kol\",\"koo\",\"kop\",\"koq\",\"kos\",\"kot\",\"kou\",\"kov\",\"kow\",\"kox\",\"koy\",\"koz\",\"kpa\",\"kpb\",\"kpc\",\"kpd\",\"kpe\",\"kpf\",\"kpg\",\"kph\",\"kpi\",\"kpj\",\"kpk\",\"kpl\",\"kpm\",\"kpn\",\"kpo\",\"kpp\",\"kpq\",\"kpr\",\"kps\",\"kpt\",\"kpu\",\"kpv\",\"kpw\",\"kpx\",\"kpy\",\"kpz\",\"kqa\",\"kqb\",\"kqc\",\"kqd\",\"kqe\",\"kqf\",\"kqg\",\"kqh\",\"kqi\",\"kqj\",\"kqk\",\"kql\",\"kqm\",\"kqn\",\"kqo\",\"kqp\",\"kqq\",\"kqr\",\"kqs\",\"kqt\",\"kqu\",\"kqv\",\"kqw\",\"kqx\",\"kqy\",\"kqz\",\"kra\",\"krb\",\"krc\",\"krd\",\"kre\",\"krf\",\"krh\",\"kri\",\"krj\",\"krk\",\"krl\",\"krm\",\"krn\",\"kro\",\"krp\",\"krr\",\"krs\",\"krt\",\"kru\",\"krv\",\"krw\",\"krx\",\"kry\",\"krz\",\"ksa\",\"ksb\",\"ksc\",\"ksd\",\"kse\",\"ksf\",\"ksg\",\"ksh\",\"ksi\",\"ksj\",\"ksk\",\"ksl\",\"ksm\",\"ksn\",\"kso\",\"ksp\",\"ksq\",\"ksr\",\"kss\",\"kst\",\"ksu\",\"ksv\",\"ksw\",\"ksx\",\"ksy\",\"ksz\",\"kta\",\"ktb\",\"ktc\",\"ktd\",\"kte\",\"ktf\",\"ktg\",\"kth\",\"kti\",\"ktj\",\"ktk\",\"ktl\",\"ktm\",\"ktn\",\"kto\",\"ktp\",\"ktq\",\"ktr\",\"kts\",\"ktt\",\"ktu\",\"ktv\",\"ktw\",\"ktx\",\"kty\",\"ktz\",\"kub\",\"kuc\",\"kud\",\"kue\",\"kuf\",\"kug\",\"kuh\",\"kui\",\"kuj\",\"kuk\",\"kul\",\"kum\",\"kun\",\"kuo\",\"kup\",\"kuq\",\"kus\",\"kut\",\"kuu\",\"kuv\",\"kuw\",\"kux\",\"kuy\",\"kuz\",\"kva\",\"kvb\",\"kvc\",\"kvd\",\"kve\",\"kvf\",\"kvg\",\"kvh\",\"kvi\",\"kvj\",\"kvk\",\"kvl\",\"kvm\",\"kvn\",\"kvo\",\"kvp\",\"kvq\",\"kvr\",\"kvs\",\"kvt\",\"kvu\",\"kvv\",\"kvw\",\"kvx\",\"kvy\",\"kvz\",\"kwa\",\"kwb\",\"kwc\",\"kwd\",\"kwe\",\"kwf\",\"kwg\",\"kwh\",\"kwi\",\"kwj\",\"kwk\",\"kwl\",\"kwm\",\"kwn\",\"kwo\",\"kwp\",\"kwq\",\"kwr\",\"kws\",\"kwt\",\"kwu\",\"kwv\",\"kww\",\"kwx\",\"kwy\",\"kwz\",\"kxa\",\"kxb\",\"kxc\",\"kxd\",\"kxe\",\"kxf\",\"kxh\",\"kxi\",\"kxj\",\"kxk\",\"kxl\",\"kxm\",\"kxn\",\"kxo\",\"kxp\",\"kxq\",\"kxr\",\"kxs\",\"kxt\",\"kxu\",\"kxv\",\"kxw\",\"kxx\",\"kxy\",\"kxz\",\"kya\",\"kyb\",\"kyc\",\"kyd\",\"kye\",\"kyf\",\"kyg\",\"kyh\",\"kyi\",\"kyj\",\"kyk\",\"kyl\",\"kym\",\"kyn\",\"kyo\",\"kyp\",\"kyq\",\"kyr\",\"kys\",\"kyt\",\"kyu\",\"kyv\",\"kyw\",\"kyx\",\"kyy\",\"kyz\",\"kza\",\"kzb\",\"kzc\",\"kzd\",\"kze\",\"kzf\",\"kzg\",\"kzh\",\"kzi\",\"kzj\",\"kzk\",\"kzl\",\"kzm\",\"kzn\",\"kzo\",\"kzp\",\"kzq\",\"kzr\",\"kzs\",\"kzt\",\"kzu\",\"kzv\",\"kzw\",\"kzx\",\"kzy\",\"kzz\",\"laa\",\"lab\",\"lac\",\"lad\",\"lae\",\"laf\",\"lag\",\"lah\",\"lai\",\"laj\",\"lak\",\"lal\",\"lam\",\"lan\",\"lap\",\"laq\",\"lar\",\"las\",\"lau\",\"law\",\"lax\",\"lay\",\"laz\",\"lba\",\"lbb\",\"lbc\",\"lbe\",\"lbf\",\"lbg\",\"lbi\",\"lbj\",\"lbk\",\"lbl\",\"lbm\",\"lbn\",\"lbo\",\"lbq\",\"lbr\",\"lbs\",\"lbt\",\"lbu\",\"lbv\",\"lbw\",\"lbx\",\"lby\",\"lbz\",\"lcc\",\"lcd\",\"lce\",\"lcf\",\"lch\",\"lcl\",\"lcm\",\"lcp\",\"lcq\",\"lcs\",\"lda\",\"ldb\",\"ldd\",\"ldg\",\"ldh\",\"ldi\",\"ldj\",\"ldk\",\"ldl\",\"ldm\",\"ldn\",\"ldo\",\"ldp\",\"ldq\",\"lea\",\"leb\",\"lec\",\"led\",\"lee\",\"lef\",\"leg\",\"leh\",\"lei\",\"lej\",\"lek\",\"lel\",\"lem\",\"len\",\"leo\",\"lep\",\"leq\",\"ler\",\"les\",\"let\",\"leu\",\"lev\",\"lew\",\"lex\",\"ley\",\"lez\",\"lfa\",\"lfn\",\"lga\",\"lgb\",\"lgg\",\"lgh\",\"lgi\",\"lgk\",\"lgl\",\"lgm\",\"lgn\",\"lgq\",\"lgr\",\"lgt\",\"lgu\",\"lgz\",\"lha\",\"lhh\",\"lhi\",\"lhl\",\"lhm\",\"lhn\",\"lhp\",\"lhs\",\"lht\",\"lhu\",\"lia\",\"lib\",\"lic\",\"lid\",\"lie\",\"lif\",\"lig\",\"lih\",\"lii\",\"lij\",\"lik\",\"lil\",\"lio\",\"lip\",\"liq\",\"lir\",\"lis\",\"liu\",\"liv\",\"liw\",\"lix\",\"liy\",\"liz\",\"lja\",\"lje\",\"lji\",\"ljl\",\"ljp\",\"ljw\",\"ljx\",\"lka\",\"lkb\",\"lkc\",\"lkd\",\"lke\",\"lkh\",\"lki\",\"lkj\",\"lkl\",\"lkm\",\"lkn\",\"lko\",\"lkr\",\"lks\",\"lkt\",\"lku\",\"lky\",\"lla\",\"llb\",\"llc\",\"lld\",\"lle\",\"llf\",\"llg\",\"llh\",\"lli\",\"llj\",\"llk\",\"lll\",\"llm\",\"lln\",\"llo\",\"llp\",\"llq\",\"lls\",\"llu\",\"llx\",\"lma\",\"lmb\",\"lmc\",\"lmd\",\"lme\",\"lmf\",\"lmg\",\"lmh\",\"lmi\",\"lmj\",\"lmk\",\"lml\",\"lmm\",\"lmn\",\"lmo\",\"lmp\",\"lmq\",\"lmr\",\"lmu\",\"lmv\",\"lmw\",\"lmx\",\"lmy\",\"lmz\",\"lna\",\"lnb\",\"lnd\",\"lng\",\"lnh\",\"lni\",\"lnj\",\"lnl\",\"lnm\",\"lnn\",\"lno\",\"lns\",\"lnu\",\"lnw\",\"lnz\",\"loa\",\"lob\",\"loc\",\"loe\",\"lof\",\"log\",\"loh\",\"loi\",\"loj\",\"lok\",\"lol\",\"lom\",\"lon\",\"loo\",\"lop\",\"loq\",\"lor\",\"los\",\"lot\",\"lou\",\"lov\",\"low\",\"lox\",\"loy\",\"loz\",\"lpa\",\"lpe\",\"lpn\",\"lpo\",\"lpx\",\"lra\",\"lrc\",\"lre\",\"lrg\",\"lri\",\"lrk\",\"lrl\",\"lrm\",\"lrn\",\"lro\",\"lrr\",\"lrt\",\"lrv\",\"lrz\",\"lsa\",\"lsd\",\"lse\",\"lsg\",\"lsh\",\"lsi\",\"lsl\",\"lsm\",\"lso\",\"lsp\",\"lsr\",\"lss\",\"lst\",\"lsy\",\"ltc\",\"ltg\",\"lth\",\"lti\",\"ltn\",\"lto\",\"lts\",\"ltu\",\"lua\",\"luc\",\"lud\",\"lue\",\"luf\",\"lui\",\"luj\",\"luk\",\"lul\",\"lum\",\"lun\",\"luo\",\"lup\",\"luq\",\"lur\",\"lus\",\"lut\",\"luu\",\"luv\",\"luw\",\"luy\",\"luz\",\"lva\",\"lvk\",\"lvs\",\"lvu\",\"lwa\",\"lwe\",\"lwg\",\"lwh\",\"lwl\",\"lwm\",\"lwo\",\"lws\",\"lwt\",\"lwu\",\"lww\",\"lya\",\"lyg\",\"lyn\",\"lzh\",\"lzl\",\"lzn\",\"lzz\",\"maa\",\"mab\",\"mad\",\"mae\",\"maf\",\"mag\",\"mai\",\"maj\",\"mak\",\"mam\",\"man\",\"map\",\"maq\",\"mas\",\"mat\",\"mau\",\"mav\",\"maw\",\"max\",\"maz\",\"mba\",\"mbb\",\"mbc\",\"mbd\",\"mbe\",\"mbf\",\"mbh\",\"mbi\",\"mbj\",\"mbk\",\"mbl\",\"mbm\",\"mbn\",\"mbo\",\"mbp\",\"mbq\",\"mbr\",\"mbs\",\"mbt\",\"mbu\",\"mbv\",\"mbw\",\"mbx\",\"mby\",\"mbz\",\"mca\",\"mcb\",\"mcc\",\"mcd\",\"mce\",\"mcf\",\"mcg\",\"mch\",\"mci\",\"mcj\",\"mck\",\"mcl\",\"mcm\",\"mcn\",\"mco\",\"mcp\",\"mcq\",\"mcr\",\"mcs\",\"mct\",\"mcu\",\"mcv\",\"mcw\",\"mcx\",\"mcy\",\"mcz\",\"mda\",\"mdb\",\"mdc\",\"mdd\",\"mde\",\"mdf\",\"mdg\",\"mdh\",\"mdi\",\"mdj\",\"mdk\",\"mdl\",\"mdm\",\"mdn\",\"mdp\",\"mdq\",\"mdr\",\"mds\",\"mdt\",\"mdu\",\"mdv\",\"mdw\",\"mdx\",\"mdy\",\"mdz\",\"mea\",\"meb\",\"mec\",\"med\",\"mee\",\"mef\",\"meg\",\"meh\",\"mei\",\"mej\",\"mek\",\"mel\",\"mem\",\"men\",\"meo\",\"mep\",\"meq\",\"mer\",\"mes\",\"met\",\"meu\",\"mev\",\"mew\",\"mey\",\"mez\",\"mfa\",\"mfb\",\"mfc\",\"mfd\",\"mfe\",\"mff\",\"mfg\",\"mfh\",\"mfi\",\"mfj\",\"mfk\",\"mfl\",\"mfm\",\"mfn\",\"mfo\",\"mfp\",\"mfq\",\"mfr\",\"mfs\",\"mft\",\"mfu\",\"mfv\",\"mfw\",\"mfx\",\"mfy\",\"mfz\",\"mga\",\"mgb\",\"mgc\",\"mgd\",\"mge\",\"mgf\",\"mgg\",\"mgh\",\"mgi\",\"mgj\",\"mgk\",\"mgl\",\"mgm\",\"mgn\",\"mgo\",\"mgp\",\"mgq\",\"mgr\",\"mgs\",\"mgt\",\"mgu\",\"mgv\",\"mgw\",\"mgx\",\"mgy\",\"mgz\",\"mha\",\"mhb\",\"mhc\",\"mhd\",\"mhe\",\"mhf\",\"mhg\",\"mhh\",\"mhi\",\"mhj\",\"mhk\",\"mhl\",\"mhm\",\"mhn\",\"mho\",\"mhp\",\"mhq\",\"mhr\",\"mhs\",\"mht\",\"mhu\",\"mhw\",\"mhx\",\"mhy\",\"mhz\",\"mia\",\"mib\",\"mic\",\"mid\",\"mie\",\"mif\",\"mig\",\"mih\",\"mii\",\"mij\",\"mik\",\"mil\",\"mim\",\"min\",\"mio\",\"mip\",\"miq\",\"mir\",\"mis\",\"mit\",\"miu\",\"miw\",\"mix\",\"miy\",\"miz\",\"mja\",\"mjb\",\"mjc\",\"mjd\",\"mje\",\"mjg\",\"mjh\",\"mji\",\"mjj\",\"mjk\",\"mjl\",\"mjm\",\"mjn\",\"mjo\",\"mjp\",\"mjq\",\"mjr\",\"mjs\",\"mjt\",\"mju\",\"mjv\",\"mjw\",\"mjx\",\"mjy\",\"mjz\",\"mka\",\"mkb\",\"mkc\",\"mke\",\"mkf\",\"mkg\",\"mkh\",\"mki\",\"mkj\",\"mkk\",\"mkl\",\"mkm\",\"mkn\",\"mko\",\"mkp\",\"mkq\",\"mkr\",\"mks\",\"mkt\",\"mku\",\"mkv\",\"mkw\",\"mkx\",\"mky\",\"mkz\",\"mla\",\"mlb\",\"mlc\",\"mld\",\"mle\",\"mlf\",\"mlh\",\"mli\",\"mlj\",\"mlk\",\"mll\",\"mlm\",\"mln\",\"mlo\",\"mlp\",\"mlq\",\"mlr\",\"mls\",\"mlu\",\"mlv\",\"mlw\",\"mlx\",\"mlz\",\"mma\",\"mmb\",\"mmc\",\"mmd\",\"mme\",\"mmf\",\"mmg\",\"mmh\",\"mmi\",\"mmj\",\"mmk\",\"mml\",\"mmm\",\"mmn\",\"mmo\",\"mmp\",\"mmq\",\"mmr\",\"mmt\",\"mmu\",\"mmv\",\"mmw\",\"mmx\",\"mmy\",\"mmz\",\"mna\",\"mnb\",\"mnc\",\"mnd\",\"mne\",\"mnf\",\"mng\",\"mnh\",\"mni\",\"mnj\",\"mnk\",\"mnl\",\"mnm\",\"mnn\",\"mno\",\"mnp\",\"mnq\",\"mnr\",\"mns\",\"mnt\",\"mnu\",\"mnv\",\"mnw\",\"mnx\",\"mny\",\"mnz\",\"moa\",\"moc\",\"mod\",\"moe\",\"mof\",\"mog\",\"moh\",\"moi\",\"moj\",\"mok\",\"mom\",\"moo\",\"mop\",\"moq\",\"mor\",\"mos\",\"mot\",\"mou\",\"mov\",\"mow\",\"mox\",\"moy\",\"moz\",\"mpa\",\"mpb\",\"mpc\",\"mpd\",\"mpe\",\"mpg\",\"mph\",\"mpi\",\"mpj\",\"mpk\",\"mpl\",\"mpm\",\"mpn\",\"mpo\",\"mpp\",\"mpq\",\"mpr\",\"mps\",\"mpt\",\"mpu\",\"mpv\",\"mpw\",\"mpx\",\"mpy\",\"mpz\",\"mqa\",\"mqb\",\"mqc\",\"mqe\",\"mqf\",\"mqg\",\"mqh\",\"mqi\",\"mqj\",\"mqk\",\"mql\",\"mqm\",\"mqn\",\"mqo\",\"mqp\",\"mqq\",\"mqr\",\"mqs\",\"mqt\",\"mqu\",\"mqv\",\"mqw\",\"mqx\",\"mqy\",\"mqz\",\"mra\",\"mrb\",\"mrc\",\"mrd\",\"mre\",\"mrf\",\"mrg\",\"mrh\",\"mrj\",\"mrk\",\"mrl\",\"mrm\",\"mrn\",\"mro\",\"mrp\",\"mrq\",\"mrr\",\"mrs\",\"mrt\",\"mru\",\"mrv\",\"mrw\",\"mrx\",\"mry\",\"mrz\",\"msb\",\"msc\",\"msd\",\"mse\",\"msf\",\"msg\",\"msh\",\"msi\",\"msj\",\"msk\",\"msl\",\"msm\",\"msn\",\"mso\",\"msp\",\"msq\",\"msr\",\"mss\",\"mst\",\"msu\",\"msv\",\"msw\",\"msx\",\"msy\",\"msz\",\"mta\",\"mtb\",\"mtc\",\"mtd\",\"mte\",\"mtf\",\"mtg\",\"mth\",\"mti\",\"mtj\",\"mtk\",\"mtl\",\"mtm\",\"mtn\",\"mto\",\"mtp\",\"mtq\",\"mtr\",\"mts\",\"mtt\",\"mtu\",\"mtv\",\"mtw\",\"mtx\",\"mty\",\"mua\",\"mub\",\"muc\",\"mud\",\"mue\",\"mug\",\"muh\",\"mui\",\"muj\",\"muk\",\"mul\",\"mum\",\"mun\",\"muo\",\"mup\",\"muq\",\"mur\",\"mus\",\"mut\",\"muu\",\"muv\",\"mux\",\"muy\",\"muz\",\"mva\",\"mvb\",\"mvd\",\"mve\",\"mvf\",\"mvg\",\"mvh\",\"mvi\",\"mvk\",\"mvl\",\"mvm\",\"mvn\",\"mvo\",\"mvp\",\"mvq\",\"mvr\",\"mvs\",\"mvt\",\"mvu\",\"mvv\",\"mvw\",\"mvx\",\"mvy\",\"mvz\",\"mwa\",\"mwb\",\"mwc\",\"mwd\",\"mwe\",\"mwf\",\"mwg\",\"mwh\",\"mwi\",\"mwj\",\"mwk\",\"mwl\",\"mwm\",\"mwn\",\"mwo\",\"mwp\",\"mwq\",\"mwr\",\"mws\",\"mwt\",\"mwu\",\"mwv\",\"mww\",\"mwx\",\"mwy\",\"mwz\",\"mxa\",\"mxb\",\"mxc\",\"mxd\",\"mxe\",\"mxf\",\"mxg\",\"mxh\",\"mxi\",\"mxj\",\"mxk\",\"mxl\",\"mxm\",\"mxn\",\"mxo\",\"mxp\",\"mxq\",\"mxr\",\"mxs\",\"mxt\",\"mxu\",\"mxv\",\"mxw\",\"mxx\",\"mxy\",\"mxz\",\"myb\",\"myc\",\"myd\",\"mye\",\"myf\",\"myg\",\"myh\",\"myi\",\"myj\",\"myk\",\"myl\",\"mym\",\"myn\",\"myo\",\"myp\",\"myq\",\"myr\",\"mys\",\"myt\",\"myu\",\"myv\",\"myw\",\"myx\",\"myy\",\"myz\",\"mza\",\"mzb\",\"mzc\",\"mzd\",\"mze\",\"mzg\",\"mzh\",\"mzi\",\"mzj\",\"mzk\",\"mzl\",\"mzm\",\"mzn\",\"mzo\",\"mzp\",\"mzq\",\"mzr\",\"mzs\",\"mzt\",\"mzu\",\"mzv\",\"mzw\",\"mzx\",\"mzy\",\"mzz\",\"naa\",\"nab\",\"nac\",\"nad\",\"nae\",\"naf\",\"nag\",\"nah\",\"nai\",\"naj\",\"nak\",\"nal\",\"nam\",\"nan\",\"nao\",\"nap\",\"naq\",\"nar\",\"nas\",\"nat\",\"naw\",\"nax\",\"nay\",\"naz\",\"nba\",\"nbb\",\"nbc\",\"nbd\",\"nbe\",\"nbf\",\"nbg\",\"nbh\",\"nbi\",\"nbj\",\"nbk\",\"nbm\",\"nbn\",\"nbo\",\"nbp\",\"nbq\",\"nbr\",\"nbs\",\"nbt\",\"nbu\",\"nbv\",\"nbw\",\"nbx\",\"nby\",\"nca\",\"ncb\",\"ncc\",\"ncd\",\"nce\",\"ncf\",\"ncg\",\"nch\",\"nci\",\"ncj\",\"nck\",\"ncl\",\"ncm\",\"ncn\",\"nco\",\"ncp\",\"ncq\",\"ncr\",\"ncs\",\"nct\",\"ncu\",\"ncx\",\"ncz\",\"nda\",\"ndb\",\"ndc\",\"ndd\",\"ndf\",\"ndg\",\"ndh\",\"ndi\",\"ndj\",\"ndk\",\"ndl\",\"ndm\",\"ndn\",\"ndp\",\"ndq\",\"ndr\",\"nds\",\"ndt\",\"ndu\",\"ndv\",\"ndw\",\"ndx\",\"ndy\",\"ndz\",\"nea\",\"neb\",\"nec\",\"ned\",\"nee\",\"nef\",\"neg\",\"neh\",\"nei\",\"nej\",\"nek\",\"nem\",\"nen\",\"neo\",\"neq\",\"ner\",\"nes\",\"net\",\"neu\",\"nev\",\"new\",\"nex\",\"ney\",\"nez\",\"nfa\",\"nfd\",\"nfl\",\"nfr\",\"nfu\",\"nga\",\"ngb\",\"ngc\",\"ngd\",\"nge\",\"ngf\",\"ngg\",\"ngh\",\"ngi\",\"ngj\",\"ngk\",\"ngl\",\"ngm\",\"ngn\",\"ngo\",\"ngp\",\"ngq\",\"ngr\",\"ngs\",\"ngt\",\"ngu\",\"ngv\",\"ngw\",\"ngx\",\"ngy\",\"ngz\",\"nha\",\"nhb\",\"nhc\",\"nhd\",\"nhe\",\"nhf\",\"nhg\",\"nhh\",\"nhi\",\"nhk\",\"nhm\",\"nhn\",\"nho\",\"nhp\",\"nhq\",\"nhr\",\"nht\",\"nhu\",\"nhv\",\"nhw\",\"nhx\",\"nhy\",\"nhz\",\"nia\",\"nib\",\"nic\",\"nid\",\"nie\",\"nif\",\"nig\",\"nih\",\"nii\",\"nij\",\"nik\",\"nil\",\"nim\",\"nin\",\"nio\",\"niq\",\"nir\",\"nis\",\"nit\",\"niu\",\"niv\",\"niw\",\"nix\",\"niy\",\"niz\",\"nja\",\"njb\",\"njd\",\"njh\",\"nji\",\"njj\",\"njl\",\"njm\",\"njn\",\"njo\",\"njr\",\"njs\",\"njt\",\"nju\",\"njx\",\"njy\",\"njz\",\"nka\",\"nkb\",\"nkc\",\"nkd\",\"nke\",\"nkf\",\"nkg\",\"nkh\",\"nki\",\"nkj\",\"nkk\",\"nkm\",\"nkn\",\"nko\",\"nkp\",\"nkq\",\"nkr\",\"nks\",\"nkt\",\"nku\",\"nkv\",\"nkw\",\"nkx\",\"nkz\",\"nla\",\"nlc\",\"nle\",\"nlg\",\"nli\",\"nlj\",\"nlk\",\"nll\",\"nlm\",\"nln\",\"nlo\",\"nlq\",\"nlr\",\"nlu\",\"nlv\",\"nlw\",\"nlx\",\"nly\",\"nlz\",\"nma\",\"nmb\",\"nmc\",\"nmd\",\"nme\",\"nmf\",\"nmg\",\"nmh\",\"nmi\",\"nmj\",\"nmk\",\"nml\",\"nmm\",\"nmn\",\"nmo\",\"nmp\",\"nmq\",\"nmr\",\"nms\",\"nmt\",\"nmu\",\"nmv\",\"nmw\",\"nmx\",\"nmy\",\"nmz\",\"nna\",\"nnb\",\"nnc\",\"nnd\",\"nne\",\"nnf\",\"nng\",\"nnh\",\"nni\",\"nnj\",\"nnk\",\"nnl\",\"nnm\",\"nnn\",\"nnp\",\"nnq\",\"nnr\",\"nns\",\"nnt\",\"nnu\",\"nnv\",\"nnw\",\"nnx\",\"nny\",\"nnz\",\"noa\",\"noc\",\"nod\",\"noe\",\"nof\",\"nog\",\"noh\",\"noi\",\"noj\",\"nok\",\"nol\",\"nom\",\"non\",\"noo\",\"nop\",\"noq\",\"nos\",\"not\",\"nou\",\"nov\",\"now\",\"noy\",\"noz\",\"npa\",\"npb\",\"npg\",\"nph\",\"npi\",\"npl\",\"npn\",\"npo\",\"nps\",\"npu\",\"npx\",\"npy\",\"nqg\",\"nqk\",\"nql\",\"nqm\",\"nqn\",\"nqo\",\"nqq\",\"nqy\",\"nra\",\"nrb\",\"nrc\",\"nre\",\"nrf\",\"nrg\",\"nri\",\"nrk\",\"nrl\",\"nrm\",\"nrn\",\"nrp\",\"nrr\",\"nrt\",\"nru\",\"nrx\",\"nrz\",\"nsa\",\"nsc\",\"nsd\",\"nse\",\"nsf\",\"nsg\",\"nsh\",\"nsi\",\"nsk\",\"nsl\",\"nsm\",\"nsn\",\"nso\",\"nsp\",\"nsq\",\"nsr\",\"nss\",\"nst\",\"nsu\",\"nsv\",\"nsw\",\"nsx\",\"nsy\",\"nsz\",\"ntd\",\"nte\",\"ntg\",\"nti\",\"ntj\",\"ntk\",\"ntm\",\"nto\",\"ntp\",\"ntr\",\"nts\",\"ntu\",\"ntw\",\"ntx\",\"nty\",\"ntz\",\"nua\",\"nub\",\"nuc\",\"nud\",\"nue\",\"nuf\",\"nug\",\"nuh\",\"nui\",\"nuj\",\"nuk\",\"nul\",\"num\",\"nun\",\"nuo\",\"nup\",\"nuq\",\"nur\",\"nus\",\"nut\",\"nuu\",\"nuv\",\"nuw\",\"nux\",\"nuy\",\"nuz\",\"nvh\",\"nvm\",\"nvo\",\"nwa\",\"nwb\",\"nwc\",\"nwe\",\"nwg\",\"nwi\",\"nwm\",\"nwo\",\"nwr\",\"nwx\",\"nwy\",\"nxa\",\"nxd\",\"nxe\",\"nxg\",\"nxi\",\"nxk\",\"nxl\",\"nxm\",\"nxn\",\"nxo\",\"nxq\",\"nxr\",\"nxu\",\"nxx\",\"nyb\",\"nyc\",\"nyd\",\"nye\",\"nyf\",\"nyg\",\"nyh\",\"nyi\",\"nyj\",\"nyk\",\"nyl\",\"nym\",\"nyn\",\"nyo\",\"nyp\",\"nyq\",\"nyr\",\"nys\",\"nyt\",\"nyu\",\"nyv\",\"nyw\",\"nyx\",\"nyy\",\"nza\",\"nzb\",\"nzd\",\"nzi\",\"nzk\",\"nzm\",\"nzs\",\"nzu\",\"nzy\",\"nzz\",\"oaa\",\"oac\",\"oar\",\"oav\",\"obi\",\"obk\",\"obl\",\"obm\",\"obo\",\"obr\",\"obt\",\"obu\",\"oca\",\"och\",\"oco\",\"ocu\",\"oda\",\"odk\",\"odt\",\"odu\",\"ofo\",\"ofs\",\"ofu\",\"ogb\",\"ogc\",\"oge\",\"ogg\",\"ogo\",\"ogu\",\"oht\",\"ohu\",\"oia\",\"oin\",\"ojb\",\"ojc\",\"ojg\",\"ojp\",\"ojs\",\"ojv\",\"ojw\",\"oka\",\"okb\",\"okd\",\"oke\",\"okg\",\"okh\",\"oki\",\"okj\",\"okk\",\"okl\",\"okm\",\"okn\",\"oko\",\"okr\",\"oks\",\"oku\",\"okv\",\"okx\",\"ola\",\"old\",\"ole\",\"olk\",\"olm\",\"olo\",\"olr\",\"olt\",\"olu\",\"oma\",\"omb\",\"omc\",\"ome\",\"omg\",\"omi\",\"omk\",\"oml\",\"omn\",\"omo\",\"omp\",\"omq\",\"omr\",\"omt\",\"omu\",\"omv\",\"omw\",\"omx\",\"ona\",\"onb\",\"one\",\"ong\",\"oni\",\"onj\",\"onk\",\"onn\",\"ono\",\"onp\",\"onr\",\"ons\",\"ont\",\"onu\",\"onw\",\"onx\",\"ood\",\"oog\",\"oon\",\"oor\",\"oos\",\"opa\",\"opk\",\"opm\",\"opo\",\"opt\",\"opy\",\"ora\",\"orc\",\"ore\",\"org\",\"orh\",\"orn\",\"oro\",\"orr\",\"ors\",\"ort\",\"oru\",\"orv\",\"orw\",\"orx\",\"ory\",\"orz\",\"osa\",\"osc\",\"osi\",\"oso\",\"osp\",\"ost\",\"osu\",\"osx\",\"ota\",\"otb\",\"otd\",\"ote\",\"oti\",\"otk\",\"otl\",\"otm\",\"otn\",\"oto\",\"otq\",\"otr\",\"ots\",\"ott\",\"otu\",\"otw\",\"otx\",\"oty\",\"otz\",\"oua\",\"oub\",\"oue\",\"oui\",\"oum\",\"oun\",\"ovd\",\"owi\",\"owl\",\"oyb\",\"oyd\",\"oym\",\"oyy\",\"ozm\",\"paa\",\"pab\",\"pac\",\"pad\",\"pae\",\"paf\",\"pag\",\"pah\",\"pai\",\"pak\",\"pal\",\"pam\",\"pao\",\"pap\",\"paq\",\"par\",\"pas\",\"pat\",\"pau\",\"pav\",\"paw\",\"pax\",\"pay\",\"paz\",\"pbb\",\"pbc\",\"pbe\",\"pbf\",\"pbg\",\"pbh\",\"pbi\",\"pbl\",\"pbm\",\"pbn\",\"pbo\",\"pbp\",\"pbr\",\"pbs\",\"pbt\",\"pbu\",\"pbv\",\"pby\",\"pbz\",\"pca\",\"pcb\",\"pcc\",\"pcd\",\"pce\",\"pcf\",\"pcg\",\"pch\",\"pci\",\"pcj\",\"pck\",\"pcl\",\"pcm\",\"pcn\",\"pcp\",\"pcr\",\"pcw\",\"pda\",\"pdc\",\"pdi\",\"pdn\",\"pdo\",\"pdt\",\"pdu\",\"pea\",\"peb\",\"ped\",\"pee\",\"pef\",\"peg\",\"peh\",\"pei\",\"pej\",\"pek\",\"pel\",\"pem\",\"peo\",\"pep\",\"peq\",\"pes\",\"pev\",\"pex\",\"pey\",\"pez\",\"pfa\",\"pfe\",\"pfl\",\"pga\",\"pgd\",\"pgg\",\"pgi\",\"pgk\",\"pgl\",\"pgn\",\"pgs\",\"pgu\",\"pgy\",\"pgz\",\"pha\",\"phd\",\"phg\",\"phh\",\"phi\",\"phk\",\"phl\",\"phm\",\"phn\",\"pho\",\"phq\",\"phr\",\"pht\",\"phu\",\"phv\",\"phw\",\"pia\",\"pib\",\"pic\",\"pid\",\"pie\",\"pif\",\"pig\",\"pih\",\"pii\",\"pij\",\"pil\",\"pim\",\"pin\",\"pio\",\"pip\",\"pir\",\"pis\",\"pit\",\"piu\",\"piv\",\"piw\",\"pix\",\"piy\",\"piz\",\"pjt\",\"pka\",\"pkb\",\"pkc\",\"pkg\",\"pkh\",\"pkn\",\"pko\",\"pkp\",\"pkr\",\"pks\",\"pkt\",\"pku\",\"pla\",\"plb\",\"plc\",\"pld\",\"ple\",\"plf\",\"plg\",\"plh\",\"plj\",\"plk\",\"pll\",\"pln\",\"plo\",\"plp\",\"plq\",\"plr\",\"pls\",\"plt\",\"plu\",\"plv\",\"plw\",\"ply\",\"plz\",\"pma\",\"pmb\",\"pmc\",\"pmd\",\"pme\",\"pmf\",\"pmh\",\"pmi\",\"pmj\",\"pmk\",\"pml\",\"pmm\",\"pmn\",\"pmo\",\"pmq\",\"pmr\",\"pms\",\"pmt\",\"pmu\",\"pmw\",\"pmx\",\"pmy\",\"pmz\",\"pna\",\"pnb\",\"pnc\",\"pne\",\"png\",\"pnh\",\"pni\",\"pnj\",\"pnk\",\"pnl\",\"pnm\",\"pnn\",\"pno\",\"pnp\",\"pnq\",\"pnr\",\"pns\",\"pnt\",\"pnu\",\"pnv\",\"pnw\",\"pnx\",\"pny\",\"pnz\",\"poc\",\"pod\",\"poe\",\"pof\",\"pog\",\"poh\",\"poi\",\"pok\",\"pom\",\"pon\",\"poo\",\"pop\",\"poq\",\"pos\",\"pot\",\"pov\",\"pow\",\"pox\",\"poy\",\"poz\",\"ppa\",\"ppe\",\"ppi\",\"ppk\",\"ppl\",\"ppm\",\"ppn\",\"ppo\",\"ppp\",\"ppq\",\"ppr\",\"pps\",\"ppt\",\"ppu\",\"pqa\",\"pqe\",\"pqm\",\"pqw\",\"pra\",\"prb\",\"prc\",\"prd\",\"pre\",\"prf\",\"prg\",\"prh\",\"pri\",\"prk\",\"prl\",\"prm\",\"prn\",\"pro\",\"prp\",\"prq\",\"prr\",\"prs\",\"prt\",\"pru\",\"prw\",\"prx\",\"pry\",\"prz\",\"psa\",\"psc\",\"psd\",\"pse\",\"psg\",\"psh\",\"psi\",\"psl\",\"psm\",\"psn\",\"pso\",\"psp\",\"psq\",\"psr\",\"pss\",\"pst\",\"psu\",\"psw\",\"psy\",\"pta\",\"pth\",\"pti\",\"ptn\",\"pto\",\"ptp\",\"ptq\",\"ptr\",\"ptt\",\"ptu\",\"ptv\",\"ptw\",\"pty\",\"pua\",\"pub\",\"puc\",\"pud\",\"pue\",\"puf\",\"pug\",\"pui\",\"puj\",\"puk\",\"pum\",\"puo\",\"pup\",\"puq\",\"pur\",\"put\",\"puu\",\"puw\",\"pux\",\"puy\",\"puz\",\"pwa\",\"pwb\",\"pwg\",\"pwi\",\"pwm\",\"pwn\",\"pwo\",\"pwr\",\"pww\",\"pxm\",\"pye\",\"pym\",\"pyn\",\"pys\",\"pyu\",\"pyx\",\"pyy\",\"pzn\",\"qaa..qtz\",\"qua\",\"qub\",\"quc\",\"qud\",\"quf\",\"qug\",\"quh\",\"qui\",\"quk\",\"qul\",\"qum\",\"qun\",\"qup\",\"quq\",\"qur\",\"qus\",\"quv\",\"quw\",\"qux\",\"quy\",\"quz\",\"qva\",\"qvc\",\"qve\",\"qvh\",\"qvi\",\"qvj\",\"qvl\",\"qvm\",\"qvn\",\"qvo\",\"qvp\",\"qvs\",\"qvw\",\"qvy\",\"qvz\",\"qwa\",\"qwc\",\"qwe\",\"qwh\",\"qwm\",\"qws\",\"qwt\",\"qxa\",\"qxc\",\"qxh\",\"qxl\",\"qxn\",\"qxo\",\"qxp\",\"qxq\",\"qxr\",\"qxs\",\"qxt\",\"qxu\",\"qxw\",\"qya\",\"qyp\",\"raa\",\"rab\",\"rac\",\"rad\",\"raf\",\"rag\",\"rah\",\"rai\",\"raj\",\"rak\",\"ral\",\"ram\",\"ran\",\"rao\",\"rap\",\"raq\",\"rar\",\"ras\",\"rat\",\"rau\",\"rav\",\"raw\",\"rax\",\"ray\",\"raz\",\"rbb\",\"rbk\",\"rbl\",\"rbp\",\"rcf\",\"rdb\",\"rea\",\"reb\",\"ree\",\"reg\",\"rei\",\"rej\",\"rel\",\"rem\",\"ren\",\"rer\",\"res\",\"ret\",\"rey\",\"rga\",\"rge\",\"rgk\",\"rgn\",\"rgr\",\"rgs\",\"rgu\",\"rhg\",\"rhp\",\"ria\",\"rie\",\"rif\",\"ril\",\"rim\",\"rin\",\"rir\",\"rit\",\"riu\",\"rjg\",\"rji\",\"rjs\",\"rka\",\"rkb\",\"rkh\",\"rki\",\"rkm\",\"rkt\",\"rkw\",\"rma\",\"rmb\",\"rmc\",\"rmd\",\"rme\",\"rmf\",\"rmg\",\"rmh\",\"rmi\",\"rmk\",\"rml\",\"rmm\",\"rmn\",\"rmo\",\"rmp\",\"rmq\",\"rmr\",\"rms\",\"rmt\",\"rmu\",\"rmv\",\"rmw\",\"rmx\",\"rmy\",\"rmz\",\"rna\",\"rnd\",\"rng\",\"rnl\",\"rnn\",\"rnp\",\"rnr\",\"rnw\",\"roa\",\"rob\",\"roc\",\"rod\",\"roe\",\"rof\",\"rog\",\"rol\",\"rom\",\"roo\",\"rop\",\"ror\",\"rou\",\"row\",\"rpn\",\"rpt\",\"rri\",\"rro\",\"rrt\",\"rsb\",\"rsi\",\"rsl\",\"rsm\",\"rtc\",\"rth\",\"rtm\",\"rts\",\"rtw\",\"rub\",\"ruc\",\"rue\",\"ruf\",\"rug\",\"ruh\",\"rui\",\"ruk\",\"ruo\",\"rup\",\"ruq\",\"rut\",\"ruu\",\"ruy\",\"ruz\",\"rwa\",\"rwk\",\"rwm\",\"rwo\",\"rwr\",\"rxd\",\"rxw\",\"ryn\",\"rys\",\"ryu\",\"rzh\",\"saa\",\"sab\",\"sac\",\"sad\",\"sae\",\"saf\",\"sah\",\"sai\",\"saj\",\"sak\",\"sal\",\"sam\",\"sao\",\"sap\",\"saq\",\"sar\",\"sas\",\"sat\",\"sau\",\"sav\",\"saw\",\"sax\",\"say\",\"saz\",\"sba\",\"sbb\",\"sbc\",\"sbd\",\"sbe\",\"sbf\",\"sbg\",\"sbh\",\"sbi\",\"sbj\",\"sbk\",\"sbl\",\"sbm\",\"sbn\",\"sbo\",\"sbp\",\"sbq\",\"sbr\",\"sbs\",\"sbt\",\"sbu\",\"sbv\",\"sbw\",\"sbx\",\"sby\",\"sbz\",\"sca\",\"scb\",\"sce\",\"scf\",\"scg\",\"sch\",\"sci\",\"sck\",\"scl\",\"scn\",\"sco\",\"scp\",\"scq\",\"scs\",\"sct\",\"scu\",\"scv\",\"scw\",\"scx\",\"sda\",\"sdb\",\"sdc\",\"sde\",\"sdf\",\"sdg\",\"sdh\",\"sdj\",\"sdk\",\"sdl\",\"sdm\",\"sdn\",\"sdo\",\"sdp\",\"sdr\",\"sds\",\"sdt\",\"sdu\",\"sdv\",\"sdx\",\"sdz\",\"sea\",\"seb\",\"sec\",\"sed\",\"see\",\"sef\",\"seg\",\"seh\",\"sei\",\"sej\",\"sek\",\"sel\",\"sem\",\"sen\",\"seo\",\"sep\",\"seq\",\"ser\",\"ses\",\"set\",\"seu\",\"sev\",\"sew\",\"sey\",\"sez\",\"sfb\",\"sfe\",\"sfm\",\"sfs\",\"sfw\",\"sga\",\"sgb\",\"sgc\",\"sgd\",\"sge\",\"sgg\",\"sgh\",\"sgi\",\"sgj\",\"sgk\",\"sgl\",\"sgm\",\"sgn\",\"sgo\",\"sgp\",\"sgr\",\"sgs\",\"sgt\",\"sgu\",\"sgw\",\"sgx\",\"sgy\",\"sgz\",\"sha\",\"shb\",\"shc\",\"shd\",\"she\",\"shg\",\"shh\",\"shi\",\"shj\",\"shk\",\"shl\",\"shm\",\"shn\",\"sho\",\"shp\",\"shq\",\"shr\",\"shs\",\"sht\",\"shu\",\"shv\",\"shw\",\"shx\",\"shy\",\"shz\",\"sia\",\"sib\",\"sid\",\"sie\",\"sif\",\"sig\",\"sih\",\"sii\",\"sij\",\"sik\",\"sil\",\"sim\",\"sio\",\"sip\",\"siq\",\"sir\",\"sis\",\"sit\",\"siu\",\"siv\",\"siw\",\"six\",\"siy\",\"siz\",\"sja\",\"sjb\",\"sjd\",\"sje\",\"sjg\",\"sjk\",\"sjl\",\"sjm\",\"sjn\",\"sjo\",\"sjp\",\"sjr\",\"sjs\",\"sjt\",\"sju\",\"sjw\",\"ska\",\"skb\",\"skc\",\"skd\",\"ske\",\"skf\",\"skg\",\"skh\",\"ski\",\"skj\",\"skk\",\"skm\",\"skn\",\"sko\",\"skp\",\"skq\",\"skr\",\"sks\",\"skt\",\"sku\",\"skv\",\"skw\",\"skx\",\"sky\",\"skz\",\"sla\",\"slc\",\"sld\",\"sle\",\"slf\",\"slg\",\"slh\",\"sli\",\"slj\",\"sll\",\"slm\",\"sln\",\"slp\",\"slq\",\"slr\",\"sls\",\"slt\",\"slu\",\"slw\",\"slx\",\"sly\",\"slz\",\"sma\",\"smb\",\"smc\",\"smd\",\"smf\",\"smg\",\"smh\",\"smi\",\"smj\",\"smk\",\"sml\",\"smm\",\"smn\",\"smp\",\"smq\",\"smr\",\"sms\",\"smt\",\"smu\",\"smv\",\"smw\",\"smx\",\"smy\",\"smz\",\"snb\",\"snc\",\"sne\",\"snf\",\"sng\",\"snh\",\"sni\",\"snj\",\"snk\",\"snl\",\"snm\",\"snn\",\"sno\",\"snp\",\"snq\",\"snr\",\"sns\",\"snu\",\"snv\",\"snw\",\"snx\",\"sny\",\"snz\",\"soa\",\"sob\",\"soc\",\"sod\",\"soe\",\"sog\",\"soh\",\"soi\",\"soj\",\"sok\",\"sol\",\"son\",\"soo\",\"sop\",\"soq\",\"sor\",\"sos\",\"sou\",\"sov\",\"sow\",\"sox\",\"soy\",\"soz\",\"spb\",\"spc\",\"spd\",\"spe\",\"spg\",\"spi\",\"spk\",\"spl\",\"spm\",\"spn\",\"spo\",\"spp\",\"spq\",\"spr\",\"sps\",\"spt\",\"spu\",\"spv\",\"spx\",\"spy\",\"sqa\",\"sqh\",\"sqj\",\"sqk\",\"sqm\",\"sqn\",\"sqo\",\"sqq\",\"sqr\",\"sqs\",\"sqt\",\"squ\",\"sra\",\"srb\",\"src\",\"sre\",\"srf\",\"srg\",\"srh\",\"sri\",\"srk\",\"srl\",\"srm\",\"srn\",\"sro\",\"srq\",\"srr\",\"srs\",\"srt\",\"sru\",\"srv\",\"srw\",\"srx\",\"sry\",\"srz\",\"ssa\",\"ssb\",\"ssc\",\"ssd\",\"sse\",\"ssf\",\"ssg\",\"ssh\",\"ssi\",\"ssj\",\"ssk\",\"ssl\",\"ssm\",\"ssn\",\"sso\",\"ssp\",\"ssq\",\"ssr\",\"sss\",\"sst\",\"ssu\",\"ssv\",\"ssx\",\"ssy\",\"ssz\",\"sta\",\"stb\",\"std\",\"ste\",\"stf\",\"stg\",\"sth\",\"sti\",\"stj\",\"stk\",\"stl\",\"stm\",\"stn\",\"sto\",\"stp\",\"stq\",\"str\",\"sts\",\"stt\",\"stu\",\"stv\",\"stw\",\"sty\",\"sua\",\"sub\",\"suc\",\"sue\",\"sug\",\"sui\",\"suj\",\"suk\",\"sul\",\"sum\",\"suq\",\"sur\",\"sus\",\"sut\",\"suv\",\"suw\",\"sux\",\"suy\",\"suz\",\"sva\",\"svb\",\"svc\",\"sve\",\"svk\",\"svm\",\"svr\",\"svs\",\"svx\",\"swb\",\"swc\",\"swf\",\"swg\",\"swh\",\"swi\",\"swj\",\"swk\",\"swl\",\"swm\",\"swn\",\"swo\",\"swp\",\"swq\",\"swr\",\"sws\",\"swt\",\"swu\",\"swv\",\"sww\",\"swx\",\"swy\",\"sxb\",\"sxc\",\"sxe\",\"sxg\",\"sxk\",\"sxl\",\"sxm\",\"sxn\",\"sxo\",\"sxr\",\"sxs\",\"sxu\",\"sxw\",\"sya\",\"syb\",\"syc\",\"syd\",\"syi\",\"syk\",\"syl\",\"sym\",\"syn\",\"syo\",\"syr\",\"sys\",\"syw\",\"syx\",\"syy\",\"sza\",\"szb\",\"szc\",\"szd\",\"sze\",\"szg\",\"szl\",\"szn\",\"szp\",\"szs\",\"szv\",\"szw\",\"taa\",\"tab\",\"tac\",\"tad\",\"tae\",\"taf\",\"tag\",\"tai\",\"taj\",\"tak\",\"tal\",\"tan\",\"tao\",\"tap\",\"taq\",\"tar\",\"tas\",\"tau\",\"tav\",\"taw\",\"tax\",\"tay\",\"taz\",\"tba\",\"tbb\",\"tbc\",\"tbd\",\"tbe\",\"tbf\",\"tbg\",\"tbh\",\"tbi\",\"tbj\",\"tbk\",\"tbl\",\"tbm\",\"tbn\",\"tbo\",\"tbp\",\"tbq\",\"tbr\",\"tbs\",\"tbt\",\"tbu\",\"tbv\",\"tbw\",\"tbx\",\"tby\",\"tbz\",\"tca\",\"tcb\",\"tcc\",\"tcd\",\"tce\",\"tcf\",\"tcg\",\"tch\",\"tci\",\"tck\",\"tcl\",\"tcm\",\"tcn\",\"tco\",\"tcp\",\"tcq\",\"tcs\",\"tct\",\"tcu\",\"tcw\",\"tcx\",\"tcy\",\"tcz\",\"tda\",\"tdb\",\"tdc\",\"tdd\",\"tde\",\"tdf\",\"tdg\",\"tdh\",\"tdi\",\"tdj\",\"tdk\",\"tdl\",\"tdm\",\"tdn\",\"tdo\",\"tdq\",\"tdr\",\"tds\",\"tdt\",\"tdu\",\"tdv\",\"tdx\",\"tdy\",\"tea\",\"teb\",\"tec\",\"ted\",\"tee\",\"tef\",\"teg\",\"teh\",\"tei\",\"tek\",\"tem\",\"ten\",\"teo\",\"tep\",\"teq\",\"ter\",\"tes\",\"tet\",\"teu\",\"tev\",\"tew\",\"tex\",\"tey\",\"tez\",\"tfi\",\"tfn\",\"tfo\",\"tfr\",\"tft\",\"tga\",\"tgb\",\"tgc\",\"tgd\",\"tge\",\"tgf\",\"tgg\",\"tgh\",\"tgi\",\"tgj\",\"tgn\",\"tgo\",\"tgp\",\"tgq\",\"tgr\",\"tgs\",\"tgt\",\"tgu\",\"tgv\",\"tgw\",\"tgx\",\"tgy\",\"tgz\",\"thc\",\"thd\",\"the\",\"thf\",\"thh\",\"thi\",\"thk\",\"thl\",\"thm\",\"thn\",\"thp\",\"thq\",\"thr\",\"ths\",\"tht\",\"thu\",\"thv\",\"thw\",\"thx\",\"thy\",\"thz\",\"tia\",\"tic\",\"tid\",\"tie\",\"tif\",\"tig\",\"tih\",\"tii\",\"tij\",\"tik\",\"til\",\"tim\",\"tin\",\"tio\",\"tip\",\"tiq\",\"tis\",\"tit\",\"tiu\",\"tiv\",\"tiw\",\"tix\",\"tiy\",\"tiz\",\"tja\",\"tjg\",\"tji\",\"tjl\",\"tjm\",\"tjn\",\"tjo\",\"tjs\",\"tju\",\"tjw\",\"tka\",\"tkb\",\"tkd\",\"tke\",\"tkf\",\"tkg\",\"tkk\",\"tkl\",\"tkm\",\"tkn\",\"tkp\",\"tkq\",\"tkr\",\"tks\",\"tkt\",\"tku\",\"tkv\",\"tkw\",\"tkx\",\"tkz\",\"tla\",\"tlb\",\"tlc\",\"tld\",\"tlf\",\"tlg\",\"tlh\",\"tli\",\"tlj\",\"tlk\",\"tll\",\"tlm\",\"tln\",\"tlo\",\"tlp\",\"tlq\",\"tlr\",\"tls\",\"tlt\",\"tlu\",\"tlv\",\"tlw\",\"tlx\",\"tly\",\"tma\",\"tmb\",\"tmc\",\"tmd\",\"tme\",\"tmf\",\"tmg\",\"tmh\",\"tmi\",\"tmj\",\"tmk\",\"tml\",\"tmm\",\"tmn\",\"tmo\",\"tmp\",\"tmq\",\"tmr\",\"tms\",\"tmt\",\"tmu\",\"tmv\",\"tmw\",\"tmy\",\"tmz\",\"tna\",\"tnb\",\"tnc\",\"tnd\",\"tne\",\"tnf\",\"tng\",\"tnh\",\"tni\",\"tnk\",\"tnl\",\"tnm\",\"tnn\",\"tno\",\"tnp\",\"tnq\",\"tnr\",\"tns\",\"tnt\",\"tnu\",\"tnv\",\"tnw\",\"tnx\",\"tny\",\"tnz\",\"tob\",\"toc\",\"tod\",\"toe\",\"tof\",\"tog\",\"toh\",\"toi\",\"toj\",\"tol\",\"tom\",\"too\",\"top\",\"toq\",\"tor\",\"tos\",\"tou\",\"tov\",\"tow\",\"tox\",\"toy\",\"toz\",\"tpa\",\"tpc\",\"tpe\",\"tpf\",\"tpg\",\"tpi\",\"tpj\",\"tpk\",\"tpl\",\"tpm\",\"tpn\",\"tpo\",\"tpp\",\"tpq\",\"tpr\",\"tpt\",\"tpu\",\"tpv\",\"tpw\",\"tpx\",\"tpy\",\"tpz\",\"tqb\",\"tql\",\"tqm\",\"tqn\",\"tqo\",\"tqp\",\"tqq\",\"tqr\",\"tqt\",\"tqu\",\"tqw\",\"tra\",\"trb\",\"trc\",\"trd\",\"tre\",\"trf\",\"trg\",\"trh\",\"tri\",\"trj\",\"trk\",\"trl\",\"trm\",\"trn\",\"tro\",\"trp\",\"trq\",\"trr\",\"trs\",\"trt\",\"tru\",\"trv\",\"trw\",\"trx\",\"try\",\"trz\",\"tsa\",\"tsb\",\"tsc\",\"tsd\",\"tse\",\"tsf\",\"tsg\",\"tsh\",\"tsi\",\"tsj\",\"tsk\",\"tsl\",\"tsm\",\"tsp\",\"tsq\",\"tsr\",\"tss\",\"tst\",\"tsu\",\"tsv\",\"tsw\",\"tsx\",\"tsy\",\"tsz\",\"tta\",\"ttb\",\"ttc\",\"ttd\",\"tte\",\"ttf\",\"ttg\",\"tth\",\"tti\",\"ttj\",\"ttk\",\"ttl\",\"ttm\",\"ttn\",\"tto\",\"ttp\",\"ttq\",\"ttr\",\"tts\",\"ttt\",\"ttu\",\"ttv\",\"ttw\",\"tty\",\"ttz\",\"tua\",\"tub\",\"tuc\",\"tud\",\"tue\",\"tuf\",\"tug\",\"tuh\",\"tui\",\"tuj\",\"tul\",\"tum\",\"tun\",\"tuo\",\"tup\",\"tuq\",\"tus\",\"tut\",\"tuu\",\"tuv\",\"tuw\",\"tux\",\"tuy\",\"tuz\",\"tva\",\"tvd\",\"tve\",\"tvk\",\"tvl\",\"tvm\",\"tvn\",\"tvo\",\"tvs\",\"tvt\",\"tvu\",\"tvw\",\"tvy\",\"twa\",\"twb\",\"twc\",\"twd\",\"twe\",\"twf\",\"twg\",\"twh\",\"twl\",\"twm\",\"twn\",\"two\",\"twp\",\"twq\",\"twr\",\"twt\",\"twu\",\"tww\",\"twx\",\"twy\",\"txa\",\"txb\",\"txc\",\"txe\",\"txg\",\"txh\",\"txi\",\"txj\",\"txm\",\"txn\",\"txo\",\"txq\",\"txr\",\"txs\",\"txt\",\"txu\",\"txx\",\"txy\",\"tya\",\"tye\",\"tyh\",\"tyi\",\"tyj\",\"tyl\",\"tyn\",\"typ\",\"tyr\",\"tys\",\"tyt\",\"tyu\",\"tyv\",\"tyx\",\"tyz\",\"tza\",\"tzh\",\"tzj\",\"tzl\",\"tzm\",\"tzn\",\"tzo\",\"tzx\",\"uam\",\"uan\",\"uar\",\"uba\",\"ubi\",\"ubl\",\"ubr\",\"ubu\",\"uby\",\"uda\",\"ude\",\"udg\",\"udi\",\"udj\",\"udl\",\"udm\",\"udu\",\"ues\",\"ufi\",\"uga\",\"ugb\",\"uge\",\"ugn\",\"ugo\",\"ugy\",\"uha\",\"uhn\",\"uis\",\"uiv\",\"uji\",\"uka\",\"ukg\",\"ukh\",\"ukk\",\"ukl\",\"ukp\",\"ukq\",\"uks\",\"uku\",\"ukw\",\"uky\",\"ula\",\"ulb\",\"ulc\",\"ule\",\"ulf\",\"uli\",\"ulk\",\"ull\",\"ulm\",\"uln\",\"ulu\",\"ulw\",\"uma\",\"umb\",\"umc\",\"umd\",\"umg\",\"umi\",\"umm\",\"umn\",\"umo\",\"ump\",\"umr\",\"ums\",\"umu\",\"una\",\"und\",\"une\",\"ung\",\"unk\",\"unm\",\"unn\",\"unp\",\"unr\",\"unu\",\"unx\",\"unz\",\"uok\",\"upi\",\"upv\",\"ura\",\"urb\",\"urc\",\"ure\",\"urf\",\"urg\",\"urh\",\"uri\",\"urj\",\"urk\",\"url\",\"urm\",\"urn\",\"uro\",\"urp\",\"urr\",\"urt\",\"uru\",\"urv\",\"urw\",\"urx\",\"ury\",\"urz\",\"usa\",\"ush\",\"usi\",\"usk\",\"usp\",\"usu\",\"uta\",\"ute\",\"utp\",\"utr\",\"utu\",\"uum\",\"uun\",\"uur\",\"uuu\",\"uve\",\"uvh\",\"uvl\",\"uwa\",\"uya\",\"uzn\",\"uzs\",\"vaa\",\"vae\",\"vaf\",\"vag\",\"vah\",\"vai\",\"vaj\",\"val\",\"vam\",\"van\",\"vao\",\"vap\",\"var\",\"vas\",\"vau\",\"vav\",\"vay\",\"vbb\",\"vbk\",\"vec\",\"ved\",\"vel\",\"vem\",\"veo\",\"vep\",\"ver\",\"vgr\",\"vgt\",\"vic\",\"vid\",\"vif\",\"vig\",\"vil\",\"vin\",\"vis\",\"vit\",\"viv\",\"vka\",\"vki\",\"vkj\",\"vkk\",\"vkl\",\"vkm\",\"vko\",\"vkp\",\"vkt\",\"vku\",\"vlp\",\"vls\",\"vma\",\"vmb\",\"vmc\",\"vmd\",\"vme\",\"vmf\",\"vmg\",\"vmh\",\"vmi\",\"vmj\",\"vmk\",\"vml\",\"vmm\",\"vmp\",\"vmq\",\"vmr\",\"vms\",\"vmu\",\"vmv\",\"vmw\",\"vmx\",\"vmy\",\"vmz\",\"vnk\",\"vnm\",\"vnp\",\"vor\",\"vot\",\"vra\",\"vro\",\"vrs\",\"vrt\",\"vsi\",\"vsl\",\"vsv\",\"vto\",\"vum\",\"vun\",\"vut\",\"vwa\",\"waa\",\"wab\",\"wac\",\"wad\",\"wae\",\"waf\",\"wag\",\"wah\",\"wai\",\"waj\",\"wak\",\"wal\",\"wam\",\"wan\",\"wao\",\"wap\",\"waq\",\"war\",\"was\",\"wat\",\"wau\",\"wav\",\"waw\",\"wax\",\"way\",\"waz\",\"wba\",\"wbb\",\"wbe\",\"wbf\",\"wbh\",\"wbi\",\"wbj\",\"wbk\",\"wbl\",\"wbm\",\"wbp\",\"wbq\",\"wbr\",\"wbs\",\"wbt\",\"wbv\",\"wbw\",\"wca\",\"wci\",\"wdd\",\"wdg\",\"wdj\",\"wdk\",\"wdu\",\"wdy\",\"wea\",\"wec\",\"wed\",\"weg\",\"weh\",\"wei\",\"wem\",\"wen\",\"weo\",\"wep\",\"wer\",\"wes\",\"wet\",\"weu\",\"wew\",\"wfg\",\"wga\",\"wgb\",\"wgg\",\"wgi\",\"wgo\",\"wgu\",\"wgw\",\"wgy\",\"wha\",\"whg\",\"whk\",\"whu\",\"wib\",\"wic\",\"wie\",\"wif\",\"wig\",\"wih\",\"wii\",\"wij\",\"wik\",\"wil\",\"wim\",\"win\",\"wir\",\"wit\",\"wiu\",\"wiv\",\"wiw\",\"wiy\",\"wja\",\"wji\",\"wka\",\"wkb\",\"wkd\",\"wkl\",\"wku\",\"wkw\",\"wky\",\"wla\",\"wlc\",\"wle\",\"wlg\",\"wli\",\"wlk\",\"wll\",\"wlm\",\"wlo\",\"wlr\",\"wls\",\"wlu\",\"wlv\",\"wlw\",\"wlx\",\"wly\",\"wma\",\"wmb\",\"wmc\",\"wmd\",\"wme\",\"wmh\",\"wmi\",\"wmm\",\"wmn\",\"wmo\",\"wms\",\"wmt\",\"wmw\",\"wmx\",\"wnb\",\"wnc\",\"wnd\",\"wne\",\"wng\",\"wni\",\"wnk\",\"wnm\",\"wnn\",\"wno\",\"wnp\",\"wnu\",\"wnw\",\"wny\",\"woa\",\"wob\",\"woc\",\"wod\",\"woe\",\"wof\",\"wog\",\"woi\",\"wok\",\"wom\",\"won\",\"woo\",\"wor\",\"wos\",\"wow\",\"woy\",\"wpc\",\"wra\",\"wrb\",\"wrd\",\"wrg\",\"wrh\",\"wri\",\"wrk\",\"wrl\",\"wrm\",\"wrn\",\"wro\",\"wrp\",\"wrr\",\"wrs\",\"wru\",\"wrv\",\"wrw\",\"wrx\",\"wry\",\"wrz\",\"wsa\",\"wsg\",\"wsi\",\"wsk\",\"wsr\",\"wss\",\"wsu\",\"wsv\",\"wtf\",\"wth\",\"wti\",\"wtk\",\"wtm\",\"wtw\",\"wua\",\"wub\",\"wud\",\"wuh\",\"wul\",\"wum\",\"wun\",\"wur\",\"wut\",\"wuu\",\"wuv\",\"wux\",\"wuy\",\"wwa\",\"wwb\",\"wwo\",\"wwr\",\"www\",\"wxa\",\"wxw\",\"wya\",\"wyb\",\"wyi\",\"wym\",\"wyr\",\"wyy\",\"xaa\",\"xab\",\"xac\",\"xad\",\"xae\",\"xag\",\"xai\",\"xaj\",\"xak\",\"xal\",\"xam\",\"xan\",\"xao\",\"xap\",\"xaq\",\"xar\",\"xas\",\"xat\",\"xau\",\"xav\",\"xaw\",\"xay\",\"xba\",\"xbb\",\"xbc\",\"xbd\",\"xbe\",\"xbg\",\"xbi\",\"xbj\",\"xbm\",\"xbn\",\"xbo\",\"xbp\",\"xbr\",\"xbw\",\"xbx\",\"xby\",\"xcb\",\"xcc\",\"xce\",\"xcg\",\"xch\",\"xcl\",\"xcm\",\"xcn\",\"xco\",\"xcr\",\"xct\",\"xcu\",\"xcv\",\"xcw\",\"xcy\",\"xda\",\"xdc\",\"xdk\",\"xdm\",\"xdo\",\"xdy\",\"xeb\",\"xed\",\"xeg\",\"xel\",\"xem\",\"xep\",\"xer\",\"xes\",\"xet\",\"xeu\",\"xfa\",\"xga\",\"xgb\",\"xgd\",\"xgf\",\"xgg\",\"xgi\",\"xgl\",\"xgm\",\"xgn\",\"xgr\",\"xgu\",\"xgw\",\"xha\",\"xhc\",\"xhd\",\"xhe\",\"xhr\",\"xht\",\"xhu\",\"xhv\",\"xia\",\"xib\",\"xii\",\"xil\",\"xin\",\"xip\",\"xir\",\"xis\",\"xiv\",\"xiy\",\"xjb\",\"xjt\",\"xka\",\"xkb\",\"xkc\",\"xkd\",\"xke\",\"xkf\",\"xkg\",\"xkh\",\"xki\",\"xkj\",\"xkk\",\"xkl\",\"xkn\",\"xko\",\"xkp\",\"xkq\",\"xkr\",\"xks\",\"xkt\",\"xku\",\"xkv\",\"xkw\",\"xkx\",\"xky\",\"xkz\",\"xla\",\"xlb\",\"xlc\",\"xld\",\"xle\",\"xlg\",\"xli\",\"xln\",\"xlo\",\"xlp\",\"xls\",\"xlu\",\"xly\",\"xma\",\"xmb\",\"xmc\",\"xmd\",\"xme\",\"xmf\",\"xmg\",\"xmh\",\"xmj\",\"xmk\",\"xml\",\"xmm\",\"xmn\",\"xmo\",\"xmp\",\"xmq\",\"xmr\",\"xms\",\"xmt\",\"xmu\",\"xmv\",\"xmw\",\"xmx\",\"xmy\",\"xmz\",\"xna\",\"xnb\",\"xnd\",\"xng\",\"xnh\",\"xni\",\"xnk\",\"xnn\",\"xno\",\"xnr\",\"xns\",\"xnt\",\"xnu\",\"xny\",\"xnz\",\"xoc\",\"xod\",\"xog\",\"xoi\",\"xok\",\"xom\",\"xon\",\"xoo\",\"xop\",\"xor\",\"xow\",\"xpa\",\"xpc\",\"xpe\",\"xpg\",\"xpi\",\"xpj\",\"xpk\",\"xpm\",\"xpn\",\"xpo\",\"xpp\",\"xpq\",\"xpr\",\"xps\",\"xpt\",\"xpu\",\"xpy\",\"xqa\",\"xqt\",\"xra\",\"xrb\",\"xrd\",\"xre\",\"xrg\",\"xri\",\"xrm\",\"xrn\",\"xrq\",\"xrr\",\"xrt\",\"xru\",\"xrw\",\"xsa\",\"xsb\",\"xsc\",\"xsd\",\"xse\",\"xsh\",\"xsi\",\"xsj\",\"xsl\",\"xsm\",\"xsn\",\"xso\",\"xsp\",\"xsq\",\"xsr\",\"xss\",\"xsu\",\"xsv\",\"xsy\",\"xta\",\"xtb\",\"xtc\",\"xtd\",\"xte\",\"xtg\",\"xth\",\"xti\",\"xtj\",\"xtl\",\"xtm\",\"xtn\",\"xto\",\"xtp\",\"xtq\",\"xtr\",\"xts\",\"xtt\",\"xtu\",\"xtv\",\"xtw\",\"xty\",\"xtz\",\"xua\",\"xub\",\"xud\",\"xug\",\"xuj\",\"xul\",\"xum\",\"xun\",\"xuo\",\"xup\",\"xur\",\"xut\",\"xuu\",\"xve\",\"xvi\",\"xvn\",\"xvo\",\"xvs\",\"xwa\",\"xwc\",\"xwd\",\"xwe\",\"xwg\",\"xwj\",\"xwk\",\"xwl\",\"xwo\",\"xwr\",\"xwt\",\"xww\",\"xxb\",\"xxk\",\"xxm\",\"xxr\",\"xxt\",\"xya\",\"xyb\",\"xyj\",\"xyk\",\"xyl\",\"xyt\",\"xyy\",\"xzh\",\"xzm\",\"xzp\",\"yaa\",\"yab\",\"yac\",\"yad\",\"yae\",\"yaf\",\"yag\",\"yah\",\"yai\",\"yaj\",\"yak\",\"yal\",\"yam\",\"yan\",\"yao\",\"yap\",\"yaq\",\"yar\",\"yas\",\"yat\",\"yau\",\"yav\",\"yaw\",\"yax\",\"yay\",\"yaz\",\"yba\",\"ybb\",\"ybd\",\"ybe\",\"ybh\",\"ybi\",\"ybj\",\"ybk\",\"ybl\",\"ybm\",\"ybn\",\"ybo\",\"ybx\",\"yby\",\"ych\",\"ycl\",\"ycn\",\"ycp\",\"yda\",\"ydd\",\"yde\",\"ydg\",\"ydk\",\"yds\",\"yea\",\"yec\",\"yee\",\"yei\",\"yej\",\"yel\",\"yen\",\"yer\",\"yes\",\"yet\",\"yeu\",\"yev\",\"yey\",\"yga\",\"ygi\",\"ygl\",\"ygm\",\"ygp\",\"ygr\",\"ygs\",\"ygu\",\"ygw\",\"yha\",\"yhd\",\"yhl\",\"yhs\",\"yia\",\"yif\",\"yig\",\"yih\",\"yii\",\"yij\",\"yik\",\"yil\",\"yim\",\"yin\",\"yip\",\"yiq\",\"yir\",\"yis\",\"yit\",\"yiu\",\"yiv\",\"yix\",\"yiy\",\"yiz\",\"yka\",\"ykg\",\"yki\",\"ykk\",\"ykl\",\"ykm\",\"ykn\",\"yko\",\"ykr\",\"ykt\",\"yku\",\"yky\",\"yla\",\"ylb\",\"yle\",\"ylg\",\"yli\",\"yll\",\"ylm\",\"yln\",\"ylo\",\"ylr\",\"ylu\",\"yly\",\"yma\",\"ymb\",\"ymc\",\"ymd\",\"yme\",\"ymg\",\"ymh\",\"ymi\",\"ymk\",\"yml\",\"ymm\",\"ymn\",\"ymo\",\"ymp\",\"ymq\",\"ymr\",\"yms\",\"ymt\",\"ymx\",\"ymz\",\"yna\",\"ynd\",\"yne\",\"yng\",\"ynh\",\"ynk\",\"ynl\",\"ynn\",\"yno\",\"ynq\",\"yns\",\"ynu\",\"yob\",\"yog\",\"yoi\",\"yok\",\"yol\",\"yom\",\"yon\",\"yos\",\"yot\",\"yox\",\"yoy\",\"ypa\",\"ypb\",\"ypg\",\"yph\",\"ypk\",\"ypm\",\"ypn\",\"ypo\",\"ypp\",\"ypz\",\"yra\",\"yrb\",\"yre\",\"yri\",\"yrk\",\"yrl\",\"yrm\",\"yrn\",\"yro\",\"yrs\",\"yrw\",\"yry\",\"ysc\",\"ysd\",\"ysg\",\"ysl\",\"ysn\",\"yso\",\"ysp\",\"ysr\",\"yss\",\"ysy\",\"yta\",\"ytl\",\"ytp\",\"ytw\",\"yty\",\"yua\",\"yub\",\"yuc\",\"yud\",\"yue\",\"yuf\",\"yug\",\"yui\",\"yuj\",\"yuk\",\"yul\",\"yum\",\"yun\",\"yup\",\"yuq\",\"yur\",\"yut\",\"yuu\",\"yuw\",\"yux\",\"yuy\",\"yuz\",\"yva\",\"yvt\",\"ywa\",\"ywg\",\"ywl\",\"ywn\",\"ywq\",\"ywr\",\"ywt\",\"ywu\",\"yww\",\"yxa\",\"yxg\",\"yxl\",\"yxm\",\"yxu\",\"yxy\",\"yyr\",\"yyu\",\"yyz\",\"yzg\",\"yzk\",\"zaa\",\"zab\",\"zac\",\"zad\",\"zae\",\"zaf\",\"zag\",\"zah\",\"zai\",\"zaj\",\"zak\",\"zal\",\"zam\",\"zao\",\"zap\",\"zaq\",\"zar\",\"zas\",\"zat\",\"zau\",\"zav\",\"zaw\",\"zax\",\"zay\",\"zaz\",\"zbc\",\"zbe\",\"zbl\",\"zbt\",\"zbw\",\"zca\",\"zch\",\"zdj\",\"zea\",\"zeg\",\"zeh\",\"zen\",\"zga\",\"zgb\",\"zgh\",\"zgm\",\"zgn\",\"zgr\",\"zhb\",\"zhd\",\"zhi\",\"zhn\",\"zhw\",\"zhx\",\"zia\",\"zib\",\"zik\",\"zil\",\"zim\",\"zin\",\"zir\",\"ziw\",\"ziz\",\"zka\",\"zkb\",\"zkd\",\"zkg\",\"zkh\",\"zkk\",\"zkn\",\"zko\",\"zkp\",\"zkr\",\"zkt\",\"zku\",\"zkv\",\"zkz\",\"zle\",\"zlj\",\"zlm\",\"zln\",\"zlq\",\"zls\",\"zlw\",\"zma\",\"zmb\",\"zmc\",\"zmd\",\"zme\",\"zmf\",\"zmg\",\"zmh\",\"zmi\",\"zmj\",\"zmk\",\"zml\",\"zmm\",\"zmn\",\"zmo\",\"zmp\",\"zmq\",\"zmr\",\"zms\",\"zmt\",\"zmu\",\"zmv\",\"zmw\",\"zmx\",\"zmy\",\"zmz\",\"zna\",\"znd\",\"zne\",\"zng\",\"znk\",\"zns\",\"zoc\",\"zoh\",\"zom\",\"zoo\",\"zoq\",\"zor\",\"zos\",\"zpa\",\"zpb\",\"zpc\",\"zpd\",\"zpe\",\"zpf\",\"zpg\",\"zph\",\"zpi\",\"zpj\",\"zpk\",\"zpl\",\"zpm\",\"zpn\",\"zpo\",\"zpp\",\"zpq\",\"zpr\",\"zps\",\"zpt\",\"zpu\",\"zpv\",\"zpw\",\"zpx\",\"zpy\",\"zpz\",\"zqe\",\"zra\",\"zrg\",\"zrn\",\"zro\",\"zrp\",\"zrs\",\"zsa\",\"zsk\",\"zsl\",\"zsm\",\"zsr\",\"zsu\",\"zte\",\"ztg\",\"ztl\",\"ztm\",\"ztn\",\"ztp\",\"ztq\",\"zts\",\"ztt\",\"ztu\",\"ztx\",\"zty\",\"zua\",\"zuh\",\"zum\",\"zun\",\"zuy\",\"zwa\",\"zxx\",\"zyb\",\"zyg\",\"zyj\",\"zyn\",\"zyp\",\"zza\",\"zzj\"];function he(e){return ye(e)||ge(e)||be()}function be(){throw new TypeError(\"Invalid attempt to spread non-iterable instance\")}function ge(e){if(Symbol.iterator in Object(e)||\"[object Arguments]\"===Object.prototype.toString.call(e))return Array.from(e)}function ye(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}axe.utils.validLangs=function(){\"use strict\";return Ie},axe._load({data:{rules:{accesskeys:{description:\"Ensures every accesskey attribute value is unique\",help:\"accesskey attribute value must be unique\"},\"area-alt\":{description:\"Ensures <area> elements of image maps have alternate text\",help:\"Active <area> elements must have alternate text\"},\"aria-allowed-attr\":{description:\"Ensures ARIA attributes are allowed for an element's role\",help:\"Elements must only use allowed ARIA attributes\"},\"aria-allowed-role\":{description:\"Ensures role attribute has an appropriate value for the element\",help:\"ARIA role must be appropriate for the element\"},\"aria-dpub-role-fallback\":{description:\"Ensures unsupported DPUB roles are only used on elements with implicit fallback roles\",help:\"Unsupported DPUB ARIA roles should be used on elements with implicit fallback roles\"},\"aria-hidden-body\":{description:\"Ensures aria-hidden='true' is not present on the document body.\",help:\"aria-hidden='true' must not be present on the document body\"},\"aria-hidden-focus\":{description:\"Ensures aria-hidden elements do not contain focusable elements\",help:\"ARIA hidden element must not contain focusable elements\"},\"aria-input-field-name\":{description:\"Ensures every ARIA input field has an accessible name\",help:\"ARIA input fields have an accessible name\"},\"aria-required-attr\":{description:\"Ensures elements with ARIA roles have all required ARIA attributes\",help:\"Required ARIA attributes must be provided\"},\"aria-required-children\":{description:\"Ensures elements with an ARIA role that require child roles contain them\",help:\"Certain ARIA roles must contain particular children\"},\"aria-required-parent\":{description:\"Ensures elements with an ARIA role that require parent roles are contained by them\",help:\"Certain ARIA roles must be contained by particular parents\"},\"aria-roles\":{description:\"Ensures all elements with a role attribute use a valid value\",help:\"ARIA roles used must conform to valid values\"},\"aria-toggle-field-name\":{description:\"Ensures every ARIA toggle field has an accessible name\",help:\"ARIA toggle fields have an accessible name\"},\"aria-valid-attr-value\":{description:\"Ensures all ARIA attributes have valid values\",help:\"ARIA attributes must conform to valid values\"},\"aria-valid-attr\":{description:\"Ensures attributes that begin with aria- are valid ARIA attributes\",help:\"ARIA attributes must conform to valid names\"},\"audio-caption\":{description:\"Ensures <audio> elements have captions\",help:\"<audio> elements must have a captions track\"},\"autocomplete-valid\":{description:\"Ensure the autocomplete attribute is correct and suitable for the form field\",help:\"autocomplete attribute must be used correctly\"},\"avoid-inline-spacing\":{description:\"Ensure that text spacing set through style attributes can be adjusted with custom stylesheets\",help:\"Inline text spacing must be adjustable with custom stylesheets\"},blink:{description:\"Ensures <blink> elements are not used\",help:\"<blink> elements are deprecated and must not be used\"},\"button-name\":{description:\"Ensures buttons have discernible text\",help:\"Buttons must have discernible text\"},bypass:{description:\"Ensures each page has at least one mechanism for a user to bypass navigation and jump straight to the content\",help:\"Page must have means to bypass repeated blocks\"},checkboxgroup:{description:'Ensures related <input type=\"checkbox\"> elements have a group and that the group designation is consistent',help:\"Checkbox inputs with the same name attribute value must be part of a group\"},\"color-contrast\":{description:\"Ensures the contrast between foreground and background colors meets WCAG 2 AA contrast ratio thresholds\",help:\"Elements must have sufficient color contrast\"},\"css-orientation-lock\":{description:\"Ensures content is not locked to any specific display orientation, and the content is operable in all display orientations\",help:\"CSS Media queries are not used to lock display orientation\"},\"definition-list\":{description:\"Ensures <dl> elements are structured correctly\",help:\"<dl> elements must only directly contain properly-ordered <dt> and <dd> groups, <script> or <template> elements\"},dlitem:{description:\"Ensures <dt> and <dd> elements are contained by a <dl>\",help:\"<dt> and <dd> elements must be contained by a <dl>\"},\"document-title\":{description:\"Ensures each HTML document contains a non-empty <title> element\",help:\"Documents must have <title> element to aid in navigation\"},\"duplicate-id-active\":{description:\"Ensures every id attribute value of active elements is unique\",help:\"IDs of active elements must be unique\"},\"duplicate-id-aria\":{description:\"Ensures every id attribute value used in ARIA and in labels is unique\",help:\"IDs used in ARIA and labels must be unique\"},\"duplicate-id\":{description:\"Ensures every id attribute value is unique\",help:\"id attribute value must be unique\"},\"empty-heading\":{description:\"Ensures headings have discernible text\",help:\"Headings must not be empty\"},\"focus-order-semantics\":{description:\"Ensures elements in the focus order have an appropriate role\",help:\"Elements in the focus order need a role appropriate for interactive content\"},\"form-field-multiple-labels\":{description:\"Ensures form field does not have multiple label elements\",help:\"Form field must not have multiple label elements\"},\"frame-tested\":{description:\"Ensures <iframe> and <frame> elements contain the axe-core script\",help:\"Frames must be tested with axe-core\"},\"frame-title-unique\":{description:\"Ensures <iframe> and <frame> elements contain a unique title attribute\",help:\"Frames must have a unique title attribute\"},\"frame-title\":{description:\"Ensures <iframe> and <frame> elements contain a non-empty title attribute\",help:\"Frames must have title attribute\"},\"heading-order\":{description:\"Ensures the order of headings is semantically correct\",help:\"Heading levels should only increase by one\"},\"hidden-content\":{description:\"Informs users about hidden content.\",help:\"Hidden content on the page cannot be analyzed\"},\"html-has-lang\":{description:\"Ensures every HTML document has a lang attribute\",help:\"<html> element must have a lang attribute\"},\"html-lang-valid\":{description:\"Ensures the lang attribute of the <html> element has a valid value\",help:\"<html> element must have a valid value for the lang attribute\"},\"html-xml-lang-mismatch\":{description:\"Ensure that HTML elements with both valid lang and xml:lang attributes agree on the base language of the page\",help:\"HTML elements with lang and xml:lang must have the same base language\"},\"image-alt\":{description:\"Ensures <img> elements have alternate text or a role of none or presentation\",help:\"Images must have alternate text\"},\"image-redundant-alt\":{description:\"Ensure image alternative is not repeated as text\",help:\"Alternative text of images should not be repeated as text\"},\"input-button-name\":{description:\"Ensures input buttons have discernible text\",help:\"Input buttons must have discernible text\"},\"input-image-alt\":{description:'Ensures <input type=\"image\"> elements have alternate text',help:\"Image buttons must have alternate text\"},\"label-content-name-mismatch\":{description:\"Ensures that elements labelled through their content must have their visible text as part of their accessible name\",help:\"Elements must have their visible text as part of their accessible name\"},\"label-title-only\":{description:\"Ensures that every form element is not solely labeled using the title or aria-describedby attributes\",help:\"Form elements should have a visible label\"},label:{description:\"Ensures every form element has a label\",help:\"Form elements must have labels\"},\"landmark-banner-is-top-level\":{description:\"Ensures the banner landmark is at top level\",help:\"Banner landmark must not be contained in another landmark\"},\"landmark-complementary-is-top-level\":{description:\"Ensures the complementary landmark or aside is at top level\",help:\"Aside must not be contained in another landmark\"},\"landmark-contentinfo-is-top-level\":{description:\"Ensures the contentinfo landmark is at top level\",help:\"Contentinfo landmark must not be contained in another landmark\"},\"landmark-main-is-top-level\":{description:\"Ensures the main landmark is at top level\",help:\"Main landmark must not be contained in another landmark\"},\"landmark-no-duplicate-banner\":{description:\"Ensures the document has at most one banner landmark\",help:\"Document must not have more than one banner landmark\"},\"landmark-no-duplicate-contentinfo\":{description:\"Ensures the document has at most one contentinfo landmark\",help:\"Document must not have more than one contentinfo landmark\"},\"landmark-one-main\":{description:\"Ensures the document has only one main landmark and each iframe in the page has at most one main landmark\",help:\"Document must have one main landmark\"},\"landmark-unique\":{help:\"Ensures landmarks are unique\",description:\"Landmarks must have a unique role or role/label/title (i.e. accessible name) combination\"},\"layout-table\":{description:\"Ensures presentational <table> elements do not use <th>, <caption> elements or the summary attribute\",help:\"Layout tables must not use data table elements\"},\"link-in-text-block\":{description:\"Links can be distinguished without relying on color\",help:\"Links must be distinguished from surrounding text in a way that does not rely on color\"},\"link-name\":{description:\"Ensures links have discernible text\",help:\"Links must have discernible text\"},list:{description:\"Ensures that lists are structured correctly\",help:\"<ul> and <ol> must only directly contain <li>, <script> or <template> elements\"},listitem:{description:\"Ensures <li> elements are used semantically\",help:\"<li> elements must be contained in a <ul> or <ol>\"},marquee:{description:\"Ensures <marquee> elements are not used\",help:\"<marquee> elements are deprecated and must not be used\"},\"meta-refresh\":{description:'Ensures <meta http-equiv=\"refresh\"> is not used',help:\"Timed refresh must not exist\"},\"meta-viewport-large\":{description:'Ensures <meta name=\"viewport\"> can scale a significant amount',help:\"Users should be able to zoom and scale the text up to 500%\"},\"meta-viewport\":{description:'Ensures <meta name=\"viewport\"> does not disable text scaling and zooming',help:\"Zooming and scaling must not be disabled\"},\"object-alt\":{description:\"Ensures <object> elements have alternate text\",help:\"<object> elements must have alternate text\"},\"p-as-heading\":{description:\"Ensure p elements are not used to style headings\",help:\"Bold, italic text and font-size are not used to style p elements as a heading\"},\"page-has-heading-one\":{description:\"Ensure that the page, or at least one of its frames contains a level-one heading\",help:\"Page must contain a level-one heading\"},radiogroup:{description:'Ensures related <input type=\"radio\"> elements have a group and that the group designation is consistent',help:\"Radio inputs with the same name attribute value must be part of a group\"},region:{description:\"Ensures all page content is contained by landmarks\",help:\"All page content must be contained by landmarks\"},\"role-img-alt\":{description:\"Ensures [role='img'] elements have alternate text\",help:\"[role='img'] elements have an alternative text\"},\"scope-attr-valid\":{description:\"Ensures the scope attribute is used correctly on tables\",help:\"scope attribute should be used correctly\"},\"scrollable-region-focusable\":{description:\"Elements that have scrollable content should be accessible by keyboard\",help:\"Ensure that scrollable region has keyboard access\"},\"server-side-image-map\":{description:\"Ensures that server-side image maps are not used\",help:\"Server-side image maps must not be used\"},\"skip-link\":{description:\"Ensure all skip links have a focusable target\",help:\"The skip-link target should exist and be focusable\"},tabindex:{description:\"Ensures tabindex attribute values are not greater than 0\",help:\"Elements should not have tabindex greater than zero\"},\"table-duplicate-name\":{description:\"Ensure that tables do not have the same summary and caption\",help:\"The <caption> element should not contain the same text as the summary attribute\"},\"table-fake-caption\":{description:\"Ensure that tables with a caption use the <caption> element.\",help:\"Data or header cells should not be used to give caption to a data table.\"},\"td-has-header\":{description:\"Ensure that each non-empty data cell in a large table has one or more table headers\",help:\"All non-empty td element in table larger than 3 by 3 must have an associated table header\"},\"td-headers-attr\":{description:\"Ensure that each cell in a table using the headers refers to another cell in that table\",help:\"All cells in a table element that use the headers attribute must only refer to other cells of that same table\"},\"th-has-data-cells\":{description:\"Ensure that each table header in a data table refers to data cells\",help:\"All th elements and elements with role=columnheader/rowheader must have data cells they describe\"},\"valid-lang\":{description:\"Ensures lang attributes have valid values\",help:\"lang attribute must have a valid value\"},\"video-caption\":{description:\"Ensures <video> elements have captions\",help:\"<video> elements must have captions\"},\"video-description\":{description:\"Ensures <video> elements have audio descriptions\",help:\"<video> elements must have an audio description track\"}},checks:{accesskeys:{impact:\"serious\",messages:{pass:function(e){return\"Accesskey attribute value is unique\"},fail:function(e){return\"Document has multiple elements with the same accesskey\"}}},\"non-empty-alt\":{impact:\"critical\",messages:{pass:function(e){return\"Element has a non-empty alt attribute\"},fail:function(e){return\"Element has no alt attribute or the alt attribute is empty\"}}},\"non-empty-title\":{impact:\"serious\",messages:{pass:function(e){return\"Element has a title attribute\"},fail:function(e){return\"Element has no title attribute or the title attribute is empty\"}}},\"aria-label\":{impact:\"serious\",messages:{pass:function(e){return\"aria-label attribute exists and is not empty\"},fail:function(e){return\"aria-label attribute does not exist or is empty\"}}},\"aria-labelledby\":{impact:\"serious\",messages:{pass:function(e){return\"aria-labelledby attribute exists and references elements that are visible to screen readers\"},fail:function(e){return\"aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty\"}}},\"aria-allowed-attr\":{impact:\"critical\",messages:{pass:function(e){return\"ARIA attributes are used correctly for the defined role\"},fail:function(e){var t=\"ARIA attribute\"+(e.data&&1<e.data.length?\"s are\":\" is\")+\" not allowed:\",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t}}},\"aria-unsupported-attr\":{impact:\"critical\",messages:{pass:function(e){return\"ARIA attribute is supported\"},fail:function(e){var t=\"ARIA attribute is not widely supported in screen readers and assistive technologies: \",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t}}},\"aria-allowed-role\":{impact:\"minor\",messages:{pass:function(e){return\"ARIA role is allowed for given element\"},fail:function(e){return\"ARIA role\"+(e.data&&1<e.data.length?\"s\":\"\")+\" \"+e.data.join(\", \")+\" \"+(e.data&&1<e.data.length?\"are\":\" is\")+\" not allowed for given element\"},incomplete:function(e){return\"ARIA role\"+(e.data&&1<e.data.length?\"s\":\"\")+\" \"+e.data.join(\", \")+\" must be removed when the element is made visible, as \"+(e.data&&1<e.data.length?\"they are\":\"it is\")+\" not allowed for the element\"}}},\"implicit-role-fallback\":{impact:\"moderate\",messages:{pass:function(e){return\"Element’s implicit ARIA role is an appropriate fallback\"},fail:function(e){return\"Element’s implicit ARIA role is not a good fallback for the (unsupported) role\"}}},\"aria-hidden-body\":{impact:\"critical\",messages:{pass:function(e){return\"No aria-hidden attribute is present on document body\"},fail:function(e){return\"aria-hidden=true should not be present on the document body\"}}},\"focusable-disabled\":{impact:\"serious\",messages:{pass:function(e){return\"No focusable elements contained within element\"},fail:function(e){return\"Focusable content should be disabled or be removed from the DOM\"}}},\"focusable-not-tabbable\":{impact:\"serious\",messages:{pass:function(e){return\"No focusable elements contained within element\"},fail:function(e){return\"Focusable content should have tabindex='-1' or be removed from the DOM\"}}},\"no-implicit-explicit-label\":{impact:\"moderate\",messages:{pass:function(e){return\"There is no mismatch between a <label> and accessible name\"},incomplete:function(e){return\"Check that the <label> does not need be part of the ARIA \"+e.data+\" field's name\"}}},\"aria-required-attr\":{impact:\"critical\",messages:{pass:function(e){return\"All required ARIA attributes are present\"},fail:function(e){var t=\"Required ARIA attribute\"+(e.data&&1<e.data.length?\"s\":\"\")+\" not present:\",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t}}},\"aria-required-children\":{impact:\"critical\",messages:{pass:function(e){return\"Required ARIA children are present\"},fail:function(e){var t=\"Required ARIA \"+(e.data&&1<e.data.length?\"children\":\"child\")+\" role not present:\",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t},incomplete:function(e){var t=\"Expecting ARIA \"+(e.data&&1<e.data.length?\"children\":\"child\")+\" role to be added:\",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t}}},\"aria-required-parent\":{impact:\"critical\",messages:{pass:function(e){return\"Required ARIA parent role present\"},fail:function(e){var t=\"Required ARIA parent\"+(e.data&&1<e.data.length?\"s\":\"\")+\" role not present:\",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t}}},invalidrole:{impact:\"critical\",messages:{pass:function(e){return\"ARIA role is valid\"},fail:function(e){return\"Role must be one of the valid ARIA roles\"}}},abstractrole:{impact:\"serious\",messages:{pass:function(e){return\"Abstract roles are not used\"},fail:function(e){return\"Abstract roles cannot be directly used\"}}},unsupportedrole:{impact:\"critical\",messages:{pass:function(e){return\"ARIA role is supported\"},fail:function(e){var t=\"The role used is not widely supported in screen readers and assistive technologies: \",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t}}},\"has-visible-text\":{impact:\"minor\",messages:{pass:function(e){return\"Element has text that is visible to screen readers\"},fail:function(e){return\"Element does not have text that is visible to screen readers\"}}},\"aria-valid-attr-value\":{impact:\"critical\",messages:{pass:function(e){return\"ARIA attribute values are valid\"},fail:function(e){var t=\"Invalid ARIA attribute value\"+(e.data&&1<e.data.length?\"s\":\"\")+\":\",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t}}},\"aria-errormessage\":{impact:\"critical\",messages:{pass:function(e){return\"Uses a supported aria-errormessage technique\"},fail:function(e){var t=\"aria-errormessage value\"+(e.data&&1<e.data.length?\"s\":\"\")+\" \",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" `\"+n[r+=1];return t+=\"` must use a technique to announce the message (e.g., aria-live, aria-describedby, role=alert, etc.)\"}}},\"aria-valid-attr\":{impact:\"critical\",messages:{pass:function(e){return\"ARIA attribute name\"+(e.data&&1<e.data.length?\"s\":\"\")+\" are valid\"},fail:function(e){var t=\"Invalid ARIA attribute name\"+(e.data&&1<e.data.length?\"s\":\"\")+\":\",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t}}},caption:{impact:\"critical\",messages:{pass:function(e){return\"The multimedia element has a captions track\"},incomplete:function(e){return\"Check that captions is available for the element\"}}},\"autocomplete-valid\":{impact:\"serious\",messages:{pass:function(e){return\"the autocomplete attribute is correctly formatted\"},fail:function(e){return\"the autocomplete attribute is incorrectly formatted\"}}},\"autocomplete-appropriate\":{impact:\"serious\",messages:{pass:function(e){return\"the autocomplete value is on an appropriate element\"},fail:function(e){return\"the autocomplete value is inappropriate for this type of input\"}}},\"avoid-inline-spacing\":{impact:\"serious\",messages:{pass:function(e){return\"No inline styles with '!important' that affect text spacing has been specified\"},fail:function(e){return\"Remove '!important' from inline style\"+(e.data&&1<e.data.length?\"s\":\"\")+\" \"+e.data.join(\", \")+\", as overriding this is not supported by most browsers\"}}},\"is-on-screen\":{impact:\"serious\",messages:{pass:function(e){return\"Element is not visible\"},fail:function(e){return\"Element is visible\"}}},\"button-has-visible-text\":{impact:\"critical\",messages:{pass:function(e){return\"Element has inner text that is visible to screen readers\"},fail:function(e){return\"Element does not have inner text that is visible to screen readers\"}}},\"role-presentation\":{impact:\"minor\",messages:{pass:function(e){return'Element\\'s default semantics were overriden with role=\"presentation\"'},fail:function(e){return'Element\\'s default semantics were not overridden with role=\"presentation\"'}}},\"role-none\":{impact:\"minor\",messages:{pass:function(e){return'Element\\'s default semantics were overriden with role=\"none\"'},fail:function(e){return'Element\\'s default semantics were not overridden with role=\"none\"'}}},\"internal-link-present\":{impact:\"serious\",messages:{pass:function(e){return\"Valid skip link found\"},fail:function(e){return\"No valid skip link found\"}}},\"header-present\":{impact:\"serious\",messages:{pass:function(e){return\"Page has a header\"},fail:function(e){return\"Page does not have a header\"}}},landmark:{impact:\"serious\",messages:{pass:function(e){return\"Page has a landmark region\"},fail:function(e){return\"Page does not have a landmark region\"}}},\"group-labelledby\":{impact:\"critical\",messages:{pass:function(e){return'Elements with the name \"'+e.data.name+'\" have both a shared label, and a unique label, referenced through aria-labelledby'},fail:function(e){var t=\"\",n=e.data&&e.data.failureCode;return t+='Elements with the name \"'+e.data.name+'\" do not all have ',t+=\"no-shared-label\"===n?\"a shared label\":\"no-unique-label\"===n?\"a unique label\":\"both a shared label, and a unique label\",t+=\", referenced through aria-labelledby\"}}},fieldset:{impact:\"critical\",messages:{pass:function(e){return\"Element is contained in a fieldset\"},fail:function(e){var t=\"\",n=e.data&&e.data.failureCode;return t+=\"no-legend\"===n?\"Fieldset does not have a legend as its first child\":\"empty-legend\"===n?\"Legend does not have text that is visible to screen readers\":\"mixed-inputs\"===n?\"Fieldset contains unrelated inputs\":\"no-group-label\"===n?\"ARIA group does not have aria-label or aria-labelledby\":\"group-mixed-inputs\"===n?\"ARIA group contains unrelated inputs\":\"Element does not have a containing fieldset or ARIA group\"}}},\"color-contrast\":{impact:\"serious\",messages:{pass:function(e){return\"Element has sufficient color contrast of \"+e.data.contrastRatio},fail:function(e){return\"Element has insufficient color contrast of \"+e.data.contrastRatio+\" (foreground color: \"+e.data.fgColor+\", background color: \"+e.data.bgColor+\", font size: \"+e.data.fontSize+\", font weight: \"+e.data.fontWeight+\"). Expected contrast ratio of \"+e.data.expectedContrastRatio},incomplete:{bgImage:\"Element's background color could not be determined due to a background image\",bgGradient:\"Element's background color could not be determined due to a background gradient\",imgNode:\"Element's background color could not be determined because element contains an image node\",bgOverlap:\"Element's background color could not be determined because it is overlapped by another element\",fgAlpha:\"Element's foreground color could not be determined because of alpha transparency\",elmPartiallyObscured:\"Element's background color could not be determined because it's partially obscured by another element\",elmPartiallyObscuring:\"Element's background color could not be determined because it partially overlaps other elements\",outsideViewport:\"Element's background color could not be determined because it's outside the viewport\",equalRatio:\"Element has a 1:1 contrast ratio with the background\",shortTextContent:\"Element content is too short to determine if it is actual text content\",default:\"Unable to determine contrast ratio\"}}},\"css-orientation-lock\":{impact:\"serious\",messages:{pass:function(e){return\"Display is operable, and orientation lock does not exist\"},fail:function(e){return\"CSS Orientation lock is applied, and makes display inoperable\"},incomplete:function(e){return\"CSS Orientation lock cannot be determined\"}}},\"structured-dlitems\":{impact:\"serious\",messages:{pass:function(e){return\"When not empty, element has both <dt> and <dd> elements\"},fail:function(e){return\"When not empty, element does not have at least one <dt> element followed by at least one <dd> element\"}}},\"only-dlitems\":{impact:\"serious\",messages:{pass:function(e){return\"List element only has direct children that are allowed inside <dt> or <dd> elements\"},fail:function(e){return\"List element has direct children that are not allowed inside <dt> or <dd> elements\"}}},dlitem:{impact:\"serious\",messages:{pass:function(e){return\"Description list item has a <dl> parent element\"},fail:function(e){return\"Description list item does not have a <dl> parent element\"}}},\"doc-has-title\":{impact:\"serious\",messages:{pass:function(e){return\"Document has a non-empty <title> element\"},fail:function(e){return\"Document does not have a non-empty <title> element\"}}},\"duplicate-id-active\":{impact:\"serious\",messages:{pass:function(e){return\"Document has no active elements that share the same id attribute\"},fail:function(e){return\"Document has active elements with the same id attribute: \"+e.data}}},\"duplicate-id-aria\":{impact:\"critical\",messages:{pass:function(e){return\"Document has no elements referenced with ARIA or labels that share the same id attribute\"},fail:function(e){return\"Document has multiple elements referenced with ARIA with the same id attribute: \"+e.data}}},\"duplicate-id\":{impact:\"minor\",messages:{pass:function(e){return\"Document has no static elements that share the same id attribute\"},fail:function(e){return\"Document has multiple static elements with the same id attribute\"}}},\"has-widget-role\":{impact:\"minor\",messages:{pass:function(e){return\"Element has a widget role.\"},fail:function(e){return\"Element does not have a widget role.\"}}},\"valid-scrollable-semantics\":{impact:\"minor\",messages:{pass:function(e){return\"Element has valid semantics for an element in the focus order.\"},fail:function(e){return\"Element has invalid semantics for an element in the focus order.\"}}},\"multiple-label\":{impact:\"moderate\",messages:{pass:function(e){return\"Form field does not have multiple label elements\"},fail:function(e){return\"Multiple label elements is not widely supported in assistive technologies\"}}},\"frame-tested\":{impact:\"critical\",messages:{pass:function(e){return\"The iframe was tested with axe-core\"},fail:function(e){return\"The iframe could not be tested with axe-core\"},incomplete:function(e){return\"The iframe still has to be tested with axe-core\"}}},\"unique-frame-title\":{impact:\"serious\",messages:{pass:function(e){return\"Element's title attribute is unique\"},fail:function(e){return\"Element's title attribute is not unique\"}}},\"heading-order\":{impact:\"moderate\",messages:{pass:function(e){return\"Heading order valid\"},fail:function(e){return\"Heading order invalid\"}}},\"hidden-content\":{impact:\"minor\",messages:{pass:function(e){return\"All content on the page has been analyzed.\"},fail:function(e){return\"There were problems analyzing the content on this page.\"},incomplete:function(e){return\"There is hidden content on the page that was not analyzed. You will need to trigger the display of this content in order to analyze it.\"}}},\"has-lang\":{impact:\"serious\",messages:{pass:function(e){return\"The <html> element has a lang attribute\"},fail:function(e){return\"The <html> element does not have a lang attribute\"}}},\"valid-lang\":{impact:\"serious\",messages:{pass:function(e){return\"Value of lang attribute is included in the list of valid languages\"},fail:function(e){return\"Value of lang attribute not included in the list of valid languages\"}}},\"xml-lang-mismatch\":{impact:\"moderate\",messages:{pass:function(e){return\"Lang and xml:lang attributes have the same base language\"},fail:function(e){return\"Lang and xml:lang attributes do not have the same base language\"}}},\"has-alt\":{impact:\"critical\",messages:{pass:function(e){return\"Element has an alt attribute\"},fail:function(e){return\"Element does not have an alt attribute\"}}},\"alt-space-value\":{impact:\"critical\",messages:{pass:function(e){return\"Element has a valid alt attribute value\"},fail:function(e){return\"Element has an alt attribute containing only a space character, which is not ignored by all screen readers\"}}},\"duplicate-img-label\":{impact:\"minor\",messages:{pass:function(e){return\"Element does not duplicate existing text in <img> alt text\"},fail:function(e){return\"Element contains <img> element with alt text that duplicates existing text\"}}},\"non-empty-if-present\":{impact:\"critical\",messages:{pass:function(e){var t=\"Element \";return e.data?t+=\"has a non-empty value attribute\":t+=\"does not have a value attribute\",t},fail:function(e){return\"Element has a value attribute and the value attribute is empty\"}}},\"non-empty-value\":{impact:\"critical\",messages:{pass:function(e){return\"Element has a non-empty value attribute\"},fail:function(e){return\"Element has no value attribute or the value attribute is empty\"}}},\"label-content-name-mismatch\":{impact:\"serious\",messages:{pass:function(e){return\"Element contains visible text as part of it's accessible name\"},fail:function(e){return\"Text inside the element is not included in the accessible name\"}}},\"title-only\":{impact:\"serious\",messages:{pass:function(e){return\"Form element does not solely use title attribute for its label\"},fail:function(e){return\"Only title used to generate label for form element\"}}},\"implicit-label\":{impact:\"critical\",messages:{pass:function(e){return\"Form element has an implicit (wrapped) <label>\"},fail:function(e){return\"Form element does not have an implicit (wrapped) <label>\"}}},\"explicit-label\":{impact:\"critical\",messages:{pass:function(e){return\"Form element has an explicit <label>\"},fail:function(e){return\"Form element does not have an explicit <label>\"}}},\"help-same-as-label\":{impact:\"minor\",messages:{pass:function(e){return\"Help text (title or aria-describedby) does not duplicate label text\"},fail:function(e){return\"Help text (title or aria-describedby) text is the same as the label text\"}}},\"hidden-explicit-label\":{impact:\"critical\",messages:{pass:function(e){return\"Form element has a visible explicit <label>\"},fail:function(e){return\"Form element has explicit <label> that is hidden\"}}},\"landmark-is-top-level\":{impact:\"moderate\",messages:{pass:function(e){return\"The \"+e.data.role+\" landmark is at the top level.\"},fail:function(e){return\"The \"+e.data.role+\" landmark is contained in another landmark.\"}}},\"page-no-duplicate-banner\":{impact:\"moderate\",messages:{pass:function(e){return\"Document does not have more than one banner landmark\"},fail:function(e){return\"Document has more than one banner landmark\"}}},\"page-no-duplicate-contentinfo\":{impact:\"moderate\",messages:{pass:function(e){return\"Document does not have more than one contentinfo landmark\"},fail:function(e){return\"Document has more than one contentinfo landmark\"}}},\"page-has-main\":{impact:\"moderate\",messages:{pass:function(e){return\"Document has at least one main landmark\"},fail:function(e){return\"Document does not have a main landmark\"}}},\"page-no-duplicate-main\":{impact:\"moderate\",messages:{pass:function(e){return\"Document does not have more than one main landmark\"},fail:function(e){return\"Document has more than one main landmark\"}}},\"landmark-is-unique\":{impact:\"moderate\",messages:{pass:function(e){return\"Landmarks must have a unique role or role/label/title (i.e. accessible name) combination\"},fail:function(e){return\"The landmark must have a unique aria-label, aria-labelledby, or title to make landmarks distinguishable\"}}},\"has-th\":{impact:\"serious\",messages:{pass:function(e){return\"Layout table does not use <th> elements\"},fail:function(e){return\"Layout table uses <th> elements\"}}},\"has-caption\":{impact:\"serious\",messages:{pass:function(e){return\"Layout table does not use <caption> element\"},fail:function(e){return\"Layout table uses <caption> element\"}}},\"has-summary\":{impact:\"serious\",messages:{pass:function(e){return\"Layout table does not use summary attribute\"},fail:function(e){return\"Layout table uses summary attribute\"}}},\"link-in-text-block\":{impact:\"serious\",messages:{pass:function(e){return\"Links can be distinguished from surrounding text in some way other than by color\"},fail:function(e){return\"Links need to be distinguished from surrounding text in some way other than by color\"},incomplete:{bgContrast:\"Element's contrast ratio could not be determined. Check for a distinct hover/focus style\",bgImage:\"Element's contrast ratio could not be determined due to a background image\",bgGradient:\"Element's contrast ratio could not be determined due to a background gradient\",imgNode:\"Element's contrast ratio could not be determined because element contains an image node\",bgOverlap:\"Element's contrast ratio could not be determined because of element overlap\",default:\"Unable to determine contrast ratio\"}}},\"focusable-no-name\":{impact:\"serious\",messages:{pass:function(e){return\"Element is not in tab order or has accessible text\"},fail:function(e){return\"Element is in tab order and does not have accessible text\"}}},\"only-listitems\":{impact:\"serious\",messages:{pass:function(e){return\"List element only has direct children that are allowed inside <li> elements\"},fail:function(e){return\"List element has direct children that are not allowed inside <li> elements\"}}},listitem:{impact:\"serious\",messages:{pass:function(e){return'List item has a <ul>, <ol> or role=\"list\" parent element'},fail:function(e){return'List item does not have a <ul>, <ol> or role=\"list\" parent element'}}},\"meta-refresh\":{impact:\"critical\",messages:{pass:function(e){return\"<meta> tag does not immediately refresh the page\"},fail:function(e){return\"<meta> tag forces timed refresh of page\"}}},\"meta-viewport-large\":{impact:\"minor\",messages:{pass:function(e){return\"<meta> tag does not prevent significant zooming on mobile devices\"},fail:function(e){return\"<meta> tag limits zooming on mobile devices\"}}},\"meta-viewport\":{impact:\"critical\",messages:{pass:function(e){return\"<meta> tag does not disable zooming on mobile devices\"},fail:function(e){return e.data+\" on <meta> tag disables zooming on mobile devices\"}}},\"p-as-heading\":{impact:\"serious\",messages:{pass:function(e){return\"<p> elements are not styled as headings\"},fail:function(e){return\"Heading elements should be used instead of styled p elements\"}}},\"page-has-heading-one\":{impact:\"moderate\",messages:{pass:function(e){return\"Page has at least one level-one heading\"},fail:function(e){return\"Page must have a level-one heading\"}}},region:{impact:\"moderate\",messages:{pass:function(e){return\"All page content is contained by landmarks\"},fail:function(e){return\"Some page content is not contained by landmarks\"}}},\"html5-scope\":{impact:\"moderate\",messages:{pass:function(e){return\"Scope attribute is only used on table header elements (<th>)\"},fail:function(e){return\"In HTML 5, scope attributes may only be used on table header elements (<th>)\"}}},\"scope-value\":{impact:\"critical\",messages:{pass:function(e){return\"Scope attribute is used correctly\"},fail:function(e){return\"The value of the scope attribute may only be 'row' or 'col'\"}}},\"focusable-content\":{impact:\"moderate\",messages:{pass:function(e){return\"Element contains focusable elements\"},fail:function(e){return\"Element should have focusable content\"}}},\"focusable-element\":{impact:\"moderate\",messages:{pass:function(e){return\"Element is focusable\"},fail:function(e){return\"Element should be focusable\"}}},exists:{impact:\"minor\",messages:{pass:function(e){return\"Element does not exist\"},fail:function(e){return\"Element exists\"}}},\"skip-link\":{impact:\"moderate\",messages:{pass:function(e){return\"Skip link target exists\"},incomplete:function(e){return\"Skip link target should become visible on activation\"},fail:function(e){return\"No skip link target\"}}},tabindex:{impact:\"serious\",messages:{pass:function(e){return\"Element does not have a tabindex greater than 0\"},fail:function(e){return\"Element has a tabindex greater than 0\"}}},\"same-caption-summary\":{impact:\"minor\",messages:{pass:function(e){return\"Content of summary attribute and <caption> are not duplicated\"},fail:function(e){return\"Content of summary attribute and <caption> element are identical\"}}},\"caption-faked\":{impact:\"serious\",messages:{pass:function(e){return\"The first row of a table is not used as a caption\"},fail:function(e){return\"The first row of the table should be a caption instead of a table cell\"}}},\"td-has-header\":{impact:\"critical\",messages:{pass:function(e){return\"All non-empty data cells have table headers\"},fail:function(e){return\"Some non-empty data cells do not have table headers\"}}},\"td-headers-attr\":{impact:\"serious\",messages:{pass:function(e){return\"The headers attribute is exclusively used to refer to other cells in the table\"},fail:function(e){return\"The headers attribute is not exclusively used to refer to other cells in the table\"}}},\"th-has-data-cells\":{impact:\"serious\",messages:{pass:function(e){return\"All table header cells refer to data cells\"},fail:function(e){return\"Not all table header cells refer to data cells\"},incomplete:function(e){return\"Table data cells are missing or empty\"}}},description:{impact:\"critical\",messages:{pass:function(e){return\"The multimedia element has an audio description track\"},incomplete:function(e){return\"Check that audio description is available for the element\"}}}},failureSummaries:{any:{failureMessage:function(e){var t=\"Fix any of the following:\",n=e;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\"\\n  \"+n[r+=1].split(\"\\n\").join(\"\\n  \");return t}},none:{failureMessage:function(e){var t=\"Fix all of the following:\",n=e;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\"\\n  \"+n[r+=1].split(\"\\n\").join(\"\\n  \");return t}}},incompleteFallbackMessage:function(e){return\"axe couldn't tell the reason. Time to break out the element inspector!\"}},rules:[{id:\"accesskeys\",selector:\"[accesskey]\",excludeHidden:!1,tags:[\"best-practice\",\"cat.keyboard\"],all:[],any:[],none:[\"accesskeys\"]},{id:\"area-alt\",selector:\"map area[href]\",excludeHidden:!1,tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"non-empty-alt\",\"non-empty-title\",\"aria-label\",\"aria-labelledby\"],none:[]},{id:\"aria-allowed-attr\",matches:function(e,t,n){var r=/^aria-/;if(e.hasAttributes())for(var a=axe.utils.getNodeAttributes(e),o=0,i=a.length;o<i;o++)if(r.test(a[o].name))return!0;return!1},tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[\"aria-allowed-attr\"],none:[\"aria-unsupported-attr\"]},{id:\"aria-allowed-role\",excludeHidden:!1,selector:\"[role]\",matches:function(e,t,n){return null!==axe.commons.aria.getRole(e,{noImplicit:!0,dpub:!0,fallback:!0})},tags:[\"cat.aria\",\"best-practice\"],all:[],any:[{options:{allowImplicit:!0,ignoredTags:[]},id:\"aria-allowed-role\"}],none:[]},{id:\"aria-dpub-role-fallback\",selector:\"[role]\",matches:function(e,t,n){var r=e.getAttribute(\"role\");return[\"doc-backlink\",\"doc-biblioentry\",\"doc-biblioref\",\"doc-cover\",\"doc-endnote\",\"doc-glossref\",\"doc-noteref\"].includes(r)},tags:[\"cat.aria\",\"wcag2a\",\"wcag131\"],all:[\"implicit-role-fallback\"],any:[],none:[]},{id:\"aria-hidden-body\",selector:\"body\",excludeHidden:!1,tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[\"aria-hidden-body\"],none:[]},{id:\"aria-hidden-focus\",selector:'[aria-hidden=\"true\"]',matches:function(e,t,n){var r=axe.commons.dom.getComposedParent;return function e(t){return!t||\"true\"!==t.getAttribute(\"aria-hidden\")&&e(r(t))}(r(e))},excludeHidden:!1,tags:[\"cat.name-role-value\",\"wcag2a\",\"wcag412\",\"wcag131\"],all:[\"focusable-disabled\",\"focusable-not-tabbable\"],any:[],none:[]},{id:\"aria-input-field-name\",selector:'[role=\"combobox\"], [role=\"listbox\"], [role=\"searchbox\"], [role=\"slider\"], [role=\"spinbutton\"], [role=\"textbox\"]',matches:function(e,t,n){var r=axe.commons.aria,a=e.nodeName.toUpperCase(),o=r.getRole(e,{noImplicit:!0});return(\"AREA\"!==a||!e.getAttribute(\"href\"))&&(![\"INPUT\",\"SELECT\",\"TEXTAREA\"].includes(a)&&(\"IMG\"!==a&&(\"img\"!==o||\"SVG\"===a)&&(\"BUTTON\"!==a&&\"button\"!==o)))},tags:[\"wcag2a\",\"wcag412\"],all:[],any:[\"aria-label\",\"aria-labelledby\",\"non-empty-title\"],none:[\"no-implicit-explicit-label\"]},{id:\"aria-required-attr\",selector:\"[role]\",tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[\"aria-required-attr\"],none:[]},{id:\"aria-required-children\",selector:\"[role]\",tags:[\"cat.aria\",\"wcag2a\",\"wcag131\"],all:[],any:[{options:{reviewEmpty:[\"doc-bibliography\",\"doc-endnotes\",\"grid\",\"list\",\"listbox\",\"table\",\"tablist\",\"tree\",\"treegrid\",\"rowgroup\"]},id:\"aria-required-children\"}],none:[]},{id:\"aria-required-parent\",selector:\"[role]\",tags:[\"cat.aria\",\"wcag2a\",\"wcag131\"],all:[],any:[\"aria-required-parent\"],none:[]},{id:\"aria-roles\",selector:\"[role]\",tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[],none:[\"invalidrole\",\"abstractrole\",\"unsupportedrole\"]},{id:\"aria-toggle-field-name\",selector:'[role=\"checkbox\"], [role=\"menuitemcheckbox\"], [role=\"menuitemradio\"], [role=\"radio\"], [role=\"switch\"]',matches:function(e,t,n){var r=axe.commons.aria,a=e.nodeName.toUpperCase(),o=r.getRole(e,{noImplicit:!0});return(\"AREA\"!==a||!e.getAttribute(\"href\"))&&(![\"INPUT\",\"SELECT\",\"TEXTAREA\"].includes(a)&&(\"IMG\"!==a&&(\"img\"!==o||\"SVG\"===a)&&(\"BUTTON\"!==a&&\"button\"!==o)))},tags:[\"wcag2a\",\"wcag412\"],all:[],any:[\"aria-label\",\"aria-labelledby\",\"non-empty-title\",\"has-visible-text\"],none:[\"no-implicit-explicit-label\"]},{id:\"aria-valid-attr-value\",matches:function(e,t,n){var r=/^aria-/;if(e.hasAttributes())for(var a=axe.utils.getNodeAttributes(e),o=0,i=a.length;o<i;o++)if(r.test(a[o].name))return!0;return!1},tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[{options:[],id:\"aria-valid-attr-value\"},\"aria-errormessage\"],any:[],none:[]},{id:\"aria-valid-attr\",matches:function(e,t,n){var r=/^aria-/;if(e.hasAttributes())for(var a=axe.utils.getNodeAttributes(e),o=0,i=a.length;o<i;o++)if(r.test(a[o].name))return!0;return!1},tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[{options:[],id:\"aria-valid-attr\"}],none:[]},{id:\"audio-caption\",selector:\"audio\",enabled:!1,excludeHidden:!1,tags:[\"cat.time-and-media\",\"wcag2a\",\"wcag121\",\"section508\",\"section508.22.a\"],all:[],any:[],none:[\"caption\"]},{id:\"autocomplete-valid\",matches:function(e,t,n){var r=axe.commons,a=r.text,o=r.aria,i=r.dom,u=t.attr(\"autocomplete\");if(!u||\"\"===a.sanitize(u))return!1;var s=t.props.nodeName;if(!1===[\"textarea\",\"input\",\"select\"].includes(s))return!1;if(\"input\"===s&&[\"submit\",\"reset\",\"button\",\"hidden\"].includes(t.props.type))return!1;var l=t.attr(\"aria-disabled\")||\"false\";if(t.hasAttr(\"disabled\")||\"true\"===l.toLowerCase())return!1;var c=t.attr(\"role\"),d=t.attr(\"tabindex\");if(\"-1\"===d&&c){var m=o.lookupTable.role[c];if(void 0===m||\"widget\"!==m.type)return!1}return!(\"-1\"===d&&t.actualNode&&!i.isVisible(t.actualNode,!1)&&!i.isVisible(t.actualNode,!0))},tags:[\"cat.forms\",\"wcag21aa\",\"wcag135\"],all:[\"autocomplete-valid\",\"autocomplete-appropriate\"],any:[],none:[]},{id:\"avoid-inline-spacing\",selector:\"[style]\",tags:[\"wcag21\",\"wcag1412\"],all:[\"avoid-inline-spacing\"],any:[],none:[]},{id:\"blink\",selector:\"blink\",excludeHidden:!1,tags:[\"cat.time-and-media\",\"wcag2a\",\"wcag222\",\"section508\",\"section508.22.j\"],all:[],any:[],none:[\"is-on-screen\"]},{id:\"button-name\",selector:'button, [role=\"button\"]',tags:[\"cat.name-role-value\",\"wcag2a\",\"wcag412\",\"section508\",\"section508.22.a\"],all:[],any:[\"button-has-visible-text\",\"aria-label\",\"aria-labelledby\",\"role-presentation\",\"role-none\",\"non-empty-title\"],none:[]},{id:\"bypass\",selector:\"html\",pageLevel:!0,matches:function(e,t,n){return!!e.querySelector(\"a[href]\")},tags:[\"cat.keyboard\",\"wcag2a\",\"wcag241\",\"section508\",\"section508.22.o\"],all:[],any:[\"internal-link-present\",\"header-present\",\"landmark\"],none:[]},{id:\"checkboxgroup\",selector:\"input[type=checkbox][name]\",tags:[\"cat.forms\",\"best-practice\"],all:[],any:[\"group-labelledby\",\"fieldset\"],none:[]},{id:\"color-contrast\",matches:function(e,t,n){var r=e.nodeName.toUpperCase(),a=e.type;if(\"true\"===e.getAttribute(\"aria-disabled\")||axe.commons.dom.findUpVirtual(t,'[aria-disabled=\"true\"]'))return!1;if(\"INPUT\"===r)return-1===[\"hidden\",\"range\",\"color\",\"checkbox\",\"radio\",\"image\"].indexOf(a)&&!e.disabled;if(\"SELECT\"===r)return!!e.options.length&&!e.disabled;if(\"TEXTAREA\"===r)return!e.disabled;if(\"OPTION\"===r)return!1;if(\"BUTTON\"===r&&e.disabled||axe.commons.dom.findUpVirtual(t,\"button[disabled]\"))return!1;if(\"FIELDSET\"===r&&e.disabled||axe.commons.dom.findUpVirtual(t,\"fieldset[disabled]\"))return!1;var o=axe.commons.dom.findUpVirtual(t,\"label\");if(\"LABEL\"===r||o){var i=e,u=t;o&&(i=o,u=axe.utils.getNodeFromTree(o));var s=axe.commons.dom.getRootNode(i);if((l=i.htmlFor&&s.getElementById(i.htmlFor))&&l.disabled)return!1;if((l=axe.utils.querySelectorAll(u,'input:not([type=\"hidden\"]):not([type=\"image\"]):not([type=\"button\"]):not([type=\"submit\"]):not([type=\"reset\"]), select, textarea')).length&&l[0].actualNode.disabled)return!1}if(e.getAttribute(\"id\")){var l,c=axe.utils.escapeSelector(e.getAttribute(\"id\"));if((l=axe.commons.dom.getRootNode(e).querySelector(\"[aria-labelledby~=\"+c+\"]\"))&&l.disabled)return!1}if(\"\"===axe.commons.text.visibleVirtual(t,!1,!0))return!1;var d,m,p=document.createRange(),f=t.children,h=f.length;for(m=0;m<h;m++)3===(d=f[m]).actualNode.nodeType&&\"\"!==axe.commons.text.sanitize(d.actualNode.nodeValue)&&p.selectNodeContents(d.actualNode);var b=p.getClientRects();for(h=b.length,m=0;m<h;m++)if(axe.commons.dom.visuallyOverlaps(b[m],e))return!0;return!1},excludeHidden:!1,options:{noScroll:!1},tags:[\"cat.color\",\"wcag2aa\",\"wcag143\"],all:[],any:[\"color-contrast\"],none:[]},{id:\"css-orientation-lock\",selector:\"html\",tags:[\"cat.structure\",\"wcag134\",\"wcag21aa\",\"experimental\"],all:[\"css-orientation-lock\"],any:[],none:[],preload:!0},{id:\"definition-list\",selector:\"dl\",matches:function(e,t,n){return!e.getAttribute(\"role\")},tags:[\"cat.structure\",\"wcag2a\",\"wcag131\"],all:[],any:[],none:[\"structured-dlitems\",\"only-dlitems\"]},{id:\"dlitem\",selector:\"dd, dt\",matches:function(e,t,n){return!e.getAttribute(\"role\")},tags:[\"cat.structure\",\"wcag2a\",\"wcag131\"],all:[],any:[\"dlitem\"],none:[]},{id:\"document-title\",selector:\"html\",matches:function(e,t,n){return e.ownerDocument.defaultView.self===e.ownerDocument.defaultView.top},tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag242\"],all:[],any:[\"doc-has-title\"],none:[]},{id:\"duplicate-id-active\",selector:\"[id]\",matches:function(e,t,n){var r=axe.commons,a=r.dom,o=r.aria,i=e.getAttribute(\"id\").trim(),u='*[id=\"'.concat(axe.utils.escapeSelector(i),'\"]');return Array.from(a.getRootNode(e).querySelectorAll(u)).some(a.isFocusable)&&!o.isAccessibleRef(e)},excludeHidden:!1,tags:[\"cat.parsing\",\"wcag2a\",\"wcag411\"],all:[],any:[\"duplicate-id-active\"],none:[]},{id:\"duplicate-id-aria\",selector:\"[id]\",matches:function(e,t,n){return axe.commons.aria.isAccessibleRef(e)},excludeHidden:!1,tags:[\"cat.parsing\",\"wcag2a\",\"wcag411\"],all:[],any:[\"duplicate-id-aria\"],none:[]},{id:\"duplicate-id\",selector:\"[id]\",matches:function(e,t,n){var r=axe.commons,a=r.dom,o=r.aria,i=e.getAttribute(\"id\").trim(),u='*[id=\"'.concat(axe.utils.escapeSelector(i),'\"]');return Array.from(a.getRootNode(e).querySelectorAll(u)).every(function(e){return!a.isFocusable(e)})&&!o.isAccessibleRef(e)},excludeHidden:!1,tags:[\"cat.parsing\",\"wcag2a\",\"wcag411\"],all:[],any:[\"duplicate-id\"],none:[]},{id:\"empty-heading\",selector:'h1, h2, h3, h4, h5, h6, [role=\"heading\"]',matches:function(e,t,n){var r;return e.hasAttribute(\"role\")&&(r=e.getAttribute(\"role\").split(/\\s+/i).filter(axe.commons.aria.isValidRole)),r&&0<r.length?r.includes(\"heading\"):\"heading\"===axe.commons.aria.implicitRole(e)},tags:[\"cat.name-role-value\",\"best-practice\"],all:[],any:[\"has-visible-text\"],none:[]},{id:\"focus-order-semantics\",selector:\"div, h1, h2, h3, h4, h5, h6, [role=heading], p, span\",matches:function(e,t,n){return axe.commons.dom.insertedIntoFocusOrder(e)},tags:[\"cat.keyboard\",\"best-practice\",\"experimental\"],all:[],any:[{options:[],id:\"has-widget-role\"},{options:[],id:\"valid-scrollable-semantics\"}],none:[]},{id:\"form-field-multiple-labels\",selector:\"input, select, textarea\",matches:function(e,t,n){if(\"input\"!==e.nodeName.toLowerCase()||!1===e.hasAttribute(\"type\"))return!0;var r=e.getAttribute(\"type\").toLowerCase();return!1===[\"hidden\",\"image\",\"button\",\"submit\",\"reset\"].includes(r)},tags:[\"cat.forms\",\"wcag2a\",\"wcag332\"],all:[],any:[],none:[\"multiple-label\"]},{id:\"frame-tested\",selector:\"frame, iframe\",tags:[\"cat.structure\",\"review-item\",\"best-practice\"],all:[{options:{isViolation:!1},id:\"frame-tested\"}],any:[],none:[]},{id:\"frame-title-unique\",selector:\"frame[title], iframe[title]\",matches:function(e,t,n){var r=e.getAttribute(\"title\");return!(!r||!axe.commons.text.sanitize(r).trim())},tags:[\"cat.text-alternatives\",\"best-practice\"],all:[],any:[],none:[\"unique-frame-title\"]},{id:\"frame-title\",selector:\"frame, iframe\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag241\",\"wcag412\",\"section508\",\"section508.22.i\"],all:[],any:[\"aria-label\",\"aria-labelledby\",\"non-empty-title\",\"role-presentation\",\"role-none\"],none:[]},{id:\"heading-order\",selector:\"h1, h2, h3, h4, h5, h6, [role=heading]\",matches:function(e,t,n){var r;return e.hasAttribute(\"role\")&&(r=e.getAttribute(\"role\").split(/\\s+/i).filter(axe.commons.aria.isValidRole)),r&&0<r.length?r.includes(\"heading\"):\"heading\"===axe.commons.aria.implicitRole(e)},tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[\"heading-order\"],none:[]},{id:\"hidden-content\",selector:\"*\",excludeHidden:!1,tags:[\"cat.structure\",\"experimental\",\"review-item\",\"best-practice\"],all:[],any:[\"hidden-content\"],none:[]},{id:\"html-has-lang\",selector:\"html\",matches:function(e,t,n){return e.ownerDocument.defaultView.self===e.ownerDocument.defaultView.top},tags:[\"cat.language\",\"wcag2a\",\"wcag311\"],all:[],any:[\"has-lang\"],none:[]},{id:\"html-lang-valid\",selector:\"html[lang], html[xml\\\\:lang]\",tags:[\"cat.language\",\"wcag2a\",\"wcag311\"],all:[],any:[],none:[\"valid-lang\"]},{id:\"html-xml-lang-mismatch\",selector:\"html[lang][xml\\\\:lang]\",matches:function(e,t,n){var r=axe.utils.getBaseLang,a=r(e.getAttribute(\"lang\")),o=r(e.getAttribute(\"xml:lang\"));return axe.utils.validLangs().includes(a)&&axe.utils.validLangs().includes(o)},tags:[\"cat.language\",\"wcag2a\",\"wcag311\"],all:[\"xml-lang-mismatch\"],any:[],none:[]},{id:\"image-alt\",selector:\"img\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"has-alt\",\"aria-label\",\"aria-labelledby\",\"non-empty-title\",\"role-presentation\",\"role-none\"],none:[\"alt-space-value\"]},{id:\"image-redundant-alt\",selector:\"img\",tags:[\"cat.text-alternatives\",\"best-practice\"],all:[],any:[],none:[\"duplicate-img-label\"]},{id:\"input-button-name\",selector:'input[type=\"button\"], input[type=\"submit\"], input[type=\"reset\"]',tags:[\"cat.name-role-value\",\"wcag2a\",\"wcag412\",\"section508\",\"section508.22.a\"],all:[],any:[\"non-empty-if-present\",\"non-empty-value\",\"aria-label\",\"aria-labelledby\",\"role-presentation\",\"role-none\",\"non-empty-title\"],none:[]},{id:\"input-image-alt\",selector:'input[type=\"image\"]',tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"non-empty-alt\",\"aria-label\",\"aria-labelledby\",\"non-empty-title\"],none:[]},{id:\"label-content-name-mismatch\",matches:function(e,t,n){var r=axe.commons,a=r.aria,o=r.text,i=a.getRole(e);return!!i&&(!!a.lookupTable.rolesOfType.widget.includes(i)&&(!!a.getRolesWithNameFromContents().includes(i)&&(!(!o.sanitize(a.arialabelText(e))&&!o.sanitize(a.arialabelledbyText(e)))&&!!o.sanitize(o.visibleVirtual(t)))))},tags:[\"wcag21a\",\"wcag253\",\"experimental\"],all:[],any:[\"label-content-name-mismatch\"],none:[]},{id:\"label-title-only\",selector:\"input, select, textarea\",matches:function(e,t,n){if(\"input\"!==e.nodeName.toLowerCase()||!1===e.hasAttribute(\"type\"))return!0;var r=e.getAttribute(\"type\").toLowerCase();return!1===[\"hidden\",\"image\",\"button\",\"submit\",\"reset\"].includes(r)},tags:[\"cat.forms\",\"best-practice\"],all:[],any:[],none:[\"title-only\"]},{id:\"label\",selector:\"input, select, textarea\",matches:function(e,t,n){if(\"input\"!==e.nodeName.toLowerCase()||!1===e.hasAttribute(\"type\"))return!0;var r=e.getAttribute(\"type\").toLowerCase();return!1===[\"hidden\",\"image\",\"button\",\"submit\",\"reset\"].includes(r)},tags:[\"cat.forms\",\"wcag2a\",\"wcag332\",\"wcag131\",\"section508\",\"section508.22.n\"],all:[],any:[\"aria-label\",\"aria-labelledby\",\"implicit-label\",\"explicit-label\",\"non-empty-title\"],none:[\"help-same-as-label\",\"hidden-explicit-label\"]},{id:\"landmark-banner-is-top-level\",selector:\"header:not([role]), [role=banner]\",matches:function(e,t,n){return e.hasAttribute(\"role\")||!axe.commons.dom.findUpVirtual(t,\"article, aside, main, nav, section\")},tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[\"landmark-is-top-level\"],none:[]},{id:\"landmark-complementary-is-top-level\",selector:\"aside:not([role]), [role=complementary]\",tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[\"landmark-is-top-level\"],none:[]},{id:\"landmark-contentinfo-is-top-level\",selector:\"footer:not([role]), [role=contentinfo]\",matches:function(e,t,n){return e.hasAttribute(\"role\")||!axe.commons.dom.findUpVirtual(t,\"article, aside, main, nav, section\")},tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[\"landmark-is-top-level\"],none:[]},{id:\"landmark-main-is-top-level\",selector:\"main:not([role]), [role=main]\",tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[\"landmark-is-top-level\"],none:[]},{id:\"landmark-no-duplicate-banner\",selector:\"html\",tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[{options:{selector:\"header:not([role]), [role=banner]\",nativeScopeFilter:\"article, aside, main, nav, section\"},id:\"page-no-duplicate-banner\"}],none:[]},{id:\"landmark-no-duplicate-contentinfo\",selector:\"html\",tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[{options:{selector:\"footer:not([role]), [role=contentinfo]\",nativeScopeFilter:\"article, aside, main, nav, section\"},id:\"page-no-duplicate-contentinfo\"}],none:[]},{id:\"landmark-one-main\",selector:\"html\",tags:[\"cat.semantics\",\"best-practice\"],all:[{options:{selector:\"main:not([role]), [role='main']\"},id:\"page-has-main\"},{options:{selector:\"main:not([role]), [role='main']\"},id:\"page-no-duplicate-main\"}],any:[],none:[]},{id:\"landmark-unique\",selector:\"[role=banner], [role=complementary], [role=contentinfo], [role=main], [role=navigation], [role=region], [role=search], [role=form], form, footer, header, aside, main, nav, section\",tags:[\"cat.semantics\",\"best-practice\"],matches:function(e,t,n){var o=[\"article\",\"aside\",\"main\",\"nav\",\"section\"].join(\",\");return function(e){var t=e.actualNode,n=axe.commons.aria.getRolesByType(\"landmark\"),r=axe.commons.aria.getRole(t);if(!r)return!1;var a=t.nodeName.toUpperCase();return\"HEADER\"===a||\"FOOTER\"===a?function(e){return!axe.commons.dom.findUpVirtual(e,o)}(e):\"SECTION\"!==a&&\"FORM\"!==a?0<=n.indexOf(r)||\"region\"===r:!!axe.commons.text.accessibleTextVirtual(e)}(t)&&axe.commons.dom.isVisible(e,!0)},all:[],any:[\"landmark-is-unique\"],none:[]},{id:\"layout-table\",selector:\"table\",matches:function(e,t,n){var r=(e.getAttribute(\"role\")||\"\").toLowerCase();return!((\"presentation\"===r||\"none\"===r)&&!axe.commons.dom.isFocusable(e)||axe.commons.table.isDataTable(e))},tags:[\"cat.semantics\",\"wcag2a\",\"wcag131\"],all:[],any:[],none:[\"has-th\",\"has-caption\",\"has-summary\"]},{id:\"link-in-text-block\",selector:\"a[href], [role=link]\",matches:function(e,t,n){var r=axe.commons.text.sanitize(e.textContent),a=e.getAttribute(\"role\");return(!a||\"link\"===a)&&(!!r&&(!!axe.commons.dom.isVisible(e,!1)&&axe.commons.dom.isInTextBlock(e)))},excludeHidden:!1,tags:[\"cat.color\",\"experimental\",\"wcag2a\",\"wcag141\"],all:[\"link-in-text-block\"],any:[],none:[]},{id:\"link-name\",selector:\"a[href], [role=link][href]\",matches:function(e,t,n){return\"button\"!==e.getAttribute(\"role\")},tags:[\"cat.name-role-value\",\"wcag2a\",\"wcag412\",\"wcag244\",\"section508\",\"section508.22.a\"],all:[],any:[\"has-visible-text\",\"aria-label\",\"aria-labelledby\",\"role-presentation\",\"role-none\"],none:[\"focusable-no-name\"]},{id:\"list\",selector:\"ul, ol\",matches:function(e,t,n){return!e.getAttribute(\"role\")},tags:[\"cat.structure\",\"wcag2a\",\"wcag131\"],all:[],any:[],none:[\"only-listitems\"]},{id:\"listitem\",selector:\"li\",matches:function(e,t,n){return!e.getAttribute(\"role\")},tags:[\"cat.structure\",\"wcag2a\",\"wcag131\"],all:[],any:[\"listitem\"],none:[]},{id:\"marquee\",selector:\"marquee\",excludeHidden:!1,tags:[\"cat.parsing\",\"wcag2a\",\"wcag222\"],all:[],any:[],none:[\"is-on-screen\"]},{id:\"meta-refresh\",selector:'meta[http-equiv=\"refresh\"]',excludeHidden:!1,tags:[\"cat.time\",\"wcag2a\",\"wcag2aaa\",\"wcag221\",\"wcag224\",\"wcag325\"],all:[],any:[\"meta-refresh\"],none:[]},{id:\"meta-viewport-large\",selector:'meta[name=\"viewport\"]',excludeHidden:!1,tags:[\"cat.sensory-and-visual-cues\",\"best-practice\"],all:[],any:[{options:{scaleMinimum:5,lowerBound:2},id:\"meta-viewport-large\"}],none:[]},{id:\"meta-viewport\",selector:'meta[name=\"viewport\"]',excludeHidden:!1,tags:[\"cat.sensory-and-visual-cues\",\"wcag2aa\",\"wcag144\"],all:[],any:[{options:{scaleMinimum:2},id:\"meta-viewport\"}],none:[]},{id:\"object-alt\",selector:\"object\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"has-visible-text\",\"aria-label\",\"aria-labelledby\",\"non-empty-title\",\"role-presentation\",\"role-none\"],none:[]},{id:\"p-as-heading\",selector:\"p\",matches:function(e,t,n){var r=Array.from(e.parentNode.childNodes),a=e.textContent.trim();return!(0===a.length||2<=(a.match(/[.!?:;](?![.!?:;])/g)||[]).length)&&0!==r.slice(r.indexOf(e)+1).filter(function(e){return\"P\"===e.nodeName.toUpperCase()&&\"\"!==e.textContent.trim()}).length},tags:[\"cat.semantics\",\"wcag2a\",\"wcag131\",\"experimental\"],all:[{options:{margins:[{weight:150,italic:!0},{weight:150,size:1.15},{italic:!0,size:1.15},{size:1.4}]},id:\"p-as-heading\"}],any:[],none:[]},{id:\"page-has-heading-one\",selector:\"html\",tags:[\"cat.semantics\",\"best-practice\"],all:[{options:{selector:'h1:not([role]), [role=\"heading\"][aria-level=\"1\"]'},id:\"page-has-heading-one\"}],any:[],none:[]},{id:\"radiogroup\",selector:\"input[type=radio][name]\",tags:[\"cat.forms\",\"best-practice\"],all:[],any:[\"group-labelledby\",\"fieldset\"],none:[]},{id:\"region\",selector:\"html\",pageLevel:!0,tags:[\"cat.keyboard\",\"best-practice\"],all:[],any:[\"region\"],none:[]},{id:\"role-img-alt\",selector:\"[role='img']:not(svg):not(img):not(area):not(input):not(object)\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"aria-label\",\"aria-labelledby\",\"non-empty-title\"],none:[]},{id:\"scope-attr-valid\",selector:\"td[scope], th[scope]\",tags:[\"cat.tables\",\"best-practice\"],all:[\"html5-scope\",\"scope-value\"],any:[],none:[]},{id:\"scrollable-region-focusable\",matches:function(e,t,n){var r=axe.utils.querySelectorAll,a=axe.commons.dom.hasContentVirtual;return!1!=!!axe.utils.getScroll(e,13)&&!!r(t,\"*\").some(function(e){return a(e,!0,!0)})},tags:[\"wcag2a\",\"wcag211\"],all:[],any:[\"focusable-content\",\"focusable-element\"],none:[]},{id:\"server-side-image-map\",selector:\"img[ismap]\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag211\",\"section508\",\"section508.22.f\"],all:[],any:[],none:[\"exists\"]},{id:\"skip-link\",selector:'a[href^=\"#\"], a[href^=\"/#\"]',matches:function(e,t,n){return axe.commons.dom.isSkipLink(e)},tags:[\"cat.keyboard\",\"best-practice\"],all:[],any:[\"skip-link\"],none:[]},{id:\"tabindex\",selector:\"[tabindex]\",tags:[\"cat.keyboard\",\"best-practice\"],all:[],any:[\"tabindex\"],none:[]},{id:\"table-duplicate-name\",selector:\"table\",tags:[\"cat.tables\",\"best-practice\"],all:[],any:[],none:[\"same-caption-summary\"]},{id:\"table-fake-caption\",selector:\"table\",matches:function(e,t,n){return axe.commons.table.isDataTable(e)},tags:[\"cat.tables\",\"experimental\",\"wcag2a\",\"wcag131\",\"section508\",\"section508.22.g\"],all:[\"caption-faked\"],any:[],none:[]},{id:\"td-has-header\",selector:\"table\",matches:function(e,t,n){if(axe.commons.table.isDataTable(e)){var r=axe.commons.table.toArray(e);return 3<=r.length&&3<=r[0].length&&3<=r[1].length&&3<=r[2].length}return!1},tags:[\"cat.tables\",\"experimental\",\"wcag2a\",\"wcag131\",\"section508\",\"section508.22.g\"],all:[\"td-has-header\"],any:[],none:[]},{id:\"td-headers-attr\",selector:\"table\",tags:[\"cat.tables\",\"wcag2a\",\"wcag131\",\"section508\",\"section508.22.g\"],all:[\"td-headers-attr\"],any:[],none:[]},{id:\"th-has-data-cells\",selector:\"table\",matches:function(e,t,n){return axe.commons.table.isDataTable(e)},tags:[\"cat.tables\",\"wcag2a\",\"wcag131\",\"section508\",\"section508.22.g\"],all:[\"th-has-data-cells\"],any:[],none:[]},{id:\"valid-lang\",selector:\"[lang], [xml\\\\:lang]\",matches:function(e,t,n){return\"html\"!==e.nodeName.toLowerCase()},tags:[\"cat.language\",\"wcag2aa\",\"wcag312\"],all:[],any:[],none:[\"valid-lang\"]},{id:\"video-caption\",selector:\"video\",excludeHidden:!1,tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag122\",\"section508\",\"section508.22.a\"],all:[],any:[],none:[\"caption\"]},{id:\"video-description\",selector:\"video\",excludeHidden:!1,tags:[\"cat.text-alternatives\",\"wcag2aa\",\"wcag125\",\"section508\",\"section508.22.b\"],all:[],any:[],none:[\"description\"]}],checks:[{id:\"abstractrole\",evaluate:function(e,t,n,r){return\"abstract\"===axe.commons.aria.getRoleType(e.getAttribute(\"role\"))}},{id:\"aria-allowed-attr\",evaluate:function(e,t,n,r){t=t||{};var a,o,i,u=[],s=e.getAttribute(\"role\"),l=axe.utils.getNodeAttributes(e);if(s=s||axe.commons.aria.implicitRole(e),i=axe.commons.aria.allowedAttr(s),Array.isArray(t[s])&&(i=axe.utils.uniqueArray(t[s].concat(i))),s&&i)for(var c=0,d=l.length;c<d;c++)o=(a=l[c]).name,axe.commons.aria.validateAttr(o)&&!i.includes(o)&&u.push(o+'=\"'+a.nodeValue+'\"');return!u.length||(this.data(u),!1)}},{id:\"aria-allowed-role\",evaluate:function(e,t,n,r){var a=axe.commons.dom,o=t||{},i=o.allowImplicit,u=void 0===i||i,s=o.ignoredTags,l=void 0===s?[]:s,c=e.nodeName.toUpperCase();if(l.map(function(e){return e.toUpperCase()}).includes(c))return!0;var d=axe.commons.aria.getElementUnallowedRoles(e,u);if(d.length){if(this.data(d),!a.isVisible(e,!0))return;return!1}return!0},options:{allowImplicit:!0,ignoredTags:[]}},{id:\"aria-hidden-body\",evaluate:function(e,t,n,r){return\"true\"!==e.getAttribute(\"aria-hidden\")}},{id:\"aria-errormessage\",evaluate:function(n,e,t,r){var a=axe.commons,o=a.aria,i=a.dom;e=Array.isArray(e)?e:[];var u=n.getAttribute(\"aria-errormessage\"),s=n.hasAttribute(\"aria-errormessage\"),l=i.getRootNode(n);return!(-1===e.indexOf(u)&&s&&!function(e){if(\"\"===e.trim())return o.lookupTable.attributes[\"aria-errormessage\"].allowEmpty;var t=e&&l.getElementById(e);return t?\"alert\"===t.getAttribute(\"role\")||\"assertive\"===t.getAttribute(\"aria-live\")||-1<axe.utils.tokenList(n.getAttribute(\"aria-describedby\")||\"\").indexOf(e):void 0}(u))||(this.data(axe.utils.tokenList(u)),!1)}},{id:\"has-widget-role\",evaluate:function(e,t,n,r){var a=e.getAttribute(\"role\");if(null===a)return!1;var o=axe.commons.aria.getRoleType(a);return\"widget\"===o||\"composite\"===o},options:[]},{id:\"implicit-role-fallback\",evaluate:function(e,t,n,r){var a=e.getAttribute(\"role\");if(null===a||!axe.commons.aria.isValidRole(a))return!0;var o=axe.commons.aria.getRoleType(a);return axe.commons.aria.implicitRole(e)===o}},{id:\"invalidrole\",evaluate:function(e,t,n,r){return!axe.commons.aria.isValidRole(e.getAttribute(\"role\"),{allowAbstract:!0})}},{id:\"no-implicit-explicit-label\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.aria,i=a.text,u=o.getRole(e,{noImplicit:!0});this.data(u);var s=i.sanitize(i.labelText(n)).toLowerCase(),l=i.sanitize(i.accessibleText(e)).toLowerCase();return!(!l&&!s)&&(!((l||!s)&&l.includes(s))&&void 0)}},{id:\"aria-required-attr\",evaluate:function(e,t,n,r){t=t||{};var a=[],o=axe.commons.forms,i=o.isNativeTextbox,u=o.isNativeSelect,s=o.isAriaTextbox,l=o.isAriaListbox,c=o.isAriaCombobox,d=o.isAriaRange,m={\"aria-valuenow\":function(){return!(i(e)||u(e)||s(e)||l(e)||c(e)||d(e)&&e.hasAttribute(\"aria-valuenow\"))}};if(e.hasAttributes()){var p=e.getAttribute(\"role\"),f=axe.commons.aria.requiredAttr(p);if(Array.isArray(t[p])&&(f=axe.utils.uniqueArray(t[p],f)),p&&f)for(var h=0,b=f.length;h<b;h++){var g=f[h];e.getAttribute(g)||m[g]&&!m[g]()||a.push(g)}}return!a.length||(this.data(a),!1)}},{id:\"aria-required-children\",evaluate:function(e,t,m,n){var r=axe.commons.aria.requiredOwned,i=axe.commons.aria.implicitNodes,u=axe.utils.matchesSelector,p=axe.commons.dom.idrefs,a=t&&Array.isArray(t.reviewEmpty)?t.reviewEmpty:[];function f(e,t,n,r){if(null===e)return!1;var a=i(n),o=['[role=\"'+n+'\"]'];return a&&(o=o.concat(a)),o=o.join(\",\"),r&&u(e,o)||!!axe.utils.querySelectorAll(t,o)[0]}function h(e,t){var n,r;for(n=0,r=e.length;n<r;n++)if(null!==e[n]){var a=axe.utils.getNodeFromTree(e[n]);if(f(e[n],a,t,!0))return!0}return!1}var o=e.getAttribute(\"role\"),s=r(o);if(!s)return!0;var l=!1,c=s.one;if(!c){l=!0;c=s.all}var d=function(e,t,n,r){var a,o=t.length,i=[],u=p(e,\"aria-owns\");for(a=0;a<o;a++){var s=t[a];if(f(e,m,s)||h(u,s)){if(!n)return null}else n&&i.push(s)}if(\"combobox\"===r){var l=i.indexOf(\"textbox\");0<=l&&\"INPUT\"===e.nodeName.toUpperCase()&&[\"text\",\"search\",\"email\",\"url\",\"tel\"].includes(e.type)&&i.splice(l,1);var c=i.indexOf(\"listbox\"),d=e.getAttribute(\"aria-expanded\");0<=c&&(!d||\"false\"===d)&&i.splice(c,1)}return i.length?i:!n&&t.length?t:null}(e,c,l,o);return!d||(this.data(d),!(!a.includes(o)||0!==e.children.length||0!==p(e,\"aria-owns\").length)&&void 0)},options:{reviewEmpty:[\"doc-bibliography\",\"doc-endnotes\",\"grid\",\"list\",\"listbox\",\"table\",\"tablist\",\"tree\",\"treegrid\",\"rowgroup\"]}},{id:\"aria-required-parent\",evaluate:function(e,t,n,r){function u(e){return(axe.commons.aria.implicitNodes(e)||[]).concat('[role=\"'+e+'\"]').join(\",\")}function a(e,t,n){var r,a,o=e.actualNode.getAttribute(\"role\"),i=[];if(!(t=t||axe.commons.aria.requiredContext(o)))return null;for(r=0,a=t.length;r<a;r++){if(n&&axe.utils.matchesSelector(e.actualNode,u(t[r])))return null;if(axe.commons.dom.findUpVirtual(e,u(t[r])))return null;i.push(t[r])}return i}var o=a(n);if(!o)return!0;var i=function(e){for(var t=[],n=null;e;){if(e.getAttribute(\"id\")){var r=axe.utils.escapeSelector(e.getAttribute(\"id\"));(n=axe.commons.dom.getRootNode(e).querySelector(\"[aria-owns~=\".concat(r,\"]\")))&&t.push(n)}e=e.parentElement}return t.length?t:null}(e);if(i)for(var s=0,l=i.length;s<l;s++)if(!(o=a(axe.utils.getNodeFromTree(i[s]),o,!0)))return!0;return this.data(o),!1}},{id:\"aria-unsupported-attr\",evaluate:function(o,e,t,n){var i=o.nodeName.toUpperCase(),u=axe.commons.aria.lookupTable,s=axe.commons.aria.getRole(o),r=Array.from(axe.utils.getNodeAttributes(o)).filter(function(e){var t=e.name,n=u.attributes[t];if(!axe.commons.aria.validateAttr(t))return!1;var r=n.unsupported;if(\"object\"!==S(r))return!!r;var a=axe.commons.matches(o,r.exceptions);return Object.keys(u.evaluateRoleForElement).includes(i)?!u.evaluateRoleForElement[i]({node:o,role:s,out:a}):!a}).map(function(e){return e.name.toString()});return!!r.length&&(this.data(r),!0)}},{id:\"unsupportedrole\",evaluate:function(e,t,n,r){return axe.commons.aria.isUnsupportedRole(axe.commons.aria.getRole(e))}},{id:\"aria-valid-attr-value\",evaluate:function(e,t,n,r){t=Array.isArray(t)?t:[];for(var a=[],o=/^aria-/,i=axe.utils.getNodeAttributes(e),u=[\"aria-errormessage\"],s={\"aria-controls\":function(){return\"false\"!==e.getAttribute(\"aria-expanded\")&&\"false\"!==e.getAttribute(\"aria-selected\")},\"aria-owns\":function(){return\"false\"!==e.getAttribute(\"aria-expanded\")}},l=0,c=i.length;l<c;l++){var d=i[l],m=d.name;u.includes(m)||-1!==t.indexOf(m)||!o.test(m)||s[m]&&!s[m]()||axe.commons.aria.validateAttrValue(e,m)||a.push(\"\".concat(m,'=\"').concat(d.nodeValue,'\"'))}return!a.length||(this.data(a),!1)},options:[]},{id:\"aria-valid-attr\",evaluate:function(e,t,n,r){t=Array.isArray(t)?t:[];for(var a,o=[],i=/^aria-/,u=axe.utils.getNodeAttributes(e),s=0,l=u.length;s<l;s++)a=u[s].name,-1===t.indexOf(a)&&i.test(a)&&!axe.commons.aria.validateAttr(a)&&o.push(a);return!o.length||(this.data(o),!1)},options:[]},{id:\"valid-scrollable-semantics\",evaluate:function(e,t,n,r){var a,o,i,u={ARTICLE:!0,ASIDE:!0,NAV:!0,SECTION:!0},s={application:!0,banner:!1,complementary:!0,contentinfo:!0,form:!0,main:!0,navigation:!0,region:!0,search:!1};return(o=(i=e).getAttribute(\"role\"))&&s[o.toLowerCase()]||!1||(a=i.nodeName.toUpperCase(),u[a]||!1)},options:[]},{id:\"color-contrast\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.dom,i=a.color,u=a.text;if(!o.isVisible(e,!1))return!0;var s,l=!!(t||{}).noScroll,c=[],d=i.getBackgroundColor(e,c,l),m=i.getForegroundColor(e,l),p=window.getComputedStyle(e),f=parseFloat(p.getPropertyValue(\"font-size\")),h=p.getPropertyValue(\"font-weight\"),b=-1!==[\"bold\",\"bolder\",\"600\",\"700\",\"800\",\"900\"].indexOf(h),g=i.hasValidContrastRatio(d,m,f,b),y=Math.floor(100*g.contrastRatio)/100;null===d&&(s=i.incompleteData.get(\"bgColor\"));var v=1==y,D=1===u.visibleVirtual(n,!1,!0).length;v?s=i.incompleteData.set(\"bgColor\",\"equalRatio\"):D&&(s=\"shortTextContent\");var w={fgColor:m?m.toHexString():void 0,bgColor:d?d.toHexString():void 0,contrastRatio:g?y:void 0,fontSize:(72*f/96).toFixed(1)+\"pt\",fontWeight:b?\"bold\":\"normal\",missingData:s,expectedContrastRatio:g.expectedContrastRatio+\":1\"};return this.data(w),null===m||null===d||v||D&&!g.isValid?(s=null,i.incompleteData.clear(),void this.relatedNodes(c)):(g.isValid||this.relatedNodes(c),g.isValid)}},{id:\"link-in-text-block\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.color,i=a.dom;function u(e,t){var n=e.getRelativeLuminance(),r=t.getRelativeLuminance();return(Math.max(n,r)+.05)/(Math.min(n,r)+.05)}var s=[\"block\",\"list-item\",\"table\",\"flex\",\"grid\",\"inline-block\"];function l(e){var t=window.getComputedStyle(e).getPropertyValue(\"display\");return-1!==s.indexOf(t)||\"table-\"===t.substr(0,6)}if(l(e))return!1;for(var c,d,m=i.getComposedParent(e);1===m.nodeType&&!l(m);)m=i.getComposedParent(m);if(this.relatedNodes([m]),o.elementIsDistinct(e,m))return!0;if(c=o.getForegroundColor(e),d=o.getForegroundColor(m),c&&d){var p,f=u(c,d);return 1===f||(3<=f?(axe.commons.color.incompleteData.set(\"fgColor\",\"bgContrast\"),this.data({missingData:axe.commons.color.incompleteData.get(\"fgColor\")}),void axe.commons.color.incompleteData.clear()):(c=o.getBackgroundColor(e),d=o.getBackgroundColor(m),(!c||!d||3<=u(c,d))&&(p=c&&d?\"bgContrast\":axe.commons.color.incompleteData.get(\"bgColor\"),axe.commons.color.incompleteData.set(\"fgColor\",p),this.data({missingData:axe.commons.color.incompleteData.get(\"fgColor\")}),void axe.commons.color.incompleteData.clear())))}}},{id:\"autocomplete-appropriate\",evaluate:function(e,t,n,r){if(\"input\"!==n.props.nodeName)return!0;var a=[\"text\",\"search\",\"number\"],o=[\"text\",\"search\",\"url\"],i={bday:[\"text\",\"search\",\"date\"],email:[\"text\",\"search\",\"email\"],\"cc-exp\":[\"text\",\"search\",\"month\"],\"street-address\":[\"text\"],tel:[\"text\",\"search\",\"tel\"],\"cc-exp-month\":a,\"cc-exp-year\":a,\"transaction-amount\":a,\"bday-day\":a,\"bday-month\":a,\"bday-year\":a,\"new-password\":[\"text\",\"search\",\"password\"],\"current-password\":[\"text\",\"search\",\"password\"],url:o,photo:o,impp:o};\"object\"===S(t)&&Object.keys(t).forEach(function(e){i[e]||(i[e]=[]),i[e]=i[e].concat(t[e])});var u=n.attr(\"autocomplete\").split(/\\s+/g).map(function(e){return e.toLowerCase()}),s=u[u.length-1];if(axe.commons.text.autocomplete.stateTerms.includes(s))return!0;var l=i[s],c=n.hasAttr(\"type\")?axe.commons.text.sanitize(n.attr(\"type\")).toLowerCase():\"text\";return c=axe.utils.validInputTypes().includes(c)?c:\"text\",void 0===l?\"text\"===c:l.includes(c)}},{id:\"autocomplete-valid\",evaluate:function(e,t,n,r){var a=n.attr(\"autocomplete\")||\"\";return axe.commons.text.isValidAutocomplete(a,t)}},{id:\"fieldset\",evaluate:function(e,t,n,r){var o,i=this;function u(e,t){return axe.utils.toArray(e.querySelectorAll('select,textarea,button,input:not([name=\"'+t+'\"]):not([type=\"hidden\"])'))}var a={name:e.getAttribute(\"name\"),type:e.getAttribute(\"type\")},s=function(e){var t=axe.utils.escapeSelector(e.actualNode.name),n=axe.commons.dom.getRootNode(e.actualNode).querySelectorAll('input[type=\"'+axe.utils.escapeSelector(e.actualNode.type)+'\"][name=\"'+t+'\"]');if(n.length<2)return!0;var r=axe.commons.dom.findUpVirtual(e,\"fieldset\"),a=axe.commons.dom.findUpVirtual(e,'[role=\"group\"]'+(\"radio\"===e.actualNode.type?',[role=\"radiogroup\"]':\"\"));return a||r?r?function(e,t){var n=e.firstElementChild;if(!n||\"LEGEND\"!==n.nodeName.toUpperCase())return i.relatedNodes([e]),!(o=\"no-legend\");if(!axe.commons.text.accessibleText(n))return i.relatedNodes([n]),!(o=\"empty-legend\");var r=u(e,t);return!r.length||(i.relatedNodes(r),!(o=\"mixed-inputs\"))}(r,t):function(e,t){var n=axe.commons.dom.idrefs(e,\"aria-labelledby\").some(function(e){return e&&axe.commons.text.accessibleText(e)}),r=e.getAttribute(\"aria-label\");if(!(n||r&&axe.commons.text.sanitize(r)))return i.relatedNodes(e),!(o=\"no-group-label\");var a=u(e,t);return!a.length||(i.relatedNodes(a),!(o=\"group-mixed-inputs\"))}(a,t):(o=\"no-group\",i.relatedNodes(function(e,t){return axe.utils.toArray(e).filter(function(e){return e!==t})}(n,e.actualNode)),!1)}(n);return s||(a.failureCode=o),this.data(a),s},after:function(e,t){var r={};return e.filter(function(e){if(e.result)return!0;var t=e.data;if(t){if(r[t.type]=r[t.type]||{},!r[t.type][t.name])return r[t.type][t.name]=[t],!0;var n=r[t.type][t.name].some(function(e){return e.failureCode===t.failureCode});return n||r[t.type][t.name].push(t),!n}return!1})}},{id:\"group-labelledby\",evaluate:function(n,e,t,r){var a=axe.commons,o=a.dom,i=a.text,u=axe.utils.escapeSelector(n.type),s=axe.utils.escapeSelector(n.name),l=o.getRootNode(n),c={name:n.name,type:n.type},d=Array.from(l.querySelectorAll('input[type=\"'.concat(u,'\"][name=\"').concat(s,'\"]')));if(d.length<=1)return this.data(c),!0;var m=o.idrefs(n,\"aria-labelledby\").filter(function(e){return!!e}),p=m.slice();d.forEach(function(e){if(e!==n){var t=o.idrefs(e,\"aria-labelledby\").filter(function(e){return e});m=m.filter(function(e){return t.includes(e)}),p=p.filter(function(e){return!t.includes(e)})}});var f={inLabelledByContext:!0};return p=p.filter(function(e){return i.accessibleText(e,f)}),m=m.filter(function(e){return i.accessibleText(e,f)}),0<p.length&&0<m.length?(this.data(c),!0):(0<p.length&&0===m.length?c.failureCode=\"no-shared-label\":0===p.length&&0<m.length&&(c.failureCode=\"no-unique-label\"),this.data(c),!1)},after:function(e,t){var n={};return e.filter(function(e){var t=e.data;return!(!t||(n[t.type]=n[t.type]||{},n[t.type][t.name]))&&(n[t.type][t.name]=!0)})}},{id:\"accesskeys\",evaluate:function(e,t,n,r){return axe.commons.dom.isVisible(e,!1)&&(this.data(e.getAttribute(\"accesskey\")),this.relatedNodes([e])),!0},after:function(e,t){var n={};return e.filter(function(e){if(!e.data)return!1;var t=e.data.toUpperCase();return n[t]?(n[t].relatedNodes.push(e.relatedNodes[0]),!1):((n[t]=e).relatedNodes=[],!0)}).map(function(e){return e.result=!!e.relatedNodes.length,e})}},{id:\"focusable-content\",evaluate:function(e,t,n,r){var a=n.tabbableElements;return!!a&&0<a.filter(function(e){return e!==n}).length}},{id:\"focusable-disabled\",evaluate:function(e,t,n,r){var a=[\"BUTTON\",\"FIELDSET\",\"INPUT\",\"SELECT\",\"TEXTAREA\"],o=n.tabbableElements;if(!o||!o.length)return!0;var i=o.reduce(function(e,t){var n=t.actualNode,r=n.nodeName.toUpperCase();return a.includes(r)&&e.push(n),e},[]);return this.relatedNodes(i),0===i.length}},{id:\"focusable-element\",evaluate:function(e,t,n,r){var a=n.isFocusable,o=parseInt(n.actualNode.getAttribute(\"tabindex\"),10);return(o=isNaN(o)?null:o)?a&&0<=o:a}},{id:\"focusable-no-name\",evaluate:function(e,t,n,r){var a=e.getAttribute(\"tabindex\");return!!(axe.commons.dom.isFocusable(e)&&-1<a)&&!axe.commons.text.accessibleTextVirtual(n)}},{id:\"focusable-not-tabbable\",evaluate:function(e,t,n,r){var a=[\"BUTTON\",\"FIELDSET\",\"INPUT\",\"SELECT\",\"TEXTAREA\"],o=n.tabbableElements;if(!o||!o.length)return!0;var i=o.reduce(function(e,t){var n=t.actualNode,r=n.nodeName.toUpperCase();return a.includes(r)||e.push(n),e},[]);return this.relatedNodes(i),0===i.length}},{id:\"landmark-is-top-level\",evaluate:function(e,t,n,r){var a=axe.commons.aria.getRolesByType(\"landmark\"),o=axe.commons.dom.getComposedParent(e);for(this.data({role:e.getAttribute(\"role\")||axe.commons.aria.implicitRole(e)});o;){var i=o.getAttribute(\"role\");if(i||\"FORM\"===o.nodeName.toUpperCase()||(i=axe.commons.aria.implicitRole(o)),i&&a.includes(i))return!1;o=axe.commons.dom.getComposedParent(o)}return!0}},{id:\"page-has-heading-one\",evaluate:function(e,t,n,r){if(!t||!t.selector||\"string\"!=typeof t.selector)throw new TypeError(\"visible-in-page requires options.selector to be a string\");var a=axe.utils.querySelectorAll(n,t.selector);return this.relatedNodes(a.map(function(e){return e.actualNode})),0<a.length},after:function(e,t){return e.some(function(e){return!0===e.result})&&e.forEach(function(e){e.result=!0}),e},options:{selector:'h1:not([role]), [role=\"heading\"][aria-level=\"1\"]'}},{id:\"page-has-main\",evaluate:function(e,t,n,r){if(!t||!t.selector||\"string\"!=typeof t.selector)throw new TypeError(\"visible-in-page requires options.selector to be a string\");var a=axe.utils.querySelectorAll(n,t.selector);return this.relatedNodes(a.map(function(e){return e.actualNode})),0<a.length},after:function(e,t){return e.some(function(e){return!0===e.result})&&e.forEach(function(e){e.result=!0}),e},options:{selector:\"main:not([role]), [role='main']\"}},{id:\"page-no-duplicate-banner\",evaluate:function(e,t,n,r){if(!t||!t.selector||\"string\"!=typeof t.selector)throw new TypeError(\"visible-in-page requires options.selector to be a string\");var a=axe.utils.querySelectorAll(n,t.selector);return\"string\"==typeof t.nativeScopeFilter&&(a=a.filter(function(e){return e.actualNode.hasAttribute(\"role\")||!axe.commons.dom.findUpVirtual(e,t.nativeScopeFilter)})),this.relatedNodes(a.map(function(e){return e.actualNode})),a.length<=1},options:{selector:\"header:not([role]), [role=banner]\",nativeScopeFilter:\"article, aside, main, nav, section\"}},{id:\"page-no-duplicate-contentinfo\",evaluate:function(e,t,n,r){if(!t||!t.selector||\"string\"!=typeof t.selector)throw new TypeError(\"visible-in-page requires options.selector to be a string\");var a=axe.utils.querySelectorAll(n,t.selector);return\"string\"==typeof t.nativeScopeFilter&&(a=a.filter(function(e){return e.actualNode.hasAttribute(\"role\")||!axe.commons.dom.findUpVirtual(e,t.nativeScopeFilter)})),this.relatedNodes(a.map(function(e){return e.actualNode})),a.length<=1},options:{selector:\"footer:not([role]), [role=contentinfo]\",nativeScopeFilter:\"article, aside, main, nav, section\"}},{id:\"page-no-duplicate-main\",evaluate:function(e,t,n,r){if(!t||!t.selector||\"string\"!=typeof t.selector)throw new TypeError(\"visible-in-page requires options.selector to be a string\");var a=axe.utils.querySelectorAll(n,t.selector);return\"string\"==typeof t.nativeScopeFilter&&(a=a.filter(function(e){return e.actualNode.hasAttribute(\"role\")||!axe.commons.dom.findUpVirtual(e,t.nativeScopeFilter)})),this.relatedNodes(a.map(function(e){return e.actualNode})),a.length<=1},options:{selector:\"main:not([role]), [role='main']\"}},{id:\"tabindex\",evaluate:function(e,t,n,r){return e.tabIndex<=0}},{id:\"alt-space-value\",evaluate:function(e,t,n,r){var a=/^\\s+$/.test(e.getAttribute(\"alt\"));return e.hasAttribute(\"alt\")&&a}},{id:\"duplicate-img-label\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.aria,i=a.text,u=a.dom;if([\"none\",\"presentation\"].includes(o.getRole(e)))return!1;var s=u.findUpVirtual(n,'button, [role=\"button\"], a[href], p, li, td, th'),l=axe.utils.getNodeFromTree(s),c=i.visibleVirtual(l,!0).toLowerCase();return\"\"!==c&&c===i.accessibleTextVirtual(n).toLowerCase()}},{id:\"explicit-label\",evaluate:function(e,t,n,r){if(e.getAttribute(\"id\")){var a=axe.commons.dom.getRootNode(e),o=axe.utils.escapeSelector(e.getAttribute(\"id\")),i=a.querySelector('label[for=\"'.concat(o,'\"]'));if(i)return!axe.commons.dom.isVisible(i)||!!axe.commons.text.accessibleText(i)}return!1}},{id:\"help-same-as-label\",evaluate:function(e,t,n,r){var a=axe.commons.text.labelVirtual(n),o=e.getAttribute(\"title\");if(!a)return!1;o||(o=\"\",e.getAttribute(\"aria-describedby\")&&(o=axe.commons.dom.idrefs(e,\"aria-describedby\").map(function(e){return e?axe.commons.text.accessibleText(e):\"\"}).join(\"\")));return axe.commons.text.sanitize(o)===axe.commons.text.sanitize(a)},enabled:!1},{id:\"hidden-explicit-label\",evaluate:function(e,t,n,r){if(e.getAttribute(\"id\")){var a=axe.commons.dom.getRootNode(e),o=axe.utils.escapeSelector(e.getAttribute(\"id\")),i=a.querySelector('label[for=\"'.concat(o,'\"]'));if(i&&!axe.commons.dom.isVisible(i,!0))return\"\"===axe.commons.text.accessibleTextVirtual(n).trim()}return!1}},{id:\"implicit-label\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.dom,i=a.text,u=o.findUpVirtual(n,\"label\");return!!u&&!!i.accessibleText(u,{inControlContext:!0})}},{id:\"label-content-name-mismatch\",evaluate:function(e,t,n,r){var a=axe.commons.text,o=a.accessibleText(e).toLowerCase();if(!(a.isHumanInterpretable(o)<1)){var i=a.sanitize(a.visibleVirtual(n)).toLowerCase();return a.isHumanInterpretable(i)<1?!!u(i,o)||void 0:u(i,o)}function u(e,t){var n=s(t),r=s(e);return!(!n||!r)&&n.includes(r)}function s(e){var t=a.removeUnicode(e,{emoji:!0,nonBmp:!0,punctuations:!0});return a.sanitize(t)}}},{id:\"multiple-label\",evaluate:function(e,t,n,r){var a=axe.utils.escapeSelector(e.getAttribute(\"id\")),o=e.parentNode,i=axe.commons.dom.getRootNode(e);i=i.documentElement||i;var u=Array.from(i.querySelectorAll('label[for=\"'.concat(a,'\"]')));for(u.length&&(u=u.filter(function(e){return axe.commons.dom.isVisible(e)}));o;)\"LABEL\"===o.nodeName.toUpperCase()&&-1===u.indexOf(o)&&u.push(o),o=o.parentNode;if(this.relatedNodes(u),1<u.length){var s=u.filter(function(e){return axe.commons.dom.isVisible(e,!0)});return 1<s.length||!axe.commons.dom.idrefs(e,\"aria-labelledby\").includes(s[0])}return!1}},{id:\"title-only\",evaluate:function(e,t,n,r){return!(axe.commons.text.labelVirtual(n)||!e.getAttribute(\"title\")&&!e.getAttribute(\"aria-describedby\"))}},{id:\"landmark-is-unique\",evaluate:function(e,t,n,r){var a=axe.commons.aria.getRole(e),o=axe.commons.text.accessibleTextVirtual(n);return o=o?o.toLowerCase():null,this.data({role:a,accessibleText:o}),this.relatedNodes([e]),!0},after:function(e,t){var n=[];return e.filter(function(t){var e=n.find(function(e){return t.data.role===e.data.role&&t.data.accessibleText===e.data.accessibleText});return e?(e.result=!1,e.relatedNodes.push(t.relatedNodes[0]),!1):(n.push(t),t.relatedNodes=[],!0)})}},{id:\"has-lang\",evaluate:function(e,t,n,r){return!!(e.getAttribute(\"lang\")||e.getAttribute(\"xml:lang\")||\"\").trim()}},{id:\"valid-lang\",evaluate:function(a,e,t,n){var o,r;return o=(e||axe.utils.validLangs()).map(axe.utils.getBaseLang),!!(r=[\"lang\",\"xml:lang\"].reduce(function(e,t){var n=a.getAttribute(t);if(\"string\"!=typeof n)return e;var r=axe.utils.getBaseLang(n);return\"\"!==r&&-1===o.indexOf(r)&&e.push(t+'=\"'+a.getAttribute(t)+'\"'),e},[])).length&&(this.data(r),!0)}},{id:\"xml-lang-mismatch\",evaluate:function(e,t,n,r){var a=axe.utils.getBaseLang;return a(e.getAttribute(\"lang\"))===a(e.getAttribute(\"xml:lang\"))}},{id:\"dlitem\",evaluate:function(e,t,n,r){var a=axe.commons.dom.getComposedParent(e),o=a.nodeName.toUpperCase(),i=axe.commons.aria.getRole(a,{noImplicit:!0});return\"DIV\"===o&&[\"presentation\",\"none\",null].includes(i)&&(o=(a=axe.commons.dom.getComposedParent(a)).nodeName.toUpperCase(),i=axe.commons.aria.getRole(a,{noImplicit:!0})),\"DL\"===o&&(!i||\"list\"===i)}},{id:\"listitem\",evaluate:function(e,t,n,r){var a=axe.commons.dom.getComposedParent(e);if(a){var o=a.nodeName.toUpperCase(),i=(a.getAttribute(\"role\")||\"\").toLowerCase();return\"list\"===i||(!i||!axe.commons.aria.isValidRole(i))&&[\"UL\",\"OL\"].includes(o)}}},{id:\"only-dlitems\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.dom,i=a.aria,u=[\"definition\",\"term\",\"list\"],s=n.children.reduce(function(e,t){var n=t.actualNode;return\"DIV\"===n.nodeName.toUpperCase()&&null===i.getRole(n)?e.concat(t.children):e.concat(t)},[]).reduce(function(e,t){var n=t.actualNode,r=n.nodeName.toUpperCase();if(1===n.nodeType&&o.isVisible(n,!0,!1)){var a=i.getRole(n,{noImplicit:!0});(\"DT\"!==r&&\"DD\"!==r||a)&&(u.includes(a)||e.badNodes.push(n))}else 3===n.nodeType&&\"\"!==n.nodeValue.trim()&&(e.hasNonEmptyTextNode=!0);return e},{badNodes:[],hasNonEmptyTextNode:!1});return s.badNodes.length&&this.relatedNodes(s.badNodes),!!s.badNodes.length||s.hasNonEmptyTextNode}},{id:\"only-listitems\",evaluate:function(e,t,n,r){var o=axe.commons.dom,a=n.children.reduce(function(e,t){var n=t.actualNode,r=n.nodeName.toUpperCase();if(1===n.nodeType&&o.isVisible(n,!0,!1)){var a=function(e,t){return\"listitem\"===e||\"LI\"===t&&!e}((n.getAttribute(\"role\")||\"\").toLowerCase(),r);e.hasListItem=function(e,t,n){return e||\"LI\"===t&&n||n}(e.hasListItem,r,a),a&&(e.isEmpty=!1),\"LI\"!==r||a||e.liItemsWithRole++,\"LI\"===r||a||e.badNodes.push(n)}return 3===n.nodeType&&\"\"!==n.nodeValue.trim()&&(e.hasNonEmptyTextNode=!0),e},{badNodes:[],isEmpty:!0,hasNonEmptyTextNode:!1,hasListItem:!1,liItemsWithRole:0}),i=n.children.filter(function(e){return\"LI\"===e.actualNode.nodeName.toUpperCase()}),u=0<a.liItemsWithRole&&i.length===a.liItemsWithRole;return a.badNodes.length&&this.relatedNodes(a.badNodes),!(a.hasListItem||a.isEmpty&&!u)||!!a.badNodes.length||a.hasNonEmptyTextNode}},{id:\"structured-dlitems\",evaluate:function(e,t,n,r){var a=n.children;if(!a||!a.length)return!1;for(var o,i=!1,u=!1,s=0;s<a.length;s++){if(\"DT\"===(o=a[s].actualNode.nodeName.toUpperCase())&&(i=!0),i&&\"DD\"===o)return!1;\"DD\"===o&&(u=!0)}return i||u}},{id:\"caption\",evaluate:function(e,t,n,r){return!axe.utils.querySelectorAll(n,\"track\").some(function(e){return\"captions\"===(e.actualNode.getAttribute(\"kind\")||\"\").toLowerCase()})&&void 0}},{id:\"description\",evaluate:function(e,t,n,r){return!axe.utils.querySelectorAll(n,\"track\").some(function(e){return\"descriptions\"===(e.actualNode.getAttribute(\"kind\")||\"\").toLowerCase()})&&void 0}},{id:\"frame-tested\",evaluate:function(e,t,n,r){var a=this.async(),o=Object.assign({isViolation:!1,timeout:500},t),i=o.isViolation,u=o.timeout,s=setTimeout(function(){s=setTimeout(function(){s=null,a(!i&&void 0)},0)},u);axe.utils.respondable(e.contentWindow,\"axe.ping\",null,void 0,function(){null!==s&&(clearTimeout(s),a(!0))})},options:{isViolation:!1}},{id:\"css-orientation-lock\",evaluate:function(e,t,n,r){var a=(r||{}).cssom,o=void 0===a?void 0:a;if(o&&o.length){var i=o.reduce(function(e,t){var n=t.sheet,r=t.root,a=t.shadowId,o=a||\"topDocument\";if(e[o]||(e[o]={root:r,rules:[]}),!n||!n.cssRules)return e;var i=Array.from(n.cssRules);return e[o].rules=e[o].rules.concat(i),e},{}),s=!1,l=[];return Object.keys(i).forEach(function(e){var t=i[e],u=t.root,n=t.rules.filter(function(e){return 4===e.type});if(n&&n.length){var r=n.filter(function(e){var t=e.cssText;return/orientation:\\s*landscape/i.test(t)||/orientation:\\s*portrait/i.test(t)});r&&r.length&&r.forEach(function(e){e.cssRules.length&&Array.from(e.cssRules).forEach(function(e){if(e.selectorText&&!(e.style.length<=0)){var t=e.style.transform||e.style.webkitTransform||e.style.msTransform||!1;if(t){var n=t.match(/rotate\\(([^)]+)deg\\)/),r=parseInt(n&&n[1]||0),a=r%90==0&&r%180!=0;if(a&&\"HTML\"!==e.selectorText.toUpperCase()){var o=e.selectorText,i=Array.from(u.querySelectorAll(o));i&&i.length&&(l=l.concat(i))}s=a}}})})}}),s?(l.length&&this.relatedNodes(l),!1):!0}}},{id:\"meta-viewport-large\",evaluate:function(e,t,n,r){t=t||{};for(var a,o=(e.getAttribute(\"content\")||\"\").split(/[;,]/),i={},u=t.scaleMinimum||2,s=t.lowerBound||!1,l=0,c=o.length;l<c;l++){var d=(a=o[l].split(\"=\")).shift().toLowerCase();d&&a.length&&(i[d.trim()]=a.shift().trim().toLowerCase())}return!!(s&&i[\"maximum-scale\"]&&parseFloat(i[\"maximum-scale\"])<s)||(s||\"no\"!==i[\"user-scalable\"]?!(i[\"maximum-scale\"]&&parseFloat(i[\"maximum-scale\"])<u)||(this.data(\"maximum-scale\"),!1):(this.data(\"user-scalable=no\"),!1))},options:{scaleMinimum:5,lowerBound:2}},{id:\"meta-viewport\",evaluate:function(e,t,n,r){t=t||{};for(var a,o=(e.getAttribute(\"content\")||\"\").split(/[;,]/),i={},u=t.scaleMinimum||2,s=t.lowerBound||!1,l=0,c=o.length;l<c;l++){var d=(a=o[l].split(\"=\")).shift().toLowerCase();d&&a.length&&(i[d.trim()]=a.shift().trim().toLowerCase())}return!!(s&&i[\"maximum-scale\"]&&parseFloat(i[\"maximum-scale\"])<s)||(s||\"no\"!==i[\"user-scalable\"]?!(i[\"maximum-scale\"]&&parseFloat(i[\"maximum-scale\"])<u)||(this.data(\"maximum-scale\"),!1):(this.data(\"user-scalable=no\"),!1))},options:{scaleMinimum:2}},{id:\"header-present\",evaluate:function(e,t,n,r){return!!axe.utils.querySelectorAll(n,'h1, h2, h3, h4, h5, h6, [role=\"heading\"]')[0]}},{id:\"heading-order\",evaluate:function(e,t,n,r){var a=e.getAttribute(\"aria-level\");if(null!==a)return this.data(parseInt(a,10)),!0;var o=e.nodeName.toUpperCase().match(/H(\\d)/);return o&&this.data(parseInt(o[1],10)),!0},after:function(e,t){if(e.length<2)return e;for(var n=e[0].data,r=1;r<e.length;r++)e[r].result&&e[r].data>n+1&&(e[r].result=!1),n=e[r].data;return e}},{id:\"internal-link-present\",evaluate:function(e,t,n,r){return axe.utils.querySelectorAll(n,\"a[href]\").some(function(e){return/^#[^/!]/.test(e.actualNode.getAttribute(\"href\"))})}},{id:\"landmark\",evaluate:function(e,t,n,r){return 0<axe.utils.querySelectorAll(n,'main, [role=\"main\"]').length}},{id:\"meta-refresh\",evaluate:function(e,t,n,r){var a=e.getAttribute(\"content\")||\"\",o=a.split(/[;,]/);return\"\"===a||\"0\"===o[0]}},{id:\"p-as-heading\",evaluate:function(e,t,n,r){var a=Array.from(e.parentNode.children),o=a.indexOf(e),i=(t=t||{}).margins||[],u=a.slice(o+1).find(function(e){return\"P\"===e.nodeName.toUpperCase()}),s=a.slice(0,o).reverse().find(function(e){return\"P\"===e.nodeName.toUpperCase()});function l(e){var t=window.getComputedStyle(function(e){for(var t=e,n=e.textContent.trim(),r=n;r===n&&void 0!==t;){var a=-1;if(0===(e=t).children.length)return e;for(;a++,\"\"===(r=e.children[a].textContent.trim())&&a+1<e.children.length;);t=e.children[a]}return e}(e));return{fontWeight:function(e){switch(e){case\"lighter\":return 100;case\"normal\":return 400;case\"bold\":return 700;case\"bolder\":return 900}return e=parseInt(e),isNaN(e)?400:e}(t.getPropertyValue(\"font-weight\")),fontSize:parseInt(t.getPropertyValue(\"font-size\")),isItalic:\"italic\"===t.getPropertyValue(\"font-style\")}}function c(n,r,e){return e.reduce(function(e,t){return e||(!t.size||n.fontSize/t.size>r.fontSize)&&(!t.weight||n.fontWeight-t.weight>r.fontWeight)&&(!t.italic||n.isItalic&&!r.isItalic)},!1)}var d=l(e),m=u?l(u):null,p=s?l(s):null;if(!m||!c(d,m,i))return!0;var f=axe.commons.dom.findUpVirtual(n,\"blockquote\");return!!(f&&\"BLOCKQUOTE\"===f.nodeName.toUpperCase()||p&&!c(d,p,i))&&void 0},options:{margins:[{weight:150,italic:!0},{weight:150,size:1.15},{italic:!0,size:1.15},{size:1.4}]}},{id:\"region\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.dom,i=a.aria,u=i.getRolesByType(\"landmark\"),s=u.reduce(function(e,t){return e.concat(i.implicitNodes(t))},[]).filter(function(e){return null!==e});var l=function e(t){var n=t.actualNode;return function(a){var o=a.actualNode,e=axe.commons.aria.getRole(o,{noImplicit:!0}),t=(o.getAttribute(\"aria-live\")||\"\").toLowerCase().trim();return e?\"dialog\"===e||u.includes(e):!![\"assertive\",\"polite\"].includes(t)||s.some(function(e){var t=axe.utils.matchesSelector(o,e);if(\"FORM\"!==o.nodeName.toUpperCase())return t;var n=o.getAttribute(\"title\"),r=n&&\"\"!==n.trim()?axe.commons.text.sanitize(n):null;return t&&(!!i.labelVirtual(a)||!!r)})}(t)||o.isSkipLink(t.actualNode)&&o.getElementByReference(t.actualNode,\"href\")||!o.isVisible(n,!0)?[]:o.hasContent(n,!0)?[n]:t.children.filter(function(e){return 1===e.actualNode.nodeType}).map(e).reduce(function(e,t){return e.concat(t)},[])}(n);return this.relatedNodes(l),0===l.length},after:function(e,t){return[e[0]]}},{id:\"skip-link\",evaluate:function(e,t,n,r){var a=axe.commons.dom.getElementByReference(e,\"href\");return!!a&&(axe.commons.dom.isVisible(a,!0)||void 0)}},{id:\"unique-frame-title\",evaluate:function(e,t,n,r){var a=axe.commons.text.sanitize(e.title).trim().toLowerCase();return this.data(a),!0},after:function(e,t){var n={};return e.forEach(function(e){n[e.data]=void 0!==n[e.data]?++n[e.data]:0}),e.forEach(function(e){e.result=!!n[e.data]}),e}},{id:\"duplicate-id-active\",evaluate:function(t,e,n,r){var a=t.getAttribute(\"id\").trim();if(!a)return!0;var o=axe.commons.dom.getRootNode(t),i=Array.from(o.querySelectorAll('[id=\"'.concat(axe.utils.escapeSelector(a),'\"]'))).filter(function(e){return e!==t});return i.length&&this.relatedNodes(i),this.data(a),0===i.length},after:function(e,t){var n=[];return e.filter(function(e){return-1===n.indexOf(e.data)&&(n.push(e.data),!0)})}},{id:\"duplicate-id-aria\",evaluate:function(t,e,n,r){var a=t.getAttribute(\"id\").trim();if(!a)return!0;var o=axe.commons.dom.getRootNode(t),i=Array.from(o.querySelectorAll('[id=\"'.concat(axe.utils.escapeSelector(a),'\"]'))).filter(function(e){return e!==t});return i.length&&this.relatedNodes(i),this.data(a),0===i.length},after:function(e,t){var n=[];return e.filter(function(e){return-1===n.indexOf(e.data)&&(n.push(e.data),!0)})}},{id:\"duplicate-id\",evaluate:function(t,e,n,r){var a=t.getAttribute(\"id\").trim();if(!a)return!0;var o=axe.commons.dom.getRootNode(t),i=Array.from(o.querySelectorAll('[id=\"'.concat(axe.utils.escapeSelector(a),'\"]'))).filter(function(e){return e!==t});return i.length&&this.relatedNodes(i),this.data(a),0===i.length},after:function(e,t){var n=[];return e.filter(function(e){return-1===n.indexOf(e.data)&&(n.push(e.data),!0)})}},{id:\"aria-label\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.text,i=a.aria;return!!o.sanitize(i.arialabelText(e))}},{id:\"aria-labelledby\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.text,i=a.aria;return!!o.sanitize(i.arialabelledbyText(e))}},{id:\"avoid-inline-spacing\",evaluate:function(t,e,n,r){var a=[\"line-height\",\"letter-spacing\",\"word-spacing\"].filter(function(e){if(\"important\"===t.style.getPropertyPriority(e))return e});return!(0<a.length)||(this.data(a),!1)}},{id:\"button-has-visible-text\",evaluate:function(e,t,n,r){var a,o=e.nodeName.toUpperCase(),i=e.getAttribute(\"role\");return(\"BUTTON\"===o||\"button\"===i&&\"INPUT\"!==o)&&(a=axe.commons.text.accessibleTextVirtual(n),this.data(a),!!a)}},{id:\"doc-has-title\",evaluate:function(e,t,n,r){var a=document.title;return!(!a||!axe.commons.text.sanitize(a).trim())}},{id:\"exists\",evaluate:function(e,t,n,r){return!0}},{id:\"has-alt\",evaluate:function(e,t,n,r){var a=e.nodeName.toLowerCase();return e.hasAttribute(\"alt\")&&(\"img\"===a||\"input\"===a||\"area\"===a)}},{id:\"has-visible-text\",evaluate:function(e,t,n,r){return 0<axe.commons.text.accessibleTextVirtual(n).length}},{id:\"is-on-screen\",evaluate:function(e,t,n,r){return axe.commons.dom.isVisible(e,!1)&&!axe.commons.dom.isOffscreen(e)}},{id:\"non-empty-alt\",evaluate:function(e,t,n,r){var a=e.getAttribute(\"alt\");return!(!a||!axe.commons.text.sanitize(a).trim())}},{id:\"non-empty-if-present\",evaluate:function(e,t,n,r){var a=e.nodeName.toUpperCase(),o=(e.getAttribute(\"type\")||\"\").toLowerCase(),i=e.getAttribute(\"value\");return this.data(i),!(\"INPUT\"!==a||![\"submit\",\"reset\"].includes(o))&&null===i}},{id:\"non-empty-title\",evaluate:function(e,t,n,r){var a=axe.commons.text;return!!a.sanitize(a.titleText(e))}},{id:\"non-empty-value\",evaluate:function(e,t,n,r){var a=e.getAttribute(\"value\");return!(!a||!axe.commons.text.sanitize(a).trim())}},{id:\"role-none\",evaluate:function(e,t,n,r){return\"none\"===e.getAttribute(\"role\")}},{id:\"role-presentation\",evaluate:function(e,t,n,r){return\"presentation\"===e.getAttribute(\"role\")}},{id:\"caption-faked\",evaluate:function(e,t,n,r){var a=axe.commons.table.toGrid(e),o=a[0];return a.length<=1||o.length<=1||e.rows.length<=1||o.reduce(function(e,t,n){return e||t!==o[n+1]&&void 0!==o[n+1]},!1)}},{id:\"has-caption\",evaluate:function(e,t,n,r){return!!e.caption}},{id:\"has-summary\",evaluate:function(e,t,n,r){return!!e.summary}},{id:\"has-th\",evaluate:function(e,t,n,r){for(var a,o,i=[],u=0,s=e.rows.length;u<s;u++)for(var l=0,c=(a=e.rows[u]).cells.length;l<c;l++)\"TH\"!==(o=a.cells[l]).nodeName.toUpperCase()&&-1===[\"rowheader\",\"columnheader\"].indexOf(o.getAttribute(\"role\"))||i.push(o);return!!i.length&&(this.relatedNodes(i),!0)}},{id:\"html5-scope\",evaluate:function(e,t,n,r){return!axe.commons.dom.isHTML5(document)||\"TH\"===e.nodeName.toUpperCase()}},{id:\"same-caption-summary\",evaluate:function(e,t,n,r){return!(!e.summary||!e.caption)&&e.summary.toLowerCase()===axe.commons.text.accessibleText(e.caption).toLowerCase()}},{id:\"scope-value\",evaluate:function(e,t,n,r){var a=e.getAttribute(\"scope\").toLowerCase();return-1!==[\"row\",\"col\",\"rowgroup\",\"colgroup\"].indexOf(a)}},{id:\"td-has-header\",evaluate:function(e,t,n,r){var a=axe.commons.table,o=[];return a.getAllCells(e).forEach(function(e){axe.commons.dom.hasContent(e)&&a.isDataCell(e)&&!axe.commons.aria.label(e)&&(a.getHeaders(e).some(function(e){return null!==e&&!!axe.commons.dom.hasContent(e)})||o.push(e))}),!o.length||(this.relatedNodes(o),!1)}},{id:\"td-headers-attr\",evaluate:function(e,t,n,r){for(var a=[],o=0,i=e.rows.length;o<i;o++)for(var u=e.rows[o],s=0,l=u.cells.length;s<l;s++)a.push(u.cells[s]);var c=a.reduce(function(e,t){return t.getAttribute(\"id\")&&e.push(t.getAttribute(\"id\")),e},[]),d=a.reduce(function(e,t){var n,r,a=(t.getAttribute(\"headers\")||\"\").split(/\\s/).reduce(function(e,t){return(t=t.trim())&&e.push(t),e},[]);return 0!==a.length&&(t.getAttribute(\"id\")&&(n=-1!==a.indexOf(t.getAttribute(\"id\").trim())),r=a.reduce(function(e,t){return e||-1===c.indexOf(t)},!1),(n||r)&&e.push(t)),e},[]);return!(0<d.length)||(this.relatedNodes(d),!1)}},{id:\"th-has-data-cells\",evaluate:function(e,t,n,r){var a=axe.commons.table,o=a.getAllCells(e),i=this,u=[];o.forEach(function(e){var t=e.getAttribute(\"headers\");t&&(u=u.concat(t.split(/\\s+/)));var n=e.getAttribute(\"aria-labelledby\");n&&(u=u.concat(n.split(/\\s+/)))});var s=o.filter(function(e){return\"\"!==axe.commons.text.sanitize(e.textContent)&&(\"TH\"===e.nodeName.toUpperCase()||-1!==[\"rowheader\",\"columnheader\"].indexOf(e.getAttribute(\"role\")))}),l=a.toGrid(e);return!!s.reduce(function(e,t){if(t.getAttribute(\"id\")&&u.includes(t.getAttribute(\"id\")))return!!e||e;var n=!1,r=a.getCellPosition(t,l);return a.isColumnHeader(t)&&(n=a.traverse(\"down\",r,l).reduce(function(e,t){return e||axe.commons.dom.hasContent(t)&&!a.isColumnHeader(t)},!1)),!n&&a.isRowHeader(t)&&(n=a.traverse(\"right\",r,l).reduce(function(e,t){return e||axe.commons.dom.hasContent(t)&&!a.isRowHeader(t)},!1)),n||i.relatedNodes(t),e&&n},!0)||void 0}},{id:\"hidden-content\",evaluate:function(e,t,n,r){if(![\"SCRIPT\",\"HEAD\",\"TITLE\",\"NOSCRIPT\",\"STYLE\",\"TEMPLATE\"].includes(e.nodeName.toUpperCase())&&axe.commons.dom.hasContentVirtual(n)){var a=window.getComputedStyle(e);if(\"none\"===a.getPropertyValue(\"display\"))return;if(\"hidden\"===a.getPropertyValue(\"visibility\")){var o=axe.commons.dom.getComposedParent(e),i=o&&window.getComputedStyle(o);if(!i||\"hidden\"!==i.getPropertyValue(\"visibility\"))return}}return!0}}],commons:function(){function e(e){return null===e}function t(e){return null!==e}var commons={},l=commons.aria={},n=l.lookupTable={};n.attributes={\"aria-activedescendant\":{type:\"idref\",allowEmpty:!0,unsupported:!1},\"aria-atomic\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-autocomplete\":{type:\"nmtoken\",values:[\"inline\",\"list\",\"both\",\"none\"],unsupported:!1},\"aria-busy\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-checked\":{type:\"nmtoken\",values:[\"true\",\"false\",\"mixed\",\"undefined\"],unsupported:!1},\"aria-colcount\":{type:\"int\",unsupported:!1},\"aria-colindex\":{type:\"int\",unsupported:!1},\"aria-colspan\":{type:\"int\",unsupported:!1},\"aria-controls\":{type:\"idrefs\",allowEmpty:!0,unsupported:!1},\"aria-current\":{type:\"nmtoken\",allowEmpty:!0,values:[\"page\",\"step\",\"location\",\"date\",\"time\",\"true\",\"false\"],unsupported:!1},\"aria-describedby\":{type:\"idrefs\",allowEmpty:!0,unsupported:!1},\"aria-describedat\":{unsupported:!0,unstandardized:!0},\"aria-details\":{unsupported:!0},\"aria-disabled\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-dropeffect\":{type:\"nmtokens\",values:[\"copy\",\"move\",\"reference\",\"execute\",\"popup\",\"none\"],unsupported:!1},\"aria-errormessage\":{type:\"idref\",allowEmpty:!0,unsupported:!1},\"aria-expanded\":{type:\"nmtoken\",values:[\"true\",\"false\",\"undefined\"],unsupported:!1},\"aria-flowto\":{type:\"idrefs\",allowEmpty:!0,unsupported:!1},\"aria-grabbed\":{type:\"nmtoken\",values:[\"true\",\"false\",\"undefined\"],unsupported:!1},\"aria-haspopup\":{type:\"nmtoken\",allowEmpty:!0,values:[\"true\",\"false\",\"menu\",\"listbox\",\"tree\",\"grid\",\"dialog\"],unsupported:!1},\"aria-hidden\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-invalid\":{type:\"nmtoken\",allowEmpty:!0,values:[\"true\",\"false\",\"spelling\",\"grammar\"],unsupported:!1},\"aria-keyshortcuts\":{type:\"string\",allowEmpty:!0,unsupported:!1},\"aria-label\":{type:\"string\",allowEmpty:!0,unsupported:!1},\"aria-labelledby\":{type:\"idrefs\",allowEmpty:!0,unsupported:!1},\"aria-level\":{type:\"int\",unsupported:!1},\"aria-live\":{type:\"nmtoken\",values:[\"off\",\"polite\",\"assertive\"],unsupported:!1},\"aria-modal\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-multiline\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-multiselectable\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-orientation\":{type:\"nmtoken\",values:[\"horizontal\",\"vertical\"],unsupported:!1},\"aria-owns\":{type:\"idrefs\",allowEmpty:!0,unsupported:!1},\"aria-placeholder\":{type:\"string\",allowEmpty:!0,unsupported:!1},\"aria-posinset\":{type:\"int\",unsupported:!1},\"aria-pressed\":{type:\"nmtoken\",values:[\"true\",\"false\",\"mixed\",\"undefined\"],unsupported:!1},\"aria-readonly\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-relevant\":{type:\"nmtokens\",values:[\"additions\",\"removals\",\"text\",\"all\"],unsupported:!1},\"aria-required\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-roledescription\":{type:\"string\",allowEmpty:!0,unsupported:{exceptions:[\"button\",{nodeName:\"input\",properties:{type:[\"button\",\"checkbox\",\"image\",\"radio\",\"reset\",\"submit\"]}},\"img\",\"select\",\"summary\"]}},\"aria-rowcount\":{type:\"int\",unsupported:!1},\"aria-rowindex\":{type:\"int\",unsupported:!1},\"aria-rowspan\":{type:\"int\",unsupported:!1},\"aria-selected\":{type:\"nmtoken\",values:[\"true\",\"false\",\"undefined\"],unsupported:!1},\"aria-setsize\":{type:\"int\",unsupported:!1},\"aria-sort\":{type:\"nmtoken\",values:[\"ascending\",\"descending\",\"other\",\"none\"],unsupported:!1},\"aria-valuemax\":{type:\"decimal\",unsupported:!1},\"aria-valuemin\":{type:\"decimal\",unsupported:!1},\"aria-valuenow\":{type:\"decimal\",unsupported:!1},\"aria-valuetext\":{type:\"string\",unsupported:!1}},n.globalAttributes=[\"aria-atomic\",\"aria-busy\",\"aria-controls\",\"aria-current\",\"aria-describedby\",\"aria-disabled\",\"aria-dropeffect\",\"aria-flowto\",\"aria-grabbed\",\"aria-haspopup\",\"aria-hidden\",\"aria-invalid\",\"aria-keyshortcuts\",\"aria-label\",\"aria-labelledby\",\"aria-live\",\"aria-owns\",\"aria-relevant\",\"aria-roledescription\"],n.role={alert:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},alertdialog:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-modal\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"dialog\",\"section\"]},application:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"article\",\"audio\",\"embed\",\"iframe\",\"object\",\"section\",\"svg\",\"video\"]},article:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"article\"],unsupported:!1},banner:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"header\"],unsupported:!1,allowedElements:[\"section\"]},button:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-pressed\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:[\"button\",'input[type=\"button\"]','input[type=\"image\"]','input[type=\"reset\"]','input[type=\"submit\"]',\"summary\"],unsupported:!1,allowedElements:[{nodeName:\"a\",attributes:{href:t}}]},cell:{type:\"structure\",attributes:{allowed:[\"aria-colindex\",\"aria-colspan\",\"aria-rowindex\",\"aria-rowspan\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"row\"],implicit:[\"td\",\"th\"],unsupported:!1},checkbox:{type:\"widget\",attributes:{allowed:[\"aria-checked\",\"aria-required\",\"aria-readonly\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:['input[type=\"checkbox\"]'],unsupported:!1,allowedElements:[\"button\"]},columnheader:{type:\"structure\",attributes:{allowed:[\"aria-colindex\",\"aria-colspan\",\"aria-expanded\",\"aria-rowindex\",\"aria-rowspan\",\"aria-required\",\"aria-readonly\",\"aria-selected\",\"aria-sort\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"row\"],implicit:[\"th\"],unsupported:!1},combobox:{type:\"composite\",attributes:{allowed:[\"aria-autocomplete\",\"aria-required\",\"aria-activedescendant\",\"aria-orientation\",\"aria-errormessage\"],required:[\"aria-expanded\"]},owned:{all:[\"listbox\",\"textbox\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[{nodeName:\"input\",properties:{type:\"text\"}}]},command:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},complementary:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"aside\"],unsupported:!1,allowedElements:[\"section\"]},composite:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},contentinfo:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"footer\"],unsupported:!1,allowedElements:[\"section\"]},definition:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"dd\",\"dfn\"],unsupported:!1},dialog:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-modal\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"dialog\"],unsupported:!1,allowedElements:[\"section\"]},directory:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[\"ol\",\"ul\"]},document:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"body\"],unsupported:!1,allowedElements:[\"article\",\"embed\",\"iframe\",\"object\",\"section\",\"svg\"]},\"doc-abstract\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-acknowledgments\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-afterword\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-appendix\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-backlink\":{type:\"link\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[{nodeName:\"a\",attributes:{href:t}}]},\"doc-biblioentry\":{type:\"listitem\",attributes:{allowed:[\"aria-expanded\",\"aria-level\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:[\"doc-bibliography\"],unsupported:!1,allowedElements:[\"li\"]},\"doc-bibliography\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:{one:[\"doc-biblioentry\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-biblioref\":{type:\"link\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[{nodeName:\"a\",attributes:{href:t}}]},\"doc-chapter\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-colophon\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-conclusion\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-cover\":{type:\"img\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1},\"doc-credit\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-credits\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-dedication\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-endnote\":{type:\"listitem\",attributes:{allowed:[\"aria-expanded\",\"aria-level\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:[\"doc-endnotes\"],unsupported:!1,allowedElements:[\"li\"]},\"doc-endnotes\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:{one:[\"doc-endnote\"]},namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-epigraph\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1},\"doc-epilogue\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-errata\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-example\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"aside\",\"section\"]},\"doc-footnote\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"aside\",\"footer\",\"header\"]},\"doc-foreword\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-glossary\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:[\"term\",\"definition\"],namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"dl\"]},\"doc-glossref\":{type:\"link\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[{nodeName:\"a\",attributes:{href:t}}]},\"doc-index\":{type:\"navigation\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"nav\",\"section\"]},\"doc-introduction\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-noteref\":{type:\"link\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[{nodeName:\"a\",attributes:{href:t}}]},\"doc-notice\":{type:\"note\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-pagebreak\":{type:\"separator\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"hr\"]},\"doc-pagelist\":{type:\"navigation\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"nav\",\"section\"]},\"doc-part\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-preface\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-prologue\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-pullquote\":{type:\"none\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"aside\",\"section\"]},\"doc-qna\":{type:\"section\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-subtitle\":{type:\"sectionhead\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:{nodeName:[\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"]}},\"doc-tip\":{type:\"note\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"aside\"]},\"doc-toc\":{type:\"navigation\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"nav\",\"section\"]},feed:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:{one:[\"article\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"article\",\"aside\",\"section\"]},figure:{type:\"structure\",unsupported:!1},form:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"form\"],unsupported:!1},grid:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-colcount\",\"aria-level\",\"aria-multiselectable\",\"aria-readonly\",\"aria-rowcount\",\"aria-errormessage\"]},owned:{one:[\"rowgroup\",\"row\"]},nameFrom:[\"author\"],context:null,implicit:[\"table\"],unsupported:!1},gridcell:{type:\"widget\",attributes:{allowed:[\"aria-colindex\",\"aria-colspan\",\"aria-expanded\",\"aria-rowindex\",\"aria-rowspan\",\"aria-selected\",\"aria-readonly\",\"aria-required\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"row\"],implicit:[\"td\",\"th\"],unsupported:!1},group:{type:\"structure\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"details\",\"optgroup\"],unsupported:!1,allowedElements:[\"dl\",\"figcaption\",\"fieldset\",\"figure\",\"footer\",\"header\",\"ol\",\"ul\"]},heading:{type:\"structure\",attributes:{required:[\"aria-level\"],allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:[\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"],unsupported:!1},img:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"img\"],unsupported:!1,allowedElements:[\"embed\",\"iframe\",\"object\",\"svg\"]},input:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},landmark:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},link:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:[\"a[href]\"],unsupported:!1,allowedElements:[\"button\",{nodeName:\"input\",properties:{type:[\"image\",\"button\"]}}]},list:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:{all:[\"listitem\"]},nameFrom:[\"author\"],context:null,implicit:[\"ol\",\"ul\",\"dl\"],unsupported:!1},listbox:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-multiselectable\",\"aria-required\",\"aria-expanded\",\"aria-orientation\",\"aria-errormessage\"]},owned:{all:[\"option\"]},nameFrom:[\"author\"],context:null,implicit:[\"select\"],unsupported:!1,allowedElements:[\"ol\",\"ul\"]},listitem:{type:\"structure\",attributes:{allowed:[\"aria-level\",\"aria-posinset\",\"aria-setsize\",\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"list\"],implicit:[\"li\",\"dt\"],unsupported:!1},log:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},main:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"main\"],unsupported:!1,allowedElements:[\"article\",\"section\"]},marquee:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},math:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"math\"],unsupported:!1},menu:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-orientation\",\"aria-errormessage\"]},owned:{one:[\"menuitem\",\"menuitemradio\",\"menuitemcheckbox\"]},nameFrom:[\"author\"],context:null,implicit:['menu[type=\"context\"]'],unsupported:!1,allowedElements:[\"ol\",\"ul\"]},menubar:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-orientation\",\"aria-errormessage\"]},owned:{one:[\"menuitem\",\"menuitemradio\",\"menuitemcheckbox\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"ol\",\"ul\"]},menuitem:{type:\"widget\",attributes:{allowed:[\"aria-posinset\",\"aria-setsize\",\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"menu\",\"menubar\"],implicit:['menuitem[type=\"command\"]'],unsupported:!1,allowedElements:[\"button\",\"li\",{nodeName:\"iput\",properties:{type:[\"image\",\"button\"]}},{nodeName:\"a\",attributes:{href:t}}]},menuitemcheckbox:{type:\"widget\",attributes:{allowed:[\"aria-checked\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"menu\",\"menubar\"],implicit:['menuitem[type=\"checkbox\"]'],unsupported:!1,allowedElements:[{nodeName:[\"button\",\"li\"]},{nodeName:\"input\",properties:{type:[\"checkbox\",\"image\",\"button\"]}},{nodeName:\"a\",attributes:{href:t}}]},menuitemradio:{type:\"widget\",attributes:{allowed:[\"aria-checked\",\"aria-selected\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"menu\",\"menubar\"],implicit:['menuitem[type=\"radio\"]'],unsupported:!1,allowedElements:[{nodeName:[\"button\",\"li\"]},{nodeName:\"input\",properties:{type:[\"image\",\"button\",\"radio\"]}},{nodeName:\"a\",attributes:{href:t}}]},navigation:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"nav\"],unsupported:!1,allowedElements:[\"section\"]},none:{type:\"structure\",attributes:null,owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[{nodeName:[\"article\",\"aside\",\"dl\",\"embed\",\"figcaption\",\"fieldset\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"iframe\",\"li\",\"ol\",\"section\",\"ul\"]},{nodeName:\"img\",attributes:{alt:t}}]},note:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"aside\"]},option:{type:\"widget\",attributes:{allowed:[\"aria-selected\",\"aria-posinset\",\"aria-setsize\",\"aria-checked\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"listbox\"],implicit:[\"option\"],unsupported:!1,allowedElements:[{nodeName:[\"button\",\"li\"]},{nodeName:\"input\",properties:{type:[\"checkbox\",\"button\"]}},{nodeName:\"a\",attributes:{href:t}}]},presentation:{type:\"structure\",attributes:null,owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[{nodeName:[\"article\",\"aside\",\"dl\",\"embed\",\"figcaption\",\"fieldset\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"iframe\",\"li\",\"ol\",\"section\",\"ul\"]},{nodeName:\"img\",attributes:{alt:t}}]},progressbar:{type:\"widget\",attributes:{allowed:[\"aria-valuetext\",\"aria-valuenow\",\"aria-valuemax\",\"aria-valuemin\",\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"progress\"],unsupported:!1},radio:{type:\"widget\",attributes:{allowed:[\"aria-selected\",\"aria-posinset\",\"aria-setsize\",\"aria-required\",\"aria-errormessage\",\"aria-checked\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:['input[type=\"radio\"]'],unsupported:!1,allowedElements:[{nodeName:[\"button\",\"li\"]},{nodeName:\"input\",properties:{type:[\"image\",\"button\"]}}]},radiogroup:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-required\",\"aria-expanded\",\"aria-readonly\",\"aria-errormessage\"]},owned:{all:[\"radio\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:{nodeName:[\"ol\",\"ul\"]}},range:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},region:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"section[aria-label]\",\"section[aria-labelledby]\",\"section[title]\"],unsupported:!1,allowedElements:{nodeName:[\"article\",\"aside\"]}},roletype:{type:\"abstract\",unsupported:!1},row:{type:\"structure\",attributes:{allowed:[\"aria-activedescendant\",\"aria-colindex\",\"aria-expanded\",\"aria-level\",\"aria-selected\",\"aria-rowindex\",\"aria-errormessage\"]},owned:{one:[\"cell\",\"columnheader\",\"rowheader\",\"gridcell\"]},nameFrom:[\"author\",\"contents\"],context:[\"rowgroup\",\"grid\",\"treegrid\",\"table\"],implicit:[\"tr\"],unsupported:!1},rowgroup:{type:\"structure\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-errormessage\"]},owned:{all:[\"row\"]},nameFrom:[\"author\",\"contents\"],context:[\"grid\",\"table\",\"treegrid\"],implicit:[\"tbody\",\"thead\",\"tfoot\"],unsupported:!1},rowheader:{type:\"structure\",attributes:{allowed:[\"aria-colindex\",\"aria-colspan\",\"aria-expanded\",\"aria-rowindex\",\"aria-rowspan\",\"aria-required\",\"aria-readonly\",\"aria-selected\",\"aria-sort\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"row\"],implicit:[\"th\"],unsupported:!1},scrollbar:{type:\"widget\",attributes:{required:[\"aria-controls\",\"aria-valuenow\"],allowed:[\"aria-valuetext\",\"aria-orientation\",\"aria-errormessage\",\"aria-valuemax\",\"aria-valuemin\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1},search:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:{nodeName:[\"aside\",\"form\",\"section\"]}},searchbox:{type:\"widget\",attributes:{allowed:[\"aria-activedescendant\",\"aria-autocomplete\",\"aria-multiline\",\"aria-readonly\",\"aria-required\",\"aria-placeholder\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['input[type=\"search\"]'],unsupported:!1,allowedElements:{nodeName:\"input\",properties:{type:\"text\"}}},section:{nameFrom:[\"author\",\"contents\"],type:\"abstract\",unsupported:!1},sectionhead:{nameFrom:[\"author\",\"contents\"],type:\"abstract\",unsupported:!1},select:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},separator:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-orientation\",\"aria-valuenow\",\"aria-valuemax\",\"aria-valuemin\",\"aria-valuetext\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"hr\"],unsupported:!1,allowedElements:[\"li\"]},slider:{type:\"widget\",attributes:{allowed:[\"aria-valuetext\",\"aria-orientation\",\"aria-readonly\",\"aria-errormessage\",\"aria-valuemax\",\"aria-valuemin\"],required:[\"aria-valuenow\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['input[type=\"range\"]'],unsupported:!1},spinbutton:{type:\"widget\",attributes:{allowed:[\"aria-valuetext\",\"aria-required\",\"aria-readonly\",\"aria-errormessage\",\"aria-valuemax\",\"aria-valuemin\"],required:[\"aria-valuenow\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['input[type=\"number\"]'],unsupported:!1,allowedElements:{nodeName:\"input\",properties:{type:\"text\"}}},status:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"output\"],unsupported:!1,allowedElements:[\"section\"]},structure:{type:\"abstract\",unsupported:!1},switch:{type:\"widget\",attributes:{allowed:[\"aria-errormessage\"],required:[\"aria-checked\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[\"button\",{nodeName:\"input\",properties:{type:[\"checkbox\",\"image\",\"button\"]}},{nodeName:\"a\",attributes:{href:t}}]},tab:{type:\"widget\",attributes:{allowed:[\"aria-selected\",\"aria-expanded\",\"aria-setsize\",\"aria-posinset\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"tablist\"],unsupported:!1,allowedElements:[{nodeName:[\"button\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"li\"]},{nodeName:\"input\",properties:{type:\"button\"}},{nodeName:\"a\",attributes:{href:t}}]},table:{type:\"structure\",attributes:{allowed:[\"aria-colcount\",\"aria-rowcount\",\"aria-errormessage\"]},owned:{one:[\"rowgroup\",\"row\"]},nameFrom:[\"author\"],context:null,implicit:[\"table\"],unsupported:!1},tablist:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-level\",\"aria-multiselectable\",\"aria-orientation\",\"aria-errormessage\"]},owned:{all:[\"tab\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"ol\",\"ul\"]},tabpanel:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},term:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:[\"dt\"],unsupported:!1},textbox:{type:\"widget\",attributes:{allowed:[\"aria-activedescendant\",\"aria-autocomplete\",\"aria-multiline\",\"aria-readonly\",\"aria-required\",\"aria-placeholder\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['input[type=\"text\"]','input[type=\"email\"]','input[type=\"password\"]','input[type=\"tel\"]','input[type=\"url\"]',\"input:not([type])\",\"textarea\"],unsupported:!1},timer:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1},toolbar:{type:\"structure\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-orientation\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['menu[type=\"toolbar\"]'],unsupported:!1,allowedElements:[\"ol\",\"ul\"]},tooltip:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,unsupported:!1},tree:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-multiselectable\",\"aria-required\",\"aria-expanded\",\"aria-orientation\",\"aria-errormessage\"]},owned:{all:[\"treeitem\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"ol\",\"ul\"]},treegrid:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-colcount\",\"aria-expanded\",\"aria-level\",\"aria-multiselectable\",\"aria-readonly\",\"aria-required\",\"aria-rowcount\",\"aria-orientation\",\"aria-errormessage\"]},owned:{one:[\"rowgroup\",\"row\"]},nameFrom:[\"author\"],context:null,unsupported:!1},treeitem:{type:\"widget\",attributes:{allowed:[\"aria-checked\",\"aria-selected\",\"aria-expanded\",\"aria-level\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"group\",\"tree\"],unsupported:!1,allowedElements:[\"li\",{nodeName:\"a\",attributes:{href:t}}]},widget:{type:\"abstract\",unsupported:!1},window:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1}},n.elementsAllowedNoRole=[{nodeName:[\"base\",\"body\",\"caption\",\"col\",\"colgroup\",\"datalist\",\"dd\",\"details\",\"dt\",\"head\",\"html\",\"keygen\",\"label\",\"legend\",\"main\",\"map\",\"math\",\"meta\",\"meter\",\"noscript\",\"optgroup\",\"param\",\"picture\",\"progress\",\"script\",\"source\",\"style\",\"template\",\"textarea\",\"title\",\"track\"]},{nodeName:\"area\",attributes:{href:t}},{nodeName:\"input\",properties:{type:[\"color\",\"data\",\"datatime\",\"file\",\"hidden\",\"month\",\"number\",\"password\",\"range\",\"reset\",\"submit\",\"time\",\"week\"]}},{nodeName:\"input\",attributes:{list:e},properties:{type:[\"email\",\"search\",\"tel\",\"url\"]}},{nodeName:\"link\",attributes:{href:t}},{nodeName:\"menu\",attributes:{type:\"context\"}},{nodeName:\"menuitem\",attributes:{type:[\"command\",\"checkbox\",\"radio\"]}},{nodeName:\"select\",condition:function(e){return 1<Number(e.getAttribute(\"size\"))},properties:{multiple:!0}},{nodeName:[\"clippath\",\"cursor\",\"defs\",\"desc\",\"feblend\",\"fecolormatrix\",\"fecomponenttransfer\",\"fecomposite\",\"feconvolvematrix\",\"fediffuselighting\",\"fedisplacementmap\",\"fedistantlight\",\"fedropshadow\",\"feflood\",\"fefunca\",\"fefuncb\",\"fefuncg\",\"fefuncr\",\"fegaussianblur\",\"feimage\",\"femerge\",\"femergenode\",\"femorphology\",\"feoffset\",\"fepointlight\",\"fespecularlighting\",\"fespotlight\",\"fetile\",\"feturbulence\",\"filter\",\"hatch\",\"hatchpath\",\"lineargradient\",\"marker\",\"mask\",\"meshgradient\",\"meshpatch\",\"meshrow\",\"metadata\",\"mpath\",\"pattern\",\"radialgradient\",\"solidcolor\",\"stop\",\"switch\",\"view\"]}],n.elementsAllowedAnyRole=[{nodeName:\"a\",attributes:{href:e}},{nodeName:[\"abbr\",\"address\",\"canvas\",\"div\",\"p\",\"pre\",\"blockquote\",\"ins\",\"del\",\"output\",\"span\",\"table\",\"tbody\",\"thead\",\"tfoot\",\"td\",\"em\",\"strong\",\"small\",\"s\",\"cite\",\"q\",\"dfn\",\"abbr\",\"time\",\"code\",\"var\",\"samp\",\"kbd\",\"sub\",\"sup\",\"i\",\"b\",\"u\",\"mark\",\"ruby\",\"rt\",\"rp\",\"bdi\",\"bdo\",\"br\",\"wbr\",\"th\",\"tr\"]}],n.evaluateRoleForElement={A:function(e){var t=e.node,n=e.out;return\"http://www.w3.org/2000/svg\"===t.namespaceURI||(!t.href.length||n)},AREA:function(e){return!e.node.href},BUTTON:function(e){var t=e.node,n=e.role,r=e.out;return\"menu\"===t.getAttribute(\"type\")?\"menuitem\"===n:r},IMG:function(e){var t=e.node,n=e.out;return t.alt?!n:n},INPUT:function(e){var t=e.node,n=e.role,r=e.out;switch(t.type){case\"button\":case\"image\":return r;case\"checkbox\":return!(\"button\"!==n||!t.hasAttribute(\"aria-pressed\"))||r;case\"radio\":return\"menuitemradio\"===n;case\"text\":return\"combobox\"===n||\"searchbox\"===n||\"spinbutton\"===n;default:return!1}},LI:function(e){var t=e.node,n=e.out;return!axe.utils.matchesSelector(t,\"ol li, ul li\")||n},MENU:function(e){return\"context\"!==e.node.getAttribute(\"type\")},OPTION:function(e){var t=e.node;return!axe.utils.matchesSelector(t,\"select > option, datalist > option, optgroup > option\")},SELECT:function(e){var t=e.node,n=e.role;return!t.multiple&&t.size<=1&&\"menu\"===n},SVG:function(e){var t=e.node,n=e.out;return!(!t.parentNode||\"http://www.w3.org/2000/svg\"!==t.parentNode.namespaceURI)||n}},n.rolesOfType={widget:[\"button\",\"checkbox\",\"dialog\",\"gridcell\",\"heading\",\"link\",\"log\",\"marquee\",\"menuitem\",\"menuitemcheckbox\",\"menuitemradio\",\"option\",\"progressbar\",\"radio\",\"scrollbar\",\"slider\",\"spinbutton\",\"status\",\"switch\",\"tab\",\"tabpanel\",\"textbox\",\"timer\",\"tooltip\",\"tree\",\"treeitem\"]};var s={};commons.color=s;var h=commons.dom={},r={};function i(e,t){return i.fromDefinition(e,t)}commons.forms=r,commons.matches=i;var o=commons.table={},g=commons.text={EdgeFormDefaults:{}};commons.utils=axe.utils;l.arialabelText=function(e){return 1!==(e=e.actualNode||e).nodeType?\"\":e.getAttribute(\"aria-label\")||\"\"},l.arialabelledbyText=function(r,e){var a=1<arguments.length&&void 0!==e?e:{};return 1!==(r=r.actualNode||r).nodeType||a.inLabelledByContext||a.inControlContext?\"\":h.idrefs(r,\"aria-labelledby\").filter(function(e){return e}).reduce(function(e,t){var n=g.accessibleText(t,R({inLabelledByContext:!0,startNode:a.startNode||r},a));return e?\"\".concat(e,\" \").concat(n):n},\"\")},l.requiredAttr=function(e){var t=l.lookupTable.role[e];return t&&t.attributes&&t.attributes.required||[]},l.allowedAttr=function(e){var t=l.lookupTable.role[e],n=t&&t.attributes&&t.attributes.allowed||[],r=t&&t.attributes&&t.attributes.required||[];return n.concat(l.lookupTable.globalAttributes).concat(r)},l.validateAttr=function(e){return!!l.lookupTable.attributes[e]},l.getElementUnallowedRoles=function(t,e){var n=!(1<arguments.length&&void 0!==e)||e,r=t.nodeName.toUpperCase();if(!axe.utils.isHtmlElement(t))return[];var a=function(e){var t=[];if(!e)return t;if(e.hasAttribute(\"role\")){var n=axe.utils.tokenList(e.getAttribute(\"role\").toLowerCase());t=t.concat(n)}if(e.hasAttributeNS(\"http://www.idpf.org/2007/ops\",\"type\")){var r=axe.utils.tokenList(e.getAttributeNS(\"http://www.idpf.org/2007/ops\",\"type\").toLowerCase()).map(function(e){return\"doc-\".concat(e)});t=t.concat(r)}return t=t.filter(function(e){return axe.commons.aria.isValidRole(e)})}(t),o=axe.commons.aria.implicitRole(t);return a.filter(function(e){return(!n||e!==o)&&(!(n||\"row\"===e&&\"TR\"===r&&axe.utils.matchesSelector(t,'table[role=\"grid\"] > tr'))||!l.isAriaRoleAllowedOnElement(t,e))})},l.getOwnedVirtual=function(e){var t=e.actualNode,n=e.children;if(!t||!n)throw new Error(\"getOwnedVirtual requires a virtual node\");return h.idrefs(t,\"aria-owns\").reduce(function(e,t){if(t){var n=axe.utils.getNodeFromTree(t);e.push(n)}return e},n)},l.getRole=function(e,t){var n=1<arguments.length&&void 0!==t?t:{},r=n.noImplicit,a=n.fallback,o=n.abstracts,i=n.dpub;if(1!==(e=e.actualNode||e).nodeType)return null;var u=(e.getAttribute(\"role\")||\"\").trim().toLowerCase(),s=(a?axe.utils.tokenList(u):[u]).filter(function(e){return!(!i&&\"doc-\"===e.substr(0,4))&&l.isValidRole(e,{allowAbstract:o})})[0];return s||r?s||null:l.implicitRole(e)};var a,u=/^idrefs?$/;function c(e){return e.getPropertyValue(\"font-family\").split(/[,;]/g).map(function(e){return e.trim().toLowerCase()})}function d(e,t){var n={TD:[\"TR\",\"TBODY\"],TH:[\"TR\",\"THEAD\"],INPUT:[\"LABEL\"]},r=e.map(function(e){return e.nodeName}),a=e;for(var o in n)if(r.includes(o))for(var i in n[o])if(o.hasOwnProperty(i)){var u=axe.commons.dom.findUp(t,n[o][i]);if(u&&-1===e.indexOf(u))axe.commons.dom.visuallyOverlaps(t.getBoundingClientRect(),u)&&a.splice(r.indexOf(o)+1,0,u);t.nodeName===n[o][i]&&-1===r.indexOf(t.nodeName)&&a.splice(r.indexOf(o)+1,0,t)}return a}function m(e,t){var n=e.getClientRects()[0],r=h.shadowElementsFromPoint(n.left,n.top);if(r)for(var a=0;a<r.length;a++)if(r[a]!==e&&r[a]===t)return!0;return!1}l.isAccessibleRef=function(e){e=e.actualNode||e;var t=h.getRootNode(e);t=t.documentElement||t;var n=e.id;axe._cache.get(\"idRefs\")||(axe._cache.set(\"idRefs\",{}),function e(n,t){n.hasAttribute&&(\"LABEL\"===n.nodeName.toUpperCase()&&n.hasAttribute(\"for\")&&(axe._cache.get(\"idRefs\")[n.getAttribute(\"for\")]=!0),t.filter(function(e){return n.hasAttribute(e)}).forEach(function(e){var t=n.getAttribute(e);axe.utils.tokenList(t).forEach(function(e){axe._cache.get(\"idRefs\")[e]=!0})}));for(var r=0;r<n.children.length;r++)e(n.children[r],t)}(t,Object.keys(l.lookupTable.attributes).filter(function(e){var t=l.lookupTable.attributes[e].type;return u.test(t)})));return!0===axe._cache.get(\"idRefs\")[n]},l.isAriaRoleAllowedOnElement=function(e,t){var n=e.nodeName.toUpperCase(),r=axe.commons.aria.lookupTable;if(i(e,r.elementsAllowedNoRole))return!1;if(i(e,r.elementsAllowedAnyRole))return!0;var a=r.role[t];if(!a||!a.allowedElements)return!1;var o=i(e,a.allowedElements);return Object.keys(r.evaluateRoleForElement).includes(n)?r.evaluateRoleForElement[n]({node:e,role:t,out:o}):o},l.isUnsupportedRole=function(e){var t=l.lookupTable.role[e];return!!t&&t.unsupported},l.labelVirtual=function(e){var t,n=e.actualNode;return n.getAttribute(\"aria-labelledby\")&&(t=h.idrefs(n,\"aria-labelledby\").map(function(e){var t=axe.utils.getNodeFromTree(e);return t?g.visibleVirtual(t,!0):\"\"}).join(\" \").trim())?t:(t=(t=n.getAttribute(\"aria-label\"))&&g.sanitize(t).trim())?t:null},l.label=function(e){return e=axe.utils.getNodeFromTree(e),l.labelVirtual(e)},l.namedFromContents=function(e,t){var n=(1<arguments.length&&void 0!==t?t:{}).strict;if(1!==(e=e.actualNode||e).nodeType)return!1;var r=l.getRole(e),a=l.lookupTable.role[r];return!!(a&&a.nameFrom.includes(\"contents\")||\"TABLE\"===e.nodeName.toUpperCase())||!n&&(!a||[\"presentation\",\"none\"].includes(r))},l.isValidRole=function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},n=t.allowAbstract,r=t.flagUnsupported,a=void 0!==r&&r,o=l.lookupTable.role[e],i=!!o&&o.unsupported;return!(!o||a&&i)&&(!!n||\"abstract\"!==o.type)},l.getRolesWithNameFromContents=function(){return Object.keys(l.lookupTable.role).filter(function(e){return l.lookupTable.role[e].nameFrom&&-1!==l.lookupTable.role[e].nameFrom.indexOf(\"contents\")})},l.getRolesByType=function(t){return Object.keys(l.lookupTable.role).filter(function(e){return l.lookupTable.role[e].type===t})},l.getRoleType=function(e){var t=l.lookupTable.role[e];return t&&t.type||null},l.requiredOwned=function(e){\"use strict\";var t=null,n=l.lookupTable.role[e];return n&&(t=axe.utils.clone(n.owned)),t},l.requiredContext=function(e){\"use strict\";var t=null,n=l.lookupTable.role[e];return n&&(t=axe.utils.clone(n.context)),t},l.implicitNodes=function(e){\"use strict\";var t=null,n=l.lookupTable.role[e];return n&&n.implicit&&(t=axe.utils.clone(n.implicit)),t},l.implicitRole=function(n){\"use strict\";var e=Object.keys(l.lookupTable.role).map(function(e){var t=l.lookupTable.role[e];return{name:e,implicit:t&&t.implicit}}).reduce(function(e,t){return t.implicit&&t.implicit.some(function(e){return axe.utils.matchesSelector(n,e)})&&e.push(t.name),e},[]);if(!e.length)return null;for(var r,t=axe.utils.getNodeAttributes(n),a=[],o=0,i=t.length;o<i;o++){var u=t[o];u.name.match(/^aria-/)&&a.push(u.name)}return(r=a,e.map(function(e){return{score:function(e){return l.allowedAttr(e).reduce(function(e,t){return e+(-1<r.indexOf(t)?1:0)},0)}(e),name:e}}).sort(function(e,t){return t.score-e.score}).map(function(e){return e.name})).shift()},l.validateAttrValue=function(e,t){\"use strict\";var n,r,a=e.getAttribute(t),o=l.lookupTable.attributes[t],i=h.getRootNode(e);if(!o)return!0;if(o.allowEmpty&&(!a||\"\"===a.trim()))return!0;switch(o.type){case\"boolean\":case\"nmtoken\":return\"string\"==typeof a&&o.values.includes(a.toLowerCase());case\"nmtokens\":return(r=axe.utils.tokenList(a)).reduce(function(e,t){return e&&o.values.includes(t)},0!==r.length);case\"idref\":return!(!a||!i.getElementById(a));case\"idrefs\":return(r=axe.utils.tokenList(a)).some(function(e){return i.getElementById(e)});case\"string\":return\"\"!==a.trim();case\"decimal\":return!(!(n=a.match(/^[-+]?([0-9]*)\\.?([0-9]*)$/))||!n[1]&&!n[2]);case\"int\":return/^[-+]?[0-9]+$/.test(a)}},s.centerPointOfRect=function(e){if(!(e.left>window.innerWidth)&&!(e.top>window.innerHeight))return{x:Math.min(Math.ceil(e.left+e.width/2),window.innerWidth-1),y:Math.min(Math.ceil(e.top+e.height/2),window.innerHeight-1)}},s.Color=function(e,t,n,r){this.red=e,this.green=t,this.blue=n,this.alpha=r,this.toHexString=function(){var e=Math.round(this.red).toString(16),t=Math.round(this.green).toString(16),n=Math.round(this.blue).toString(16);return\"#\"+(15.5<this.red?e:\"0\"+e)+(15.5<this.green?t:\"0\"+t)+(15.5<this.blue?n:\"0\"+n)};var a=/^rgb\\((\\d+), (\\d+), (\\d+)\\)$/,o=/^rgba\\((\\d+), (\\d+), (\\d+), (\\d*(\\.\\d+)?)\\)/;this.parseRgbString=function(e){if(\"transparent\"===e)return this.red=0,this.green=0,this.blue=0,void(this.alpha=0);var t=e.match(a);return t?(this.red=parseInt(t[1],10),this.green=parseInt(t[2],10),this.blue=parseInt(t[3],10),void(this.alpha=1)):(t=e.match(o))?(this.red=parseInt(t[1],10),this.green=parseInt(t[2],10),this.blue=parseInt(t[3],10),void(this.alpha=Math.round(100*parseFloat(t[4]))/100)):void 0},this.getRelativeLuminance=function(){var e=this.red/255,t=this.green/255,n=this.blue/255;return.2126*(e<=.03928?e/12.92:Math.pow((.055+e)/1.055,2.4))+.7152*(t<=.03928?t/12.92:Math.pow((.055+t)/1.055,2.4))+.0722*(n<=.03928?n/12.92:Math.pow((.055+n)/1.055,2.4))}},s.flattenColors=function(e,t){var n=e.alpha,r=(1-n)*t.red+n*e.red,a=(1-n)*t.green+n*e.green,o=(1-n)*t.blue+n*e.blue,i=e.alpha+t.alpha*(1-e.alpha);return new s.Color(r,a,o,i)},s.getContrast=function(e,t){if(!t||!e)return null;t.alpha<1&&(t=s.flattenColors(t,e));var n=e.getRelativeLuminance(),r=t.getRelativeLuminance();return(Math.max(r,n)+.05)/(Math.min(r,n)+.05)},s.hasValidContrastRatio=function(e,t,n,r){var a=s.getContrast(e,t),o=r&&Math.ceil(72*n)/96<14||!r&&Math.ceil(72*n)/96<18?4.5:3;return{isValid:o<a,contrastRatio:a,expectedContrastRatio:o}},s.elementHasImage=function(e,t){var n=e.nodeName.toUpperCase();if([\"IMG\",\"CANVAS\",\"OBJECT\",\"IFRAME\",\"VIDEO\",\"SVG\"].includes(n))return axe.commons.color.incompleteData.set(\"bgColor\",\"imgNode\"),!0;var r=(t=t||window.getComputedStyle(e)).getPropertyValue(\"background-image\"),a=\"none\"!==r;if(a){var o=/gradient/.test(r);axe.commons.color.incompleteData.set(\"bgColor\",o?\"bgGradient\":\"bgImage\")}return a},s.elementIsDistinct=function(e,t){var r=window.getComputedStyle(e);if(\"none\"!==r.getPropertyValue(\"background-image\"))return!0;if([\"border-bottom\",\"border-top\",\"outline\"].reduce(function(e,t){var n=new s.Color;return n.parseRgbString(r.getPropertyValue(t+\"-color\")),e||\"none\"!==r.getPropertyValue(t+\"-style\")&&0<parseFloat(r.getPropertyValue(t+\"-width\"))&&0!==n.alpha},!1))return!0;var n=window.getComputedStyle(t);if(c(r)[0]!==c(n)[0])return!0;var a=[\"text-decoration-line\",\"text-decoration-style\",\"font-weight\",\"font-style\",\"font-size\"].reduce(function(e,t){return e||r.getPropertyValue(t)!==n.getPropertyValue(t)},!1),o=r.getPropertyValue(\"text-decoration\");return o.split(\" \").length<3&&(a=a||o!==n.getPropertyValue(\"text-decoration\")),a},s.getBackgroundColor=function(r,e,t){var a=1<arguments.length&&void 0!==e?e:[];if(!0!==(2<arguments.length&&void 0!==t&&t)){var n=r.getBoundingClientRect().height-2>=2*window.innerHeight;r.scrollIntoView(n)}var o=[],i=s.getBackgroundStack(r);return(i||[]).some(function(e){var t=window.getComputedStyle(e),n=s.getOwnBackgroundColor(t);return function(e,t,n){var r=e!==t&&!h.visuallyContains(e,t)&&0!==n.alpha;r&&axe.commons.color.incompleteData.set(\"bgColor\",\"elmPartiallyObscured\");return r}(r,e,n)||s.elementHasImage(e,t)?(o=null,a.push(e),!0):0!==n.alpha&&(a.push(e),o.push(n),1===n.alpha)}),null===o||null===i?null:(o.push(new s.Color(255,255,255,1)),o.reduce(s.flattenColors))},s.getBackgroundStack=function(e){var t=s.filteredRectStack(e);if(null===t)return null;t=d(t,e);var n=(t=function(e){var t=e.indexOf(document.body),n=e;(1<t||-1===t)&&!s.elementHasImage(document.documentElement)&&0===s.getOwnBackgroundColor(window.getComputedStyle(document.documentElement)).alpha&&(1<t&&n.splice(t,1),n.splice(e.indexOf(document.documentElement),1),n.push(document.body));return n}(t=h.reduceToElementsBelowFloating(t,e))).indexOf(e);return.99<=function(e,t,n){var r=0;if(0<e)for(var a=e-1;0<=a;a--){var o=t[a],i=window.getComputedStyle(o),u=s.getOwnBackgroundColor(i);u.alpha&&m(n,o)?r+=u.alpha:t.splice(a,1)}return r}(n,t,e)?(axe.commons.color.incompleteData.set(\"bgColor\",\"bgOverlap\"),null):-1!==n?t:null},s.filteredRectStack=function(a){var o=s.getRectStack(a);if(o&&1===o.length)return o[0];if(o&&1<o.length){var i,u=o.shift();return d(u,a),o.forEach(function(e,t){if(0!==t){var n=o[t-1],r=o[t];i=n.every(function(e,t){return e===r[t]})||u.includes(a)}}),i?o[0]:(axe.commons.color.incompleteData.set(\"bgColor\",\"elmPartiallyObscuring\"),null)}return axe.commons.color.incompleteData.set(\"bgColor\",\"outsideViewport\"),null},s.getRectStack=function(e){var t=axe.commons.color.centerPointOfRect(e.getBoundingClientRect());if(!t)return null;var n=h.shadowElementsFromPoint(t.x,t.y),r=Array.from(e.getClientRects());if(!r||r.length<=1)return[n];var a=r.filter(function(e){return e.width&&0<e.width}).map(function(e){var t=axe.commons.color.centerPointOfRect(e);if(t)return h.shadowElementsFromPoint(t.x,t.y)});return a.some(function(e){return void 0===e})?null:(a.splice(0,0,n),a)},h.isOpaque=function(e){var t=window.getComputedStyle(e);return s.elementHasImage(e,t)||1===s.getOwnBackgroundColor(t).alpha},s.getForegroundColor=function(e,t){var n=window.getComputedStyle(e),r=new s.Color;r.parseRgbString(n.getPropertyValue(\"color\"));var a=n.getPropertyValue(\"opacity\");if(r.alpha=r.alpha*a,1===r.alpha)return r;var o=s.getBackgroundColor(e,[],t);if(null!==o)return s.flattenColors(r,o);var i=axe.commons.color.incompleteData.get(\"bgColor\");return axe.commons.color.incompleteData.set(\"fgColor\",i),null},s.getOwnBackgroundColor=function(e){var t=new s.Color;if(t.parseRgbString(e.getPropertyValue(\"background-color\")),0!==t.alpha){var n=e.getPropertyValue(\"opacity\");t.alpha=t.alpha*n}return t},s.incompleteData=(a={},{set:function(e,t){if(\"string\"!=typeof e)throw new Error(\"Incomplete data: key must be a string\");return t&&(a[e]=t),a[e]},get:function(e){return a[e]},clear:function(){a={}}}),h.reduceToElementsBelowFloating=function(e,t){var n,r,a,o=[\"fixed\",\"sticky\"],i=[],u=!1;for(n=0;n<e.length;++n)(r=e[n])===t&&(u=!0),a=window.getComputedStyle(r),u||-1===o.indexOf(a.position)?i.push(r):i=[];return i},h.findElmsInContext=function(e){var t,n=e.context,r=e.value,a=e.attr,o=e.elm,i=void 0===o?\"\":o,u=axe.utils.escapeSelector(r);return t=9===n.nodeType||11===n.nodeType?n:h.getRootNode(n),Array.from(t.querySelectorAll(i+\"[\"+a+\"=\"+u+\"]\"))},h.findUp=function(e,t){return h.findUpVirtual(axe.utils.getNodeFromTree(e),t)},h.findUpVirtual=function(e,t){var n;if(n=e.actualNode,!e.shadowId&&\"function\"==typeof e.actualNode.closest){var r=e.actualNode.closest(t);return r||null}for(;(n=n.assignedSlot?n.assignedSlot:n.parentNode)&&11===n.nodeType&&(n=n.host),n&&!axe.utils.matchesSelector(n,t)&&n!==document.documentElement;);return n&&axe.utils.matchesSelector(n,t)?n:null},h.getComposedParent=function e(t){if(t.assignedSlot)return e(t.assignedSlot);if(t.parentNode){var n=t.parentNode;if(1===n.nodeType)return n;if(n.host)return n.host}return null},h.getElementByReference=function(e,t){var n=e.getAttribute(t);if(!n)return null;\"#\"===n.charAt(0)?n=decodeURIComponent(n.substring(1)):\"/#\"===n.substr(0,2)&&(n=decodeURIComponent(n.substring(2)));var r=document.getElementById(n);return r||((r=document.getElementsByName(n)).length?r[0]:null)},h.getElementCoordinates=function(e){\"use strict\";var t=h.getScrollOffset(document),n=t.left,r=t.top,a=e.getBoundingClientRect();return{top:a.top+r,right:a.right+n,bottom:a.bottom+r,left:a.left+n,width:a.right-a.left,height:a.bottom-a.top}},h.getRootNode=axe.utils.getRootNode,h.getScrollOffset=function(e){\"use strict\";if(!e.nodeType&&e.document&&(e=e.document),9!==e.nodeType)return{left:e.scrollLeft,top:e.scrollTop};var t=e.documentElement,n=e.body;return{left:t&&t.scrollLeft||n&&n.scrollLeft||0,top:t&&t.scrollTop||n&&n.scrollTop||0}},h.getTabbableElements=function(e){return axe.utils.querySelectorAll(e,\"*\").filter(function(e){var t=e.isFocusable,n=e.actualNode.getAttribute(\"tabindex\");return(n=n&&!isNaN(parseInt(n,10))?parseInt(n):null)?t&&0<=n:t})},h.getViewportSize=function(e){\"use strict\";var t,n=e.document,r=n.documentElement;return e.innerWidth?{width:e.innerWidth,height:e.innerHeight}:r?{width:r.clientWidth,height:r.clientHeight}:{width:(t=n.body).clientWidth,height:t.clientHeight}};var p=[\"HEAD\",\"TITLE\",\"TEMPLATE\",\"SCRIPT\",\"STYLE\",\"IFRAME\",\"OBJECT\",\"VIDEO\",\"AUDIO\",\"NOSCRIPT\"];function f(e){return e.disabled||h.isHiddenWithCSS(e)&&\"AREA\"!==e.nodeName.toUpperCase()}h.hasContentVirtual=function(e,t,n){return function(e){if(!p.includes(e.actualNode.nodeName.toUpperCase()))return e.children.some(function(e){var t=e.actualNode;return 3===t.nodeType&&t.nodeValue.trim()})}(e)||h.isVisualContent(e.actualNode)||!!n||!!l.labelVirtual(e)||!t&&e.children.some(function(e){return 1===e.actualNode.nodeType&&h.hasContentVirtual(e)})},h.hasContent=function(e,t,n){return e=axe.utils.getNodeFromTree(e),h.hasContentVirtual(e,t,n)},h.idrefs=function(e,t){\"use strict\";var n,r,a=h.getRootNode(e),o=[],i=e.getAttribute(t);if(i)for(n=0,r=(i=axe.utils.tokenList(i)).length;n<r;n++)o.push(a.getElementById(i[n]));return o},h.isFocusable=function(e){\"use strict\";if(f(e))return!1;if(h.isNativelyFocusable(e))return!0;var t=e.getAttribute(\"tabindex\");return!(!t||isNaN(parseInt(t,10)))},h.isNativelyFocusable=function(e){\"use strict\";if(!e||f(e))return!1;switch(e.nodeName.toUpperCase()){case\"A\":case\"AREA\":if(e.href)return!0;break;case\"INPUT\":return\"hidden\"!==e.type;case\"TEXTAREA\":case\"SELECT\":case\"DETAILS\":case\"BUTTON\":return!0}return!1},h.insertedIntoFocusOrder=function(e){return-1<e.tabIndex&&h.isFocusable(e)&&!h.isNativelyFocusable(e)},h.isHiddenWithCSS=function(e,t){if(9===e.nodeType)return!1;if(11===e.nodeType&&(e=e.host),[\"STYLE\",\"SCRIPT\"].includes(e.nodeName.toUpperCase()))return!1;var n=window.getComputedStyle(e,null);if(!n)throw new Error(\"Style does not exist for the given element.\");if(\"none\"===n.getPropertyValue(\"display\"))return!0;var r=[\"hidden\",\"collapse\"],a=n.getPropertyValue(\"visibility\");if(r.includes(a)&&!t)return!0;if(r.includes(a)&&t&&r.includes(t))return!0;var o=h.getComposedParent(e);return!(!o||r.includes(a))&&h.isHiddenWithCSS(o,a)},h.isHTML5=function(e){var t=e.doctype;return null!==t&&(\"html\"===t.name&&!t.publicId&&!t.systemId)};var b=[\"block\",\"list-item\",\"table\",\"flex\",\"grid\",\"inline-block\"];function y(e){var t=window.getComputedStyle(e).getPropertyValue(\"display\");return b.includes(t)||\"table-\"===t.substr(0,6)}h.isInTextBlock=function(n){if(y(n))return!1;var e=function(e){for(var t=h.getComposedParent(e);t&&!y(t);)t=h.getComposedParent(t);return axe.utils.getNodeFromTree(t)}(n),r=\"\",a=\"\",o=0;return function t(e,n){!1!==n(e.actualNode)&&e.children.forEach(function(e){return t(e,n)})}(e,function(e){if(2===o)return!1;if(3===e.nodeType&&(r+=e.nodeValue),1===e.nodeType){var t=(e.nodeName||\"\").toUpperCase();if([\"BR\",\"HR\"].includes(t))0===o?a=r=\"\":o=2;else{if(\"none\"===e.style.display||\"hidden\"===e.style.overflow||![\"\",null,\"none\"].includes(e.style.float)||![\"\",null,\"relative\"].includes(e.style.position))return!1;if(\"A\"===t&&e.href||\"link\"===(e.getAttribute(\"role\")||\"\").toLowerCase())return e===n&&(o=1),a+=e.textContent,!1}}}),r=axe.commons.text.sanitize(r),a=axe.commons.text.sanitize(a),r.length>a.length},h.isNode=function(e){\"use strict\";return e instanceof Node},h.isOffscreen=function(e){var t,n=document.documentElement,r=window.getComputedStyle(e),a=window.getComputedStyle(document.body||n).getPropertyValue(\"direction\"),o=h.getElementCoordinates(e);if(o.bottom<0&&(function(e,t){for(e=h.getComposedParent(e);e&&\"html\"!==e.nodeName.toLowerCase();){if(e.scrollTop&&0<=(t+=e.scrollTop))return!1;e=h.getComposedParent(e)}return!0}(e,o.bottom)||\"absolute\"===r.position))return!0;if(0===o.left&&0===o.right)return!1;if(\"ltr\"===a){if(o.right<=0)return!0}else if(t=Math.max(n.scrollWidth,h.getViewportSize(window).width),o.left>=t)return!0;return!1};var v=/^\\/?#[^/!]/;h.isSkipLink=function(e){return!!v.test(e.getAttribute(\"href\"))&&(void 0!==axe._cache.get(\"firstPageLink\")?t=axe._cache.get(\"firstPageLink\"):(t=axe.utils.querySelectorAll(axe._tree,'a:not([href^=\"#\"]):not([href^=\"/#\"]):not([href^=\"javascript\"])')[0],axe._cache.set(\"firstPageLink\",t||null)),!t||e.compareDocumentPosition(t.actualNode)===e.DOCUMENT_POSITION_FOLLOWING);var t},h.isVisible=function(e,t,n){\"use strict\";var r=axe.utils.getNodeFromTree(e),a=\"_isVisible\"+(t?\"ScreenReader\":\"\");if(9===e.nodeType)return!0;if(11===e.nodeType&&(e=e.host),r&&void 0!==r[a])return r[a];var o=window.getComputedStyle(e,null);if(null===o)return!1;var i=e.nodeName.toUpperCase();if(\"none\"===o.getPropertyValue(\"display\")||[\"STYLE\",\"SCRIPT\",\"NOSCRIPT\",\"TEMPLATE\"].includes(i)||!t&&function(e){\"use strict\";var t=e.match(/rect\\s*\\(([0-9]+)px,?\\s*([0-9]+)px,?\\s*([0-9]+)px,?\\s*([0-9]+)px\\s*\\)/);return!(!t||5!==t.length)&&(t[3]-t[1]<=0&&t[2]-t[4]<=0)}(o.getPropertyValue(\"clip\"))||!n&&(\"hidden\"===o.getPropertyValue(\"visibility\")||!t&&h.isOffscreen(e))||t&&\"true\"===e.getAttribute(\"aria-hidden\"))return!1;var u=e.assignedSlot?e.assignedSlot:e.parentNode,s=!1;return u&&(s=h.isVisible(u,t,!0)),r&&(r[a]=s),s};var D=[\"checkbox\",\"img\",\"radio\",\"range\",\"slider\",\"spinbutton\",\"textbox\"];h.isVisualContent=function(e){var t=e.getAttribute(\"role\");if(t)return-1!==D.indexOf(t);switch(e.nodeName.toUpperCase()){case\"IMG\":case\"IFRAME\":case\"OBJECT\":case\"VIDEO\":case\"AUDIO\":case\"CANVAS\":case\"SVG\":case\"MATH\":case\"BUTTON\":case\"SELECT\":case\"TEXTAREA\":case\"KEYGEN\":case\"PROGRESS\":case\"METER\":return!0;case\"INPUT\":return\"hidden\"!==e.type;default:return!1}},h.shadowElementsFromPoint=function(r,a){var t=2<arguments.length&&void 0!==arguments[2]?arguments[2]:document,o=3<arguments.length&&void 0!==arguments[3]?arguments[3]:0;if(999<o)throw new Error(\"Infinite loop detected\");return Array.from(t.elementsFromPoint(r,a)).filter(function(e){return h.getRootNode(e)===t}).reduce(function(e,t){if(axe.utils.isShadowRoot(t)){var n=h.shadowElementsFromPoint(r,a,t.shadowRoot,o+1);(e=e.concat(n)).length&&axe.commons.dom.visuallyContains(e[0],t)&&e.push(t)}else e.push(t);return e},[])},h.visuallyContains=function(e,t){var n=e.getBoundingClientRect(),r=n.top+.01,a=n.bottom-.01,o=n.left+.01,i=n.right-.01,u=t.getBoundingClientRect(),s=u.top,l=u.left,c=s-t.scrollTop,d=s-t.scrollTop+t.scrollHeight,m=l-t.scrollLeft,p=l-t.scrollLeft+t.scrollWidth,f=window.getComputedStyle(t);return\"inline\"===f.getPropertyValue(\"display\")||!(o<m&&o<u.left||r<c&&r<u.top||p<i&&i>u.right||d<a&&a>u.bottom)&&(!(i>u.right||a>u.bottom)||(\"scroll\"===f.overflow||\"auto\"===f.overflow||\"hidden\"===f.overflow||t instanceof HTMLBodyElement||t instanceof HTMLHtmlElement))},h.visuallyOverlaps=function(e,t){var n=t.getBoundingClientRect(),r=n.top,a=n.left,o=r-t.scrollTop,i=r-t.scrollTop+t.scrollHeight,u=a-t.scrollLeft,s=a-t.scrollLeft+t.scrollWidth;if(e.left>s&&e.left>n.right||e.top>i&&e.top>n.bottom||e.right<u&&e.right<n.left||e.bottom<o&&e.bottom<n.top)return!1;var l=window.getComputedStyle(t);return!(e.left>n.right||e.top>n.bottom)||(\"scroll\"===l.overflow||\"auto\"===l.overflow||t instanceof HTMLBodyElement||t instanceof HTMLHtmlElement)},r.isAriaCombobox=function(e){return\"combobox\"===axe.commons.aria.getRole(e,{noImplicit:!0})},r.isAriaListbox=function(e){return\"listbox\"===axe.commons.aria.getRole(e,{noImplicit:!0})};var w=[\"progressbar\",\"scrollbar\",\"slider\",\"spinbutton\"];r.isAriaRange=function(e){var t=axe.commons.aria.getRole(e,{noImplicit:!0});return w.includes(t)},r.isAriaTextbox=function(e){return\"textbox\"===axe.commons.aria.getRole(e,{noImplicit:!0})},r.isNativeSelect=function(e){return\"SELECT\"===e.nodeName.toUpperCase()};var k=[\"button\",\"checkbox\",\"color\",\"file\",\"hidden\",\"image\",\"password\",\"radio\",\"reset\",\"submit\"];r.isNativeTextbox=function(e){var t=e.nodeName.toUpperCase();return\"TEXTAREA\"===t||\"INPUT\"===t&&!k.includes(e.type)},i.attributes=function(t,e){return t=t.actualNode||t,i.fromFunction(function(e){return t.getAttribute(e)},e)},i.condition=function(e,t){return!!t(e)};var x,E=[\"nodeName\",\"attributes\",\"properties\",\"condition\"];function C(e){var t=e.actualNode;return 3!==t.nodeType?\"\":t.textContent}i.fromDefinition=function(r,a){return r=r.actualNode||r,Array.isArray(a)?a.some(function(e){return i(r,e)}):\"string\"==typeof a?axe.utils.matchesSelector(r,a):Object.keys(a).every(function(e){if(!E.includes(e))throw new Error('Unknown matcher type \"'.concat(e,'\"'));var t=i[e],n=a[e];return t(r,n)})},i.fromFunction=function(t,n){if(\"object\"!==S(n)||Array.isArray(n)||n instanceof RegExp)throw new Error(\"Expect matcher to be an object\");return Object.keys(n).every(function(e){return i.fromPrimative(t(e),n[e])})},i.fromPrimative=function(e,t){var n=S(t);return Array.isArray(t)&&void 0!==e?t.includes(e):\"function\"===n?!!t(e):t instanceof RegExp?t.test(e):t===e},i.nodeName=function(e,t,n){var r=(2<arguments.length&&void 0!==n?n:{}).isXHTML;if(e=e.actualNode||e,void 0===r){if(\"string\"==typeof t)return axe.utils.matchesSelector(e,t);void 0===x&&(x=axe.utils.isXHTML(e.ownerDocument)),r=x}var a=r?e.nodeName:e.nodeName.toLowerCase();return i.fromPrimative(a,t)},i.properties=function(t,e){return t=t.actualNode||t,i.fromFunction(function(e){return t[e]},e)},o.getAllCells=function(e){var t,n,r,a,o=[];for(t=0,r=e.rows.length;t<r;t++)for(n=0,a=e.rows[t].cells.length;n<a;n++)o.push(e.rows[t].cells[n]);return o},o.getCellPosition=function(e,t){var n,r;for(t=t||o.toGrid(h.findUp(e,\"table\")),n=0;n<t.length;n++)if(t[n]&&-1!==(r=t[n].indexOf(e)))return{x:r,y:n}},o.getHeaders=function(e){if(e.hasAttribute(\"headers\"))return commons.dom.idrefs(e,\"headers\");var t=commons.table.toGrid(commons.dom.findUp(e,\"table\")),n=commons.table.getCellPosition(e,t),r=o.traverse(\"left\",n,t).filter(function(e){return o.isRowHeader(e)}),a=o.traverse(\"up\",n,t).filter(function(e){return o.isColumnHeader(e)});return[].concat(r,a).reverse()},o.getScope=function(e){var t=e.getAttribute(\"scope\"),n=e.getAttribute(\"role\");if(e instanceof Element==!1||-1===[\"TD\",\"TH\"].indexOf(e.nodeName.toUpperCase()))throw new TypeError(\"Expected TD or TH element\");if(\"columnheader\"===n)return\"col\";if(\"rowheader\"===n)return\"row\";if(\"col\"===t||\"row\"===t)return t;if(\"TH\"!==e.nodeName.toUpperCase())return!1;var r=o.toGrid(h.findUp(e,\"table\")),a=o.getCellPosition(e);return r[a.y].reduce(function(e,t){return e&&\"TH\"===t.nodeName.toUpperCase()},!0)?\"col\":r.map(function(e){return e[a.x]}).reduce(function(e,t){return e&&t&&\"TH\"===t.nodeName.toUpperCase()},!0)?\"row\":\"auto\"},o.isColumnHeader=function(e){return-1!==[\"col\",\"auto\"].indexOf(o.getScope(e))},o.isDataCell=function(e){if(!e.children.length&&!e.textContent.trim())return!1;var t=e.getAttribute(\"role\");return axe.commons.aria.isValidRole(t)?[\"cell\",\"gridcell\"].includes(t):\"TD\"===e.nodeName.toUpperCase()},o.isDataTable=function(e){var t=(e.getAttribute(\"role\")||\"\").toLowerCase();if((\"presentation\"===t||\"none\"===t)&&!h.isFocusable(e))return!1;if(\"true\"===e.getAttribute(\"contenteditable\")||h.findUp(e,'[contenteditable=\"true\"]'))return!0;if(\"grid\"===t||\"treegrid\"===t||\"table\"===t)return!0;if(\"landmark\"===commons.aria.getRoleType(t))return!0;if(\"0\"===e.getAttribute(\"datatable\"))return!1;if(e.getAttribute(\"summary\"))return!0;if(e.tHead||e.tFoot||e.caption)return!0;for(var n=0,r=e.children.length;n<r;n++)if(\"COLGROUP\"===e.children[n].nodeName.toUpperCase())return!0;for(var a,o,i=0,u=e.rows.length,s=!1,l=0;l<u;l++)for(var c=0,d=(a=e.rows[l]).cells.length;c<d;c++){if(\"TH\"===(o=a.cells[c]).nodeName.toUpperCase())return!0;if(s||o.offsetWidth===o.clientWidth&&o.offsetHeight===o.clientHeight||(s=!0),o.getAttribute(\"scope\")||o.getAttribute(\"headers\")||o.getAttribute(\"abbr\"))return!0;if([\"columnheader\",\"rowheader\"].includes((o.getAttribute(\"role\")||\"\").toLowerCase()))return!0;if(1===o.children.length&&\"ABBR\"===o.children[0].nodeName.toUpperCase())return!0;i++}if(e.getElementsByTagName(\"table\").length)return!1;if(u<2)return!1;var m,p,f=e.rows[Math.ceil(u/2)];if(1===f.cells.length&&1===f.cells[0].colSpan)return!1;if(5<=f.cells.length)return!0;if(s)return!0;for(l=0;l<u;l++){if(a=e.rows[l],m&&m!==window.getComputedStyle(a).getPropertyValue(\"background-color\"))return!0;if(m=window.getComputedStyle(a).getPropertyValue(\"background-color\"),p&&p!==window.getComputedStyle(a).getPropertyValue(\"background-image\"))return!0;p=window.getComputedStyle(a).getPropertyValue(\"background-image\")}return 20<=u||!(h.getElementCoordinates(e).width>.95*h.getViewportSize(window).width)&&(!(i<10)&&!e.querySelector(\"object, embed, iframe, applet\"))},o.isHeader=function(e){if(o.isColumnHeader(e)||o.isRowHeader(e))return!0;if(e.getAttribute(\"id\")){var t=axe.utils.escapeSelector(e.getAttribute(\"id\"));return!!document.querySelector('[headers~=\"'.concat(t,'\"]'))}return!1},o.isRowHeader=function(e){return[\"row\",\"auto\"].includes(o.getScope(e))},o.toGrid=function(e){for(var t=[],n=e.rows,r=0,a=n.length;r<a;r++){var o=n[r].cells;t[r]=t[r]||[];for(var i=0,u=0,s=o.length;u<s;u++)for(var l=0;l<o[u].colSpan;l++){for(var c=0;c<o[u].rowSpan;c++){for(t[r+c]=t[r+c]||[];t[r+c][i];)i++;t[r+c][i]=o[u]}i++}}return t},o.toArray=o.toGrid,o.traverse=function(e,t,n,r){if(Array.isArray(t)&&(r=n,n=t,t={x:0,y:0}),\"string\"==typeof e)switch(e){case\"left\":e={x:-1,y:0};break;case\"up\":e={x:0,y:-1};break;case\"right\":e={x:1,y:0};break;case\"down\":e={x:0,y:1}}return function e(t,n,r,a){var o,i=r[n.y]?r[n.y][n.x]:void 0;return i?\"function\"==typeof a&&!0===(o=a(i,n,r))?[i]:((o=e(t,{x:n.x+t.x,y:n.y+t.y},r,a)).unshift(i),o):[]}(e,{x:t.x+e.x,y:t.y+e.y},n,r)},g.accessibleText=function(e,t){var n=axe.utils.getNodeFromTree(e);return g.accessibleTextVirtual(n,t)},g.accessibleTextVirtual=function(n,e){var r=1<arguments.length&&void 0!==e?e:{},t=n.actualNode;if(r=function(e,t){var n=e.actualNode;t.startNode||(t=R({startNode:e},t));1===n.nodeType&&t.inLabelledByContext&&void 0===t.includeHidden&&(t=R({includeHidden:!h.isVisible(n,!0)},t));return t}(n,r),function(e,t){var n=e.actualNode;if(1!==n.nodeType||t.includeHidden)return!1;return!h.isVisible(n,!0)}(n,r))return\"\";var a=[l.arialabelledbyText,l.arialabelText,g.nativeTextAlternative,g.formControlValue,g.subtreeText,C,g.titleText].reduce(function(e,t){return\"\"!==e?e:t(n,r)},\"\");return r.startNode===n&&(a=g.sanitize(a)),r.debug&&axe.log(a||\"{empty-value}\",t,r),a},g.accessibleTextVirtual.alreadyProcessed=function(e,t){return t.processed=t.processed||[],!!t.processed.includes(e)||(t.processed.push(e),!1)};var A=[\"textbox\",\"progressbar\",\"scrollbar\",\"slider\",\"spinbutton\",\"combobox\",\"listbox\"];g.formControlValueMethods={nativeTextboxValue:function(e){if(e=e.actualNode||e,axe.commons.forms.isNativeTextbox(e))return e.value||\"\";return\"\"},nativeSelectValue:function(e){return e=e.actualNode||e,axe.commons.forms.isNativeSelect(e)&&Array.from(e.options).filter(function(e){return e.selected}).map(function(e){return e.text}).join(\" \")||\"\"},ariaTextboxValue:function(e){var t=e.actualNode;if(!axe.commons.forms.isAriaTextbox(t))return\"\";return h.isHiddenWithCSS(t)?t.textContent:g.visibleVirtual(e,!0)},ariaListboxValue:function(e,t){var n=e.actualNode;if(!axe.commons.forms.isAriaListbox(n))return\"\";var r=l.getOwnedVirtual(e).filter(function(e){return\"option\"===l.getRole(e)&&\"true\"===e.actualNode.getAttribute(\"aria-selected\")});return 0!==r.length?axe.commons.text.accessibleTextVirtual(r[0],t):\"\"},ariaComboboxValue:function(e,t){var n,r=e.actualNode;return axe.commons.forms.isAriaCombobox(r)&&(n=l.getOwnedVirtual(e).filter(function(e){return\"listbox\"===l.getRole(e)})[0])?g.formControlValueMethods.ariaListboxValue(n,t):\"\"},ariaRangeValue:function(e){if(e=e.actualNode||e,!axe.commons.forms.isAriaRange(e)||!e.hasAttribute(\"aria-valuenow\"))return\"\";var t=+e.getAttribute(\"aria-valuenow\");return isNaN(t)?\"0\":String(t)}},g.formControlValue=function(n,e){var r=1<arguments.length&&void 0!==e?e:{},t=n.actualNode,a=g.unsupported.accessibleNameFromFieldValue||[],o=l.getRole(t);if(r.startNode===n||!A.includes(o)||a.includes(o))return\"\";var i=Object.keys(g.formControlValueMethods).map(function(e){return g.formControlValueMethods[e]}).reduce(function(e,t){return e||t(n,r)},\"\");return r.debug&&axe.log(i||\"{empty-value}\",t,r),i},g.isHumanInterpretable=function(e){if(!e.length)return 0;if([\"x\",\"i\"].includes(e))return 0;var t=g.removeUnicode(e,{emoji:!0,nonBmp:!0,punctuations:!0});return g.sanitize(t)?1:0};g.autocomplete={stateTerms:[\"on\",\"off\"],standaloneTerms:[\"name\",\"honorific-prefix\",\"given-name\",\"additional-name\",\"family-name\",\"honorific-suffix\",\"nickname\",\"username\",\"new-password\",\"current-password\",\"organization-title\",\"organization\",\"street-address\",\"address-line1\",\"address-line2\",\"address-line3\",\"address-level4\",\"address-level3\",\"address-level2\",\"address-level1\",\"country\",\"country-name\",\"postal-code\",\"cc-name\",\"cc-given-name\",\"cc-additional-name\",\"cc-family-name\",\"cc-number\",\"cc-exp\",\"cc-exp-month\",\"cc-exp-year\",\"cc-csc\",\"cc-type\",\"transaction-currency\",\"transaction-amount\",\"language\",\"bday\",\"bday-day\",\"bday-month\",\"bday-year\",\"sex\",\"url\",\"photo\"],qualifiers:[\"home\",\"work\",\"mobile\",\"fax\",\"pager\"],qualifiedTerms:[\"tel\",\"tel-country-code\",\"tel-national\",\"tel-area-code\",\"tel-local\",\"tel-local-prefix\",\"tel-local-suffix\",\"tel-extension\",\"email\",\"impp\"],locations:[\"billing\",\"shipping\"]},g.isValidAutocomplete=function(e,t){var n=1<arguments.length&&void 0!==t?t:{},r=n.looseTyped,a=void 0!==r&&r,o=n.stateTerms,i=void 0===o?[]:o,u=n.locations,s=void 0===u?[]:u,l=n.qualifiers,c=void 0===l?[]:l,d=n.standaloneTerms,m=void 0===d?[]:d,p=n.qualifiedTerms,f=void 0===p?[]:p;if(e=e.toLowerCase().trim(),(i=i.concat(g.autocomplete.stateTerms)).includes(e)||\"\"===e)return!0;c=c.concat(g.autocomplete.qualifiers),s=s.concat(g.autocomplete.locations),m=m.concat(g.autocomplete.standaloneTerms),f=f.concat(g.autocomplete.qualifiedTerms);var h=e.split(/\\s+/g);if(!a&&(8<h[0].length&&\"section-\"===h[0].substr(0,8)&&h.shift(),s.includes(h[0])&&h.shift(),c.includes(h[0])&&(h.shift(),m=[]),1!==h.length))return!1;var b=h[h.length-1];return m.includes(b)||f.includes(b)},g.labelText=function(e,t){var n=1<arguments.length&&void 0!==t?t:{},r=g.accessibleTextVirtual.alreadyProcessed;if(n.inControlContext||n.inLabelledByContext||r(e,n))return\"\";n.startNode||(n.startNode=e);var a,o=R({inControlContext:!0},n),i=function(e){var t=e.actualNode;return t.id?h.findElmsInContext({elm:\"label\",attr:\"for\",value:t.id,context:t}):[]}(e),u=h.findUpVirtual(e,\"label\");return u?(a=[].concat(he(i),[u])).sort(axe.utils.nodeSorter):a=i,a.map(function(e){return g.accessibleText(e,o)}).filter(function(e){return\"\"!==e}).join(\" \")},g.labelVirtual=function(e){var t,n;if(n=l.labelVirtual(e))return n;if(e.actualNode.id){var r=axe.utils.escapeSelector(e.actualNode.getAttribute(\"id\"));if(n=(t=axe.commons.dom.getRootNode(e.actualNode).querySelector('label[for=\"'+r+'\"]'))&&g.visible(t,!0))return n}return(n=(t=h.findUpVirtual(e,\"label\"))&&g.visible(t,!0))||null},g.label=function(e){return e=axe.utils.getNodeFromTree(e),g.labelVirtual(e)},g.nativeElementType=[{matches:[{nodeName:\"textarea\"},{nodeName:\"input\",properties:{type:[\"text\",\"password\",\"search\",\"tel\",\"email\",\"url\"]}}],namingMethods:\"labelText\"},{matches:{nodeName:\"input\",properties:{type:[\"button\",\"submit\",\"reset\"]}},namingMethods:[\"valueText\",\"titleText\",\"buttonDefaultText\"]},{matches:{nodeName:\"input\",properties:{type:\"image\"}},namingMethods:[\"altText\",\"valueText\",\"labelText\",\"titleText\",\"buttonDefaultText\"]},{matches:\"button\",namingMethods:\"subtreeText\"},{matches:\"fieldset\",namingMethods:\"fieldsetLegendText\"},{matches:\"OUTPUT\",namingMethods:\"subtreeText\"},{matches:[{nodeName:\"select\"},{nodeName:\"input\",properties:{type:/^(?!text|password|search|tel|email|url|button|submit|reset)/}}],namingMethods:\"labelText\"},{matches:\"summary\",namingMethods:\"subtreeText\"},{matches:\"figure\",namingMethods:[\"figureText\",\"titleText\"]},{matches:\"img\",namingMethods:\"altText\"},{matches:\"table\",namingMethods:[\"tableCaptionText\",\"tableSummaryText\"]},{matches:[\"hr\",\"br\"],namingMethods:[\"titleText\",\"singleSpace\"]}],g.nativeTextAlternative=function(n,e){var r=1<arguments.length&&void 0!==e?e:{},t=n.actualNode;if(1!==t.nodeType||[\"presentation\",\"none\"].includes(l.getRole(t)))return\"\";var a=function(n){var e=g.nativeElementType,t=g.nativeTextMethods,r=e.find(function(e){var t=e.matches;return axe.commons.matches(n,t)});return(r?[].concat(r.namingMethods):[]).map(function(e){return t[e]})}(n).reduce(function(e,t){return e||t(n,r)},\"\");return r.debug&&axe.log(a||\"{empty-value}\",t,r),a};var F={submit:\"Submit\",image:\"Submit\",reset:\"Reset\",button:\"\"};function j(e,t){return t.actualNode.getAttribute(e)||\"\"}function z(e,t,n){var r=t.actualNode,a=[e=e.toLowerCase(),r.nodeName.toLowerCase()].join(\",\"),o=r.querySelector(a);return o&&o.nodeName.toLowerCase()===e?g.accessibleText(o,n):\"\"}g.nativeTextMethods={valueText:function(e){return e.actualNode.value||\"\"},buttonDefaultText:function(e){var t=e.actualNode;return F[t.type]||\"\"},tableCaptionText:z.bind(null,\"caption\"),figureText:z.bind(null,\"figcaption\"),fieldsetLegendText:z.bind(null,\"legend\"),altText:j.bind(null,\"alt\"),tableSummaryText:j.bind(null,\"summary\"),titleText:function(e,t){return g.titleText(e,t)},subtreeText:function(e,t){return g.subtreeText(e,t)},labelText:function(e,t){return g.labelText(e,t)},singleSpace:function(){return\" \"}},g.sanitize=function(e){\"use strict\";return e.replace(/\\r\\n/g,\"\\n\").replace(/\\u00A0/g,\" \").replace(/[\\s]{2,}/g,\" \").trim()},g.subtreeText=function(e,t){var n=1<arguments.length&&void 0!==t?t:{},r=g.accessibleTextVirtual.alreadyProcessed;n.startNode=n.startNode||e;var a=n.strict;return r(e,n)||!l.namedFromContents(e,{strict:a})?\"\":l.getOwnedVirtual(e).reduce(function(e,t){return function(e,t,n){var r=t.actualNode.nodeName.toUpperCase(),a=g.accessibleTextVirtual(t,n);if(!a)return e;q.includes(r)||(\" \"!==a[0]&&(a+=\" \"),e&&\" \"!==e[e.length-1]&&(a=\" \"+a));return e+a}(e,t,n)},\"\")};var q=[\"A\",\"EM\",\"STRONG\",\"SMALL\",\"MARK\",\"ABBR\",\"DFN\",\"I\",\"B\",\"S\",\"U\",\"CODE\",\"VAR\",\"SAMP\",\"KBD\",\"SUP\",\"SUB\",\"Q\",\"CITE\",\"SPAN\",\"BDO\",\"BDI\",\"WBR\",\"INS\",\"DEL\",\"MAP\",\"AREA\",\"NOSCRIPT\",\"RUBY\",\"BUTTON\",\"LABEL\",\"OUTPUT\",\"DATALIST\",\"KEYGEN\",\"PROGRESS\",\"COMMAND\",\"CANVAS\",\"TIME\",\"METER\",\"#TEXT\"];var N=[\"button\",\"iframe\",\"a[href]\",{nodeName:\"input\",properties:{type:\"button\"}}];function T(){return new RegExp(\"[ᴀ-ᵿᶀ-ᶿ᷀-᷿₠-⃏⃐-⃿℀-⅏⅐-↏←-⇿∀-⋿⌀-⏿␀-␿⑀-⑟①-⓿─-╿▀-▟■-◿☀-⛿✀-➿]\")}return g.titleText=function(e){return 1===(e=e.actualNode||e).nodeType&&e.hasAttribute(\"title\")?!axe.commons.matches(e,N)&&[\"none\",\"presentation\"].includes(l.getRole(e))?\"\":e.getAttribute(\"title\"):\"\"},g.hasUnicode=function(e,t){var n=t.emoji,r=t.nonBmp,a=t.punctuations;return n?axe.imports.emojiRegexText().test(e):r?T().test(e):!!a&&/[\\u2000-\\u206F\\u2E00-\\u2E7F\\\\'!\"#$%&()*+,\\-.\\/:;<=>?@\\[\\]^_`{|}~]/g.test(e)},g.removeUnicode=function(e,t){var n=t.emoji,r=t.nonBmp,a=t.punctuations;return n&&(e=e.replace(axe.imports.emojiRegexText(),\"\")),r&&(e=e.replace(T(),\"\")),a&&(e=e.replace(/[\\u2000-\\u206F\\u2E00-\\u2E7F\\\\'!\"#$%&()*+,\\-.\\/:;<=>?@\\[\\]^_`{|}~]/g,\"\")),e},g.unsupported={accessibleNameFromFieldValue:[\"combobox\",\"listbox\",\"progressbar\"]},g.visibleVirtual=function(n,r,a){var e=n.children.map(function(e){if(3===e.actualNode.nodeType){var t=e.actualNode.nodeValue;if(t&&h.isVisible(n.actualNode,r))return t}else if(!a)return g.visibleVirtual(e,r)}).join(\"\");return g.sanitize(e)},g.visible=function(e,t,n){return e=axe.utils.getNodeFromTree(e),g.visibleVirtual(e,t,n)},commons}()})}(\"object\"==typeof window?window:this);";
-const pageFunctions=require('../../lib/page-functions.js');
-
-
-
-
-
-
-
-
-function runA11yChecks(){
-
-return window.axe.run(document,{
-elementRef:true,
-runOnly:{
-type:'tag',
-values:[
-'wcag2a',
-'wcag2aa']},
-
-
-resultTypes:['violations','inapplicable'],
-rules:{
-'tabindex':{enabled:true},
-'accesskeys':{enabled:true},
-'table-fake-caption':{enabled:false},
-'td-has-header':{enabled:false},
-'marquee':{enabled:false},
-'area-alt':{enabled:false},
-'aria-dpub-role-fallback':{enabled:false},
-'aria-hidden-body':{enabled:false},
-'duplicate-id-active':{enabled:false},
-'duplicate-id-aria':{enabled:false},
-'html-xml-lang-mismatch':{enabled:false},
-'blink':{enabled:false},
-'server-side-image-map':{enabled:false},
-'aria-hidden-focus':{enabled:false},
-'form-field-multiple-labels':{enabled:false},
-'aria-input-field-name':{enabled:false},
-'aria-toggle-field-name':{enabled:false}}}).
-
-
-then(axeResult=>{
-
-
-axeResult.violations.forEach(v=>v.nodes.forEach(node=>{
-
-node.path=getNodePath(node.element);
-
-node.snippet=getOuterHTMLSnippet(node.element);
-
-node.nodeLabel=getNodeLabel(node.element);
-
-node.element=node.any=node.all=node.none=undefined;
-}));
-
-
-axeResult={violations:axeResult.violations,notApplicable:axeResult.inapplicable};
-return axeResult;
-});
-}
-
-class Accessibility extends Gatherer{
-
-
-
-
-afterPass(passContext){
-const driver=passContext.driver;
-const expression=`(function () {
-      ${pageFunctions.getOuterHTMLSnippetString};
-      ${pageFunctions.getNodePathString};
-      ${pageFunctions.getNodeLabelString};
-      ${axeLibSource};
-      return (${runA11yChecks.toString()}());
-    })()`;
-
-return driver.evaluateAsync(expression,{useIsolation:true}).then(returnedValue=>{
-if(!returnedValue){
-throw new Error('No axe-core results returned');
-}
-if(!Array.isArray(returnedValue.violations)){
-throw new Error('Unable to parse axe results'+returnedValue);
-}
-return returnedValue;
-});
-}}
-
-
-module.exports=Accessibility;
-
-},{"../../lib/page-functions.js":76,"./gatherer.js":53}],"../gather/gatherers/anchor-elements":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('./gatherer.js');
-const pageFunctions=require('../../lib/page-functions.js');
-
-
-
-
-
-
-
-
-
-
-
-
-
-function collectAnchorElements(){
-
-const resolveURLOrEmpty=url=>{
-try{
-return new URL(url,window.location.href).href;
-}catch(_){
-return'';
-}
-};
-
-
-
-const anchorElements=getElementsInDocument('a');
-
-return anchorElements.map(node=>{
-
-const outerHTML=getOuterHTMLSnippet(node);
-
-if(node instanceof HTMLAnchorElement){
-return{
-href:node.href,
-text:node.innerText,
-rel:node.rel,
-target:node.target,
-outerHTML};
-
-}
-
-return{
-href:resolveURLOrEmpty(node.href.baseVal),
-text:node.textContent||'',
-rel:'',
-target:node.target.baseVal||'',
-outerHTML};
-
-});
-}
-
-class AnchorElements extends Gatherer{
-
-
-
-
-async afterPass(passContext){
-const driver=passContext.driver;
-const expression=`(() => {
-      ${pageFunctions.getOuterHTMLSnippetString};
-      ${pageFunctions.getElementsInDocumentString};
-
-      return (${collectAnchorElements})();
-    })()`;
-
-
-return driver.evaluateAsync(expression,{useIsolation:true});
-}}
-
-
-module.exports=AnchorElements;
-
-},{"../../lib/page-functions.js":76,"./gatherer.js":53}],"../gather/gatherers/cache-contents":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-
-
-const Gatherer=require('./gatherer.js');
-
-
-
-
-
-
-function getCacheContents(){
-
-return caches.keys().
-
-
-then(cacheNames=>Promise.all(cacheNames.map(cacheName=>caches.open(cacheName)))).
-
-then(caches=>{
-
-const requests=[];
-
-
-return Promise.all(caches.map(cache=>{
-return cache.keys().
-then(reqs=>{
-requests.push(...reqs.map(r=>r.url));
-});
-})).then(_=>{
-return requests;
-});
-});
-}
-
-class CacheContents extends Gatherer{
-
-
-
-
-
-async afterPass(passContext){
-const driver=passContext.driver;
-
-
-const cacheUrls=await driver.evaluateAsync(`(${getCacheContents.toString()}())`);
-if(!cacheUrls||!Array.isArray(cacheUrls)){
-throw new Error('Unable to retrieve cache contents');
-}
-
-return cacheUrls;
-}}
-
-
-module.exports=CacheContents;
-
-},{"./gatherer.js":53}],"../gather/gatherers/console-messages":[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('./gatherer.js');
-
-class ConsoleMessages extends Gatherer{
-constructor(){
-super();
-
-this._logEntries=[];
-this._onConsoleEntryAdded=this.onConsoleEntry.bind(this);
-}
-
-
-
-
-onConsoleEntry(entry){
-this._logEntries.push(entry);
-}
-
-
-
-
-async beforePass(passContext){
-const driver=passContext.driver;
-driver.on('Log.entryAdded',this._onConsoleEntryAdded);
-await driver.sendCommand('Log.enable');
-await driver.sendCommand('Log.startViolationsReport',{
-config:[{name:'discouragedAPIUse',threshold:-1}]});
-
-}
-
-
-
-
-
-async afterPass(passContext){
-await passContext.driver.sendCommand('Log.stopViolationsReport');
-await passContext.driver.off('Log.entryAdded',this._onConsoleEntryAdded);
-await passContext.driver.sendCommand('Log.disable');
-return this._logEntries;
-}}
-
-
-module.exports=ConsoleMessages;
-
-},{"./gatherer.js":53}],"../gather/gatherers/css-usage":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('./gatherer.js');
-
-
-
-
-class CSSUsage extends Gatherer{
-
-
-
-
-async afterPass(passContext){
-const driver=passContext.driver;
-
-
-const stylesheets=[];
-
-const onStylesheetAdded=sheet=>stylesheets.push(sheet);
-driver.on('CSS.styleSheetAdded',onStylesheetAdded);
-
-await driver.sendCommand('DOM.enable');
-await driver.sendCommand('CSS.enable');
-await driver.sendCommand('CSS.startRuleUsageTracking');
-await driver.evaluateAsync('getComputedStyle(document.body)');
-driver.off('CSS.styleSheetAdded',onStylesheetAdded);
-
-
-const promises=stylesheets.map(sheet=>{
-const styleSheetId=sheet.header.styleSheetId;
-return driver.sendCommand('CSS.getStyleSheetText',{styleSheetId}).then(content=>{
-return{
-header:sheet.header,
-content:content.text};
-
-});
-});
-const styleSheetInfo=await Promise.all(promises);
-
-const ruleUsageResponse=await driver.sendCommand('CSS.stopRuleUsageTracking');
-await driver.sendCommand('CSS.disable');
-await driver.sendCommand('DOM.disable');
-
-const dedupedStylesheets=new Map(styleSheetInfo.map(sheet=>{
-return[sheet.content,sheet];
-}));
-return{
-rules:ruleUsageResponse.ruleUsage,
-stylesheets:Array.from(dedupedStylesheets.values())};
-
-}}
-
-
-module.exports=CSSUsage;
-
-},{"./gatherer.js":53}],"../gather/gatherers/dobetterweb/appcache":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('../gatherer.js');
-
-class AppCacheManifest extends Gatherer{
-
-
-
-
-
-
-afterPass(passContext){
-const driver=passContext.driver;
-
-return driver.querySelector('html').
-then(node=>node&&node.getAttribute('manifest'));
-}}
-
-
-module.exports=AppCacheManifest;
-
-},{"../gatherer.js":53}],"../gather/gatherers/dobetterweb/doctype":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('../gatherer.js');
-
-
-
-
-
-
-function getDoctype(){
-
-if(!document.doctype){
-return null;
-}
-
-const{name,publicId,systemId}=document.doctype;
-return{name,publicId,systemId};
-}
-
-class Doctype extends Gatherer{
-
-
-
-
-afterPass(passContext){
-const driver=passContext.driver;
-return driver.evaluateAsync(`(${getDoctype.toString()}())`);
-}}
-
-
-module.exports=Doctype;
-
-},{"../gatherer.js":53}],"../gather/gatherers/dobetterweb/domstats":[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('../gatherer.js');
-const pageFunctions=require('../../../lib/page-functions.js');
-
-
-
-
-
-
-
-
-function createSelectorsLabel(element){
-let name=element.localName||'';
-const idAttr=element.getAttribute&&element.getAttribute('id');
-if(idAttr){
-name+=`#${idAttr}`;
-}
-
-
-if(element.classList){
-const className=element.classList.toString();
-if(className){
-name+=`.${className.trim().replace(/\s+/g,'.')}`;
-}
-}else if(ShadowRoot.prototype.isPrototypeOf(element)){
-name+='#shadow-root';
-}
-
-return name;
-}
-
-
-
-
-
-
-function elementPathInDOM(element){
-const visited=new Set();
-const path=[createSelectorsLabel(element)];
-let node=element;
-while(node){
-visited.add(node);
-
-
-
-if(ShadowRoot.prototype.isPrototypeOf(node)){
-const isShadowHost=node.host&&node.localName!=='a';
-node=isShadowHost?node.host:node.parentElement;
-}else{
-const isShadowHost=node.parentNode&&node.parentNode.host&&
-node.parentNode.localName!=='a';
-node=isShadowHost?node.parentNode.host:node.parentElement;
-}
-
-if(visited.has(node)){
-node=null;
-}
-
-if(node){
-path.unshift(createSelectorsLabel(node));
-}
-}
-return path;
-}
-
-
-
-
-
-
-
-
-function getDOMStats(element,deep=true){
-let deepestElement=null;
-let maxDepth=-1;
-let maxWidth=-1;
-let numElements=0;
-let parentWithMostChildren=null;
-
-
-
-
-
-const _calcDOMWidthAndHeight=function(element,depth=1){
-if(depth>maxDepth){
-deepestElement=element;
-maxDepth=depth;
-}
-if(element.children.length>maxWidth){
-parentWithMostChildren=element;
-maxWidth=element.children.length;
-}
-
-let child=element.firstElementChild;
-while(child){
-_calcDOMWidthAndHeight(child,depth+1);
-
-if(deep&&child.shadowRoot){
-_calcDOMWidthAndHeight(child.shadowRoot,depth+1);
-}
-child=child.nextElementSibling;
-numElements++;
-}
-
-return{maxDepth,maxWidth,numElements};
-};
-
-const result=_calcDOMWidthAndHeight(element);
-
-return{
-depth:{
-max:result.maxDepth,
-pathToElement:elementPathInDOM(deepestElement),
-
-snippet:getOuterHTMLSnippet(deepestElement,['style'])},
-
-width:{
-max:result.maxWidth,
-pathToElement:elementPathInDOM(parentWithMostChildren),
-snippet:getOuterHTMLSnippet(parentWithMostChildren,['style'])},
-
-totalBodyElements:result.numElements};
-
-}
-
-class DOMStats extends Gatherer{
-
-
-
-
-async afterPass(passContext){
-const driver=passContext.driver;
-
-const expression=`(function() {
-      ${pageFunctions.getOuterHTMLSnippetString};
-      ${createSelectorsLabel.toString()};
-      ${elementPathInDOM.toString()};
-      return (${getDOMStats.toString()}(document.body));
-    })()`;
-await driver.sendCommand('DOM.enable');
-const results=await driver.evaluateAsync(expression,{useIsolation:true});
-await driver.sendCommand('DOM.disable');
-return results;
-}}
-
-
-module.exports=DOMStats;
-
-},{"../../../lib/page-functions.js":76,"../gatherer.js":53}],"../gather/gatherers/dobetterweb/optimized-images":[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-const log=require('lighthouse-logger');
-const Gatherer=require('../gatherer.js');
-const URL=require('../../../lib/url-shim.js');
-const NetworkRequest=require('../../../lib/network-request.js');
-const Sentry=require('../../../lib/sentry.js');
-const Driver=require('../../driver.js');
-
-
-
-const MAX_TIME_TO_SPEND_ENCODING=5000;
-
-const MAX_RESOURCE_SIZE_TO_ENCODE=2000*1024;
-
-const JPEG_QUALITY=0.92;
-const WEBP_QUALITY=0.85;
-
-const MINIMUM_IMAGE_SIZE=4096;
-
-const IMAGE_REGEX=/^image\/((x|ms|x-ms)-)?(png|bmp|jpeg)$/;
-
-
-
-class OptimizedImages extends Gatherer{
-constructor(){
-super();
-this._encodingStartAt=0;
-}
-
-
-
-
-
-static filterImageRequests(networkRecords){
-
-const seenUrls=new Set();
-return networkRecords.reduce((prev,record)=>{
-
-if(seenUrls.has(record.url)||!record.finished||record.sessionId){
-return prev;
-}
-
-seenUrls.add(record.url);
-const isOptimizableImage=record.resourceType===NetworkRequest.TYPES.Image&&
-IMAGE_REGEX.test(record.mimeType);
-
-const actualResourceSize=Math.min(record.resourceSize||0,record.transferSize||0);
-if(isOptimizableImage&&actualResourceSize>MINIMUM_IMAGE_SIZE){
-prev.push({
-requestId:record.requestId,
-url:record.url,
-mimeType:record.mimeType,
-resourceSize:actualResourceSize});
-
-}
-
-return prev;
-},[]);
-}
-
-
-
-
-
-
-
-_getEncodedResponse(driver,requestId,encoding){
-requestId=NetworkRequest.getRequestIdForBackend(requestId);
-
-const quality=encoding==='jpeg'?JPEG_QUALITY:WEBP_QUALITY;
-const params={requestId,encoding,quality,sizeOnly:true};
-return driver.sendCommand('Audits.getEncodedResponse',params);
-}
-
-
-
-
-
-
-async calculateImageStats(driver,networkRecord){
-const originalSize=networkRecord.resourceSize;
-
-
-if(Date.now()-this._encodingStartAt>MAX_TIME_TO_SPEND_ENCODING||
-originalSize>MAX_RESOURCE_SIZE_TO_ENCODE){
-return{originalSize,jpegSize:undefined,webpSize:undefined};
-}
-
-const jpegData=await this._getEncodedResponse(driver,networkRecord.requestId,'jpeg');
-const webpData=await this._getEncodedResponse(driver,networkRecord.requestId,'webp');
-
-return{
-originalSize,
-jpegSize:jpegData.encodedSize,
-webpSize:webpData.encodedSize};
-
-}
-
-
-
-
-
-
-async computeOptimizedImages(driver,imageRecords){
-this._encodingStartAt=Date.now();
-
-
-const results=[];
-
-for(const record of imageRecords){
-try{
-const stats=await this.calculateImageStats(driver,record);
-
-const image={failed:false,...stats,...record};
-results.push(image);
-}catch(err){
-log.warn('optimized-images',err.message);
-
-
-
-Sentry.captureException(err,{
-tags:{gatherer:'OptimizedImages'},
-extra:{imageUrl:URL.elideDataURI(record.url)},
-level:'warning'});
-
-
-
-const imageError={failed:true,errMsg:err.message,...record};
-results.push(imageError);
-}
-}
-
-return results;
-}
-
-
-
-
-
-
-afterPass(passContext,loadData){
-const networkRecords=loadData.networkRecords;
-const imageRecords=OptimizedImages.
-filterImageRequests(networkRecords).
-sort((a,b)=>b.resourceSize-a.resourceSize);
-
-return Promise.resolve().
-then(_=>this.computeOptimizedImages(passContext.driver,imageRecords)).
-then(results=>{
-const successfulResults=results.filter(result=>!result.failed);
-if(results.length&&!successfulResults.length){
-throw new Error('All image optimizations failed');
-}
-
-return results;
-});
-}}
-
-
-module.exports=OptimizedImages;
-
-},{"../../../lib/network-request.js":75,"../../../lib/sentry.js":78,"../../../lib/url-shim.js":"url","../../driver.js":51,"../gatherer.js":53,"lighthouse-logger":125}],"../gather/gatherers/dobetterweb/password-inputs-with-prevented-paste":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-
-
-const Gatherer=require('../gatherer.js');
-const pageFunctions=require('../../../lib/page-functions.js');
-
-
-
-
-
-
-function findPasswordInputsWithPreventedPaste(){
-return Array.from(document.querySelectorAll('input[type="password"]')).
-filter(passwordInput=>
-!passwordInput.dispatchEvent(
-new ClipboardEvent('paste',{cancelable:true}))).
-
-
-map(passwordInput=>({
-
-snippet:getOuterHTMLSnippet(passwordInput)}));
-
-}
-
-class PasswordInputsWithPreventedPaste extends Gatherer{
-
-
-
-
-afterPass(passContext){
-return passContext.driver.evaluateAsync(`(() => {
-      ${pageFunctions.getOuterHTMLSnippetString};
-      return (${findPasswordInputsWithPreventedPaste.toString()}());
-    })()`);
-}}
-
-
-
-module.exports=PasswordInputsWithPreventedPaste;
-
-},{"../../../lib/page-functions.js":76,"../gatherer.js":53}],"../gather/gatherers/dobetterweb/response-compression":[function(require,module,exports){
-(function(Buffer){
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('../gatherer.js');
-const URL=require('../../../lib/url-shim.js');
-const Sentry=require('../../../lib/sentry.js');
-const NetworkRequest=require('../../../lib/network-request.js');
-const gzip=require('zlib').gzip;
-
-const CHROME_EXTENSION_PROTOCOL='chrome-extension:';
-const compressionHeaders=['content-encoding','x-original-content-encoding'];
-const compressionTypes=['gzip','br','deflate'];
-const binaryMimeTypes=['image','audio','video'];
-
-const textResourceTypes=[
-NetworkRequest.TYPES.Document,
-NetworkRequest.TYPES.Script,
-NetworkRequest.TYPES.Stylesheet,
-NetworkRequest.TYPES.XHR,
-NetworkRequest.TYPES.Fetch,
-NetworkRequest.TYPES.EventSource];
-
-
-class ResponseCompression extends Gatherer{
-
-
-
-
-static filterUnoptimizedResponses(networkRecords){
-
-const unoptimizedResponses=[];
-
-networkRecords.forEach(record=>{
-
-if(record.sessionId)return;
-
-const mimeType=record.mimeType;
-const resourceType=record.resourceType||NetworkRequest.TYPES.Other;
-const resourceSize=record.resourceSize;
-
-const isBinaryResource=mimeType&&binaryMimeTypes.some(type=>mimeType.startsWith(type));
-const isTextResource=!isBinaryResource&&textResourceTypes.includes(resourceType);
-const isChromeExtensionResource=record.url.startsWith(CHROME_EXTENSION_PROTOCOL);
-
-if(!isTextResource||!resourceSize||!record.finished||
-isChromeExtensionResource||!record.transferSize||record.statusCode===304){
-return;
-}
-
-const isContentEncoded=(record.responseHeaders||[]).find(header=>
-compressionHeaders.includes(header.name.toLowerCase())&&
-compressionTypes.includes(header.value));
-
-
-if(!isContentEncoded){
-unoptimizedResponses.push({
-requestId:record.requestId,
-url:record.url,
-mimeType:mimeType,
-transferSize:record.transferSize,
-resourceSize:resourceSize,
-gzipSize:0});
-
-}
-});
-
-return unoptimizedResponses;
-}
-
-
-
-
-
-
-afterPass(passContext,loadData){
-const networkRecords=loadData.networkRecords;
-const textRecords=ResponseCompression.filterUnoptimizedResponses(networkRecords);
-
-const driver=passContext.driver;
-return Promise.all(textRecords.map(record=>{
-return driver.getRequestContent(record.requestId).then(content=>{
-
-if(!content){
-return record;
-}
-
-return new Promise((resolve,reject)=>{
-return gzip(content,(err,res)=>{
-if(err){
-return reject(err);
-}
-
-
-record.gzipSize=Buffer.byteLength(res,'utf8');
-
-resolve(record);
-});
-});
-}).catch(err=>{
-Sentry.captureException(err,{
-tags:{gatherer:'ResponseCompression'},
-extra:{url:URL.elideDataURI(record.url)},
-level:'warning'});
-
-
-record.gzipSize=undefined;
-return record;
-});
-}));
-}}
-
-
-module.exports=ResponseCompression;
-
-}).call(this,require("buffer").Buffer);
-},{"../../../lib/network-request.js":75,"../../../lib/sentry.js":78,"../../../lib/url-shim.js":"url","../gatherer.js":53,"buffer":102,"zlib":100}],"../gather/gatherers/dobetterweb/tags-blocking-first-paint":[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('../gatherer.js');
-const Driver=require('../../driver.js');
-
-
-
-
-function installMediaListener(){
-window.___linkMediaChanges=[];
-Object.defineProperty(HTMLLinkElement.prototype,'media',{
-set:function(val){
-window.___linkMediaChanges.push({
-href:this.href,
-media:val,
-msSinceHTMLEnd:Date.now()-window.performance.timing.responseEnd,
-matches:window.matchMedia(val).matches});
-
-
-return this.setAttribute('media',val);
-}});
-
-}
-
-
-
-
-
-function collectTagsThatBlockFirstPaint(){
-return new Promise((resolve,reject)=>{
-try{
-const tagList=[...document.querySelectorAll('link, head script[src]')].
-filter(tag=>{
-if(tag.tagName==='SCRIPT'){
-const scriptTag=tag;
-return(
-!scriptTag.hasAttribute('async')&&
-!scriptTag.hasAttribute('defer')&&
-!/^data:/.test(scriptTag.src)&&
-!/^blob:/.test(scriptTag.src)&&
-scriptTag.getAttribute('type')!=='module');
-
-}else if(tag.tagName==='LINK'){
-
-
-
-const linkTag=tag;
-const blockingStylesheet=linkTag.rel==='stylesheet'&&
-window.matchMedia(linkTag.media).matches&&!linkTag.disabled;
-const blockingImport=linkTag.rel==='import'&&!linkTag.hasAttribute('async');
-return blockingStylesheet||blockingImport;
-}
-
-return false;
-}).
-map(tag=>{
-return{
-tagName:tag.tagName,
-url:tag.tagName==='LINK'?tag.href:tag.src,
-src:tag.src,
-href:tag.href,
-rel:tag.rel,
-media:tag.media,
-disabled:tag.disabled,
-mediaChanges:window.___linkMediaChanges.filter(item=>item.href===tag.href)};
-
-});
-resolve(tagList);
-}catch(e){
-const friendly='Unable to gather Scripts/Stylesheets/HTML Imports on the page';
-reject(new Error(`${friendly}: ${e.message}`));
-}
-});
-}
-
-class TagsBlockingFirstPaint extends Gatherer{
-
-
-
-static _filteredAndIndexedByUrl(networkRecords){
-
-const result={};
-
-return networkRecords.reduce((prev,record)=>{
-if(!record.finished){
-return prev;
-}
-
-const isParserGenerated=record.initiator.type==='parser';
-
-
-const isParserScriptOrStyle=/(css|script)/.test(record.mimeType)&&isParserGenerated;
-const isFailedRequest=record._failed;
-const isHtml=record.mimeType&&record.mimeType.includes('html');
-
-
-
-if(isHtml||isParserScriptOrStyle||isFailedRequest&&isParserGenerated){
-prev[record.url]={
-isLinkPreload:!!record.isLinkPreload,
-transferSize:record.transferSize,
-startTime:record.startTime,
-endTime:record.endTime};
-
-}
-
-return prev;
-},result);
-}
-
-
-
-
-
-static findBlockingTags(driver,networkRecords){
-const scriptSrc=`(${collectTagsThatBlockFirstPaint.toString()}())`;
-const firstRequestEndTime=networkRecords.reduce(
-(min,record)=>Math.min(min,record.endTime),
-Infinity);
-
-return driver.evaluateAsync(scriptSrc).then(tags=>{
-const requests=TagsBlockingFirstPaint._filteredAndIndexedByUrl(networkRecords);
-
-return tags.reduce((prev,tag)=>{
-const request=requests[tag.url];
-if(request&&!request.isLinkPreload){
-
-
-
-const timesResourceBecameNonBlocking=(tag.mediaChanges||[]).
-filter(change=>!change.matches).
-map(change=>change.msSinceHTMLEnd);
-const earliestNonBlockingTime=Math.min(...timesResourceBecameNonBlocking);
-const lastTimeResourceWasBlocking=Math.max(
-request.startTime,
-firstRequestEndTime+earliestNonBlockingTime/1000);
-
-
-prev.push({
-tag,
-transferSize:request.transferSize||0,
-startTime:request.startTime,
-endTime:Math.min(request.endTime,lastTimeResourceWasBlocking)});
-
-
-
-requests[tag.url]=null;
-}
-
-return prev;
-},[]);
-});
-}
-
-
-
-
-beforePass(passContext){
-return passContext.driver.evaluateScriptOnNewDocument(`(${installMediaListener.toString()})()`);
-}
-
-
-
-
-
-
-afterPass(passContext,loadData){
-return TagsBlockingFirstPaint.findBlockingTags(passContext.driver,loadData.networkRecords);
-}}
-
-
-module.exports=TagsBlockingFirstPaint;
-
-},{"../../driver.js":51,"../gatherer.js":53}],"../gather/gatherers/html-without-javascript":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('./gatherer.js');
-
-
-
-
-
-
-
-
-
-function getBodyText(){
-
-const body=document.querySelector('body');
-return Promise.resolve({
-bodyText:body?body.innerText:'',
-hasNoScript:!!document.querySelector('noscript')});
-
-}
-
-class HTMLWithoutJavaScript extends Gatherer{
-
-
-
-beforePass(passContext){
-passContext.disableJavaScript=true;
-}
-
-
-
-
-
-async afterPass(passContext){
-
-passContext.disableJavaScript=false;
-
-const expression=`(${getBodyText.toString()}())`;
-const{bodyText,hasNoScript}=await passContext.driver.evaluateAsync(expression);
-if(typeof bodyText!=='string'){
-throw new Error('document body innerText returned by protocol was not a string');
-}
-
-return{
-bodyText,
-hasNoScript};
-
-}}
-
-
-module.exports=HTMLWithoutJavaScript;
-
-},{"./gatherer.js":53}],"../gather/gatherers/http-redirect":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('./gatherer.js');
-
-
-
-
-
-
-class HTTPRedirect extends Gatherer{
-constructor(){
-super();
-this._preRedirectURL='';
-}
-
-
-
-
-beforePass(passContext){
-this._preRedirectURL=passContext.url;
-passContext.url=this._preRedirectURL.replace(/^https/,'http');
-}
-
-
-
-
-
-async afterPass(passContext){
-
-passContext.url=this._preRedirectURL;
-
-const expression=`new URL(window.location).protocol === 'https:'`;
-const isHttps=await passContext.driver.evaluateAsync(expression,{useIsolation:true});
-return{
-value:isHttps};
-
-}}
-
-
-module.exports=HTTPRedirect;
-
-},{"./gatherer.js":53}],"../gather/gatherers/iframe-elements":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('./gatherer.js');
-const pageFunctions=require('../../lib/page-functions.js');
-
-
-
-
-
-
-
-function collectIFrameElements(){
-
-const iFrameElements=getElementsInDocument('iframe');
-return iFrameElements.map(node=>{
-const clientRect=node.getBoundingClientRect();
-const{top,bottom,left,right,width,height}=clientRect;
-return{
-id:node.id,
-src:node.src,
-clientRect:{top,bottom,left,right,width,height},
-
-isPositionFixed:isPositionFixed(node)};
-
-});
-}
-
-class IFrameElements extends Gatherer{
-
-
-
-
-
-async afterPass(passContext){
-const driver=passContext.driver;
-
-const expression=`(() => {
-      ${pageFunctions.getOuterHTMLSnippetString};
-      ${pageFunctions.getElementsInDocumentString};
-      ${pageFunctions.isPositionFixedString};
-      return (${collectIFrameElements})();
-    })()`;
-
-
-const iframeElements=await driver.evaluateAsync(expression,{useIsolation:true});
-return iframeElements;
-}}
-
-
-module.exports=IFrameElements;
-
-},{"../../lib/page-functions.js":76,"./gatherer.js":53}],"../gather/gatherers/image-elements":[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('./gatherer.js');
-const pageFunctions=require('../../lib/page-functions.js');
-const Driver=require('../driver.js');
-
-
-
-
-
-
-function getClientRect(element){
-const clientRect=element.getBoundingClientRect();
-return{
-
-top:clientRect.top,
-bottom:clientRect.bottom,
-left:clientRect.left,
-right:clientRect.right};
-
-}
-
-
-
-
-
-
-function getHTMLImages(allElements){
-const allImageElements=allElements.filter(element=>{
-return element.localName==='img';
-});
-
-return allImageElements.map(element=>{
-const computedStyle=window.getComputedStyle(element);
-return{
-
-
-src:element.currentSrc,
-displayedWidth:element.width,
-displayedHeight:element.height,
-clientRect:getClientRect(element),
-naturalWidth:element.naturalWidth,
-naturalHeight:element.naturalHeight,
-isCss:false,
-resourceSize:0,
-isPicture:!!element.parentElement&&element.parentElement.tagName==='PICTURE',
-usesObjectFit:['cover','contain','scale-down','none'].includes(
-computedStyle.getPropertyValue('object-fit'))};
-
-
-});
-}
-
-
-
-
-
-
-function getCSSImages(allElements){
-
-
-const CSS_URL_REGEX=/^url\("([^"]+)"\)$/;
-
-
-const images=[];
-
-for(const element of allElements){
-const style=window.getComputedStyle(element);
-
-if(!style.backgroundImage||!CSS_URL_REGEX.test(style.backgroundImage))continue;
-
-const imageMatch=style.backgroundImage.match(CSS_URL_REGEX);
-
-const url=imageMatch[1];
-
-images.push({
-src:url,
-displayedWidth:element.clientWidth,
-displayedHeight:element.clientHeight,
-clientRect:getClientRect(element),
-
-naturalWidth:0,
-naturalHeight:0,
-isCss:true,
-isPicture:false,
-usesObjectFit:false,
-resourceSize:0});
-
-}
-
-return images;
-}
-
-
-
-function collectImageElementInfo(){
-
-
-const allElements=getElementsInDocument();
-return getHTMLImages(allElements).concat(getCSSImages(allElements));
-}
-
-
-
-
-
-
-function determineNaturalSize(url){
-return new Promise((resolve,reject)=>{
-const img=new Image();
-img.addEventListener('error',_=>reject(new Error('determineNaturalSize failed img load')));
-img.addEventListener('load',()=>{
-resolve({
-naturalWidth:img.naturalWidth,
-naturalHeight:img.naturalHeight});
-
-});
-
-img.src=url;
-});
-}
-
-class ImageElements extends Gatherer{
-constructor(){
-super();
-
-this._naturalSizeCache=new Map();
-}
-
-
-
-
-
-
-async fetchElementWithSizeInformation(driver,element){
-const url=JSON.stringify(element.src);
-if(this._naturalSizeCache.has(url)){
-return Object.assign(element,this._naturalSizeCache.get(url));
-}
-
-try{
-
-driver.setNextProtocolTimeout(250);
-
-const size=await driver.evaluateAsync(`(${determineNaturalSize.toString()})(${url})`);
-this._naturalSizeCache.set(url,size);
-return Object.assign(element,size);
-}catch(_){
-
-return element;
-}
-}
-
-
-
-
-
-
-async afterPass(passContext,loadData){
-const driver=passContext.driver;
-const indexedNetworkRecords=loadData.networkRecords.reduce((map,record)=>{
-
-
-if(/^image/.test(record.mimeType)&&record.finished&&record.statusCode===200){
-map[record.url]=record;
-}
-
-return map;
-},{});
-
-const expression=`(function() {
-      ${pageFunctions.getElementsInDocumentString}; // define function on page
-      ${getClientRect.toString()};
-      ${getHTMLImages.toString()};
-      ${getCSSImages.toString()};
-      ${collectImageElementInfo.toString()};
-
-      return collectImageElementInfo();
-    })()`;
-
-
-const elements=await driver.evaluateAsync(expression);
-
-
-const imageUsage=[];
-const top50Images=Object.values(indexedNetworkRecords).
-sort((a,b)=>b.resourceSize-a.resourceSize).
-slice(0,50);
-
-for(let element of elements){
-
-const networkRecord=indexedNetworkRecords[element.src]||{};
-element.mimeType=networkRecord.mimeType;
-
-
-
-
-
-const{resourceSize=0,transferSize=0}=networkRecord;
-element.resourceSize=Math.min(resourceSize,transferSize);
-
-
-
-
-
-if(
-(element.isPicture||element.isCss)&&
-networkRecord&&
-top50Images.includes(networkRecord))
-{
-element=await this.fetchElementWithSizeInformation(driver,element);
-}
-
-imageUsage.push(element);
-}
-
-return imageUsage;
-}}
-
-
-module.exports=ImageElements;
-
-},{"../../lib/page-functions.js":76,"../driver.js":51,"./gatherer.js":53}],"../gather/gatherers/js-usage":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('./gatherer.js');
-
-
-
-
-class JsUsage extends Gatherer{
-
-
-
-async beforePass(passContext){
-await passContext.driver.sendCommand('Profiler.enable');
-await passContext.driver.sendCommand('Profiler.startPreciseCoverage');
-}
-
-
-
-
-
-async afterPass(passContext){
-const driver=passContext.driver;
-
-const coverageResponse=await driver.sendCommand('Profiler.takePreciseCoverage');
-await driver.sendCommand('Profiler.stopPreciseCoverage');
-await driver.sendCommand('Profiler.disable');
-return coverageResponse.result;
-}}
-
-
-module.exports=JsUsage;
-
-},{"./gatherer.js":53}],"../gather/gatherers/link-elements":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('./gatherer.js');
-const URL=require('../../lib/url-shim.js').URL;
-const NetworkAnalyzer=require('../../lib/dependency-graph/simulator/network-analyzer.js');
-const LinkHeader=require('http-link-header');
-const{getElementsInDocumentString}=require('../../lib/page-functions.js');
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function normalizeUrlOrNull(url,finalUrl){
-try{
-return new URL(url,finalUrl).href;
-}catch(_){
-return null;
-}
-}
-
-
-
-
-
-function getCrossoriginFromHeader(value){
-if(value==='anonymous')return'anonymous';
-if(value==='use-credentials')return'use-credentials';
-return null;
-}
-
-
-
-
-
-function getLinkElementsInDOM(){
-
-
-const browserElements=getElementsInDocument('link');
-
-const linkElements=[];
-
-for(const link of browserElements){
-
-
-if(!(link instanceof HTMLLinkElement))continue;
-
-linkElements.push({
-rel:link.rel,
-href:link.href,
-hrefRaw:link.href,
-hreflang:link.hreflang,
-as:link.as,
-crossOrigin:link.crossOrigin,
-source:link.closest('head')?'head':'body'});
-
-}
-
-return linkElements;
-}
-
-class LinkElements extends Gatherer{
-
-
-
-
-static getLinkElementsInDOM(passContext){
-
-
-return passContext.driver.evaluateAsync(`(() => {
-      ${getElementsInDocumentString};
-      ${getLinkElementsInDOM};
-
-      return getLinkElementsInDOM();
-    })()`,{useIsolation:true});
-}
-
-
-
-
-
-
-static getLinkElementsInHeaders(passContext,loadData){
-const finalUrl=passContext.url;
-const records=loadData.networkRecords;
-const mainDocument=NetworkAnalyzer.findMainDocument(records,finalUrl);
-
-
-const linkElements=[];
-
-for(const header of mainDocument.responseHeaders){
-if(header.name.toLowerCase()!=='link')continue;
-
-for(const link of LinkHeader.parse(header.value).refs){
-linkElements.push({
-rel:link.rel||'',
-href:normalizeUrlOrNull(link.uri,finalUrl),
-hrefRaw:link.uri||'',
-hreflang:link.hreflang||'',
-as:link.as||'',
-crossOrigin:getCrossoriginFromHeader(link.crossorigin),
-source:'headers'});
-
-}
-}
-
-return linkElements;
-}
-
-
-
-
-
-
-async afterPass(passContext,loadData){
-const fromDOM=await LinkElements.getLinkElementsInDOM(passContext);
-const fromHeaders=LinkElements.getLinkElementsInHeaders(passContext,loadData);
-const linkElements=fromDOM.concat(fromHeaders);
-
-for(const link of linkElements){
-
-link.rel=link.rel.toLowerCase();
-}
-
-return linkElements;
-}}
-
-
-module.exports=LinkElements;
-
-},{"../../lib/dependency-graph/simulator/network-analyzer.js":62,"../../lib/page-functions.js":76,"../../lib/url-shim.js":"url","./gatherer.js":53,"http-link-header":109}],"../gather/gatherers/main-document-content":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('./gatherer.js');
-const NetworkAnalyzer=require('../../lib/dependency-graph/simulator/network-analyzer.js');
-
-
-
-
-class MainDocumentContent extends Gatherer{
-
-
-
-
-
-async afterPass(passContext,loadData){
-const mainResource=NetworkAnalyzer.findMainDocument(loadData.networkRecords,passContext.url);
-
-const driver=passContext.driver;
-return driver.getRequestContent(mainResource.requestId);
-}}
-
-
-module.exports=MainDocumentContent;
-
-},{"../../lib/dependency-graph/simulator/network-analyzer.js":62,"./gatherer.js":53}],"../gather/gatherers/meta-elements":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('./gatherer.js');
-const getElementsInDocumentString=require('../../lib/page-functions.js').getElementsInDocumentString;
-
-class MetaElements extends Gatherer{
-
-
-
-
-async afterPass(passContext){
-const driver=passContext.driver;
-
-
-
-return driver.evaluateAsync(`(() => {
-      ${getElementsInDocumentString};
-
-      return getElementsInDocument('head meta').map(meta => {
-        return {
-          name: meta.name.toLowerCase(),
-          content: meta.content,
-        };
-      });
-    })()`,{useIsolation:true});
-}}
-
-
-module.exports=MetaElements;
-
-},{"../../lib/page-functions.js":76,"./gatherer.js":53}],"../gather/gatherers/mixed-content":[function(require,module,exports){
-(function(Buffer){
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('./gatherer.js');
-const URL=require('../../lib/url-shim.js');
-
-const Driver=require('../driver.js');
-
-
-
-
-
-
-
-
-
-
-
-
-
-class MixedContent extends Gatherer{
-constructor(){
-super();
-this.ids=new Set();
-this.url=undefined;
-this._onRequestIntercepted=undefined;
-}
-
-
-
-
-
-upgradeURL(url){
-const parsedURL=new URL(url);
-parsedURL.protocol='https:';
-return parsedURL.href;
-}
-
-
-
-
-
-downgradeURL(url){
-const parsedURL=new URL(url);
-parsedURL.protocol='http:';
-return parsedURL.href;
-}
-
-
-
-
-
-_getRequestInterceptor(pageUrl,driver){
-
-const onRequestIntercepted=event=>{
-
-
-
-if(new URL(event.request.url).protocol==='http:'&&
-!URL.equalWithExcludedFragments(event.request.url,pageUrl)&&
-!this.ids.has(event.interceptionId)){
-this.ids.add(event.interceptionId);
-event.request.url=this.upgradeURL(event.request.url);
-driver.sendCommand('Network.continueInterceptedRequest',{
-interceptionId:event.interceptionId,
-rawResponse:Buffer.from(
-`HTTP/1.1 302 Found\r\nLocation: ${event.request.url}\r\n\r\n`,
-'utf8').toString('base64')});
-
-}else{
-driver.sendCommand('Network.continueInterceptedRequest',{
-interceptionId:event.interceptionId});
-
-}
-};
-
-return onRequestIntercepted;
-}
-
-
-
-
-async beforePass(passContext){
-const driver=passContext.driver;
-
-
-
-
-
-passContext.url=this.downgradeURL(passContext.url);
-this.url=passContext.url;
-this._onRequestIntercepted=this._getRequestInterceptor(this.url,driver);
-
-await driver.sendCommand('Network.enable');
-driver.on('Network.requestIntercepted',this._onRequestIntercepted);
-await driver.sendCommand('Network.setCacheDisabled',{cacheDisabled:true});
-await driver.sendCommand('Network.setRequestInterception',{patterns:[{urlPattern:'*'}]});
-}
-
-
-
-
-
-async afterPass(passContext){
-const driver=passContext.driver;
-await driver.sendCommand('Network.setRequestInterception',{patterns:[]});
-if(this._onRequestIntercepted){
-driver.off('Network.requestIntercepted',this._onRequestIntercepted);
-}
-await driver.sendCommand('Network.setCacheDisabled',{cacheDisabled:false});
-
-return{url:passContext.url};
-}}
-
-
-module.exports=MixedContent;
-
-}).call(this,require("buffer").Buffer);
-},{"../../lib/url-shim.js":"url","../driver.js":51,"./gatherer.js":53,"buffer":102}],"../gather/gatherers/offline":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('./gatherer.js');
-const URL=require('../../lib/url-shim.js');
-
-class Offline extends Gatherer{
-
-
-
-beforePass(passContext){
-
-
-
-return passContext.driver.goOffline();
-}
-
-
-
-
-
-
-async afterPass(passContext,loadData){
-const navigationRecord=loadData.networkRecords.filter(record=>{
-return URL.equalWithExcludedFragments(record.url,passContext.url)&&
-record.fetchedViaServiceWorker;
-}).pop();
-
-return navigationRecord?navigationRecord.statusCode:-1;
-}}
-
-
-module.exports=Offline;
-
-},{"../../lib/url-shim.js":"url","./gatherer.js":53}],"../gather/gatherers/runtime-exceptions":[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('./gatherer.js');
-
-class RuntimeExceptions extends Gatherer{
-constructor(){
-super();
-
-this._exceptions=[];
-this._onRuntimeExceptionThrown=this.onRuntimeExceptionThrown.bind(this);
-}
-
-
-
-
-onRuntimeExceptionThrown(entry){
-this._exceptions.push(entry);
-}
-
-
-
-
-beforePass(passContext){
-const driver=passContext.driver;
-driver.on('Runtime.exceptionThrown',this._onRuntimeExceptionThrown);
-}
-
-
-
-
-
-async afterPass(passContext){
-await passContext.driver.off('Runtime.exceptionThrown',this._onRuntimeExceptionThrown);
-return this._exceptions;
-}}
-
-
-module.exports=RuntimeExceptions;
-
-},{"./gatherer.js":53}],"../gather/gatherers/script-elements":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('./gatherer.js');
-const NetworkAnalyzer=require('../../lib/dependency-graph/simulator/network-analyzer.js');
-const NetworkRequest=require('../../lib/network-request.js');
-const getElementsInDocumentString=require('../../lib/page-functions.js').getElementsInDocumentString;
-const pageFunctions=require('../../lib/page-functions.js');
-
-
-
-
-
-
-
-function collectAllScriptElements(){
-
-
-const scripts=getElementsInDocument('script');
-
-return scripts.map(script=>{
-return{
-type:script.type||null,
-src:script.src||null,
-id:script.id||null,
-async:script.async,
-defer:script.defer,
-source:script.closest('head')?'head':'body',
-
-devtoolsNodePath:getNodePath(script),
-content:script.src?null:script.text,
-requestId:null};
-
-});
-}
-
-
-
-
-class ScriptElements extends Gatherer{
-
-
-
-
-
-async afterPass(passContext,loadData){
-const driver=passContext.driver;
-const mainResource=NetworkAnalyzer.findMainDocument(loadData.networkRecords,passContext.url);
-
-
-const scripts=await driver.evaluateAsync(`(() => {
-      ${getElementsInDocumentString}
-      ${pageFunctions.getNodePathString};
-      return (${collectAllScriptElements.toString()})();
-    })()`,{useIsolation:true});
-
-for(const script of scripts){
-if(script.content)script.requestId=mainResource.requestId;
-}
-
-const scriptRecords=loadData.networkRecords.
-
-filter(record=>!record.sessionId).
-
-filter(record=>record.resourceType===NetworkRequest.TYPES.Script);
-
-for(const record of scriptRecords){
-try{
-const content=await driver.getRequestContent(record.requestId);
-if(!content)continue;
-
-const matchedScriptElement=scripts.find(script=>script.src===record.url);
-if(matchedScriptElement){
-matchedScriptElement.requestId=record.requestId;
-matchedScriptElement.content=content;
-}else{
-scripts.push({
-devtoolsNodePath:'',
-type:null,
-src:record.url,
-id:null,
-async:false,
-defer:false,
-source:'network',
-requestId:record.requestId,
-content});
-
-}
-}catch(e){}
-}
-
-return scripts;
-}}
-
-
-module.exports=ScriptElements;
-
-},{"../../lib/dependency-graph/simulator/network-analyzer.js":62,"../../lib/network-request.js":75,"../../lib/page-functions.js":76,"./gatherer.js":53}],"../gather/gatherers/seo/embedded-content":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('../gatherer.js');
-const pageFunctions=require('../../../lib/page-functions.js');
-
-class EmbeddedContent extends Gatherer{
-
-
-
-
-afterPass(passContext){
-const expression=`(function() {
-      ${pageFunctions.getElementsInDocumentString}; // define function on page
-      const selector = 'object, embed, applet';
-      const elements = getElementsInDocument(selector);
-      return elements
-        .map(node => ({
-          tagName: node.tagName,
-          type: node.getAttribute('type'),
-          src: node.getAttribute('src'),
-          data: node.getAttribute('data'),
-          code: node.getAttribute('code'),
-          params: Array.from(node.children)
-            .filter(el => el.tagName === 'PARAM')
-            .map(el => ({
-              name: el.getAttribute('name') || '',
-              value: el.getAttribute('value') || '',
-            })),
-        }));
-    })()`;
-
-return passContext.driver.evaluateAsync(expression);
-}}
-
-
-module.exports=EmbeddedContent;
-
-},{"../../../lib/page-functions.js":76,"../gatherer.js":53}],"../gather/gatherers/seo/font-size":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-
-
-
-
-
-
-const Gatherer=require('../gatherer.js');
-const Sentry=require('../../../lib/sentry.js');
-const FONT_SIZE_PROPERTY_NAME='font-size';
-const TEXT_NODE_BLOCK_LIST=new Set(['SCRIPT','STYLE','NOSCRIPT']);
-const MINIMAL_LEGIBLE_FONT_SIZE_PX=12;
-
-const MAX_NODES_VISITED=500;
-const MAX_NODES_SOURCE_RULE_FETCHED=50;
-
-
-const TEXT_NODE_TYPE=3;
-
-
-
-
-
-
-
-
-
-function nodeInBody(node){
-if(!node){
-return false;
-}
-if(node.nodeName==='BODY'){
-return true;
-}
-return nodeInBody(node.parentNode);
-}
-
-
-
-
-
-
-
-async function getAllNodesFromBody(driver){
-const nodes=await driver.getNodesInDocument();
-
-const nodeMap=new Map();
-nodes.forEach(node=>nodeMap.set(node.nodeId,node));
-nodes.forEach(node=>node.parentNode=nodeMap.get(node.parentId));
-return nodes.filter(nodeInBody);
-}
-
-
-
-
-
-function hasFontSizeDeclaration(style){
-return!!style&&!!style.cssProperties.find(({name})=>name===FONT_SIZE_PROPERTY_NAME);
-}
-
-
-
-
-
-
-
-
-
-
-
-function computeSelectorSpecificity(selector){
-const tokens=selector.split(' ');
-
-let numIDs=0;
-let numClasses=0;
-let numTypes=0;
-
-for(const token of tokens){
-const ids=token.match(/\b#[a-z0-9]+/g)||[];
-const classes=token.match(/\b\.[a-z0-9]+/g)||[];
-const types=token.match(/^[a-z]+/)?[1]:[];
-numIDs+=ids.length;
-numClasses+=classes.length;
-numTypes+=types.length;
-}
-
-return Math.min(9,numIDs)*100+Math.min(9,numClasses)*10+Math.min(9,numTypes);
-}
-
-
-
-
-
-
-
-function findMostSpecificMatchedCSSRule(matchedCSSRules=[]){
-let maxSpecificity=-Infinity;
-
-let maxSpecificityRule;
-
-for(const{rule,matchingSelectors}of matchedCSSRules){
-if(hasFontSizeDeclaration(rule.style)){
-const specificities=matchingSelectors.map(idx=>
-computeSelectorSpecificity(rule.selectorList.selectors[idx].text));
-
-const specificity=Math.max(...specificities);
-
-if(specificity>=maxSpecificity){
-maxSpecificity=specificity;
-maxSpecificityRule=rule;
-}
-}
-}
-
-if(maxSpecificityRule){
-return{
-type:'Regular',
-...maxSpecificityRule.style,
-parentRule:{
-origin:maxSpecificityRule.origin,
-selectors:maxSpecificityRule.selectorList.selectors}};
-
-
-}
-}
-
-
-
-
-
-
-
-function findInheritedCSSRule(inheritedEntries=[]){
-
-
-
-
-for(const{inlineStyle,matchedCSSRules}of inheritedEntries){
-if(hasFontSizeDeclaration(inlineStyle))return{type:'Inline',...inlineStyle};
-
-const directRule=findMostSpecificMatchedCSSRule(matchedCSSRules);
-if(directRule)return directRule;
-}
-}
-
-
-
-
-
-
-
-
-
-function getEffectiveFontRule({attributesStyle,inlineStyle,matchedCSSRules,inherited}){
-
-if(hasFontSizeDeclaration(inlineStyle))return{type:'Inline',...inlineStyle};
-
-
-const matchedRule=findMostSpecificMatchedCSSRule(matchedCSSRules);
-if(matchedRule)return matchedRule;
-
-
-if(hasFontSizeDeclaration(attributesStyle))return{type:'Attributes',...attributesStyle};
-
-
-const inheritedRule=findInheritedCSSRule(inherited);
-if(inheritedRule)return inheritedRule;
-
-return undefined;
-}
-
-
-
-
-
-function getNodeTextLength(node){
-
-return!node.nodeValue?0:Array.from(node.nodeValue.trim()).length;
-}
-
-
-
-
-
-
-async function fetchSourceRule(driver,node){
-const matchedRules=await driver.sendCommand('CSS.getMatchedStylesForNode',{
-nodeId:node.nodeId});
-
-const sourceRule=getEffectiveFontRule(matchedRules);
-if(!sourceRule)return undefined;
-
-return{
-type:sourceRule.type,
-range:sourceRule.range,
-styleSheetId:sourceRule.styleSheetId,
-parentRule:sourceRule.parentRule&&{
-origin:sourceRule.parentRule.origin,
-selectors:sourceRule.parentRule.selectors}};
-
-
-}
-
-
-
-
-
-
-async function fetchComputedFontSize(driver,textNode){
-try{
-const{computedStyle}=await driver.sendCommand('CSS.getComputedStyleForNode',{
-nodeId:textNode.parentId});
-
-
-const fontSizeProperty=computedStyle.find(({name})=>name===FONT_SIZE_PROPERTY_NAME);
-
-return{
-
-fontSize:parseInt(fontSizeProperty.value,10),
-textLength:getNodeTextLength(textNode),
-node:textNode.parentNode};
-
-}catch(err){
-Sentry.captureException(err,{tags:{gatherer:'FontSize'}});
-return null;
-}
-}
-
-
-
-
-
-function isNonEmptyTextNode(node){
-return(
-node.nodeType===TEXT_NODE_TYPE&&
-!TEXT_NODE_BLOCK_LIST.has(node.parentNode.nodeName)&&
-getNodeTextLength(node)>0);
-
-}
-
-class FontSize extends Gatherer{
-
-
-
-static async fetchNodesToAnalyze(driver){
-let failingTextLength=0;
-let visitedTextLength=0;
-let totalTextLength=0;
-
-const nodes=await getAllNodesFromBody(driver);
-
-const textNodes=nodes.filter(isNonEmptyTextNode);
-totalTextLength=textNodes.reduce((sum,node)=>sum+=getNodeTextLength(node),0);
-
-const nodesToVisit=textNodes.
-sort((a,b)=>getNodeTextLength(b)-getNodeTextLength(a)).
-slice(0,MAX_NODES_VISITED);
-
-const nodePromises=nodesToVisit.map(node=>fetchComputedFontSize(driver,node));
-const visitedNodes=await Promise.all(nodePromises);
-
-
-const failingNodes=[];
-for(const visitedNode of visitedNodes){
-if(!visitedNode)continue;
-visitedTextLength+=visitedNode.textLength;
-
-if(visitedNode.fontSize<MINIMAL_LEGIBLE_FONT_SIZE_PX){
-failingNodes.push(visitedNode);
-failingTextLength+=visitedNode.textLength;
-}
-}
-
-return{totalTextLength,visitedTextLength,failingTextLength,failingNodes};
-}
-
-
-
-
-
-static async fetchFailingNodeSourceRules(driver,failingNodes){
-const analysisPromises=failingNodes.
-sort((a,b)=>b.textLength-a.textLength).
-slice(0,MAX_NODES_SOURCE_RULE_FETCHED).
-map(async failingNode=>{
-failingNode.cssRule=await fetchSourceRule(driver,failingNode.node);
-return failingNode;
-});
-
-const analyzedFailingNodesData=await Promise.all(analysisPromises);
-
-const analyzedFailingTextLength=analyzedFailingNodesData.reduce(
-(sum,{textLength})=>sum+=textLength,
-0);
-
-
-return{analyzedFailingNodesData,analyzedFailingTextLength};
-}
-
-
-
-
-
-async afterPass(passContext){
-
-const stylesheets=new Map();
-
-const onStylesheetAdd=sheet=>stylesheets.set(sheet.header.styleSheetId,sheet.header);
-passContext.driver.on('CSS.styleSheetAdded',onStylesheetAdd);
-
-await Promise.all([
-passContext.driver.sendCommand('DOM.enable'),
-passContext.driver.sendCommand('CSS.enable')]);
-
-
-const{
-totalTextLength,
-visitedTextLength,
-failingTextLength,
-failingNodes}=
-await FontSize.fetchNodesToAnalyze(passContext.driver);
-
-const{
-analyzedFailingNodesData,
-analyzedFailingTextLength}=
-await FontSize.fetchFailingNodeSourceRules(passContext.driver,failingNodes);
-
-passContext.driver.off('CSS.styleSheetAdded',onStylesheetAdd);
-
-analyzedFailingNodesData.
-filter(data=>data.cssRule&&data.cssRule.styleSheetId).
-
-forEach(data=>data.cssRule.stylesheet=stylesheets.get(data.cssRule.styleSheetId));
-
-await Promise.all([
-passContext.driver.sendCommand('DOM.disable'),
-passContext.driver.sendCommand('CSS.disable')]);
-
-
-return{
-analyzedFailingNodesData,
-analyzedFailingTextLength,
-failingTextLength,
-visitedTextLength,
-totalTextLength};
-
-}}
-
-
-module.exports=FontSize;
-module.exports.TEXT_NODE_TYPE=TEXT_NODE_TYPE;
-module.exports.computeSelectorSpecificity=computeSelectorSpecificity;
-module.exports.getEffectiveFontRule=getEffectiveFontRule;
-
-},{"../../../lib/sentry.js":78,"../gatherer.js":53}],"../gather/gatherers/seo/robots-txt":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('../gatherer.js');
-
-
-
-
-
-async function getRobotsTxtContent(){
-try{
-const response=await fetch(new URL('/robots.txt',location.href).href);
-if(!response.ok){
-return{status:response.status,content:null};
-}
-
-const content=await response.text();
-return{status:response.status,content};
-}catch(_){
-return{status:null,content:null};
-}
-}
-
-
-class RobotsTxt extends Gatherer{
-
-
-
-
-afterPass(passContext){
-return passContext.driver.evaluateAsync(`(${getRobotsTxtContent.toString()}())`);
-}}
-
-
-module.exports=RobotsTxt;
-
-},{"../gatherer.js":53}],"../gather/gatherers/seo/tap-targets":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-
-
-const Gatherer=require('../gatherer.js');
-const pageFunctions=require('../../../lib/page-functions.js');
-const{
-rectContains,
-getRectArea,
-getRectCenterPoint,
-getLargestRect}=
-require('../../../lib/rect-helpers.js');
-
-const TARGET_SELECTORS=[
-'button',
-'a',
-'input',
-'textarea',
-'select',
-'option',
-'[role=button]',
-'[role=checkbox]',
-'[role=link]',
-'[role=menuitem]',
-'[role=menuitemcheckbox]',
-'[role=menuitemradio]',
-'[role=option]',
-'[role=scrollbar]',
-'[role=slider]',
-'[role=spinbutton]'];
-
-const tapTargetsSelector=TARGET_SELECTORS.join(',');
-
-
-
-
-
-
-function elementIsVisible(element){
-return!!(element.offsetWidth||element.offsetHeight||element.getClientRects().length);
-}
-
-
-
-
-
-
-function getClientRects(element){
-const clientRects=Array.from(
-element.getClientRects()).
-map(clientRect=>{
-
-
-const{width,height,left,top,right,bottom}=clientRect;
-return{width,height,left,top,right,bottom};
-});
-
-for(const child of element.children){
-clientRects.push(...getClientRects(child));
-}
-
-return clientRects;
-}
-
-
-
-
-
-
-function elementHasAncestorTapTarget(element){
-if(!element.parentElement){
-return false;
-}
-if(element.parentElement.matches(tapTargetsSelector)){
-return true;
-}
-return elementHasAncestorTapTarget(element.parentElement);
-}
-
-
-
-
-
-function hasTextNodeSiblingsFormingTextBlock(element){
-if(!element.parentElement){
-return false;
-}
-
-const parentElement=element.parentElement;
-
-const nodeText=element.textContent||'';
-const parentText=parentElement.textContent||'';
-if(parentText.length-nodeText.length<5){
-
-
-return false;
-}
-
-for(const sibling of element.parentElement.childNodes){
-if(sibling===element){
-continue;
-}
-const siblingTextContent=(sibling.textContent||'').trim();
-
-
-
-
-if(sibling.nodeType===Node.TEXT_NODE&&siblingTextContent.length>0){
-return true;
-}
-}
-
-return false;
-}
-
-
-
-
-
-
-
-
-
-function elementIsInTextBlock(element){
-const{display}=getComputedStyle(element);
-if(display!=='inline'&&display!=='inline-block'){
-return false;
-}
-
-if(hasTextNodeSiblingsFormingTextBlock(element)){
-return true;
-}else if(element.parentElement){
-return elementIsInTextBlock(element.parentElement);
-}else{
-return false;
-}
-}
-
-
-
-
-
-
-
-function truncate(str,maxLength){
-if(str.length<=maxLength){
-return str;
-}
-return str.slice(0,maxLength-1)+'…';
-}
-
-
-
-
-
-
-function elementCenterIsAtZAxisTop(el,elCenterPoint){
-const viewportHeight=window.innerHeight;
-const targetScrollY=Math.floor(elCenterPoint.y/viewportHeight)*viewportHeight;
-if(window.scrollY!==targetScrollY){
-window.scrollTo(0,targetScrollY);
-}
-
-const topEl=document.elementFromPoint(
-elCenterPoint.x,
-elCenterPoint.y-window.scrollY);
-
-
-return topEl===el||el.contains(topEl);
-}
-
-
-
-
-
-
-
-function disableFixedAndStickyElementPointerEvents(){
-const className='lighthouse-disable-pointer-events';
-const styleTag=document.createElement('style');
-styleTag.textContent=`.${className} { pointer-events: none !important }`;
-document.body.appendChild(styleTag);
-
-document.querySelectorAll('*').forEach(el=>{
-const position=getComputedStyle(el).position;
-if(position==='fixed'||position==='sticky'){
-el.classList.add(className);
-}
-});
-
-return function undo(){
-Array.from(document.getElementsByClassName(className)).forEach(el=>{
-el.classList.remove(className);
-});
-styleTag.remove();
-};
-}
-
-
-
-
-
-function gatherTapTargets(){
-
-const targets=[];
-
-
-window.scrollTo(0,0);
-
-
-
-const tapTargetElements=getElementsInDocument(tapTargetsSelector);
-
-
-
-
-
-const tapTargetsWithClientRects=[];
-tapTargetElements.forEach(tapTargetElement=>{
-
-if(elementHasAncestorTapTarget(tapTargetElement)){
-
-
-return;
-}
-if(elementIsInTextBlock(tapTargetElement)){
-
-
-return;
-}
-if(!elementIsVisible(tapTargetElement)){
-return;
-}
-
-tapTargetsWithClientRects.push({
-tapTargetElement,
-clientRects:getClientRects(tapTargetElement)});
-
-});
-
-
-
-
-const reenableFixedAndStickyElementPointerEvents=disableFixedAndStickyElementPointerEvents();
-
-
-
-
-
-const tapTargetsWithVisibleClientRects=[];
-
-
-
-tapTargetsWithClientRects.forEach(({tapTargetElement,clientRects})=>{
-
-let visibleClientRects=clientRects.filter(cr=>cr.width!==0&&cr.height!==0);
-
-
-
-
-
-
-visibleClientRects=visibleClientRects.filter(rect=>{
-
-
-const rectCenterPoint=getRectCenterPoint(rect);
-return elementCenterIsAtZAxisTop(tapTargetElement,rectCenterPoint);
-});
-
-if(visibleClientRects.length>0){
-tapTargetsWithVisibleClientRects.push({
-tapTargetElement,
-visibleClientRects});
-
-}
-});
-
-for(const{tapTargetElement,visibleClientRects}of tapTargetsWithVisibleClientRects){
-targets.push({
-clientRects:visibleClientRects,
-snippet:truncate(tapTargetElement.outerHTML,300),
-
-path:getNodePath(tapTargetElement),
-
-selector:getNodeSelector(tapTargetElement),
-
-nodeLabel:getNodeLabel(tapTargetElement),
-href:tapTargetElement['href']||''});
-
-}
-
-reenableFixedAndStickyElementPointerEvents();
-
-return targets;
-}
-
-class TapTargets extends Gatherer{
-
-
-
-
-afterPass(passContext){
-const expression=`(function() {
-      const tapTargetsSelector = "${tapTargetsSelector}";
-      ${pageFunctions.getElementsInDocumentString};
-      ${disableFixedAndStickyElementPointerEvents.toString()};
-      ${elementIsVisible.toString()};
-      ${elementHasAncestorTapTarget.toString()};
-      ${elementCenterIsAtZAxisTop.toString()}
-      ${truncate.toString()};
-      ${getClientRects.toString()};
-      ${hasTextNodeSiblingsFormingTextBlock.toString()};
-      ${elementIsInTextBlock.toString()};
-      ${getRectArea.toString()};
-      ${getLargestRect.toString()};
-      ${getRectCenterPoint.toString()};
-      ${rectContains.toString()};
-      ${pageFunctions.getNodePathString};
-      ${pageFunctions.getNodeSelectorString};
-      ${pageFunctions.getNodeLabelString};
-      ${gatherTapTargets.toString()};
-
-      return gatherTapTargets();
-    })()`;
-
-return passContext.driver.evaluateAsync(expression,{useIsolation:true});
-}}
-
-
-module.exports=TapTargets;
-
-},{"../../../lib/page-functions.js":76,"../../../lib/rect-helpers.js":77,"../gatherer.js":53}],"../gather/gatherers/service-worker":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('./gatherer.js');
-
-class ServiceWorker extends Gatherer{
-
-
-
-
-async beforePass(passContext){
-const{versions}=await passContext.driver.getServiceWorkerVersions();
-const{registrations}=await passContext.driver.getServiceWorkerRegistrations();
-
-return{
-versions,
-registrations};
-
-}}
-
-
-module.exports=ServiceWorker;
-
-},{"./gatherer.js":53}],"../gather/gatherers/source-maps":[function(require,module,exports){
-(function(Buffer){
-
-
-
-
-
-'use strict';
-
-
-
-const Gatherer=require('./gatherer.js');
-const URL=require('../../lib/url-shim.js');
-
-
-
-
-
-
-
-
-
-
-async function fetchSourceMap(url){
-
-const response=await fetch(url);
-if(response.ok){
-return response.text();
-}else{
-throw new Error(`Received status code ${response.status} for ${url}`);
-}
-}
-
-
-
-
-class SourceMaps extends Gatherer{
-constructor(){
-super();
-
-this._scriptParsedEvents=[];
-this.onScriptParsed=this.onScriptParsed.bind(this);
-}
-
-
-
-
-
-
-async fetchSourceMapInPage(driver,sourceMapUrl){
-driver.setNextProtocolTimeout(1500);
-
-const sourceMapJson=
-await driver.evaluateAsync(`(${fetchSourceMap})(${JSON.stringify(sourceMapUrl)})`);
-return JSON.parse(sourceMapJson);
-}
-
-
-
-
-
-parseSourceMapFromDataUrl(sourceMapURL){
-const buffer=Buffer.from(sourceMapURL.split(',')[1],'base64');
-return JSON.parse(buffer.toString());
-}
-
-
-
-
-onScriptParsed(event){
-if(event.sourceMapURL){
-this._scriptParsedEvents.push(event);
-}
-}
-
-
-
-
-async beforePass(passContext){
-const driver=passContext.driver;
-driver.on('Debugger.scriptParsed',this.onScriptParsed);
-await driver.sendCommand('Debugger.enable');
-}
-
-
-
-
-
-
-_resolveUrl(url,base){
-try{
-return new URL(url,base).href;
-}catch(e){
-return;
-}
-}
-
-
-
-
-
-
-async _retrieveMapFromScriptParsedEvent(driver,event){
-if(!event.sourceMapURL){
-throw new Error('precondition failed: event.sourceMapURL should exist');
-}
-
-
-
-const isSourceMapADataUri=event.sourceMapURL.startsWith('data:');
-const scriptUrl=event.url;
-const rawSourceMapUrl=isSourceMapADataUri?
-event.sourceMapURL:
-this._resolveUrl(event.sourceMapURL,event.url);
-
-if(!rawSourceMapUrl){
-return{
-scriptUrl,
-errorMessage:`Could not resolve map url: ${event.sourceMapURL}`};
-
-}
-
-
-const sourceMapUrl=isSourceMapADataUri?undefined:rawSourceMapUrl;
-
-try{
-const map=isSourceMapADataUri?
-this.parseSourceMapFromDataUrl(rawSourceMapUrl):
-await this.fetchSourceMapInPage(driver,rawSourceMapUrl);
-return{
-scriptUrl,
-sourceMapUrl,
-map};
-
-}catch(err){
-return{
-scriptUrl,
-sourceMapUrl,
-errorMessage:err.toString()};
-
-}
-}
-
-
-
-
-
-async afterPass(passContext){
-const driver=passContext.driver;
-
-driver.off('Debugger.scriptParsed',this.onScriptParsed);
-await driver.sendCommand('Debugger.disable');
-
-const eventProcessPromises=this._scriptParsedEvents.
-map(event=>this._retrieveMapFromScriptParsedEvent(driver,event));
-
-return Promise.all(eventProcessPromises);
-}}
-
-
-module.exports=SourceMaps;
-
-}).call(this,require("buffer").Buffer);
-},{"../../lib/url-shim.js":"url","./gatherer.js":53,"buffer":102}],"../gather/gatherers/start-url":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('./gatherer.js');
-
-
-
-class StartUrl extends Gatherer{
-
-
-
-
-
-async afterPass(passContext){
-
-await passContext.driver.goOffline();
-const result=await this._determineStartUrlAvailability(passContext);
-await passContext.driver.goOnline(passContext);
-
-return result;
-}
-
-
-
-
-
-
-async _determineStartUrlAvailability(passContext){
-const manifest=passContext.baseArtifacts.WebAppManifest;
-const startUrlInfo=this._readManifestStartUrl(manifest);
-if(startUrlInfo.isReadFailure){
-return{statusCode:-1,explanation:startUrlInfo.reason};
-}
-
-try{
-return await this._attemptStartURLFetch(passContext.driver,startUrlInfo.startUrl);
-}catch(err){
-return{statusCode:-1,explanation:'Error while fetching start_url via service worker.'};
-}
-}
-
-
-
-
-
-
-_readManifestStartUrl(manifest){
-if(!manifest||!manifest.value){
-const detailedMsg=manifest&&manifest.warning;
-
-if(detailedMsg){
-return{isReadFailure:true,reason:`Error fetching web app manifest: ${detailedMsg}.`};
-}else{
-return{isReadFailure:true,reason:`No usable web app manifest found on page.`};
-}
-}
-
-
-return{isReadFailure:false,startUrl:manifest.value.start_url.value};
-}
-
-
-
-
-
-
-
-
-_attemptStartURLFetch(driver,startUrl){
-
-
-const timeoutPromise=new Promise(resolve=>
-setTimeout(
-()=>resolve({statusCode:-1,explanation:'Timed out waiting for start_url to respond.'}),
-3000));
-
-
-
-const fetchPromise=new Promise(resolve=>{
-driver.on('Network.responseReceived',onResponseReceived);
-
-
-function onResponseReceived(responseEvent){
-const{response}=responseEvent;
-
-if(response.url!==startUrl)return;
-driver.off('Network.responseReceived',onResponseReceived);
-
-if(!response.fromServiceWorker){
-return resolve({
-statusCode:-1,
-explanation:'The start_url did respond, but not via a service worker.'});
-
-}
-
-return resolve({statusCode:response.status});
-}
-});
-
-return driver.
-evaluateAsync(`window.location = '${startUrl}'`).
-then(()=>Promise.race([fetchPromise,timeoutPromise]));
-}}
-
-
-module.exports=StartUrl;
-
-},{"./gatherer.js":53}],"../gather/gatherers/viewport-dimensions":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Gatherer=require('./gatherer.js');
-
-
-
-
-
-
-
-function getViewportDimensions(){
-
-
-
-return Promise.resolve({
-innerWidth:window.innerWidth,
-innerHeight:window.innerHeight,
-outerWidth:window.outerWidth,
-outerHeight:window.outerHeight,
-devicePixelRatio:window.devicePixelRatio});
-
-}
-
-class ViewportDimensions extends Gatherer{
-
-
-
-
-async afterPass(passContext){
-const driver=passContext.driver;
-
-
-const dimensions=await driver.evaluateAsync(`(${getViewportDimensions.toString()}())`,
-{useIsolation:true});
-
-const allNumeric=Object.values(dimensions).every(Number.isFinite);
-if(!allNumeric){
-const results=JSON.stringify(dimensions);
-throw new Error(`ViewportDimensions results were not numeric: ${results}`);
-}
-
-return dimensions;
-}}
-
-
-module.exports=ViewportDimensions;
-
-},{"./gatherer.js":53}],1:[function(require,module,exports){
-(function(global){
-
-
-
-
-
-'use strict';
-
-const lighthouse=require('../lighthouse-core/index.js');
-const RawProtocol=require('../lighthouse-core/gather/connections/raw.js');
-const log=require('lighthouse-logger');
-const{registerLocaleData,lookupLocale}=require('../lighthouse-core/lib/i18n/i18n.js');
-
-
-
-
-
-
-
-
-
-
-function getDefaultConfigForCategories(categoryIDs){
-return{
-extends:'lighthouse:default',
-plugins:['lighthouse-plugin-publisher-ads'],
-settings:{
-onlyCategories:categoryIDs}};
-
-
-}
-
-
-
-
-
-
-
-
-function runLighthouseInWorker(port,url,flags,categoryIDs){
-
-flags.logLevel=flags.logLevel||'info';
-flags.channel='devtools';
-global.devtools=true;
-const config=getDefaultConfigForCategories(categoryIDs);
-const connection=new RawProtocol(port);
-
-return lighthouse(url,flags,config,connection);
-}
-
-
-function listenForStatus(listenCallback){
-log.events.addListener('status',listenCallback);
-}
-
-if(typeof module!=='undefined'&&module.exports){
-
-module.exports={
-runLighthouseInWorker,
-listenForStatus,
-registerLocaleData,
-lookupLocale};
-
-}
-
-
-
-if(typeof self!=='undefined'){
-
-self.runLighthouseInWorker=runLighthouseInWorker;
-
-self.listenForStatus=listenForStatus;
-
-self.registerLocaleData=registerLocaleData;
-
-self.lookupLocale=lookupLocale;
-}
-
-}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
-},{"../lighthouse-core/gather/connections/raw.js":49,"../lighthouse-core/index.js":54,"../lighthouse-core/lib/i18n/i18n.js":66,"lighthouse-logger":125}],2:[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const Audit=require('../audit.js');
-const i18n=require('../../lib/i18n/i18n.js');
-
-const UIStrings={
-
-failingElementsHeader:'Failing Elements'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-class AxeAudit extends Audit{
-
-
-
-
-
-static audit(artifacts){
-
-
-
-const notApplicables=artifacts.Accessibility.notApplicable||[];
-const isNotApplicable=notApplicables.find(result=>result.id===this.meta.id);
-if(isNotApplicable){
-return{
-score:1,
-notApplicable:true};
-
-}
-
-const violations=artifacts.Accessibility.violations||[];
-const rule=violations.find(result=>result.id===this.meta.id);
-const impact=rule&&rule.impact;
-const tags=rule&&rule.tags;
-
-
-let items=[];
-if(rule&&rule.nodes){
-items=rule.nodes.map(node=>({
-node:{
-type:'node',
-selector:Array.isArray(node.target)?node.target.join(' '):'',
-path:node.path,
-snippet:node.html||node.snippet,
-explanation:node.failureSummary,
-nodeLabel:node.nodeLabel}}));
-
-
-}
-
-
-const headings=[
-{key:'node',itemType:'node',text:str_(UIStrings.failingElementsHeader)}];
-
-
-
-let debugData;
-if(impact||tags){
-debugData={
-type:'debugdata',
-impact,
-tags};
-
-}
-
-return{
-score:Number(rule===undefined),
-extendedInfo:{
-value:rule},
-
-details:{...Audit.makeTableDetails(headings,items),debugData}};
-
-}}
-
-
-module.exports=AxeAudit;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/audits/accessibility/axe-audit.js");
-},{"../../lib/i18n/i18n.js":66,"../audit.js":3}],3:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const statistics=require('../lib/statistics.js');
-const Util=require('../report/html/renderer/util.js');
-
-const DEFAULT_PASS='defaultPass';
-
-
-
-
-
-
-const clampTo2Decimals=val=>Math.round(val*100)/100;
-
-class Audit{
-
-
-
-static get DEFAULT_PASS(){
-return DEFAULT_PASS;
-}
-
-
-
-
-static get SCORING_MODES(){
-return{
-NUMERIC:'numeric',
-BINARY:'binary',
-MANUAL:'manual',
-INFORMATIVE:'informative',
-NOT_APPLICABLE:'notApplicable',
-ERROR:'error'};
-
-}
-
-
-
-
-static get meta(){
-throw new Error('Audit meta information must be overridden.');
-}
-
-
-
-
-static get defaultOptions(){
-return{};
-}
-
-
-
-
-
-
-
-
-
-static audit(artifacts,context){
-throw new Error('audit() method must be overriden');
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-static computeLogNormalScore(measuredValue,diminishingReturnsValue,medianValue){
-const distribution=statistics.getLogNormalDistribution(
-medianValue,
-diminishingReturnsValue);
-
-
-let score=distribution.computeComplementaryPercentile(measuredValue);
-score=Math.min(1,score);
-score=Math.max(0,score);
-return clampTo2Decimals(score);
-}
-
-
-
-
-
-
-
-static makeTableDetails(headings,results,summary){
-if(results.length===0){
-return{
-type:'table',
-headings:[],
-items:[],
-summary};
-
-}
-
-return{
-type:'table',
-headings:headings,
-items:results,
-summary};
-
-}
-
-
-
-
-
-static makeListDetails(items){
-return{
-type:'list',
-items:items};
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-static makeSnippetDetails({
-content,
-title,
-lineMessages,
-generalMessages,
-node,
-maxLineLength=200,
-maxLinesAroundMessage=20})
-{
-const allLines=Audit._makeSnippetLinesArray(content,maxLineLength);
-const lines=Util.filterRelevantLines(allLines,lineMessages,maxLinesAroundMessage);
-return{
-type:'snippet',
-lines,
-title,
-lineMessages,
-generalMessages,
-lineCount:allLines.length,
-node};
-
-}
-
-
-
-
-
-
-static _makeSnippetLinesArray(content,maxLineLength){
-return content.split('\n').map((line,lineIndex)=>{
-const lineNumber=lineIndex+1;
-
-const lineDetail={
-content:line.slice(0,maxLineLength),
-lineNumber};
-
-if(line.length>maxLineLength){
-lineDetail.truncated=true;
-}
-return lineDetail;
-});
-}
-
-
-
-
-
-
-
-
-static makeOpportunityDetails(headings,items,overallSavingsMs,overallSavingsBytes){
-return{
-type:'opportunity',
-headings:items.length===0?[]:headings,
-items,
-overallSavingsMs,
-overallSavingsBytes};
-
-}
-
-
-
-
-
-
-
-static _normalizeAuditScore(score,scoreDisplayMode,auditId){
-if(scoreDisplayMode!==Audit.SCORING_MODES.BINARY&&
-scoreDisplayMode!==Audit.SCORING_MODES.NUMERIC){
-return null;
-}
-
-
-if(score===null||!Number.isFinite(score)){
-throw new Error(`Invalid score for ${auditId}: ${score}`);
-}
-if(score>1)throw new Error(`Audit score for ${auditId} is > 1`);
-if(score<0)throw new Error(`Audit score for ${auditId} is < 0`);
-
-score=clampTo2Decimals(score);
-
-return score;
-}
-
-
-
-
-
-
-static generateErrorAuditResult(audit,errorMessage){
-return Audit.generateAuditResult(audit,{
-score:null,
-errorMessage});
-
-}
-
-
-
-
-
-
-static generateAuditResult(audit,product){
-if(product.score===undefined){
-throw new Error('generateAuditResult requires a score');
-}
-
-
-let scoreDisplayMode=audit.meta.scoreDisplayMode||Audit.SCORING_MODES.BINARY;
-
-
-if(product.errorMessage){
-
-scoreDisplayMode=Audit.SCORING_MODES.ERROR;
-}else if(product.notApplicable){
-
-scoreDisplayMode=Audit.SCORING_MODES.NOT_APPLICABLE;
-}
-
-const score=Audit._normalizeAuditScore(product.score,scoreDisplayMode,audit.meta.id);
-
-let auditTitle=audit.meta.title;
-if(audit.meta.failureTitle){
-if(score!==null&&score<Util.PASS_THRESHOLD){
-auditTitle=audit.meta.failureTitle;
-}
-}
-
-return{
-id:audit.meta.id,
-title:auditTitle,
-description:audit.meta.description,
-
-score,
-scoreDisplayMode,
-numericValue:product.numericValue,
-
-displayValue:product.displayValue,
-explanation:product.explanation,
-errorMessage:product.errorMessage,
-warnings:product.warnings,
-
-details:product.details};
-
-}}
-
-
-module.exports=Audit;
-
-},{"../lib/statistics.js":81,"../report/html/renderer/util.js":87}],4:[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const Audit=require('../audit.js');
-const linearInterpolation=require('../../lib/statistics.js').linearInterpolation;
-const Interactive=require('../../computed/metrics/lantern-interactive.js');
-const i18n=require('../../lib/i18n/i18n.js');
-const NetworkRecords=require('../../computed/network-records.js');
-const LoadSimulator=require('../../computed/load-simulator.js');
-const PageDependencyGraph=require('../../computed/page-dependency-graph.js');
-
-const str_=i18n.createMessageInstanceIdFn(__filename,{});
-
-
-
-
-const KB_IN_BYTES=1024;
-
-const WASTED_MS_FOR_AVERAGE=300;
-const WASTED_MS_FOR_POOR=750;
-const WASTED_MS_FOR_SCORE_OF_ZERO=5000;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-class UnusedBytes extends Audit{
-
-
-
-
-
-
-static scoreForWastedMs(wastedMs){
-if(wastedMs===0){
-return 1;
-}else if(wastedMs<WASTED_MS_FOR_AVERAGE){
-return linearInterpolation(0,1,WASTED_MS_FOR_AVERAGE,0.75,wastedMs);
-}else if(wastedMs<WASTED_MS_FOR_POOR){
-return linearInterpolation(WASTED_MS_FOR_AVERAGE,0.75,WASTED_MS_FOR_POOR,0.5,wastedMs);
-}else{
-return Math.max(
-0,
-linearInterpolation(WASTED_MS_FOR_POOR,0.5,WASTED_MS_FOR_SCORE_OF_ZERO,0,wastedMs));
-
-}
-}
-
-
-
-
-
-
-
-
-
-
-static estimateTransferSize(networkRecord,totalBytes,resourceType){
-if(!networkRecord){
-
-
-
-
-switch(resourceType){
-case'Stylesheet':
-
-return Math.round(totalBytes*0.2);
-case'Script':
-case'Document':
-
-return Math.round(totalBytes*0.33);
-default:
-
-return Math.round(totalBytes*0.5);}
-
-}else if(networkRecord.resourceType===resourceType){
-
-return networkRecord.transferSize||0;
-}else{
-
-
-const transferSize=networkRecord.transferSize||0;
-const resourceSize=networkRecord.resourceSize||0;
-
-const compressionRatio=Number.isFinite(resourceSize)&&resourceSize>0?
-transferSize/resourceSize:1;
-return Math.round(totalBytes*compressionRatio);
-}
-}
-
-
-
-
-
-
-static audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const settings=context&&context.settings||{};
-const simulatorOptions={
-devtoolsLog,
-settings};
-
-
-return NetworkRecords.request(devtoolsLog,context).
-then(networkRecords=>
-Promise.all([
-this.audit_(artifacts,networkRecords,context),
-PageDependencyGraph.request({trace,devtoolsLog},context),
-LoadSimulator.request(simulatorOptions,context)])).
-
-
-then(([result,graph,simulator])=>this.createAuditProduct(result,graph,simulator));
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-static computeWasteWithTTIGraph(results,graph,simulator,options){
-options=Object.assign({includeLoad:true,label:this.meta.id},options);
-const beforeLabel=`${options.label}-before`;
-const afterLabel=`${options.label}-after`;
-
-const simulationBeforeChanges=simulator.simulate(graph,{label:beforeLabel});
-
-const resultsByUrl=new Map();
-for(const result of results){
-resultsByUrl.set(result.url,result);
-}
-
-
-
-const originalTransferSizes=new Map();
-graph.traverse(node=>{
-if(node.type!=='network')return;
-const result=resultsByUrl.get(node.record.url);
-if(!result)return;
-
-const original=node.record.transferSize;
-originalTransferSizes.set(node.record.requestId,original);
-
-const wastedBytes=result.wastedBytes;
-node.record.transferSize=Math.max(original-wastedBytes,0);
-});
-
-const simulationAfterChanges=simulator.simulate(graph,{label:afterLabel});
-
-
-graph.traverse(node=>{
-if(node.type!=='network')return;
-const originalTransferSize=originalTransferSizes.get(node.record.requestId);
-if(originalTransferSize===undefined)return;
-node.record.transferSize=originalTransferSize;
-});
-
-const savingsOnOverallLoad=simulationBeforeChanges.timeInMs-simulationAfterChanges.timeInMs;
-const savingsOnTTI=Interactive.getLastLongTaskEndTime(simulationBeforeChanges.nodeTimings)-
-Interactive.getLastLongTaskEndTime(simulationAfterChanges.nodeTimings);
-
-let savings=savingsOnTTI;
-if(options.includeLoad)savings=Math.max(savings,savingsOnOverallLoad);
-
-
-return Math.round(Math.max(savings,0)/10)*10;
-}
-
-
-
-
-
-
-
-static createAuditProduct(result,graph,simulator){
-const results=result.items.sort((itemA,itemB)=>itemB.wastedBytes-itemA.wastedBytes);
-
-const wastedBytes=results.reduce((sum,item)=>sum+item.wastedBytes,0);
-const wastedKb=Math.round(wastedBytes/KB_IN_BYTES);
-const wastedMs=this.computeWasteWithTTIGraph(results,graph,simulator);
-
-let displayValue=result.displayValue||'';
-if(typeof result.displayValue==='undefined'&&wastedBytes){
-displayValue=str_(i18n.UIStrings.displayValueByteSavings,{wastedBytes});
-}
-
-const details=Audit.makeOpportunityDetails(result.headings,results,wastedMs,wastedBytes);
-
-return{
-explanation:result.explanation,
-warnings:result.warnings,
-displayValue,
-numericValue:wastedMs,
-score:UnusedBytes.scoreForWastedMs(wastedMs),
-extendedInfo:{
-value:{
-wastedMs,
-wastedKb,
-results}},
-
-
-details};
-
-}
-
-
-
-
-
-
-
-
-
-static audit_(artifacts,networkRecords,context){
-throw new Error('audit_ unimplemented');
-}}
-
-
-
-
-module.exports=UnusedBytes;
-
-}).call(this,"/lighthouse-core/audits/byte-efficiency/byte-efficiency-audit.js");
-},{"../../computed/load-simulator.js":10,"../../computed/metrics/lantern-interactive.js":23,"../../computed/network-records.js":34,"../../computed/page-dependency-graph.js":35,"../../lib/i18n/i18n.js":66,"../../lib/statistics.js":81,"../audit.js":3}],5:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const Audit=require('../audit.js');
-
-class ManualAudit extends Audit{
-
-
-
-static get partialMeta(){
-return{
-scoreDisplayMode:Audit.SCORING_MODES.MANUAL,
-requiredArtifacts:[]};
-
-}
-
-
-
-
-static audit(){
-return{
-score:0};
-
-
-}}
-
-
-module.exports=ManualAudit;
-
-},{"../audit.js":3}],6:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-const Audit=require('./audit.js');
-
-class MultiCheckAudit extends Audit{
-
-
-
-
-
-static async audit(artifacts,context){
-const multiProduct=await this.audit_(artifacts,context);
-return this.createAuditProduct(multiProduct);
-}
-
-
-
-
-
-static createAuditProduct(result){
-
-const detailsItem={
-...result,
-...result.manifestValues,
-manifestValues:undefined,
-allChecks:undefined};
-
-
-if(result.manifestValues&&result.manifestValues.allChecks){
-result.manifestValues.allChecks.forEach(check=>{
-detailsItem[check.id]=check.passing;
-});
-}
-
-
-
-const details={
-type:'debugdata',
-
-items:[detailsItem]};
-
-
-
-if(result.failures.length>0){
-return{
-score:0,
-
-explanation:`Failures: ${result.failures.join(',\n')}.`,
-details};
-
-}
-
-
-return{
-score:1,
-details};
-
-}
-
-
-
-
-
-
-
-
-static audit_(artifacts,context){
-throw new Error('audit_ unimplemented');
-}}
-
-
-
-
-module.exports=MultiCheckAudit;
-
-},{"./audit.js":3}],7:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audit.js');
-
-class ViolationAudit extends Audit{
-
-
-
-
-
-static getViolationResults(artifacts,pattern){
-const seen=new Set();
-return artifacts.ConsoleMessages.
-map(message=>message.entry).
-filter(entry=>entry.url&&entry.source==='violation'&&pattern.test(entry.text)).
-map(entry=>({label:`line: ${entry.lineNumber}`,url:entry.url})).
-filter(entry=>{
-
-
-const key=`${entry.url}!${entry.label}`;
-if(seen.has(key))return false;
-seen.add(key);
-return true;
-});
-}}
-
-
-module.exports=ViolationAudit;
-
-},{"./audit.js":3}],8:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const ArbitraryEqualityMap=require('../lib/arbitrary-equality-map.js');
-const log=require('lighthouse-logger');
-
-
-
-
-
-
-
-function makeComputedArtifact(computableArtifact){
-
-
-
-
-
-
-
-
-
-const request=(artifacts,context)=>{
-const computedCache=context.computedCache;
-const computedName=computableArtifact.name;
-
-const cache=computedCache.get(computedName)||new ArbitraryEqualityMap();
-computedCache.set(computedName,cache);
-
-const computed=cache.get(artifacts);
-if(computed){
-return computed;
-}
-
-const status={msg:`Computing artifact: ${computedName}`,id:`lh:computed:${computedName}`};
-log.time(status,'verbose');
-
-const artifactPromise=
-computableArtifact.compute_(artifacts,context);
-cache.set(artifacts,artifactPromise);
-
-artifactPromise.then(()=>log.timeEnd(status)).catch(()=>log.timeEnd(status));
-
-return artifactPromise;
-};
-
-return Object.assign(computableArtifact,{request});
-}
-
-module.exports=makeComputedArtifact;
-
-},{"../lib/arbitrary-equality-map.js":55,"lighthouse-logger":125}],9:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('./computed-artifact.js');
-const NetworkRequest=require('../lib/network-request.js');
-const assert=require('assert');
-const NetworkRecords=require('./network-records.js');
-const MainResource=require('./main-resource.js');
-
-class CriticalRequestChains{
-
-
-
-
-
-
-
-
-static isCritical(request,mainResource){
-assert.ok(mainResource,'mainResource not provided');
-
-
-if(request.isLinkPreload){
-return false;
-}
-
-
-
-
-
-while(request.redirectDestination){
-request=request.redirectDestination;
-}
-
-
-const isIframe=request.resourceType===NetworkRequest.TYPES.Document&&
-request.frameId!==mainResource.frameId;
-
-
-
-
-const nonCriticalResourceTypes=[
-NetworkRequest.TYPES.Image,
-NetworkRequest.TYPES.XHR,
-NetworkRequest.TYPES.Fetch,
-NetworkRequest.TYPES.EventSource];
-
-if(nonCriticalResourceTypes.includes(request.resourceType||'Other')||
-isIframe||
-request.mimeType&&request.mimeType.startsWith('image/')){
-return false;
-}
-
-return['VeryHigh','High','Medium'].includes(request.priority);
-}
-
-
-
-
-
-
-static extractChain(networkRecords,mainResource){
-networkRecords=networkRecords.filter(req=>req.finished);
-
-
-
-const requestIdToRequests=new Map();
-for(const request of networkRecords){
-requestIdToRequests.set(request.requestId,request);
-}
-
-
-
-const criticalRequests=networkRecords.filter(request=>
-CriticalRequestChains.isCritical(request,mainResource));
-
-
-
-const criticalRequestChains={};
-for(const request of criticalRequests){
-
-
-
-
-const ancestors=[];
-let ancestorRequest=request.initiatorRequest;
-
-let node=criticalRequestChains;
-while(ancestorRequest){
-const ancestorIsCritical=CriticalRequestChains.isCritical(ancestorRequest,mainResource);
-
-
-
-
-
-if(!ancestorIsCritical||ancestors.includes(ancestorRequest.requestId)){
-
-
-ancestors.length=0;
-node=undefined;
-break;
-}
-ancestors.push(ancestorRequest.requestId);
-ancestorRequest=ancestorRequest.initiatorRequest;
-}
-
-
-
-let ancestor=ancestors.pop();
-while(ancestor&&node){
-const parentRequest=requestIdToRequests.get(ancestor);
-if(!parentRequest){
-throw new Error(`request with id ${ancestor} not found.`);
-}
-
-const parentRequestId=parentRequest.requestId;
-if(!node[parentRequestId]){
-node[parentRequestId]={
-request:parentRequest,
-children:{}};
-
-}
-
-
-ancestor=ancestors.pop();
-node=node[parentRequestId].children;
-}
-
-if(!node){
-continue;
-}
-
-
-if(node[request.requestId]){
-continue;
-}
-
-
-node[request.requestId]={
-request,
-children:{}};
-
-}
-
-return criticalRequestChains;
-}
-
-
-
-
-
-
-static async compute_(data,context){
-const[networkRecords,mainResource]=await Promise.all([
-NetworkRecords.request(data.devtoolsLog,context),
-MainResource.request(data,context)]);
-
-
-return CriticalRequestChains.extractChain(networkRecords,mainResource);
-}}
-
-
-module.exports=makeComputedArtifact(CriticalRequestChains);
-
-},{"../lib/network-request.js":75,"./computed-artifact.js":8,"./main-resource.js":11,"./network-records.js":34,"assert":92}],10:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('./computed-artifact.js');
-const constants=require('../config/constants.js');
-const Simulator=require('../lib/dependency-graph/simulator/simulator.js');
-const NetworkAnalysis=require('./network-analysis.js');
-
-class LoadSimulator{
-
-
-
-
-
-static async compute_(data,context){
-const{throttlingMethod,throttling,precomputedLanternData}=data.settings;
-const networkAnalysis=await NetworkAnalysis.request(data.devtoolsLog,context);
-
-
-const options={
-additionalRttByOrigin:networkAnalysis.additionalRttByOrigin,
-serverResponseTimeByOrigin:networkAnalysis.serverResponseTimeByOrigin};
-
-
-
-
-if(precomputedLanternData){
-options.additionalRttByOrigin=new Map(Object.entries(
-precomputedLanternData.additionalRttByOrigin));
-options.serverResponseTimeByOrigin=new Map(Object.entries(
-precomputedLanternData.serverResponseTimeByOrigin));
-}
-
-switch(throttlingMethod){
-case'provided':
-options.rtt=networkAnalysis.rtt;
-options.throughput=networkAnalysis.throughput;
-options.cpuSlowdownMultiplier=1;
-options.layoutTaskMultiplier=1;
-break;
-case'devtools':
-if(throttling){
-options.rtt=
-throttling.requestLatencyMs/constants.throttling.DEVTOOLS_RTT_ADJUSTMENT_FACTOR;
-options.throughput=
-throttling.downloadThroughputKbps*1024/
-constants.throttling.DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR;
-}
-
-options.cpuSlowdownMultiplier=1;
-options.layoutTaskMultiplier=1;
-break;
-case'simulate':
-if(throttling){
-options.rtt=throttling.rttMs;
-options.throughput=throttling.throughputKbps*1024;
-options.cpuSlowdownMultiplier=throttling.cpuSlowdownMultiplier;
-}
-break;
-default:
-
-break;}
-
-
-return new Simulator(options);
-}
-
-
-
-
-
-static convertAnalysisToSaveableLanternData(networkAnalysis){
-
-const lanternData={additionalRttByOrigin:{},serverResponseTimeByOrigin:{}};
-for(const[origin,value]of networkAnalysis.additionalRttByOrigin.entries()){
-if(origin.startsWith('http'))lanternData.additionalRttByOrigin[origin]=value;
-}
-
-for(const[origin,value]of networkAnalysis.serverResponseTimeByOrigin.entries()){
-if(origin.startsWith('http'))lanternData.serverResponseTimeByOrigin[origin]=value;
-}
-
-return lanternData;
-}}
-
-
-module.exports=makeComputedArtifact(LoadSimulator);
-
-},{"../config/constants.js":46,"../lib/dependency-graph/simulator/simulator.js":63,"./computed-artifact.js":8,"./network-analysis.js":33}],11:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('./computed-artifact.js');
-const NetworkAnalyzer=require('../lib/dependency-graph/simulator/network-analyzer.js');
-const NetworkRecords=require('./network-records.js');
-
-
-
-
-
-class MainResource{
-
-
-
-
-
-static async compute_(data,context){
-const finalUrl=data.URL.finalUrl;
-const requests=await NetworkRecords.request(data.devtoolsLog,context);
-const mainResource=NetworkAnalyzer.findMainDocument(requests,finalUrl);
-if(!mainResource){
-throw new Error('Unable to identify the main resource');
-}
-
-return mainResource;
-}}
-
-
-module.exports=makeComputedArtifact(MainResource);
-
-},{"../lib/dependency-graph/simulator/network-analyzer.js":62,"./computed-artifact.js":8,"./network-records.js":34}],12:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('./computed-artifact.js');
-const MainThreadTasks_=require('../lib/tracehouse/main-thread-tasks.js');
-const TraceOfTab=require('./trace-of-tab.js');
-
-class MainThreadTasks{
-
-
-
-
-
-static async compute_(trace,context){
-const{mainThreadEvents,timestamps}=await TraceOfTab.request(trace,context);
-return MainThreadTasks_.getMainThreadTasks(mainThreadEvents,timestamps.traceEnd);
-}}
-
-
-module.exports=makeComputedArtifact(MainThreadTasks);
-
-},{"../lib/tracehouse/main-thread-tasks.js":83,"./computed-artifact.js":8,"./trace-of-tab.js":39}],13:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('./computed-artifact.js');
-const icons=require('../lib/icons.js');
-
-const PWA_DISPLAY_VALUES=['minimal-ui','fullscreen','standalone'];
-
-
-
-const SUGGESTED_SHORTNAME_LENGTH=12;
-
-class ManifestValues{
-
-
-
-
-
-static get manifestChecks(){
-return[
-{
-id:'hasStartUrl',
-failureText:'Manifest does not contain a `start_url`',
-validate:manifestValue=>!!manifestValue.start_url.value},
-
-{
-id:'hasIconsAtLeast192px',
-failureText:'Manifest does not have a PNG icon of at least 192px',
-validate:manifestValue=>icons.doExist(manifestValue)&&
-icons.pngSizedAtLeast(192,manifestValue).length>0},
-
-{
-id:'hasIconsAtLeast512px',
-failureText:'Manifest does not have a PNG icon of at least 512px',
-validate:manifestValue=>icons.doExist(manifestValue)&&
-icons.pngSizedAtLeast(512,manifestValue).length>0},
-
-{
-id:'hasPWADisplayValue',
-failureText:'Manifest\'s `display` value is not one of: '+PWA_DISPLAY_VALUES.join(' | '),
-validate:manifestValue=>PWA_DISPLAY_VALUES.includes(manifestValue.display.value)},
-
-{
-id:'hasBackgroundColor',
-failureText:'Manifest does not have `background_color`',
-validate:manifestValue=>!!manifestValue.background_color.value},
-
-{
-id:'hasThemeColor',
-failureText:'Manifest does not have `theme_color`',
-validate:manifestValue=>!!manifestValue.theme_color.value},
-
-{
-id:'hasShortName',
-failureText:'Manifest does not have `short_name`',
-validate:manifestValue=>!!manifestValue.short_name.value},
-
-{
-id:'shortNameLength',
-failureText:`Manifest's \`short_name\` is too long (>${SUGGESTED_SHORTNAME_LENGTH} `+
-`characters) to be displayed on a homescreen without truncation`,
-
-validate:manifestValue=>!!manifestValue.short_name.value&&
-manifestValue.short_name.value.length<=SUGGESTED_SHORTNAME_LENGTH},
-
-{
-id:'hasName',
-failureText:'Manifest does not have `name`',
-validate:manifestValue=>!!manifestValue.name.value}];
-
-
-}
-
-
-
-
-
-
-static async compute_(manifest){
-
-if(manifest===null){
-return{
-isParseFailure:true,
-parseFailureReason:'No manifest was fetched',
-allChecks:[]};
-
-}
-const manifestValue=manifest.value;
-if(manifestValue===undefined){
-return{
-isParseFailure:true,
-parseFailureReason:'Manifest failed to parse as valid JSON',
-allChecks:[]};
-
-}
-
-
-const remainingChecks=ManifestValues.manifestChecks.map(item=>{
-return{
-id:item.id,
-failureText:item.failureText,
-passing:item.validate(manifestValue)};
-
-});
-
-return{
-isParseFailure:false,
-allChecks:remainingChecks};
-
-}}
-
-
-module.exports=makeComputedArtifact(ManifestValues);
-
-},{"../lib/icons.js":68,"./computed-artifact.js":8}],14:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('../computed-artifact.js');
-const ComputedMetric=require('./metric.js');
-const LHError=require('../../lib/lh-error.js');
-const TracingProcessor=require('../../lib/tracehouse/trace-processor.js');
-const LanternEstimatedInputLatency=require('./lantern-estimated-input-latency.js');
-
-const ROLLING_WINDOW_SIZE=5000;
-
-
-
-
-
-
-class EstimatedInputLatency extends ComputedMetric{
-
-
-
-
-static calculateRollingWindowEIL(events){
-const candidateStartEvts=events.filter(evt=>evt.duration>=10);
-
-let worst90thPercentileLatency=16;
-for(const startEvt of candidateStartEvts){
-const latencyPercentiles=TracingProcessor.getRiskToResponsiveness(
-events,
-startEvt.start,
-startEvt.start+ROLLING_WINDOW_SIZE,
-[0.9]);
-
-
-worst90thPercentileLatency=Math.max(latencyPercentiles[0].time,worst90thPercentileLatency);
-}
-
-return worst90thPercentileLatency;
-}
-
-
-
-
-
-
-static computeSimulatedMetric(data,context){
-return LanternEstimatedInputLatency.request(data,context);
-}
-
-
-
-
-
-static computeObservedMetric(data){
-const{firstMeaningfulPaint}=data.traceOfTab.timings;
-if(!firstMeaningfulPaint){
-throw new LHError(LHError.errors.NO_FMP);
-}
-
-const events=TracingProcessor.getMainThreadTopLevelEvents(
-data.traceOfTab,
-firstMeaningfulPaint).
-filter(evt=>evt.duration>=1);
-
-return Promise.resolve({
-timing:EstimatedInputLatency.calculateRollingWindowEIL(events)});
-
-}}
-
-
-module.exports=makeComputedArtifact(EstimatedInputLatency);
-
-},{"../../lib/lh-error.js":71,"../../lib/tracehouse/trace-processor.js":85,"../computed-artifact.js":8,"./lantern-estimated-input-latency.js":19,"./metric.js":30}],15:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('../computed-artifact.js');
-const ComputedMetric=require('./metric.js');
-const LanternFirstContentfulPaint=require('./lantern-first-contentful-paint.js');
-
-class FirstContentfulPaint extends ComputedMetric{
-
-
-
-
-
-static computeSimulatedMetric(data,context){
-return LanternFirstContentfulPaint.request(data,context);
-}
-
-
-
-
-
-static async computeObservedMetric(data){
-const{traceOfTab}=data;
-
-return{
-timing:traceOfTab.timings.firstContentfulPaint,
-timestamp:traceOfTab.timestamps.firstContentfulPaint};
-
-}}
-
-
-module.exports=makeComputedArtifact(FirstContentfulPaint);
-
-},{"../computed-artifact.js":8,"./lantern-first-contentful-paint.js":20,"./metric.js":30}],16:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('../computed-artifact.js');
-const ComputedMetric=require('./metric.js');
-const TracingProcessor=require('../../lib/tracehouse/trace-processor.js');
-const LHError=require('../../lib/lh-error.js');
-const LanternFirstCPUIdle=require('./lantern-first-cpu-idle.js');
-
-const LONG_TASK_THRESHOLD=50;
-
-const MAX_TASK_CLUSTER_DURATION=250;
-const MIN_TASK_CLUSTER_PADDING=1000;
-const MIN_TASK_CLUSTER_FMP_DISTANCE=5000;
-
-const MAX_QUIET_WINDOW_SIZE=5000;
-
-
-const EXPONENTIATION_COEFFICIENT=-Math.log(3-1)/15;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-class FirstCPUIdle extends ComputedMetric{
-
-
-
-
-static getRequiredWindowSizeInMs(t){
-const tInSeconds=t/1000;
-const exponentiationComponent=Math.exp(EXPONENTIATION_COEFFICIENT*tInSeconds);
-return(4*exponentiationComponent+1)*1000;
-}
-
-
-
-
-
-
-
-
-
-
-static getTaskClustersInWindow(tasks,startIndex,windowEnd){
-const clusters=[];
-
-let previousTaskEndTime=-Infinity;
-
-let currentCluster=[];
-
-
-
-
-
-const clusteringWindowEnd=windowEnd+MIN_TASK_CLUSTER_PADDING;
-
-const isInClusteringWindow=task=>task.start<clusteringWindowEnd;
-for(let i=startIndex;i<tasks.length;i++){
-if(!isInClusteringWindow(tasks[i])){
-break;
-}
-
-const task=tasks[i];
-
-
-if(task.start-previousTaskEndTime>MIN_TASK_CLUSTER_PADDING){
-currentCluster=[];
-clusters.push(currentCluster);
-}
-
-currentCluster.push(task);
-previousTaskEndTime=task.end;
-}
-
-return clusters.
-
-map(tasks=>{
-const start=tasks[0].start;
-const end=tasks[tasks.length-1].end;
-const duration=end-start;
-return{start,end,duration};
-}).
-
-filter(cluster=>cluster.start<windowEnd);
-}
-
-
-
-
-
-
-
-
-
-
-static findQuietWindow(FMP,traceEnd,longTasks){
-
-if(longTasks.length===0||
-longTasks[0].start>FMP+FirstCPUIdle.getRequiredWindowSizeInMs(0)){
-return FMP;
-}
-
-
-const isTooCloseToFMP=cluster=>cluster.start<FMP+MIN_TASK_CLUSTER_FMP_DISTANCE;
-
-const isTooLong=cluster=>cluster.duration>MAX_TASK_CLUSTER_DURATION;
-
-const isBadCluster=cluster=>isTooCloseToFMP(cluster)||isTooLong(cluster);
-
-
-
-for(let i=0;i<longTasks.length;i++){
-const windowStart=longTasks[i].end;
-const windowSize=FirstCPUIdle.getRequiredWindowSizeInMs(windowStart-FMP);
-const windowEnd=windowStart+windowSize;
-
-
-if(windowEnd>traceEnd){
-throw new LHError(LHError.errors.NO_FCPUI_IDLE_PERIOD);
-}
-
-
-if(i+1<longTasks.length&&
-longTasks[i+1].start-windowStart<=MIN_TASK_CLUSTER_PADDING){
-continue;
-}
-
-const taskClusters=FirstCPUIdle.getTaskClustersInWindow(longTasks,i+1,windowEnd);
-const hasBadTaskClusters=taskClusters.some(isBadCluster);
-
-if(!hasBadTaskClusters){
-return windowStart;
-}
-}
-
-throw new LHError(LHError.errors.NO_FCPUI_IDLE_PERIOD);
-}
-
-
-
-
-
-
-static computeSimulatedMetric(data,context){
-return LanternFirstCPUIdle.request(data,context);
-}
-
-
-
-
-
-static async computeObservedMetric(data){
-const{traceOfTab}=data;
-const navStart=traceOfTab.timestamps.navigationStart;
-const FMP=traceOfTab.timings.firstMeaningfulPaint;
-const DCL=traceOfTab.timings.domContentLoaded;
-const traceEnd=traceOfTab.timings.traceEnd;
-
-if(!FMP||!DCL){
-throw new LHError(FMP?LHError.errors.NO_DCL:LHError.errors.NO_FMP);
-}
-
-if(traceEnd-FMP<MAX_QUIET_WINDOW_SIZE){
-throw new LHError(LHError.errors.FMP_TOO_LATE_FOR_FCPUI);
-}
-
-const longTasksAfterFMP=TracingProcessor.getMainThreadTopLevelEvents(traceOfTab,FMP).
-filter(evt=>evt.duration>=LONG_TASK_THRESHOLD);
-const firstInteractive=FirstCPUIdle.findQuietWindow(FMP,traceEnd,longTasksAfterFMP);
-
-const valueInMs=Math.max(firstInteractive,DCL);
-
-return Promise.resolve({
-timing:valueInMs,
-timestamp:valueInMs*1000+navStart});
-
-}}
-
-
-
-
-
-
-
-module.exports=makeComputedArtifact(FirstCPUIdle);
-
-},{"../../lib/lh-error.js":71,"../../lib/tracehouse/trace-processor.js":85,"../computed-artifact.js":8,"./lantern-first-cpu-idle.js":21,"./metric.js":30}],17:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('../computed-artifact.js');
-const ComputedMetric=require('./metric.js');
-const LHError=require('../../lib/lh-error.js');
-const LanternFirstMeaningfulPaint=require('./lantern-first-meaningful-paint.js');
-
-class FirstMeaningfulPaint extends ComputedMetric{
-
-
-
-
-
-static computeSimulatedMetric(data,context){
-return LanternFirstMeaningfulPaint.request(data,context);
-}
-
-
-
-
-
-static async computeObservedMetric(data){
-const{traceOfTab}=data;
-if(!traceOfTab.timestamps.firstMeaningfulPaint){
-throw new LHError(LHError.errors.NO_FMP);
-}
-
-return{
-
-timing:traceOfTab.timings.firstMeaningfulPaint,
-timestamp:traceOfTab.timestamps.firstMeaningfulPaint};
-
-}}
-
-
-module.exports=makeComputedArtifact(FirstMeaningfulPaint);
-
-},{"../../lib/lh-error.js":71,"../computed-artifact.js":8,"./lantern-first-meaningful-paint.js":22,"./metric.js":30}],18:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('../computed-artifact.js');
-const ComputedMetric=require('./metric.js');
-const LanternInteractive=require('./lantern-interactive.js');
-
-const NetworkRecorder=require('../../lib/network-recorder.js');
-const TracingProcessor=require('../../lib/tracehouse/trace-processor.js');
-const LHError=require('../../lib/lh-error.js');
-
-const REQUIRED_QUIET_WINDOW=5000;
-const ALLOWED_CONCURRENT_REQUESTS=2;
-
-
-
-
-
-
-class Interactive extends ComputedMetric{
-
-
-
-
-
-
-
-static _findNetworkQuietPeriods(networkRecords,traceOfTab){
-const traceEndTsInMs=traceOfTab.timestamps.traceEnd/1000;
-
-const filteredNetworkRecords=networkRecords.filter(record=>{
-return record.finished&&record.requestMethod==='GET'&&!record.failed&&
-
-record.statusCode<400;
-});
-return NetworkRecorder.findNetworkQuietPeriods(filteredNetworkRecords,
-ALLOWED_CONCURRENT_REQUESTS,traceEndTsInMs);
-}
-
-
-
-
-
-
-
-static _findCPUQuietPeriods(longTasks,traceOfTab){
-const navStartTsInMs=traceOfTab.timestamps.navigationStart/1000;
-const traceEndTsInMs=traceOfTab.timestamps.traceEnd/1000;
-if(longTasks.length===0){
-return[{start:0,end:traceEndTsInMs}];
-}
-
-
-const quietPeriods=[];
-longTasks.forEach((task,index)=>{
-if(index===0){
-quietPeriods.push({
-start:0,
-end:task.start+navStartTsInMs});
-
-}
-
-if(index===longTasks.length-1){
-quietPeriods.push({
-start:task.end+navStartTsInMs,
-end:traceEndTsInMs});
-
-}else{
-quietPeriods.push({
-start:task.end+navStartTsInMs,
-end:longTasks[index+1].start+navStartTsInMs});
-
-}
-});
-
-return quietPeriods;
-}
-
-
-
-
-
-
-
-
-static findOverlappingQuietPeriods(longTasks,networkRecords,traceOfTab){
-const FcpTsInMs=traceOfTab.timestamps.firstContentfulPaint/1000;
-
-
-const isLongEnoughQuietPeriod=period=>
-period.end>FcpTsInMs+REQUIRED_QUIET_WINDOW&&
-period.end-period.start>=REQUIRED_QUIET_WINDOW;
-const networkQuietPeriods=this._findNetworkQuietPeriods(networkRecords,traceOfTab).
-filter(isLongEnoughQuietPeriod);
-const cpuQuietPeriods=this._findCPUQuietPeriods(longTasks,traceOfTab).
-filter(isLongEnoughQuietPeriod);
-
-const cpuQueue=cpuQuietPeriods.slice();
-const networkQueue=networkQuietPeriods.slice();
-
-
-let cpuCandidate=cpuQueue.shift();
-let networkCandidate=networkQueue.shift();
-while(cpuCandidate&&networkCandidate){
-if(cpuCandidate.start>=networkCandidate.start){
-
-if(networkCandidate.end>=cpuCandidate.start+REQUIRED_QUIET_WINDOW){
-return{
-cpuQuietPeriod:cpuCandidate,
-networkQuietPeriod:networkCandidate,
-cpuQuietPeriods,
-networkQuietPeriods};
-
-}else{
-networkCandidate=networkQueue.shift();
-}
-}else{
-
-if(cpuCandidate.end>=networkCandidate.start+REQUIRED_QUIET_WINDOW){
-return{
-cpuQuietPeriod:cpuCandidate,
-networkQuietPeriod:networkCandidate,
-cpuQuietPeriods,
-networkQuietPeriods};
-
-}else{
-cpuCandidate=cpuQueue.shift();
-}
-}
-}
-
-throw new LHError(
-cpuCandidate?
-LHError.errors.NO_TTI_NETWORK_IDLE_PERIOD:
-LHError.errors.NO_TTI_CPU_IDLE_PERIOD);
-
-}
-
-
-
-
-
-
-static computeSimulatedMetric(data,context){
-return LanternInteractive.request(data,context);
-}
-
-
-
-
-
-static computeObservedMetric(data){
-const{traceOfTab,networkRecords}=data;
-
-if(!traceOfTab.timestamps.domContentLoaded){
-throw new LHError(LHError.errors.NO_DCL);
-}
-
-const longTasks=TracingProcessor.getMainThreadTopLevelEvents(traceOfTab).
-filter(event=>event.duration>=50);
-const quietPeriodInfo=Interactive.findOverlappingQuietPeriods(
-longTasks,
-networkRecords,
-traceOfTab);
-
-
-const cpuQuietPeriod=quietPeriodInfo.cpuQuietPeriod;
-
-const timestamp=Math.max(
-cpuQuietPeriod.start,
-traceOfTab.timestamps.firstContentfulPaint/1000,
-traceOfTab.timestamps.domContentLoaded/1000)*
-1000;
-const timing=(timestamp-traceOfTab.timestamps.navigationStart)/1000;
-return Promise.resolve({timing,timestamp});
-}}
-
-
-module.exports=makeComputedArtifact(Interactive);
-
-
-
-
-
-
-
-},{"../../lib/lh-error.js":71,"../../lib/network-recorder.js":74,"../../lib/tracehouse/trace-processor.js":85,"../computed-artifact.js":8,"./lantern-interactive.js":23,"./metric.js":30}],19:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('../computed-artifact.js');
-const LanternMetric=require('./lantern-metric.js');
-const BaseNode=require('../../lib/dependency-graph/base-node.js');
-const LanternFirstMeaningfulPaint=require('./lantern-first-meaningful-paint.js');
-
-
-
-class LanternEstimatedInputLatency extends LanternMetric{
-
-
-
-static get COEFFICIENTS(){
-return{
-intercept:0,
-optimistic:0.4,
-pessimistic:0.4};
-
-}
-
-
-
-
-
-static getOptimisticGraph(dependencyGraph){
-return dependencyGraph;
-}
-
-
-
-
-
-static getPessimisticGraph(dependencyGraph){
-return dependencyGraph;
-}
-
-
-
-
-
-
-static getEstimateFromSimulation(simulation,extras){
-
-
-const fmpTimeInMs=extras.optimistic?
-extras.fmpResult.pessimisticEstimate.timeInMs:
-extras.fmpResult.optimisticEstimate.timeInMs;
-
-const events=LanternEstimatedInputLatency.getEventsAfterFMP(
-simulation.nodeTimings,
-fmpTimeInMs);
-
-
-
-const EstimatedInputLatency=require('./estimated-input-latency.js');
-
-return{
-timeInMs:EstimatedInputLatency.calculateRollingWindowEIL(events),
-nodeTimings:simulation.nodeTimings};
-
-}
-
-
-
-
-
-
-static async compute_(data,context){
-const fmpResult=await LanternFirstMeaningfulPaint.request(data,context);
-return this.computeMetricWithGraphs(data,context,{fmpResult});
-}
-
-
-
-
-
-static getEventsAfterFMP(nodeTimings,fmpTimeInMs){
-
-const events=[];
-for(const[node,timing]of nodeTimings.entries()){
-if(node.type!==BaseNode.TYPES.CPU)continue;
-if(timing.endTime<fmpTimeInMs)continue;
-
-events.push({
-start:timing.startTime,
-end:timing.endTime,
-duration:timing.duration});
-
-}
-
-return events.sort((a,b)=>a.start-b.start);
-}}
-
-
-module.exports=makeComputedArtifact(LanternEstimatedInputLatency);
-
-},{"../../lib/dependency-graph/base-node.js":57,"../computed-artifact.js":8,"./estimated-input-latency.js":14,"./lantern-first-meaningful-paint.js":22,"./lantern-metric.js":25}],20:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('../computed-artifact.js');
-const LanternMetric=require('./lantern-metric.js');
-const BaseNode=require('../../lib/dependency-graph/base-node.js');
-
-
-
-
-
-class LanternFirstContentfulPaint extends LanternMetric{
-
-
-
-static get COEFFICIENTS(){
-return{
-intercept:0,
-optimistic:0.5,
-pessimistic:0.5};
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-static getBlockingNodeData(
-graph,
-filterTimestamp,
-blockingScriptFilter,
-extraBlockingCpuNodesToIncludeFilter)
-{
-
-const scriptUrlToNodeMap=new Map();
-
-
-const cpuNodes=[];
-graph.traverse(node=>{
-if(node.type===BaseNode.TYPES.CPU){
-
-
-if(node.startTime<=filterTimestamp)cpuNodes.push(node);
-
-
-const scriptUrls=node.getEvaluateScriptURLs();
-for(const url of scriptUrls){
-
-const existing=scriptUrlToNodeMap.get(url)||node;
-scriptUrlToNodeMap.set(url,node.startTime<existing.startTime?node:existing);
-}
-}
-});
-
-cpuNodes.sort((a,b)=>a.startTime-b.startTime);
-
-
-const possiblyRenderBlockingScriptUrls=LanternMetric.getScriptUrls(graph,node=>{
-return node.endTime<=filterTimestamp&&blockingScriptFilter(node);
-});
-
-
-
-const definitelyNotRenderBlockingScriptUrls=new Set();
-
-const blockingCpuNodeIds=new Set();
-for(const url of possiblyRenderBlockingScriptUrls){
-
-const cpuNodeForUrl=scriptUrlToNodeMap.get(url);
-
-
-if(!cpuNodeForUrl)continue;
-
-
-if(cpuNodes.includes(cpuNodeForUrl)){
-blockingCpuNodeIds.add(cpuNodeForUrl.id);
-continue;
-}
-
-
-
-definitelyNotRenderBlockingScriptUrls.add(url);
-}
-
-
-
-const firstLayout=cpuNodes.find(node=>node.didPerformLayout());
-if(firstLayout)blockingCpuNodeIds.add(firstLayout.id);
-const firstPaint=cpuNodes.find(node=>node.childEvents.some(e=>e.name==='Paint'));
-if(firstPaint)blockingCpuNodeIds.add(firstPaint.id);
-const firstParse=cpuNodes.find(node=>node.childEvents.some(e=>e.name==='ParseHTML'));
-if(firstParse)blockingCpuNodeIds.add(firstParse.id);
-
-
-if(extraBlockingCpuNodesToIncludeFilter){
-cpuNodes.
-filter(extraBlockingCpuNodesToIncludeFilter).
-forEach(node=>blockingCpuNodeIds.add(node.id));
-}
-
-return{
-definitelyNotRenderBlockingScriptUrls,
-blockingCpuNodeIds};
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-static getFirstPaintBasedGraph(
-dependencyGraph,
-paintTs,
-blockingResourcesFilter,
-extraBlockingCpuNodesToIncludeFilter)
-{
-const{
-definitelyNotRenderBlockingScriptUrls,
-blockingCpuNodeIds}=
-this.getBlockingNodeData(
-dependencyGraph,
-paintTs,
-blockingResourcesFilter,
-extraBlockingCpuNodesToIncludeFilter);
-
-
-return dependencyGraph.cloneWithRelationships(node=>{
-if(node.type===BaseNode.TYPES.NETWORK){
-
-if(node.endTime>paintTs&&!node.isMainDocument())return false;
-
-const url=node.record.url;
-
-if(definitelyNotRenderBlockingScriptUrls.has(url)){
-return false;
-}
-
-return blockingResourcesFilter(node);
-}else{
-
-return blockingCpuNodeIds.has(node.id);
-}
-});
-}
-
-
-
-
-
-
-static getOptimisticGraph(dependencyGraph,traceOfTab){
-return this.getFirstPaintBasedGraph(
-dependencyGraph,
-traceOfTab.timestamps.firstContentfulPaint,
-
-
-
-node=>node.hasRenderBlockingPriority()&&node.initiatorType!=='script');
-
-}
-
-
-
-
-
-
-static getPessimisticGraph(dependencyGraph,traceOfTab){
-return this.getFirstPaintBasedGraph(
-dependencyGraph,
-traceOfTab.timestamps.firstContentfulPaint,
-node=>node.hasRenderBlockingPriority());
-
-}}
-
-
-module.exports=makeComputedArtifact(LanternFirstContentfulPaint);
-
-},{"../../lib/dependency-graph/base-node.js":57,"../computed-artifact.js":8,"./lantern-metric.js":25}],21:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('../computed-artifact.js');
-const BaseNode=require('../../lib/dependency-graph/base-node.js');
-const LanternInteractive=require('./lantern-interactive.js');
-
-class LanternFirstCPUIdle extends LanternInteractive{
-
-
-
-static get COEFFICIENTS(){
-return{
-intercept:0,
-optimistic:1,
-pessimistic:0};
-
-}
-
-
-
-
-
-
-
-static getEstimateFromSimulation(simulation,extras){
-const fmpTimeInMs=extras.optimistic?
-extras.fmpResult.optimisticEstimate.timeInMs:
-extras.fmpResult.pessimisticEstimate.timeInMs;
-
-return{
-timeInMs:LanternFirstCPUIdle.getFirstCPUIdleWindowStart(simulation.nodeTimings,fmpTimeInMs),
-nodeTimings:simulation.nodeTimings};
-
-}
-
-
-
-
-
-
-static getFirstCPUIdleWindowStart(nodeTimings,fmpTimeInMs,longTaskLength=50){
-
-const longTasks=[];
-for(const[node,timing]of nodeTimings.entries()){
-if(node.type!==BaseNode.TYPES.CPU)continue;
-if(timing.duration<longTaskLength)continue;
-longTasks.push({start:timing.startTime,end:timing.endTime});
-}
-
-longTasks.sort((a,b)=>a.start-b.start);
-
-const FirstCPUIdle=require('./first-cpu-idle.js');
-return FirstCPUIdle.findQuietWindow(fmpTimeInMs,Infinity,longTasks);
-}
-
-
-
-
-
-
-static async compute_(data,context){
-return super.compute_(data,context);
-}}
-
-
-module.exports=makeComputedArtifact(LanternFirstCPUIdle);
-
-},{"../../lib/dependency-graph/base-node.js":57,"../computed-artifact.js":8,"./first-cpu-idle.js":16,"./lantern-interactive.js":23}],22:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('../computed-artifact.js');
-const LanternMetric=require('./lantern-metric.js');
-const LHError=require('../../lib/lh-error.js');
-const LanternFirstContentfulPaint=require('./lantern-first-contentful-paint.js');
-
-
-
-class LanternFirstMeaningfulPaint extends LanternMetric{
-
-
-
-static get COEFFICIENTS(){
-return{
-intercept:0,
-optimistic:0.5,
-pessimistic:0.5};
-
-}
-
-
-
-
-
-
-static getOptimisticGraph(dependencyGraph,traceOfTab){
-const fmp=traceOfTab.timestamps.firstMeaningfulPaint;
-if(!fmp){
-throw new LHError(LHError.errors.NO_FMP);
-}
-
-return LanternFirstContentfulPaint.getFirstPaintBasedGraph(
-dependencyGraph,
-fmp,
-
-
-node=>node.hasRenderBlockingPriority()&&node.initiatorType!=='script');
-
-}
-
-
-
-
-
-
-static getPessimisticGraph(dependencyGraph,traceOfTab){
-const fmp=traceOfTab.timestamps.firstMeaningfulPaint;
-if(!fmp){
-throw new LHError(LHError.errors.NO_FMP);
-}
-
-return LanternFirstContentfulPaint.getFirstPaintBasedGraph(
-dependencyGraph,
-fmp,
-node=>node.hasRenderBlockingPriority(),
-
-node=>node.didPerformLayout());
-
-}
-
-
-
-
-
-
-static async compute_(data,context){
-const fcpResult=await LanternFirstContentfulPaint.request(data,context);
-const metricResult=await this.computeMetricWithGraphs(data,context);
-metricResult.timing=Math.max(metricResult.timing,fcpResult.timing);
-return metricResult;
-}}
-
-
-module.exports=makeComputedArtifact(LanternFirstMeaningfulPaint);
-
-},{"../../lib/lh-error.js":71,"../computed-artifact.js":8,"./lantern-first-contentful-paint.js":20,"./lantern-metric.js":25}],23:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('../computed-artifact.js');
-const LanternMetric=require('./lantern-metric.js');
-const BaseNode=require('../../lib/dependency-graph/base-node.js');
-const NetworkRequest=require('../../lib/network-request.js');
-const LanternFirstMeaningfulPaint=require('./lantern-first-meaningful-paint.js');
-
-
-
-
-const CRITICAL_LONG_TASK_THRESHOLD=20;
-
-class LanternInteractive extends LanternMetric{
-
-
-
-static get COEFFICIENTS(){
-return{
-intercept:0,
-optimistic:0.5,
-pessimistic:0.5};
-
-}
-
-
-
-
-
-static getOptimisticGraph(dependencyGraph){
-
-const minimumCpuTaskDuration=CRITICAL_LONG_TASK_THRESHOLD*1000;
-
-return dependencyGraph.cloneWithRelationships(node=>{
-
-if(node.type===BaseNode.TYPES.CPU){
-return node.event.dur>minimumCpuTaskDuration;
-}
-
-
-const isImage=node.record.resourceType===NetworkRequest.TYPES.Image;
-const isScript=node.record.resourceType===NetworkRequest.TYPES.Script;
-return(
-!isImage&&(
-isScript||
-node.record.priority==='High'||
-node.record.priority==='VeryHigh'));
-
-});
-}
-
-
-
-
-
-static getPessimisticGraph(dependencyGraph){
-return dependencyGraph;
-}
-
-
-
-
-
-
-static getEstimateFromSimulation(simulationResult,extras){
-const lastTaskAt=LanternInteractive.getLastLongTaskEndTime(simulationResult.nodeTimings);
-const minimumTime=extras.optimistic?
-extras.fmpResult.optimisticEstimate.timeInMs:
-extras.fmpResult.pessimisticEstimate.timeInMs;
-return{
-timeInMs:Math.max(minimumTime,lastTaskAt),
-nodeTimings:simulationResult.nodeTimings};
-
-}
-
-
-
-
-
-
-static async compute_(data,context){
-const fmpResult=await LanternFirstMeaningfulPaint.request(data,context);
-const metricResult=await this.computeMetricWithGraphs(data,context,{fmpResult});
-metricResult.timing=Math.max(metricResult.timing,fmpResult.timing);
-return metricResult;
-}
-
-
-
-
-
-static getLastLongTaskEndTime(nodeTimings,duration=50){
-return Array.from(nodeTimings.entries()).
-filter(([node,timing])=>{
-if(node.type!==BaseNode.TYPES.CPU)return false;
-return timing.duration>duration;
-}).
-map(([_,timing])=>timing.endTime).
-reduce((max,x)=>Math.max(max||0,x||0),0);
-}}
-
-
-module.exports=makeComputedArtifact(LanternInteractive);
-
-},{"../../lib/dependency-graph/base-node.js":57,"../../lib/network-request.js":75,"../computed-artifact.js":8,"./lantern-first-meaningful-paint.js":22,"./lantern-metric.js":25}],24:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('../computed-artifact.js');
-const LanternMetricArtifact=require('./lantern-metric.js');
-const BaseNode=require('../../lib/dependency-graph/base-node.js');
-const LanternFirstContentfulPaint=require('./lantern-first-contentful-paint.js');
-
-
-
-class LanternMaxPotentialFID extends LanternMetricArtifact{
-
-
-
-static get COEFFICIENTS(){
-return{
-intercept:0,
-optimistic:0.5,
-pessimistic:0.5};
-
-}
-
-
-
-
-
-static getOptimisticGraph(dependencyGraph){
-return dependencyGraph;
-}
-
-
-
-
-
-static getPessimisticGraph(dependencyGraph){
-return dependencyGraph;
-}
-
-
-
-
-
-
-static getEstimateFromSimulation(simulation,extras){
-
-
-const fcpTimeInMs=extras.optimistic?
-extras.fcpResult.pessimisticEstimate.timeInMs:
-extras.fcpResult.optimisticEstimate.timeInMs;
-
-const timings=LanternMaxPotentialFID.getTimingsAfterFCP(
-simulation.nodeTimings,
-fcpTimeInMs);
-
-
-return{
-timeInMs:Math.max(...timings.map(timing=>timing.duration),16),
-nodeTimings:simulation.nodeTimings};
-
-}
-
-
-
-
-
-
-static async compute_(data,context){
-const fcpResult=await LanternFirstContentfulPaint.request(data,context);
-return super.computeMetricWithGraphs(data,context,{fcpResult});
-}
-
-
-
-
-
-
-static getTimingsAfterFCP(nodeTimings,fcpTimeInMs){
-return Array.from(nodeTimings.entries()).
-filter(([node,timing])=>node.type===BaseNode.TYPES.CPU&&timing.endTime>fcpTimeInMs).
-map(([_,timing])=>timing);
-}}
-
-
-module.exports=makeComputedArtifact(LanternMaxPotentialFID);
-
-},{"../../lib/dependency-graph/base-node.js":57,"../computed-artifact.js":8,"./lantern-first-contentful-paint.js":20,"./lantern-metric.js":25}],25:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const BaseNode=require('../../lib/dependency-graph/base-node.js');
-const NetworkRequest=require('../../lib/network-request.js');
-const TraceOfTab=require('../trace-of-tab.js');
-const PageDependencyGraph=require('../page-dependency-graph.js');
-const LoadSimulator=require('../load-simulator.js');
-
-
-
-
-
-class LanternMetricArtifact{
-
-
-
-
-
-static getScriptUrls(dependencyGraph,condition){
-
-const scriptUrls=new Set();
-
-dependencyGraph.traverse(node=>{
-if(node.type===BaseNode.TYPES.CPU)return;
-if(node.record.resourceType!==NetworkRequest.TYPES.Script)return;
-if(condition&&!condition(node))return;
-scriptUrls.add(node.record.url);
-});
-
-return scriptUrls;
-}
-
-
-
-
-static get COEFFICIENTS(){
-throw new Error('COEFFICIENTS unimplemented!');
-}
-
-
-
-
-
-
-
-
-
-
-static getScaledCoefficients(rttMs){
-return this.COEFFICIENTS;
-}
-
-
-
-
-
-
-static getOptimisticGraph(dependencyGraph,traceOfTab){
-throw new Error('Optimistic graph unimplemented!');
-}
-
-
-
-
-
-
-static getPessimisticGraph(dependencyGraph,traceOfTab){
-throw new Error('Pessmistic graph unimplemented!');
-}
-
-
-
-
-
-
-static getEstimateFromSimulation(simulationResult,extras){
-return simulationResult;
-}
-
-
-
-
-
-
-
-static async computeMetricWithGraphs(data,context,extras){
-const{trace,devtoolsLog,settings}=data;
-const metricName=this.name.replace('Lantern','');
-const graph=await PageDependencyGraph.request({trace,devtoolsLog},context);
-const traceOfTab=await TraceOfTab.request(trace,context);
-const simulator=data.simulator||(
-await LoadSimulator.request({devtoolsLog,settings},context));
-
-const optimisticGraph=this.getOptimisticGraph(graph,traceOfTab);
-const pessimisticGraph=this.getPessimisticGraph(graph,traceOfTab);
-
-
-let simulateOptions={label:`optimistic${metricName}`};
-const optimisticSimulation=simulator.simulate(optimisticGraph,simulateOptions);
-
-simulateOptions={label:`optimisticFlex${metricName}`,flexibleOrdering:true};
-const optimisticFlexSimulation=simulator.simulate(optimisticGraph,simulateOptions);
-
-simulateOptions={label:`pessimistic${metricName}`};
-const pessimisticSimulation=simulator.simulate(pessimisticGraph,simulateOptions);
-
-const optimisticEstimate=this.getEstimateFromSimulation(
-optimisticSimulation.timeInMs<optimisticFlexSimulation.timeInMs?
-optimisticSimulation:optimisticFlexSimulation,
-Object.assign({},extras,{optimistic:true}));
-
-
-const pessimisticEstimate=this.getEstimateFromSimulation(
-pessimisticSimulation,
-Object.assign({},extras,{optimistic:false}));
-
-
-const coefficients=this.getScaledCoefficients(simulator.rtt);
-
-const interceptMultiplier=coefficients.intercept>0?
-Math.min(1,optimisticEstimate.timeInMs/1000):1;
-const timing=
-coefficients.intercept*interceptMultiplier+
-coefficients.optimistic*optimisticEstimate.timeInMs+
-coefficients.pessimistic*pessimisticEstimate.timeInMs;
-
-return{
-timing,
-optimisticEstimate,
-pessimisticEstimate,
-optimisticGraph,
-pessimisticGraph};
-
-}
-
-
-
-
-
-
-static async compute_(data,context){
-return this.computeMetricWithGraphs(data,context);
-}}
-
-
-module.exports=LanternMetricArtifact;
-
-},{"../../lib/dependency-graph/base-node.js":57,"../../lib/network-request.js":75,"../load-simulator.js":10,"../page-dependency-graph.js":35,"../trace-of-tab.js":39}],26:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('../computed-artifact.js');
-const LanternMetric=require('./lantern-metric.js');
-const BaseNode=require('../../lib/dependency-graph/base-node.js');
-const Speedline=require('../speedline.js');
-const LanternFirstContentfulPaint=require('./lantern-first-contentful-paint.js');
-const defaultThrottling=require('../../config/constants.js').throttling;
-
-
-
-class LanternSpeedIndex extends LanternMetric{
-
-
-
-static get COEFFICIENTS(){
-return{
-
-
-
-intercept:-250,
-optimistic:1.4,
-pessimistic:0.65};
-
-}
-
-
-
-
-
-static getScaledCoefficients(rttMs){
-
-
-
-
-
-
-
-
-
-
-
-const defaultCoefficients=this.COEFFICIENTS;
-const defaultRttExcess=defaultThrottling.mobileSlow4G.rttMs-30;
-const multiplier=Math.max((rttMs-30)/defaultRttExcess,0);
-
-return{
-intercept:defaultCoefficients.intercept*multiplier,
-optimistic:0.5+(defaultCoefficients.optimistic-0.5)*multiplier,
-pessimistic:0.5+(defaultCoefficients.pessimistic-0.5)*multiplier};
-
-}
-
-
-
-
-
-static getOptimisticGraph(dependencyGraph){
-return dependencyGraph;
-}
-
-
-
-
-
-static getPessimisticGraph(dependencyGraph){
-return dependencyGraph;
-}
-
-
-
-
-
-
-static getEstimateFromSimulation(simulationResult,extras){
-const fcpTimeInMs=extras.fcpResult.pessimisticEstimate.timeInMs;
-const estimate=extras.optimistic?
-extras.speedline.speedIndex:
-LanternSpeedIndex.computeLayoutBasedSpeedIndex(simulationResult.nodeTimings,fcpTimeInMs);
-return{
-timeInMs:estimate,
-nodeTimings:simulationResult.nodeTimings};
-
-}
-
-
-
-
-
-
-static async compute_(data,context){
-const speedline=await Speedline.request(data.trace,context);
-const fcpResult=await LanternFirstContentfulPaint.request(data,context);
-const metricResult=await this.computeMetricWithGraphs(data,context,{
-speedline,
-fcpResult});
-
-metricResult.timing=Math.max(metricResult.timing,fcpResult.timing);
-return metricResult;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-static computeLayoutBasedSpeedIndex(nodeTimings,fcpTimeInMs){
-
-const layoutWeights=[];
-for(const[node,timing]of nodeTimings.entries()){
-if(node.type!==BaseNode.TYPES.CPU)continue;
-
-if(node.childEvents.some(x=>x.name==='Layout')){
-const timingWeight=Math.max(Math.log2(timing.endTime-timing.startTime),0);
-layoutWeights.push({time:timing.endTime,weight:timingWeight});
-}
-}
-
-if(!layoutWeights.length){
-return fcpTimeInMs;
-}
-
-const totalWeightedTime=layoutWeights.
-map(evt=>evt.weight*Math.max(evt.time,fcpTimeInMs)).
-reduce((a,b)=>a+b,0);
-const totalWeight=layoutWeights.map(evt=>evt.weight).reduce((a,b)=>a+b,0);
-return totalWeightedTime/totalWeight;
-}}
-
-
-module.exports=makeComputedArtifact(LanternSpeedIndex);
-
-},{"../../config/constants.js":46,"../../lib/dependency-graph/base-node.js":57,"../computed-artifact.js":8,"../speedline.js":38,"./lantern-first-contentful-paint.js":20,"./lantern-metric.js":25}],27:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('../computed-artifact.js');
-const LanternMetric=require('./lantern-metric.js');
-const BaseNode=require('../../lib/dependency-graph/base-node.js');
-const LanternFirstContentfulPaint=require('./lantern-first-contentful-paint.js');
-const LanternInteractive=require('./lantern-interactive.js');
-
-
-
-class LanternTotalBlockingTime extends LanternMetric{
-
-
-
-static get COEFFICIENTS(){
-return{
-intercept:0,
-optimistic:0.5,
-pessimistic:0.5};
-
-}
-
-
-
-
-
-static getOptimisticGraph(dependencyGraph){
-return dependencyGraph;
-}
-
-
-
-
-
-static getPessimisticGraph(dependencyGraph){
-return dependencyGraph;
-}
-
-
-
-
-
-
-static getEstimateFromSimulation(simulation,extras){
-
-
-
-
-const fcpTimeInMs=extras.optimistic?
-extras.fcpResult.pessimisticEstimate.timeInMs:
-extras.fcpResult.optimisticEstimate.timeInMs;
-
-
-
-
-
-const interactiveTimeMs=extras.optimistic?
-extras.interactiveResult.optimisticEstimate.timeInMs:
-extras.interactiveResult.pessimisticEstimate.timeInMs;
-
-
-const TotalBlockingTime=require('./total-blocking-time.js');
-const minDurationMs=TotalBlockingTime.BLOCKING_TIME_THRESHOLD;
-
-const events=LanternTotalBlockingTime.getTopLevelEvents(
-simulation.nodeTimings,
-minDurationMs);
-
-
-return{
-timeInMs:TotalBlockingTime.calculateSumOfBlockingTime(
-events,
-fcpTimeInMs,
-interactiveTimeMs),
-
-nodeTimings:simulation.nodeTimings};
-
-}
-
-
-
-
-
-
-static async compute_(data,context){
-const fcpResult=await LanternFirstContentfulPaint.request(data,context);
-const interactiveResult=await LanternInteractive.request(data,context);
-return this.computeMetricWithGraphs(data,context,{fcpResult,interactiveResult});
-}
-
-
-
-
-
-static getTopLevelEvents(nodeTimings,minDurationMs){
-
-
-const events=[];
-
-for(const[node,timing]of nodeTimings.entries()){
-if(node.type!==BaseNode.TYPES.CPU)continue;
-
-if(timing.duration<minDurationMs)continue;
-
-events.push({
-start:timing.startTime,
-end:timing.endTime,
-duration:timing.duration});
-
-}
-
-return events;
-}}
-
-
-module.exports=makeComputedArtifact(LanternTotalBlockingTime);
-
-},{"../../lib/dependency-graph/base-node.js":57,"../computed-artifact.js":8,"./lantern-first-contentful-paint.js":20,"./lantern-interactive.js":23,"./lantern-metric.js":25,"./total-blocking-time.js":32}],28:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('../computed-artifact.js');
-const ComputedMetric=require('./metric.js');
-const LHError=require('../../lib/lh-error.js');
-
-class LargestContentfulPaint extends ComputedMetric{
-
-
-
-
-
-
-static computeSimulatedMetric(data,context){
-throw new Error('Unimplemented');
-}
-
-
-
-
-
-static async computeObservedMetric(data){
-const{traceOfTab}=data;
-if(!traceOfTab.timestamps.largestContentfulPaint){
-throw new LHError(LHError.errors.NO_LCP);
-}
-
-return{
-
-timing:traceOfTab.timings.largestContentfulPaint,
-timestamp:traceOfTab.timestamps.largestContentfulPaint};
-
-}}
-
-
-module.exports=makeComputedArtifact(LargestContentfulPaint);
-
-},{"../../lib/lh-error.js":71,"../computed-artifact.js":8,"./metric.js":30}],29:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('../computed-artifact.js');
-const MetricArtifact=require('./metric.js');
-const LanternMaxPotentialFID=require('./lantern-max-potential-fid.js');
-const LHError=require('../../lib/lh-error.js');
-const TracingProcessor=require('../../lib/tracehouse/trace-processor.js');
-
-class MaxPotentialFID extends MetricArtifact{
-
-
-
-
-
-static computeSimulatedMetric(data,context){
-return LanternMaxPotentialFID.request(data,context);
-}
-
-
-
-
-
-static computeObservedMetric(data){
-const{firstContentfulPaint}=data.traceOfTab.timings;
-if(!firstContentfulPaint){
-throw new LHError(LHError.errors.NO_FCP);
-}
-
-const events=TracingProcessor.getMainThreadTopLevelEvents(
-data.traceOfTab,
-firstContentfulPaint).
-filter(evt=>evt.duration>=1);
-
-return Promise.resolve({
-timing:Math.max(...events.map(evt=>evt.duration),16)});
-
-}}
-
-
-module.exports=makeComputedArtifact(MaxPotentialFID);
-
-},{"../../lib/lh-error.js":71,"../../lib/tracehouse/trace-processor.js":85,"../computed-artifact.js":8,"./lantern-max-potential-fid.js":24,"./metric.js":30}],30:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const TracingProcessor=require('../../lib/tracehouse/trace-processor.js');
-const TraceOfTab=require('../trace-of-tab.js');
-const NetworkRecords=require('../network-records.js');
-
-
-
-
-
-
-
-
-
-
-class ComputedMetric{
-constructor(){}
-
-
-
-
-
-
-static computeSimulatedMetric(data,context){
-throw new Error('Unimplemented');
-}
-
-
-
-
-
-
-static computeObservedMetric(data,context){
-throw new Error('Unimplemented');
-}
-
-
-
-
-
-
-static async compute_(data,context){
-const{trace,devtoolsLog,settings}=data;
-if(!trace||!devtoolsLog||!settings){
-throw new Error('Did not provide necessary metric computation data');
-}
-
-const augmentedData=Object.assign({
-networkRecords:await NetworkRecords.request(devtoolsLog,context),
-traceOfTab:await TraceOfTab.request(trace,context)},
-data);
-
-TracingProcessor.assertHasToplevelEvents(augmentedData.traceOfTab.mainThreadEvents);
-
-switch(settings.throttlingMethod){
-case'simulate':
-return this.computeSimulatedMetric(augmentedData,context);
-case'provided':
-case'devtools':
-return this.computeObservedMetric(augmentedData,context);
-default:
-throw new TypeError(`Unrecognized throttling method: ${settings.throttlingMethod}`);}
-
-}}
-
-
-module.exports=ComputedMetric;
-
-},{"../../lib/tracehouse/trace-processor.js":85,"../network-records.js":34,"../trace-of-tab.js":39}],31:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('../computed-artifact.js');
-const ComputedMetric=require('./metric.js');
-const LanternSpeedIndex=require('./lantern-speed-index.js');
-const Speedline=require('../speedline.js');
-
-class SpeedIndex extends ComputedMetric{
-
-
-
-
-
-static computeSimulatedMetric(data,context){
-return LanternSpeedIndex.request(data,context);
-}
-
-
-
-
-
-
-static async computeObservedMetric(data,context){
-const speedline=await Speedline.request(data.trace,context);
-const timing=Math.round(speedline.speedIndex);
-const timestamp=(timing+speedline.beginning)*1000;
-return Promise.resolve({timing,timestamp});
-}}
-
-
-module.exports=makeComputedArtifact(SpeedIndex);
-
-},{"../computed-artifact.js":8,"../speedline.js":38,"./lantern-speed-index.js":26,"./metric.js":30}],32:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('../computed-artifact.js');
-const ComputedMetric=require('./metric.js');
-const LHError=require('../../lib/lh-error.js');
-const TracingProcessor=require('../../lib/tracehouse/trace-processor.js');
-const LanternTotalBlockingTime=require('./lantern-total-blocking-time.js');
-const TimetoInteractive=require('./interactive.js');
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-class TotalBlockingTime extends ComputedMetric{
-
-
-
-static get BLOCKING_TIME_THRESHOLD(){
-return 50;
-}
-
-
-
-
-
-
-static calculateSumOfBlockingTime(topLevelEvents,fcpTimeInMs,interactiveTimeMs){
-if(interactiveTimeMs<=fcpTimeInMs)return 0;
-
-const threshold=TotalBlockingTime.BLOCKING_TIME_THRESHOLD;
-let sumBlockingTime=0;
-for(const event of topLevelEvents){
-
-if(event.duration<threshold)continue;
-
-
-
-
-
-if(event.end<fcpTimeInMs)continue;
-
-
-
-if(event.start>interactiveTimeMs)continue;
-
-
-
-
-
-
-const clippedStart=Math.max(event.start,fcpTimeInMs);
-const clippedEnd=Math.min(event.end,interactiveTimeMs);
-const clippedDuration=clippedEnd-clippedStart;
-if(clippedDuration<threshold)continue;
-
-
-
-
-
-sumBlockingTime+=clippedDuration-threshold;
-}
-
-return sumBlockingTime;
-}
-
-
-
-
-
-
-static computeSimulatedMetric(data,context){
-return LanternTotalBlockingTime.request(data,context);
-}
-
-
-
-
-
-
-static async computeObservedMetric(data,context){
-const{firstContentfulPaint}=data.traceOfTab.timings;
-if(!firstContentfulPaint){
-throw new LHError(LHError.errors.NO_FCP);
-}
-
-const interactiveTimeMs=(await TimetoInteractive.request(data,context)).timing;
-
-const events=TracingProcessor.getMainThreadTopLevelEvents(data.traceOfTab);
-
-return{
-timing:TotalBlockingTime.calculateSumOfBlockingTime(
-events,
-firstContentfulPaint,
-interactiveTimeMs)};
-
-
-}}
-
-
-module.exports=makeComputedArtifact(TotalBlockingTime);
-
-},{"../../lib/lh-error.js":71,"../../lib/tracehouse/trace-processor.js":85,"../computed-artifact.js":8,"./interactive.js":18,"./lantern-total-blocking-time.js":27,"./metric.js":30}],33:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('./computed-artifact.js');
-const NetworkAnalyzer=require('../lib/dependency-graph/simulator/network-analyzer.js');
-const NetworkRecords=require('./network-records.js');
-
-class NetworkAnalysis{
-
-
-
-
-static computeRTTAndServerResponseTime(records){
-
-
-const rttByOrigin=new Map();
-for(const[origin,summary]of NetworkAnalyzer.estimateRTTByOrigin(records).entries()){
-rttByOrigin.set(origin,summary.min);
-}
-
-
-
-const minimumRtt=Math.min(...Array.from(rttByOrigin.values()));
-
-const responseTimeSummaries=NetworkAnalyzer.estimateServerResponseTimeByOrigin(records,{
-rttByOrigin});
-
-
-
-const additionalRttByOrigin=new Map();
-
-const serverResponseTimeByOrigin=new Map();
-for(const[origin,summary]of responseTimeSummaries.entries()){
-
-const rttForOrigin=rttByOrigin.get(origin)||minimumRtt;
-additionalRttByOrigin.set(origin,rttForOrigin-minimumRtt);
-serverResponseTimeByOrigin.set(origin,summary.median);
-}
-
-return{
-rtt:minimumRtt,
-additionalRttByOrigin,
-serverResponseTimeByOrigin};
-
-}
-
-
-
-
-
-
-static async compute_(devtoolsLog,context){
-const records=await NetworkRecords.request(devtoolsLog,context);
-const throughput=NetworkAnalyzer.estimateThroughput(records);
-const rttAndServerResponseTime=NetworkAnalysis.computeRTTAndServerResponseTime(records);
-return{throughput,...rttAndServerResponseTime};
-}}
-
-
-module.exports=makeComputedArtifact(NetworkAnalysis);
-
-},{"../lib/dependency-graph/simulator/network-analyzer.js":62,"./computed-artifact.js":8,"./network-records.js":34}],34:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('./computed-artifact.js');
-const NetworkRecorder=require('../lib/network-recorder.js');
-
-class NetworkRecords{
-
-
-
-
-static async compute_(devtoolsLog){
-return NetworkRecorder.recordsFromLogs(devtoolsLog);
-}}
-
-
-module.exports=makeComputedArtifact(NetworkRecords);
-
-},{"../lib/network-recorder.js":74,"./computed-artifact.js":8}],35:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('./computed-artifact.js');
-const NetworkNode=require('../lib/dependency-graph/network-node.js');
-const CPUNode=require('../lib/dependency-graph/cpu-node.js');
-const NetworkAnalyzer=require('../lib/dependency-graph/simulator/network-analyzer.js');
-const TracingProcessor=require('../lib/tracehouse/trace-processor.js');
-const NetworkRequest=require('../lib/network-request.js');
-const TraceOfTab=require('./trace-of-tab.js');
-const NetworkRecords=require('./network-records.js');
-
-
-
-
-const MINIMUM_TASK_DURATION_OF_INTEREST=10;
-
-
-const IGNORED_MIME_TYPES_REGEX=/^video/;
-
-class PageDependencyGraph{
-
-
-
-
-static getNetworkInitiators(record){
-if(!record.initiator)return[];
-if(record.initiator.url)return[record.initiator.url];
-if(record.initiator.type==='script'){
-
-
-
-
-const scriptURLs=new Set();
-let stack=record.initiator.stack;
-while(stack){
-const callFrames=stack.callFrames||[];
-for(const frame of callFrames){
-if(frame.url)scriptURLs.add(frame.url);
-}
-
-stack=stack.parent;
-}
-
-return Array.from(scriptURLs);
-}
-
-return[];
-}
-
-
-
-
-
-static getNetworkNodeOutput(networkRecords){
-
-const nodes=[];
-const idToNodeMap=new Map();
-const urlToNodeMap=new Map();
-
-networkRecords.forEach(record=>{
-if(IGNORED_MIME_TYPES_REGEX.test(record.mimeType))return;
-
-
-
-
-
-while(idToNodeMap.has(record.requestId)){
-record.requestId+=':duplicate';
-}
-
-const node=new NetworkNode(record);
-nodes.push(node);
-
-const list=urlToNodeMap.get(record.url)||[];
-list.push(node);
-
-idToNodeMap.set(record.requestId,node);
-urlToNodeMap.set(record.url,list);
-});
-
-return{nodes,idToNodeMap,urlToNodeMap};
-}
-
-
-
-
-
-static getCPUNodes(traceOfTab){
-
-const nodes=[];
-let i=0;
-
-TracingProcessor.assertHasToplevelEvents(traceOfTab.mainThreadEvents);
-
-const minimumEvtDur=MINIMUM_TASK_DURATION_OF_INTEREST*1000;
-while(i<traceOfTab.mainThreadEvents.length){
-const evt=traceOfTab.mainThreadEvents[i];
-
-
-if(
-!TracingProcessor.isScheduleableTask(evt)||
-!evt.dur||
-evt.dur<minimumEvtDur)
-{
-i++;
-continue;
-}
-
-
-
-const children=[];
-i++;
-for(
-const endTime=evt.ts+evt.dur;
-i<traceOfTab.mainThreadEvents.length&&traceOfTab.mainThreadEvents[i].ts<endTime;
-i++)
-{
-children.push(traceOfTab.mainThreadEvents[i]);
-}
-
-nodes.push(new CPUNode(evt,children));
-}
-
-return nodes;
-}
-
-
-
-
-
-static linkNetworkNodes(rootNode,networkNodeOutput){
-networkNodeOutput.nodes.forEach(node=>{
-const initiators=PageDependencyGraph.getNetworkInitiators(node.record);
-if(initiators.length){
-initiators.forEach(initiator=>{
-const parentCandidates=networkNodeOutput.urlToNodeMap.get(initiator)||[rootNode];
-
-const parent=parentCandidates.length===1?parentCandidates[0]:rootNode;
-node.addDependency(parent);
-});
-}else if(node!==rootNode){
-rootNode.addDependent(node);
-}
-
-if(!node.record.redirects)return;
-
-const redirects=[...node.record.redirects,node.record];
-for(let i=1;i<redirects.length;i++){
-const redirectNode=networkNodeOutput.idToNodeMap.get(redirects[i-1].requestId);
-const actualNode=networkNodeOutput.idToNodeMap.get(redirects[i].requestId);
-if(actualNode&&redirectNode){
-actualNode.addDependency(redirectNode);
-}
-}
-});
-}
-
-
-
-
-
-
-static linkCPUNodes(rootNode,networkNodeOutput,cpuNodes){
-
-function addDependentNetworkRequest(cpuNode,reqId){
-const networkNode=networkNodeOutput.idToNodeMap.get(reqId);
-if(!networkNode||
-
-networkNode.record.resourceType!==NetworkRequest.TYPES.XHR||
-
-
-networkNode.startTime<=cpuNode.startTime)return;
-cpuNode.addDependent(networkNode);
-}
-
-
-function addDependencyOnUrl(cpuNode,url){
-if(!url)return;
-
-
-const minimumAllowableTimeSinceNetworkNodeEnd=-100*1000;
-const candidates=networkNodeOutput.urlToNodeMap.get(url)||[];
-
-let minCandidate=null;
-let minDistance=Infinity;
-
-for(const candidate of candidates){
-
-
-if(cpuNode.startTime<=candidate.startTime)return;
-
-const distance=cpuNode.startTime-candidate.endTime;
-if(distance>=minimumAllowableTimeSinceNetworkNodeEnd&&distance<minDistance){
-minCandidate=candidate;
-minDistance=distance;
-}
-}
-
-if(!minCandidate)return;
-cpuNode.addDependency(minCandidate);
-}
-
-
-const timers=new Map();
-for(const node of cpuNodes){
-for(const evt of node.childEvents){
-if(!evt.args.data)continue;
-
-const argsUrl=evt.args.data.url;
-const stackTraceUrls=(evt.args.data.stackTrace||[]).map(l=>l.url).filter(Boolean);
-
-switch(evt.name){
-case'TimerInstall':
-
-timers.set(evt.args.data.timerId,node);
-stackTraceUrls.forEach(url=>addDependencyOnUrl(node,url));
-break;
-case'TimerFire':{
-
-const installer=timers.get(evt.args.data.timerId);
-if(!installer)break;
-installer.addDependent(node);
-break;
-}
-
-case'InvalidateLayout':
-case'ScheduleStyleRecalculation':
-stackTraceUrls.forEach(url=>addDependencyOnUrl(node,url));
-break;
-
-case'EvaluateScript':
-
-addDependencyOnUrl(node,argsUrl);
-stackTraceUrls.forEach(url=>addDependencyOnUrl(node,url));
-break;
-
-case'XHRReadyStateChange':
-
-
-if(evt.args.data.readyState!==4)break;
-
-
-addDependencyOnUrl(node,argsUrl);
-stackTraceUrls.forEach(url=>addDependencyOnUrl(node,url));
-break;
-
-case'FunctionCall':
-case'v8.compile':
-
-addDependencyOnUrl(node,argsUrl);
-break;
-
-case'ParseAuthorStyleSheet':
-
-addDependencyOnUrl(node,evt.args.data.styleSheetUrl);
-break;
-
-case'ResourceSendRequest':
-
-addDependentNetworkRequest(node,evt.args.data.requestId);
-stackTraceUrls.forEach(url=>addDependencyOnUrl(node,url));
-break;}
-
-}
-
-if(node.getNumberOfDependencies()===0){
-node.addDependency(rootNode);
-}
-}
-}
-
-
-
-
-
-
-static createGraph(traceOfTab,networkRecords){
-const networkNodeOutput=PageDependencyGraph.getNetworkNodeOutput(networkRecords);
-const cpuNodes=PageDependencyGraph.getCPUNodes(traceOfTab);
-
-
-const rootRequest=networkRecords.reduce((min,r)=>r.startTime<min.startTime?r:min);
-const rootNode=networkNodeOutput.idToNodeMap.get(rootRequest.requestId);
-
-
-const mainDocumentRequest=NetworkAnalyzer.findMainDocument(networkRecords);
-const mainDocumentNode=networkNodeOutput.idToNodeMap.get(mainDocumentRequest.requestId);
-
-if(!rootNode||!mainDocumentNode){
-
-throw new Error(`${rootNode?'mainDocument':'root'}Node not found.`);
-}
-
-if(mainDocumentNode!==rootNode&&(
-!mainDocumentNode.record.redirects||
-!mainDocumentNode.record.redirects.includes(rootNode.record))){
-throw new Error('Root node was not in redirect chain of mainDocument');
-}
-
-PageDependencyGraph.linkNetworkNodes(rootNode,networkNodeOutput);
-PageDependencyGraph.linkCPUNodes(rootNode,networkNodeOutput,cpuNodes);
-mainDocumentNode.setIsMainDocument(true);
-
-if(NetworkNode.hasCycle(rootNode)){
-throw new Error('Invalid dependency graph created, cycle detected');
-}
-
-return rootNode;
-}
-
-
-
-
-
-static printGraph(rootNode,widthInCharacters=100){
-
-function padRight(str,target,padChar=' '){
-return str+padChar.repeat(Math.max(target-str.length,0));
-}
-
-
-const nodes=[];
-rootNode.traverse(node=>nodes.push(node));
-nodes.sort((a,b)=>a.startTime-b.startTime);
-
-const min=nodes[0].startTime;
-const max=nodes.reduce((max,node)=>Math.max(max,node.endTime),0);
-
-const totalTime=max-min;
-const timePerCharacter=totalTime/widthInCharacters;
-nodes.forEach(node=>{
-const offset=Math.round((node.startTime-min)/timePerCharacter);
-const length=Math.ceil((node.endTime-node.startTime)/timePerCharacter);
-const bar=padRight('',offset)+padRight('',length,'=');
-
-
-const displayName=node.record?node.record.url:node.type;
-
-console.log(padRight(bar,widthInCharacters),`| ${displayName.slice(0,30)}`);
-});
-}
-
-
-
-
-
-
-static async compute_(data,context){
-const trace=data.trace;
-const devtoolsLog=data.devtoolsLog;
-const[traceOfTab,networkRecords]=await Promise.all([
-TraceOfTab.request(trace,context),
-NetworkRecords.request(devtoolsLog,context)]);
-
-
-return PageDependencyGraph.createGraph(traceOfTab,networkRecords);
-}}
-
-
-module.exports=makeComputedArtifact(PageDependencyGraph);
-
-
-
-
-
-
-
-
-},{"../lib/dependency-graph/cpu-node.js":58,"../lib/dependency-graph/network-node.js":59,"../lib/dependency-graph/simulator/network-analyzer.js":62,"../lib/network-request.js":75,"../lib/tracehouse/trace-processor.js":85,"./computed-artifact.js":8,"./network-records.js":34,"./trace-of-tab.js":39}],36:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('./computed-artifact.js');
-const NetworkRecords=require('./network-records.js');
-const MainResource=require('./main-resource.js');
-const URL=require('../lib/url-shim.js');
-
-
-class ResourceSummary{
-
-
-
-
-static determineResourceType(record){
-if(!record.resourceType)return'other';
-
-const requestToResourceType={
-'Stylesheet':'stylesheet',
-'Image':'image',
-'Media':'media',
-'Font':'font',
-'Script':'script',
-'Document':'document'};
-
-return requestToResourceType[record.resourceType]||'other';
-}
-
-
-
-
-
-
-static summarize(networkRecords,mainResourceURL){
-
-const resourceSummary={
-'stylesheet':{count:0,size:0},
-'image':{count:0,size:0},
-'media':{count:0,size:0},
-'font':{count:0,size:0},
-'script':{count:0,size:0},
-'document':{count:0,size:0},
-'other':{count:0,size:0},
-'total':{count:0,size:0},
-'third-party':{count:0,size:0}};
-
-
-for(const record of networkRecords){
-const type=this.determineResourceType(record);
-resourceSummary[type].count++;
-resourceSummary[type].size+=record.transferSize;
-
-resourceSummary.total.count++;
-resourceSummary.total.size+=record.transferSize;
-
-
-if(!URL.rootDomainsMatch(record.url,mainResourceURL)){
-resourceSummary['third-party'].count++;
-resourceSummary['third-party'].size+=record.transferSize;
-}
-}
-return resourceSummary;
-}
-
-
-
-
-
-
-static async compute_(data,context){
-const[networkRecords,mainResource]=await Promise.all([
-NetworkRecords.request(data.devtoolsLog,context),
-MainResource.request(data,context)]);
-
-
-return ResourceSummary.summarize(networkRecords,mainResource.url);
-}}
-
-
-module.exports=makeComputedArtifact(ResourceSummary);
-
-},{"../lib/url-shim.js":"url","./computed-artifact.js":8,"./main-resource.js":11,"./network-records.js":34}],37:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('./computed-artifact.js');
-
-const SCREENSHOT_TRACE_NAME='Screenshot';
-
-class Screenshots{
-
-
-
-
-static async compute_(trace){
-return trace.traceEvents.
-filter(evt=>evt.name===SCREENSHOT_TRACE_NAME).
-map(evt=>{
-return{
-timestamp:evt.ts,
-datauri:`data:image/jpeg;base64,${evt.args.snapshot}`};
-
-});
-}}
-
-
-module.exports=makeComputedArtifact(Screenshots);
-
-},{"./computed-artifact.js":8}],38:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('./computed-artifact.js');
-const speedline=require('speedline-core');
-const LHError=require('../lib/lh-error.js');
-const TraceOfTab=require('./trace-of-tab.js');
-
-class Speedline{
-
-
-
-
-
-static async compute_(trace,context){
-
-
-return TraceOfTab.request(trace,context).then(traceOfTab=>{
-
-
-const traceEvents=trace.traceEvents.slice();
-
-
-const navStart=traceOfTab.timestamps.navigationStart;
-return speedline(traceEvents,{
-timeOrigin:navStart,
-fastMode:true,
-include:'speedIndex'});
-
-}).catch(err=>{
-if(/No screenshots found in trace/.test(err.message)){
-throw new LHError(LHError.errors.NO_SCREENSHOTS);
-}
-
-throw err;
-}).then(speedline=>{
-if(speedline.frames.length===0){
-throw new LHError(LHError.errors.NO_SPEEDLINE_FRAMES);
-}
-
-if(speedline.speedIndex===0){
-throw new LHError(LHError.errors.SPEEDINDEX_OF_ZERO);
-}
-
-return speedline;
-});
-}}
-
-
-module.exports=makeComputedArtifact(Speedline);
-
-},{"../lib/lh-error.js":71,"./computed-artifact.js":8,"./trace-of-tab.js":39,"speedline-core":181}],39:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('./computed-artifact.js');
-const LHError=require('../lib/lh-error.js');
-const TraceProcessor=require('../lib/tracehouse/trace-processor.js');
-
-
-
-class LHTraceProcessor extends TraceProcessor{
-
-
-
-static createNoNavstartError(){
-return new LHError(LHError.errors.NO_NAVSTART);
-}
-
-
-
-
-static createNoTracingStartedError(){
-return new LHError(LHError.errors.NO_TRACING_STARTED);
-}}
-
-
-
-class TraceOfTab{
-
-
-
-
-
-
-static async compute_(trace){
-
-
-
-const traceOfTab=await LHTraceProcessor.computeTraceOfTab(trace);
-const{timings,timestamps,firstContentfulPaintEvt}=traceOfTab;
-const{firstContentfulPaint:firstContentfulPaintTiming}=timings;
-const{firstContentfulPaint:firstContentfulPaintTs}=timestamps;
-if(
-!firstContentfulPaintEvt||
-firstContentfulPaintTiming===undefined||
-firstContentfulPaintTs===undefined)
-{
-throw new LHError(LHError.errors.NO_FCP);
-}
-
-
-
-return{
-...traceOfTab,
-firstContentfulPaintEvt,
-timings:{...timings,firstContentfulPaint:firstContentfulPaintTiming},
-timestamps:{...timestamps,firstContentfulPaint:firstContentfulPaintTs}};
-
-}}
-
-
-module.exports=makeComputedArtifact(TraceOfTab);
-
-},{"../lib/lh-error.js":71,"../lib/tracehouse/trace-processor.js":85,"./computed-artifact.js":8}],40:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const makeComputedArtifact=require('./computed-artifact.js');
-const TraceOfTab=require('./trace-of-tab.js');
-
-
-
-
-class UserTimings{
-
-
-
-
-
-static async compute_(trace,context){
-const traceOfTab=await TraceOfTab.request(trace,context);
-
-const userTimings=[];
-
-const measuresStartTimes={};
-
-
-
-
-
-traceOfTab.processEvents.filter(evt=>{
-if(!evt.cat.includes('blink.user_timing')){
-return false;
-}
-
-
-
-return evt.name!=='requestStart'&&
-evt.name!=='navigationStart'&&
-evt.name!=='paintNonDefaultBackgroundColor'&&
-evt.args.frame===undefined;
-}).
-forEach(ut=>{
-
-if(ut.ph==='R'||ut.ph.toUpperCase()==='I'){
-userTimings.push({
-name:ut.name,
-isMark:true,
-args:ut.args,
-startTime:ut.ts});
-
-
-
-}else if(ut.ph.toLowerCase()==='b'){
-measuresStartTimes[ut.name]=ut.ts;
-
-
-}else if(ut.ph.toLowerCase()==='e'){
-userTimings.push({
-name:ut.name,
-isMark:false,
-args:ut.args,
-startTime:measuresStartTimes[ut.name],
-endTime:ut.ts,
-duration:ut.ts-measuresStartTimes[ut.name]});
-
-}
-});
-
-
-userTimings.forEach(ut=>{
-ut.startTime=(ut.startTime-traceOfTab.navigationStartEvt.ts)/1000;
-if(!ut.isMark){
-ut.endTime=(ut.endTime-traceOfTab.navigationStartEvt.ts)/1000;
-ut.duration=ut.duration/1000;
-}
-});
-
-return userTimings;
-}}
-
-
-module.exports=makeComputedArtifact(UserTimings);
-
-},{"./computed-artifact.js":8,"./trace-of-tab.js":39}],41:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Parser=require('metaviewport-parser');
-
-const makeComputedArtifact=require('./computed-artifact.js');
-
-class ViewportMeta{
-
-
-
-
-static async compute_(MetaElements){
-const viewportMeta=MetaElements.find(meta=>meta.name==='viewport');
-
-if(!viewportMeta){
-return{
-hasViewportTag:false,
-isMobileOptimized:false,
-parserWarnings:[]};
-
-}
-
-const warnings=[];
-const parsedProps=Parser.parseMetaViewPortContent(viewportMeta.content||'');
-
-if(Object.keys(parsedProps.unknownProperties).length){
-warnings.push(`Invalid properties found: ${JSON.stringify(parsedProps.unknownProperties)}`);
-}
-if(Object.keys(parsedProps.invalidValues).length){
-warnings.push(`Invalid values found: ${JSON.stringify(parsedProps.invalidValues)}`);
-}
-
-const viewportProps=parsedProps.validProperties;
-const isMobileOptimized=Boolean(viewportProps.width||viewportProps['initial-scale']);
-
-return{
-hasViewportTag:true,
-isMobileOptimized,
-parserWarnings:warnings};
-
-}}
-
-
-module.exports=makeComputedArtifact(ViewportMeta);
-
-
-
-
-
-
-
-
-},{"./computed-artifact.js":8,"metaviewport-parser":145}],42:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-function isArrayOfUnknownObjects(arr){
-return Array.isArray(arr)&&arr.every(isObjectOfUnknownProperties);
-}
-
-
-
-
-
-function isObjectOfUnknownProperties(val){
-return typeof val==='object'&&val!==null&&!Array.isArray(val);
-}
-
-
-
-
-
-
-
-function isNumber(val){
-return typeof val==='number'&&!isNaN(val);
-}
-
-class Budget{
-
-
-
-
-
-
-static assertNoExcessProperties(obj,objectName){
-const invalidKeys=Object.keys(obj);
-if(invalidKeys.length>0){
-const keys=invalidKeys.join(', ');
-throw new Error(`${objectName} has unrecognized properties: [${keys}]`);
-}
-}
-
-
-
-
-
-
-
-static assertNoDuplicateStrings(strings,arrayName){
-const foundStrings=new Set();
-for(const string of strings){
-if(foundStrings.has(string)){
-throw new Error(`${arrayName} has duplicate entry of type '${string}'`);
-}
-foundStrings.add(string);
-}
-}
-
-
-
-
-
-static validateResourceBudget(resourceBudget){
-const{resourceType,budget,...invalidRest}=resourceBudget;
-Budget.assertNoExcessProperties(invalidRest,'Resource Budget');
-
-
-const validResourceTypes=[
-'total',
-'document',
-'script',
-'stylesheet',
-'image',
-'media',
-'font',
-'other',
-'third-party'];
-
-
-if(!validResourceTypes.includes(resourceType)){
-throw new Error(`Invalid resource type: ${resourceType}. \n`+
-`Valid resource types are: ${validResourceTypes.join(', ')}`);
-}
-if(!isNumber(budget)){
-throw new Error(`Invalid budget: ${budget}`);
-}
-return{
-resourceType:resourceType,
-budget};
-
-}
-
-
-
-
-
-static throwInvalidPathError(path,error){
-throw new Error(`Invalid path ${path}. ${error}\n`+
-`'Path' should be specified using the 'robots.txt' format.\n`+
-`Learn more about the 'robots.txt' format here:\n`+
-`https://developers.google.com/search/reference/robots_txt#url-matching-based-on-path-values`);
-}
-
-
-
-
-
-
-
-
-static validatePath(path){
-if(path===undefined){
-return undefined;
-}else if(typeof path!=='string'){
-this.throwInvalidPathError(path,`Path should be a string.`);
-return;
-}else if(!path.startsWith('/')){
-this.throwInvalidPathError(path,`Path should start with '/'.`);
-}else if((path.match(/\*/g)||[]).length>1){
-this.throwInvalidPathError(path,`Path should only contain one '*'.`);
-}else if((path.match(/\$/g)||[]).length>1){
-this.throwInvalidPathError(path,`Path should only contain one '$' character.`);
-}else if(path.includes('$')&&!path.endsWith('$')){
-this.throwInvalidPathError(path,`'$' character should only occur at end of path.`);
-}
-return path;
-}
-
-
-
-
-
-
-
-
-
-static urlMatchesPattern(url,pattern='/'){
-const urlObj=new URL(url);
-const urlPath=urlObj.pathname+urlObj.search;
-
-const hasWildcard=pattern.includes('*');
-const hasDollarSign=pattern.includes('$');
-
-
-
-
-
-
-
-
-
-if(!hasWildcard&&!hasDollarSign){
-return urlPath.startsWith(pattern);
-
-
-
-
-
-}else if(!hasWildcard&&hasDollarSign){
-return urlPath===pattern.slice(0,-1);
-
-
-
-
-
-
-}else if(hasWildcard&&!hasDollarSign){
-const[beforeWildcard,afterWildcard]=pattern.split('*');
-const remainingUrl=urlPath.slice(beforeWildcard.length);
-return urlPath.startsWith(beforeWildcard)&&remainingUrl.includes(afterWildcard);
-
-
-
-
-
-
-}else if(hasWildcard&&hasDollarSign){
-const[beforeWildcard,afterWildcard]=pattern.split('*');
-const urlEnd=urlPath.slice(beforeWildcard.length);
-return urlPath.startsWith(beforeWildcard)&&urlEnd.endsWith(afterWildcard.slice(0,-1));
-}
-return false;
-}
-
-
-
-
-
-static validateTimingBudget(timingBudget){
-const{metric,budget,tolerance,...invalidRest}=timingBudget;
-Budget.assertNoExcessProperties(invalidRest,'Timing Budget');
-
-
-const validTimingMetrics=[
-'first-contentful-paint',
-'first-cpu-idle',
-'interactive',
-'first-meaningful-paint',
-'max-potential-fid'];
-
-
-if(!validTimingMetrics.includes(metric)){
-throw new Error(`Invalid timing metric: ${metric}. \n`+
-`Valid timing metrics are: ${validTimingMetrics.join(', ')}`);
-}
-if(!isNumber(budget)){
-throw new Error(`Invalid budget: ${budget}`);
-}
-if(typeof tolerance!=='undefined'&&!isNumber(tolerance)){
-throw new Error(`Invalid tolerance: ${tolerance}`);
-}
-return{
-metric:metric,
-budget,
-tolerance};
-
-}
-
-
-
-
-
-
-
-static initializeBudget(budgetJson){
-
-budgetJson=JSON.parse(JSON.stringify(budgetJson));
-if(!isArrayOfUnknownObjects(budgetJson)){
-throw new Error('Budget file is not defined as an array of budgets.');
-}
-
-const budgets=budgetJson.map((b,index)=>{
-
-const budget={};
-
-const{path,resourceSizes,resourceCounts,timings,...invalidRest}=b;
-Budget.assertNoExcessProperties(invalidRest,'Budget');
-
-budget.path=Budget.validatePath(path);
-
-if(isArrayOfUnknownObjects(resourceSizes)){
-budget.resourceSizes=resourceSizes.map(Budget.validateResourceBudget);
-Budget.assertNoDuplicateStrings(budget.resourceSizes.map(r=>r.resourceType),
-`budgets[${index}].resourceSizes`);
-}else if(resourceSizes!==undefined){
-throw new Error(`Invalid resourceSizes entry in budget at index ${index}`);
-}
-
-if(isArrayOfUnknownObjects(resourceCounts)){
-budget.resourceCounts=resourceCounts.map(Budget.validateResourceBudget);
-Budget.assertNoDuplicateStrings(budget.resourceCounts.map(r=>r.resourceType),
-`budgets[${index}].resourceCounts`);
-}else if(resourceCounts!==undefined){
-throw new Error(`Invalid resourceCounts entry in budget at index ${index}`);
-}
-
-if(isArrayOfUnknownObjects(timings)){
-budget.timings=timings.map(Budget.validateTimingBudget);
-Budget.assertNoDuplicateStrings(budget.timings.map(r=>r.metric),
-`budgets[${index}].timings`);
-}else if(timings!==undefined){
-throw new Error(`Invalid timings entry in budget at index ${index}`);
-}
-
-return budget;
-});
-
-return budgets;
-}}
-
-
-module.exports=Budget;
-
-},{}],43:[function(require,module,exports){
-(function(process,global,__dirname){
-
-
-
-
-
-'use strict';
-
-const path=require('path');
-const Audit=require('../audits/audit.js');
-const Runner=require('../runner.js');
-
-
-
-
-
-
-
-
-
-const mergeOptionsOfItems=function(items){
-
-const mergedItems=[];
-
-for(const item of items){
-const existingItem=item.path&&mergedItems.find(candidate=>candidate.path===item.path);
-if(!existingItem){
-mergedItems.push(item);
-continue;
-}
-
-existingItem.options=Object.assign({},existingItem.options,item.options);
-}
-
-return mergedItems;
-};
-
-
-
-
-
-
-function assertValidAudit(auditDefinition){
-const{implementation,path:auditPath}=auditDefinition;
-const auditName=auditPath||
-implementation&&implementation.meta&&implementation.meta.id||
-'Unknown audit';
-
-if(typeof implementation.audit!=='function'||implementation.audit===Audit.audit){
-throw new Error(`${auditName} has no audit() method.`);
-}
-
-if(typeof implementation.meta.id!=='string'){
-throw new Error(`${auditName} has no meta.id property, or the property is not a string.`);
-}
-
-if(typeof implementation.meta.title!=='string'){
-throw new Error(`${auditName} has no meta.title property, or the property is not a string.`);
-}
-
-
-if(
-typeof implementation.meta.failureTitle!=='string'&&
-implementation.meta.scoreDisplayMode===Audit.SCORING_MODES.BINARY)
-{
-throw new Error(`${auditName} has no failureTitle and should.`);
-}
-
-if(typeof implementation.meta.description!=='string'){
-throw new Error(
-`${auditName} has no meta.description property, or the property is not a string.`);
-
-}else if(implementation.meta.description===''){
-throw new Error(
-`${auditName} has an empty meta.description string. Please add a description for the UI.`);
-
-}
-
-if(!Array.isArray(implementation.meta.requiredArtifacts)){
-throw new Error(
-`${auditName} has no meta.requiredArtifacts property, or the property is not an array.`);
-
-}
-}
-
-
-
-
-
-
-function expandAuditShorthand(audits){
-if(!audits){
-return null;
-}
-
-const newAudits=audits.map(audit=>{
-if(typeof audit==='string'){
-
-return{path:audit,options:{}};
-}else if('implementation'in audit&&typeof audit.implementation.audit==='function'){
-
-return audit;
-}else if('path'in audit&&typeof audit.path==='string'){
-
-return audit;
-}else if('audit'in audit&&typeof audit.audit==='function'){
-
-return{implementation:audit,options:{}};
-}else{
-throw new Error('Invalid Audit type '+JSON.stringify(audit));
-}
-});
-
-return newAudits;
-}
-
-
-
-
-
-
-
-
-
-function requireAudits(audits,configDir){
-const expandedAudits=expandAuditShorthand(audits);
-if(!expandedAudits){
-return null;
-}
-
-const coreList=Runner.getAuditList();
-const auditDefns=expandedAudits.map(audit=>{
-let implementation;
-if('implementation'in audit){
-implementation=audit.implementation;
-}else{
-
-const auditPathJs=`${audit.path}.js`;
-const coreAudit=coreList.find(a=>a===auditPathJs);
-let requirePath=`../audits/${audit.path}`;
-if(!coreAudit){
-if(global.devtools){
-requirePath=audit.path;
-}else{
-
-const absolutePath=resolveModule(audit.path,configDir,'audit');
-
-requirePath=path.relative(__dirname,absolutePath);
-}
-}
-implementation=require(requirePath);
-}
-
-return{
-implementation,
-path:audit.path,
-options:audit.options||{}};
-
-});
-
-const mergedAuditDefns=mergeOptionsOfItems(auditDefns);
-mergedAuditDefns.forEach(audit=>assertValidAudit(audit));
-return mergedAuditDefns;
-}
-
-
-
-
-
-
-
-
-
-
-
-function resolveModule(moduleIdentifier,configDir,category){
-
-
-
-
-try{
-return require.resolve(moduleIdentifier);
-}catch(e){}
-
-
-
-
-const cwdPath=path.resolve(process.cwd(),moduleIdentifier);
-try{
-return require.resolve(cwdPath);
-}catch(e){}
-
-const errorString=
-'Unable to locate '+(
-category?`${category}: `:'')+
-`${moduleIdentifier} (tried to require() from '${__dirname}' and load from '${cwdPath}'`;
-
-if(!configDir){
-throw new Error(errorString+')');
-}
-
-
-
-
-const relativePath=path.resolve(configDir,moduleIdentifier);
-try{
-return require.resolve(relativePath);
-}catch(requireError){}
-
-throw new Error(errorString+` and '${relativePath}')`);
-}
-
-module.exports={
-mergeOptionsOfItems,
-requireAudits,
-resolveModule};
-
-
-}).call(this,require('_process'),typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{},"/lighthouse-core/config");
-},{"../audits/audit.js":3,"../runner.js":89,"_process":158,"path":156}],44:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-function isArrayOfUnknownObjects(arr){
-return Array.isArray(arr)&&arr.every(isObjectOfUnknownProperties);
-}
-
-
-
-
-
-function isObjectOfUnknownProperties(val){
-return typeof val==='object'&&val!==null&&!Array.isArray(val);
-}
-
-
-
-
-
-
-
-
-function assertNoExcessProperties(obj,pluginName,objectName=''){
-if(objectName){
-objectName+=' ';
-}
-
-const invalidKeys=Object.keys(obj);
-if(invalidKeys.length>0){
-const keys=invalidKeys.join(', ');
-throw new Error(`${pluginName} has unrecognized ${objectName}properties: [${keys}]`);
-}
-}
-
-
-
-
-class ConfigPlugin{
-
-
-
-
-
-
-
-static _parseAuditsList(auditsJson,pluginName){
-
-if(auditsJson===undefined){
-return undefined;
-}else if(!isArrayOfUnknownObjects(auditsJson)){
-throw new Error(`${pluginName} has an invalid audits array.`);
-}
-
-return auditsJson.map(auditDefnJson=>{
-const{path,...invalidRest}=auditDefnJson;
-assertNoExcessProperties(invalidRest,pluginName,'audit');
-
-if(typeof path!=='string'){
-throw new Error(`${pluginName} has a missing audit path.`);
-}
-return{
-path};
-
-});
-}
-
-
-
-
-
-
-
-static _parseAuditRefsList(auditRefsJson,pluginName){
-if(!isArrayOfUnknownObjects(auditRefsJson)){
-throw new Error(`${pluginName} has no valid auditsRefs.`);
-}
-
-return auditRefsJson.map(auditRefJson=>{
-const{id,weight,group,...invalidRest}=auditRefJson;
-assertNoExcessProperties(invalidRest,pluginName,'auditRef');
-
-if(typeof id!=='string'){
-throw new Error(`${pluginName} has an invalid auditRef id.`);
-}
-if(typeof weight!=='number'){
-throw new Error(`${pluginName} has an invalid auditRef weight.`);
-}
-if(typeof group!=='string'&&typeof group!=='undefined'){
-throw new Error(`${pluginName} has an invalid auditRef group.`);
-}
-
-const prependedGroup=group?`${pluginName}-${group}`:group;
-return{
-id,
-weight,
-group:prependedGroup};
-
-});
-}
-
-
-
-
-
-
-
-static _parseCategory(categoryJson,pluginName){
-if(!isObjectOfUnknownProperties(categoryJson)){
-throw new Error(`${pluginName} has no valid category.`);
-}
-
-const{
-title,
-description,
-manualDescription,
-auditRefs:auditRefsJson,
-...invalidRest}=
-categoryJson;
-
-assertNoExcessProperties(invalidRest,pluginName,'category');
-
-if(typeof title!=='string'){
-throw new Error(`${pluginName} has an invalid category tile.`);
-}
-if(typeof description!=='string'&&typeof description!=='undefined'){
-throw new Error(`${pluginName} has an invalid category description.`);
-}
-if(typeof manualDescription!=='string'&&typeof manualDescription!=='undefined'){
-throw new Error(`${pluginName} has an invalid category manualDescription.`);
-}
-const auditRefs=ConfigPlugin._parseAuditRefsList(auditRefsJson,pluginName);
-
-return{
-title,
-auditRefs,
-description:description,
-manualDescription:manualDescription};
-
-}
-
-
-
-
-
-
-
-
-static _parseGroups(groupsJson,pluginName){
-if(groupsJson===undefined){
-return undefined;
-}
-
-if(!isObjectOfUnknownProperties(groupsJson)){
-throw new Error(`${pluginName} groups json is not defined as an object.`);
-}
-
-const groups=Object.entries(groupsJson);
-
-
-const parsedGroupsJson={};
-groups.forEach(([groupId,groupJson])=>{
-if(!isObjectOfUnknownProperties(groupJson)){
-throw new Error(`${pluginName} has a group not defined as an object.`);
-}
-const{title,description,...invalidRest}=groupJson;
-assertNoExcessProperties(invalidRest,pluginName,'group');
-
-if(typeof title!=='string'){
-throw new Error(`${pluginName} has an invalid group title.`);
-}
-if(typeof description!=='string'&&typeof description!=='undefined'){
-throw new Error(`${pluginName} has an invalid group description.`);
-}
-parsedGroupsJson[`${pluginName}-${groupId}`]={
-title,
-description};
-
-});
-return parsedGroupsJson;
-}
-
-
-
-
-
-
-
-
-static parsePlugin(pluginJson,pluginName){
-
-pluginJson=JSON.parse(JSON.stringify(pluginJson));
-if(!isObjectOfUnknownProperties(pluginJson)){
-throw new Error(`${pluginName} is not defined as an object.`);
-}
-
-const{
-audits:pluginAuditsJson,
-category:pluginCategoryJson,
-groups:pluginGroupsJson,
-...invalidRest}=
-pluginJson;
-
-assertNoExcessProperties(invalidRest,pluginName);
-
-return{
-audits:ConfigPlugin._parseAuditsList(pluginAuditsJson,pluginName),
-categories:{
-[pluginName]:ConfigPlugin._parseCategory(pluginCategoryJson,pluginName)},
-
-groups:ConfigPlugin._parseGroups(pluginGroupsJson,pluginName)};
-
-}}
-
-
-module.exports=ConfigPlugin;
-
-},{}],45:[function(require,module,exports){
-(function(global,__dirname){
-
-
-
-
-
-'use strict';
-
-const defaultConfigPath='./default-config.js';
-const defaultConfig=require('./default-config.js');
-const constants=require('./constants.js');
-const i18n=require('./../lib/i18n/i18n.js');
-
-const isDeepEqual=require('lodash.isequal');
-const log=require('lighthouse-logger');
-const path=require('path');
-const Runner=require('../runner.js');
-const ConfigPlugin=require('./config-plugin.js');
-const Budget=require('./budget.js');
-const{requireAudits,mergeOptionsOfItems,resolveModule}=require('./config-helpers.js');
-
-
-
-
-
-
-
-
-const BASE_ARTIFACT_BLANKS={
-fetchTime:'',
-LighthouseRunWarnings:'',
-TestedAsMobileDevice:'',
-HostUserAgent:'',
-NetworkUserAgent:'',
-BenchmarkIndex:'',
-WebAppManifest:'',
-Stacks:'',
-traces:'',
-devtoolsLogs:'',
-settings:'',
-URL:'',
-Timing:'',
-PageLoadError:''};
-
-const BASE_ARTIFACT_NAMES=Object.keys(BASE_ARTIFACT_BLANKS);
-
-
-
-
-
-function assertValidPasses(passes,audits){
-if(!Array.isArray(passes)){
-return;
-}
-
-const requiredGatherers=Config.getGatherersNeededByAudits(audits);
-
-const foundGatherers=new Set(BASE_ARTIFACT_NAMES);
-
-
-passes.forEach(pass=>{
-pass.gatherers.forEach(gathererDefn=>{
-const gatherer=gathererDefn.instance;
-foundGatherers.add(gatherer.name);
-const isGatherRequiredByAudits=requiredGatherers.has(gatherer.name);
-if(!isGatherRequiredByAudits){
-const msg=`${gatherer.name} gatherer requested, however no audit requires it.`;
-log.warn('config',msg);
-}
-});
-});
-
-
-for(const auditDefn of audits||[]){
-const auditMeta=auditDefn.implementation.meta;
-for(const requiredArtifact of auditMeta.requiredArtifacts){
-if(!foundGatherers.has(requiredArtifact)){
-throw new Error(`${requiredArtifact} gatherer, required by audit ${auditMeta.id}, `+
-'was not found in config.');
-}
-}
-}
-
-
-const usedNames=new Set();
-passes.forEach(pass=>{
-const passName=pass.passName;
-if(usedNames.has(passName)){
-throw new Error(`Passes must have unique names (repeated passName: ${passName}.`);
-}
-usedNames.add(passName);
-});
-}
-
-
-
-
-
-
-function assertValidCategories(categories,audits,groups){
-if(!categories){
-return;
-}
-
-const auditsKeyedById=new Map((audits||[]).map(audit=>
-
-[audit.implementation.meta.id,audit]));
-
-
-Object.keys(categories).forEach(categoryId=>{
-categories[categoryId].auditRefs.forEach((auditRef,index)=>{
-if(!auditRef.id){
-throw new Error(`missing an audit id at ${categoryId}[${index}]`);
-}
-
-const audit=auditsKeyedById.get(auditRef.id);
-if(!audit){
-throw new Error(`could not find ${auditRef.id} audit for category ${categoryId}`);
-}
-
-const auditImpl=audit.implementation;
-const isManual=auditImpl.meta.scoreDisplayMode==='manual';
-if(categoryId==='accessibility'&&!auditRef.group&&!isManual){
-throw new Error(`${auditRef.id} accessibility audit does not have a group`);
-}
-
-if(auditRef.weight>0&&isManual){
-throw new Error(`${auditRef.id} is manual but has a positive weight`);
-}
-
-if(auditRef.group&&(!groups||!groups[auditRef.group])){
-throw new Error(`${auditRef.id} references unknown group ${auditRef.group}`);
-}
-});
-});
-}
-
-
-
-
-
-function assertValidGatherer(gathererInstance,gathererName){
-gathererName=gathererName||gathererInstance.name||'gatherer';
-
-if(typeof gathererInstance.beforePass!=='function'){
-throw new Error(`${gathererName} has no beforePass() method.`);
-}
-
-if(typeof gathererInstance.pass!=='function'){
-throw new Error(`${gathererName} has no pass() method.`);
-}
-
-if(typeof gathererInstance.afterPass!=='function'){
-throw new Error(`${gathererName} has no afterPass() method.`);
-}
-}
-
-
-
-
-
-
-
-function assertValidPluginName(configJSON,pluginName){
-if(!pluginName.startsWith('lighthouse-plugin-')){
-throw new Error(`plugin name '${pluginName}' does not start with 'lighthouse-plugin-'`);
-}
-
-if(configJSON.categories&&configJSON.categories[pluginName]){
-throw new Error(`plugin name '${pluginName}' not allowed because it is the id of a category already found in config`);
-}
-}
-
-
-
-
-
-
-
-function cleanFlagsForSettings(flags={}){
-
-const settings={};
-
-for(const key of Object.keys(flags)){
-if(key in constants.defaultSettings){
-
-settings[key]=flags[key];
-}
-}
-
-return settings;
-}
-
-
-
-
-
-
-
-function _merge(base,extension,overwriteArrays=false){
-
-if(typeof base==='undefined'||base===null){
-return extension;
-}else if(typeof extension==='undefined'){
-return base;
-}else if(Array.isArray(extension)){
-if(overwriteArrays)return extension;
-if(!Array.isArray(base))throw new TypeError(`Expected array but got ${typeof base}`);
-const merged=base.slice();
-extension.forEach(item=>{
-if(!merged.some(candidate=>isDeepEqual(candidate,item)))merged.push(item);
-});
-
-return merged;
-}else if(typeof extension==='object'){
-if(typeof base!=='object')throw new TypeError(`Expected object but got ${typeof base}`);
-if(Array.isArray(base))throw new TypeError('Expected object but got Array');
-Object.keys(extension).forEach(key=>{
-const localOverwriteArrays=overwriteArrays||
-key==='settings'&&typeof base[key]==='object';
-base[key]=_merge(base[key],extension[key],localOverwriteArrays);
-});
-return base;
-}
-
-return extension;
-}
-
-
-
-
-
-
-const merge=_merge;
-
-
-
-
-
-
-function cloneArrayWithPluginSafety(array){
-return array.map(item=>{
-if(typeof item==='object'){
-
-return Object.assign(
-Object.create(
-Object.getPrototypeOf(item)),
-
-item);
-
-}
-
-return item;
-});
-}
-
-
-
-
-
-
-
-
-function deepClone(json){
-return JSON.parse(JSON.stringify(json));
-}
-
-
-
-
-
-
-
-function deepCloneConfigJson(json){
-const cloned=deepClone(json);
-
-
-
-if(Array.isArray(cloned.passes)&&Array.isArray(json.passes)){
-for(let i=0;i<cloned.passes.length;i++){
-const pass=cloned.passes[i];
-pass.gatherers=cloneArrayWithPluginSafety(json.passes[i].gatherers||[]);
-}
-}
-
-if(Array.isArray(json.audits)){
-cloned.audits=cloneArrayWithPluginSafety(json.audits);
-}
-
-return cloned;
-}
-
-class Config{
-
-
-
-
-
-
-constructor(configJSON,flags){
-const status={msg:'Create config',id:'lh:init:config'};
-log.time(status,'verbose');
-let configPath=flags&&flags.configPath;
-
-if(!configJSON){
-configJSON=defaultConfig;
-configPath=path.resolve(__dirname,defaultConfigPath);
-}
-
-if(configPath&&!path.isAbsolute(configPath)){
-throw new Error('configPath must be an absolute path.');
-}
-
-
-configJSON=deepCloneConfigJson(configJSON);
-
-
-if(configJSON.extends){
-configJSON=Config.extendConfigJSON(deepCloneConfigJson(defaultConfig),configJSON);
-}
-
-
-const configDir=configPath?path.dirname(configPath):undefined;
-
-
-configJSON=Config.mergePlugins(configJSON,flags,configDir);
-
-const settings=Config.initSettings(configJSON.settings,flags);
-
-
-const passesWithDefaults=Config.augmentPassesWithDefaults(configJSON.passes);
-Config.adjustDefaultPassForThrottling(settings,passesWithDefaults);
-const passes=Config.requireGatherers(passesWithDefaults,configDir);
-
-
-this.settings=settings;
-
-this.passes=passes;
-
-this.audits=Config.requireAudits(configJSON.audits,configDir);
-
-this.categories=configJSON.categories||null;
-
-this.groups=configJSON.groups||null;
-
-Config.filterConfigIfNeeded(this);
-
-assertValidPasses(this.passes,this.audits);
-assertValidCategories(this.categories,this.audits,this.groups);
-
-
-
-const configJson=this;
-log.timeEnd(status);
-}
-
-
-
-
-
-
-getPrintString(){
-const jsonConfig=deepClone(this);
-
-if(jsonConfig.passes){
-for(const pass of jsonConfig.passes){
-for(const gathererDefn of pass.gatherers){
-gathererDefn.implementation=undefined;
-
-gathererDefn.instance=undefined;
-if(Object.keys(gathererDefn.options).length===0){
-
-gathererDefn.options=undefined;
-}
-}
-}
-}
-
-if(jsonConfig.audits){
-for(const auditDefn of jsonConfig.audits){
-
-auditDefn.implementation=undefined;
-if(Object.keys(auditDefn.options).length===0){
-
-auditDefn.options=undefined;
-}
-}
-}
-
-
-i18n.replaceIcuMessageInstanceIds(jsonConfig,jsonConfig.settings.locale);
-
-return JSON.stringify(jsonConfig,null,2);
-}
-
-
-
-
-
-
-static extendConfigJSON(baseJSON,extendJSON){
-if(extendJSON.passes&&baseJSON.passes){
-for(const pass of extendJSON.passes){
-
-const passName=pass.passName||constants.defaultPassConfig.passName;
-const basePass=baseJSON.passes.find(candidate=>candidate.passName===passName);
-
-if(!basePass){
-baseJSON.passes.push(pass);
-}else{
-merge(basePass,pass);
-}
-}
-
-delete extendJSON.passes;
-}
-
-return merge(baseJSON,extendJSON);
-}
-
-
-
-
-
-
-
-static mergePlugins(configJSON,flags,configDir){
-const configPlugins=configJSON.plugins||[];
-const flagPlugins=flags&&flags.plugins||[];
-const pluginNames=new Set([...configPlugins,...flagPlugins]);
-
-for(const pluginName of pluginNames){
-assertValidPluginName(configJSON,pluginName);
-
-const pluginPath=global.devtools?
-pluginName:
-resolveModule(pluginName,configDir,'plugin');
-const rawPluginJson=require(pluginPath);
-const pluginJson=ConfigPlugin.parsePlugin(rawPluginJson,pluginName);
-
-configJSON=Config.extendConfigJSON(configJSON,pluginJson);
-}
-
-return configJSON;
-}
-
-
-
-
-
-static augmentPassesWithDefaults(passes){
-if(!passes){
-return null;
-}
-
-const{defaultPassConfig}=constants;
-return passes.map(pass=>merge(deepClone(defaultPassConfig),pass));
-}
-
-
-
-
-
-
-static initSettings(settingsJson={},flags){
-
-
-
-const locale=i18n.lookupLocale(flags&&flags.locale||settingsJson.locale);
-
-
-const{defaultSettings}=constants;
-const settingWithDefaults=merge(deepClone(defaultSettings),settingsJson,true);
-
-
-const settingsWithFlags=merge(settingWithDefaults||{},cleanFlagsForSettings(flags),true);
-
-if(settingsWithFlags.budgets){
-settingsWithFlags.budgets=Budget.initializeBudget(settingsWithFlags.budgets);
-}
-
-settingsWithFlags.locale=locale;
-
-return settingsWithFlags;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-static expandGathererShorthand(gatherers){
-const expanded=gatherers.map(gatherer=>{
-if(typeof gatherer==='string'){
-
-return{path:gatherer,options:{}};
-}else if('implementation'in gatherer||'instance'in gatherer){
-
-return gatherer;
-}else if('path'in gatherer){
-
-if(typeof gatherer.path!=='string'){
-throw new Error('Invalid Gatherer type '+JSON.stringify(gatherer));
-}
-return gatherer;
-}else if(typeof gatherer==='function'){
-
-return{implementation:gatherer,options:{}};
-}else if(gatherer&&typeof gatherer.beforePass==='function'){
-
-return{instance:gatherer,options:{}};
-}else{
-throw new Error('Invalid Gatherer type '+JSON.stringify(gatherer));
-}
-});
-
-return expanded;
-}
-
-
-
-
-
-
-
-static adjustDefaultPassForThrottling(settings,passes){
-if(!passes||
-settings.throttlingMethod!=='devtools'&&settings.throttlingMethod!=='provided'){
-return;
-}
-
-const defaultPass=passes.find(pass=>pass.passName==='defaultPass');
-if(!defaultPass)return;
-const overrides=constants.nonSimulatedPassConfigOverrides;
-defaultPass.pauseAfterLoadMs=
-Math.max(overrides.pauseAfterLoadMs,defaultPass.pauseAfterLoadMs);
-defaultPass.cpuQuietThresholdMs=
-Math.max(overrides.cpuQuietThresholdMs,defaultPass.cpuQuietThresholdMs);
-defaultPass.networkQuietThresholdMs=
-Math.max(overrides.networkQuietThresholdMs,defaultPass.networkQuietThresholdMs);
-}
-
-
-
-
-
-static filterConfigIfNeeded(config){
-const settings=config.settings;
-if(!settings.onlyCategories&&!settings.onlyAudits&&!settings.skipAudits){
-return;
-}
-
-
-const{categories,requestedAuditNames}=Config.filterCategoriesAndAudits(config.categories,
-settings);
-
-
-const audits=config.audits&&config.audits.filter(auditDefn=>
-requestedAuditNames.has(auditDefn.implementation.meta.id));
-
-
-const requiredGathererIds=Config.getGatherersNeededByAudits(audits);
-
-
-const passes=Config.generatePassesNeededByGatherers(config.passes,requiredGathererIds);
-
-config.categories=categories;
-config.audits=audits;
-config.passes=passes;
-}
-
-
-
-
-
-
-
-static filterCategoriesAndAudits(oldCategories,settings){
-if(!oldCategories){
-return{categories:null,requestedAuditNames:new Set()};
-}
-
-if(settings.onlyAudits&&settings.skipAudits){
-throw new Error('Cannot set both skipAudits and onlyAudits');
-}
-
-
-const categories={};
-const filterByIncludedCategory=!!settings.onlyCategories;
-const filterByIncludedAudit=!!settings.onlyAudits;
-const categoryIds=settings.onlyCategories||[];
-const auditIds=settings.onlyAudits||[];
-const skipAuditIds=settings.skipAudits||[];
-
-
-categoryIds.forEach(categoryId=>{
-if(!oldCategories[categoryId]){
-log.warn('config',`unrecognized category in 'onlyCategories': ${categoryId}`);
-}
-});
-
-
-const auditsToValidate=new Set(auditIds.concat(skipAuditIds));
-for(const auditId of auditsToValidate){
-const foundCategory=Object.keys(oldCategories).find(categoryId=>{
-const auditRefs=oldCategories[categoryId].auditRefs;
-return!!auditRefs.find(candidate=>candidate.id===auditId);
-});
-
-if(!foundCategory){
-const parentKeyName=skipAuditIds.includes(auditId)?'skipAudits':'onlyAudits';
-log.warn('config',`unrecognized audit in '${parentKeyName}': ${auditId}`);
-}else if(auditIds.includes(auditId)&&categoryIds.includes(foundCategory)){
-log.warn('config',`${auditId} in 'onlyAudits' is already included by `+
-`${foundCategory} in 'onlyCategories'`);
-}
-}
-
-const includedAudits=new Set(auditIds);
-skipAuditIds.forEach(id=>includedAudits.delete(id));
-
-Object.keys(oldCategories).forEach(categoryId=>{
-const category=deepClone(oldCategories[categoryId]);
-
-if(filterByIncludedCategory&&filterByIncludedAudit){
-
-if(!categoryIds.includes(categoryId)){
-category.auditRefs=category.auditRefs.filter(audit=>auditIds.includes(audit.id));
-}
-}else if(filterByIncludedCategory){
-
-if(!categoryIds.includes(categoryId)){
-return;
-}
-}else if(filterByIncludedAudit){
-category.auditRefs=category.auditRefs.filter(audit=>auditIds.includes(audit.id));
-}
-
-
-category.auditRefs=category.auditRefs.filter(audit=>!skipAuditIds.includes(audit.id));
-
-if(category.auditRefs.length){
-categories[categoryId]=category;
-category.auditRefs.forEach(audit=>includedAudits.add(audit.id));
-}
-});
-
-return{categories,requestedAuditNames:includedAudits};
-}
-
-
-
-
-
-static getCategories(config){
-const categories=config.categories;
-if(!categories){
-return[];
-}
-
-return Object.keys(categories).map(id=>{
-const title=categories[id].title;
-return{id,title};
-});
-}
-
-
-
-
-
-
-static getGatherersNeededByAudits(audits){
-
-
-if(!audits){
-return new Set();
-}
-
-return audits.reduce((list,auditDefn)=>{
-auditDefn.implementation.meta.requiredArtifacts.forEach(artifact=>list.add(artifact));
-return list;
-},new Set());
-}
-
-
-
-
-
-
-
-static generatePassesNeededByGatherers(passes,requiredGatherers){
-if(!passes){
-return null;
-}
-
-const auditsNeedTrace=requiredGatherers.has('traces');
-const filteredPasses=passes.map(pass=>{
-
-pass.gatherers=pass.gatherers.filter(gathererDefn=>{
-const gatherer=gathererDefn.instance;
-return requiredGatherers.has(gatherer.name);
-});
-
-
-if(pass.recordTrace&&!auditsNeedTrace){
-const passName=pass.passName||'unknown pass';
-log.warn('config',`Trace not requested by an audit, dropping trace in ${passName}`);
-pass.recordTrace=false;
-}
-
-return pass;
-}).filter(pass=>{
-
-if(pass.recordTrace)return true;
-
-if(pass.passName==='defaultPass')return true;
-return pass.gatherers.length>0;
-});
-return filteredPasses;
-}
-
-
-
-
-
-
-
-
-
-static requireAudits(audits,configDir){
-const status={msg:'Requiring audits',id:'lh:config:requireAudits'};
-log.time(status,'verbose');
-const auditDefns=requireAudits(audits,configDir);
-log.timeEnd(status);
-return auditDefns;
-}
-
-
-
-
-
-
-
-
-static requireGathererFromPath(path,options,coreAuditList,configDir){
-const coreGatherer=coreAuditList.find(a=>a===`${path}.js`);
-
-let requirePath=`../gather/gatherers/${path}`;
-if(!coreGatherer){
-
-requirePath=resolveModule(path,configDir,'gatherer');
-}
-
-const GathererClass=require(requirePath);
-
-return{
-instance:new GathererClass(),
-implementation:GathererClass,
-path,
-options:options||{}};
-
-}
-
-
-
-
-
-
-
-
-
-static requireGatherers(passes,configDir){
-if(!passes){
-return null;
-}
-const status={msg:'Requiring gatherers',id:'lh:config:requireGatherers'};
-log.time(status,'verbose');
-
-const coreList=Runner.getGathererList();
-const fullPasses=passes.map(pass=>{
-const gathererDefns=Config.expandGathererShorthand(pass.gatherers).map(gathererDefn=>{
-if(gathererDefn.instance){
-return{
-instance:gathererDefn.instance,
-implementation:gathererDefn.implementation,
-path:gathererDefn.path,
-options:gathererDefn.options||{}};
-
-}else if(gathererDefn.implementation){
-const GathererClass=gathererDefn.implementation;
-return{
-instance:new GathererClass(),
-implementation:gathererDefn.implementation,
-path:gathererDefn.path,
-options:gathererDefn.options||{}};
-
-}else if(gathererDefn.path){
-const path=gathererDefn.path;
-const options=gathererDefn.options;
-return Config.requireGathererFromPath(path,options,coreList,configDir);
-}else{
-throw new Error('Invalid expanded Gatherer: '+JSON.stringify(gathererDefn));
-}
-});
-
-const mergedDefns=mergeOptionsOfItems(gathererDefns);
-mergedDefns.forEach(gatherer=>assertValidGatherer(gatherer.instance,gatherer.path));
-
-return Object.assign(pass,{gatherers:mergedDefns});
-});
-log.timeEnd(status);
-return fullPasses;
-}}
-
-
-module.exports=Config;
-
-}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{},"/lighthouse-core/config");
-},{"../runner.js":89,"./../lib/i18n/i18n.js":66,"./budget.js":42,"./config-helpers.js":43,"./config-plugin.js":44,"./constants.js":46,"./default-config.js":47,"lighthouse-logger":125,"lodash.isequal":142,"path":156}],46:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-
-const DEVTOOLS_RTT_ADJUSTMENT_FACTOR=3.75;
-const DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR=0.9;
-
-const throttling={
-DEVTOOLS_RTT_ADJUSTMENT_FACTOR,
-DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR,
-
-
-mobileSlow4G:{
-rttMs:150,
-throughputKbps:1.6*1024,
-requestLatencyMs:150*DEVTOOLS_RTT_ADJUSTMENT_FACTOR,
-downloadThroughputKbps:1.6*1024*DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR,
-uploadThroughputKbps:750*DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR,
-cpuSlowdownMultiplier:4},
-
-
-
-
-mobileRegluar3G:{
-rttMs:300,
-throughputKbps:700,
-requestLatencyMs:300*DEVTOOLS_RTT_ADJUSTMENT_FACTOR,
-downloadThroughputKbps:700*DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR,
-uploadThroughputKbps:700*DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR,
-cpuSlowdownMultiplier:4}};
-
-
-
-
-const defaultSettings={
-output:'json',
-maxWaitForFcp:30*1000,
-maxWaitForLoad:45*1000,
-throttlingMethod:'simulate',
-throttling:throttling.mobileSlow4G,
-auditMode:false,
-gatherMode:false,
-disableStorageReset:false,
-emulatedFormFactor:'mobile',
-internalDisableDeviceScreenEmulation:false,
-channel:'node',
-
-
-
-budgets:null,
-locale:'en-US',
-blockedUrlPatterns:null,
-additionalTraceCategories:null,
-extraHeaders:null,
-precomputedLanternData:null,
-onlyAudits:null,
-onlyCategories:null,
-skipAudits:null};
-
-
-
-const defaultPassConfig={
-passName:'defaultPass',
-recordTrace:false,
-useThrottling:false,
-pauseAfterLoadMs:0,
-networkQuietThresholdMs:0,
-cpuQuietThresholdMs:0,
-blockedUrlPatterns:[],
-blankPage:'about:blank',
-gatherers:[]};
-
-
-const nonSimulatedPassConfigOverrides={
-pauseAfterLoadMs:5250,
-networkQuietThresholdMs:5250,
-cpuQuietThresholdMs:5250};
-
-
-module.exports={
-throttling,
-defaultSettings,
-defaultPassConfig,
-nonSimulatedPassConfigOverrides};
-
-
-},{}],47:[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-
-
-const constants=require('./constants.js');
-const i18n=require('../lib/i18n/i18n.js');
-
-const UIStrings={
-
-performanceCategoryTitle:'Performance',
-
-budgetsGroupTitle:'Budgets',
-
-budgetsGroupDescription:'Performance budgets set standards for the performance of your site.',
-
-metricGroupTitle:'Metrics',
-
-loadOpportunitiesGroupTitle:'Opportunities',
-
-loadOpportunitiesGroupDescription:'These suggestions can help your page load faster. They don\'t [directly affect](https://github.com/GoogleChrome/lighthouse/blob/d2ec9ffbb21de9ad1a0f86ed24575eda32c796f0/docs/scoring.md#how-are-the-scores-weighted) the Performance score.',
-
-firstPaintImprovementsGroupTitle:'First Paint Improvements',
-
-firstPaintImprovementsGroupDescription:'The most critical aspect of performance is how quickly pixels are rendered onscreen. Key metrics: First Contentful Paint, First Meaningful Paint',
-
-overallImprovementsGroupTitle:'Overall Improvements',
-
-overallImprovementsGroupDescription:'Enhance the overall loading experience, so the page is responsive and ready to use as soon as possible. Key metrics: Time to Interactive, Speed Index',
-
-diagnosticsGroupTitle:'Diagnostics',
-
-diagnosticsGroupDescription:'More information about the performance of your application. These numbers don\'t [directly affect](https://github.com/GoogleChrome/lighthouse/blob/d2ec9ffbb21de9ad1a0f86ed24575eda32c796f0/docs/scoring.md#how-are-the-scores-weighted) the Performance score.',
-
-a11yCategoryTitle:'Accessibility',
-
-a11yCategoryDescription:'These checks highlight opportunities to [improve the accessibility of your web app](https://developers.google.com/web/fundamentals/accessibility). Only a subset of accessibility issues can be automatically detected so manual testing is also encouraged.',
-
-a11yCategoryManualDescription:'These items address areas which an automated testing tool cannot cover. Learn more in our guide on [conducting an accessibility review](https://developers.google.com/web/fundamentals/accessibility/how-to-review).',
-
-a11yBestPracticesGroupTitle:'Best practices',
-
-a11yBestPracticesGroupDescription:'These items highlight common accessibility best practices.',
-
-a11yColorContrastGroupTitle:'Contrast',
-
-a11yColorContrastGroupDescription:'These are opportunities to improve the legibility of your content.',
-
-a11yNamesLabelsGroupTitle:'Names and labels',
-
-a11yNamesLabelsGroupDescription:'These are opportunities to improve the semantics of the controls in your application. This may enhance the experience for users of assistive technology, like a screen reader.',
-
-a11yNavigationGroupTitle:'Navigation',
-
-a11yNavigationGroupDescription:'These are opportunities to improve keyboard navigation in your application.',
-
-a11yAriaGroupTitle:'ARIA',
-
-a11yAriaGroupDescription:'These are opportunities to improve the usage of ARIA in your application which may enhance the experience for users of assistive technology, like a screen reader.',
-
-a11yLanguageGroupTitle:'Internationalization and localization',
-
-a11yLanguageGroupDescription:'These are opportunities to improve the interpretation of your content by users in different locales.',
-
-a11yAudioVideoGroupTitle:'Audio and video',
-
-a11yAudioVideoGroupDescription:'These are opportunities to provide alternative content for audio and video. This may improve the experience for users with hearing or vision impairments.',
-
-a11yTablesListsVideoGroupTitle:'Tables and lists',
-
-a11yTablesListsVideoGroupDescription:'These are opportunities to to improve the experience of reading tabular or list data using assistive technology, like a screen reader.',
-
-seoCategoryTitle:'SEO',
-
-seoCategoryDescription:'These checks ensure that your page is optimized for search engine results ranking. '+
-'There are additional factors Lighthouse does not check that may affect your search ranking. '+
-'[Learn more](https://support.google.com/webmasters/answer/35769).',
-
-seoCategoryManualDescription:'Run these additional validators on your site to check additional SEO best practices.',
-
-seoMobileGroupTitle:'Mobile Friendly',
-
-seoMobileGroupDescription:'Make sure your pages are mobile friendly so users don’t have to pinch or zoom '+
-'in order to read the content pages. [Learn more](https://developers.google.com/search/mobile-sites/).',
-
-seoContentGroupTitle:'Content Best Practices',
-
-seoContentGroupDescription:'Format your HTML in a way that enables crawlers to better understand your app’s content.',
-
-seoCrawlingGroupTitle:'Crawling and Indexing',
-
-seoCrawlingGroupDescription:'To appear in search results, crawlers need access to your app.',
-
-pwaCategoryTitle:'Progressive Web App',
-
-pwaCategoryDescription:'These checks validate the aspects of a Progressive Web App. '+
-'[Learn more](https://developers.google.com/web/progressive-web-apps/checklist).',
-
-pwaCategoryManualDescription:'These checks are required by the baseline '+
-'[PWA Checklist](https://developers.google.com/web/progressive-web-apps/checklist) but are '+
-'not automatically checked by Lighthouse. They do not affect your score but it\'s important that you verify them manually.',
-
-bestPracticesCategoryTitle:'Best Practices',
-
-pwaFastReliableGroupTitle:'Fast and reliable',
-
-pwaInstallableGroupTitle:'Installable',
-
-pwaOptimizedGroupTitle:'PWA Optimized'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-const defaultConfig={
-settings:constants.defaultSettings,
-passes:[{
-passName:'defaultPass',
-recordTrace:true,
-useThrottling:true,
-pauseAfterLoadMs:1000,
-networkQuietThresholdMs:1000,
-cpuQuietThresholdMs:1000,
-gatherers:[
-'css-usage',
-'viewport-dimensions',
-'runtime-exceptions',
-'console-messages',
-'anchor-elements',
-'image-elements',
-'link-elements',
-'meta-elements',
-'script-elements',
-'iframe-elements',
-'main-document-content',
-'dobetterweb/appcache',
-'dobetterweb/doctype',
-'dobetterweb/domstats',
-'dobetterweb/optimized-images',
-'dobetterweb/password-inputs-with-prevented-paste',
-'dobetterweb/response-compression',
-'dobetterweb/tags-blocking-first-paint',
-'seo/font-size',
-'seo/embedded-content',
-'seo/robots-txt',
-'seo/tap-targets',
-'accessibility']},
-
-
-{
-passName:'offlinePass',
-gatherers:[
-'service-worker',
-'offline',
-'start-url']},
-
-
-{
-passName:'redirectPass',
-
-blockedUrlPatterns:['*.css','*.jpg','*.jpeg','*.png','*.gif','*.svg','*.ttf','*.woff','*.woff2'],
-gatherers:[
-'http-redirect',
-'html-without-javascript']}],
-
-
-audits:[
-'is-on-https',
-'redirects-http',
-'service-worker',
-'works-offline',
-'viewport',
-'without-javascript',
-'metrics/first-contentful-paint',
-'metrics/first-meaningful-paint',
-'load-fast-enough-for-pwa',
-'metrics/speed-index',
-'screenshot-thumbnails',
-'final-screenshot',
-'metrics/estimated-input-latency',
-'metrics/total-blocking-time',
-'metrics/max-potential-fid',
-'errors-in-console',
-'time-to-first-byte',
-'metrics/first-cpu-idle',
-'metrics/interactive',
-'user-timings',
-'critical-request-chains',
-'redirects',
-'installable-manifest',
-'apple-touch-icon',
-'splash-screen',
-'themed-omnibox',
-'content-width',
-'image-aspect-ratio',
-'deprecations',
-'mainthread-work-breakdown',
-'bootup-time',
-'uses-rel-preload',
-'uses-rel-preconnect',
-'font-display',
-'diagnostics',
-'network-requests',
-'network-rtt',
-'network-server-latency',
-'main-thread-tasks',
-'metrics',
-'offline-start-url',
-'performance-budget',
-'resource-summary',
-'third-party-summary',
-'manual/pwa-cross-browser',
-'manual/pwa-page-transitions',
-'manual/pwa-each-page-has-url',
-'accessibility/accesskeys',
-'accessibility/aria-allowed-attr',
-'accessibility/aria-required-attr',
-'accessibility/aria-required-children',
-'accessibility/aria-required-parent',
-'accessibility/aria-roles',
-'accessibility/aria-valid-attr-value',
-'accessibility/aria-valid-attr',
-'accessibility/audio-caption',
-'accessibility/button-name',
-'accessibility/bypass',
-'accessibility/color-contrast',
-'accessibility/definition-list',
-'accessibility/dlitem',
-'accessibility/document-title',
-'accessibility/duplicate-id',
-'accessibility/frame-title',
-'accessibility/html-has-lang',
-'accessibility/html-lang-valid',
-'accessibility/image-alt',
-'accessibility/input-image-alt',
-'accessibility/label',
-'accessibility/layout-table',
-'accessibility/link-name',
-'accessibility/list',
-'accessibility/listitem',
-'accessibility/meta-refresh',
-'accessibility/meta-viewport',
-'accessibility/object-alt',
-'accessibility/tabindex',
-'accessibility/td-headers-attr',
-'accessibility/th-has-data-cells',
-'accessibility/valid-lang',
-'accessibility/video-caption',
-'accessibility/video-description',
-'accessibility/manual/custom-controls-labels',
-'accessibility/manual/custom-controls-roles',
-'accessibility/manual/focus-traps',
-'accessibility/manual/focusable-controls',
-'accessibility/manual/heading-levels',
-'accessibility/manual/interactive-element-affordance',
-'accessibility/manual/logical-tab-order',
-'accessibility/manual/managed-focus',
-'accessibility/manual/offscreen-content-hidden',
-'accessibility/manual/use-landmarks',
-'accessibility/manual/visual-order-follows-dom',
-'byte-efficiency/uses-long-cache-ttl',
-'byte-efficiency/total-byte-weight',
-'byte-efficiency/offscreen-images',
-'byte-efficiency/render-blocking-resources',
-'byte-efficiency/unminified-css',
-'byte-efficiency/unminified-javascript',
-'byte-efficiency/unused-css-rules',
-'byte-efficiency/uses-webp-images',
-'byte-efficiency/uses-optimized-images',
-'byte-efficiency/uses-text-compression',
-'byte-efficiency/uses-responsive-images',
-'byte-efficiency/efficient-animated-content',
-'dobetterweb/appcache-manifest',
-'dobetterweb/doctype',
-'dobetterweb/dom-size',
-'dobetterweb/external-anchors-use-rel-noopener',
-'dobetterweb/geolocation-on-start',
-'dobetterweb/no-document-write',
-'dobetterweb/no-vulnerable-libraries',
-'dobetterweb/js-libraries',
-'dobetterweb/notification-on-start',
-'dobetterweb/password-inputs-can-be-pasted-into',
-'dobetterweb/uses-http2',
-'dobetterweb/uses-passive-event-listeners',
-'seo/meta-description',
-'seo/http-status-code',
-'seo/font-size',
-'seo/link-text',
-'seo/is-crawlable',
-'seo/robots-txt',
-'seo/tap-targets',
-'seo/hreflang',
-'seo/plugins',
-'seo/canonical',
-'seo/manual/structured-data'],
-
-
-groups:{
-'metrics':{
-title:str_(UIStrings.metricGroupTitle)},
-
-'load-opportunities':{
-title:str_(UIStrings.loadOpportunitiesGroupTitle),
-description:str_(UIStrings.loadOpportunitiesGroupDescription)},
-
-'budgets':{
-title:str_(UIStrings.budgetsGroupTitle),
-description:str_(UIStrings.budgetsGroupDescription)},
-
-'diagnostics':{
-title:str_(UIStrings.diagnosticsGroupTitle),
-description:str_(UIStrings.diagnosticsGroupDescription)},
-
-'pwa-fast-reliable':{
-title:str_(UIStrings.pwaFastReliableGroupTitle)},
-
-'pwa-installable':{
-title:str_(UIStrings.pwaInstallableGroupTitle)},
-
-'pwa-optimized':{
-title:str_(UIStrings.pwaOptimizedGroupTitle)},
-
-'a11y-best-practices':{
-title:str_(UIStrings.a11yBestPracticesGroupTitle),
-description:str_(UIStrings.a11yBestPracticesGroupDescription)},
-
-'a11y-color-contrast':{
-title:str_(UIStrings.a11yColorContrastGroupTitle),
-description:str_(UIStrings.a11yColorContrastGroupDescription)},
-
-'a11y-names-labels':{
-title:str_(UIStrings.a11yNamesLabelsGroupTitle),
-description:str_(UIStrings.a11yNamesLabelsGroupDescription)},
-
-'a11y-navigation':{
-title:str_(UIStrings.a11yNavigationGroupTitle),
-description:str_(UIStrings.a11yNavigationGroupDescription)},
-
-'a11y-aria':{
-title:str_(UIStrings.a11yAriaGroupTitle),
-description:str_(UIStrings.a11yAriaGroupDescription)},
-
-'a11y-language':{
-title:str_(UIStrings.a11yLanguageGroupTitle),
-description:str_(UIStrings.a11yLanguageGroupDescription)},
-
-'a11y-audio-video':{
-title:str_(UIStrings.a11yAudioVideoGroupTitle),
-description:str_(UIStrings.a11yAudioVideoGroupDescription)},
-
-'a11y-tables-lists':{
-title:str_(UIStrings.a11yTablesListsVideoGroupTitle),
-description:str_(UIStrings.a11yTablesListsVideoGroupDescription)},
-
-'seo-mobile':{
-title:str_(UIStrings.seoMobileGroupTitle),
-description:str_(UIStrings.seoMobileGroupDescription)},
-
-'seo-content':{
-title:str_(UIStrings.seoContentGroupTitle),
-description:str_(UIStrings.seoContentGroupDescription)},
-
-'seo-crawl':{
-title:str_(UIStrings.seoCrawlingGroupTitle),
-description:str_(UIStrings.seoCrawlingGroupDescription)}},
-
-
-categories:{
-'performance':{
-title:str_(UIStrings.performanceCategoryTitle),
-auditRefs:[
-{id:'first-contentful-paint',weight:3,group:'metrics'},
-{id:'first-meaningful-paint',weight:1,group:'metrics'},
-{id:'speed-index',weight:4,group:'metrics'},
-{id:'interactive',weight:5,group:'metrics'},
-{id:'first-cpu-idle',weight:2,group:'metrics'},
-{id:'max-potential-fid',weight:0,group:'metrics'},
-{id:'estimated-input-latency',weight:0},
-{id:'total-blocking-time',weight:0},
-{id:'render-blocking-resources',weight:0,group:'load-opportunities'},
-{id:'uses-responsive-images',weight:0,group:'load-opportunities'},
-{id:'offscreen-images',weight:0,group:'load-opportunities'},
-{id:'unminified-css',weight:0,group:'load-opportunities'},
-{id:'unminified-javascript',weight:0,group:'load-opportunities'},
-{id:'unused-css-rules',weight:0,group:'load-opportunities'},
-{id:'uses-optimized-images',weight:0,group:'load-opportunities'},
-{id:'uses-webp-images',weight:0,group:'load-opportunities'},
-{id:'uses-text-compression',weight:0,group:'load-opportunities'},
-{id:'uses-rel-preconnect',weight:0,group:'load-opportunities'},
-{id:'time-to-first-byte',weight:0,group:'load-opportunities'},
-{id:'redirects',weight:0,group:'load-opportunities'},
-{id:'uses-rel-preload',weight:0,group:'load-opportunities'},
-{id:'efficient-animated-content',weight:0,group:'load-opportunities'},
-{id:'total-byte-weight',weight:0,group:'diagnostics'},
-{id:'uses-long-cache-ttl',weight:0,group:'diagnostics'},
-{id:'dom-size',weight:0,group:'diagnostics'},
-{id:'critical-request-chains',weight:0,group:'diagnostics'},
-{id:'user-timings',weight:0,group:'diagnostics'},
-{id:'bootup-time',weight:0,group:'diagnostics'},
-{id:'mainthread-work-breakdown',weight:0,group:'diagnostics'},
-{id:'font-display',weight:0,group:'diagnostics'},
-{id:'performance-budget',weight:0,group:'budgets'},
-{id:'resource-summary',weight:0,group:'diagnostics'},
-{id:'third-party-summary',weight:0,group:'diagnostics'},
-
-{id:'network-requests',weight:0},
-{id:'network-rtt',weight:0},
-{id:'network-server-latency',weight:0},
-{id:'main-thread-tasks',weight:0},
-{id:'diagnostics',weight:0},
-{id:'metrics',weight:0},
-{id:'screenshot-thumbnails',weight:0},
-{id:'final-screenshot',weight:0}]},
-
-
-'accessibility':{
-title:str_(UIStrings.a11yCategoryTitle),
-description:str_(UIStrings.a11yCategoryDescription),
-manualDescription:str_(UIStrings.a11yCategoryManualDescription),
-
-
-
-
-auditRefs:[
-{id:'accesskeys',weight:3,group:'a11y-navigation'},
-{id:'aria-allowed-attr',weight:10,group:'a11y-aria'},
-{id:'aria-required-attr',weight:10,group:'a11y-aria'},
-{id:'aria-required-children',weight:10,group:'a11y-aria'},
-{id:'aria-required-parent',weight:10,group:'a11y-aria'},
-{id:'aria-roles',weight:10,group:'a11y-aria'},
-{id:'aria-valid-attr-value',weight:10,group:'a11y-aria'},
-{id:'aria-valid-attr',weight:10,group:'a11y-aria'},
-{id:'audio-caption',weight:10,group:'a11y-audio-video'},
-{id:'button-name',weight:10,group:'a11y-names-labels'},
-{id:'bypass',weight:3,group:'a11y-navigation'},
-{id:'color-contrast',weight:3,group:'a11y-color-contrast'},
-{id:'definition-list',weight:3,group:'a11y-tables-lists'},
-{id:'dlitem',weight:3,group:'a11y-tables-lists'},
-{id:'document-title',weight:3,group:'a11y-names-labels'},
-{id:'duplicate-id',weight:1,group:'a11y-best-practices'},
-{id:'frame-title',weight:3,group:'a11y-names-labels'},
-{id:'html-has-lang',weight:3,group:'a11y-language'},
-{id:'html-lang-valid',weight:3,group:'a11y-language'},
-{id:'image-alt',weight:10,group:'a11y-names-labels'},
-{id:'input-image-alt',weight:10,group:'a11y-names-labels'},
-{id:'label',weight:10,group:'a11y-names-labels'},
-{id:'layout-table',weight:3,group:'a11y-tables-lists'},
-{id:'link-name',weight:3,group:'a11y-names-labels'},
-{id:'list',weight:3,group:'a11y-tables-lists'},
-{id:'listitem',weight:3,group:'a11y-tables-lists'},
-{id:'meta-refresh',weight:10,group:'a11y-best-practices'},
-{id:'meta-viewport',weight:10,group:'a11y-best-practices'},
-{id:'object-alt',weight:3,group:'a11y-names-labels'},
-{id:'tabindex',weight:3,group:'a11y-navigation'},
-{id:'td-headers-attr',weight:3,group:'a11y-tables-lists'},
-{id:'th-has-data-cells',weight:3,group:'a11y-tables-lists'},
-{id:'valid-lang',weight:3,group:'a11y-language'},
-{id:'video-caption',weight:10,group:'a11y-audio-video'},
-{id:'video-description',weight:10,group:'a11y-audio-video'},
-
-{id:'logical-tab-order',weight:0},
-{id:'focusable-controls',weight:0},
-{id:'interactive-element-affordance',weight:0},
-{id:'managed-focus',weight:0},
-{id:'focus-traps',weight:0},
-{id:'custom-controls-labels',weight:0},
-{id:'custom-controls-roles',weight:0},
-{id:'visual-order-follows-dom',weight:0},
-{id:'offscreen-content-hidden',weight:0},
-{id:'heading-levels',weight:0},
-{id:'use-landmarks',weight:0}]},
-
-
-'best-practices':{
-title:str_(UIStrings.bestPracticesCategoryTitle),
-auditRefs:[
-{id:'appcache-manifest',weight:1},
-{id:'is-on-https',weight:1},
-{id:'uses-http2',weight:1},
-{id:'uses-passive-event-listeners',weight:1},
-{id:'no-document-write',weight:1},
-{id:'external-anchors-use-rel-noopener',weight:1},
-{id:'geolocation-on-start',weight:1},
-{id:'doctype',weight:1},
-{id:'no-vulnerable-libraries',weight:1},
-{id:'js-libraries',weight:0},
-{id:'notification-on-start',weight:1},
-{id:'deprecations',weight:1},
-{id:'password-inputs-can-be-pasted-into',weight:1},
-{id:'errors-in-console',weight:1},
-{id:'image-aspect-ratio',weight:1}]},
-
-
-'seo':{
-title:str_(UIStrings.seoCategoryTitle),
-description:str_(UIStrings.seoCategoryDescription),
-manualDescription:str_(UIStrings.seoCategoryManualDescription),
-auditRefs:[
-{id:'viewport',weight:1,group:'seo-mobile'},
-{id:'document-title',weight:1,group:'seo-content'},
-{id:'meta-description',weight:1,group:'seo-content'},
-{id:'http-status-code',weight:1,group:'seo-crawl'},
-{id:'link-text',weight:1,group:'seo-content'},
-{id:'is-crawlable',weight:1,group:'seo-crawl'},
-{id:'robots-txt',weight:1,group:'seo-crawl'},
-{id:'image-alt',weight:1,group:'seo-content'},
-{id:'hreflang',weight:1,group:'seo-content'},
-{id:'canonical',weight:1,group:'seo-content'},
-{id:'font-size',weight:1,group:'seo-mobile'},
-{id:'plugins',weight:1,group:'seo-content'},
-{id:'tap-targets',weight:1,group:'seo-mobile'},
-
-{id:'structured-data',weight:0}]},
-
-
-'pwa':{
-title:str_(UIStrings.pwaCategoryTitle),
-description:str_(UIStrings.pwaCategoryDescription),
-manualDescription:str_(UIStrings.pwaCategoryManualDescription),
-auditRefs:[
-
-{id:'load-fast-enough-for-pwa',weight:7,group:'pwa-fast-reliable'},
-{id:'works-offline',weight:5,group:'pwa-fast-reliable'},
-{id:'offline-start-url',weight:1,group:'pwa-fast-reliable'},
-
-{id:'is-on-https',weight:2,group:'pwa-installable'},
-{id:'service-worker',weight:1,group:'pwa-installable'},
-{id:'installable-manifest',weight:2,group:'pwa-installable'},
-
-{id:'redirects-http',weight:2,group:'pwa-optimized'},
-{id:'splash-screen',weight:1,group:'pwa-optimized'},
-{id:'themed-omnibox',weight:1,group:'pwa-optimized'},
-{id:'content-width',weight:1,group:'pwa-optimized'},
-{id:'viewport',weight:2,group:'pwa-optimized'},
-{id:'without-javascript',weight:1,group:'pwa-optimized'},
-{id:'apple-touch-icon',weight:1,group:'pwa-optimized'},
-
-{id:'pwa-cross-browser',weight:0},
-{id:'pwa-page-transitions',weight:0},
-{id:'pwa-each-page-has-url',weight:0}]}}};
-
-
-
-
-
-module.exports=defaultConfig;
-
-
-Object.defineProperty(module.exports,'UIStrings',{
-enumerable:false,
-get:()=>UIStrings});
-
-
-}).call(this,"/lighthouse-core/config/default-config.js");
-},{"../lib/i18n/i18n.js":66,"./constants.js":46}],48:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const EventEmitter=require('events').EventEmitter;
-const log=require('lighthouse-logger');
-const LHError=require('../../lib/lh-error.js');
-
-
-
-
-
-
-
-
-
-
-class Connection{
-constructor(){
-this._lastCommandId=0;
-
-this._callbacks=new Map();
-
-this._eventEmitter=new EventEmitter();
-}
-
-
-
-
-connect(){
-return Promise.reject(new Error('Not implemented'));
-}
-
-
-
-
-disconnect(){
-return Promise.reject(new Error('Not implemented'));
-}
-
-
-
-
-wsEndpoint(){
-return Promise.reject(new Error('Not implemented'));
-}
-
-
-
-
-
-
-
-
-
-sendCommand(method,sessionId,...paramArgs){
-
-const params=paramArgs.length?paramArgs[0]:undefined;
-
-log.formatProtocol('method => browser',{method,params},'verbose');
-const id=++this._lastCommandId;
-const message=JSON.stringify({id,sessionId,method,params});
-this.sendRawMessage(message);
-
-return new Promise(resolve=>{
-this._callbacks.set(id,{method,resolve});
-});
-}
-
-
-
-
-
-
-on(eventName,cb){
-if(eventName!=='protocolevent'){
-throw new Error('Only supports "protocolevent" events');
-}
-
-if(!this._eventEmitter){
-throw new Error('Attempted to add event listener after connection disposed.');
-}
-this._eventEmitter.on(eventName,cb);
-}
-
-
-
-
-
-
-
-sendRawMessage(message){
-throw new Error('Not implemented');
-}
-
-
-
-
-
-
-
-
-handleRawMessage(message){
-const object=JSON.parse(message);
-
-
-if(!('id'in object)){
-log.formatProtocol('<= event',
-{method:object.method,params:object.params},'verbose');
-this.emitProtocolEvent(object);
-return;
-}
-
-const callback=this._callbacks.get(object.id);
-if(callback){
-this._callbacks.delete(object.id);
-
-callback.resolve(Promise.resolve().then(_=>{
-if(object.error){
-log.formatProtocol('method <= browser ERR',{method:callback.method},'error');
-throw LHError.fromProtocolMessage(callback.method,object.error);
-}
-
-log.formatProtocol('method <= browser OK',
-{method:callback.method,params:object.result},'verbose');
-return object.result;
-}));
-}else{
-
-
-const error=object.error&&object.error.message;
-log.formatProtocol(`disowned method <= browser ${error?'ERR':'OK'}`,
-{method:'UNKNOWN',params:error||object.result},'verbose');
-}
-}
-
-
-
-
-emitProtocolEvent(eventMessage){
-if(!this._eventEmitter){
-throw new Error('Attempted to emit event after connection disposed.');
-}
-
-this._eventEmitter.emit('protocolevent',eventMessage);
-}
-
-
-
-
-dispose(){
-if(this._eventEmitter){
-this._eventEmitter.removeAllListeners();
-this._eventEmitter=null;
-}
-}}
-
-
-module.exports=Connection;
-
-},{"../../lib/lh-error.js":71,"events":108,"lighthouse-logger":125}],49:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Connection=require('./connection.js');
-
-
-
-
-
-
-
-
-
-
-
-
-class RawConnection extends Connection{
-
-
-
-constructor(port){
-super();
-this._port=port;
-this._port.on('message',this.handleRawMessage.bind(this));
-this._port.on('close',this.dispose.bind(this));
-}
-
-
-
-
-
-connect(){
-return Promise.resolve();
-}
-
-
-
-
-disconnect(){
-this._port.close();
-return Promise.resolve();
-}
-
-
-
-
-
-
-sendRawMessage(message){
-this._port.send(message);
-}}
-
-
-module.exports=RawConnection;
-
-},{"./connection.js":48}],50:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-class DevtoolsLog{
-
-
-
-constructor(regexFilter){
-this._filter=regexFilter;
-
-
-this._messages=[];
-this._isRecording=false;
-}
-
-
-
-
-get messages(){
-return this._messages;
-}
-
-reset(){
-this._messages=[];
-}
-
-beginRecording(){
-this._isRecording=true;
-}
-
-endRecording(){
-this._isRecording=false;
-}
-
-
-
-
-
-record(message){
-if(this._isRecording&&(!this._filter||this._filter.test(message.method))){
-this._messages.push(message);
-}
-}}
-
-
-module.exports=DevtoolsLog;
-
-},{}],51:[function(require,module,exports){
-(function(Buffer){
-
-
-
-
-
-'use strict';
-
-const NetworkRecorder=require('../lib/network-recorder.js');
-const emulation=require('../lib/emulation.js');
-const LHElement=require('../lib/lh-element.js');
-const LHError=require('../lib/lh-error.js');
-const NetworkRequest=require('../lib/network-request.js');
-const EventEmitter=require('events').EventEmitter;
-const URL=require('../lib/url-shim.js');
-const constants=require('../config/constants.js');
-
-const log=require('lighthouse-logger');
-const DevtoolsLog=require('./devtools-log.js');
-
-const pageFunctions=require('../lib/page-functions.js');
-
-
-
-const Connection=require('./connections/connection.js');
-
-
-const DEFAULT_PAUSE_AFTER_LOAD=0;
-
-const DEFAULT_NETWORK_QUIET_THRESHOLD=5000;
-
-const DEFAULT_CPU_QUIET_THRESHOLD=0;
-
-const DEFAULT_PROTOCOL_TIMEOUT=30000;
-
-
-
-
-
-class Driver{
-
-
-
-constructor(connection){
-this._traceCategories=Driver.traceCategories;
-
-
-
-this._eventEmitter=new EventEmitter();
-this._connection=connection;
-
-this._devtoolsLog=new DevtoolsLog(/^(Page|Network)\./);
-this.online=true;
-
-this._domainEnabledCounts=new Map();
-
-this._isolatedExecutionContextId=undefined;
-
-
-
-
-
-
-this._networkStatusMonitor=null;
-
-
-
-
-
-
-this._monitoredUrl=null;
-
-this.on('Target.attachedToTarget',event=>{
-this._handleTargetAttached(event).catch(this._handleEventError);
-});
-
-
-
-this.on('Runtime.executionContextDestroyed',event=>{
-if(event.executionContextId===this._isolatedExecutionContextId){
-this._clearIsolatedContextId();
-}
-});
-
-this.on('Page.frameNavigated',()=>this._clearIsolatedContextId());
-
-connection.on('protocolevent',this._handleProtocolEvent.bind(this));
-
-
-
-
-
-this._nextProtocolTimeout=DEFAULT_PROTOCOL_TIMEOUT;
-}
-
-static get traceCategories(){
-return[
-
-'-*',
-
-
-'disabled-by-default-lighthouse',
-
-
-
-'v8',
-
-
-'v8.execute',
-
-
-'blink.user_timing',
-
-
-'blink.console',
-
-
-'devtools.timeline',
-'disabled-by-default-devtools.timeline',
-
-
-'disabled-by-default-devtools.screenshot',
-
-
-'disabled-by-default-devtools.timeline.stack'];
-
-
-
-
-
-}
-
-
-
-
-async getBrowserVersion(){
-const status={msg:'Getting browser version',id:'lh:gather:getVersion'};
-log.time(status,'verbose');
-const version=await this.sendCommand('Browser.getVersion');
-const match=version.product.match(/\/(\d+)/);
-const milestone=match?parseInt(match[1]):0;
-log.timeEnd(status);
-return Object.assign(version,{milestone});
-}
-
-
-
-
-
-async getBenchmarkIndex(){
-const status={msg:'Benchmarking machine',id:'lh:gather:getBenchmarkIndex'};
-log.time(status);
-const indexVal=await this.evaluateAsync(`(${pageFunctions.ultradumbBenchmarkString})()`);
-log.timeEnd(status);
-return indexVal;
-}
-
-
-
-
-async connect(){
-const status={msg:'Connecting to browser',id:'lh:init:connect'};
-log.time(status);
-await this._connection.connect();
-log.timeEnd(status);
-}
-
-
-
-
-disconnect(){
-return this._connection.disconnect();
-}
-
-
-
-
-
-
-wsEndpoint(){
-return this._connection.wsEndpoint();
-}
-
-
-
-
-
-
-
-on(eventName,cb){
-if(this._eventEmitter===null){
-throw new Error('connect() must be called before attempting to listen to events.');
-}
-
-
-log.formatProtocol('listen for event =>',{method:eventName},'verbose');
-this._eventEmitter.on(eventName,cb);
-}
-
-
-
-
-
-
-
-
-once(eventName,cb){
-if(this._eventEmitter===null){
-throw new Error('connect() must be called before attempting to listen to events.');
-}
-
-log.formatProtocol('listen once for event =>',{method:eventName},'verbose');
-this._eventEmitter.once(eventName,cb);
-}
-
-
-
-
-
-
-
-off(eventName,cb){
-if(this._eventEmitter===null){
-throw new Error('connect() must be called before attempting to remove an event listener.');
-}
-
-this._eventEmitter.removeListener(eventName,cb);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-_shouldToggleDomain(domain,sessionId,enable){
-const key=domain+(sessionId||'');
-const enabledCount=this._domainEnabledCounts.get(key)||0;
-const newCount=enabledCount+(enable?1:-1);
-this._domainEnabledCounts.set(key,Math.max(0,newCount));
-
-
-if(enable&&newCount===1||!enable&&newCount===0){
-log.verbose('Driver',`${domain}.${enable?'enable':'disable'}`);
-return true;
-}else{
-if(newCount<0){
-log.error('Driver',`Attempted to disable domain '${domain}' when already disabled.`);
-}
-return false;
-}
-}
-
-
-
-
-
-
-
-setNextProtocolTimeout(timeout){
-this._nextProtocolTimeout=timeout;
-}
-
-
-
-
-_handleProtocolEvent(event){
-this._devtoolsLog.record(event);
-if(this._networkStatusMonitor){
-this._networkStatusMonitor.dispatch(event);
-}
-
-
-
-
-this._eventEmitter.emit(event.method,event.params);
-}
-
-
-
-
-_handleEventError(error){
-log.error('Driver','Unhandled event error',error.message);
-}
-
-
-
-
-async _handleTargetAttached(event){
-
-
-if(event.targetInfo.type!=='iframe'){
-
-await this.sendCommandToSession('Runtime.runIfWaitingForDebugger',event.sessionId);
-return;
-}
-
-
-
-await this.sendCommandToSession('Network.enable',event.sessionId);
-
-
-await this.sendCommandToSession('Target.setAutoAttach',event.sessionId,{
-autoAttach:true,
-flatten:true,
-
-waitForDebuggerOnStart:true});
-
-
-
-await this.sendCommandToSession('Runtime.runIfWaitingForDebugger',event.sessionId);
-}
-
-
-
-
-
-
-
-
-
-
-
-sendCommandToSession(method,sessionId,...params){
-const timeout=this._nextProtocolTimeout;
-this._nextProtocolTimeout=DEFAULT_PROTOCOL_TIMEOUT;
-return new Promise(async(resolve,reject)=>{
-const asyncTimeout=setTimeout(()=>{
-const err=new LHError(
-LHError.errors.PROTOCOL_TIMEOUT,
-{protocolMethod:method});
-
-reject(err);
-},timeout);
-try{
-const result=await this._innerSendCommand(method,sessionId,...params);
-resolve(result);
-}catch(err){
-reject(err);
-}finally{
-clearTimeout(asyncTimeout);
-}
-});
-}
-
-
-
-
-
-
-
-
-sendCommand(method,...params){
-return this.sendCommandToSession(method,undefined,...params);
-}
-
-
-
-
-
-
-
-
-
-
-_innerSendCommand(method,sessionId,...params){
-const domainCommand=/^(\w+)\.(enable|disable)$/.exec(method);
-if(domainCommand){
-const enable=domainCommand[2]==='enable';
-if(!this._shouldToggleDomain(domainCommand[1],sessionId,enable)){
-return Promise.resolve();
-}
-}
-return this._connection.sendCommand(method,sessionId,...params);
-}
-
-
-
-
-
-
-isDomainEnabled(domain){
-
-return!!this._domainEnabledCounts.get(domain);
-}
-
-
-
-
-
-
-evaluateScriptOnNewDocument(scriptSource){
-return this.sendCommand('Page.addScriptToEvaluateOnLoad',{
-scriptSource});
-
-}
-
-
-
-
-
-
-
-
-
-
-async evaluateAsync(expression,options={}){
-const contextId=options.useIsolation?await this._getOrCreateIsolatedContextId():undefined;
-
-try{
-
-return await this._evaluateInContext(expression,contextId);
-}catch(err){
-
-if(contextId&&err.message.includes('Cannot find context')){
-this._clearIsolatedContextId();
-const freshContextId=await this._getOrCreateIsolatedContextId();
-return this._evaluateInContext(expression,freshContextId);
-}
-
-throw err;
-}
-}
-
-
-
-
-
-
-
-
-async _evaluateInContext(expression,contextId){
-
-
-const timeout=this._nextProtocolTimeout===DEFAULT_PROTOCOL_TIMEOUT?
-60000:this._nextProtocolTimeout;
-const evaluationParams={
-
-
-
-
-
-expression:`(function wrapInNativePromise() {
-        const __nativePromise = window.__nativePromise || Promise;
-        const URL = window.__nativeURL || window.URL;
-        return new __nativePromise(function (resolve) {
-          return __nativePromise.resolve()
-            .then(_ => ${expression})
-            .catch(${pageFunctions.wrapRuntimeEvalErrorInBrowserString})
-            .then(resolve);
-        });
-      }())`,
-includeCommandLineAPI:true,
-awaitPromise:true,
-returnByValue:true,
-timeout,
-contextId};
-
-
-this.setNextProtocolTimeout(timeout);
-const response=await this.sendCommand('Runtime.evaluate',evaluationParams);
-if(response.exceptionDetails){
-
-
-const errorMessage=response.exceptionDetails.exception?
-response.exceptionDetails.exception.description:
-response.exceptionDetails.text;
-return Promise.reject(new Error(`Evaluation exception: ${errorMessage}`));
-}
-
-if(response.result===undefined){
-return Promise.reject(
-new Error('Runtime.evaluate response did not contain a "result" object'));
-}
-const value=response.result.value;
-if(value&&value.__failedInBrowser){
-return Promise.reject(Object.assign(new Error(),value));
-}else{
-return value;
-}
-}
-
-
-
-
-async getAppManifest(){
-
-
-
-
-
-
-
-this.setNextProtocolTimeout(10000);
-let response;
-try{
-response=await this.sendCommand('Page.getAppManifest');
-}catch(err){
-if(err.code==='PROTOCOL_TIMEOUT'){
-
-
-log.error('Driver','Failed fetching manifest',err);
-return null;
-}
-
-throw err;
-}
-
-let data=response.data;
-
-
-
-
-if(!data){
-
-return null;
-}
-
-const BOM_LENGTH=3;
-const BOM_FIRSTCHAR=65279;
-const isBomEncoded=data.charCodeAt(0)===BOM_FIRSTCHAR;
-
-if(isBomEncoded){
-data=Buffer.from(data).slice(BOM_LENGTH).toString();
-}
-
-return{...response,data};
-}
-
-
-
-
-getServiceWorkerVersions(){
-return new Promise((resolve,reject)=>{
-
-
-
-const versionUpdatedListener=data=>{
-
-
-const activateCandidates=data.versions.filter(sw=>{
-return sw.status!=='redundant';
-});
-const hasActiveServiceWorker=activateCandidates.find(sw=>{
-return sw.status==='activated';
-});
-
-if(!activateCandidates.length||hasActiveServiceWorker){
-this.off('ServiceWorker.workerVersionUpdated',versionUpdatedListener);
-this.sendCommand('ServiceWorker.disable').
-then(_=>resolve(data),reject);
-}
-};
-
-this.on('ServiceWorker.workerVersionUpdated',versionUpdatedListener);
-
-this.sendCommand('ServiceWorker.enable').catch(reject);
-});
-}
-
-
-
-
-getServiceWorkerRegistrations(){
-return new Promise((resolve,reject)=>{
-this.once('ServiceWorker.workerRegistrationUpdated',data=>{
-this.sendCommand('ServiceWorker.disable').
-then(_=>resolve(data),reject);
-});
-
-this.sendCommand('ServiceWorker.enable').catch(reject);
-});
-}
-
-
-
-
-
-
-
-
-assertNoSameOriginServiceWorkerClients(pageUrl){
-
-let registrations;
-
-let versions;
-
-return this.getServiceWorkerRegistrations().then(data=>{
-registrations=data.registrations;
-}).then(_=>this.getServiceWorkerVersions()).then(data=>{
-versions=data.versions;
-}).then(_=>{
-const origin=new URL(pageUrl).origin;
-
-registrations.
-filter(reg=>{
-const swOrigin=new URL(reg.scopeURL).origin;
-
-return origin===swOrigin;
-}).
-forEach(reg=>{
-versions.forEach(ver=>{
-
-if(ver.registrationId!==reg.registrationId){
-return;
-}
-
-
-if(ver.controlledClients&&ver.controlledClients.length>0){
-throw new Error('You probably have multiple tabs open to the same origin.');
-}
-});
-});
-});
-}
-
-
-
-
-
-
-
-_waitForNothing(){
-return{promise:Promise.resolve(),cancel(){}};
-}
-
-
-
-
-
-_waitForFrameNavigated(){
-return new Promise(resolve=>{
-this.once('Page.frameNavigated',resolve);
-});
-}
-
-
-
-
-
-
-_waitForFCP(maxWaitForFCPMs){
-
-let cancel=()=>{
-throw new Error('_waitForFCP.cancel() called before it was defined');
-};
-
-const promise=new Promise((resolve,reject)=>{
-const maxWaitTimeout=setTimeout(()=>{
-reject(new LHError(LHError.errors.NO_FCP));
-},maxWaitForFCPMs);
-
-
-const lifecycleListener=e=>{
-if(e.name==='firstContentfulPaint'){
-resolve();
-cancel();
-}
-};
-
-this.on('Page.lifecycleEvent',lifecycleListener);
-
-let canceled=false;
-cancel=()=>{
-if(canceled)return;
-canceled=true;
-this.off('Page.lifecycleEvent',lifecycleListener);
-maxWaitTimeout&&clearTimeout(maxWaitTimeout);
-reject(new Error('Wait for FCP canceled'));
-};
-});
-
-return{
-promise,
-cancel};
-
-}
-
-
-
-
-
-
-
-
-_waitForNetworkIdle(networkQuietThresholdMs){
-let hasDCLFired=false;
-
-let idleTimeout;
-
-let cancel=()=>{
-throw new Error('_waitForNetworkIdle.cancel() called before it was defined');
-};
-
-
-
-if(!this._networkStatusMonitor){
-throw new Error('Driver._waitForNetworkIdle called with no networkStatusMonitor');
-}
-const networkStatusMonitor=this._networkStatusMonitor;
-
-const promise=new Promise((resolve,reject)=>{
-const onIdle=()=>{
-
-networkStatusMonitor.once('network-2-busy',onBusy);
-idleTimeout=setTimeout(_=>{
-cancel();
-resolve();
-},networkQuietThresholdMs);
-};
-
-const onBusy=()=>{
-networkStatusMonitor.once('network-2-idle',onIdle);
-idleTimeout&&clearTimeout(idleTimeout);
-};
-
-const domContentLoadedListener=()=>{
-hasDCLFired=true;
-if(networkStatusMonitor.is2Idle()){
-onIdle();
-}else{
-onBusy();
-}
-};
-
-
-
-const logStatus=()=>{
-if(!hasDCLFired){
-log.verbose('Driver','Waiting on DomContentLoaded');
-return;
-}
-
-const inflightRecords=networkStatusMonitor.getInflightRecords();
-
-
-if(inflightRecords.length<20){
-for(const record of inflightRecords){
-log.verbose('Driver',`Waiting on ${record.url.slice(0,120)} to finish`);
-}
-}
-};
-
-networkStatusMonitor.on('requeststarted',logStatus);
-networkStatusMonitor.on('requestloaded',logStatus);
-networkStatusMonitor.on('network-2-busy',logStatus);
-
-this.once('Page.domContentEventFired',domContentLoadedListener);
-let canceled=false;
-cancel=()=>{
-if(canceled)return;
-canceled=true;
-idleTimeout&&clearTimeout(idleTimeout);
-this.off('Page.domContentEventFired',domContentLoadedListener);
-networkStatusMonitor.removeListener('network-2-busy',onBusy);
-networkStatusMonitor.removeListener('network-2-idle',onIdle);
-networkStatusMonitor.removeListener('requeststarted',logStatus);
-networkStatusMonitor.removeListener('requestloaded',logStatus);
-networkStatusMonitor.removeListener('network-2-busy',logStatus);
-};
-});
-
-return{
-promise,
-cancel};
-
-}
-
-
-
-
-
-
-_waitForCPUIdle(waitForCPUQuiet){
-if(!waitForCPUQuiet){
-return{
-promise:Promise.resolve(),
-cancel:()=>undefined};
-
-}
-
-
-let lastTimeout;
-let canceled=false;
-
-const checkForQuietExpression=`(${pageFunctions.checkTimeSinceLastLongTaskString})()`;
-
-
-
-
-
-async function checkForQuiet(driver,resolve){
-if(canceled)return;
-const timeSinceLongTask=await driver.evaluateAsync(checkForQuietExpression);
-if(canceled)return;
-
-if(typeof timeSinceLongTask==='number'){
-if(timeSinceLongTask>=waitForCPUQuiet){
-log.verbose('Driver',`CPU has been idle for ${timeSinceLongTask} ms`);
-resolve();
-}else{
-log.verbose('Driver',`CPU has been idle for ${timeSinceLongTask} ms`);
-const timeToWait=waitForCPUQuiet-timeSinceLongTask;
-lastTimeout=setTimeout(()=>checkForQuiet(driver,resolve),timeToWait);
-}
-}
-}
-
-
-let cancel=()=>{
-throw new Error('_waitForCPUIdle.cancel() called before it was defined');
-};
-const promise=new Promise((resolve,reject)=>{
-checkForQuiet(this,resolve).catch(reject);
-cancel=()=>{
-if(canceled)return;
-canceled=true;
-if(lastTimeout)clearTimeout(lastTimeout);
-reject(new Error('Wait for CPU idle canceled'));
-};
-});
-
-return{
-promise,
-cancel};
-
-}
-
-
-
-
-
-
-
-
-_waitForLoadEvent(pauseAfterLoadMs){
-
-let cancel=()=>{
-throw new Error('_waitForLoadEvent.cancel() called before it was defined');
-};
-
-const promise=new Promise((resolve,reject)=>{
-
-let loadTimeout;
-const loadListener=function(){
-loadTimeout=setTimeout(resolve,pauseAfterLoadMs);
-};
-this.once('Page.loadEventFired',loadListener);
-
-let canceled=false;
-cancel=()=>{
-if(canceled)return;
-canceled=true;
-this.off('Page.loadEventFired',loadListener);
-loadTimeout&&clearTimeout(loadTimeout);
-};
-});
-
-return{
-promise,
-cancel};
-
-}
-
-
-
-
-
-async isPageHung(){
-try{
-this.setNextProtocolTimeout(1000);
-await this.sendCommand('Runtime.evaluate',{
-expression:'"ping"',
-returnByValue:true,
-timeout:1000});
-
-
-return false;
-}catch(err){
-return true;
-}
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-async _waitForFullyLoaded(pauseAfterLoadMs,networkQuietThresholdMs,cpuQuietThresholdMs,
-maxWaitForLoadedMs,maxWaitForFCPMs){
-
-let maxTimeoutHandle;
-
-
-const waitForFCP=maxWaitForFCPMs?this._waitForFCP(maxWaitForFCPMs):this._waitForNothing();
-
-const waitForLoadEvent=this._waitForLoadEvent(pauseAfterLoadMs);
-
-const waitForNetworkIdle=this._waitForNetworkIdle(networkQuietThresholdMs);
-
-let waitForCPUIdle=this._waitForNothing();
-
-
-
-const loadPromise=Promise.all([
-waitForFCP.promise,
-waitForLoadEvent.promise,
-waitForNetworkIdle.promise]).
-then(()=>{
-waitForCPUIdle=this._waitForCPUIdle(cpuQuietThresholdMs);
-return waitForCPUIdle.promise;
-}).then(()=>{
-return function(){
-log.verbose('Driver','loadEventFired and network considered idle');
-};
-}).catch(err=>{
-
-return function(){
-throw err;
-};
-});
-
-
-
-const maxTimeoutPromise=new Promise((resolve,reject)=>{
-maxTimeoutHandle=setTimeout(resolve,maxWaitForLoadedMs);
-}).then(_=>{
-return async()=>{
-log.warn('Driver','Timed out waiting for page load. Checking if page is hung...');
-if(await this.isPageHung()){
-log.warn('Driver','Page appears to be hung, killing JavaScript...');
-await this.sendCommand('Emulation.setScriptExecutionDisabled',{value:true});
-await this.sendCommand('Runtime.terminateExecution');
-throw new LHError(LHError.errors.PAGE_HUNG);
-}
-};
-});
-
-
-const cleanupFn=await Promise.race([
-loadPromise,
-maxTimeoutPromise]);
-
-
-maxTimeoutHandle&&clearTimeout(maxTimeoutHandle);
-waitForFCP.cancel();
-waitForLoadEvent.cancel();
-waitForNetworkIdle.cancel();
-waitForCPUIdle.cancel();
-
-await cleanupFn();
-}
-
-
-
-
-
-
-
-
-
-_beginNetworkStatusMonitoring(startingUrl){
-this._networkStatusMonitor=new NetworkRecorder();
-
-
-this._monitoredUrl=startingUrl;
-
-const requestLoadedListener=redirectRequest=>{
-
-if(!redirectRequest.redirectSource){
-return;
-}
-const earlierRequest=redirectRequest.redirectSource;
-if(earlierRequest.url===this._monitoredUrl){
-this._monitoredUrl=redirectRequest.url;
-}
-};
-this._networkStatusMonitor.on('requestloaded',requestLoadedListener);
-
-return this.sendCommand('Network.enable');
-}
-
-
-
-
-
-
-
-_endNetworkStatusMonitoring(){
-this._networkStatusMonitor=null;
-const finalUrl=this._monitoredUrl;
-this._monitoredUrl=null;
-
-if(!finalUrl){
-throw new Error('Network Status Monitoring ended with an undefined finalUrl');
-}
-
-return finalUrl;
-}
-
-
-
-
-
-
-
-async _getOrCreateIsolatedContextId(){
-if(typeof this._isolatedExecutionContextId==='number'){
-return this._isolatedExecutionContextId;
-}
-
-const resourceTreeResponse=await this.sendCommand('Page.getResourceTree');
-const mainFrameId=resourceTreeResponse.frameTree.frame.id;
-
-const isolatedWorldResponse=await this.sendCommand('Page.createIsolatedWorld',{
-frameId:mainFrameId,
-worldName:'lighthouse_isolated_context'});
-
-
-this._isolatedExecutionContextId=isolatedWorldResponse.executionContextId;
-return isolatedWorldResponse.executionContextId;
-}
-
-_clearIsolatedContextId(){
-this._isolatedExecutionContextId=undefined;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-async gotoURL(url,options={}){
-const waitForFCP=options.waitForFCP||false;
-const waitForNavigated=options.waitForNavigated||false;
-const waitForLoad=options.waitForLoad||false;
-const passContext=options.passContext||{};
-const disableJS=passContext.disableJavaScript||false;
-
-if(waitForNavigated&&(waitForFCP||waitForLoad)){
-throw new Error('Cannot use both waitForNavigated and another event, pick just one');
-}
-
-await this._beginNetworkStatusMonitoring(url);
-await this._clearIsolatedContextId();
-
-
-await this.sendCommand('Target.setAutoAttach',{
-flatten:true,
-autoAttach:true,
-
-waitForDebuggerOnStart:true});
-
-
-await this.sendCommand('Page.enable');
-await this.sendCommand('Page.setLifecycleEventsEnabled',{enabled:true});
-await this.sendCommand('Emulation.setScriptExecutionDisabled',{value:disableJS});
-
-const waitforPageNavigateCmd=this._innerSendCommand('Page.navigate',undefined,{url});
-
-if(waitForNavigated){
-await this._waitForFrameNavigated();
-}else if(waitForLoad){
-const passConfig=passContext.passConfig||{};
-let{pauseAfterLoadMs,networkQuietThresholdMs,cpuQuietThresholdMs}=passConfig;
-let maxWaitMs=passContext.settings&&passContext.settings.maxWaitForLoad;
-let maxFCPMs=passContext.settings&&passContext.settings.maxWaitForFcp;
-
-
-if(typeof pauseAfterLoadMs!=='number')pauseAfterLoadMs=DEFAULT_PAUSE_AFTER_LOAD;
-if(typeof networkQuietThresholdMs!=='number')networkQuietThresholdMs=DEFAULT_NETWORK_QUIET_THRESHOLD;
-if(typeof cpuQuietThresholdMs!=='number')cpuQuietThresholdMs=DEFAULT_CPU_QUIET_THRESHOLD;
-if(typeof maxWaitMs!=='number')maxWaitMs=constants.defaultSettings.maxWaitForLoad;
-if(typeof maxFCPMs!=='number')maxFCPMs=constants.defaultSettings.maxWaitForFcp;
-
-
-if(!waitForFCP)maxFCPMs=undefined;
-await this._waitForFullyLoaded(pauseAfterLoadMs,networkQuietThresholdMs,cpuQuietThresholdMs,
-maxWaitMs,maxFCPMs);
-}
-
-
-await waitforPageNavigateCmd;
-
-return this._endNetworkStatusMonitoring();
-}
-
-
-
-
-
-
-async getObjectProperty(objectId,propName){
-const propertiesResponse=await this.sendCommand('Runtime.getProperties',{
-objectId,
-accessorPropertiesOnly:true,
-generatePreview:false,
-ownProperties:false});
-
-
-const propertyForName=propertiesResponse.result.
-find(property=>property.name===propName);
-
-if(propertyForName&&propertyForName.value){
-return propertyForName.value.value;
-}else{
-return null;
-}
-}
-
-
-
-
-
-
-
-
-async getRequestContent(requestId,timeout=1000){
-requestId=NetworkRequest.getRequestIdForBackend(requestId);
-
-
-
-this.setNextProtocolTimeout(timeout);
-const result=await this.sendCommand('Network.getResponseBody',{requestId});
-return result.body;
-}
-
-
-
-
-
-
-queryPermissionState(name){
-const expressionToEval=`
-      navigator.permissions.query({name: '${name}'}).then(result => {
-        return result.state;
-      })
-    `;
-
-return this.evaluateAsync(expressionToEval);
-}
-
-
-
-
-
-async querySelector(selector){
-const documentResponse=await this.sendCommand('DOM.getDocument');
-const rootNodeId=documentResponse.root.nodeId;
-
-const targetNode=await this.sendCommand('DOM.querySelector',{
-nodeId:rootNodeId,
-selector});
-
-
-if(targetNode.nodeId===0){
-return null;
-}
-return new LHElement(targetNode,this);
-}
-
-
-
-
-
-async querySelectorAll(selector){
-const documentResponse=await this.sendCommand('DOM.getDocument');
-const rootNodeId=documentResponse.root.nodeId;
-
-const targetNodeList=await this.sendCommand('DOM.querySelectorAll',{
-nodeId:rootNodeId,
-selector});
-
-
-
-const elementList=[];
-targetNodeList.nodeIds.forEach(nodeId=>{
-if(nodeId!==0){
-elementList.push(new LHElement({nodeId},this));
-}
-});
-return elementList;
-}
-
-
-
-
-
-
-
-getElementsInDocument(pierce=true){
-return this.getNodesInDocument(pierce).
-then(nodes=>nodes.
-filter(node=>node.nodeType===1).
-map(node=>new LHElement({nodeId:node.nodeId},this)));
-
-}
-
-
-
-
-
-
-
-async getNodesInDocument(pierce=true){
-const flattenedDocument=await this.sendCommand('DOM.getFlattenedDocument',
-{depth:-1,pierce});
-
-return flattenedDocument.nodes?flattenedDocument.nodes:[];
-}
-
-
-
-
-
-scrollTo(position){
-const scrollExpression=`window.scrollTo(${position.x}, ${position.y})`;
-return this.evaluateAsync(scrollExpression,{useIsolation:true});
-}
-
-
-
-
-getScrollPosition(){
-return this.evaluateAsync(`({x: window.scrollX, y: window.scrollY})`,{useIsolation:true});
-}
-
-
-
-
-
-async beginTrace(settings){
-const additionalCategories=settings&&settings.additionalTraceCategories&&
-settings.additionalTraceCategories.split(',')||[];
-const traceCategories=this._traceCategories.concat(additionalCategories);
-
-
-
-const milestone=(await this.getBrowserVersion()).milestone;
-if(milestone<71){
-const toplevelIndex=traceCategories.indexOf('disabled-by-default-lighthouse');
-traceCategories[toplevelIndex]='toplevel';
-}
-
-const uniqueCategories=Array.from(new Set(traceCategories));
-
-
-if(this.isDomainEnabled('CSS')){
-throw new Error('CSS domain enabled when starting trace');
-}
-if(this.isDomainEnabled('DOM')){
-throw new Error('DOM domain enabled when starting trace');
-}
-
-
-return this.sendCommand('Page.enable').
-then(_=>this.sendCommand('Tracing.start',{
-categories:uniqueCategories.join(','),
-options:'sampling-frequency=10000'}));
-
-}
-
-
-
-
-endTrace(){
-
-const traceEvents=[];
-
-
-
-
-
-const dataListener=function(data){
-traceEvents.push(...data.value);
-};
-this.on('Tracing.dataCollected',dataListener);
-
-return new Promise((resolve,reject)=>{
-this.once('Tracing.tracingComplete',_=>{
-this.off('Tracing.dataCollected',dataListener);
-resolve({traceEvents});
-});
-
-this.sendCommand('Tracing.end').catch(reject);
-});
-}
-
-
-
-
-beginDevtoolsLog(){
-this._devtoolsLog.reset();
-this._devtoolsLog.beginRecording();
-}
-
-
-
-
-
-endDevtoolsLog(){
-this._devtoolsLog.endRecording();
-return this._devtoolsLog.messages;
-}
-
-
-
-
-enableRuntimeEvents(){
-return this.sendCommand('Runtime.enable');
-}
-
-
-
-
-
-
-
-async enableAsyncStacks(){
-await this.sendCommand('Debugger.enable');
-await this.sendCommand('Debugger.setSkipAllPauses',{skip:true});
-await this.sendCommand('Debugger.setAsyncCallStackDepth',{maxDepth:8});
-}
-
-
-
-
-
-async beginEmulation(settings){
-await emulation.emulate(this,settings);
-await this.setThrottling(settings,{useThrottling:true});
-}
-
-
-
-
-
-
-async setThrottling(settings,passConfig){
-if(settings.throttlingMethod!=='devtools'){
-return emulation.clearAllNetworkEmulation(this);
-}
-
-const cpuPromise=passConfig.useThrottling?
-emulation.enableCPUThrottling(this,settings.throttling):
-emulation.disableCPUThrottling(this);
-const networkPromise=passConfig.useThrottling?
-emulation.enableNetworkThrottling(this,settings.throttling):
-emulation.clearAllNetworkEmulation(this);
-
-await Promise.all([cpuPromise,networkPromise]);
-}
-
-
-
-
-
-async goOffline(){
-await this.sendCommand('Network.enable');
-await emulation.goOffline(this);
-this.online=false;
-}
-
-
-
-
-
-
-async goOnline(options){
-await this.setThrottling(options.settings,options.passConfig);
-this.online=true;
-}
-
-
-
-
-
-async cleanBrowserCaches(){
-const status={msg:'Cleaning browser cache',id:'lh:driver:cleanBrowserCaches'};
-log.time(status);
-
-
-await this.sendCommand('Network.clearBrowserCache');
-
-await this.sendCommand('Network.setCacheDisabled',{cacheDisabled:true});
-await this.sendCommand('Network.setCacheDisabled',{cacheDisabled:false});
-
-log.timeEnd(status);
-}
-
-
-
-
-
-async setExtraHTTPHeaders(headers){
-if(!headers){
-return;
-}
-
-return this.sendCommand('Network.setExtraHTTPHeaders',{headers});
-}
-
-
-
-
-
-async clearDataForOrigin(url){
-const origin=new URL(url).origin;
-
-
-
-const typesToClear=[
-'appcache',
-
-'file_systems',
-'indexeddb',
-'local_storage',
-'shader_cache',
-'websql',
-'service_workers',
-'cache_storage'].
-join(',');
-
-
-
-this.setNextProtocolTimeout(5000);
-
-try{
-await this.sendCommand('Storage.clearDataForOrigin',{
-origin:origin,
-storageTypes:typesToClear});
-
-}catch(err){
-if(err.code==='PROTOCOL_TIMEOUT'){
-log.warn('Driver','clearDataForOrigin timed out');
-}else{
-throw err;
-}
-}
-}
-
-
-
-
-
-
-async cacheNatives(){
-await this.evaluateScriptOnNewDocument(`
-        window.__nativePromise = Promise;
-        window.__nativeError = Error;
-        window.__nativeURL = URL;
-        window.__ElementMatches = Element.prototype.matches;
-        window.__perfNow = performance.now.bind(performance);
-    `);
-}
-
-
-
-
-
-async registerPerformanceObserver(){
-const scriptStr=`(${pageFunctions.registerPerformanceObserverInPageString})()`;
-await this.evaluateScriptOnNewDocument(scriptStr);
-}
-
-
-
-
-
-blockUrlPatterns(urls){
-return this.sendCommand('Network.setBlockedURLs',{urls}).
-catch(err=>{
-
-if(!/wasn't found/.test(err.message)){
-throw err;
-}
-});
-}
-
-
-
-
-
-
-async dismissJavaScriptDialogs(){
-this.on('Page.javascriptDialogOpening',data=>{
-log.warn('Driver',`${data.type} dialog opened by the page automatically suppressed.`);
-
-this.sendCommand('Page.handleJavaScriptDialog',{
-accept:true,
-promptText:'Lighthouse prompt response'}).
-catch(err=>log.warn('Driver',err));
-});
-
-await this.sendCommand('Page.enable');
-}}
-
-
-module.exports=Driver;
-
-}).call(this,require("buffer").Buffer);
-},{"../config/constants.js":46,"../lib/emulation.js":65,"../lib/lh-element.js":70,"../lib/lh-error.js":71,"../lib/network-recorder.js":74,"../lib/network-request.js":75,"../lib/page-functions.js":76,"../lib/url-shim.js":"url","./connections/connection.js":48,"./devtools-log.js":50,"buffer":102,"events":108,"lighthouse-logger":125}],52:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const log=require('lighthouse-logger');
-const manifestParser=require('../lib/manifest-parser.js');
-const stacksGatherer=require('../lib/stack-collector.js');
-const LHError=require('../lib/lh-error.js');
-const NetworkAnalyzer=require('../lib/dependency-graph/simulator/network-analyzer.js');
-const NetworkRecorder=require('../lib/network-recorder.js');
-const constants=require('../config/constants.js');
-const i18n=require('../lib/i18n/i18n.js');
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-class GatherRunner{
-
-
-
-
-
-
-
-
-
-static async loadBlank(driver,url=constants.defaultPassConfig.blankPage){
-const status={msg:'Resetting state with about:blank',id:'lh:gather:loadBlank'};
-log.time(status);
-await driver.gotoURL(url,{waitForNavigated:true});
-log.timeEnd(status);
-}
-
-
-
-
-
-
-
-
-
-
-
-static async loadPage(driver,passContext){
-const gatherers=passContext.passConfig.gatherers;
-const status={
-msg:'Loading page & waiting for onload',
-id:`lh:gather:loadPage-${passContext.passConfig.passName}`,
-args:[gatherers.map(g=>g.instance.name).join(', ')]};
-
-log.time(status);
-try{
-const finalUrl=await driver.gotoURL(passContext.url,{
-waitForFCP:passContext.passConfig.recordTrace,
-waitForLoad:true,
-passContext});
-
-passContext.url=finalUrl;
-}catch(err){
-
-if(err.code==='NO_FCP'||err.code==='PAGE_HUNG'){
-return{navigationError:err};
-}
-
-throw err;
-}finally{
-log.timeEnd(status);
-}
-
-return{};
-}
-
-
-
-
-
-
-static async setupDriver(driver,options){
-const status={msg:'Initializing…',id:'lh:gather:setupDriver'};
-log.time(status);
-const resetStorage=!options.settings.disableStorageReset;
-await driver.assertNoSameOriginServiceWorkerClients(options.requestedUrl);
-await driver.beginEmulation(options.settings);
-await driver.enableRuntimeEvents();
-await driver.enableAsyncStacks();
-await driver.cacheNatives();
-await driver.registerPerformanceObserver();
-await driver.dismissJavaScriptDialogs();
-if(resetStorage)await driver.clearDataForOrigin(options.requestedUrl);
-log.timeEnd(status);
-}
-
-
-
-
-
-
-
-static async disposeDriver(driver,options){
-const status={msg:'Disconnecting from browser...',id:'lh:gather:disconnect'};
-
-log.time(status);
-try{
-
-const resetStorage=!options.settings.disableStorageReset;
-if(resetStorage)await driver.clearDataForOrigin(options.requestedUrl);
-
-await driver.disconnect();
-}catch(err){
-
-
-if(!/close\/.*status: (500|404)$/.test(err.message)){
-log.error('GatherRunner disconnect',err.message);
-}
-}
-log.timeEnd(status);
-}
-
-
-
-
-
-
-static getNetworkError(mainRecord){
-if(!mainRecord){
-return new LHError(LHError.errors.NO_DOCUMENT_REQUEST);
-}else if(mainRecord.failed){
-const netErr=mainRecord.localizedFailDescription;
-
-
-if(
-netErr==='net::ERR_NAME_NOT_RESOLVED'||
-netErr==='net::ERR_NAME_RESOLUTION_FAILED'||
-netErr.startsWith('net::ERR_DNS_'))
-{
-return new LHError(LHError.errors.DNS_FAILURE);
-}else{
-return new LHError(
-LHError.errors.FAILED_DOCUMENT_REQUEST,
-{errorDetails:netErr});
-
-}
-}else if(mainRecord.hasErrorStatusCode()){
-return new LHError(
-LHError.errors.ERRORED_DOCUMENT_REQUEST,
-{statusCode:`${mainRecord.statusCode}`});
-
-}
-}
-
-
-
-
-
-
-
-static getInterstitialError(mainRecord,networkRecords){
-
-if(!mainRecord)return undefined;
-
-const interstitialRequest=networkRecords.
-find(record=>record.documentURL.startsWith('chrome-error://'));
-
-if(!interstitialRequest)return undefined;
-
-
-
-
-if(!mainRecord.failed)return undefined;
-
-
-if(mainRecord.localizedFailDescription.startsWith('net::ERR_CERT')){
-return new LHError(LHError.errors.INSECURE_DOCUMENT_REQUEST,{securityMessages:
-mainRecord.localizedFailDescription});
-}
-
-
-return new LHError(LHError.errors.CHROME_INTERSTITIAL_ERROR);
-}
-
-
-
-
-
-
-
-
-
-static getPageLoadError(passContext,loadData,navigationError){
-const{networkRecords}=loadData;
-
-let mainRecord;
-try{
-mainRecord=NetworkAnalyzer.findMainDocument(networkRecords,passContext.url);
-}catch(_){}
-
-const networkError=GatherRunner.getNetworkError(mainRecord);
-const interstitialError=GatherRunner.getInterstitialError(mainRecord,networkRecords);
-
-
-if(!passContext.driver.online)return;
-
-
-if(interstitialError)return interstitialError;
-
-
-
-
-if(networkError)return networkError;
-
-
-
-
-return navigationError;
-}
-
-
-
-
-
-
-
-static async setupPassNetwork(passContext){
-const status={msg:'Setting up network for the pass trace',id:`lh:gather:setupPassNetwork`};
-log.time(status);
-
-const passConfig=passContext.passConfig;
-await passContext.driver.setThrottling(passContext.settings,passConfig);
-
-const blockedUrls=(passContext.passConfig.blockedUrlPatterns||[]).
-concat(passContext.settings.blockedUrlPatterns||[]);
-
-
-
-
-await passContext.driver.blockUrlPatterns(blockedUrls);
-await passContext.driver.setExtraHTTPHeaders(passContext.settings.extraHeaders);
-
-log.timeEnd(status);
-}
-
-
-
-
-
-
-static async beginRecording(passContext){
-const status={msg:'Beginning devtoolsLog and trace',id:'lh:gather:beginRecording'};
-log.time(status);
-
-const{driver,passConfig,settings}=passContext;
-
-
-await driver.beginDevtoolsLog();
-
-if(passConfig.recordTrace){
-await driver.beginTrace(settings);
-}
-
-log.timeEnd(status);
-}
-
-
-
-
-
-
-
-static async endRecording(passContext){
-const{driver,passConfig}=passContext;
-
-let trace;
-if(passConfig.recordTrace){
-const status={msg:'Gathering trace',id:`lh:gather:getTrace`};
-log.time(status);
-trace=await driver.endTrace();
-log.timeEnd(status);
-}
-
-const status={
-msg:'Gathering devtoolsLog & network records',
-id:`lh:gather:getDevtoolsLog`};
-
-log.time(status);
-const devtoolsLog=driver.endDevtoolsLog();
-const networkRecords=NetworkRecorder.recordsFromLogs(devtoolsLog);
-log.timeEnd(status);
-
-return{
-networkRecords,
-devtoolsLog,
-trace};
-
-}
-
-
-
-
-
-
-
-static async beforePass(passContext,gathererResults){
-const bpStatus={msg:`Running beforePass methods`,id:`lh:gather:beforePass`};
-log.time(bpStatus,'verbose');
-
-for(const gathererDefn of passContext.passConfig.gatherers){
-const gatherer=gathererDefn.instance;
-
-passContext.options=gathererDefn.options||{};
-const status={
-msg:`Gathering setup: ${gatherer.name}`,
-id:`lh:gather:beforePass:${gatherer.name}`};
-
-log.time(status,'verbose');
-const artifactPromise=Promise.resolve().then(_=>gatherer.beforePass(passContext));
-gathererResults[gatherer.name]=[artifactPromise];
-await artifactPromise.catch(()=>{});
-log.timeEnd(status);
-}
-log.timeEnd(bpStatus);
-}
-
-
-
-
-
-
-
-static async pass(passContext,gathererResults){
-const config=passContext.passConfig;
-const gatherers=config.gatherers;
-
-const pStatus={msg:`Running pass methods`,id:`lh:gather:pass`};
-log.time(pStatus,'verbose');
-
-for(const gathererDefn of gatherers){
-const gatherer=gathererDefn.instance;
-
-passContext.options=gathererDefn.options||{};
-const status={
-msg:`Gathering in-page: ${gatherer.name}`,
-id:`lh:gather:pass:${gatherer.name}`};
-
-log.time(status);
-const artifactPromise=Promise.resolve().then(_=>gatherer.pass(passContext));
-
-const gathererResult=gathererResults[gatherer.name]||[];
-gathererResult.push(artifactPromise);
-gathererResults[gatherer.name]=gathererResult;
-await artifactPromise.catch(()=>{});
-}
-
-log.timeEnd(pStatus);
-}
-
-
-
-
-
-
-
-
-static async afterPass(passContext,loadData,gathererResults){
-const driver=passContext.driver;
-const config=passContext.passConfig;
-const gatherers=config.gatherers;
-
-const apStatus={msg:`Running afterPass methods`,id:`lh:gather:afterPass`};
-log.time(apStatus,'verbose');
-
-
-
-const scrollPosition=await driver.getScrollPosition();
-
-for(const gathererDefn of gatherers){
-const gatherer=gathererDefn.instance;
-const status={
-msg:`Gathering: ${gatherer.name}`,
-id:`lh:gather:afterPass:${gatherer.name}`};
-
-log.time(status);
-
-
-passContext.options=gathererDefn.options||{};
-const artifactPromise=Promise.resolve().
-then(_=>gatherer.afterPass(passContext,loadData));
-
-const gathererResult=gathererResults[gatherer.name]||[];
-gathererResult.push(artifactPromise);
-gathererResults[gatherer.name]=gathererResult;
-await artifactPromise.catch(()=>{});
-await driver.scrollTo(scrollPosition);
-log.timeEnd(status);
-}
-log.timeEnd(apStatus);
-}
-
-
-
-
-
-
-
-
-
-static async collectArtifacts(gathererResults){
-
-const gathererArtifacts={};
-
-const resultsEntries=Object.entries(gathererResults);
-for(const[gathererName,phaseResultsPromises]of resultsEntries){
-try{
-const phaseResults=await Promise.all(phaseResultsPromises);
-
-const definedResults=phaseResults.filter(element=>element!==undefined);
-const artifact=definedResults[definedResults.length-1];
-
-gathererArtifacts[gathererName]=artifact;
-}catch(err){
-
-gathererArtifacts[gathererName]=err;
-}
-
-if(gathererArtifacts[gathererName]===undefined){
-throw new Error(`${gathererName} failed to provide an artifact.`);
-}
-}
-
-return{
-artifacts:gathererArtifacts};
-
-}
-
-
-
-
-
-
-
-static async initializeBaseArtifacts(options){
-const hostUserAgent=(await options.driver.getBrowserVersion()).userAgent;
-
-const{emulatedFormFactor}=options.settings;
-
-const IsMobileHost=hostUserAgent.includes('Android')||hostUserAgent.includes('Mobile');
-const TestedAsMobileDevice=emulatedFormFactor==='mobile'||
-emulatedFormFactor!=='desktop'&&IsMobileHost;
-
-return{
-fetchTime:new Date().toJSON(),
-LighthouseRunWarnings:[],
-TestedAsMobileDevice,
-HostUserAgent:hostUserAgent,
-NetworkUserAgent:'',
-BenchmarkIndex:0,
-WebAppManifest:null,
-Stacks:[],
-traces:{},
-devtoolsLogs:{},
-settings:options.settings,
-URL:{requestedUrl:options.requestedUrl,finalUrl:options.requestedUrl},
-Timing:[],
-PageLoadError:null};
-
-}
-
-
-
-
-
-
-
-static async populateBaseArtifacts(passContext){
-const baseArtifacts=passContext.baseArtifacts;
-
-
-baseArtifacts.URL.finalUrl=passContext.url;
-
-
-baseArtifacts.WebAppManifest=await GatherRunner.getWebAppManifest(passContext);
-
-baseArtifacts.Stacks=await stacksGatherer(passContext);
-
-
-const devtoolsLog=baseArtifacts.devtoolsLogs[passContext.passConfig.passName];
-const userAgentEntry=devtoolsLog.find(entry=>
-entry.method==='Network.requestWillBeSent'&&
-!!entry.params.request.headers['User-Agent']);
-
-if(userAgentEntry){
-
-baseArtifacts.NetworkUserAgent=userAgentEntry.params.request.headers['User-Agent'];
-}
-}
-
-
-
-
-
-static finalizeBaseArtifacts(baseArtifacts){
-
-baseArtifacts.LighthouseRunWarnings=Array.from(new Set(baseArtifacts.LighthouseRunWarnings));
-
-
-baseArtifacts.Timing=log.getTimeEntries();
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-static async getWebAppManifest(passContext){
-const response=await passContext.driver.getAppManifest();
-if(!response)return null;
-return manifestParser(response.data,response.url,passContext.url);
-}
-
-
-
-
-
-
-static async run(passConfigs,options){
-const driver=options.driver;
-
-
-const artifacts={};
-
-try{
-await driver.connect();
-
-
-await GatherRunner.loadBlank(driver);
-
-const baseArtifacts=await GatherRunner.initializeBaseArtifacts(options);
-baseArtifacts.BenchmarkIndex=await options.driver.getBenchmarkIndex();
-
-await GatherRunner.setupDriver(driver,options);
-
-let isFirstPass=true;
-for(const passConfig of passConfigs){
-
-const passContext={
-driver,
-url:options.requestedUrl,
-settings:options.settings,
-passConfig,
-baseArtifacts,
-LighthouseRunWarnings:baseArtifacts.LighthouseRunWarnings};
-
-const passResults=await GatherRunner.runPass(passContext);
-Object.assign(artifacts,passResults.artifacts);
-
-
-if(passResults.pageLoadError){
-baseArtifacts.PageLoadError=passResults.pageLoadError;
-break;
-}
-
-if(isFirstPass){
-await GatherRunner.populateBaseArtifacts(passContext);
-isFirstPass=false;
-}
-}
-
-await GatherRunner.disposeDriver(driver,options);
-GatherRunner.finalizeBaseArtifacts(baseArtifacts);
-return{...baseArtifacts,...artifacts};
-}catch(err){
-
-GatherRunner.disposeDriver(driver,options);
-
-throw err;
-}
-}
-
-
-
-
-
-
-static isPerfPass(passContext){
-const{settings,passConfig}=passContext;
-return!settings.disableStorageReset&&passConfig.recordTrace&&passConfig.useThrottling;
-}
-
-
-
-
-
-
-
-static _addLoadDataToBaseArtifacts(passContext,loadData,passName){
-const baseArtifacts=passContext.baseArtifacts;
-baseArtifacts.devtoolsLogs[passName]=loadData.devtoolsLog;
-if(loadData.trace)baseArtifacts.traces[passName]=loadData.trace;
-}
-
-
-
-
-
-
-static async runPass(passContext){
-
-const gathererResults={};
-const{driver,passConfig}=passContext;
-
-
-await GatherRunner.loadBlank(driver,passConfig.blankPage);
-await GatherRunner.setupPassNetwork(passContext);
-const isPerfPass=GatherRunner.isPerfPass(passContext);
-if(isPerfPass)await driver.cleanBrowserCaches();
-await GatherRunner.beforePass(passContext,gathererResults);
-
-
-await GatherRunner.beginRecording(passContext);
-const{navigationError:possibleNavError}=await GatherRunner.loadPage(driver,passContext);
-await GatherRunner.pass(passContext,gathererResults);
-const loadData=await GatherRunner.endRecording(passContext);
-
-
-await driver.setThrottling(passContext.settings,{useThrottling:false});
-
-
-const pageLoadError=GatherRunner.getPageLoadError(passContext,loadData,possibleNavError);
-if(pageLoadError){
-const localizedMessage=i18n.getFormatted(pageLoadError.friendlyMessage,
-passContext.settings.locale);
-log.error('GatherRunner',localizedMessage,passContext.url);
-
-passContext.LighthouseRunWarnings.push(pageLoadError.friendlyMessage);
-GatherRunner._addLoadDataToBaseArtifacts(passContext,loadData,
-`pageLoadError-${passConfig.passName}`);
-
-return{artifacts:{},pageLoadError};
-}
-
-
-GatherRunner._addLoadDataToBaseArtifacts(passContext,loadData,passConfig.passName);
-
-
-await GatherRunner.afterPass(passContext,loadData,gathererResults);
-return GatherRunner.collectArtifacts(gathererResults);
-}}
-
-
-module.exports=GatherRunner;
-
-},{"../config/constants.js":46,"../lib/dependency-graph/simulator/network-analyzer.js":62,"../lib/i18n/i18n.js":66,"../lib/lh-error.js":71,"../lib/manifest-parser.js":72,"../lib/network-recorder.js":74,"../lib/stack-collector.js":79,"lighthouse-logger":125}],53:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-
-
-
-
-
-
-
-class Gatherer{
-
-
-
-get name(){
-
-return this.constructor.name;
-}
-
-
-
-
-
-
-
-
-beforePass(passContext){}
-
-
-
-
-
-
-
-pass(passContext){}
-
-
-
-
-
-
-
-
-
-afterPass(passContext,loadData){}}
-
-
-
-
-module.exports=Gatherer;
-
-},{}],54:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Runner=require('./runner.js');
-const log=require('lighthouse-logger');
-const ChromeProtocol=require('./gather/connections/cri.js');
-const Config=require('./config/config.js');
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-async function lighthouse(url,flags={},configJSON,connection){
-
-flags.logLevel=flags.logLevel||'error';
-log.setLevel(flags.logLevel);
-
-const config=generateConfig(configJSON,flags);
-
-connection=connection||new ChromeProtocol(flags.port,flags.hostname);
-
-
-return Runner.run(connection,{url,config});
-}
-
-
-
-
-
-
-
-
-
-function generateConfig(configJson,flags){
-return new Config(configJson,flags);
-}
-
-lighthouse.generateConfig=generateConfig;
-lighthouse.getAuditList=Runner.getAuditList;
-lighthouse.traceCategories=require('./gather/driver.js').traceCategories;
-lighthouse.Audit=require('./audits/audit.js');
-lighthouse.Gatherer=require('./gather/gatherers/gatherer.js');
-lighthouse.NetworkRecords=require('./computed/network-records.js');
-
-module.exports=lighthouse;
-
-},{"./audits/audit.js":3,"./computed/network-records.js":34,"./config/config.js":45,"./gather/connections/cri.js":101,"./gather/driver.js":51,"./gather/gatherers/gatherer.js":53,"./runner.js":89,"lighthouse-logger":125}],55:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const isEqual=require('lodash.isequal');
-
-
-
-
-
-
-class ArbitraryEqualityMap{
-constructor(){
-this._equalsFn=ArbitraryEqualityMap.deepEquals;
-
-this._entries=[];
-}
-
-
-
-
-setEqualityFn(equalsFn){
-this._equalsFn=equalsFn;
-}
-
-
-
-
-
-has(key){
-return this._findIndexOf(key)!==-1;
-}
-
-
-
-
-
-get(key){
-const entry=this._entries[this._findIndexOf(key)];
-return entry&&entry.value;
-}
-
-
-
-
-
-set(key,value){
-let index=this._findIndexOf(key);
-if(index===-1)index=this._entries.length;
-this._entries[index]={key,value};
-}
-
-
-
-
-
-_findIndexOf(key){
-for(let i=0;i<this._entries.length;i++){
-if(this._equalsFn(key,this._entries[i].key))return i;
-}
-
-return-1;
-}
-
-
-
-
-
-
-
-
-
-static deepEquals(objA,objB){
-return isEqual(objA,objB);
-}}
-
-
-module.exports=ArbitraryEqualityMap;
-
-},{"lodash.isequal":142}],56:[function(require,module,exports){
-(function(process){
-
-
-
-
-
-'use strict';
-
-const fs=require('fs');
-const path=require('path');
-const log=require('lighthouse-logger');
-const stream=require('stream');
-const Simulator=require('./dependency-graph/simulator/simulator.js');
-const lanternTraceSaver=require('./lantern-trace-saver.js');
-const Metrics=require('./traces/pwmetrics-events.js');
-const rimraf=require('rimraf');
-const mkdirp=require('mkdirp');
-const NetworkAnalysisComputed=require('../computed/network-analysis.js');
-const LoadSimulatorComputed=require('../computed/load-simulator.js');
-const LHError=require('../lib/lh-error.js');
-
-const artifactsFilename='artifacts.json';
-const traceSuffix='.trace.json';
-const devtoolsLogSuffix='.devtoolslog.json';
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function loadArtifacts(basePath){
-log.log('Reading artifacts from disk:',basePath);
-
-if(!fs.existsSync(basePath)){
-throw new Error('No saved artifacts found at '+basePath);
-}
-
-
-const artifactsStr=fs.readFileSync(path.join(basePath,artifactsFilename),'utf8');
-
-const artifacts=JSON.parse(artifactsStr,LHError.parseReviver);
-
-const filenames=fs.readdirSync(basePath);
-
-
-artifacts.devtoolsLogs={};
-filenames.filter(f=>f.endsWith(devtoolsLogSuffix)).forEach(filename=>{
-const passName=filename.replace(devtoolsLogSuffix,'');
-const devtoolsLog=JSON.parse(fs.readFileSync(path.join(basePath,filename),'utf8'));
-artifacts.devtoolsLogs[passName]=devtoolsLog;
-});
-
-
-artifacts.traces={};
-filenames.filter(f=>f.endsWith(traceSuffix)).forEach(filename=>{
-const file=fs.readFileSync(path.join(basePath,filename),{encoding:'utf-8'});
-const trace=JSON.parse(file);
-const passName=filename.replace(traceSuffix,'');
-artifacts.traces[passName]=Array.isArray(trace)?{traceEvents:trace}:trace;
-});
-
-if(Array.isArray(artifacts.Timing)){
-
-
-artifacts.Timing.forEach(entry=>entry.gather=true);
-}
-return artifacts;
-}
-
-
-
-
-
-
-
-function stringifyReplacer(key,value){
-
-if(value instanceof Error){
-return LHError.stringifyReplacer(value);
-}
-
-return value;
-}
-
-
-
-
-
-
-
-
-async function saveArtifacts(artifacts,basePath){
-const status={msg:'Saving artifacts',id:'lh:assetSaver:saveArtifacts'};
-log.time(status);
-mkdirp.sync(basePath);
-rimraf.sync(`${basePath}/*${traceSuffix}`);
-rimraf.sync(`${basePath}/${artifactsFilename}`);
-
-const{traces,devtoolsLogs,...restArtifacts}=artifacts;
-
-
-for(const[passName,trace]of Object.entries(traces)){
-await saveTrace(trace,`${basePath}/${passName}${traceSuffix}`);
-}
-
-
-for(const[passName,devtoolsLog]of Object.entries(devtoolsLogs)){
-const log=JSON.stringify(devtoolsLog);
-fs.writeFileSync(`${basePath}/${passName}${devtoolsLogSuffix}`,log,'utf8');
-}
-
-
-const restArtifactsString=JSON.stringify(restArtifacts,stringifyReplacer,2);
-fs.writeFileSync(`${basePath}/${artifactsFilename}`,restArtifactsString,'utf8');
-log.log('Artifacts saved to disk in folder:',basePath);
-log.timeEnd(status);
-}
-
-
-
-
-
-
-
-async function prepareAssets(artifacts,audits){
-const passNames=Object.keys(artifacts.traces);
-
-const assets=[];
-
-for(const passName of passNames){
-const trace=artifacts.traces[passName];
-const devtoolsLog=artifacts.devtoolsLogs[passName];
-
-const traceData=Object.assign({},trace);
-if(audits){
-const evts=new Metrics(traceData.traceEvents,audits).generateFakeEvents();
-traceData.traceEvents=traceData.traceEvents.concat(evts);
-}
-
-assets.push({
-passName,
-traceData,
-devtoolsLog});
-
-}
-
-return assets;
-}
-
-
-
-
-
-
-
-function*traceJsonGenerator(traceData){
-const EVENTS_PER_ITERATION=500;
-const keys=Object.keys(traceData);
-
-yield'{\n';
-
-
-yield'"traceEvents": [\n';
-if(traceData.traceEvents.length>0){
-const eventsIterator=traceData.traceEvents[Symbol.iterator]();
-
-const firstEvent=eventsIterator.next().value;
-yield`  ${JSON.stringify(firstEvent)}`;
-
-let eventsRemaining=EVENTS_PER_ITERATION;
-let eventsJSON='';
-for(const event of eventsIterator){
-eventsJSON+=`,\n  ${JSON.stringify(event)}`;
-eventsRemaining--;
-if(eventsRemaining===0){
-yield eventsJSON;
-eventsRemaining=EVENTS_PER_ITERATION;
-eventsJSON='';
-}
-}
-yield eventsJSON;
-}
-yield'\n]';
-
-
-if(keys.length>1){
-for(const key of keys){
-if(key==='traceEvents')continue;
-
-yield`,\n"${key}": ${JSON.stringify(traceData[key],null,2)}`;
-}
-}
-
-yield'}\n';
-}
-
-
-
-
-
-
-
-function saveTrace(traceData,traceFilename){
-return new Promise((resolve,reject)=>{
-const traceIter=traceJsonGenerator(traceData);
-
-
-const traceStream=new stream.Readable({
-read(){
-const next=traceIter.next();
-this.push(next.done?null:next.value);
-}});
-
-
-const writeStream=fs.createWriteStream(traceFilename);
-writeStream.on('finish',resolve);
-writeStream.on('error',reject);
-
-traceStream.pipe(writeStream);
-});
-}
-
-
-
-
-
-async function saveLanternDebugTraces(pathWithBasename){
-if(!process.env.LANTERN_DEBUG)return;
-
-for(const[label,nodeTimings]of Simulator.ALL_NODE_TIMINGS){
-if(lanternTraceSaver.simulationNamesToIgnore.includes(label))continue;
-
-const traceFilename=`${pathWithBasename}-${label}${traceSuffix}`;
-await saveTrace(lanternTraceSaver.convertNodeTimingsToTrace(nodeTimings),traceFilename);
-log.log('saveAssets',`${label} lantern trace file streamed to disk: ${traceFilename}`);
-}
-}
-
-
-
-
-
-
-
-
-async function saveAssets(artifacts,audits,pathWithBasename){
-const allAssets=await prepareAssets(artifacts,audits);
-const saveAll=allAssets.map(async(passAssets,index)=>{
-const devtoolsLogFilename=`${pathWithBasename}-${index}${devtoolsLogSuffix}`;
-fs.writeFileSync(devtoolsLogFilename,JSON.stringify(passAssets.devtoolsLog,null,2));
-log.log('saveAssets','devtools log saved to disk: '+devtoolsLogFilename);
-
-const streamTraceFilename=`${pathWithBasename}-${index}${traceSuffix}`;
-log.log('saveAssets','streaming trace file to disk: '+streamTraceFilename);
-await saveTrace(passAssets.traceData,streamTraceFilename);
-log.log('saveAssets','trace file streamed to disk: '+streamTraceFilename);
-});
-
-await Promise.all(saveAll);
-await saveLanternDebugTraces(pathWithBasename);
-}
-
-
-
-
-
-
-async function saveLanternNetworkData(devtoolsLog,outputPath){
-const context={computedCache:new Map()};
-const networkAnalysis=await NetworkAnalysisComputed.request(devtoolsLog,context);
-const lanternData=LoadSimulatorComputed.convertAnalysisToSaveableLanternData(networkAnalysis);
-
-fs.writeFileSync(outputPath,JSON.stringify(lanternData));
-}
-
-module.exports={
-saveArtifacts,
-loadArtifacts,
-saveAssets,
-prepareAssets,
-saveTrace,
-saveLanternNetworkData,
-stringifyReplacer};
-
-
-}).call(this,require('_process'));
-},{"../computed/load-simulator.js":10,"../computed/network-analysis.js":33,"../lib/lh-error.js":71,"./dependency-graph/simulator/simulator.js":63,"./lantern-trace-saver.js":69,"./traces/pwmetrics-events.js":86,"_process":158,"fs":101,"lighthouse-logger":125,"mkdirp":101,"path":156,"rimraf":101,"stream":183}],57:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-class BaseNode{
-
-
-
-constructor(id){
-this._id=id;
-this._isMainDocument=false;
-
-this._dependents=[];
-
-this._dependencies=[];
-}
-
-
-
-
-get id(){
-return this._id;
-}
-
-
-
-
-get type(){
-throw new Error('Unimplemented');
-}
-
-
-
-
-get startTime(){
-throw new Error('Unimplemented');
-}
-
-
-
-
-get endTime(){
-throw new Error('Unimplemented');
-}
-
-
-
-
-setIsMainDocument(value){
-this._isMainDocument=value;
-}
-
-
-
-
-isMainDocument(){
-return this._isMainDocument;
-}
-
-
-
-
-getDependents(){
-return this._dependents.slice();
-}
-
-
-
-
-getDependencies(){
-return this._dependencies.slice();
-}
-
-
-
-
-getNumberOfDependencies(){
-return this._dependencies.length;
-}
-
-
-
-
-getRootNode(){
-let rootNode=this;
-while(rootNode._dependencies.length){
-rootNode=rootNode._dependencies[0];
-}
-
-return rootNode;
-}
-
-
-
-
-addDependent(node){
-node.addDependency(this);
-}
-
-
-
-
-addDependency(node){
-if(this._dependencies.includes(node)){
-return;
-}
-
-node._dependents.push(this);
-this._dependencies.push(node);
-}
-
-
-
-
-removeDependent(node){
-node.removeDependency(this);
-}
-
-
-
-
-removeDependency(node){
-if(!this._dependencies.includes(node)){
-return;
-}
-
-const thisIndex=node._dependents.indexOf(this);
-node._dependents.splice(thisIndex,1);
-this._dependencies.splice(this._dependencies.indexOf(node),1);
-}
-
-removeAllDependencies(){
-for(const node of this._dependencies.slice()){
-this.removeDependency(node);
-}
-}
-
-
-
-
-
-cloneWithoutRelationships(){
-const node=new BaseNode(this.id);
-node.setIsMainDocument(this._isMainDocument);
-return node;
-}
-
-
-
-
-
-
-
-
-cloneWithRelationships(predicate){
-const rootNode=this.getRootNode();
-
-
-const idsToIncludedClones=new Map();
-
-
-rootNode.traverse(node=>{
-if(idsToIncludedClones.has(node.id))return;
-
-if(predicate===undefined){
-
-idsToIncludedClones.set(node.id,node.cloneWithoutRelationships());
-return;
-}
-
-if(predicate(node)){
-
-node.traverse(
-node=>idsToIncludedClones.set(node.id,node.cloneWithoutRelationships()),
-
-node=>node._dependencies.filter(parent=>!idsToIncludedClones.has(parent.id)));
-
-}
-});
-
-
-rootNode.traverse(originalNode=>{
-const clonedNode=idsToIncludedClones.get(originalNode.id);
-if(!clonedNode)return;
-
-for(const dependency of originalNode._dependencies){
-const clonedDependency=idsToIncludedClones.get(dependency.id);
-if(!clonedDependency)throw new Error('Dependency somehow not cloned');
-clonedNode.addDependency(clonedDependency);
-}
-});
-
-const clonedThisNode=idsToIncludedClones.get(this.id);
-if(!clonedThisNode)throw new Error('Cloned graph missing node');
-return clonedThisNode;
-}
-
-
-
-
-
-
-
-
-
-
-
-traverse(callback,getNextNodes){
-if(!getNextNodes){
-getNextNodes=node=>node.getDependents();
-}
-
-
-
-const queue=[[this]];
-const visited=new Set([this.id]);
-
-while(queue.length){
-
-
-const traversalPath=queue.shift();
-const node=traversalPath[0];
-callback(node,traversalPath);
-
-for(const nextNode of getNextNodes(node)){
-if(visited.has(nextNode.id))continue;
-visited.add(nextNode.id);
-
-queue.push([nextNode,...traversalPath]);
-}
-}
-}
-
-
-
-
-
-
-
-static hasCycle(node,direction='both'){
-
-if(direction==='both'){
-return BaseNode.hasCycle(node,'dependents')||BaseNode.hasCycle(node,'dependencies');
-}
-
-const visited=new Set();
-
-const currentPath=[];
-const toVisit=[node];
-const depthAdded=new Map([[node,0]]);
-
-
-while(toVisit.length){
-
-
-
-const currentNode=toVisit.pop();
-
-
-if(currentPath.includes(currentNode))return true;
-
-if(visited.has(currentNode))continue;
-
-
-
-while(currentPath.length>depthAdded.get(currentNode))currentPath.pop();
-
-
-visited.add(currentNode);
-currentPath.push(currentNode);
-
-
-const nodesToExplore=direction==='dependents'?
-currentNode._dependents:
-currentNode._dependencies;
-for(const nextNode of nodesToExplore){
-if(toVisit.includes(nextNode))continue;
-toVisit.push(nextNode);
-depthAdded.set(nextNode,currentPath.length);
-}
-}
-
-return false;
-}}
-
-
-BaseNode.TYPES={
-NETWORK:'network',
-CPU:'cpu'};
-
-
-module.exports=BaseNode;
-
-},{}],58:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const BaseNode=require('./base-node.js');
-
-class CPUNode extends BaseNode{
-
-
-
-
-constructor(parentEvent,childEvents=[]){
-const nodeId=`${parentEvent.tid}.${parentEvent.ts}`;
-super(nodeId);
-
-this._event=parentEvent;
-this._childEvents=childEvents;
-}
-
-get type(){
-return BaseNode.TYPES.CPU;
-}
-
-
-
-
-get startTime(){
-return this._event.ts;
-}
-
-
-
-
-get endTime(){
-return this._event.ts+this._event.dur;
-}
-
-
-
-
-get event(){
-return this._event;
-}
-
-
-
-
-get childEvents(){
-return this._childEvents;
-}
-
-
-
-
-
-didPerformLayout(){
-return this._childEvents.some(evt=>evt.name==='Layout');
-}
-
-
-
-
-getEvaluateScriptURLs(){
-
-const urls=new Set();
-for(const event of this._childEvents){
-if(event.name!=='EvaluateScript')continue;
-if(!event.args.data||!event.args.data.url)continue;
-urls.add(event.args.data.url);
-}
-
-return urls;
-}
-
-
-
-
-cloneWithoutRelationships(){
-return new CPUNode(this._event,this._childEvents);
-}}
-
-
-module.exports=CPUNode;
-
-},{"./base-node.js":57}],59:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const BaseNode=require('./base-node.js');
-const NetworkRequest=require('../network-request.js');
-
-class NetworkNode extends BaseNode{
-
-
-
-constructor(networkRecord){
-super(networkRecord.requestId);
-
-this._record=networkRecord;
-}
-
-get type(){
-return BaseNode.TYPES.NETWORK;
-}
-
-
-
-
-get startTime(){
-return this._record.startTime*1000*1000;
-}
-
-
-
-
-get endTime(){
-return this._record.endTime*1000*1000;
-}
-
-
-
-
-get record(){
-return this._record;
-}
-
-
-
-
-get initiatorType(){
-return this._record.initiator&&this._record.initiator.type;
-}
-
-
-
-
-get fromDiskCache(){
-return!!this._record.fromDiskCache;
-}
-
-
-
-
-hasRenderBlockingPriority(){
-const priority=this._record.priority;
-const isScript=this._record.resourceType===NetworkRequest.TYPES.Script;
-const isDocument=this._record.resourceType===NetworkRequest.TYPES.Document;
-const isBlockingScript=priority==='High'&&isScript;
-const isBlockingHtmlImport=priority==='High'&&isDocument;
-return priority==='VeryHigh'||isBlockingScript||isBlockingHtmlImport;
-}
-
-
-
-
-cloneWithoutRelationships(){
-const node=new NetworkNode(this._record);
-node.setIsMainDocument(this._isMainDocument);
-return node;
-}}
-
-
-module.exports=NetworkNode;
-
-},{"../network-request.js":75,"./base-node.js":57}],60:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const NetworkAnalyzer=require('./network-analyzer.js');
-const TcpConnection=require('./tcp-connection.js');
-
-const DEFAULT_SERVER_RESPONSE_TIME=30;
-const TLS_SCHEMES=['https','wss'];
-
-
-
-const CONNECTIONS_PER_ORIGIN=6;
-
-module.exports=class ConnectionPool{
-
-
-
-
-constructor(records,options){
-this._options=options;
-
-this._records=records;
-
-this._connectionsByOrigin=new Map();
-
-this._connectionsByRecord=new Map();
-this._connectionsInUse=new Set();
-this._connectionReusedByRequestId=NetworkAnalyzer.estimateIfConnectionWasReused(records,{
-forceCoarseEstimates:true});
-
-
-this._initializeConnections();
-}
-
-
-
-
-connectionsInUse(){
-return Array.from(this._connectionsInUse);
-}
-
-_initializeConnections(){
-const connectionReused=this._connectionReusedByRequestId;
-const additionalRttByOrigin=this._options.additionalRttByOrigin;
-const serverResponseTimeByOrigin=this._options.serverResponseTimeByOrigin;
-
-const recordsByOrigin=NetworkAnalyzer.groupByOrigin(this._records);
-for(const[origin,records]of recordsByOrigin.entries()){
-const connections=[];
-const additionalRtt=additionalRttByOrigin.get(origin)||0;
-const responseTime=serverResponseTimeByOrigin.get(origin)||DEFAULT_SERVER_RESPONSE_TIME;
-
-for(const record of records){
-if(connectionReused.get(record.requestId))continue;
-
-const isTLS=TLS_SCHEMES.includes(record.parsedURL.scheme);
-const isH2=record.protocol==='h2';
-const connection=new TcpConnection(
-this._options.rtt+additionalRtt,
-this._options.throughput,
-responseTime,
-isTLS,
-isH2);
-
-
-connections.push(connection);
-}
-
-if(!connections.length){
-throw new Error(`Could not find a connection for origin: ${origin}`);
-}
-
-
-while(connections.length<CONNECTIONS_PER_ORIGIN)connections.push(connections[0].clone());
-
-this._connectionsByOrigin.set(origin,connections);
-}
-}
-
-
-
-
-
-_findAvailableConnectionWithLargestCongestionWindow(connections,options){
-const{ignoreConnectionReused,observedConnectionWasReused}=options;
-
-
-let maxConnection=null;
-for(let i=0;i<connections.length;i++){
-const connection=connections[i];
-
-
-
-
-
-if(!ignoreConnectionReused&&connection._warmed!==observedConnectionWasReused){
-continue;
-}
-
-
-if(this._connectionsInUse.has(connection)){
-continue;
-}
-
-
-const currentMax=maxConnection&&maxConnection.congestionWindow||-Infinity;
-if(connection.congestionWindow>currentMax)maxConnection=connection;
-}
-
-return maxConnection;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-acquire(record,options={}){
-if(this._connectionsByRecord.has(record))throw new Error('Record already has a connection');
-
-const origin=record.parsedURL.securityOrigin;
-const observedConnectionWasReused=!!this._connectionReusedByRequestId.get(record.requestId);
-const connections=this._connectionsByOrigin.get(origin)||[];
-const connectionToUse=this._findAvailableConnectionWithLargestCongestionWindow(connections,{
-ignoreConnectionReused:options.ignoreConnectionReused,
-observedConnectionWasReused});
-
-
-if(!connectionToUse)return null;
-
-this._connectionsInUse.add(connectionToUse);
-this._connectionsByRecord.set(record,connectionToUse);
-return connectionToUse;
-}
-
-
-
-
-
-
-
-
-acquireActiveConnectionFromRecord(record){
-const activeConnection=this._connectionsByRecord.get(record);
-if(!activeConnection)throw new Error('Could not find an active connection for record');
-
-return activeConnection;
-}
-
-
-
-
-release(record){
-const connection=this._connectionsByRecord.get(record);
-this._connectionsByRecord.delete(record);
-this._connectionsInUse.delete(connection);
-}};
-
-
-},{"./network-analyzer.js":62,"./tcp-connection.js":64}],61:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-const DNS_RESOLUTION_RTT_MULTIPLIER=2;
-
-class DNSCache{
-
-
-
-constructor({rtt}){
-this._rtt=rtt;
-
-
-this._resolvedDomainNames=new Map();
-}
-
-
-
-
-
-
-getTimeUntilResolution(request,options){
-const{requestedAt=0,shouldUpdateCache=false}=options||{};
-
-const domain=request.parsedURL.host;
-const cacheEntry=this._resolvedDomainNames.get(domain);
-let timeUntilResolved=this._rtt*DNSCache.RTT_MULTIPLIER;
-if(cacheEntry){
-const timeUntilCachedIsResolved=Math.max(cacheEntry.resolvedAt-requestedAt,0);
-timeUntilResolved=Math.min(timeUntilCachedIsResolved,timeUntilResolved);
-}
-
-const resolvedAt=requestedAt+timeUntilResolved;
-if(shouldUpdateCache)this._updateCacheResolvedAtIfNeeded(request,resolvedAt);
-
-return timeUntilResolved;
-}
-
-
-
-
-
-_updateCacheResolvedAtIfNeeded(request,resolvedAt){
-const domain=request.parsedURL.host;
-const cacheEntry=this._resolvedDomainNames.get(domain)||{resolvedAt};
-cacheEntry.resolvedAt=Math.min(cacheEntry.resolvedAt,resolvedAt);
-this._resolvedDomainNames.set(domain,cacheEntry);
-}
-
-
-
-
-
-
-
-
-setResolvedAt(domain,resolvedAt){
-this._resolvedDomainNames.set(domain,{resolvedAt});
-}}
-
-
-DNSCache.RTT_MULTIPLIER=DNS_RESOLUTION_RTT_MULTIPLIER;
-
-module.exports=DNSCache;
-
-},{}],62:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const INITIAL_CWD=14*1024;
-const NetworkRequest=require('../../network-request.js');
-const URL=require('../../url-shim.js');
-
-
-const DEFAULT_SERVER_RESPONSE_PERCENTAGE=0.4;
-
-
-
-
-
-
-const SERVER_RESPONSE_PERCENTAGE_OF_TTFB={
-Document:0.9,
-XHR:0.9,
-Fetch:0.9};
-
-
-class NetworkAnalyzer{
-
-
-
-static get SUMMARY(){
-return'__SUMMARY__';
-}
-
-
-
-
-
-static groupByOrigin(records){
-const grouped=new Map();
-records.forEach(item=>{
-const key=item.parsedURL.securityOrigin;
-const group=grouped.get(key)||[];
-group.push(item);
-grouped.set(key,group);
-});
-return grouped;
-}
-
-
-
-
-
-static getSummary(values){
-values.sort((a,b)=>a-b);
-
-return{
-min:values[0],
-max:values[values.length-1],
-avg:values.reduce((a,b)=>a+b,0)/values.length,
-median:values[Math.floor((values.length-1)/2)]};
-
-}
-
-
-
-
-
-static summarize(values){
-const summaryByKey=new Map();
-const allEstimates=[];
-for(const[key,estimates]of values){
-summaryByKey.set(key,NetworkAnalyzer.getSummary(estimates));
-allEstimates.push(...estimates);
-}
-
-summaryByKey.set(NetworkAnalyzer.SUMMARY,NetworkAnalyzer.getSummary(allEstimates));
-return summaryByKey;
-}
-
-
-
-
-
-
-
-
-static _estimateValueByOrigin(records,iteratee){
-const connectionWasReused=NetworkAnalyzer.estimateIfConnectionWasReused(records);
-const groupedByOrigin=NetworkAnalyzer.groupByOrigin(records);
-
-const estimates=new Map();
-for(const[origin,originRecords]of groupedByOrigin.entries()){
-
-let originEstimates=[];
-
-for(const record of originRecords){
-const timing=record.timing;
-if(!timing)continue;
-
-const value=iteratee({
-record,
-timing,
-connectionReused:connectionWasReused.get(record.requestId)});
-
-if(typeof value!=='undefined'){
-originEstimates=originEstimates.concat(value);
-}
-}
-
-if(!originEstimates.length)continue;
-estimates.set(origin,originEstimates);
-}
-
-return estimates;
-}
-
-
-
-
-
-
-
-
-static _estimateRTTByOriginViaTCPTiming(records){
-return NetworkAnalyzer._estimateValueByOrigin(records,({timing,connectionReused})=>{
-if(connectionReused)return;
-
-
-
-if(timing.sslStart>0&&timing.sslEnd>0){
-return[timing.connectEnd-timing.sslStart,timing.sslStart-timing.connectStart];
-}else if(timing.connectStart>0&&timing.connectEnd>0){
-return timing.connectEnd-timing.connectStart;
-}
-});
-}
-
-
-
-
-
-
-
-
-
-static _estimateRTTByOriginViaDownloadTiming(records){
-return NetworkAnalyzer._estimateValueByOrigin(records,({record,timing,connectionReused})=>{
-if(connectionReused)return;
-
-if(record.transferSize<=INITIAL_CWD)return;
-if(!Number.isFinite(timing.receiveHeadersEnd)||timing.receiveHeadersEnd<0)return;
-
-
-const totalTime=(record.endTime-record.startTime)*1000;
-const downloadTimeAfterFirstByte=totalTime-timing.receiveHeadersEnd;
-const numberOfRoundTrips=Math.log2(record.transferSize/INITIAL_CWD);
-
-
-
-if(numberOfRoundTrips>5)return;
-return downloadTimeAfterFirstByte/numberOfRoundTrips;
-});
-}
-
-
-
-
-
-
-
-
-
-
-static _estimateRTTByOriginViaSendStartTiming(records){
-return NetworkAnalyzer._estimateValueByOrigin(records,({record,timing,connectionReused})=>{
-if(connectionReused)return;
-if(!Number.isFinite(timing.sendStart)||timing.sendStart<0)return;
-
-
-
-let roundTrips=2;
-if(record.parsedURL.scheme==='https')roundTrips+=1;
-return timing.sendStart/roundTrips;
-});
-}
-
-
-
-
-
-
-
-
-
-
-static _estimateRTTByOriginViaHeadersEndTiming(records){
-return NetworkAnalyzer._estimateValueByOrigin(records,({record,timing,connectionReused})=>{
-if(!Number.isFinite(timing.receiveHeadersEnd)||timing.receiveHeadersEnd<0)return;
-if(!record.resourceType)return;
-
-const serverResponseTimePercentage=SERVER_RESPONSE_PERCENTAGE_OF_TTFB[record.resourceType]||
-DEFAULT_SERVER_RESPONSE_PERCENTAGE;
-const estimatedServerResponseTime=timing.receiveHeadersEnd*serverResponseTimePercentage;
-
-
-
-let roundTrips=1;
-
-
-
-if(!connectionReused){
-roundTrips+=1;
-if(record.parsedURL.scheme==='https')roundTrips+=1;
-roundTrips+=1;
-}
-
-
-return Math.max((timing.receiveHeadersEnd-estimatedServerResponseTime)/roundTrips,3);
-});
-}
-
-
-
-
-
-
-
-
-static _estimateResponseTimeByOrigin(records,rttByOrigin){
-return NetworkAnalyzer._estimateValueByOrigin(records,({record,timing})=>{
-if(!Number.isFinite(timing.receiveHeadersEnd)||timing.receiveHeadersEnd<0)return;
-if(!Number.isFinite(timing.sendEnd)||timing.sendEnd<0)return;
-
-const ttfb=timing.receiveHeadersEnd-timing.sendEnd;
-const origin=record.parsedURL.securityOrigin;
-const rtt=rttByOrigin.get(origin)||rttByOrigin.get(NetworkAnalyzer.SUMMARY)||0;
-return Math.max(ttfb-rtt,0);
-});
-}
-
-
-
-
-
-static canTrustConnectionInformation(records){
-const connectionIdWasStarted=new Map();
-for(const record of records){
-const started=connectionIdWasStarted.get(record.connectionId)||!record.connectionReused;
-connectionIdWasStarted.set(record.connectionId,started);
-}
-
-
-if(connectionIdWasStarted.size<=1)return false;
-
-return Array.from(connectionIdWasStarted.values()).every(started=>started);
-}
-
-
-
-
-
-
-
-
-
-static estimateIfConnectionWasReused(records,options){
-const{forceCoarseEstimates=false}=options||{};
-
-
-if(!forceCoarseEstimates&&NetworkAnalyzer.canTrustConnectionInformation(records)){
-
-return new Map(records.map(record=>[record.requestId,!!record.connectionReused]));
-}
-
-
-
-
-
-const connectionWasReused=new Map();
-const groupedByOrigin=NetworkAnalyzer.groupByOrigin(records);
-for(const[_,originRecords]of groupedByOrigin.entries()){
-const earliestReusePossible=originRecords.
-map(record=>record.endTime).
-reduce((a,b)=>Math.min(a,b),Infinity);
-
-for(const record of originRecords){
-connectionWasReused.set(
-record.requestId,
-record.startTime>=earliestReusePossible||record.protocol==='h2');
-
-}
-
-const firstRecord=originRecords.reduce((a,b)=>a.startTime>b.startTime?b:a);
-connectionWasReused.set(firstRecord.requestId,false);
-}
-
-return connectionWasReused;
-}
-
-
-
-
-
-
-
-
-
-
-static estimateRTTByOrigin(records,options){
-const{
-forceCoarseEstimates=false,
-
-
-coarseEstimateMultiplier=0.3,
-useDownloadEstimates=true,
-useSendStartEstimates=true,
-useHeadersEndEstimates=true}=
-options||{};
-
-let estimatesByOrigin=NetworkAnalyzer._estimateRTTByOriginViaTCPTiming(records);
-if(!estimatesByOrigin.size||forceCoarseEstimates){
-estimatesByOrigin=new Map();
-const estimatesViaDownload=NetworkAnalyzer._estimateRTTByOriginViaDownloadTiming(records);
-const estimatesViaSendStart=NetworkAnalyzer._estimateRTTByOriginViaSendStartTiming(records);
-const estimatesViaTTFB=NetworkAnalyzer._estimateRTTByOriginViaHeadersEndTiming(records);
-
-for(const[origin,estimates]of estimatesViaDownload.entries()){
-if(!useDownloadEstimates)continue;
-estimatesByOrigin.set(origin,estimates);
-}
-
-for(const[origin,estimates]of estimatesViaSendStart.entries()){
-if(!useSendStartEstimates)continue;
-const existing=estimatesByOrigin.get(origin)||[];
-estimatesByOrigin.set(origin,existing.concat(estimates));
-}
-
-for(const[origin,estimates]of estimatesViaTTFB.entries()){
-if(!useHeadersEndEstimates)continue;
-const existing=estimatesByOrigin.get(origin)||[];
-estimatesByOrigin.set(origin,existing.concat(estimates));
-}
-
-for(const estimates of estimatesByOrigin.values()){
-estimates.forEach((x,i)=>estimates[i]=x*coarseEstimateMultiplier);
-}
-}
-
-if(!estimatesByOrigin.size)throw new Error('No timing information available');
-return NetworkAnalyzer.summarize(estimatesByOrigin);
-}
-
-
-
-
-
-
-
-
-
-static estimateServerResponseTimeByOrigin(records,options){
-let rttByOrigin=(options||{}).rttByOrigin;
-if(!rttByOrigin){
-
-rttByOrigin=new Map();
-
-const rttSummaryByOrigin=NetworkAnalyzer.estimateRTTByOrigin(records,options);
-for(const[origin,summary]of rttSummaryByOrigin.entries()){
-rttByOrigin.set(origin,summary.min);
-}
-}
-
-const estimatesByOrigin=NetworkAnalyzer._estimateResponseTimeByOrigin(records,rttByOrigin);
-return NetworkAnalyzer.summarize(estimatesByOrigin);
-}
-
-
-
-
-
-
-
-
-
-
-static estimateThroughput(networkRecords){
-let totalBytes=0;
-
-
-
-
-const timeBoundaries=networkRecords.reduce((boundaries,record)=>{
-const scheme=record.parsedURL&&record.parsedURL.scheme;
-
-
-if(scheme==='data'||record.failed||!record.finished||
-record.statusCode>300||!record.transferSize){
-return boundaries;
-}
-
-
-totalBytes+=record.transferSize;
-boundaries.push({time:record.responseReceivedTime,isStart:true});
-boundaries.push({time:record.endTime,isStart:false});
-return boundaries;
-},[]).sort((a,b)=>a.time-b.time);
-
-if(!timeBoundaries.length){
-return Infinity;
-}
-
-let inflight=0;
-let currentStart=0;
-let totalDuration=0;
-
-timeBoundaries.forEach(boundary=>{
-if(boundary.isStart){
-if(inflight===0){
-
-currentStart=boundary.time;
-}
-inflight++;
-}else{
-inflight--;
-if(inflight===0){
-
-totalDuration+=boundary.time-currentStart;
-}
-}
-});
-
-return totalBytes*8/totalDuration;
-}
-
-
-
-
-
-
-static findMainDocument(records,finalURL){
-
-if(finalURL){
-
-const mainResource=records.find(request=>finalURL.startsWith(request.url)&&
-URL.equalWithExcludedFragments(request.url,finalURL));
-if(mainResource)return mainResource;
-
-}
-
-const documentRequests=records.filter(record=>record.resourceType===
-NetworkRequest.TYPES.Document);
-if(!documentRequests.length)throw new Error('Unable to identify the main resource');
-
-return documentRequests.reduce((min,r)=>r.startTime<min.startTime?r:min);
-}}
-
-
-module.exports=NetworkAnalyzer;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-},{"../../network-request.js":75,"../../url-shim.js":"url"}],63:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const BaseNode=require('../base-node.js');
-const TcpConnection=require('./tcp-connection.js');
-const ConnectionPool=require('./connection-pool.js');
-const DNSCache=require('./dns-cache.js');
-const mobileSlow4G=require('../../../config/constants.js').throttling.mobileSlow4G;
-
-
-
-
-
-
-const DEFAULT_MAXIMUM_CONCURRENT_REQUESTS=10;
-
-const DEFAULT_LAYOUT_TASK_MULTIPLIER=0.5;
-
-const DEFAULT_MAXIMUM_CPU_TASK_DURATION=10000;
-
-const NodeState={
-NotReadyToStart:0,
-ReadyToStart:1,
-InProgress:2,
-Complete:3};
-
-
-
-const ALL_SIMULATION_NODE_TIMINGS=new Map();
-
-class Simulator{
-
-
-
-constructor(options){
-
-this._options=Object.assign(
-{
-rtt:mobileSlow4G.rttMs,
-throughput:mobileSlow4G.throughputKbps*1024,
-maximumConcurrentRequests:DEFAULT_MAXIMUM_CONCURRENT_REQUESTS,
-cpuSlowdownMultiplier:mobileSlow4G.cpuSlowdownMultiplier,
-layoutTaskMultiplier:DEFAULT_LAYOUT_TASK_MULTIPLIER,
-additionalRttByOrigin:new Map(),
-serverResponseTimeByOrigin:new Map()},
-
-options);
-
-
-this._rtt=this._options.rtt;
-this._throughput=this._options.throughput;
-this._maximumConcurrentRequests=Math.max(Math.min(
-TcpConnection.maximumSaturatedConnections(this._rtt,this._throughput),
-this._options.maximumConcurrentRequests),
-1);
-this._cpuSlowdownMultiplier=this._options.cpuSlowdownMultiplier;
-this._layoutTaskMultiplier=this._cpuSlowdownMultiplier*this._options.layoutTaskMultiplier;
-
-this._cachedNodeListByStartTime=[];
-
-
-this._flexibleOrdering=false;
-
-this._nodeTimings=new Map();
-
-this._numberInProgressByType=new Map();
-
-this._nodes={};
-this._dns=new DNSCache({rtt:this._rtt});
-
-this._connectionPool=null;
-}
-
-
-get rtt(){
-return this._rtt;
-}
-
-
-
-
-_initializeConnectionPool(graph){
-
-const records=[];
-graph.getRootNode().traverse(node=>{
-if(node.type===BaseNode.TYPES.NETWORK){
-records.push(node.record);
-}
-});
-
-this._connectionPool=new ConnectionPool(records,this._options);
-}
-
-
-
-
-_initializeAuxiliaryData(){
-this._nodeTimings=new Map();
-this._numberInProgressByType=new Map();
-
-this._nodes={};
-this._cachedNodeListByStartTime=[];
-
-
-for(const state of Object.values(NodeState)){
-this._nodes[state]=new Set();
-}
-}
-
-
-
-
-
-_numberInProgress(type){
-return this._numberInProgressByType.get(type)||0;
-}
-
-
-
-
-
-_setTimingData(node,values){
-const timingData=this._nodeTimings.get(node)||{};
-Object.assign(timingData,values);
-this._nodeTimings.set(node,timingData);
-}
-
-
-
-
-
-_getTimingData(node){
-const timingData=this._nodeTimings.get(node);
-if(!timingData)throw new Error(`Unable to get timing data for node ${node.id}`);
-return timingData;
-}
-
-
-
-
-
-_markNodeAsReadyToStart(node,queuedTime){
-const firstNodeIndexWithGreaterStartTime=this._cachedNodeListByStartTime.
-findIndex(candidate=>candidate.startTime>node.startTime);
-const insertionIndex=firstNodeIndexWithGreaterStartTime===-1?
-this._cachedNodeListByStartTime.length:firstNodeIndexWithGreaterStartTime;
-this._cachedNodeListByStartTime.splice(insertionIndex,0,node);
-
-this._nodes[NodeState.ReadyToStart].add(node);
-this._nodes[NodeState.NotReadyToStart].delete(node);
-this._setTimingData(node,{queuedTime});
-}
-
-
-
-
-
-_markNodeAsInProgress(node,startTime){
-const indexOfNodeToStart=this._cachedNodeListByStartTime.indexOf(node);
-this._cachedNodeListByStartTime.splice(indexOfNodeToStart,1);
-
-this._nodes[NodeState.InProgress].add(node);
-this._nodes[NodeState.ReadyToStart].delete(node);
-this._numberInProgressByType.set(node.type,this._numberInProgress(node.type)+1);
-this._setTimingData(node,{startTime});
-}
-
-
-
-
-
-_markNodeAsComplete(node,endTime){
-this._nodes[NodeState.Complete].add(node);
-this._nodes[NodeState.InProgress].delete(node);
-this._numberInProgressByType.set(node.type,this._numberInProgress(node.type)-1);
-this._setTimingData(node,{endTime});
-
-
-for(const dependent of node.getDependents()){
-
-const dependencies=dependent.getDependencies();
-if(dependencies.some(dep=>!this._nodes[NodeState.Complete].has(dep)))continue;
-
-
-this._markNodeAsReadyToStart(dependent,endTime);
-}
-}
-
-
-
-
-
-_acquireConnection(record){
-return this._connectionPool.acquire(record,{
-ignoreConnectionReused:this._flexibleOrdering});
-
-}
-
-
-
-
-_getNodesSortedByStartTime(){
-
-return Array.from(this._cachedNodeListByStartTime);
-}
-
-
-
-
-
-_startNodeIfPossible(node,totalElapsedTime){
-if(node.type===BaseNode.TYPES.CPU){
-
-if(this._numberInProgress(node.type)===0){
-this._markNodeAsInProgress(node,totalElapsedTime);
-this._setTimingData(node,{timeElapsed:0});
-}
-
-return;
-}
-
-if(node.type!==BaseNode.TYPES.NETWORK)throw new Error('Unsupported');
-
-
-if(!node.fromDiskCache){
-
-const numberOfActiveRequests=this._numberInProgress(node.type);
-if(numberOfActiveRequests>=this._maximumConcurrentRequests)return;
-const connection=this._acquireConnection(node.record);
-if(!connection)return;
-}
-
-this._markNodeAsInProgress(node,totalElapsedTime);
-this._setTimingData(node,{
-timeElapsed:0,
-timeElapsedOvershoot:0,
-bytesDownloaded:0});
-
-}
-
-
-
-
-
-_updateNetworkCapacity(){
-for(const connection of this._connectionPool.connectionsInUse()){
-connection.setThroughput(this._throughput/this._nodes[NodeState.InProgress].size);
-}
-}
-
-
-
-
-
-
-_estimateTimeRemaining(node){
-if(node.type===BaseNode.TYPES.CPU){
-return this._estimateCPUTimeRemaining(node);
-}else if(node.type===BaseNode.TYPES.NETWORK){
-return this._estimateNetworkTimeRemaining(node);
-}else{
-throw new Error('Unsupported');
-}
-}
-
-
-
-
-
-_estimateCPUTimeRemaining(cpuNode){
-const timingData=this._getTimingData(cpuNode);
-const multiplier=cpuNode.didPerformLayout()?
-this._layoutTaskMultiplier:
-this._cpuSlowdownMultiplier;
-const totalDuration=Math.min(
-Math.round(cpuNode.event.dur/1000*multiplier),
-DEFAULT_MAXIMUM_CPU_TASK_DURATION);
-
-const estimatedTimeElapsed=totalDuration-timingData.timeElapsed;
-this._setTimingData(cpuNode,{estimatedTimeElapsed});
-return estimatedTimeElapsed;
-}
-
-
-
-
-
-_estimateNetworkTimeRemaining(networkNode){
-const record=networkNode.record;
-const timingData=this._getTimingData(networkNode);
-
-let timeElapsed=0;
-if(networkNode.fromDiskCache){
-
-
-const sizeInMb=(record.resourceSize||0)/1024/1024;
-timeElapsed=8+20*sizeInMb-timingData.timeElapsed;
-}else{
-const connection=this._connectionPool.acquireActiveConnectionFromRecord(record);
-const dnsResolutionTime=this._dns.getTimeUntilResolution(record,{
-requestedAt:timingData.startTime,
-shouldUpdateCache:true});
-
-const timeAlreadyElapsed=timingData.timeElapsed;
-const calculation=connection.simulateDownloadUntil(
-record.transferSize-timingData.bytesDownloaded,
-{timeAlreadyElapsed,dnsResolutionTime,maximumTimeToElapse:Infinity});
-
-
-timeElapsed=calculation.timeElapsed;
-}
-
-const estimatedTimeElapsed=timeElapsed+timingData.timeElapsedOvershoot;
-this._setTimingData(networkNode,{estimatedTimeElapsed});
-return estimatedTimeElapsed;
-}
-
-
-
-
-
-_findNextNodeCompletionTime(){
-let minimumTime=Infinity;
-for(const node of this._nodes[NodeState.InProgress]){
-minimumTime=Math.min(minimumTime,this._estimateTimeRemaining(node));
-}
-
-return minimumTime;
-}
-
-
-
-
-
-
-
-_updateProgressMadeInTimePeriod(node,timePeriodLength,totalElapsedTime){
-const timingData=this._getTimingData(node);
-const isFinished=timingData.estimatedTimeElapsed===timePeriodLength;
-
-if(node.type===BaseNode.TYPES.CPU||node.fromDiskCache){
-return isFinished?
-this._markNodeAsComplete(node,totalElapsedTime):
-timingData.timeElapsed+=timePeriodLength;
-}
-
-if(node.type!==BaseNode.TYPES.NETWORK)throw new Error('Unsupported');
-
-const record=node.record;
-const connection=this._connectionPool.acquireActiveConnectionFromRecord(record);
-const dnsResolutionTime=this._dns.getTimeUntilResolution(record,{
-requestedAt:timingData.startTime,
-shouldUpdateCache:true});
-
-const calculation=connection.simulateDownloadUntil(
-record.transferSize-timingData.bytesDownloaded,
-{
-dnsResolutionTime,
-timeAlreadyElapsed:timingData.timeElapsed,
-maximumTimeToElapse:timePeriodLength-timingData.timeElapsedOvershoot});
-
-
-
-connection.setCongestionWindow(calculation.congestionWindow);
-connection.setH2OverflowBytesDownloaded(calculation.extraBytesDownloaded);
-
-if(isFinished){
-connection.setWarmed(true);
-this._connectionPool.release(record);
-this._markNodeAsComplete(node,totalElapsedTime);
-}else{
-timingData.timeElapsed+=calculation.timeElapsed;
-timingData.timeElapsedOvershoot+=calculation.timeElapsed-timePeriodLength;
-timingData.bytesDownloaded+=calculation.bytesDownloaded;
-}
-}
-
-
-
-
-_computeFinalNodeTimings(){
-
-const nodeTimingEntries=[];
-for(const[node,timing]of this._nodeTimings){
-nodeTimingEntries.push([node,{
-startTime:timing.startTime,
-endTime:timing.endTime,
-duration:timing.endTime-timing.startTime}]);
-
-}
-
-
-nodeTimingEntries.sort((a,b)=>a[1].startTime-b[1].startTime);
-return new Map(nodeTimingEntries);
-}
-
-
-
-
-getOptions(){
-return this._options;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-simulate(graph,options){
-if(BaseNode.hasCycle(graph)){
-throw new Error('Cannot simulate graph with cycle');
-}
-
-options=Object.assign({
-label:undefined,
-flexibleOrdering:false},
-options);
-
-
-this._flexibleOrdering=!!options.flexibleOrdering;
-this._dns=new DNSCache({rtt:this._rtt});
-this._initializeConnectionPool(graph);
-this._initializeAuxiliaryData();
-
-const nodesNotReadyToStart=this._nodes[NodeState.NotReadyToStart];
-const nodesReadyToStart=this._nodes[NodeState.ReadyToStart];
-const nodesInProgress=this._nodes[NodeState.InProgress];
-
-const rootNode=graph.getRootNode();
-rootNode.traverse(node=>nodesNotReadyToStart.add(node));
-let totalElapsedTime=0;
-let iteration=0;
-
-
-this._markNodeAsReadyToStart(rootNode,totalElapsedTime);
-
-
-while(nodesReadyToStart.size||nodesInProgress.size){
-
-for(const node of this._getNodesSortedByStartTime()){
-this._startNodeIfPossible(node,totalElapsedTime);
-}
-
-if(!nodesInProgress.size){
-
-
-if(this._flexibleOrdering)throw new Error('Failed to start a node');
-this._flexibleOrdering=true;
-continue;
-}
-
-
-this._updateNetworkCapacity();
-
-
-const minimumTime=this._findNextNodeCompletionTime();
-totalElapsedTime+=minimumTime;
-
-
-if(!Number.isFinite(minimumTime)||iteration>100000){
-throw new Error('Graph creation failed, depth exceeded');
-}
-
-iteration++;
-
-for(const node of nodesInProgress){
-this._updateProgressMadeInTimePeriod(node,minimumTime,totalElapsedTime);
-}
-}
-
-const nodeTimings=this._computeFinalNodeTimings();
-ALL_SIMULATION_NODE_TIMINGS.set(options.label||'unlabeled',nodeTimings);
-
-return{
-timeInMs:totalElapsedTime,
-nodeTimings};
-
-}
-
-
-static get ALL_NODE_TIMINGS(){
-return ALL_SIMULATION_NODE_TIMINGS;
-}}
-
-
-module.exports=Simulator;
-
-
-
-
-
-
-
-
-
-
-
-
-},{"../../../config/constants.js":46,"../base-node.js":57,"./connection-pool.js":60,"./dns-cache.js":61,"./tcp-connection.js":64}],64:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const INITIAL_CONGESTION_WINDOW=10;
-const TCP_SEGMENT_SIZE=1460;
-
-class TcpConnection{
-
-
-
-
-
-
-
-constructor(rtt,throughput,serverLatency=0,ssl=true,h2=false){
-this._warmed=false;
-this._ssl=ssl;
-this._h2=h2;
-this._rtt=rtt;
-this._throughput=throughput;
-this._serverLatency=serverLatency;
-this._congestionWindow=INITIAL_CONGESTION_WINDOW;
-this._h2OverflowBytesDownloaded=0;
-}
-
-
-
-
-
-
-static maximumSaturatedConnections(rtt,availableThroughput){
-const roundTripsPerSecond=1000/rtt;
-const bytesPerRoundTrip=TCP_SEGMENT_SIZE;
-const bytesPerSecond=roundTripsPerSecond*bytesPerRoundTrip;
-const minimumThroughputRequiredPerRequest=bytesPerSecond*8;
-return Math.floor(availableThroughput/minimumThroughputRequiredPerRequest);
-}
-
-
-
-
-_computeMaximumCongestionWindowInSegments(){
-const bytesPerSecond=this._throughput/8;
-const secondsPerRoundTrip=this._rtt/1000;
-const bytesPerRoundTrip=bytesPerSecond*secondsPerRoundTrip;
-return Math.floor(bytesPerRoundTrip/TCP_SEGMENT_SIZE);
-}
-
-
-
-
-setThroughput(throughput){
-this._throughput=throughput;
-}
-
-
-
-
-setCongestionWindow(congestion){
-this._congestionWindow=congestion;
-}
-
-
-
-
-setWarmed(warmed){
-this._warmed=warmed;
-}
-
-
-
-
-isWarm(){
-return this._warmed;
-}
-
-
-
-
-isH2(){
-return this._h2;
-}
-
-
-
-
-get congestionWindow(){
-return this._congestionWindow;
-}
-
-
-
-
-
-
-setH2OverflowBytesDownloaded(bytes){
-if(!this._h2)return;
-this._h2OverflowBytesDownloaded=bytes;
-}
-
-
-
-
-clone(){
-return Object.assign(new TcpConnection(this._rtt,this._throughput),this);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-simulateDownloadUntil(bytesToDownload,options){
-const{timeAlreadyElapsed=0,maximumTimeToElapse=Infinity,dnsResolutionTime=0}=
-options||{};
-
-if(this._warmed&&this._h2){
-bytesToDownload-=this._h2OverflowBytesDownloaded;
-}
-const twoWayLatency=this._rtt;
-const oneWayLatency=twoWayLatency/2;
-const maximumCongestionWindow=this._computeMaximumCongestionWindowInSegments();
-
-let handshakeAndRequest=oneWayLatency;
-if(!this._warmed){
-handshakeAndRequest=
-
-dnsResolutionTime+
-
-oneWayLatency+
-
-oneWayLatency+
-
-oneWayLatency+(
-
-this._ssl?twoWayLatency:0);
-}
-
-let roundTrips=Math.ceil(handshakeAndRequest/twoWayLatency);
-let timeToFirstByte=handshakeAndRequest+this._serverLatency+oneWayLatency;
-if(this._warmed&&this._h2)timeToFirstByte=0;
-
-const timeElapsedForTTFB=Math.max(timeToFirstByte-timeAlreadyElapsed,0);
-const maximumDownloadTimeToElapse=maximumTimeToElapse-timeElapsedForTTFB;
-
-let congestionWindow=Math.min(this._congestionWindow,maximumCongestionWindow);
-let totalBytesDownloaded=0;
-if(timeElapsedForTTFB>0){
-totalBytesDownloaded=congestionWindow*TCP_SEGMENT_SIZE;
-}else{
-roundTrips=0;
-}
-
-let downloadTimeElapsed=0;
-let bytesRemaining=bytesToDownload-totalBytesDownloaded;
-while(bytesRemaining>0&&downloadTimeElapsed<=maximumDownloadTimeToElapse){
-roundTrips++;
-downloadTimeElapsed+=twoWayLatency;
-congestionWindow=Math.max(Math.min(maximumCongestionWindow,congestionWindow*2),1);
-
-const bytesDownloadedInWindow=congestionWindow*TCP_SEGMENT_SIZE;
-totalBytesDownloaded+=bytesDownloadedInWindow;
-bytesRemaining-=bytesDownloadedInWindow;
-}
-
-const timeElapsed=timeElapsedForTTFB+downloadTimeElapsed;
-const extraBytesDownloaded=this._h2?Math.max(totalBytesDownloaded-bytesToDownload,0):0;
-const bytesDownloaded=Math.max(Math.min(totalBytesDownloaded,bytesToDownload),0);
-
-return{
-roundTrips,
-timeElapsed,
-bytesDownloaded,
-extraBytesDownloaded,
-congestionWindow};
-
-}}
-
-
-module.exports=TcpConnection;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-},{}],65:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-
-const NEXUS5X_EMULATION_METRICS={
-mobile:true,
-screenWidth:412,
-screenHeight:660,
-width:412,
-height:660,
-positionX:0,
-positionY:0,
-scale:1,
-deviceScaleFactor:2.625,
-screenOrientation:{
-angle:0,
-type:'portraitPrimary'}};
-
-
-
-
-
-
-
-const DESKTOP_EMULATION_METRICS={
-mobile:false,
-width:1350,
-height:940,
-deviceScaleFactor:1};
-
-
-
-const NEXUS5X_USERAGENT='Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3694.0 Mobile Safari/537.36 Chrome-Lighthouse';
-
-const DESKTOP_USERAGENT='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3694.0 Safari/537.36 Chrome-Lighthouse';
-
-const OFFLINE_METRICS={
-offline:true,
-
-latency:0,
-downloadThroughput:0,
-uploadThroughput:0};
-
-
-const NO_THROTTLING_METRICS={
-latency:0,
-downloadThroughput:0,
-uploadThroughput:0,
-offline:false};
-
-
-const NO_CPU_THROTTLE_METRICS={
-rate:1};
-
-
-const emulationParams={
-mobile:{
-userAgent:NEXUS5X_USERAGENT,
-metrics:NEXUS5X_EMULATION_METRICS,
-touchEnabled:true},
-
-desktop:{
-userAgent:DESKTOP_USERAGENT,
-metrics:DESKTOP_EMULATION_METRICS,
-touchEnabled:false}};
-
-
-
-
-
-
-
-
-
-async function emulate(driver,settings){
-if(!settings.emulatedFormFactor||settings.emulatedFormFactor==='none')return;
-const params=emulationParams[settings.emulatedFormFactor];
-
-
-
-
-
-
-await driver.sendCommand('Network.enable');
-await driver.sendCommand('Network.setUserAgentOverride',{userAgent:params.userAgent});
-
-if(!settings.internalDisableDeviceScreenEmulation){
-await driver.sendCommand('Emulation.setDeviceMetricsOverride',params.metrics);
-await driver.sendCommand('Emulation.setTouchEmulationEnabled',{enabled:params.touchEnabled});
-}
-}
-
-
-
-
-
-
-
-function enableNetworkThrottling(driver,throttlingSettings){
-
-const conditions={
-offline:false,
-latency:throttlingSettings.requestLatencyMs||0,
-downloadThroughput:throttlingSettings.downloadThroughputKbps||0,
-uploadThroughput:throttlingSettings.uploadThroughputKbps||0};
-
-
-
-conditions.downloadThroughput=Math.floor(conditions.downloadThroughput*1024/8);
-conditions.uploadThroughput=Math.floor(conditions.uploadThroughput*1024/8);
-return driver.sendCommand('Network.emulateNetworkConditions',conditions);
-}
-
-
-
-
-
-function clearAllNetworkEmulation(driver){
-return driver.sendCommand('Network.emulateNetworkConditions',NO_THROTTLING_METRICS);
-}
-
-
-
-
-
-function goOffline(driver){
-return driver.sendCommand('Network.emulateNetworkConditions',OFFLINE_METRICS);
-}
-
-
-
-
-
-
-function enableCPUThrottling(driver,throttlingSettings){
-const rate=throttlingSettings.cpuSlowdownMultiplier;
-return driver.sendCommand('Emulation.setCPUThrottlingRate',{rate});
-}
-
-
-
-
-
-function disableCPUThrottling(driver){
-return driver.sendCommand('Emulation.setCPUThrottlingRate',NO_CPU_THROTTLE_METRICS);
-}
-
-module.exports={
-emulate,
-enableNetworkThrottling,
-clearAllNetworkEmulation,
-enableCPUThrottling,
-disableCPUThrottling,
-goOffline,
-MOBILE_USERAGENT:NEXUS5X_USERAGENT,
-DESKTOP_USERAGENT};
-
-
-},{}],66:[function(require,module,exports){
-(function(__filename,__dirname){
-
-
-
-
-
-'use strict';
-
-const path=require('path');
-const isDeepEqual=require('lodash.isequal');
-const log=require('lighthouse-logger');
-const MessageFormat=require('intl-messageformat').default;
-const lookupClosestLocale=require('lookup-closest-locale');
-const LOCALES=require('./locales.js');
-
-
-
-
-const LH_ROOT=path.join(__dirname,'../../../');
-const MESSAGE_INSTANCE_ID_REGEX=/(.* \| .*) # (\d+)$/;
-
-const MESSAGE_INSTANCE_ID_QUICK_REGEX=/ # \d+$/;
-
-(()=>{
-
-
-
-
-
-require('intl-pluralrules');
-
-
-const IntlPolyfill=require('intl');
-
-
-if(!IntlPolyfill.NumberFormat)return;
-
-
-const minimumLocales=['en','es','ru','zh'];
-const supportedLocales=Intl.NumberFormat.supportedLocalesOf(minimumLocales);
-
-if(supportedLocales.length!==minimumLocales.length){
-Intl.NumberFormat=IntlPolyfill.NumberFormat;
-Intl.DateTimeFormat=IntlPolyfill.DateTimeFormat;
-}
-})();
-
-
-const UIStrings={
-
-ms:'{timeInMs, number, milliseconds}\xa0ms',
-
-seconds:'{timeInMs, number, seconds}\xa0s',
-
-displayValueByteSavings:'Potential savings of {wastedBytes, number, bytes}\xa0KB',
-
-displayValueMsSavings:'Potential savings of {wastedMs, number, milliseconds}\xa0ms',
-
-columnURL:'URL',
-
-columnSize:'Size',
-
-columnCacheTTL:'Cache TTL',
-
-columnWastedBytes:'Potential Savings',
-
-columnWastedMs:'Potential Savings',
-
-columnTimeSpent:'Time Spent',
-
-columnLocation:'Location',
-
-columnResourceType:'Resource Type',
-
-columnRequests:'Requests',
-
-columnTransferSize:'Transfer Size',
-
-columnName:'Name',
-
-totalResourceType:'Total',
-
-documentResourceType:'Document',
-
-scriptResourceType:'Script',
-
-stylesheetResourceType:'Stylesheet',
-
-imageResourceType:'Image',
-
-mediaResourceType:'Media',
-
-fontResourceType:'Font',
-
-otherResourceType:'Other',
-
-thirdPartyResourceType:'Third-party'};
-
-
-const formats={
-number:{
-bytes:{
-maximumFractionDigits:0},
-
-milliseconds:{
-maximumFractionDigits:0},
-
-seconds:{
-
-minimumFractionDigits:1,
-maximumFractionDigits:1},
-
-extendedPercent:{
-
-maximumFractionDigits:2,
-style:'percent'}}};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function lookupLocale(locale){
-
-const canonicalLocale=Intl.getCanonicalLocales(locale)[0];
-
-const closestLocale=lookupClosestLocale(canonicalLocale,LOCALES);
-return closestLocale||'en';
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function collectAllCustomElementsFromICU(icuElements,seenElementsById=new Map()){
-for(const el of icuElements){
-
-if(el.type!=='argumentElement')continue;
-
-seenElementsById.set(el.id,el);
-
-
-if(!el.format||el.format.type!=='pluralFormat')continue;
-
-for(const option of el.format.options){
-
-collectAllCustomElementsFromICU(option.value.elements,seenElementsById);
-}
-}
-
-return seenElementsById;
-}
-
-
-
-
-
-
-
-
-
-
-function _preformatValues(icuMessage,messageFormatter,values){
-const elementMap=collectAllCustomElementsFromICU(messageFormatter.getAst().elements);
-const argumentElements=[...elementMap.values()];
-
-
-const formattedValues={};
-
-for(const{id,format}of argumentElements){
-
-if(id&&id in values===false){
-throw new Error(`ICU Message "${icuMessage}" contains a value reference ("${id}") `+
-`that wasn't provided`);
-}
-
-const value=values[id];
-
-
-if(!format||format.type!=='numberFormat'){
-formattedValues[id]=value;
-continue;
-}
-
-if(typeof value!=='number'){
-throw new Error(`ICU Message "${icuMessage}" contains a numeric reference ("${id}") `+
-'but provided value was not a number');
-}
-
-
-if(format.style==='milliseconds'){
-
-formattedValues[id]=Math.round(value/10)*10;
-}else if(format.style==='seconds'&&id==='timeInMs'){
-
-formattedValues[id]=Math.round(value/100)/10;
-}else if(format.style==='bytes'){
-
-formattedValues[id]=value/1024;
-}else{
-
-formattedValues[id]=value;
-}
-}
-
-
-for(const valueId of Object.keys(values)){
-if(valueId in formattedValues)continue;
-
-
-if(valueId==='errorCode'){
-formattedValues.errorCode=values.errorCode;
-continue;
-}
-
-throw new Error(`Provided value "${valueId}" does not match any placeholder in `+
-`ICU message "${icuMessage}"`);
-}
-
-return formattedValues;
-}
-
-
-
-
-
-
-
-
-
-const _icuMessageInstanceMap=new Map();
-
-const _ICUMsgNotFoundMsg='ICU message not found in destination locale';
-
-
-
-
-
-
-
-
-function _formatIcuMessage(locale,icuMessageId,uiStringMessage,values={}){
-const localeMessages=LOCALES[locale];
-if(!localeMessages)throw new Error(`Unsupported locale '${locale}'`);
-let localeMessage=localeMessages[icuMessageId]&&localeMessages[icuMessageId].message;
-
-
-
-if(!localeMessage&&uiStringMessage){
-
-localeMessage=uiStringMessage;
-
-
-if(!LOCALES.en[icuMessageId]||localeMessage!==LOCALES.en[icuMessageId].message){
-log.verbose('i18n',`Message "${icuMessageId}" does not match its 'en' counterpart. `+
-`Run 'i18n' to update.`);
-}
-}
-
-if(!localeMessage){
-throw new Error(_ICUMsgNotFoundMsg);
-}
-
-
-const localeForMessageFormat=locale==='en-XA'||locale==='en-XL'?'de-DE':locale;
-
-const formatter=new MessageFormat(localeMessage,localeForMessageFormat,formats);
-
-
-const valuesForMessageFormat=_preformatValues(localeMessage,formatter,values);
-
-const formattedString=formatter.format(valuesForMessageFormat);
-return{formattedString,icuMessage:localeMessage};
-}
-
-
-function _formatPathAsString(pathInLHR){
-let pathAsString='';
-for(const property of pathInLHR){
-if(/^[a-z]+$/i.test(property)){
-if(pathAsString.length)pathAsString+='.';
-pathAsString+=property;
-}else{
-if(/]|"|'|\s/.test(property))throw new Error(`Cannot handle "${property}" in i18n`);
-pathAsString+=`[${property}]`;
-}
-}
-
-return pathAsString;
-}
-
-
-
-
-
-function getRendererFormattedStrings(locale){
-const localeMessages=LOCALES[locale];
-if(!localeMessages)throw new Error(`Unsupported locale '${locale}'`);
-
-const icuMessageIds=Object.keys(localeMessages).filter(f=>f.includes('core/report/html/'));
-
-const strings={};
-for(const icuMessageId of icuMessageIds){
-const[filename,varName]=icuMessageId.split(' | ');
-if(!filename.endsWith('util.js'))throw new Error(`Unexpected message: ${icuMessageId}`);
-strings[varName]=localeMessages[icuMessageId].message;
-}
-
-return strings;
-}
-
-
-
-
-
-
-
-
-function createMessageInstanceIdFn(filename,fileStrings){
-
-const mergedStrings={...UIStrings,...fileStrings};
-
-
-
-
-
-
-
-
-const getMessageInstanceIdFn=(icuMessage,values)=>{
-const keyname=Object.keys(mergedStrings).find(key=>mergedStrings[key]===icuMessage);
-if(!keyname)throw new Error(`Could not locate: ${icuMessage}`);
-
-const filenameToLookup=keyname in fileStrings?filename:__filename;
-const unixStyleFilename=path.relative(LH_ROOT,filenameToLookup).replace(/\\/g,'/');
-const icuMessageId=`${unixStyleFilename} | ${keyname}`;
-const icuMessageInstances=_icuMessageInstanceMap.get(icuMessageId)||[];
-
-let indexOfInstance=icuMessageInstances.findIndex(inst=>isDeepEqual(inst.values,values));
-if(indexOfInstance===-1){
-icuMessageInstances.push({icuMessageId,icuMessage,values});
-indexOfInstance=icuMessageInstances.length-1;
-}
-
-_icuMessageInstanceMap.set(icuMessageId,icuMessageInstances);
-
-return`${icuMessageId} # ${indexOfInstance}`;
-};
-
-return getMessageInstanceIdFn;
-}
-
-
-
-
-
-
-function isIcuMessage(icuMessageIdOrRawString){
-return MESSAGE_INSTANCE_ID_QUICK_REGEX.test(icuMessageIdOrRawString)&&
-MESSAGE_INSTANCE_ID_REGEX.test(icuMessageIdOrRawString);
-}
-
-
-
-
-
-
-function getFormatted(icuMessageIdOrRawString,locale){
-if(isIcuMessage(icuMessageIdOrRawString)){
-return _resolveIcuMessageInstanceId(icuMessageIdOrRawString,locale).formattedString;
-}
-
-return icuMessageIdOrRawString;
-}
-
-
-
-
-
-
-
-function getFormattedFromIdAndValues(locale,icuMessageId,values){
-const icuMessageIdRegex=/(.* \| .*)$/;
-if(!icuMessageIdRegex.test(icuMessageId))throw new Error('This is not an ICU message ID');
-
-const{formattedString}=_formatIcuMessage(locale,icuMessageId,undefined,values);
-return formattedString;
-}
-
-
-
-
-
-
-function _resolveIcuMessageInstanceId(icuMessageInstanceId,locale){
-const matches=icuMessageInstanceId.match(MESSAGE_INSTANCE_ID_REGEX);
-if(!matches)throw new Error(`${icuMessageInstanceId} is not a valid message instance ID`);
-
-const[_,icuMessageId,icuMessageInstanceIndex]=matches;
-const icuMessageInstances=_icuMessageInstanceMap.get(icuMessageId)||[];
-const icuMessageInstance=icuMessageInstances[Number(icuMessageInstanceIndex)];
-
-const{formattedString}=_formatIcuMessage(locale,icuMessageId,
-icuMessageInstance.icuMessage,icuMessageInstance.values);
-
-return{icuMessageInstance,formattedString};
-}
-
-
-
-
-
-
-
-
-
-function replaceIcuMessageInstanceIds(inputObject,locale){
-
-
-
-
-
-function replaceInObject(subObject,icuMessagePaths,pathInLHR=[]){
-if(typeof subObject!=='object'||!subObject)return;
-
-for(const[property,value]of Object.entries(subObject)){
-const currentPathInLHR=pathInLHR.concat([property]);
-
-
-if(typeof value==='string'&&isIcuMessage(value)){
-const{icuMessageInstance,formattedString}=_resolveIcuMessageInstanceId(value,locale);
-const messageInstancesInLHR=icuMessagePaths[icuMessageInstance.icuMessageId]||[];
-const currentPathAsString=_formatPathAsString(currentPathInLHR);
-
-messageInstancesInLHR.push(
-icuMessageInstance.values?
-{values:icuMessageInstance.values,path:currentPathAsString}:
-currentPathAsString);
-
-
-subObject[property]=formattedString;
-icuMessagePaths[icuMessageInstance.icuMessageId]=messageInstancesInLHR;
-}else{
-replaceInObject(value,icuMessagePaths,currentPathInLHR);
-}
-}
-}
-
-
-const icuMessagePaths={};
-replaceInObject(inputObject,icuMessagePaths);
-return icuMessagePaths;
-}
-
-
-
-
-
-
-
-
-
-
-function registerLocaleData(locale,lhlMessages){
-LOCALES[locale]=lhlMessages;
-}
-
-module.exports={
-_formatPathAsString,
-_ICUMsgNotFoundMsg,
-UIStrings,
-lookupLocale,
-getRendererFormattedStrings,
-createMessageInstanceIdFn,
-getFormatted,
-getFormattedFromIdAndValues,
-replaceIcuMessageInstanceIds,
-isIcuMessage,
-collectAllCustomElementsFromICU,
-registerLocaleData};
-
-
-}).call(this,"/lighthouse-core/lib/i18n/i18n.js","/lighthouse-core/lib/i18n");
-},{"./locales.js":67,"intl":101,"intl-messageformat":119,"intl-pluralrules":101,"lighthouse-logger":125,"lodash.isequal":142,"lookup-closest-locale":143,"path":156}],67:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const locales={
-'en-US':require('./locales/en-US.json'),
-'en':require('./locales/en-US.json'),
-
-
-'en-AU':require('./locales/en-GB.json'),
-'en-GB':require('./locales/en-GB.json'),
-'en-IE':require('./locales/en-GB.json'),
-'en-SG':require('./locales/en-GB.json'),
-'en-ZA':require('./locales/en-GB.json'),
-'en-IN':require('./locales/en-GB.json'),
-
-
-'ar-XB':require('./locales/ar-XB.json'),
-'ar':require('./locales/ar.json'),
-'bg':require('./locales/bg.json'),
-'bs':require('./locales/hr.json'),
-'ca':require('./locales/ca.json'),
-'cs':require('./locales/cs.json'),
-'da':require('./locales/da.json'),
-'de':require('./locales/de.json'),
-'el':require('./locales/el.json'),
-'en-XA':require('./locales/en-XA.json'),
-'en-XL':require('./locales/en-XL.json'),
-'es':require('./locales/es.json'),
-'es-419':require('./locales/es-419.json'),
-
-'es-AR':require('./locales/es-419.json'),
-'es-BO':require('./locales/es-419.json'),
-'es-BR':require('./locales/es-419.json'),
-'es-BZ':require('./locales/es-419.json'),
-'es-CL':require('./locales/es-419.json'),
-'es-CO':require('./locales/es-419.json'),
-'es-CR':require('./locales/es-419.json'),
-'es-CU':require('./locales/es-419.json'),
-'es-DO':require('./locales/es-419.json'),
-'es-EC':require('./locales/es-419.json'),
-'es-GT':require('./locales/es-419.json'),
-'es-HN':require('./locales/es-419.json'),
-'es-MX':require('./locales/es-419.json'),
-'es-NI':require('./locales/es-419.json'),
-'es-PA':require('./locales/es-419.json'),
-'es-PE':require('./locales/es-419.json'),
-'es-PR':require('./locales/es-419.json'),
-'es-PY':require('./locales/es-419.json'),
-'es-SV':require('./locales/es-419.json'),
-'es-US':require('./locales/es-419.json'),
-'es-UY':require('./locales/es-419.json'),
-'es-VE':require('./locales/es-419.json'),
-
-'fi':require('./locales/fi.json'),
-'fil':require('./locales/fil.json'),
-'fr':require('./locales/fr.json'),
-'he':require('./locales/he.json'),
-'hi':require('./locales/hi.json'),
-'hr':require('./locales/hr.json'),
-'hu':require('./locales/hu.json'),
-'gsw':require('./locales/de.json'),
-'id':require('./locales/id.json'),
-'in':require('./locales/id.json'),
-'it':require('./locales/it.json'),
-'iw':require('./locales/he.json'),
-'ja':require('./locales/ja.json'),
-'ko':require('./locales/ko.json'),
-'ln':require('./locales/fr.json'),
-'lt':require('./locales/lt.json'),
-'lv':require('./locales/lv.json'),
-'mo':require('./locales/ro.json'),
-'nl':require('./locales/nl.json'),
-'nb':require('./locales/no.json'),
-'no':require('./locales/no.json'),
-'pl':require('./locales/pl.json'),
-'pt':require('./locales/pt.json'),
-'pt-PT':require('./locales/pt-PT.json'),
-'ro':require('./locales/ro.json'),
-'ru':require('./locales/ru.json'),
-'sk':require('./locales/sk.json'),
-'sl':require('./locales/sl.json'),
-'sr':require('./locales/sr.json'),
-'sr-Latn':require('./locales/sr-Latn.json'),
-'sv':require('./locales/sv.json'),
-'ta':require('./locales/ta.json'),
-'te':require('./locales/te.json'),
-'th':require('./locales/th.json'),
-'tl':require('./locales/fil.json'),
-'tr':require('./locales/tr.json'),
-'uk':require('./locales/uk.json'),
-'vi':require('./locales/vi.json'),
-'zh':require('./locales/zh.json'),
-'zh-HK':require('./locales/zh-HK.json'),
-'zh-TW':require('./locales/zh-TW.json')};
-
-
-module.exports=locales;
-
-},{"./locales/ar-XB.json":101,"./locales/ar.json":101,"./locales/bg.json":101,"./locales/ca.json":101,"./locales/cs.json":101,"./locales/da.json":101,"./locales/de.json":101,"./locales/el.json":101,"./locales/en-GB.json":101,"./locales/en-US.json":101,"./locales/en-XA.json":101,"./locales/en-XL.json":101,"./locales/es-419.json":101,"./locales/es.json":101,"./locales/fi.json":101,"./locales/fil.json":101,"./locales/fr.json":101,"./locales/he.json":101,"./locales/hi.json":101,"./locales/hr.json":101,"./locales/hu.json":101,"./locales/id.json":101,"./locales/it.json":101,"./locales/ja.json":101,"./locales/ko.json":101,"./locales/lt.json":101,"./locales/lv.json":101,"./locales/nl.json":101,"./locales/no.json":101,"./locales/pl.json":101,"./locales/pt-PT.json":101,"./locales/pt.json":101,"./locales/ro.json":101,"./locales/ru.json":101,"./locales/sk.json":101,"./locales/sl.json":101,"./locales/sr-Latn.json":101,"./locales/sr.json":101,"./locales/sv.json":101,"./locales/ta.json":101,"./locales/te.json":101,"./locales/th.json":101,"./locales/tr.json":101,"./locales/uk.json":101,"./locales/vi.json":101,"./locales/zh-HK.json":101,"./locales/zh-TW.json":101,"./locales/zh.json":101}],68:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const URL=require('./url-shim.js');
-
-
-
-
-
-function doExist(manifest){
-if(!manifest||!manifest.icons){
-return false;
-}
-if(manifest.icons.value.length===0){
-return false;
-}
-return true;
-}
-
-
-
-
-
-
-function pngSizedAtLeast(sizeRequirement,manifest){
-
-
-const iconValues=manifest.icons.value;
-
-const flattenedSizes=[];
-iconValues.
-filter(icon=>{
-const typeHint=icon.value.type.value;
-if(typeHint){
-
-return typeHint==='image/png';
-}
-
-const src=icon.value.src.value;
-return src&&new URL(src).pathname.endsWith('.png');
-}).
-forEach(icon=>{
-
-if(icon.value.sizes.value){
-flattenedSizes.push(...icon.value.sizes.value);
-}
-});
-
-return flattenedSizes.
-
-filter(size=>/\d+x\d+/.test(size)).
-filter(size=>{
-
-const sizeStrs=size.split(/x/i);
-
-const sizeNums=[parseFloat(sizeStrs[0]),parseFloat(sizeStrs[1])];
-
-const areIconsBigEnough=sizeNums[0]>=sizeRequirement&&sizeNums[1]>=sizeRequirement;
-
-const areIconsSquare=sizeNums[0]===sizeNums[1];
-return areIconsBigEnough&&areIconsSquare;
-});
-}
-
-module.exports={
-doExist,
-pngSizedAtLeast};
-
-
-},{"./url-shim.js":"url"}],69:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-function convertNodeTimingsToTrace(nodeTimings){
-
-const traceEvents=[];
-const baseTs=1e9;
-const baseEvent={pid:1,tid:1,cat:'devtools.timeline'};
-const frame='A00001';
-
-const toMicroseconds=ms=>baseTs+ms*1000;
-
-traceEvents.push(createFakeTracingStartedEvent());
-traceEvents.push({...createFakeTracingStartedEvent(),name:'TracingStartedInBrowser'});
-
-
-let requestId=1;
-let lastEventEndTime=0;
-for(const[node,timing]of nodeTimings.entries()){
-lastEventEndTime=Math.max(lastEventEndTime,timing.endTime);
-if(node.type==='cpu'){
-
-const cpuNode=node;
-traceEvents.push(...createFakeTaskEvents(cpuNode,timing));
-}else{
-const networkNode=node;
-
-if(/^data/.test(networkNode.record.url))continue;
-traceEvents.push(...createFakeNetworkEvents(networkNode.record,timing));
-}
-}
-
-
-traceEvents.push(
-...createFakeTaskEvents(
-
-{childEvents:[],event:{}},
-{
-startTime:lastEventEndTime+1000,
-endTime:lastEventEndTime+1001}));
-
-
-
-
-return{traceEvents};
-
-
-
-
-function createFakeTracingStartedEvent(){
-const argsData={
-frameTreeNodeId:1,
-sessionId:'1.1',
-page:frame,
-persistentIds:true,
-frames:[{frame,url:'about:blank',name:'',processId:1}]};
-
-
-return{
-...baseEvent,
-ts:baseTs-1e5,
-ph:'I',
-s:'t',
-cat:'disabled-by-default-devtools.timeline',
-name:'TracingStartedInPage',
-args:{data:argsData},
-dur:0};
-
-}
-
-
-
-
-
-
-function createFakeTaskEvents(cpuNode,timing){
-const argsData={
-url:'',
-frame,
-lineNumber:0,
-columnNumber:0};
-
-
-const eventTs=toMicroseconds(timing.startTime);
-
-
-const events=[
-{
-...baseEvent,
-ph:'X',
-name:'Task',
-ts:eventTs,
-dur:(timing.endTime-timing.startTime)*1000,
-args:{data:argsData}}];
-
-
-
-const nestedBaseTs=cpuNode.event.ts||0;
-const multiplier=(timing.endTime-timing.startTime)*1000/cpuNode.event.dur;
-
-const netReqEvents=new Set(['ResourceSendRequest','ResourceFinish',
-'ResourceReceiveResponse','ResourceReceivedData']);
-for(const event of cpuNode.childEvents){
-if(netReqEvents.has(event.name))continue;
-const ts=eventTs+(event.ts-nestedBaseTs)*multiplier;
-const newEvent={...event,...{pid:baseEvent.pid,tid:baseEvent.tid},ts};
-if(event.dur)newEvent.dur=event.dur*multiplier;
-events.push(newEvent);
-}
-
-return events;
-}
-
-
-
-
-
-
-function createFakeNetworkEvents(record,timing){
-requestId++;
-
-
-
-let{startTime,endTime}=timing;
-if(startTime===endTime)endTime+=0.3;
-
-const requestData={requestId:requestId.toString(),frame};
-
-const baseRequestEvent={...baseEvent,ph:'I',s:'t',dur:0};
-
-const sendRequestData={
-...requestData,
-requestMethod:record.requestMethod,
-url:record.url,
-priority:record.priority};
-
-
-const receiveResponseData={
-...requestData,
-statusCode:record.statusCode,
-mimeType:record.mimeType,
-encodedDataLength:record.transferSize,
-fromCache:record.fromDiskCache,
-fromServiceWorker:record.fetchedViaServiceWorker};
-
-
-const resourceFinishData={
-...requestData,
-decodedBodyLength:record.resourceSize,
-didFail:!!record.failed,
-finishTime:endTime};
-
-
-
-const events=[
-{
-...baseRequestEvent,
-name:'ResourceSendRequest',
-ts:toMicroseconds(startTime),
-args:{data:sendRequestData}},
-
-{
-...baseRequestEvent,
-name:'ResourceFinish',
-ts:toMicroseconds(endTime),
-args:{data:resourceFinishData}}];
-
-
-
-if(!record.failed){
-events.push({
-...baseRequestEvent,
-name:'ResourceReceiveResponse',
-ts:toMicroseconds((startTime+endTime)/2),
-args:{data:receiveResponseData}});
-
-}
-
-return events;
-}
-}
-
-module.exports={
-simulationNamesToIgnore:[
-'unlabeled',
-
-'optimisticFirstCPUIdle',
-'optimisticFlexFirstCPUIdle',
-'pessimisticFirstCPUIdle',
-'optimisticSpeedIndex',
-'optimisticFlexSpeedIndex',
-'pessimisticSpeedIndex',
-'optimisticEstimatedInputLatency',
-'optimisticFlexEstimatedInputLatency',
-'pessimisticEstimatedInputLatency'],
-
-convertNodeTimingsToTrace};
-
-
-},{}],70:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const Driver=require('../gather/driver.js');
-
-class LHElement{
-
-
-
-
-constructor(element,driver){
-if(!element||!driver){
-throw Error('Driver and element required to create Element');
-}
-this.driver=driver;
-this.element=element;
-}
-
-
-
-
-
-getAttribute(name){
-return this.driver.
-sendCommand('DOM.getAttributes',{
-nodeId:this.element.nodeId}).
-
-
-
-
-then(resp=>{
-const attrIndex=resp.attributes.indexOf(name);
-if(attrIndex===-1){
-return null;
-}
-
-return resp.attributes[attrIndex+1];
-});
-}
-
-
-
-
-getNodeId(){
-return this.element.nodeId;
-}
-
-
-
-
-
-getProperty(propName){
-return this.driver.
-sendCommand('DOM.resolveNode',{
-nodeId:this.element.nodeId}).
-
-then(resp=>{
-if(!resp.object.objectId){
-return null;
-}
-return this.driver.getObjectProperty(resp.object.objectId,propName);
-}).
-catch(()=>null);
-}}
-
-
-module.exports=LHElement;
-
-},{"../gather/driver.js":51}],71:[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-'use strict';
-
-const i18n=require('./i18n/i18n.js');
-
-
-const UIStrings={
-
-
-
-
-didntCollectScreenshots:`Chrome didn't collect any screenshots during the page load. Please make sure there is content visible on the page, and then try re-running Lighthouse. ({errorCode})`,
-
-
-
-
-badTraceRecording:'Something went wrong with recording the trace over your page load. Please run Lighthouse again. ({errorCode})',
-
-
-
-
-pageLoadTookTooLong:'Your page took too long to load. Please follow the opportunities in the report to reduce your page load time, and then try re-running Lighthouse. ({errorCode})',
-
-pageLoadFailed:'Lighthouse was unable to reliably load the page you requested. Make sure you are testing the correct URL and that the server is properly responding to all requests.',
-
-
-
-
-pageLoadFailedWithStatusCode:'Lighthouse was unable to reliably load the page you requested. Make sure you are testing the correct URL and that the server is properly responding to all requests. (Status code: {statusCode})',
-
-
-
-
-pageLoadFailedWithDetails:'Lighthouse was unable to reliably load the page you requested. Make sure you are testing the correct URL and that the server is properly responding to all requests. (Details: {errorDetails})',
-
-
-
-
-pageLoadFailedInsecure:'The URL you have provided does not have a valid security certificate. {securityMessages}',
-
-pageLoadFailedInterstitial:'Chrome prevented page load with an interstitial. Make sure you are testing the correct URL and that the server is properly responding to all requests.',
-
-internalChromeError:'An internal Chrome error occurred. Please restart Chrome and try re-running Lighthouse.',
-
-requestContentTimeout:'Fetching resource content has exceeded the allotted time',
-
-urlInvalid:'The URL you have provided appears to be invalid.',
-
-
-
-
-protocolTimeout:'Waiting for DevTools protocol response has exceeded the allotted time. (Method: {protocolMethod})',
-
-dnsFailure:'DNS servers could not resolve the provided domain.',
-
-pageLoadFailedHung:'Lighthouse was unable to reliably load the URL you requested because the page stopped responding.',
-
-criTimeout:'Timeout waiting for initial Debugger Protocol connection.',
-
-
-
-
-missingRequiredArtifact:'Required {artifactName} gatherer did not run.',
-
-
-
-
-
-erroredRequiredArtifact:'Required {artifactName} gatherer encountered an error: {errorMessage}'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-
-
-
-
-
-const LHERROR_SENTINEL='__LighthouseErrorSentinel';
-const ERROR_SENTINEL='__ErrorSentinel';
-
-
-
-
-
-class LighthouseError extends Error{
-
-
-
-
-constructor(errorDefinition,properties){
-super(errorDefinition.code);
-this.name='LHError';
-this.code=errorDefinition.code;
-
-
-this.friendlyMessage=str_(errorDefinition.message,{errorCode:this.code,...properties});
-this.lhrRuntimeError=!!errorDefinition.lhrRuntimeError;
-if(properties)Object.assign(this,properties);
-
-Error.captureStackTrace(this,LighthouseError);
-}
-
-
-
-
-
-
-static fromProtocolMessage(method,protocolError){
-
-const protocolErrors=Object.values(LighthouseError.errors).filter(e=>e.pattern);
-
-const matchedErrorDefinition=protocolErrors.find(e=>e.pattern.test(protocolError.message));
-if(matchedErrorDefinition){
-return new LighthouseError(matchedErrorDefinition);
-}
-
-
-let errMsg=`(${method}): ${protocolError.message}`;
-if(protocolError.data)errMsg+=` (${protocolError.data})`;
-const error=new Error(`Protocol error ${errMsg}`);
-return Object.assign(error,{protocolMethod:method,protocolError:protocolError.message});
-}
-
-
-
-
-
-
-
-
-
-static stringifyReplacer(err){
-if(err instanceof LighthouseError){
-
-
-const{name,code,message,friendlyMessage,lhrRuntimeError,stack,...properties}=err;
-
-return{
-sentinel:LHERROR_SENTINEL,
-code,
-stack,
-...properties};
-
-}
-
-
-if(err instanceof Error){
-const{message,stack}=err;
-
-const code=err.code;
-return{
-sentinel:ERROR_SENTINEL,
-message,
-code,
-stack};
-
-}
-
-throw new Error('Invalid value for LHError stringification');
-}
-
-
-
-
-
-
-
-
-
-
-static parseReviver(key,possibleError){
-if(typeof possibleError==='object'&&possibleError!==null){
-if(possibleError.sentinel===LHERROR_SENTINEL){
-
-
-const{sentinel,code,stack,...properties}=possibleError;
-const errorDefinition=LighthouseError.errors[code];
-const lhError=new LighthouseError(errorDefinition,properties);
-lhError.stack=stack;
-
-return lhError;
-}
-
-if(possibleError.sentinel===ERROR_SENTINEL){
-const{message,code,stack}=possibleError;
-const error=new Error(message);
-Object.assign(error,{code,stack});
-return error;
-}
-}
-
-return possibleError;
-}}
-
-
-const ERRORS={
-
-NO_SPEEDLINE_FRAMES:{
-code:'NO_SPEEDLINE_FRAMES',
-message:UIStrings.didntCollectScreenshots,
-lhrRuntimeError:true},
-
-SPEEDINDEX_OF_ZERO:{
-code:'SPEEDINDEX_OF_ZERO',
-message:UIStrings.didntCollectScreenshots,
-lhrRuntimeError:true},
-
-NO_SCREENSHOTS:{
-code:'NO_SCREENSHOTS',
-message:UIStrings.didntCollectScreenshots,
-lhrRuntimeError:true},
-
-INVALID_SPEEDLINE:{
-code:'INVALID_SPEEDLINE',
-message:UIStrings.didntCollectScreenshots,
-lhrRuntimeError:true},
-
-
-
-NO_TRACING_STARTED:{
-code:'NO_TRACING_STARTED',
-message:UIStrings.badTraceRecording,
-lhrRuntimeError:true},
-
-NO_NAVSTART:{
-code:'NO_NAVSTART',
-message:UIStrings.badTraceRecording,
-lhrRuntimeError:true},
-
-NO_FCP:{
-code:'NO_FCP',
-message:UIStrings.badTraceRecording,
-lhrRuntimeError:true},
-
-NO_DCL:{
-code:'NO_DCL',
-message:UIStrings.badTraceRecording,
-lhrRuntimeError:true},
-
-NO_FMP:{
-code:'NO_FMP',
-message:UIStrings.badTraceRecording},
-
-NO_LCP:{
-code:'NO_LCP',
-message:UIStrings.badTraceRecording},
-
-
-
-FMP_TOO_LATE_FOR_FCPUI:{code:'FMP_TOO_LATE_FOR_FCPUI',message:UIStrings.pageLoadTookTooLong},
-NO_FCPUI_IDLE_PERIOD:{code:'NO_FCPUI_IDLE_PERIOD',message:UIStrings.pageLoadTookTooLong},
-NO_TTI_CPU_IDLE_PERIOD:{code:'NO_TTI_CPU_IDLE_PERIOD',message:UIStrings.pageLoadTookTooLong},
-NO_TTI_NETWORK_IDLE_PERIOD:{
-code:'NO_TTI_NETWORK_IDLE_PERIOD',
-message:UIStrings.pageLoadTookTooLong},
-
-
-
-NO_DOCUMENT_REQUEST:{
-code:'NO_DOCUMENT_REQUEST',
-message:UIStrings.pageLoadFailed,
-lhrRuntimeError:true},
-
-
-
-
-FAILED_DOCUMENT_REQUEST:{
-code:'FAILED_DOCUMENT_REQUEST',
-message:UIStrings.pageLoadFailedWithDetails,
-lhrRuntimeError:true},
-
-
-
-
-ERRORED_DOCUMENT_REQUEST:{
-code:'ERRORED_DOCUMENT_REQUEST',
-message:UIStrings.pageLoadFailedWithStatusCode,
-lhrRuntimeError:true},
-
-
-
-
-INSECURE_DOCUMENT_REQUEST:{
-code:'INSECURE_DOCUMENT_REQUEST',
-message:UIStrings.pageLoadFailedInsecure,
-lhrRuntimeError:true},
-
-
-
-CHROME_INTERSTITIAL_ERROR:{
-code:'CHROME_INTERSTITIAL_ERROR',
-message:UIStrings.pageLoadFailedInterstitial,
-lhrRuntimeError:true},
-
-
-PAGE_HUNG:{
-code:'PAGE_HUNG',
-message:UIStrings.pageLoadFailedHung,
-lhrRuntimeError:true},
-
-
-
-TRACING_ALREADY_STARTED:{
-code:'TRACING_ALREADY_STARTED',
-message:UIStrings.internalChromeError,
-pattern:/Tracing.*started/,
-lhrRuntimeError:true},
-
-PARSING_PROBLEM:{
-code:'PARSING_PROBLEM',
-message:UIStrings.internalChromeError,
-pattern:/Parsing problem/,
-lhrRuntimeError:true},
-
-READ_FAILED:{
-code:'READ_FAILED',
-message:UIStrings.internalChromeError,
-pattern:/Read failed/,
-lhrRuntimeError:true},
-
-
-
-INVALID_URL:{
-code:'INVALID_URL',
-message:UIStrings.urlInvalid},
-
-
-
-
-
-PROTOCOL_TIMEOUT:{
-code:'PROTOCOL_TIMEOUT',
-message:UIStrings.protocolTimeout,
-lhrRuntimeError:true},
-
-
-
-DNS_FAILURE:{
-code:'DNS_FAILURE',
-message:UIStrings.dnsFailure,
-lhrRuntimeError:true},
-
-
-
-CRI_TIMEOUT:{
-code:'CRI_TIMEOUT',
-message:UIStrings.criTimeout,
-lhrRuntimeError:true},
-
-
-
-
-
-
-MISSING_REQUIRED_ARTIFACT:{
-code:'MISSING_REQUIRED_ARTIFACT',
-message:UIStrings.missingRequiredArtifact},
-
-
-
-
-
-
-ERRORED_REQUIRED_ARTIFACT:{
-code:'ERRORED_REQUIRED_ARTIFACT',
-message:UIStrings.erroredRequiredArtifact}};
-
-
-
-
-
-
-LighthouseError.errors=ERRORS;
-LighthouseError.NO_ERROR='NO_ERROR';
-LighthouseError.UNKNOWN_ERROR='UNKNOWN_ERROR';
-module.exports=LighthouseError;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/lighthouse-core/lib/lh-error.js");
-},{"./i18n/i18n.js":66}],72:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const URL=require('./url-shim.js');
-const cssParsers=require('cssstyle/lib/parsers');
-
-const ALLOWED_DISPLAY_VALUES=[
-'fullscreen',
-'standalone',
-'minimal-ui',
-'browser'];
-
-
-
-
-
-const DEFAULT_DISPLAY_MODE='browser';
-
-const ALLOWED_ORIENTATION_VALUES=[
-'any',
-'natural',
-'landscape',
-'portrait',
-'portrait-primary',
-'portrait-secondary',
-'landscape-primary',
-'landscape-secondary'];
-
-
-
-
-
-
-function isValidColor(color){
-return cssParsers.valueType(color)===cssParsers.TYPES.COLOR;
-}
-
-
-
-
-
-function parseString(raw,trim){
-let value;
-let warning;
-
-if(typeof raw==='string'){
-value=trim?raw.trim():raw;
-}else{
-if(raw!==undefined){
-warning='ERROR: expected a string.';
-}
-value=undefined;
-}
-
-return{
-raw,
-value,
-warning};
-
-}
-
-
-
-
-function parseColor(raw){
-const color=parseString(raw);
-
-
-if(color.value===undefined){
-return color;
-}
-
-
-if(!isValidColor(color.raw)){
-color.value=undefined;
-color.warning='ERROR: color parsing failed.';
-}
-
-return color;
-}
-
-
-
-
-function parseName(jsonInput){
-return parseString(jsonInput.name,true);
-}
-
-
-
-
-function parseShortName(jsonInput){
-return parseString(jsonInput.short_name,true);
-}
-
-
-
-
-
-
-
-function checkSameOrigin(url1,url2){
-const parsed1=new URL(url1);
-const parsed2=new URL(url2);
-
-return parsed1.origin===parsed2.origin;
-}
-
-
-
-
-
-
-
-
-function parseStartUrl(jsonInput,manifestUrl,documentUrl){
-const raw=jsonInput.start_url;
-
-
-if(raw===''){
-return{
-raw,
-value:documentUrl,
-warning:'ERROR: start_url string empty'};
-
-}
-if(raw===undefined){
-return{
-raw,
-value:documentUrl};
-
-}
-if(typeof raw!=='string'){
-return{
-raw,
-value:documentUrl,
-warning:'ERROR: expected a string.'};
-
-}
-
-
-let startUrl;
-try{
-startUrl=new URL(raw,manifestUrl).href;
-}catch(e){
-
-return{
-raw,
-value:documentUrl,
-warning:`ERROR: invalid start_url relative to ${manifestUrl}`};
-
-}
-
-
-if(!checkSameOrigin(startUrl,documentUrl)){
-return{
-raw,
-value:documentUrl,
-warning:'ERROR: start_url must be same-origin as document'};
-
-}
-
-return{
-raw,
-value:startUrl};
-
-}
-
-
-
-
-function parseDisplay(jsonInput){
-const parsedString=parseString(jsonInput.display,true);
-const stringValue=parsedString.value;
-
-if(!stringValue){
-return{
-raw:jsonInput,
-value:DEFAULT_DISPLAY_MODE,
-warning:parsedString.warning};
-
-}
-
-const displayValue=stringValue.toLowerCase();
-if(!ALLOWED_DISPLAY_VALUES.includes(displayValue)){
-return{
-raw:jsonInput,
-value:DEFAULT_DISPLAY_MODE,
-warning:'ERROR: \'display\' has invalid value '+displayValue+
-`. will fall back to ${DEFAULT_DISPLAY_MODE}.`};
-
-}
-
-return{
-raw:jsonInput,
-value:displayValue,
-warning:undefined};
-
-}
-
-
-
-
-function parseOrientation(jsonInput){
-const orientation=parseString(jsonInput.orientation,true);
-
-if(orientation.value&&
-!ALLOWED_ORIENTATION_VALUES.includes(orientation.value.toLowerCase())){
-orientation.value=undefined;
-orientation.warning='ERROR: \'orientation\' has an invalid value, will be ignored.';
-}
-
-return orientation;
-}
-
-
-
-
-
-
-function parseIcon(raw,manifestUrl){
-
-const src=parseString(raw.src,true);
-
-if(src.value===''){
-src.value=undefined;
-}
-if(src.value){
-try{
-
-src.value=new URL(src.value,manifestUrl).href;
-}catch(_){
-
-src.warning=`ERROR: invalid icon url will be ignored: '${raw.src}'`;
-src.value=undefined;
-}
-}
-
-const type=parseString(raw.type,true);
-
-const density={
-raw:raw.density,
-value:1,
-
-warning:undefined};
-
-if(density.raw!==undefined){
-density.value=parseFloat(density.raw);
-if(isNaN(density.value)||!isFinite(density.value)||density.value<=0){
-density.value=1;
-density.warning='ERROR: icon density cannot be NaN, +∞, or less than or equal to +0.';
-}
-}
-
-let sizes;
-const parsedSizes=parseString(raw.sizes);
-if(parsedSizes.value!==undefined){
-
-const set=new Set();
-parsedSizes.value.trim().split(/\s+/).forEach(size=>set.add(size.toLowerCase()));
-sizes={
-raw:raw.sizes,
-value:set.size>0?Array.from(set):undefined,
-warning:undefined};
-
-}else{
-sizes={...parsedSizes,value:undefined};
-}
-
-return{
-raw,
-value:{
-src,
-type,
-density,
-sizes},
-
-warning:undefined};
-
-}
-
-
-
-
-
-function parseIcons(jsonInput,manifestUrl){
-const raw=jsonInput.icons;
-
-if(raw===undefined){
-return{
-raw,
-
-value:[],
-warning:undefined};
-
-}
-
-if(!Array.isArray(raw)){
-return{
-raw,
-
-value:[],
-warning:'ERROR: \'icons\' expected to be an array but is not.'};
-
-}
-
-const parsedIcons=raw.
-
-filter(icon=>icon.src!==undefined).
-
-map(icon=>parseIcon(icon,manifestUrl));
-
-
-
-const ignoredIconsWithWarnings=parsedIcons.
-filter(icon=>{
-const possibleWarnings=[icon.warning,icon.value.type.warning,icon.value.src.warning,
-icon.value.sizes.warning,icon.value.density.warning].filter(Boolean);
-const hasSrc=!!icon.value.src.value;
-return!!possibleWarnings.length&&!hasSrc;
-});
-
-const value=parsedIcons.
-
-filter(parsedIcon=>parsedIcon.value.src.value!==undefined);
-
-return{
-raw,
-value,
-warning:ignoredIconsWithWarnings.length?
-'WARNING: Some icons were ignored due to warnings.':undefined};
-
-}
-
-
-
-
-function parseApplication(raw){
-const platform=parseString(raw.platform,true);
-const id=parseString(raw.id,true);
-
-
-const appUrl=parseString(raw.url,true);
-if(appUrl.value){
-try{
-
-appUrl.value=new URL(appUrl.value).href;
-}catch(e){
-appUrl.value=undefined;
-appUrl.warning=`ERROR: invalid application URL ${raw.url}`;
-}
-}
-
-return{
-raw,
-value:{
-platform,
-id,
-url:appUrl},
-
-warning:undefined};
-
-}
-
-
-
-
-function parseRelatedApplications(jsonInput){
-const raw=jsonInput.related_applications;
-
-if(raw===undefined){
-return{
-raw,
-value:undefined,
-warning:undefined};
-
-}
-
-if(!Array.isArray(raw)){
-return{
-raw,
-value:undefined,
-warning:'ERROR: \'related_applications\' expected to be an array but is not.'};
-
-}
-
-
-
-const value=raw.
-filter(application=>!!application.platform).
-map(parseApplication).
-filter(parsedApp=>!!parsedApp.value.id.value||!!parsedApp.value.url.value);
-
-return{
-raw,
-value,
-warning:undefined};
-
-}
-
-
-
-
-function parsePreferRelatedApplications(jsonInput){
-const raw=jsonInput.prefer_related_applications;
-let value;
-let warning;
-
-if(typeof raw==='boolean'){
-value=raw;
-}else{
-if(raw!==undefined){
-warning='ERROR: \'prefer_related_applications\' expected to be a boolean.';
-}
-value=undefined;
-}
-
-return{
-raw,
-value,
-warning};
-
-}
-
-
-
-
-function parseThemeColor(jsonInput){
-return parseColor(jsonInput.theme_color);
-}
-
-
-
-
-function parseBackgroundColor(jsonInput){
-return parseColor(jsonInput.background_color);
-}
-
-
-
-
-
-
-
-function parse(string,manifestUrl,documentUrl){
-if(manifestUrl===undefined||documentUrl===undefined){
-throw new Error('Manifest and document URLs required for manifest parsing.');
-}
-
-let jsonInput;
-
-try{
-jsonInput=JSON.parse(string);
-}catch(e){
-return{
-raw:string,
-value:undefined,
-warning:'ERROR: file isn\'t valid JSON: '+e};
-
-}
-
-
-const manifest={
-name:parseName(jsonInput),
-short_name:parseShortName(jsonInput),
-start_url:parseStartUrl(jsonInput,manifestUrl,documentUrl),
-display:parseDisplay(jsonInput),
-orientation:parseOrientation(jsonInput),
-icons:parseIcons(jsonInput,manifestUrl),
-related_applications:parseRelatedApplications(jsonInput),
-prefer_related_applications:parsePreferRelatedApplications(jsonInput),
-theme_color:parseThemeColor(jsonInput),
-background_color:parseBackgroundColor(jsonInput)};
-
-
-
-
-let manifestUrlWarning;
-try{
-const manifestUrlParsed=new URL(manifestUrl);
-if(!manifestUrlParsed.protocol.startsWith('http')){
-manifestUrlWarning=`WARNING: manifest URL not available over a valid network protocol`;
-}
-}catch(_){
-manifestUrlWarning=`ERROR: invalid manifest URL: '${manifestUrl}'`;
-}
-
-return{
-raw:string,
-value:manifest,
-warning:manifestUrlWarning};
-
-}
-
-module.exports=parse;
-
-},{"./url-shim.js":"url","cssstyle/lib/parsers":105}],73:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-
-
-const PUNCTUATOR_REGEX=/(return|{|\(|\[|\.\.\.|;|,|<|>|<=|>=|==|!=|===|!==|\+|-|\*|%|\*\*|\+\+|--|<<|>>|>>>|&|\||\^|!|~|&&|\|\||\?|:|=|\+=|-=|\*=|%=|\*\*=|<<=|>>=|>>>=|&=|\|=|\^=|=>|\/|\/=|\})$/;
-const WHITESPACE_REGEX=/( |\n|\t)+$/;
-
-
-
-
-
-
-
-
-
-function hasPunctuatorBefore(content,startPosition){
-for(let i=startPosition;i>0;i--){
-
-const sliceStart=Math.max(0,i-6);
-const precedingCharacters=content.slice(sliceStart,i);
-
-if(WHITESPACE_REGEX.test(precedingCharacters))continue;
-
-return PUNCTUATOR_REGEX.test(precedingCharacters);
-}
-
-
-
-return true;
-}
-
-
-
-
-
-
-
-function computeTokenLength(content,features){
-let totalTokenLength=0;
-let isInSinglelineComment=false;
-let isInMultilineComment=false;
-let isInLicenseComment=false;
-let isInString=false;
-let isInRegex=false;
-let isInRegexCharacterClass=false;
-let stringOpenChar=null;
-
-for(let i=0;i<content.length;i++){
-const twoChars=content.substr(i,2);
-const char=twoChars.charAt(0);
-
-const isWhitespace=char===' '||char==='\n'||char==='\t';
-const isAStringOpenChar=char===`'`||char==='"'||char==='`';
-
-if(isInSinglelineComment){
-if(char==='\n'){
-
-isInSinglelineComment=false;
-}
-}else if(isInMultilineComment){
-
-if(isInLicenseComment)totalTokenLength++;
-
-if(twoChars==='*/'){
-
-if(isInLicenseComment)totalTokenLength++;
-
-isInMultilineComment=false;
-
-i++;
-}
-}else if(isInString){
-
-totalTokenLength++;
-
-if(char==='\\'){
-
-totalTokenLength++;
-i++;
-}else if(char===stringOpenChar){
-
-isInString=false;
-
-}
-}else if(isInRegex){
-
-totalTokenLength++;
-
-if(char==='\\'){
-
-totalTokenLength++;
-i++;
-}else if(char==='['){
-
-isInRegexCharacterClass=true;
-}else if(char===']'&&isInRegexCharacterClass){
-
-isInRegexCharacterClass=false;
-}else if(char==='/'&&!isInRegexCharacterClass){
-
-isInRegex=false;
-
-}
-}else{
-
-if(twoChars==='/*'){
-
-isInMultilineComment=true;
-
-isInLicenseComment=content.charAt(i+2)==='!';
-
-if(isInLicenseComment)totalTokenLength+=2;
-
-i++;
-}else if(twoChars==='//'&&features.singlelineComments){
-
-isInSinglelineComment=true;
-isInMultilineComment=false;
-isInLicenseComment=false;
-
-i++;
-}else if(char==='/'&&features.regex&&hasPunctuatorBefore(content,i)){
-
-isInRegex=true;
-
-totalTokenLength++;
-}else if(isAStringOpenChar){
-
-isInString=true;
-
-stringOpenChar=char;
-
-totalTokenLength++;
-}else if(!isWhitespace){
-
-totalTokenLength++;
-}
-}
-}
-
-
-
-if(isInMultilineComment||isInString){
-return content.length;
-}
-
-return totalTokenLength;
-}
-
-
-
-
-function computeJSTokenLength(content){
-return computeTokenLength(content,{singlelineComments:true,regex:true});
-}
-
-
-
-
-function computeCSSTokenLength(content){
-return computeTokenLength(content,{singlelineComments:false,regex:false});
-}
-
-module.exports={computeJSTokenLength,computeCSSTokenLength};
-
-},{}],74:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const NetworkRequest=require('./network-request.js');
-const EventEmitter=require('events').EventEmitter;
-const log=require('lighthouse-logger');
-
-const IGNORED_NETWORK_SCHEMES=['data','ws'];
-
-
-
-class NetworkRecorder extends EventEmitter{
-
-
-
-constructor(){
-super();
-
-
-this._records=[];
-
-this._recordsById=new Map();
-}
-
-
-
-
-getInflightRecords(){
-return this._records.filter(record=>!record.finished);
-}
-
-getRecords(){
-return Array.from(this._records);
-}
-
-
-
-
-
-on(event,listener){
-return super.on(event,listener);
-}
-
-
-
-
-
-once(event,listener){
-return super.once(event,listener);
-}
-
-isIdle(){
-return this._isActiveIdlePeriod(0);
-}
-
-is2Idle(){
-return this._isActiveIdlePeriod(2);
-}
-
-
-
-
-
-
-
-_isActiveIdlePeriod(allowedRequests){
-let inflightRequests=0;
-
-for(let i=0;i<this._records.length;i++){
-const record=this._records[i];
-if(record.finished)continue;
-if(IGNORED_NETWORK_SCHEMES.includes(record.parsedURL.scheme))continue;
-inflightRequests++;
-}
-
-return inflightRequests<=allowedRequests;
-}
-
-_emitNetworkStatus(){
-const zeroQuiet=this.isIdle();
-const twoQuiet=this.is2Idle();
-
-if(twoQuiet&&zeroQuiet){
-log.verbose('NetworkRecorder','network fully-quiet');
-this.emit('network-2-idle');
-this.emit('networkidle');
-}else if(twoQuiet&&!zeroQuiet){
-log.verbose('NetworkRecorder','network semi-quiet');
-this.emit('network-2-idle');
-this.emit('networkbusy');
-}else{
-log.verbose('NetworkRecorder','network busy');
-this.emit('network-2-busy');
-this.emit('networkbusy');
-}
-}
-
-
-
-
-
-
-
-
-
-static findNetworkQuietPeriods(networkRecords,allowedConcurrentRequests,endTime=Infinity){
-
-
-let timeBoundaries=[];
-networkRecords.forEach(record=>{
-const scheme=record.parsedURL&&record.parsedURL.scheme;
-if(IGNORED_NETWORK_SCHEMES.includes(scheme)){
-return;
-}
-
-
-timeBoundaries.push({time:record.startTime*1000,isStart:true});
-if(record.finished){
-timeBoundaries.push({time:record.endTime*1000,isStart:false});
-}
-});
-
-timeBoundaries=timeBoundaries.
-filter(boundary=>boundary.time<=endTime).
-sort((a,b)=>a.time-b.time);
-
-let numInflightRequests=0;
-let quietPeriodStart=0;
-
-const quietPeriods=[];
-timeBoundaries.forEach(boundary=>{
-if(boundary.isStart){
-
-if(numInflightRequests===allowedConcurrentRequests){
-quietPeriods.push({start:quietPeriodStart,end:boundary.time});
-}
-numInflightRequests++;
-}else{
-numInflightRequests--;
-
-if(numInflightRequests===allowedConcurrentRequests){
-quietPeriodStart=boundary.time;
-}
-}
-});
-
-
-if(numInflightRequests<=allowedConcurrentRequests){
-quietPeriods.push({start:quietPeriodStart,end:endTime});
-}
-
-return quietPeriods.filter(period=>period.start!==period.end);
-}
-
-
-
-
-
-
-
-onRequestStarted(request){
-this._records.push(request);
-this._recordsById.set(request.requestId,request);
-
-this.emit('requeststarted',request);
-this._emitNetworkStatus();
-}
-
-
-
-
-
-
-
-onRequestFinished(request){
-this.emit('requestloaded',request);
-this._emitNetworkStatus();
-}
-
-
-
-
-
-
-
-onRequestWillBeSent(event){
-const data=event.params;
-const originalRequest=this._findRealRequestAndSetSession(data.requestId,event.sessionId);
-
-if(!originalRequest){
-const request=new NetworkRequest();
-request.onRequestWillBeSent(data);
-request.sessionId=event.sessionId;
-this.onRequestStarted(request);
-return;
-}
-
-
-if(!data.redirectResponse){
-return;
-}
-
-
-
-const modifiedData={
-...data,
-
-initiator:originalRequest.initiator,
-requestId:`${originalRequest.requestId}:redirect`};
-
-const redirectedRequest=new NetworkRequest();
-
-redirectedRequest.onRequestWillBeSent(modifiedData);
-originalRequest.onRedirectResponse(data);
-
-originalRequest.redirectDestination=redirectedRequest;
-redirectedRequest.redirectSource=originalRequest;
-
-
-this.onRequestStarted(redirectedRequest);
-this.onRequestFinished(originalRequest);
-}
-
-
-
-
-onRequestServedFromCache(event){
-const data=event.params;
-const request=this._findRealRequestAndSetSession(data.requestId,event.sessionId);
-if(!request)return;
-request.onRequestServedFromCache();
-}
-
-
-
-
-onResponseReceived(event){
-const data=event.params;
-const request=this._findRealRequestAndSetSession(data.requestId,event.sessionId);
-if(!request)return;
-request.onResponseReceived(data);
-}
-
-
-
-
-onDataReceived(event){
-const data=event.params;
-const request=this._findRealRequestAndSetSession(data.requestId,event.sessionId);
-if(!request)return;
-request.onDataReceived(data);
-}
-
-
-
-
-onLoadingFinished(event){
-const data=event.params;
-const request=this._findRealRequestAndSetSession(data.requestId,event.sessionId);
-if(!request)return;
-request.onLoadingFinished(data);
-this.onRequestFinished(request);
-}
-
-
-
-
-onLoadingFailed(event){
-const data=event.params;
-const request=this._findRealRequestAndSetSession(data.requestId,event.sessionId);
-if(!request)return;
-request.onLoadingFailed(data);
-this.onRequestFinished(request);
-}
-
-
-
-
-onResourceChangedPriority(event){
-const data=event.params;
-const request=this._findRealRequestAndSetSession(data.requestId,event.sessionId);
-if(!request)return;
-request.onResourceChangedPriority(data);
-}
-
-
-
-
-
-dispatch(event){
-switch(event.method){
-case'Network.requestWillBeSent':return this.onRequestWillBeSent(event);
-case'Network.requestServedFromCache':return this.onRequestServedFromCache(event);
-case'Network.responseReceived':return this.onResponseReceived(event);
-case'Network.dataReceived':return this.onDataReceived(event);
-case'Network.loadingFinished':return this.onLoadingFinished(event);
-case'Network.loadingFailed':return this.onLoadingFailed(event);
-case'Network.resourceChangedPriority':return this.onResourceChangedPriority(event);
-default:return;}
-
-}
-
-
-
-
-
-
-
-
-
-
-
-_findRealRequestAndSetSession(requestId,sessionId){
-let request=this._recordsById.get(requestId);
-if(!request||!request.isValid)return undefined;
-
-while(request.redirectDestination){
-request=request.redirectDestination;
-}
-
-request.setSession(sessionId);
-
-return request;
-}
-
-
-
-
-
-
-static recordsFromLogs(devtoolsLog){
-const networkRecorder=new NetworkRecorder();
-
-devtoolsLog.forEach(message=>networkRecorder.dispatch(message));
-
-
-const records=networkRecorder.getRecords().filter(record=>record.isValid);
-
-
-const recordsByURL=new Map();
-for(const record of records){
-if(recordsByURL.has(record.url))continue;
-recordsByURL.set(record.url,record);
-}
-
-
-for(const record of records){
-const stackFrames=record.initiator.stack&&record.initiator.stack.callFrames||[];
-const initiatorURL=record.initiator.url||stackFrames[0]&&stackFrames[0].url;
-
-
-const initiator=record.redirectSource||recordsByURL.get(initiatorURL);
-if(initiator){
-record.setInitiatorRequest(initiator);
-}
-
-let finalRecord=record;
-while(finalRecord.redirectDestination)finalRecord=finalRecord.redirectDestination;
-if(finalRecord===record||finalRecord.redirects)continue;
-
-const redirects=[];
-for(
-let redirect=finalRecord.redirectSource;
-redirect;
-redirect=redirect.redirectSource)
-{
-redirects.unshift(redirect);
-}
-
-finalRecord.redirects=redirects;
-}
-
-return records;
-}}
-
-
-module.exports=NetworkRecorder;
-
-},{"./network-request.js":75,"events":108,"lighthouse-logger":125}],75:[function(require,module,exports){
-(function(global){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-
-const URL=require('./url-shim.js');
-
-const SECURE_SCHEMES=['data','https','wss','blob','chrome','chrome-extension','about'];
-
-
-
-const HEADER_TCP='X-TCPMs';
-const HEADER_SSL='X-SSLMs';
-const HEADER_REQ='X-RequestMs';
-const HEADER_RES='X-ResponseMs';
-const HEADER_TOTAL='X-TotalMs';
-const HEADER_FETCHED_SIZE='X-TotalFetchedSize';
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const RESOURCE_TYPES={
-XHR:'XHR',
-Fetch:'Fetch',
-EventSource:'EventSource',
-Script:'Script',
-Stylesheet:'Stylesheet',
-Image:'Image',
-Media:'Media',
-Font:'Font',
-Document:'Document',
-TextTrack:'TextTrack',
-WebSocket:'WebSocket',
-Other:'Other',
-Manifest:'Manifest',
-SignedExchange:'SignedExchange',
-Ping:'Ping',
-CSPViolationReport:'CSPViolationReport'};
-
-
-class NetworkRequest{
-constructor(){
-this.requestId='';
-this.connectionId='0';
-this.connectionReused=false;
-
-this.url='';
-this.protocol='';
-this.isSecure=false;
-this.isValid=false;
-this.parsedURL={scheme:''};
-this.documentURL='';
-
-this.startTime=-1;
-
-this.endTime=-1;
-
-this.responseReceivedTime=-1;
-
-
-this.transferSize=0;
-this.resourceSize=0;
-this.fromDiskCache=false;
-this.fromMemoryCache=false;
-
-
-this.lrStatistics=undefined;
-
-this.finished=false;
-this.requestMethod='';
-this.statusCode=-1;
-
-this.redirectSource=undefined;
-
-this.redirectDestination=undefined;
-
-this.redirects=undefined;
-this.failed=false;
-this.localizedFailDescription='';
-
-this.initiator={type:'other'};
-
-this.timing=undefined;
-
-this.resourceType=undefined;
-this.mimeType='';
-
-this.priority='Low';
-
-this.initiatorRequest=undefined;
-
-this.responseHeaders=[];
-
-this.responseHeadersText='';
-
-this.fetchedViaServiceWorker=false;
-
-this.frameId='';
-
-
-
-
-
-this.sessionId=undefined;
-this.isLinkPreload=false;
-}
-
-
-
-
-hasErrorStatusCode(){
-return this.statusCode>=400;
-}
-
-
-
-
-setInitiatorRequest(initiator){
-this.initiatorRequest=initiator;
-}
-
-
-
-
-onRequestWillBeSent(data){
-this.requestId=data.requestId;
-let url;
-try{
-
-url=new URL(data.request.url);
-}catch(e){
-
-return;
-}
-this.url=data.request.url;
-this.documentURL=data.documentURL;
-this.parsedURL={
-scheme:url.protocol.split(':')[0],
-
-host:url.hostname,
-securityOrigin:url.origin};
-
-this.isSecure=SECURE_SCHEMES.includes(this.parsedURL.scheme);
-
-this.startTime=data.timestamp;
-
-this.requestMethod=data.request.method;
-
-this.initiator=data.initiator;
-this.resourceType=data.type&&RESOURCE_TYPES[data.type];
-this.priority=data.request.initialPriority;
-
-this.frameId=data.frameId;
-this.isLinkPreload=data.initiator.type==='preload'||!!data.request.isLinkPreload;
-this.isValid=true;
-}
-
-onRequestServedFromCache(){
-this.fromMemoryCache=true;
-}
-
-
-
-
-onResponseReceived(data){
-this._onResponse(data.response,data.timestamp,data.type);
-this.frameId=data.frameId;
-}
-
-
-
-
-onDataReceived(data){
-this.resourceSize+=data.dataLength;
-if(data.encodedDataLength!==-1){
-this.transferSize+=data.encodedDataLength;
-}
-}
-
-
-
-
-onLoadingFinished(data){
-
-if(this.finished)return;
-
-this.finished=true;
-this.endTime=data.timestamp;
-if(data.encodedDataLength>=0){
-this.transferSize=data.encodedDataLength;
-}
-
-this._updateResponseReceivedTimeIfNecessary();
-this._updateTransferSizeForLightrider();
-this._updateTimingsForLightrider();
-}
-
-
-
-
-onLoadingFailed(data){
-
-if(this.finished)return;
-
-this.finished=true;
-this.endTime=data.timestamp;
-
-this.failed=true;
-this.resourceType=data.type&&RESOURCE_TYPES[data.type];
-this.localizedFailDescription=data.errorText;
-
-this._updateResponseReceivedTimeIfNecessary();
-this._updateTransferSizeForLightrider();
-this._updateTimingsForLightrider();
-}
-
-
-
-
-onResourceChangedPriority(data){
-this.priority=data.newPriority;
-}
-
-
-
-
-onRedirectResponse(data){
-if(!data.redirectResponse)throw new Error('Missing redirectResponse data');
-this._onResponse(data.redirectResponse,data.timestamp,data.type);
-this.resourceType=undefined;
-this.finished=true;
-this.endTime=data.timestamp;
-
-this._updateResponseReceivedTimeIfNecessary();
-}
-
-
-
-
-setSession(sessionId){
-this.sessionId=sessionId;
-}
-
-
-
-
-
-
-_onResponse(response,timestamp,resourceType){
-this.url=response.url;
-
-this.connectionId=String(response.connectionId);
-this.connectionReused=response.connectionReused;
-
-if(response.protocol)this.protocol=response.protocol;
-
-this.responseReceivedTime=timestamp;
-
-this.transferSize=response.encodedDataLength;
-if(typeof response.fromDiskCache==='boolean')this.fromDiskCache=response.fromDiskCache;
-
-this.statusCode=response.status;
-
-this.timing=response.timing;
-if(resourceType)this.resourceType=RESOURCE_TYPES[resourceType];
-this.mimeType=response.mimeType;
-this.responseHeadersText=response.headersText||'';
-this.responseHeaders=NetworkRequest._headersDictToHeadersArray(response.headers);
-
-this.fetchedViaServiceWorker=!!response.fromServiceWorker;
-
-if(this.fromMemoryCache)this.timing=undefined;
-if(this.timing)this._recomputeTimesWithResourceTiming(this.timing);
-}
-
-
-
-
-
-
-_recomputeTimesWithResourceTiming(timing){
-
-
-if(timing.requestTime===0||timing.receiveHeadersEnd===-1)return;
-
-
-this.startTime=timing.requestTime;
-const headersReceivedTime=timing.requestTime+timing.receiveHeadersEnd/1000;
-if(!this.responseReceivedTime||this.responseReceivedTime<0){
-this.responseReceivedTime=headersReceivedTime;
-}
-
-this.responseReceivedTime=Math.min(this.responseReceivedTime,headersReceivedTime);
-this.responseReceivedTime=Math.max(this.responseReceivedTime,this.startTime);
-
-
-this.endTime=Math.max(this.endTime,this.responseReceivedTime);
-}
-
-
-
-
-
-_updateResponseReceivedTimeIfNecessary(){
-this.responseReceivedTime=Math.min(this.endTime,this.responseReceivedTime);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-_updateTransferSizeForLightrider(){
-
-if(!global.isLightrider)return;
-
-const totalFetchedSize=this.responseHeaders.find(item=>item.name===HEADER_FETCHED_SIZE);
-
-if(!totalFetchedSize)return;
-const floatValue=parseFloat(totalFetchedSize.value);
-
-if(isNaN(floatValue))return;
-this.transferSize=floatValue;
-}
-
-
-
-
-
-_updateTimingsForLightrider(){
-
-if(!global.isLightrider)return;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const totalHeader=this.responseHeaders.find(item=>item.name===HEADER_TOTAL);
-
-if(!totalHeader)return;
-
-const totalMs=parseInt(totalHeader.value);
-const TCPMsHeader=this.responseHeaders.find(item=>item.name===HEADER_TCP);
-const SSLMsHeader=this.responseHeaders.find(item=>item.name===HEADER_SSL);
-const requestMsHeader=this.responseHeaders.find(item=>item.name===HEADER_REQ);
-const responseMsHeader=this.responseHeaders.find(item=>item.name===HEADER_RES);
-
-
-const TCPMs=TCPMsHeader?Math.max(0,parseInt(TCPMsHeader.value)):0;
-const SSLMs=SSLMsHeader?Math.max(0,parseInt(SSLMsHeader.value)):0;
-const requestMs=requestMsHeader?Math.max(0,parseInt(requestMsHeader.value)):0;
-const responseMs=responseMsHeader?Math.max(0,parseInt(responseMsHeader.value)):0;
-
-
-if(TCPMs+requestMs+responseMs!==totalMs){
-return;
-}
-
-
-if(SSLMs>TCPMs){
-return;
-}
-
-this.lrStatistics={
-endTimeDeltaMs:(this.endTime-(this.startTime+totalMs/1000))*1000,
-TCPMs:TCPMs,
-requestMs:requestMs,
-responseMs:responseMs};
-
-}
-
-
-
-
-
-
-
-static getRequestIdForBackend(requestId){
-return requestId.replace(/(:redirect)+$/,'');
-}
-
-
-
-
-
-
-
-static _headersDictToHeadersArray(headersDict){
-const result=[];
-for(const name of Object.keys(headersDict)){
-const values=headersDict[name].split('\n');
-for(let i=0;i<values.length;++i){
-result.push({name:name,value:values[i]});
-}
-}
-return result;
-}
-
-static get TYPES(){
-return RESOURCE_TYPES;
-}}
-
-
-NetworkRequest.HEADER_TCP=HEADER_TCP;
-NetworkRequest.HEADER_SSL=HEADER_SSL;
-NetworkRequest.HEADER_REQ=HEADER_REQ;
-NetworkRequest.HEADER_RES=HEADER_RES;
-NetworkRequest.HEADER_TOTAL=HEADER_TOTAL;
-NetworkRequest.HEADER_FETCHED_SIZE=HEADER_FETCHED_SIZE;
-
-module.exports=NetworkRequest;
-
-}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
-},{"./url-shim.js":"url"}],76:[function(require,module,exports){
-
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function wrapRuntimeEvalErrorInBrowser(err){
-err=err||new Error();
-const fallbackMessage=typeof err==='string'?err:'unknown error';
-
-return{
-__failedInBrowser:true,
-name:err.name||'Error',
-message:err.message||fallbackMessage,
-stack:err.stack||new Error().stack};
-
-}
-
-
-
-
-
-
-function registerPerformanceObserverInPage(){
-window.____lastLongTask=window.__perfNow();
-const observer=new window.PerformanceObserver(entryList=>{
-const entries=entryList.getEntries();
-for(const entry of entries){
-if(entry.entryType==='longtask'){
-const taskEnd=entry.startTime+entry.duration;
-window.____lastLongTask=Math.max(window.____lastLongTask,taskEnd);
-}
-}
-});
-
-observer.observe({entryTypes:['longtask']});
-
-
-
-
-
-window.____lhPerformanceObserver=observer;
-}
-
-
-
-
-
-function checkTimeSinceLastLongTask(){
-
-
-return new window.__nativePromise(resolve=>{
-const timeoutRequested=window.__perfNow()+50;
-
-setTimeout(()=>{
-
-const timeoutFired=window.__perfNow();
-const timeSinceLongTask=timeoutFired-timeoutRequested<50?
-timeoutFired-window.____lastLongTask:0;
-resolve(timeSinceLongTask);
-},50);
-});
-}
-
-
-
-
-
-
-
-function getElementsInDocument(selector){
-const realMatchesFn=window.__ElementMatches||window.Element.prototype.matches;
-
-const results=[];
-
-
-const _findAllElements=nodes=>{
-for(let i=0,el;el=nodes[i];++i){
-if(!selector||realMatchesFn.call(el,selector)){
-results.push(el);
-}
-
-if(el.shadowRoot){
-_findAllElements(el.shadowRoot.querySelectorAll('*'));
-}
-}
-};
-_findAllElements(document.querySelectorAll('*'));
-
-return results;
-}
-
-
-
-
-
-
-
-
-function getOuterHTMLSnippet(element,ignoreAttrs=[]){
-try{
-
-if(element instanceof ShadowRoot){
-element=element.host;
-}
-
-const clone=element.cloneNode();
-ignoreAttrs.forEach(attribute=>{
-clone.removeAttribute(attribute);
-});
-const reOpeningTag=/^[\s\S]*?>/;
-const match=clone.outerHTML.match(reOpeningTag);
-return match&&match[0]||'';
-}catch(_){
-
-return`<${element.localName}>`;
-}
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function ultradumbBenchmark(){
-const start=Date.now();
-let iterations=0;
-
-while(Date.now()-start<500){
-let s='';
-for(let j=0;j<100000;j++)s+='a';
-
-iterations++;
-}
-
-const durationInSeconds=(Date.now()-start)/1000;
-return Math.round(iterations/durationInSeconds);
-}
-
-
-
-
-
-
-
-
-function getNodePath(node){
-
-function getNodeIndex(node){
-let index=0;
-let prevNode;
-while(prevNode=node.previousSibling){
-node=prevNode;
-
-if(node.nodeType===Node.TEXT_NODE&&node.nodeValue.trim().length===0)continue;
-index++;
-}
-return index;
-}
-
-const path=[];
-while(node&&node.parentNode){
-const index=getNodeIndex(node);
-path.push([index,node.nodeName]);
-node=node.parentNode;
-}
-path.reverse();
-return path.join(',');
-}
-
-
-
-
-
-
-function getNodeSelector(node){
-
-
-
-function getSelectorPart(node){
-let part=node.tagName.toLowerCase();
-if(node.id){
-part+='#'+node.id;
-}else if(node.classList.length>0){
-part+='.'+node.classList[0];
-}
-return part;
-}
-
-const parts=[];
-while(parts.length<4){
-parts.unshift(getSelectorPart(node));
-if(!node.parentElement){
-break;
-}
-node=node.parentElement;
-if(node.tagName==='HTML'){
-break;
-}
-}
-return parts.join(' > ');
-}
-
-
-
-
-
-
-
-
-
-function isPositionFixed(element){
-
-
-
-
-
-function getStyleAttrValue(element,attr){
-
-return element.style[attr]||window.getComputedStyle(element)[attr];
-}
-
-
-const htmlEl=document.querySelector('html');
-if(htmlEl.scrollHeight<=htmlEl.clientHeight||
-!['scroll','auto','visible'].includes(getStyleAttrValue(htmlEl,'overflowY'))){
-return false;
-}
-
-let currentEl=element;
-while(currentEl){
-const position=getStyleAttrValue(currentEl,'position');
-if(position==='fixed'||position==='sticky'){
-return true;
-}
-currentEl=currentEl.parentElement;
-}
-return false;
-}
-
-
-
-
-
-
-
-
-
-function getNodeLabel(node){
-
-
-
-
-
-
-
-function truncate(str,maxLength){
-if(str.length<=maxLength){
-return str;
-}
-return str.slice(0,maxLength-1)+'…';
-}
-
-const tagName=node.tagName.toLowerCase();
-
-if(tagName!=='html'&&tagName!=='body'){
-const nodeLabel=node.innerText||node.getAttribute('alt')||node.getAttribute('aria-label');
-if(nodeLabel){
-return truncate(nodeLabel,80);
-}else{
-
-
-const nodeToUseForLabel=node.querySelector('[alt], [aria-label]');
-if(nodeToUseForLabel){
-return getNodeLabel(nodeToUseForLabel);
-}
-}
-}
-return tagName;
-}
-
-module.exports={
-wrapRuntimeEvalErrorInBrowserString:wrapRuntimeEvalErrorInBrowser.toString(),
-registerPerformanceObserverInPageString:registerPerformanceObserverInPage.toString(),
-checkTimeSinceLastLongTaskString:checkTimeSinceLastLongTask.toString(),
-getElementsInDocumentString:getElementsInDocument.toString(),
-getOuterHTMLSnippetString:getOuterHTMLSnippet.toString(),
-getOuterHTMLSnippet:getOuterHTMLSnippet,
-ultradumbBenchmark:ultradumbBenchmark,
-ultradumbBenchmarkString:ultradumbBenchmark.toString(),
-getNodePathString:getNodePath.toString(),
-getNodeSelectorString:getNodeSelector.toString(),
-getNodeSelector:getNodeSelector,
-getNodeLabel:getNodeLabel,
-getNodeLabelString:getNodeLabel.toString(),
-isPositionFixedString:isPositionFixed.toString()};
-
-
-},{}],77:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-function rectContainsPoint(rect,{x,y}){
-return rect.left<=x&&rect.right>=x&&rect.top<=y&&rect.bottom>=y;
-}
-
-
-
-
-
-
-
-
-
-
-function rectContains(rect1,rect2){
-return rect2.top>=rect1.top&&
-rect2.right<=rect1.right&&
-rect2.bottom<=rect1.bottom&&
-rect2.left>=rect1.left;
-}
-
-
-
-
-
-function filterOutTinyRects(rects){
-return rects.filter(
-rect=>rect.width>1&&rect.height>1);
-
-}
-
-
-
-
-
-function filterOutRectsContainedByOthers(rects){
-const rectsToKeep=new Set(rects);
-
-for(const rect of rects){
-for(const possiblyContainingRect of rects){
-if(rect===possiblyContainingRect)continue;
-if(!rectsToKeep.has(possiblyContainingRect))continue;
-if(rectContains(possiblyContainingRect,rect)){
-rectsToKeep.delete(rect);
-break;
-}
-}
-}
-
-return Array.from(rectsToKeep);
-}
-
-
-
-
-
-function getRectCenterPoint(rect){
-return{
-x:rect.left+rect.width/2,
-y:rect.top+rect.height/2};
-
-}
-
-
-
-
-
-
-function rectsTouchOrOverlap(rectA,rectB){
-
-return(
-rectA.left<=rectB.right&&
-rectB.left<=rectA.right&&
-rectA.top<=rectB.bottom&&
-rectB.top<=rectA.bottom);
-
-}
-
-
-
-
-
-
-
-
-function getBoundingRectWithPadding(rects,padding){
-if(rects.length===0){
-throw new Error('No rects to take bounds of');
-}
-
-let left=Number.MAX_VALUE;
-let right=-Number.MAX_VALUE;
-let top=Number.MAX_VALUE;
-let bottom=-Number.MAX_VALUE;
-for(const rect of rects){
-left=Math.min(left,rect.left);
-right=Math.max(right,rect.right);
-top=Math.min(top,rect.top);
-bottom=Math.max(bottom,rect.bottom);
-}
-
-
-const halfMinSize=padding/2;
-left-=halfMinSize;
-right+=halfMinSize;
-top-=halfMinSize;
-bottom+=halfMinSize;
-
-return{
-left,
-right,
-top,
-bottom,
-width:right-left,
-height:bottom-top};
-
-}
-
-
-
-
-function getBoundingRect(rects){
-return getBoundingRectWithPadding(rects,0);
-}
-
-
-
-
-
-function addRectWidthAndHeight({left,top,right,bottom}){
-return{
-left,
-top,
-right,
-bottom,
-width:right-left,
-height:bottom-top};
-
-}
-
-
-
-
-
-function addRectTopAndBottom({x,y,width,height}){
-return{
-left:x,
-top:y,
-right:x+width,
-bottom:y+height,
-width,
-height};
-
-}
-
-
-
-
-
-function getRectOverlapArea(rect1,rect2){
-
-const rectYOverlap=Math.min(rect1.bottom,rect2.bottom)-Math.max(rect1.top,rect2.top);
-if(rectYOverlap<=0)return 0;
-
-const rectXOverlap=Math.min(rect1.right,rect2.right)-Math.max(rect1.left,rect2.left);
-if(rectXOverlap<=0)return 0;
-
-return rectXOverlap*rectYOverlap;
-}
-
-
-
-
-
-function getRectAtCenter(rect,centerRectSize){
-return addRectWidthAndHeight({
-left:rect.left+rect.width/2-centerRectSize/2,
-top:rect.top+rect.height/2-centerRectSize/2,
-right:rect.right-rect.width/2+centerRectSize/2,
-bottom:rect.bottom-rect.height/2+centerRectSize/2});
-
-}
-
-
-
-
-
-function getRectArea(rect){
-return rect.width*rect.height;
-}
-
-
-
-
-
-function getLargestRect(rects){
-let largestRect=rects[0];
-for(const rect of rects){
-if(getRectArea(rect)>getRectArea(largestRect)){
-largestRect=rect;
-}
-}
-return largestRect;
-}
-
-
-
-
-
-
-function allRectsContainedWithinEachOther(rectListA,rectListB){
-for(const rectA of rectListA){
-for(const rectB of rectListB){
-if(!rectContains(rectA,rectB)&&!rectContains(rectB,rectA)){
-return false;
-}
-}
-}
-return true;
-}
-
-module.exports={
-rectContainsPoint,
-rectContains,
-addRectWidthAndHeight,
-addRectTopAndBottom,
-getRectOverlapArea,
-getRectAtCenter,
-getLargestRect,
-getRectArea,
-getRectCenterPoint,
-getBoundingRect,
-getBoundingRectWithPadding,
-rectsTouchOrOverlap,
-allRectsContainedWithinEachOther,
-filterOutRectsContainedByOthers,
-filterOutTinyRects};
-
-
-},{}],78:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const log=require('lighthouse-logger');
-
-
-
-
-const SENTRY_URL='https://a6bb0da87ee048cc9ae2a345fc09ab2e:63a7029f46f74265981b7e005e0f69f8@sentry.io/174697';
-
-
-const SAMPLE_RATE=0.01;
-
-
-const SAMPLED_ERRORS=[];
-
-
-
-
-const noop=()=>{};
-
-
-
-
-
-const sentryDelegate={
-init,
-
-captureMessage:noop,
-
-captureBreadcrumb:noop,
-
-getContext:noop,
-
-captureException:async()=>{},
-_shouldSample(){
-return SAMPLE_RATE>=Math.random();
-}};
-
-
-
-
-
-
-function init(opts){
-
-if(!opts.flags.enableErrorReporting){
-return;
-}
-
-
-if(!sentryDelegate._shouldSample()){
-return;
-}
-
-try{
-const Sentry=require('raven');
-const sentryConfig=Object.assign({},opts.environmentData,
-{captureUnhandledRejections:true});
-Sentry.config(SENTRY_URL,sentryConfig).install();
-
-
-sentryDelegate.captureMessage=(...args)=>Sentry.captureMessage(...args);
-sentryDelegate.captureBreadcrumb=(...args)=>Sentry.captureBreadcrumb(...args);
-sentryDelegate.getContext=()=>Sentry.getContext();
-
-
-const sentryExceptionCache=new Map();
-
-sentryDelegate.captureException=async(err,opts={})=>{
-
-if(!err)return;
-
-
-
-if(err.expected)return;
-
-const tags=opts.tags||{};
-if(tags.audit){
-const key=`audit-${tags.audit}-${err.message}`;
-if(sentryExceptionCache.has(key))return;
-sentryExceptionCache.set(key,true);
-}
-
-if(tags.gatherer){
-const key=`gatherer-${tags.gatherer}-${err.message}`;
-if(sentryExceptionCache.has(key))return;
-sentryExceptionCache.set(key,true);
-}
-
-
-const sampledErrorMatch=SAMPLED_ERRORS.find(sample=>sample.pattern.test(err.message));
-if(sampledErrorMatch&&sampledErrorMatch.rate<=Math.random())return;
-
-
-
-if(err.protocolMethod){
-
-opts.fingerprint=['{{ default }}',err.protocolMethod,err.protocolError];
-}
-
-return new Promise(resolve=>{
-Sentry.captureException(err,opts,()=>resolve());
-});
-};
-
-const context=Object.assign({
-url:opts.url,
-emulatedFormFactor:opts.flags.emulatedFormFactor,
-throttlingMethod:opts.flags.throttlingMethod},
-opts.flags.throttling);
-Sentry.mergeContext({extra:Object.assign({},opts.environmentData.extra,context)});
-}catch(e){
-log.warn(
-'sentry',
-'Could not load raven library, errors will not be reported.');
-
-}
-}
-
-module.exports=sentryDelegate;
-
-},{"lighthouse-logger":125,"raven":101}],79:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-
-const libDetectorSource="var UNKNOWN_VERSION = null;\nvar d41d8cd98f00b204e9800998ecf8427e_LibraryDetectorTests = {\n\n    'GWT': {\n        icon: 'gwt',\n        url: 'http://www.gwtproject.org/',\n        test: function(win) {\n            // pretty complicated, many possible tell tales\n            var doc = win.document,\n                hasHistFrame = doc.getElementById('__gwt_historyFrame'),\n                hasGwtUid = doc.gwt_uid,\n                hasBodyListener = doc.body.__listener,\n                hasBodyEventBits = doc.body.__eventBits,\n                hasModules = win.__gwt_activeModules,\n                hasJsonP = win.__gwt_jsonp__,\n                hasRootWinApp = win.__gwt_scriptsLoaded || win.__gwt_stylesLoaded || win.__gwt_activeModules;\n\n            // use the many possible indicators\n            if(hasHistFrame || hasGwtUid || hasBodyListener || hasBodyEventBits || hasModules || hasJsonP || hasRootWinApp) {\n\n                // carefully look at frames, but only if certain is GWT frame\n                var frames = doc.getElementsByTagName('iframe'),\n                    gwtVersion = UNKNOWN_VERSION;\n                for(var n=0; n<frames.length; n++) {\n                    // catch security access errors\n                    try {\n                        var hasNegativeTabIndex = frames[n].tabIndex < 0; // on for GWT\n                        if(hasNegativeTabIndex && frames[n].contentWindow && frames[n].contentWindow.$gwt_version) {\n                            gwtVersion = frames[n].contentWindow.$gwt_version;\n                            break;\n                        }\n                    }\n                    catch(e) {}\n                }\n\n                if(gwtVersion=='0.0.999') {\n                  gwtVersion = 'Google Internal';\n                }\n\n                return { version: gwtVersion };\n            }\n            return false;\n        }\n    },\n\n    'Ink': {\n        icon: 'ink',\n        url: 'http://ink.sapo.pt/',\n        test: function(win) {\n            if (win.Ink && win.Ink.createModule) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Vaadin': {\n        icon: 'vaadin',\n        url: 'https://vaadin.com/',\n        test: function(win) {\n            if (win.vaadin && win.vaadin.registerWidgetset) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Bootstrap': {\n        icon: 'bootstrap',\n        url: 'http://getbootstrap.com/',\n        npm: 'bootstrap',\n        // look for a function Boostrap has added to jQuery - regex for BS 2 & 3\n        test: function(win) {\n            var jQueryAvailable = win.$ && win.$.fn,\n                RE_PREFIX_V2 = '\\\\$this\\\\.data\\\\((?:\\'|\")',\n                RE_PREFIX_V3 = '\\\\$this\\\\.data\\\\((?:\\'|\")(?:bs\\\\.){1}',\n                bootstrapComponents = [\n                    'affix', 'alert', 'button', 'carousel', 'collapse', 'dropdown',\n                    'modal', 'popover', 'scrollspy', 'tab', 'tooltip'\n                ];\n\n            if(jQueryAvailable) {\n                var bootstrapVersion;\n\n                bootstrapComponents.some(function(component) {\n                    if(win.$.fn[component]) {\n                        // Bootstrap >= 3.2.0 detection\n                        if(win.$.fn[component].Constructor && win.$.fn[component].Constructor.VERSION) {\n                            bootstrapVersion = win.$.fn[component].Constructor.VERSION;\n                            return true;\n                        // Bootstrap >= 2.0.0 and <= 3.1.0 detection\n                        } else if(new RegExp(RE_PREFIX_V3 + component).test(win.$.fn[component].toString())) {\n                            bootstrapVersion = '>= 3.0.0 & <= 3.1.1';\n                            return true;\n                        // Bootstrap < 3.1.0 detection\n                        } else if(new RegExp(RE_PREFIX_V2 + component).test(win.$.fn[component].toString())) {\n                            bootstrapVersion = '>= 2.0.0 & <= 2.3.2';\n                            return true;\n                        }\n                    }\n\n                    return false;\n                });\n\n                if (bootstrapVersion) {\n                    return { version: bootstrapVersion };\n                }\n            }\n\n            return false;\n        }\n    },\n\n    'Zurb': {\n        icon: 'zurb',\n        url: 'https://foundation.zurb.com/',\n        npm: 'foundation-sites',\n        test: function(win) {\n            if(win.Foundation && win.Foundation.Toggler) {\n                return { version: win.Foundation.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Polymer': {\n        icon: 'polymer',\n        url: 'https://www.polymer-project.org/',\n        npm: '@polymer/polymer',\n        test: function(win) {\n            if(win.Polymer && win.Polymer.dom) {\n                return { version: win.Polymer.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Highcharts': {\n        icon: 'highcharts',\n        url: 'http://www.highcharts.com',\n        npm: 'highcharts',\n        test: function(win) {\n            if(win.Highcharts && win.Highcharts.Point) {\n                return { version: win.Highcharts.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'InfoVis': {\n        icon: 'jit',\n        url: 'http://philogb.github.com/jit/',\n        test: function test(win) {\n            if(win.$jit && win.$jit.PieChart) {\n                return { version: win.$jit.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'FlotCharts': {\n        icon: 'flotcharts',\n        url: 'http://www.flotcharts.org/',\n        npm: 'flot',\n        test: function(win) {\n            if(win.$ && win.$.plot) {\n                return { version: win.$.plot.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'CreateJS': {\n        icon: 'createjs',\n        url: 'https://createjs.com/',\n        npm: 'createjs',\n        test: function(win) {\n            if(win.createjs && win.createjs.promote) {\n                return { version: UNKNOWN_VERSION}; // no version info available\n            }\n            return false;\n        }\n    },\n\n    'Google Maps': {\n        icon: 'gmaps',\n        url: 'https://developers.google.com/maps/',\n        test: function(win) {\n            if (win.google && win.google.maps) {\n                return { version: win.google.maps.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'jQuery': {\n        icon: 'jquery',\n        url: 'http://jquery.com',\n        npm: 'jquery',\n        test: function(win) {\n            var jq = win.jQuery || win.$;\n            if (jq && jq.fn && jq.fn.jquery) {\n                return { version: jq.fn.jquery.replace(/[^\\d+\\.+]/g, '') || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'jQuery (Fast path)': {\n        icon: 'jquery',\n        url: 'http://jquery.com',\n        npm: 'jquery',\n        test: function (win) {\n            var jq = win.jQuery || win.$;\n            if (jq && jq.fn) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'jQuery UI': {\n        icon: 'jquery_ui',\n        url: 'http://jqueryui.com',\n        npm: 'jquery-ui',\n        test: function(win) {\n            var jq = win.jQuery || win.$ || win.$jq || win.$j;\n            if(jq && jq.fn && jq.fn.jquery && jq.ui) {\n                var plugins = 'accordion,datepicker,dialog,draggable,droppable,progressbar,resizable,selectable,slider,menu,grid,tabs'.split(','), concat = [];\n                for (var i=0; i < plugins.length; i++) { if(jq.ui[plugins[i]]) concat.push(plugins[i].substr(0,1).toUpperCase() + plugins[i].substr(1)); }\n                return { version: jq.ui.version || UNKNOWN_VERSION, details: concat.length ? 'Plugins used: '+concat.join(',') : '' };\n            }\n            return false;\n        }\n    },\n\n    'Dojo': {\n        icon: 'dojo',\n        url: 'http://dojotoolkit.org',\n        npm: 'dojo',\n        test: function(win) {\n            if(win.dojo && win.dojo.delegate) {\n                var version = win.dojo.version ? win.dojo.version.toString() : UNKNOWN_VERSION;\n                return { version: version, details: 'Details: '+(win.dijit ? 'Uses Dijit' : 'none') };\n            }\n            return false;\n        }\n    },\n\n    'Prototype': {\n        icon: 'prototype',\n        url: 'http://prototypejs.org',\n        test: function(win) {\n            if(win.Prototype && win.Prototype.BrowserFeatures) {\n                return { version: win.Prototype.Version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Scriptaculous': {\n        icon: 'scriptaculous',\n        url: 'http://script.aculo.us',\n        test: function(win) {\n            if(win.Scriptaculous && win.Scriptaculous.load) {\n                return { version: win.Scriptaculous.Version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'MooTools': {\n        icon: 'mootools',\n        url: 'https://mootools.net/',\n        test: function(win) {\n            if(win.MooTools && win.MooTools.build) {\n                return { version: win.MooTools.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Spry': {\n        icon: 'spry',\n        url: 'http://labs.adobe.com/technologies/spry',\n        test: function(win) {\n            if (win.Spry && win.Spry.Data) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'YUI 2': {\n        icon: 'yui',\n        url: 'http://developer.yahoo.com/yui/2/',\n        test: function(win) {\n            if (win.YAHOO && win.YAHOO.util) {\n                return { version: win.YAHOO.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'YUI 3': {\n        icon: 'yui3',\n        url: 'https://yuilibrary.com/',\n        npm: 'yui',\n        test: function(win) {\n            if (win.YUI && win.YUI.Env) {\n                return { version: win.YUI.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Qooxdoo': {\n        icon: 'qooxdoo',\n        url: 'http://www.qooxdoo.org/',\n        npm: 'qooxdoo',\n        test: function(win) {\n            if(win.qx && win.qx.Bootstrap) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Ext JS': {\n        icon: 'extjs',\n        url: 'https://www.sencha.com/products/extjs/',\n        test: function(win) {\n            if (win.Ext && win.Ext.versions) {\n                return { version: win.Ext.versions.core.version };\n            }\n            else if(win.Ext) {\n                return { version: win.Ext.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'base2': {\n        icon: 'base2',\n        url: 'http://code.google.com/p/base2',\n        test: function(win) {\n            if(win.base2 && win.base2.dom) {\n                return { version: win.base2.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Closure Library': {\n        icon: 'closure',\n        url: 'https://developers.google.com/closure/library/',\n        npm: 'google-closure-library',\n        test: function(win) {\n            if(win.goog && win.goog.provide) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Rapha&euml;l': {\n        icon: 'raphael',\n        url: 'http://dmitrybaranovskiy.github.io/raphael/',\n        test: function(win) {\n            if (win.Raphael && win.Raphael.circle) {\n                return { version: win.Raphael.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'React': {\n        icon: 'react',\n        url: 'https://reactjs.org/',\n        npm: 'react',\n        test: function(win) {\n            function isMatch(node) {\n                return node!=null && node._reactRootContainer!=null;\n            }\n            function nodeFilter(node) {\n                return isMatch(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;\n            }\n            var reactRoot = document.getElementById('react-root');\n            var altHasReact = document.querySelector('*[data-reactroot]');\n            var bodyReactRoot = isMatch(document.body) || isMatch(document.body.firstElementChild);\n            var hasReactRoot = bodyReactRoot|| document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT, nodeFilter).nextNode() != null;\n            if (hasReactRoot || reactRoot && reactRoot.innerText.length > 0 || altHasReact || win.React && win.React.Component) {\n                return { version: win.React && win.React.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'React (Fast path)': {\n        icon: 'react',\n        url: 'https://reactjs.org/',\n        npm: 'react',\n        test: function (win) {\n            function isMatch(node) {\n                return node != null && node._reactRootContainer != null;\n            }\n            var reactRoot = document.getElementById('react-root');\n            var altHasReact = document.querySelector('*[data-reactroot]');\n            var hasReactRoot = isMatch(document.body) || isMatch(document.body.firstElementChild);\n            if (hasReactRoot || reactRoot || altHasReact || win.React) {\n                return { version: win.React && win.React.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Next.js': {\n        icon: 'next',\n        url: 'https://nextjs.org/',\n        npm: 'next',\n        test: function(win) {\n            if (win.__NEXT_DATA__ && win.__NEXT_DATA__.buildId) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Next.js (Fast path)': {\n        icon: 'next',\n        url: 'https://nextjs.org/',\n        npm: 'next',\n        test: function (win) {\n            if (win.__NEXT_DATA__) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Preact': {\n        icon: 'preact',\n        url: 'https://preactjs.com/',\n        npm: 'preact',\n        test: function(win) {\n            var expando = typeof Symbol!='undefined' && Symbol.for && Symbol.for('preactattr');\n            function isMatch(node) {\n                return node._component!=null || node.__preactattr_!=null || expando && node[expando]!=null;\n            }\n            function getMatch(node) {\n                return node!=null && isMatch(node) && node;\n            }\n            function nodeFilter(node) {\n                return isMatch(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;\n            }\n            var preactRoot = getMatch(document.body) || getMatch(document.body.firstElementChild);\n            if (!preactRoot) {\n                preactRoot = document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT, nodeFilter).nextNode();\n            }\n            if (preactRoot || win.preact) {\n                var version = UNKNOWN_VERSION;\n                if (expando && preactRoot && preactRoot[expando]!=null) {\n                    version = '7';\n                }\n                return { version: version };\n            }\n            return false;\n        }\n    },\n\n    'Preact (Fast path)': {\n        icon: 'preact',\n        url: 'https://preactjs.com/',\n        npm: 'preact',\n        test: function (win) {\n            function isMatch(node) {\n                return node._component != null || node.__preactattr_ != null;\n            }\n            function getMatch(node) {\n                return node != null && isMatch(node);\n            }\n            var preactRoot = getMatch(document.body) || getMatch(document.body.firstElementChild);\n            if (preactRoot || win.preact) {\n                var version = UNKNOWN_VERSION;\n                return { version: version };\n            }\n            return false;\n        }\n    },\n\n    'Modernizr': {\n        icon: 'modernizr',\n        url: 'https://modernizr.com/',\n        npm: 'modernizr',\n        test: function(win) {\n            if (win.Modernizr && win.Modernizr.addTest) {\n                return { version: win.Modernizr._version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Processing.js': {\n        icon: 'processingjs',\n        url: 'http://processingjs.org',\n        npm: 'processing-js',\n        test: function(win) {\n            if(win.Processing && win.Processing.box) {\n                return { version: Processing.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Backbone': {\n        icon: 'backbone',\n        url: 'http://backbonejs.org/',\n        npm: 'backbone',\n        test: function(win) {\n            if (win.Backbone && win.Backbone.Model.extend) {\n                return {version: win.Backbone.VERSION || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Leaflet': {\n        icon: 'leaflet',\n        url: 'http://leafletjs.com',\n        npm: 'leaflet',\n        test: function(win) {\n            // Leaflet 3.1 uses L.Marker and L.VERSION; later versions use L.marker and L.version\n            if (win.L && win.L.GeoJSON && (win.L.marker || win.L.Marker)) {\n                return { version: win.L.version || win.L.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Mapbox': {\n        icon: 'mapbox',\n        url: 'https://www.mapbox.com/',\n        npm: 'mapbox-gl',\n        test: function(win) {\n            if (win.L && win.L.mapbox && win.L.mapbox.geocoder) {\n                return { version: win.L.mapbox.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Lo-Dash': {\n        icon: 'lodash',\n        url: 'https://lodash.com/',\n        npm: 'lodash',\n        test: function(win) {\n            var _ = typeof (_ = win._) == 'function' && _,\n                chain = typeof (chain = _ && _.chain) == 'function' && chain,\n                wrapper = (chain || _ || function() { return {}; })(1);\n\n            if (_ && wrapper.__wrapped__) {\n                return { version: _.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Underscore': {\n        icon: 'underscore',\n        url: 'http://underscorejs.org/',\n        npm: 'underscore',\n        test: function(win) {\n            if (win._ && typeof win._.tap === 'function' &&\n                !d41d8cd98f00b204e9800998ecf8427e_LibraryDetectorTests['Lo-Dash'].test(win)) {\n                return {version: win._.VERSION || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Sammy': {\n        icon: 'sammy',\n        url: 'http://sammyjs.org',\n        test: function(win) {\n            if (win.Sammy && win.Sammy.Application.curry) {\n                return {version: win.Sammy.VERSION || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Rico': {\n        icon: 'rico',\n        url: 'http://openrico.sourceforge.net/examples/index.html',\n        test:  function(win) {\n            if (win.Rico && window.Rico.checkIfComplete) {\n                return {version: win.Rico.Version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'MochiKit': {\n        icon: 'mochikit',\n        url: 'https://mochi.github.io/mochikit/',\n        test: function(win) {\n            if (win.MochiKit && win.MochiKit.Base.module) {\n                return {version: MochiKit.VERSION || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'gRapha&euml;l': {\n        icon: 'graphael',\n        url: 'https://github.com/DmitryBaranovskiy/g.raphael',\n        test: function(win) {\n            if (win.Raphael && win.Raphael.fn.g) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Glow': {\n        icon: 'glow',\n        url: 'http://www.bbc.co.uk/glow/',\n        test: function(win) {\n            if (win.gloader && win.gloader.getRequests) {\n                return {version: UNKNOWN_VERSION};\n            }\n            else if (win.glow && win.glow.dom) {\n                return {version: win.glow.VERSION || UNKNOWN_VERSION};\n            }\n            else if (win.Glow) {\n                return {version: win.Glow.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Socket.IO': {\n        icon: 'socketio', // currently has no icon\n        url: 'https://socket.io/',\n        npm: 'socket.io',\n        test: function(win) {\n            // version 0.6.2 uses only io.Socket; more recent versions also have io.sockets\n            if (win.io && (win.io.sockets || win.io.Socket)) {\n                return {version: win.io.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Mustache': {\n        icon: 'mustache',\n        url: 'http://mustache.github.io/',\n        npm: 'mustache',\n        test: function(win) {\n            if (win.Mustache && win.Mustache.to_html) {\n                return {version: win.Mustache.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Fabric.js': {\n        icon: 'icon38', // currently has no icon\n        url: 'http://fabricjs.com/',\n        npm: 'fabric',\n        test: function(win) {\n            if (win.fabric && win.fabric.util) {\n                return {version: win.fabric.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'FuseJS': {\n        icon: 'fusejs',\n        url: 'http://fusejs.io/',\n        npm: 'fuse.js',\n        test: function(win) {\n            if (win.Fuse) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Tween.js': {\n        icon: 'icon38', // currently has no icon\n        url: 'https://github.com/tweenjs/tween.js',\n        npm: 'tween.js',\n        test: function(win) {\n            if (win.TWEEN && win.TWEEN.Easing) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'SproutCore': {\n       icon: 'sproutcore',\n       url: 'http://sproutcore.com/',\n       test: function(win) {\n           if (win.SC && win.SC.Application) {\n               return {version: UNKNOWN_VERSION};\n           }\n           return false;\n       }\n    },\n\n    'Zepto.js': {\n       icon: 'zepto',\n       url: 'http://zeptojs.com',\n       npm: 'zepto',\n       test: function(win) {\n           if (win.Zepto && win.Zepto.fn) {\n               return {version: UNKNOWN_VERSION};\n           }\n           return false;\n       }\n    },\n\n    'three.js': {\n       icon: 'icon38', // currently has no icon\n       url: 'https://threejs.org/',\n       npm: 'three',\n       test: function(win) {\n           if (win.THREE && win.THREE.REVISION) {\n               return {version: 'r' + win.THREE.REVISION};\n           }\n           else if (win.THREE) {\n               return {version: UNKNOWN_VERSION};\n           }\n           return false;\n       }\n    },\n\n    'PhiloGL': {\n       icon: 'philogl',\n       url: 'http://www.senchalabs.org/philogl/',\n       npm: 'philogl',\n       test: function(win) {\n           if (win.PhiloGL && win.PhiloGL.Camera) {\n               return {version: win.PhiloGL.version || UNKNOWN_VERSION};\n           }\n           return false;\n       }\n    },\n\n    'CamanJS': {\n        icon: 'camanjs',\n        url: 'http://camanjs.com/',\n        npm: 'caman',\n        test: function(win) {\n            if (win.Caman && win.Caman.version) {\n                return {version: win.Caman.version.release};\n            }\n            else if (win.Caman) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'yepnope': {\n        icon: 'yepnope',\n        url: 'http://yepnopejs.com/',\n        test: function(win) {\n            if (win.yepnope && win.yepnope.injectJs) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'LABjs': {\n        icon: 'icon38',\n        url: 'https://github.com/getify/LABjs',\n        test: function(win) {\n            if (win.$LAB && win.$LAB.setOptions) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Head JS': {\n        icon: 'headjs',\n        url: 'http://headjs.com/',\n        npm: 'headjs',\n        test: function(win) {\n            if (win.head && win.head.js) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'ControlJS': {\n        icon: 'icon38',\n        url: 'http://stevesouders.com/controljs/',\n        test: function(win) {\n            if (win.CJS && win.CJS.start) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'RequireJS': {\n        icon: 'requirejs',\n        url: 'http://requirejs.org/',\n        npm: 'requirejs',\n        test: function(win) {\n            var req = win.require || win.requirejs;\n            if (req && (req.load || (req.s && req.s.contexts && req.s.contexts._ && (req.s.contexts._.loaded || req.s.contexts._.load)))) {\n                return { version: req.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'RightJS': {\n        icon: 'rightjs',\n        url: 'http://rightjs.org/',\n        test: function(win) {\n            if (win.RightJS && win.RightJS.isNode) {\n                return { version: win.RightJS.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'jQuery Tools': {\n       icon: 'jquerytools',\n       url: 'http://jquerytools.github.io/',\n       test: function(win) {\n            var jq = win.jQuery || win.$;\n            if(jq && jq.tools) {\n               return { version: jq.tools.version || UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'Pusher': {\n       icon: 'pusher',\n       url: 'https://pusher.com/docs/',\n       npm: 'pusher-js',\n       test: function(win) {\n            if(win.Pusher && win.Pusher.Channel) {\n               return { version: win.Pusher.VERSION || UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'Paper.js': {\n       icon: 'paperjs',\n       url: 'http://paperjs.org/',\n       npm: 'paper',\n       test: function(win) {\n            if(win.paper && win.paper.Point) {\n               return { version: win.paper.version || UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'Swiffy': {\n       icon: 'icon38',\n       url: 'https://developers.google.com/swiffy/',\n       test: function(win) {\n            if(win.swiffy && win.swiffy.Stage) {\n               return { version: UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'Move': {\n       icon: 'move',\n       url: 'https://github.com/rsms/move',\n       npm: 'move',\n       test: function(win) {\n            if(win.move && win.move.compile) {\n               return { version: win.move.version() || UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'AmplifyJS': {\n       icon: 'amplifyjs',\n       url: 'http://amplifyjs.com/',\n       npm: 'amplifyjs',\n       test: function(win) {\n            if(win.amplify && win.amplify.publish) {\n               return { version: UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'Popcorn.js': {\n       icon: 'popcornjs',\n       url: 'https://github.com/mozilla/popcorn-js/',\n       test: function(win) {\n            if (win.Popcorn && win.Popcorn.Events) {\n               return { version: win.Popcorn.version || UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'D3': {\n        icon: 'd3',\n        url: 'https://d3js.org/',\n        npm: 'd3',\n        test: function(win) {\n            if (win.d3 && win.d3.select) {\n                return { version: win.d3.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Handlebars': {\n        icon: 'handlebars',\n        url: 'http://handlebarsjs.com/',\n        npm: 'handlebars',\n        test: function(win) {\n            if(win.Handlebars && win.Handlebars.compile) {\n                return { version: win.Handlebars.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Knockout': {\n        icon: 'knockout',\n        url: 'http://knockoutjs.com/',\n        npm: 'knockout',\n        test: function(win) {\n            if (win.ko && win.ko.applyBindings) {\n                return { version: win.ko.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Spine': {\n        icon: 'icon38',\n        url: 'http://spine.github.io/',\n        test: function(win) {\n            if (win.Spine && win.Spine.Controller) {\n                return {version: win.Spine.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'jQuery Mobile': {\n        icon: 'jquery_mobile',\n        url: 'http://jquerymobile.com/',\n        npm: 'jquery-mobile',\n        test: function(win) {\n            var jq = win.jQuery || win.$ || win.$jq || win.$j;\n            if(jq && jq.fn && jq.fn.jquery && jq.mobile) {\n                return { version: jq.mobile.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'WebFont Loader': {\n        icon: 'icon38',\n        url: 'https://github.com/typekit/webfontloader',\n        npm: 'webfontloader',\n        test: function(win) {\n            if(win.WebFont && win.WebFont.load) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Angular': {\n        icon: 'angular',\n        url: 'https://angular.io/',\n        npm: '@angular/core',\n        test: function(win) {\n            var ngVersion = win.document.querySelector('[ng-version]');\n            if (ngVersion) {\n                return { version: ngVersion.getAttribute('ng-version') || UNKNOWN_VERSION };\n            }\n            else if (win.ng && win.ng.probe instanceof Function) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'AngularJS': {\n        icon: 'angularjs',\n        url: 'https://angularjs.org/',\n        npm: 'angular',\n        test: function(win) {\n            var ng = win.angular;\n            if(ng && ng.version && ng.version.full) {\n                return { version: ng.version.full };\n            }\n            else if (ng) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Ember.js': {\n        icon: 'emberjs',\n        url: 'https://emberjs.com/',\n        npm: 'ember-source',\n        test: function(win) {\n            var ember = win.Ember || win.Em;\n            if (ember && ember.GUID_KEY) {\n                return { version: ember.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Ember.js (Fast path)': {\n        icon: 'emberjs',\n        url: 'https://emberjs.com/',\n        npm: 'ember-source',\n        test: function (win) {\n            var ember = win.Ember || win.Em;\n            if (ember) {\n                return { version: ember.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Hammer.js': {\n        icon: 'hammerjs',\n        url: 'http://eightmedia.github.io/hammer.js/',\n        npm: 'hammerjs',\n        test: function(win) {\n            if(win.Hammer && win.Hammer.Pinch) {\n                // Hammer.VERSION available in 1.0.10+\n                return { version: win.Hammer.VERSION || \"&lt; 1.0.10\" };\n            }\n            return false;\n        }\n    },\n\n    'Visibility.js': {\n        icon: 'icon38',\n        url: 'https://github.com/ai/visibilityjs',\n        npm: 'visibilityjs',\n        test: function(win) {\n            if(win.Visibility && win.Visibility.every) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Velocity.js': {\n        icon: 'icon38',\n        url: 'http://velocityjs.org/',\n        npm: 'velocity-animate',\n        test: function(win) {\n            var jq = win.jQuery || win.$,\n                velocity = jq ? jq.Velocity : win.Velocity;\n\n            if(velocity && velocity.RegisterEffect && velocity.version) {\n                return {\n                    version:\n                        velocity.version.major + \".\" +\n                        velocity.version.minor + \".\" +\n                        velocity.version.patch\n                };\n            }\n            else if (velocity && velocity.RegisterEffect) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'IfVisible.js': {\n        icon: 'icon38',\n        url: 'http://serkanyersen.github.io/ifvisible.js/',\n        npm: 'ifvisible.js',\n        test: function(win) {\n            var iv = win.ifvisible;\n            if(iv && iv.__ceGUID === \"ifvisible.object.event.identifier\") {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Pixi.js': {\n        icon: 'pixi',\n        url: 'http://www.pixijs.com/',\n        npm: 'pixi.js',\n        test: function(win) {\n            var px = win.PIXI;\n            if(px && px.WebGLRenderer && px.VERSION) {\n                // version 4.4.3 returns simply \"4.4.3\"; version 1.5.2 returns \"v1.5.2\"\n                return { version: px.VERSION.replace('v', '') || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'DC.js': {\n        icon: 'dcjs',\n        url: 'http://dc-js.github.io/dc.js/',\n        npm: 'dc',\n        test: function(win) {\n            var dc = win.dc;\n            if(dc && dc.registerChart) {\n                return { version: dc.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'GreenSock JS': {\n        icon: 'greensock',\n        url: 'https://greensock.com/gsap',\n        npm: 'gsap',\n        test: function(win) {\n            if (win.TweenMax && win.TweenMax.pauseAll) {\n                return { version: win.TweenMax.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'FastClick': {\n        icon: 'fastclick',\n        url: 'https://github.com/ftlabs/fastclick',\n        npm: 'fastclick',\n        test: function(win) {\n            if(win.FastClick && win.FastClick.notNeeded) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Isotope': {\n        icon: 'isotope',\n        url: 'https://isotope.metafizzy.co/',\n        npm: 'isotope-layout',\n        test: function(win) {\n            if(win.Isotope || (win.$ != null && win.$.Isotope)) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Marionette': {\n        icon: 'marionette',\n        url: 'https://marionettejs.com/',\n        npm: 'backbone.marionette',\n        test: function(win) {\n            if(win.Marionette && win.Marionette.Application) {\n                return { version: win.Marionette.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Can': {\n        icon: 'canjs',\n        url: 'https://canjs.com/',\n        npm: 'can',\n        test: function (win) {\n            if (win.can && win.can.Construct) {\n                return { version: win.can.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Vue': {\n        icon: 'vue',\n        url: 'https://vuejs.org/',\n        npm: 'vue',\n        test: function(win) {\n            function isVueNode(node) {\n                return node.__vue__ != null ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;\n            }\n            var hasVueNode = document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT, isVueNode).nextNode() !== null;\n            if (hasVueNode) {\n                return { version: win.Vue && win.Vue.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Vue (Fast path)': {\n        icon: 'vue',\n        url: 'https://vuejs.org/',\n        npm: 'vue',\n        test: function (win) {\n            if (win.Vue) {\n                return { version: win.Vue && win.Vue.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Nuxt.js': {\n        icon: 'nuxt',\n        url: 'https://nuxtjs.org/',\n        npm: 'nuxt',\n        test: function(win) {\n            if ((win.__NUXT__ && win.__NUXT__.data != null) || win.$nuxt) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Nuxt.js (Fast path)': {\n        icon: 'nuxt',\n        url: 'https://nuxtjs.org/',\n        npm: 'nuxt',\n        test: function (win) {\n            if (win.__NUXT__  || win.$nuxt) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Two': {\n        icon: 'two',\n        url: 'https://two.js.org/',\n        npm: 'two.js',\n        test: function(win) {\n            if (win.Two && win.Two.Utils) {\n                return { version: win.Two.Version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Brewser': {\n        icon: 'brewser',\n        url: 'https://robertpataki.github.io/brewser/',\n        npm: 'brewser',\n        test: function(win) {\n            if(win.BREWSER && win.BREWSER.ua) {\n                return { version: BREWSER.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Material Design Lite': {\n        icon: 'mdl',\n        url: 'https://getmdl.io/',\n        npm: 'material-design-lite',\n        test: function(win) {\n            if(win.componentHandler && win.componentHandler.upgradeElement) {\n                return { version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n    'Kendo UI': {\n        icon: 'kendoui',\n        url: 'https://github.com/telerik/kendo-ui-core',\n        npm: 'kendo-ui-core',\n        test: function(win) {\n            if (win.kendo && win.kendo.View && win.kendo.View.extend) {\n                return {version: win.kendo.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n    'Matter.js': {\n        icon: 'matter-js',\n        url: 'http://brm.io/matter-js/',\n        npm: 'matter-js',\n        test: function(win) {\n            if (win.Matter && win.Matter.Engine) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n    'Riot': {\n        icon: 'riot',\n        url: 'http://riotjs.com/',\n        npm: 'riot',\n        test: function(win) {\n            if (win.riot && win.riot.mixin) {\n                return { version: win.riot.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Sea.js': {\n        icon: 'icon38',\n        url: 'https://seajs.github.io/seajs/docs/',\n        npm: 'seajs',\n        test: function(win) {\n            if(win.seajs && win.seajs.use) {\n                return { version: win.seajs.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Moment.js': {\n        icon: 'momentjs',\n        url: 'http://momentjs.com/',\n        npm: 'moment',\n        test: function(win) {\n            if(win.moment && (win.moment.isMoment || win.moment.lang)) {\n                // version 1.0.0 has neither \"isMoment\" nor \"version\"\n                return { version: win.moment.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Moment Timezone': {\n        icon: 'momentjs',\n        url: 'http://momentjs.com/timezone/',\n        npm: 'moment-timezone',\n        test: function(win) {\n            if (win.moment && win.moment.tz) {\n                return { version: win.moment.tz.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'ScrollMagic': {\n        icon: 'scrollmagic',\n        url: 'http://scrollmagic.io/',\n        npm: 'scrollmagic',\n        test: function(win) {\n            if (win.ScrollMagic && win.ScrollMagic.Controller) {\n                return {version: ScrollMagic.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n    'SWFObject': {\n        icon: 'icon38', // currently has no icon\n        url: 'https://github.com/swfobject/swfobject',\n        test: function(win) {\n            if (win.swfobject && win.swfobject.embedSWF) {\n                // 2.x - exact version only for 2.3\n                return { version: win.swfobject.version || UNKNOWN_VERSION };\n            } else if(win.deconcept && win.deconcept.SWFObject) {\n                // 1.x\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'FlexSlider': {\n        icon: 'icon38', // currently has no icon\n        url: 'https://woocommerce.com/flexslider/',\n        npm: 'flexslider',\n        test: function(win) {\n            var jq = win.jQuery || win.$ || win.$jq || win.$j;\n            if (jq && jq.fn && jq.fn.jquery && jq.flexslider){\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'SPF': {\n        icon: 'icon38', // currently has no icon\n        url: 'https://youtube.github.io/spfjs/',\n        npm: 'spf',\n        test: function(win) {\n            if (win.spf && win.spf.init) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Numeral.js': {\n        icon: 'icon38', // currently has no icon\n        url: 'http://numeraljs.com/',\n        npm: 'numeraljs',\n        test: function(win) {\n            if (win.numeral && win.isNumeral) {\n                return { version: win.numeral.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'boomerang.js': {\n        icon: 'icon38', // currently has no icon\n        url: 'https://soasta.github.io/boomerang/',\n        npm: 'boomerangjs',\n        test: function(win) {\n            if (win.BOOMR && win.BOOMR.utils && win.BOOMR.init) {\n                return { version: win.BOOMR.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Framer': {\n        icon: 'framer',\n        url: 'https://framer.com/',\n        npm: 'framerjs',\n        test: function(win) {\n            if (win.Framer && win.Framer.Layer) {\n                return { version: win.Framer.Version.build || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Marko': {\n        icon: 'marko',\n        url: 'https://markojs.com/',\n        npm: 'marko',\n        test: function (win) {\n            var selector = '[data-marko-key], [data-marko]';\n            var markoElement = document.querySelector(selector);\n            if (markoElement) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'AMP': {\n        icon: 'amp',\n        url: 'https://ampproject.org/',\n        npm: null,\n        test: function (win) {\n            var version = win.document.documentElement.getAttribute(\"amp-version\");\n            return version ? { version: version } : false;\n        }\n    },\n    'Gatsby': {\n        icon: 'gatsby',\n        url: 'https://www.gatsbyjs.org/',\n        npm: 'gatsby',\n        test: function (win) {\n            if (document.getElementById('___gatsby')) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Shopify': {\n        icon: 'shopify',\n        url: 'https://www.shopify.com/',\n        npm: null,\n        test: function (win) {\n            if (win.Shopify && win.Shopify.shop) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Magento': {\n        icon: 'magento',\n        url: 'https://magento.com/',\n        npm: null,\n        test: function (win) {\n            // Same detecton used in Magento 2 DevTools: https://github.com/magento/m2-devtools\n            const reRequireScript = /\\/static(?:\\/version\\d+)?\\/frontend\\/.+\\/.+\\/requirejs\\/require(?:\\.min)?\\.js/;\n            const scripts = Array.from(document.querySelectorAll('script[src]') || []);\n            if (scripts.some(s => reRequireScript.test(s.src))) {\n                return { version: 2 }; // Magento 1 is no longer supported and this only verifies version 2\n            }\n            \n            return false;\n        }\n    },\n    'WordPress': {\n        icon: 'wordpress',\n        url: 'https://wordpress.org/',\n        npm: null,\n        test: function (win) {\n            const hasAPILinkElem = !!document.querySelector('link[rel=\"https://api.w.org/\"]');\n            const hasWPIncludes = !!document.querySelectorAll('link[href*=\"wp-includes\"], script[src*=\"wp-includes\"]').length;\n\n            if (!hasAPILinkElem && !hasWPIncludes) return false;\n\n            const generatorMeta = document.querySelector('meta[name=generator][content^=\"WordPress\"]');\n            const version = generatorMeta ? generatorMeta.getAttribute(\"content\").replace(/^\\w+\\s/,'') : UNKNOWN_VERSION;\n            return { version };\n        }\n    },\n    'Wix': {\n        icon: 'wix',\n        url: 'https://www.wix.com/',\n        npm: null,\n        test: function (win) {\n            if (win.wixBiSession) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Workbox': {\n      icon: 'workbox',\n      url: 'https://developers.google.com/web/tools/workbox/',\n      npm: 'workbox-sw',\n      test: async function (win) {\n        var nav = win.navigator;\n        // Service Workers not supported\n        if (!('serviceWorker' in nav)) {\n          return false;\n        }\n        return nav.serviceWorker.getRegistration()\n        .then(function(registration) {\n          var scriptURL = nav.serviceWorker.controller.scriptURL;\n          return fetch(scriptURL, { credentials: 'include',\n            headers: { 'service-worker': 'script' }\n          })\n          .then(function(response) {\n            return response.text();\n          })\n          .then(function(scriptContent) {\n            var workboxRegExp = /new Workbox|new workbox|workbox\\.precaching\\.|workbox\\.strategies/gm;\n            if (workboxRegExp.test(scriptContent)) {\n              // Adapted from\n              // https://github.com/semver/semver/issues/232#issue-48635632\n              var semVerRegExp = /workbox.*?\\b((0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(-(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\\+[0-9a-zA-Z-]+(\\.[0-9a-zA-Z-]+)*)?)\\b/gim;\n              var matches = semVerRegExp.exec(scriptContent);\n              var version = UNKNOWN_VERSION;\n              if (Array.isArray(matches) && matches.length > 1 && matches[1]) {\n                version = matches[1];\n              }\n              return { version: version };\n            }\n            return false;\n          });\n        }).catch(function(exception) {\n          return false;\n        });\n      }\n    }\n};\n";
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-async function detectLibraries(){
-
-const libraries=[];
-
-
-
-
-
-const libraryDetectorTests=d41d8cd98f00b204e9800998ecf8427e_LibraryDetectorTests;
-
-for(const[name,lib]of Object.entries(libraryDetectorTests)){
-try{
-const result=await lib.test(window);
-if(result){
-libraries.push({
-name:name,
-icon:lib.icon,
-version:result.version,
-npm:lib.npm});
-
-}
-}catch(e){}
-}
-
-return libraries;
-}
-
-
-
-
-
-async function collectStacks(passContext){
-const expression=`(function () {
-    ${libDetectorSource};
-    return (${detectLibraries.toString()}());
-  })()`;
-
-
-const jsLibraries=await passContext.driver.evaluateAsync(expression);
-
-return jsLibraries.map(lib=>({
-detector:'js',
-id:lib.npm||lib.icon,
-name:lib.name,
-version:lib.version||undefined,
-npm:lib.npm||undefined}));
-
-}
-
-module.exports=collectStacks;
-
-},{}],80:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const stackPacks=require('../../stack-packs/index.js');
-const log=require('lighthouse-logger');
-
-
-
-
-
-
-const stackPacksToInclude=[
-{
-packId:'wordpress',
-requiredStacks:['js:wordpress']},
-
-{
-packId:'react',
-requiredStacks:['js:react']},
-
-{
-packId:'angular',
-requiredStacks:['js:@angular/core']},
-
-{
-packId:'amp',
-requiredStacks:['js:amp']},
-
-{
-packId:'magento',
-requiredStacks:['js:magento']}];
-
-
-
-
-
-
-
-
-function getStackPacks(pageStacks){
-
-const packs=[];
-
-for(const pageStack of pageStacks){
-const stackPackToIncl=stackPacksToInclude.find(stackPackToIncl=>
-stackPackToIncl.requiredStacks.includes(`${pageStack.detector}:${pageStack.id}`));
-if(!stackPackToIncl){
-continue;
-}
-
-
-const matchedPack=stackPacks.find(pack=>pack.id===stackPackToIncl.packId);
-if(!matchedPack){
-log.warn('StackPacks',
-`'${stackPackToIncl.packId}' stack pack was matched but is not found in stack-packs lib`);
-continue;
-}
-
-packs.push({
-id:matchedPack.id,
-title:matchedPack.title,
-iconDataURL:matchedPack.iconDataURL,
-descriptions:matchedPack.descriptions});
-
-}
-
-return packs;
-}
-
-module.exports={
-getStackPacks};
-
-
-},{"../../stack-packs/index.js":193,"lighthouse-logger":125}],81:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-
-
-function erf(x){
-
-const sign=Math.sign(x);
-x=Math.abs(x);
-
-const a1=0.254829592;
-const a2=-0.284496736;
-const a3=1.421413741;
-const a4=-1.453152027;
-const a5=1.061405429;
-const p=0.3275911;
-const t=1/(1+p*x);
-const y=t*(a1+t*(a2+t*(a3+t*(a4+t*a5))));
-return sign*(1-y*Math.exp(-x*x));
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function getLogNormalDistribution(median,falloff){
-const location=Math.log(median);
-
-
-
-
-const logRatio=Math.log(falloff/median);
-const shape=Math.sqrt(1-3*logRatio-Math.sqrt((logRatio-3)*(logRatio-3)-8))/2;
-
-return{
-computeComplementaryPercentile(x){
-const standardizedX=(Math.log(x)-location)/(Math.SQRT2*shape);
-return(1-erf(standardizedX))/2;
-}};
-
-}
-
-
-
-
-
-
-
-
-
-
-function linearInterpolation(x0,y0,x1,y1,x){
-const slope=(y1-y0)/(x1-x0);
-return y0+(x-x0)*slope;
-}
-
-module.exports={
-linearInterpolation,
-getLogNormalDistribution};
-
-
-},{}],82:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const{
-filterOutRectsContainedByOthers,
-filterOutTinyRects,
-rectsTouchOrOverlap,
-rectContainsPoint,
-getBoundingRect,
-getRectCenterPoint}=
-require('./rect-helpers.js');
-
-
-
-
-
-
-
-function getTappableRectsFromClientRects(clientRects){
-
-
-clientRects=filterOutTinyRects(clientRects);
-clientRects=filterOutRectsContainedByOthers(clientRects);
-clientRects=mergeTouchingClientRects(clientRects);
-return clientRects;
-}
-
-
-
-
-
-
-
-
-
-function almostEqual(a,b){
-return Math.abs(a-b)<=10;
-}
-
-
-
-
-
-
-function mergeTouchingClientRects(clientRects){
-for(let i=0;i<clientRects.length;i++){
-for(let j=i+1;j<clientRects.length;j++){
-const crA=clientRects[i];
-const crB=clientRects[j];
-
-
-
-
-
-
-
-
-
-
-
-
-const rectsLineUpHorizontally=
-almostEqual(crA.top,crB.top)||almostEqual(crA.bottom,crB.bottom);
-const rectsLineUpVertically=
-almostEqual(crA.left,crB.left)||almostEqual(crA.right,crB.right);
-const canMerge=
-rectsTouchOrOverlap(crA,crB)&&(
-rectsLineUpHorizontally||rectsLineUpVertically);
-
-if(canMerge){
-const replacementClientRect=getBoundingRect([crA,crB]);
-const mergedRectCenter=getRectCenterPoint(replacementClientRect);
-
-if(
-!(
-rectContainsPoint(crA,mergedRectCenter)||
-rectContainsPoint(crB,mergedRectCenter)))
-
-{
-
-
-
-continue;
-}
-
-
-clientRects=clientRects.filter(cr=>cr!==crA&&cr!==crB);
-clientRects.push(replacementClientRect);
-
-
-
-return mergeTouchingClientRects(clientRects);
-}
-}
-}
-
-return clientRects;
-}
-
-module.exports={
-getTappableRectsFromClientRects};
-
-
-},{"./rect-helpers.js":77}],83:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const{taskGroups,taskNameToGroup}=require('./task-groups.js');
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-class MainThreadTasks{
-
-
-
-
-
-static _createNewTaskNode(event,endEvent){
-const isCompleteEvent=event.ph==='X'&&!endEvent;
-const isStartEndEventPair=event.ph==='B'&&endEvent&&endEvent.ph==='E';
-if(!isCompleteEvent&&!isStartEndEventPair){
-throw new Error('Invalid parameters for _createNewTaskNode');
-}
-
-const startTime=event.ts;
-const endTime=endEvent?endEvent.ts:event.ts+Number(event.dur||0);
-
-const newTask={
-event,
-startTime,
-endTime,
-duration:endTime-startTime,
-
-
-unbounded:false,
-parent:undefined,
-children:[],
-attributableURLs:[],
-group:taskGroups.other,
-selfTime:NaN};
-
-
-return newTask;
-}
-
-
-
-
-
-
-
-
-static _assignAllTimersUntilTs(
-currentTask,
-stopTs,
-priorTaskData,
-reverseEventsQueue)
-{
-while(reverseEventsQueue.length){
-const nextTimerInstallEvent=reverseEventsQueue.pop();
-
-if(!nextTimerInstallEvent)break;
-
-
-if(nextTimerInstallEvent.ts>stopTs){
-reverseEventsQueue.push(nextTimerInstallEvent);
-break;
-}
-
-
-if(nextTimerInstallEvent.ts<currentTask.startTime){
-continue;
-}
-
-
-
-
-const timerId=nextTimerInstallEvent.args.data.timerId;
-priorTaskData.timers.set(timerId,currentTask);
-}
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-static _createTasksFromStartAndEndEvents(taskStartEvents,taskEndEvents,traceEndTs){
-
-const tasks=[];
-
-
-
-const taskEndEventsReverseQueue=taskEndEvents.slice().reverse();
-
-for(let i=0;i<taskStartEvents.length;i++){
-const taskStartEvent=taskStartEvents[i];
-if(taskStartEvent.ph==='X'){
-
-tasks.push(MainThreadTasks._createNewTaskNode(taskStartEvent));
-continue;
-}
-
-
-let matchedEventIndex=-1;
-let matchingNestedEventCount=0;
-let matchingNestedEventIndex=i+1;
-
-
-
-
-
-for(let j=taskEndEventsReverseQueue.length-1;j>=0;j--){
-const endEvent=taskEndEventsReverseQueue[j];
-
-for(;matchingNestedEventIndex<taskStartEvents.length;matchingNestedEventIndex++){
-if(taskStartEvents[matchingNestedEventIndex].ts>=endEvent.ts)break;
-
-if(taskStartEvents[matchingNestedEventIndex].name===taskStartEvent.name){
-matchingNestedEventCount++;
-}
-}
-
-
-if(endEvent.name!==taskStartEvent.name)continue;
-
-if(endEvent.ts<taskStartEvent.ts)continue;
-
-
-if(matchingNestedEventCount>0){
-
-matchingNestedEventCount--;
-continue;
-}
-
-
-matchedEventIndex=j;
-break;
-}
-
-
-let taskEndEvent;
-let unbounded=false;
-if(matchedEventIndex===-1){
-
-
-taskEndEvent={ph:'E',ts:traceEndTs};
-unbounded=true;
-}else if(matchedEventIndex===taskEndEventsReverseQueue.length-1){
-
-
-taskEndEvent=taskEndEventsReverseQueue.pop();
-}else{
-taskEndEvent=taskEndEventsReverseQueue.splice(matchedEventIndex,1)[0];
-}
-
-const task=MainThreadTasks._createNewTaskNode(taskStartEvent,taskEndEvent);
-task.unbounded=unbounded;
-tasks.push(task);
-}
-
-if(taskEndEventsReverseQueue.length){
-throw new Error(
-`Fatal trace logic error - ${taskEndEventsReverseQueue.length} unmatched end events`);
-
-}
-
-return tasks;
-}
-
-
-
-
-
-
-
-
-
-
-static _createTaskRelationships(sortedTasks,timerInstallEvents,priorTaskData){
-
-let currentTask;
-
-const timerInstallEventsReverseQueue=timerInstallEvents.slice().reverse();
-
-for(let i=0;i<sortedTasks.length;i++){
-let nextTask=sortedTasks[i];
-
-
-
-
-
-while(
-currentTask&&
-Number.isFinite(currentTask.endTime)&&
-currentTask.endTime<=nextTask.startTime)
-{
-MainThreadTasks._assignAllTimersUntilTs(
-currentTask,
-currentTask.endTime,
-priorTaskData,
-timerInstallEventsReverseQueue);
-
-currentTask=currentTask.parent;
-}
-
-
-
-if(currentTask){
-if(nextTask.endTime>currentTask.endTime){
-const timeDelta=nextTask.endTime-currentTask.endTime;
-
-
-if(timeDelta<1000){
-
-currentTask.endTime=nextTask.endTime;
-currentTask.duration+=timeDelta;
-}else if(nextTask.unbounded){
-
-nextTask.endTime=currentTask.endTime;
-nextTask.duration=nextTask.endTime-nextTask.startTime;
-}else if(
-nextTask.startTime-currentTask.startTime<1000&&
-!currentTask.children.length)
-{
-
-
-
-
-
-
-
-
-const actualParentTask=nextTask;
-const actualChildTask=currentTask;
-
-
-
-const grandparentTask=currentTask.parent;
-if(grandparentTask){
-const lastGrandparentChildIndex=grandparentTask.children.length-1;
-if(grandparentTask.children[lastGrandparentChildIndex]!==actualChildTask){
-
-
-throw new Error('Fatal trace logic error - impossible children');
-}
-
-grandparentTask.children.pop();
-grandparentTask.children.push(actualParentTask);
-}
-
-actualParentTask.parent=grandparentTask;
-actualParentTask.startTime=actualChildTask.startTime;
-actualParentTask.duration=actualParentTask.endTime-actualParentTask.startTime;
-currentTask=actualParentTask;
-nextTask=actualChildTask;
-}else{
-
-
-
-
-
-
-
-const error=new Error('Fatal trace logic error - child cannot end after parent');
-error.timeDelta=timeDelta;
-error.nextTaskEvent=nextTask.event;
-error.nextTaskEndTime=nextTask.endTime;
-error.currentTaskEvent=currentTask.event;
-error.currentTaskEndTime=currentTask.endTime;
-throw error;
-}
-}
-
-nextTask.parent=currentTask;
-currentTask.children.push(nextTask);
-MainThreadTasks._assignAllTimersUntilTs(
-currentTask,
-nextTask.startTime,
-priorTaskData,
-timerInstallEventsReverseQueue);
-
-}
-
-currentTask=nextTask;
-}
-
-if(currentTask){
-MainThreadTasks._assignAllTimersUntilTs(
-currentTask,
-currentTask.endTime,
-priorTaskData,
-timerInstallEventsReverseQueue);
-
-}
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-static _createTasksFromEvents(mainThreadEvents,priorTaskData,traceEndTs){
-
-const taskStartEvents=[];
-
-const taskEndEvents=[];
-
-const timerInstallEvents=[];
-
-
-for(const event of mainThreadEvents){
-if(event.ph==='X'||event.ph==='B')taskStartEvents.push(event);
-if(event.ph==='E')taskEndEvents.push(event);
-if(event.name==='TimerInstall')timerInstallEvents.push(event);
-}
-
-
-const tasks=MainThreadTasks._createTasksFromStartAndEndEvents(
-taskStartEvents,
-taskEndEvents,
-traceEndTs);
-
-
-
-const sortedTasks=tasks.sort(
-(taskA,taskB)=>taskA.startTime-taskB.startTime||taskB.duration-taskA.duration);
-
-
-
-MainThreadTasks._createTaskRelationships(sortedTasks,timerInstallEvents,priorTaskData);
-
-
-return sortedTasks.sort(
-(taskA,taskB)=>taskA.startTime-taskB.startTime||taskB.duration-taskA.duration);
-
-}
-
-
-
-
-
-
-static _computeRecursiveSelfTime(task,parent){
-if(parent&&task.endTime>parent.endTime){
-throw new Error('Fatal trace logic error - child cannot end after parent');
-}
-
-const childTime=task.children.
-map(child=>MainThreadTasks._computeRecursiveSelfTime(child,task)).
-reduce((sum,child)=>sum+child,0);
-task.selfTime=task.duration-childTime;
-return task.duration;
-}
-
-
-
-
-
-
-static _computeRecursiveAttributableURLs(task,parentURLs,priorTaskData){
-const argsData=task.event.args.data||{};
-const stackFrameURLs=(argsData.stackTrace||[]).map(entry=>entry.url);
-
-
-let taskURLs=[];
-switch(task.event.name){
-
-
-
-
-
-case'v8.compile':
-case'EvaluateScript':
-case'FunctionCall':
-taskURLs=[argsData.url].concat(stackFrameURLs);
-break;
-case'v8.compileModule':
-taskURLs=[task.event.args.fileName].concat(stackFrameURLs);
-break;
-case'TimerFire':{
-
-
-const timerId=task.event.args.data.timerId;
-const timerInstallerTaskNode=priorTaskData.timers.get(timerId);
-if(!timerInstallerTaskNode)break;
-taskURLs=timerInstallerTaskNode.attributableURLs.concat(stackFrameURLs);
-break;
-}
-default:
-taskURLs=stackFrameURLs;
-break;}
-
-
-
-const attributableURLs=Array.from(parentURLs);
-for(const url of taskURLs){
-
-if(!url)continue;
-
-if(attributableURLs[attributableURLs.length-1]===url)continue;
-attributableURLs.push(url);
-}
-
-task.attributableURLs=attributableURLs;
-task.children.forEach(child=>
-MainThreadTasks._computeRecursiveAttributableURLs(child,attributableURLs,priorTaskData));
-
-}
-
-
-
-
-
-static _computeRecursiveTaskGroup(task,parentGroup){
-const group=taskNameToGroup[task.event.name];
-task.group=group||parentGroup||taskGroups.other;
-task.children.forEach(child=>MainThreadTasks._computeRecursiveTaskGroup(child,task.group));
-}
-
-
-
-
-
-
-static getMainThreadTasks(mainThreadEvents,traceEndTs){
-const timers=new Map();
-const priorTaskData={timers};
-const tasks=MainThreadTasks._createTasksFromEvents(
-mainThreadEvents,
-priorTaskData,
-traceEndTs);
-
-
-
-for(const task of tasks){
-if(task.parent)continue;
-
-MainThreadTasks._computeRecursiveSelfTime(task,undefined);
-MainThreadTasks._computeRecursiveAttributableURLs(task,[],priorTaskData);
-MainThreadTasks._computeRecursiveTaskGroup(task);
-}
-
-
-const firstTs=(tasks[0]||{startTime:0}).startTime;
-for(const task of tasks){
-task.startTime=(task.startTime-firstTs)/1000;
-task.endTime=(task.endTime-firstTs)/1000;
-task.duration/=1000;
-task.selfTime/=1000;
-
-
-if(!Number.isFinite(task.selfTime)){
-throw new Error('Invalid task timing data');
-}
-}
-
-return tasks;
-}}
-
-
-module.exports=MainThreadTasks;
-
-},{"./task-groups.js":84}],84:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const taskGroups={
-parseHTML:{
-id:'parseHTML',
-label:'Parse HTML & CSS',
-traceEventNames:['ParseHTML','ParseAuthorStyleSheet']},
-
-styleLayout:{
-id:'styleLayout',
-label:'Style & Layout',
-traceEventNames:[
-'ScheduleStyleRecalculation',
-'UpdateLayoutTree',
-'InvalidateLayout',
-'Layout']},
-
-
-paintCompositeRender:{
-id:'paintCompositeRender',
-label:'Rendering',
-traceEventNames:[
-'Animation',
-'HitTest',
-'PaintSetup',
-'Paint',
-'PaintImage',
-'RasterTask',
-'ScrollLayer',
-'UpdateLayer',
-'UpdateLayerTree',
-'CompositeLayers']},
-
-
-scriptParseCompile:{
-id:'scriptParseCompile',
-label:'Script Parsing & Compilation',
-traceEventNames:['v8.compile','v8.compileModule','v8.parseOnBackground']},
-
-scriptEvaluation:{
-id:'scriptEvaluation',
-label:'Script Evaluation',
-traceEventNames:[
-'EventDispatch',
-'EvaluateScript',
-'v8.evaluateModule',
-'FunctionCall',
-'TimerFire',
-'FireIdleCallback',
-'FireAnimationFrame',
-'RunMicrotasks',
-'V8.Execute']},
-
-
-garbageCollection:{
-id:'garbageCollection',
-label:'Garbage Collection',
-traceEventNames:[
-'MinorGC',
-'MajorGC',
-'BlinkGC.AtomicPhase',
-
-
-'ThreadState::performIdleLazySweep',
-'ThreadState::completeSweep',
-'BlinkGCMarking']},
-
-
-other:{
-id:'other',
-label:'Other',
-traceEventNames:[
-'MessageLoop::RunTask',
-'TaskQueueManager::ProcessTaskFromWorkQueue',
-'ThreadControllerImpl::DoWork']}};
-
-
-
-
-
-const taskNameToGroup={};
-for(const group of Object.values(taskGroups)){
-for(const traceEventName of group.traceEventNames){
-taskNameToGroup[traceEventName]=group;
-}
-}
-
-module.exports={
-taskGroups,
-taskNameToGroup};
-
-
-},{}],85:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const log=require('lighthouse-logger');
-
-const ACCEPTABLE_NAVIGATION_URL_REGEX=/^(chrome|https?):/;
-
-
-
-const BASE_RESPONSE_LATENCY=16;
-
-const SCHEDULABLE_TASK_TITLE_LH='RunTask';
-
-const SCHEDULABLE_TASK_TITLE_ALT1='ThreadControllerImpl::RunTask';
-
-const SCHEDULABLE_TASK_TITLE_ALT2='ThreadControllerImpl::DoWork';
-
-const SCHEDULABLE_TASK_TITLE_ALT3='TaskQueueManager::ProcessTaskFromWorkQueue';
-
-class TraceProcessor{
-
-
-
-static createNoNavstartError(){
-return new Error('No navigationStart event found');
-}
-
-
-
-
-static createNoTracingStartedError(){
-return new Error('No tracingStartedInBrowser event found');
-}
-
-
-
-
-
-
-static _isNavigationStartOfInterest(event){
-return event.name==='navigationStart'&&(
-!event.args.data||!event.args.data.documentLoaderURL||
-ACCEPTABLE_NAVIGATION_URL_REGEX.test(event.args.data.documentLoaderURL));
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-static _sortTimestampEventGroup(
-tsGroupIndices,
-timestampSortedIndices,
-indexOfTsGroupIndicesStart,
-traceEvents)
-{
-
-
-
-
-
-
-
-
-
-
-
-
-const lookupArrayIndexByTsIndex=i=>timestampSortedIndices[i];
-
-const lookupEventByTsIndex=i=>traceEvents[lookupArrayIndexByTsIndex(i)];
-
-
-const eEventIndices=[];
-
-const bxEventIndices=[];
-
-const otherEventIndices=[];
-
-for(const tsIndex of tsGroupIndices){
-
-const arrayIndex=lookupArrayIndexByTsIndex(tsIndex);
-const event=lookupEventByTsIndex(tsIndex);
-if(event.ph==='E')eEventIndices.push(arrayIndex);else
-if(event.ph==='X'||event.ph==='B')bxEventIndices.push(arrayIndex);else
-otherEventIndices.push(arrayIndex);
-}
-
-
-const effectiveDuration=new Map();
-for(const index of bxEventIndices){
-const event=traceEvents[index];
-if(event.ph==='X'){
-effectiveDuration.set(index,event.dur);
-}else{
-
-let duration=Number.MAX_SAFE_INTEGER;
-
-let additionalNestedEventsWithSameName=0;
-const startIndex=indexOfTsGroupIndicesStart+tsGroupIndices.length;
-for(let j=startIndex;j<timestampSortedIndices.length;j++){
-const potentialMatchingEvent=lookupEventByTsIndex(j);
-const eventMatches=potentialMatchingEvent.name===event.name&&
-potentialMatchingEvent.pid===event.pid&&
-potentialMatchingEvent.tid===event.tid;
-
-
-if(!eventMatches)continue;
-
-if(potentialMatchingEvent.ph==='E'&&additionalNestedEventsWithSameName===0){
-
-duration=potentialMatchingEvent.ts-event.ts;
-break;
-}else if(potentialMatchingEvent.ph==='E'){
-
-additionalNestedEventsWithSameName--;
-}else if(potentialMatchingEvent.ph==='B'){
-
-additionalNestedEventsWithSameName++;
-}
-}
-
-effectiveDuration.set(index,duration);
-}
-}
-
-bxEventIndices.sort((indexA,indexB)=>(effectiveDuration.get(indexB)||0)-(
-effectiveDuration.get(indexA)||0)||indexA-indexB);
-
-otherEventIndices.sort((indexA,indexB)=>indexA-indexB);
-
-return[...eEventIndices,...bxEventIndices,...otherEventIndices];
-}
-
-
-
-
-
-
-
-
-static filteredTraceSort(traceEvents,filter){
-
-const indices=[];
-for(let srcIndex=0;srcIndex<traceEvents.length;srcIndex++){
-if(filter(traceEvents[srcIndex])){
-indices.push(srcIndex);
-}
-}
-
-
-indices.sort((indexA,indexB)=>traceEvents[indexA].ts-traceEvents[indexB].ts);
-
-
-for(let i=0;i<indices.length-1;i++){
-const ts=traceEvents[indices[i]].ts;
-const tsGroupIndices=[i];
-for(let j=i+1;j<indices.length;j++){
-if(traceEvents[indices[j]].ts!==ts)break;
-tsGroupIndices.push(j);
-}
-
-
-if(tsGroupIndices.length===1)continue;
-
-
-const finalIndexOrder=TraceProcessor._sortTimestampEventGroup(
-tsGroupIndices,
-indices,
-i,
-traceEvents);
-
-indices.splice(i,finalIndexOrder.length,...finalIndexOrder);
-
-
-i+=tsGroupIndices.length-1;
-}
-
-
-const sorted=[];
-for(let i=0;i<indices.length;i++){
-sorted.push(traceEvents[indices[i]]);
-}
-
-return sorted;
-}
-
-
-
-
-
-
-
-static assertHasToplevelEvents(events){
-const hasToplevelTask=events.some(this.isScheduleableTask);
-if(!hasToplevelTask){
-throw new Error('Could not find any top level events');
-}
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-static _riskPercentiles(durations,totalTime,percentiles,clippedLength=0){
-let busyTime=0;
-for(let i=0;i<durations.length;i++){
-busyTime+=durations[i];
-}
-busyTime-=clippedLength;
-
-
-let completedTime=totalTime-busyTime;
-let duration=0;
-let cdfTime=completedTime;
-const results=[];
-
-let durationIndex=-1;
-let remainingCount=durations.length+1;
-if(clippedLength>0){
-
-remainingCount--;
-}
-
-
-for(const percentile of percentiles){
-
-
-const percentileTime=percentile*totalTime;
-while(cdfTime<percentileTime&&durationIndex<durations.length-1){
-completedTime+=duration;
-remainingCount-=duration<0?-1:1;
-
-if(clippedLength>0&&clippedLength<durations[durationIndex+1]){
-duration=-clippedLength;
-clippedLength=0;
-}else{
-durationIndex++;
-duration=durations[durationIndex];
-}
-
-
-cdfTime=completedTime+Math.abs(duration)*remainingCount;
-}
-
-
-results.push({
-percentile,
-time:Math.max(0,(percentileTime-completedTime)/remainingCount)+
-BASE_RESPONSE_LATENCY});
-
-}
-
-return results;
-}
-
-
-
-
-
-
-
-
-
-
-
-static getRiskToResponsiveness(
-events,
-startTime,
-endTime,
-percentiles=[0.5,0.75,0.9,0.99,1])
-{
-const totalTime=endTime-startTime;
-percentiles.sort((a,b)=>a-b);
-
-const ret=this.getMainThreadTopLevelEventDurations(events,startTime,endTime);
-return this._riskPercentiles(ret.durations,totalTime,percentiles,
-ret.clippedLength);
-}
-
-
-
-
-
-
-
-
-static getMainThreadTopLevelEventDurations(topLevelEvents,startTime=0,endTime=Infinity){
-
-
-const durations=[];
-let clippedLength=0;
-
-for(const event of topLevelEvents){
-if(event.end<startTime||event.start>endTime){
-continue;
-}
-
-let duration=event.duration;
-let eventStart=event.start;
-if(eventStart<startTime){
-
-eventStart=startTime;
-duration=event.end-startTime;
-}
-
-if(event.end>endTime){
-
-clippedLength=duration-(endTime-eventStart);
-}
-
-durations.push(duration);
-}
-durations.sort((a,b)=>a-b);
-
-return{
-durations,
-clippedLength};
-
-}
-
-
-
-
-
-
-
-
-
-static getMainThreadTopLevelEvents(tabTrace,startTime=0,endTime=Infinity){
-const topLevelEvents=[];
-
-for(const event of tabTrace.mainThreadEvents){
-if(!this.isScheduleableTask(event)||!event.dur)continue;
-
-const start=(event.ts-tabTrace.navigationStartEvt.ts)/1000;
-const end=(event.ts+event.dur-tabTrace.navigationStartEvt.ts)/1000;
-if(start>endTime||end<startTime)continue;
-
-topLevelEvents.push({
-start,
-end,
-duration:event.dur/1000});
-
-}
-
-return topLevelEvents;
-}
-
-
-
-
-
-static findMainFrameIds(events){
-
-const startedInBrowserEvt=events.find(e=>e.name==='TracingStartedInBrowser');
-if(startedInBrowserEvt&&startedInBrowserEvt.args.data&&
-startedInBrowserEvt.args.data.frames){
-const mainFrame=startedInBrowserEvt.args.data.frames.find(frame=>!frame.parent);
-const frameId=mainFrame&&mainFrame.frame;
-const pid=mainFrame&&mainFrame.processId;
-
-const threadNameEvt=events.find(e=>e.pid===pid&&e.ph==='M'&&
-e.cat==='__metadata'&&e.name==='thread_name'&&e.args.name==='CrRendererMain');
-const tid=threadNameEvt&&threadNameEvt.tid;
-
-if(pid&&tid&&frameId){
-return{
-pid,
-tid,
-frameId};
-
-}
-}
-
-
-
-
-const startedInPageEvt=events.find(e=>e.name==='TracingStartedInPage');
-if(startedInPageEvt&&startedInPageEvt.args&&startedInPageEvt.args.data){
-const frameId=startedInPageEvt.args.data.page;
-if(frameId){
-return{
-pid:startedInPageEvt.pid,
-tid:startedInPageEvt.tid,
-frameId};
-
-}
-}
-
-
-
-
-
-const navStartEvt=events.find(e=>Boolean(e.name==='navigationStart'&&e.args&&
-e.args.data&&e.args.data.isLoadingMainFrame&&e.args.data.documentLoaderURL));
-
-const firstResourceSendEvt=events.find(e=>e.name==='ResourceSendRequest');
-
-if(navStartEvt&&navStartEvt.args&&navStartEvt.args.data&&
-firstResourceSendEvt&&
-firstResourceSendEvt.pid===navStartEvt.pid&&
-firstResourceSendEvt.tid===navStartEvt.tid){
-const frameId=navStartEvt.args.frame;
-if(frameId){
-return{
-pid:navStartEvt.pid,
-tid:navStartEvt.tid,
-frameId};
-
-}
-}
-
-throw this.createNoTracingStartedError();
-}
-
-
-
-
-
-static isScheduleableTask(evt){
-return evt.name===SCHEDULABLE_TASK_TITLE_LH||
-evt.name===SCHEDULABLE_TASK_TITLE_ALT1||
-evt.name===SCHEDULABLE_TASK_TITLE_ALT2||
-evt.name===SCHEDULABLE_TASK_TITLE_ALT3;
-}
-
-
-
-
-
-
-
-
-static computeTraceOfTab(trace){
-
-
-const keyEvents=this.filteredTraceSort(trace.traceEvents,e=>{
-return e.cat.includes('blink.user_timing')||
-e.cat.includes('loading')||
-e.cat.includes('devtools.timeline')||
-e.cat==='__metadata';
-});
-
-
-const mainFrameIds=this.findMainFrameIds(keyEvents);
-
-
-const frameEvents=keyEvents.filter(e=>e.args.frame===mainFrameIds.frameId);
-
-
-const navigationStart=frameEvents.filter(this._isNavigationStartOfInterest).pop();
-if(!navigationStart)throw this.createNoNavstartError();
-
-
-const firstPaint=frameEvents.find(e=>e.name==='firstPaint'&&e.ts>navigationStart.ts);
-
-
-const firstContentfulPaint=frameEvents.find(
-e=>e.name==='firstContentfulPaint'&&e.ts>navigationStart.ts);
-
-
-
-let firstMeaningfulPaint=frameEvents.find(
-e=>e.name==='firstMeaningfulPaint'&&e.ts>navigationStart.ts);
-
-let fmpFellBack=false;
-
-
-
-
-
-if(!firstMeaningfulPaint){
-const fmpCand='firstMeaningfulPaintCandidate';
-fmpFellBack=true;
-log.verbose('trace-of-tab',`No firstMeaningfulPaint found, falling back to last ${fmpCand}`);
-const lastCandidate=frameEvents.filter(e=>e.name===fmpCand).pop();
-if(!lastCandidate){
-log.verbose('trace-of-tab','No `firstMeaningfulPaintCandidate` events found in trace');
-}
-firstMeaningfulPaint=lastCandidate;
-}
-
-
-
-
-let largestContentfulPaint;
-let lcpInvalidated=false;
-
-for(let i=frameEvents.length-1;i>=0;i--){
-const e=frameEvents[i];
-
-if(e.ts<=navigationStart.ts)break;
-
-if(e.name==='largestContentfulPaint::Invalidate'){
-lcpInvalidated=true;
-break;
-}
-
-if(e.name!=='largestContentfulPaint::Candidate')continue;
-
-largestContentfulPaint=e;
-break;
-}
-
-const load=frameEvents.find(e=>e.name==='loadEventEnd'&&e.ts>navigationStart.ts);
-const domContentLoaded=frameEvents.find(
-e=>e.name==='domContentLoadedEventEnd'&&e.ts>navigationStart.ts);
-
-
-
-
-const processEvents=TraceProcessor.
-filteredTraceSort(trace.traceEvents,e=>e.pid===mainFrameIds.pid);
-
-const mainThreadEvents=processEvents.
-filter(e=>e.tid===mainFrameIds.tid);
-
-
-const traceEnd=trace.traceEvents.reduce((max,evt)=>{
-return max.ts>evt.ts?max:evt;
-});
-const fakeEndOfTraceEvt={ts:traceEnd.ts+(traceEnd.dur||0)};
-
-
-const getTimestamp=event=>event&&event.ts;
-
-const timestamps={
-navigationStart:navigationStart.ts,
-firstPaint:getTimestamp(firstPaint),
-firstContentfulPaint:getTimestamp(firstContentfulPaint),
-firstMeaningfulPaint:getTimestamp(firstMeaningfulPaint),
-largestContentfulPaint:getTimestamp(largestContentfulPaint),
-traceEnd:fakeEndOfTraceEvt.ts,
-load:getTimestamp(load),
-domContentLoaded:getTimestamp(domContentLoaded)};
-
-
-
-const getTiming=ts=>(ts-navigationStart.ts)/1000;
-
-const maybeGetTiming=ts=>ts===undefined?undefined:getTiming(ts);
-
-const timings={
-navigationStart:0,
-firstPaint:maybeGetTiming(timestamps.firstPaint),
-firstContentfulPaint:maybeGetTiming(timestamps.firstContentfulPaint),
-firstMeaningfulPaint:maybeGetTiming(timestamps.firstMeaningfulPaint),
-largestContentfulPaint:maybeGetTiming(timestamps.largestContentfulPaint),
-traceEnd:getTiming(timestamps.traceEnd),
-load:maybeGetTiming(timestamps.load),
-domContentLoaded:maybeGetTiming(timestamps.domContentLoaded)};
-
-
-return{
-timings,
-timestamps,
-processEvents,
-mainThreadEvents,
-mainFrameIds,
-navigationStartEvt:navigationStart,
-firstPaintEvt:firstPaint,
-firstContentfulPaintEvt:firstContentfulPaint,
-firstMeaningfulPaintEvt:firstMeaningfulPaint,
-largestContentfulPaintEvt:largestContentfulPaint,
-loadEvt:load,
-domContentLoadedEvt:domContentLoaded,
-fmpFellBack,
-lcpInvalidated};
-
-}}
-
-
-module.exports=TraceProcessor;
-
-
-
-
-
-
-
-
-
-},{"lighthouse-logger":125}],86:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const log=require('lighthouse-logger');
-
-
-
-
-
-
-
-function getUberMetrics(auditResults){
-const metricsAudit=auditResults.metrics;
-if(!metricsAudit||!metricsAudit.details||!('items'in metricsAudit.details))return;
-
-return metricsAudit.details.items[0];
-}
-
-class Metrics{
-
-
-
-
-constructor(traceEvents,auditResults){
-this._traceEvents=traceEvents;
-this._auditResults=auditResults;
-}
-
-
-
-
-
-static get metricsDefinitions(){
-return[
-{
-name:'Navigation Start',
-id:'navstart',
-tsKey:'observedNavigationStartTs'},
-
-{
-name:'First Contentful Paint',
-id:'ttfcp',
-tsKey:'observedFirstContentfulPaintTs'},
-
-{
-name:'First Meaningful Paint',
-id:'ttfmp',
-tsKey:'observedFirstMeaningfulPaintTs'},
-
-{
-name:'Speed Index',
-id:'si',
-tsKey:'observedSpeedIndexTs'},
-
-{
-name:'First Visual Change',
-id:'fv',
-tsKey:'observedFirstVisualChangeTs'},
-
-{
-name:'Visually Complete 100%',
-id:'vc100',
-tsKey:'observedLastVisualChangeTs'},
-
-{
-name:'First CPU Idle',
-id:'ttfi',
-tsKey:'firstCPUIdleTs'},
-
-{
-name:'Interactive',
-id:'tti',
-tsKey:'interactiveTs'},
-
-{
-name:'End of Trace',
-id:'eot',
-tsKey:'observedTraceEndTs'},
-
-{
-name:'On Load',
-id:'onload',
-tsKey:'observedLoadTs'},
-
-{
-name:'DOM Content Loaded',
-id:'dcl',
-tsKey:'observedDomContentLoadedTs'}];
-
-
-}
-
-
-
-
-
-gatherMetrics(){
-const uberMetrics=getUberMetrics(this._auditResults);
-if(!uberMetrics){
-return[];
-}
-
-
-const resolvedMetrics=[];
-Metrics.metricsDefinitions.forEach(metric=>{
-
-const ts=uberMetrics[metric.tsKey];
-if(ts===undefined){
-log.error('pwmetrics-events',`${metric.name} timestamp not found`);
-return;
-}
-
-resolvedMetrics.push({
-id:metric.id,
-name:metric.name,
-ts});
-
-});
-
-return resolvedMetrics;
-}
-
-
-
-
-
-
-getNavigationStartEvt(metrics){
-const navStartMetric=metrics.find(e=>e.id==='navstart');
-if(!navStartMetric)return;
-return this._traceEvents.find(
-e=>e.name==='navigationStart'&&e.ts===navStartMetric.ts);
-
-}
-
-
-
-
-
-
-
-
-
-synthesizeEventPair(metric,navigationStartEvt){
-
-const eventBase={
-pid:navigationStartEvt.pid,
-tid:navigationStartEvt.tid,
-cat:'blink.user_timing',
-name:metric.name,
-args:{},
-
-id:`0x${(Math.random()*1000000|0).toString(16)}`};
-
-const fakeMeasureStartEvent=Object.assign({},eventBase,{
-ts:navigationStartEvt.ts,
-ph:'b'});
-
-const fakeMeasureEndEvent=Object.assign({},eventBase,{
-ts:metric.ts,
-ph:'e'});
-
-return[fakeMeasureStartEvent,fakeMeasureEndEvent];
-}
-
-
-
-
-generateFakeEvents(){
-const metrics=this.gatherMetrics();
-if(metrics.length===0){
-log.error('metrics-events','Metrics collection had errors, not synthetizing trace events');
-return[];
-}
-
-const navigationStartEvt=this.getNavigationStartEvt(metrics);
-if(!navigationStartEvt){
-log.error('pwmetrics-events','Reference navigationStart not found');
-return[];
-}
-
-
-const fakeEvents=[];
-metrics.forEach(metric=>{
-if(metric.id==='navstart'){
-return;
-}
-if(!metric.ts){
-log.error('pwmetrics-events',`(${metric.name}) missing timestamp. Skipping…`);
-return;
-}
-log.verbose('pwmetrics-events',`Sythesizing trace events for ${metric.name}`);
-fakeEvents.push(...this.synthesizeEventPair(metric,navigationStartEvt));
-});
-return fakeEvents;
-}}
-
-
-module.exports=Metrics;
-
-},{"lighthouse-logger":125}],87:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-
-
-const ELLIPSIS='\u2026';
-const NBSP='\xa0';
-const PASS_THRESHOLD=0.9;
-const SCREENSHOT_PREFIX='data:image/jpeg;base64,';
-
-const RATINGS={
-PASS:{label:'pass',minScore:PASS_THRESHOLD},
-AVERAGE:{label:'average',minScore:0.5},
-FAIL:{label:'fail'},
-ERROR:{label:'error'}};
-
-
-
-
-
-const listOfTlds=[
-'com','co','gov','edu','ac','org','go','gob','or','net','in','ne','nic','gouv',
-'web','spb','blog','jus','kiev','mil','wi','qc','ca','bel','on'];
-
-
-class Util{
-static get PASS_THRESHOLD(){
-return PASS_THRESHOLD;
-}
-
-static get MS_DISPLAY_VALUE(){
-return`%10d${NBSP}ms`;
-}
-
-
-
-
-
-
-
-
-
-
-static prepareReportResult(result){
-
-const clone=JSON.parse(JSON.stringify(result));
-
-
-if(!clone.configSettings.locale){
-clone.configSettings.locale='en';
-}
-
-for(const audit of Object.values(clone.audits)){
-
-
-
-
-if(audit.scoreDisplayMode==='not_applicable'||audit.scoreDisplayMode==='not-applicable'){
-audit.scoreDisplayMode='notApplicable';
-}
-
-if(audit.details){
-
-
-
-if(audit.details.type===undefined||audit.details.type==='diagnostic'){
-audit.details.type='debugdata';
-}
-
-
-if(audit.details.type==='filmstrip'){
-for(const screenshot of audit.details.items){
-if(!screenshot.data.startsWith(SCREENSHOT_PREFIX)){
-screenshot.data=SCREENSHOT_PREFIX+screenshot.data;
-}
-}
-}
-}
-}
-
-
-Util.setNumberDateLocale(clone.configSettings.locale);
-if(clone.i18n&&clone.i18n.rendererFormattedStrings){
-Util.updateAllUIStrings(clone.i18n.rendererFormattedStrings);
-}
-
-
-if(typeof clone.categories!=='object')throw new Error('No categories provided.');
-for(const category of Object.values(clone.categories)){
-category.auditRefs.forEach(auditRef=>{
-const result=clone.audits[auditRef.id];
-auditRef.result=result;
-
-
-if(clone.stackPacks){
-clone.stackPacks.forEach(pack=>{
-if(pack.descriptions[auditRef.id]){
-auditRef.stackPacks=auditRef.stackPacks||[];
-auditRef.stackPacks.push({
-title:pack.title,
-iconDataURL:pack.iconDataURL,
-description:pack.descriptions[auditRef.id]});
-
-}
-});
-}
-});
-}
-
-return clone;
-}
-
-
-
-
-
-static updateAllUIStrings(rendererFormattedStrings){
-
-for(const[key,value]of Object.entries(rendererFormattedStrings)){
-Util.UIStrings[key]=value;
-}
-}
-
-
-
-
-
-
-
-
-static showAsPassed(audit){
-switch(audit.scoreDisplayMode){
-case'manual':
-case'notApplicable':
-return true;
-case'error':
-case'informative':
-return false;
-case'numeric':
-case'binary':
-default:
-return Number(audit.score)>=RATINGS.PASS.minScore;}
-
-}
-
-
-
-
-
-
-
-static calculateRating(score,scoreDisplayMode){
-
-if(scoreDisplayMode==='manual'||scoreDisplayMode==='notApplicable'){
-return RATINGS.PASS.label;
-}else if(scoreDisplayMode==='error'){
-return RATINGS.ERROR.label;
-}else if(score===null){
-return RATINGS.FAIL.label;
-}
-
-
-let rating=RATINGS.FAIL.label;
-if(score>=RATINGS.PASS.minScore){
-rating=RATINGS.PASS.label;
-}else if(score>=RATINGS.AVERAGE.minScore){
-rating=RATINGS.AVERAGE.label;
-}
-return rating;
-}
-
-
-
-
-
-
-
-static formatNumber(number,granularity=0.1){
-const coarseValue=Math.round(number/granularity)*granularity;
-return Util.numberFormatter.format(coarseValue);
-}
-
-
-
-
-
-
-static formatBytesToKB(size,granularity=0.1){
-const kbs=Util.numberFormatter.format(Math.round(size/1024/granularity)*granularity);
-return`${kbs}${NBSP}KB`;
-}
-
-
-
-
-
-
-static formatMilliseconds(ms,granularity=10){
-const coarseTime=Math.round(ms/granularity)*granularity;
-return`${Util.numberFormatter.format(coarseTime)}${NBSP}ms`;
-}
-
-
-
-
-
-
-static formatSeconds(ms,granularity=0.1){
-const coarseTime=Math.round(ms/1000/granularity)*granularity;
-return`${Util.numberFormatter.format(coarseTime)}${NBSP}s`;
-}
-
-
-
-
-
-
-static formatDateTime(date){
-
-const options={
-month:'short',day:'numeric',year:'numeric',
-hour:'numeric',minute:'numeric',timeZoneName:'short'};
-
-let formatter=new Intl.DateTimeFormat(Util.numberDateLocale,options);
-
-
-
-const tz=formatter.resolvedOptions().timeZone;
-if(!tz||tz.toLowerCase()==='etc/unknown'){
-options.timeZone='UTC';
-formatter=new Intl.DateTimeFormat(Util.numberDateLocale,options);
-}
-return formatter.format(new Date(date));
-}
-
-
-
-
-
-static formatDuration(timeInMilliseconds){
-let timeInSeconds=timeInMilliseconds/1000;
-if(Math.round(timeInSeconds)===0){
-return'None';
-}
-
-
-const parts=[];
-const unitLabels={
-d:60*60*24,
-h:60*60,
-m:60,
-s:1};
-
-
-Object.keys(unitLabels).forEach(label=>{
-const unit=unitLabels[label];
-const numberOfUnits=Math.floor(timeInSeconds/unit);
-if(numberOfUnits>0){
-timeInSeconds-=numberOfUnits*unit;
-parts.push(`${numberOfUnits}\xa0${label}`);
-}
-});
-
-return parts.join(' ');
-}
-
-
-
-
-
-
-
-
-static splitMarkdownCodeSpans(text){
-
-const segments=[];
-
-
-const parts=text.split(/`(.*?)`/g);
-for(let i=0;i<parts.length;i++){
-const text=parts[i];
-
-
-if(!text)continue;
-
-
-const isCode=i%2!==0;
-segments.push({
-isCode,
-text});
-
-}
-
-return segments;
-}
-
-
-
-
-
-
-
-
-
-static splitMarkdownLink(text){
-
-const segments=[];
-
-const parts=text.split(/\[([^\]]+?)\]\((https?:\/\/.*?)\)/g);
-while(parts.length){
-
-const[preambleText,linkText,linkHref]=parts.splice(0,3);
-
-if(preambleText){
-segments.push({
-isLink:false,
-text:preambleText});
-
-}
-
-
-if(linkText&&linkHref){
-segments.push({
-isLink:true,
-text:linkText,
-linkHref});
-
-}
-}
-
-return segments;
-}
-
-
-
-
-
-
-static getURLDisplayName(parsedUrl,options){
-
-options=options||{numPathParts:undefined,preserveQuery:undefined,
-preserveHost:undefined};
-const numPathParts=options.numPathParts!==undefined?options.numPathParts:2;
-const preserveQuery=options.preserveQuery!==undefined?options.preserveQuery:true;
-const preserveHost=options.preserveHost||false;
-
-let name;
-
-if(parsedUrl.protocol==='about:'||parsedUrl.protocol==='data:'){
-
-name=parsedUrl.href;
-}else{
-name=parsedUrl.pathname;
-const parts=name.split('/').filter(part=>part.length);
-if(numPathParts&&parts.length>numPathParts){
-name=ELLIPSIS+parts.slice(-1*numPathParts).join('/');
-}
-
-if(preserveHost){
-name=`${parsedUrl.host}/${name.replace(/^\//,'')}`;
-}
-if(preserveQuery){
-name=`${name}${parsedUrl.search}`;
-}
-}
-
-const MAX_LENGTH=64;
-
-name=name.replace(/([a-f0-9]{7})[a-f0-9]{13}[a-f0-9]*/g,`$1${ELLIPSIS}`);
-
-name=name.replace(/([a-zA-Z0-9-_]{9})(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9-_]{10,}/g,
-`$1${ELLIPSIS}`);
-
-name=name.replace(/(\d{3})\d{6,}/g,`$1${ELLIPSIS}`);
-
-name=name.replace(/\u2026+/g,ELLIPSIS);
-
-
-if(name.length>MAX_LENGTH&&name.includes('?')){
-
-name=name.replace(/\?([^=]*)(=)?.*/,`?$1$2${ELLIPSIS}`);
-
-
-if(name.length>MAX_LENGTH){
-name=name.replace(/\?.*/,`?${ELLIPSIS}`);
-}
-}
-
-
-if(name.length>MAX_LENGTH){
-const dotIndex=name.lastIndexOf('.');
-if(dotIndex>=0){
-name=name.slice(0,MAX_LENGTH-1-(name.length-dotIndex))+
-
-`${ELLIPSIS}${name.slice(dotIndex)}`;
-}else{
-name=name.slice(0,MAX_LENGTH-1)+ELLIPSIS;
-}
-}
-
-return name;
-}
-
-
-
-
-
-
-static parseURL(url){
-const parsedUrl=new URL(url);
-return{
-file:Util.getURLDisplayName(parsedUrl),
-hostname:parsedUrl.hostname,
-origin:parsedUrl.origin};
-
-}
-
-
-
-
-
-static createOrReturnURL(value){
-if(value instanceof URL){
-return value;
-}
-
-return new URL(value);
-}
-
-
-
-
-
-
-
-static getTld(hostname){
-const tlds=hostname.split('.').slice(-2);
-
-if(!listOfTlds.includes(tlds[0])){
-return`.${tlds[tlds.length-1]}`;
-}
-
-return`.${tlds.join('.')}`;
-}
-
-
-
-
-
-
-static getRootDomain(url){
-const hostname=Util.createOrReturnURL(url).hostname;
-const tld=Util.getTld(hostname);
-
-
-
-const splitTld=tld.split('.');
-
-
-return hostname.split('.').slice(-splitTld.length).join('.');
-}
-
-
-
-
-
-static getEnvironmentDisplayValues(settings){
-const emulationDesc=Util.getEmulationDescriptions(settings);
-
-return[
-{
-name:'Device',
-description:emulationDesc.deviceEmulation},
-
-{
-name:'Network throttling',
-description:emulationDesc.networkThrottling},
-
-{
-name:'CPU throttling',
-description:emulationDesc.cpuThrottling}];
-
-
-}
-
-
-
-
-
-static getEmulationDescriptions(settings){
-let cpuThrottling;
-let networkThrottling;
-let summary;
-
-const throttling=settings.throttling;
-
-switch(settings.throttlingMethod){
-case'provided':
-cpuThrottling='Provided by environment';
-networkThrottling='Provided by environment';
-summary='No throttling applied';
-break;
-case'devtools':{
-const{cpuSlowdownMultiplier,requestLatencyMs}=throttling;
-cpuThrottling=`${Util.formatNumber(cpuSlowdownMultiplier)}x slowdown (DevTools)`;
-networkThrottling=`${Util.formatNumber(requestLatencyMs)}${NBSP}ms HTTP RTT, `+
-`${Util.formatNumber(throttling.downloadThroughputKbps)}${NBSP}Kbps down, `+
-`${Util.formatNumber(throttling.uploadThroughputKbps)}${NBSP}Kbps up (DevTools)`;
-summary='Throttled Slow 4G network';
-break;
-}
-case'simulate':{
-const{cpuSlowdownMultiplier,rttMs,throughputKbps}=throttling;
-cpuThrottling=`${Util.formatNumber(cpuSlowdownMultiplier)}x slowdown (Simulated)`;
-networkThrottling=`${Util.formatNumber(rttMs)}${NBSP}ms TCP RTT, `+
-`${Util.formatNumber(throughputKbps)}${NBSP}Kbps throughput (Simulated)`;
-summary='Simulated Slow 4G network';
-break;
-}
-default:
-cpuThrottling='Unknown';
-networkThrottling='Unknown';
-summary='Unknown';}
-
-
-let deviceEmulation='No emulation';
-if(settings.emulatedFormFactor==='mobile')deviceEmulation='Emulated Nexus 5X';
-if(settings.emulatedFormFactor==='desktop')deviceEmulation='Emulated Desktop';
-
-return{
-deviceEmulation,
-cpuThrottling,
-networkThrottling,
-summary:`${deviceEmulation}, ${summary}`};
-
-}
-
-
-
-
-
-static setNumberDateLocale(locale){
-
-if(locale==='en-XA')locale='de';
-
-Util.numberDateLocale=locale;
-Util.numberFormatter=new Intl.NumberFormat(locale);
-}
-
-
-
-
-
-
-
-
-
-static filterRelevantLines(lines,lineMessages,surroundingLineCount){
-if(lineMessages.length===0){
-
-return lines.slice(0,surroundingLineCount*2+1);
-}
-
-const minGapSize=3;
-const lineNumbersToKeep=new Set();
-
-
-lineMessages=lineMessages.sort((a,b)=>(a.lineNumber||0)-(b.lineNumber||0));
-lineMessages.forEach(({lineNumber})=>{
-let firstSurroundingLineNumber=lineNumber-surroundingLineCount;
-let lastSurroundingLineNumber=lineNumber+surroundingLineCount;
-
-while(firstSurroundingLineNumber<1){
-
-firstSurroundingLineNumber++;
-lastSurroundingLineNumber++;
-}
-
-
-if(lineNumbersToKeep.has(firstSurroundingLineNumber-minGapSize-1)){
-firstSurroundingLineNumber-=minGapSize;
-}
-for(let i=firstSurroundingLineNumber;i<=lastSurroundingLineNumber;i++){
-const surroundingLineNumber=i;
-lineNumbersToKeep.add(surroundingLineNumber);
-}
-});
-
-return lines.filter(line=>lineNumbersToKeep.has(line.lineNumber));
-}
-
-
-
-
-static isPluginCategory(categoryId){
-return categoryId.startsWith('lighthouse-plugin-');
-}}
-
-
-
-
-
-
-Util.numberDateLocale='en';
-
-
-
-
-
-Util.numberFormatter=new Intl.NumberFormat(Util.numberDateLocale);
-
-
-
-
-
-Util.UIStrings={
-
-varianceDisclaimer:'Values are estimated and may vary. The performance score is [based only on these metrics](https://github.com/GoogleChrome/lighthouse/blob/d2ec9ffbb21de9ad1a0f86ed24575eda32c796f0/docs/scoring.md#how-are-the-scores-weighted).',
-
-opportunityResourceColumnLabel:'Opportunity',
-
-opportunitySavingsColumnLabel:'Estimated Savings',
-
-
-errorMissingAuditInfo:'Report error: no audit information',
-
-errorLabel:'Error!',
-
-warningHeader:'Warnings: ',
-
-auditGroupExpandTooltip:'Show audits',
-
-warningAuditsGroupTitle:'Passed audits but with warnings',
-
-passedAuditsGroupTitle:'Passed audits',
-
-notApplicableAuditsGroupTitle:'Not applicable',
-
-manualAuditsGroupTitle:'Additional items to manually check',
-
-
-toplevelWarningsMessage:'There were issues affecting this run of Lighthouse:',
-
-
-crcInitialNavigation:'Initial Navigation',
-
-crcLongestDurationLabel:'Maximum critical path latency:',
-
-
-snippetExpandButtonLabel:'Expand snippet',
-
-snippetCollapseButtonLabel:'Collapse snippet',
-
-
-lsPerformanceCategoryDescription:'[Lighthouse](https://developers.google.com/web/tools/lighthouse/) analysis of the current page on an emulated mobile network. Values are estimated and may vary.',
-
-labDataTitle:'Lab Data',
-
-
-thirdPartyResourcesLabel:'Show 3rd-party resources'};
-
-
-if(typeof module!=='undefined'&&module.exports){
-module.exports=Util;
-}else{
-self.Util=Util;
-}
-
-},{}],88:[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-const htmlReportAssets=require('./html/html-report-assets.js');
-
-class ReportGenerator{
-
-
-
-
-
-
-static replaceStrings(source,replacements){
-if(replacements.length===0){
-return source;
-}
-
-const firstReplacement=replacements[0];
-const nextReplacements=replacements.slice(1);
-return source.
-split(firstReplacement.search).
-map(part=>ReportGenerator.replaceStrings(part,nextReplacements)).
-join(firstReplacement.replacement);
-}
-
-
-
-
-
-
-static generateReportHtml(lhr){
-const sanitizedJson=JSON.stringify(lhr).
-replace(/</g,'\\u003c').
-replace(/\u2028/g,'\\u2028').
-replace(/\u2029/g,'\\u2029');
-const sanitizedJavascript=htmlReportAssets.REPORT_JAVASCRIPT.replace(/<\//g,'\\u003c/');
-
-return ReportGenerator.replaceStrings(htmlReportAssets.REPORT_TEMPLATE,[
-{search:'%%LIGHTHOUSE_JSON%%',replacement:sanitizedJson},
-{search:'%%LIGHTHOUSE_JAVASCRIPT%%',replacement:sanitizedJavascript},
-{search:'/*%%LIGHTHOUSE_CSS%%*/',replacement:htmlReportAssets.REPORT_CSS},
-{search:'%%LIGHTHOUSE_TEMPLATES%%',replacement:htmlReportAssets.REPORT_TEMPLATES}]);
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-static generateReportCSV(lhr){
-
-
-const CRLF='\r\n';
-const separator=',';
-
-const escape=value=>`"${value.replace(/"/g,'""')}"`;
-
-
-const header=['category','name','title','type','score'];
-const table=Object.values(lhr.categories).map(category=>{
-return category.auditRefs.map(auditRef=>{
-const audit=lhr.audits[auditRef.id];
-
-const numericScore=audit.score===null?-1:audit.score;
-return[category.title,audit.id,audit.title,audit.scoreDisplayMode,numericScore].
-map(value=>value.toString()).
-map(escape);
-});
-});
-
-return[header].concat(...table).
-map(row=>row.join(separator)).join(CRLF);
-}
-
-
-
-
-
-
-
-static generateReport(lhr,outputModes){
-const outputAsArray=Array.isArray(outputModes);
-if(typeof outputModes==='string')outputModes=[outputModes];
-
-const output=outputModes.map(outputMode=>{
-
-if(outputMode==='html'){
-return ReportGenerator.generateReportHtml(lhr);
-}
-
-if(outputMode==='csv'){
-return ReportGenerator.generateReportCSV(lhr);
-}
-
-if(outputMode==='json'){
-return JSON.stringify(lhr,null,2);
-}
-
-throw new Error('Invalid output mode: '+outputMode);
-});
-
-return outputAsArray?output:output[0];
-}}
-
-
-module.exports=ReportGenerator;
-
-},{"./html/html-report-assets.js":101}],89:[function(require,module,exports){
-(function(process){
-
-
-
-
-
-'use strict';
-
-const isDeepEqual=require('lodash.isequal');
-const Driver=require('./gather/driver.js');
-const GatherRunner=require('./gather/gather-runner.js');
-const ReportScoring=require('./scoring.js');
-const Audit=require('./audits/audit.js');
-const log=require('lighthouse-logger');
-const i18n=require('./lib/i18n/i18n.js');
-const stackPacks=require('./lib/stack-packs.js');
-const assetSaver=require('./lib/asset-saver.js');
-
-const path=require('path');
-const URL=require('./lib/url-shim.js');
-const Sentry=require('./lib/sentry.js');
-const generateReport=require('./report/report-generator.js').generateReport;
-const LHError=require('./lib/lh-error.js');
-
-
-
-
-class Runner{
-
-
-
-
-
-static async run(connection,runOpts){
-const settings=runOpts.config.settings;
-try{
-const runnerStatus={msg:'Runner setup',id:'lh:runner:run'};
-log.time(runnerStatus,'verbose');
-
-
-
-
-
-const lighthouseRunWarnings=[];
-
-const sentryContext=Sentry.getContext();
-Sentry.captureBreadcrumb({
-message:'Run started',
-category:'lifecycle',
-data:sentryContext&&sentryContext.extra});
-
-
-
-
-
-
-
-
-let artifacts;
-let requestedUrl;
-if(settings.auditMode&&!settings.gatherMode){
-
-const path=Runner._getArtifactsPath(settings);
-artifacts=assetSaver.loadArtifacts(path);
-requestedUrl=artifacts.URL.requestedUrl;
-
-if(!requestedUrl){
-throw new Error('Cannot run audit mode on empty URL');
-}
-if(runOpts.url&&!URL.equalWithExcludedFragments(runOpts.url,requestedUrl)){
-throw new Error('Cannot run audit mode on different URL');
-}
-}else{
-
-if(runOpts.url&&URL.isValid(runOpts.url)&&URL.isProtocolAllowed(runOpts.url)){
-
-requestedUrl=new URL(runOpts.url).href;
-}else{
-throw new LHError(LHError.errors.INVALID_URL);
-}
-
-artifacts=await Runner._gatherArtifactsFromBrowser(requestedUrl,runOpts,connection);
-
-if(settings.gatherMode){
-const path=Runner._getArtifactsPath(settings);
-await assetSaver.saveArtifacts(artifacts,path);
-}
-}
-
-
-if(settings.gatherMode&&!settings.auditMode)return;
-
-
-if(!runOpts.config.audits){
-throw new Error('No audits to evaluate.');
-}
-const auditResults=await Runner._runAudits(settings,runOpts.config.audits,artifacts,
-lighthouseRunWarnings);
-
-
-const resultsStatus={msg:'Generating results...',id:'lh:runner:generate'};
-log.time(resultsStatus);
-
-if(artifacts.LighthouseRunWarnings){
-lighthouseRunWarnings.push(...artifacts.LighthouseRunWarnings);
-}
-
-
-const lighthouseVersion=require('../package.json').version;
-
-
-const resultsById={};
-for(const audit of auditResults){
-resultsById[audit.id]=audit;
-}
-
-
-let categories={};
-if(runOpts.config.categories){
-categories=ReportScoring.scoreAllCategories(runOpts.config.categories,resultsById);
-}
-
-log.timeEnd(resultsStatus);
-log.timeEnd(runnerStatus);
-
-
-const lhr={
-userAgent:artifacts.HostUserAgent,
-environment:{
-networkUserAgent:artifacts.NetworkUserAgent,
-hostUserAgent:artifacts.HostUserAgent,
-benchmarkIndex:artifacts.BenchmarkIndex},
-
-lighthouseVersion,
-fetchTime:artifacts.fetchTime,
-requestedUrl:requestedUrl,
-finalUrl:artifacts.URL.finalUrl,
-runWarnings:lighthouseRunWarnings,
-runtimeError:Runner.getArtifactRuntimeError(artifacts),
-audits:resultsById,
-configSettings:settings,
-categories,
-categoryGroups:runOpts.config.groups||undefined,
-timing:this._getTiming(artifacts),
-i18n:{
-rendererFormattedStrings:i18n.getRendererFormattedStrings(settings.locale),
-icuMessagePaths:{}},
-
-stackPacks:stackPacks.getStackPacks(artifacts.Stacks)};
-
-
-
-lhr.i18n.icuMessagePaths=i18n.replaceIcuMessageInstanceIds(lhr,settings.locale);
-
-
-const report=generateReport(lhr,settings.output);
-
-return{lhr,artifacts,report};
-}catch(err){
-
-err.friendlyMessage=i18n.getFormatted(err.friendlyMessage,settings.locale);
-await Sentry.captureException(err,{level:'fatal'});
-throw err;
-}
-}
-
-
-
-
-
-
-
-
-static _getTiming(artifacts){
-const timingEntriesFromArtifacts=artifacts.Timing||[];
-const timingEntriesFromRunner=log.takeTimeEntries();
-const timingEntriesKeyValues=[
-...timingEntriesFromArtifacts,
-...timingEntriesFromRunner].
-
-map(entry=>[entry.startTime,entry]);
-const timingEntries=Array.from(new Map(timingEntriesKeyValues).values()).
-
-
-map(entry=>{
-return{
-
-
-startTime:parseFloat(entry.startTime.toFixed(2)),
-name:entry.name,
-duration:parseFloat(entry.duration.toFixed(2)),
-entryType:entry.entryType};
-
-});
-const runnerEntry=timingEntries.find(e=>e.name==='lh:runner:run');
-return{entries:timingEntries,total:runnerEntry&&runnerEntry.duration||0};
-}
-
-
-
-
-
-
-
-
-static async _gatherArtifactsFromBrowser(requestedUrl,runnerOpts,connection){
-if(!runnerOpts.config.passes){
-throw new Error('No browser artifacts are either provided or requested.');
-}
-const driver=runnerOpts.driverMock||new Driver(connection);
-const gatherOpts={
-driver,
-requestedUrl,
-settings:runnerOpts.config.settings};
-
-const artifacts=await GatherRunner.run(runnerOpts.config.passes,gatherOpts);
-return artifacts;
-}
-
-
-
-
-
-
-
-
-
-static async _runAudits(settings,audits,artifacts,runWarnings){
-const status={msg:'Analyzing and running audits...',id:'lh:runner:auditing'};
-log.time(status);
-
-if(artifacts.settings){
-const overrides={
-locale:undefined,
-gatherMode:undefined,
-auditMode:undefined,
-output:undefined,
-channel:undefined,
-budgets:undefined};
-
-const normalizedGatherSettings=Object.assign({},artifacts.settings,overrides);
-const normalizedAuditSettings=Object.assign({},settings,overrides);
-
-if(!isDeepEqual(normalizedGatherSettings,normalizedAuditSettings)){
-throw new Error('Cannot change settings between gathering and auditing');
-}
-}
-
-
-const sharedAuditContext={
-settings,
-LighthouseRunWarnings:runWarnings,
-computedCache:new Map()};
-
-
-
-const auditResults=[];
-for(const auditDefn of audits){
-const auditResult=await Runner._runAudit(auditDefn,artifacts,sharedAuditContext);
-auditResults.push(auditResult);
-}
-
-log.timeEnd(status);
-return auditResults;
-}
-
-
-
-
-
-
-
-
-
-
-static async _runAudit(auditDefn,artifacts,sharedAuditContext){
-const audit=auditDefn.implementation;
-const status={
-msg:`Auditing: ${i18n.getFormatted(audit.meta.title,'en-US')}`,
-id:`lh:audit:${audit.meta.id}`};
-
-log.time(status);
-
-let auditResult;
-try{
-
-for(const artifactName of audit.meta.requiredArtifacts){
-const noArtifact=artifacts[artifactName]===undefined;
-
-
-
-const noRequiredTrace=artifactName==='traces'&&!artifacts.traces[Audit.DEFAULT_PASS];
-const noRequiredDevtoolsLog=artifactName==='devtoolsLogs'&&
-!artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-
-if(noArtifact||noRequiredTrace||noRequiredDevtoolsLog){
-log.warn('Runner',
-`${artifactName} gatherer, required by audit ${audit.meta.id}, did not run.`);
-throw new LHError(LHError.errors.MISSING_REQUIRED_ARTIFACT,{artifactName});
-}
-
-
-if(artifacts[artifactName]instanceof Error){
-
-
-const artifactError=artifacts[artifactName];
-
-Sentry.captureException(artifactError,{
-tags:{gatherer:artifactName},
-level:'error'});
-
-
-log.warn('Runner',`${artifactName} gatherer, required by audit ${audit.meta.id},`+
-` encountered an error: ${artifactError.message}`);
-
-
-const error=new LHError(LHError.errors.ERRORED_REQUIRED_ARTIFACT,
-{artifactName,errorMessage:artifactError.message});
-
-error.expected=true;
-throw error;
-}
-}
-
-
-const auditOptions=Object.assign({},audit.defaultOptions,auditDefn.options);
-const auditContext={
-options:auditOptions,
-...sharedAuditContext};
-
-
-
-
-
-const requiredArtifacts=audit.meta.requiredArtifacts.
-reduce((requiredArtifacts,artifactName)=>{
-const requiredArtifact=artifacts[artifactName];
-
-requiredArtifacts[artifactName]=requiredArtifact;
-return requiredArtifacts;
-},{});
-const product=await audit.audit(requiredArtifacts,auditContext);
-auditResult=Audit.generateAuditResult(audit,product);
-}catch(err){
-
-if(err.code!=='MISSING_REQUIRED_ARTIFACT'&&err.code!=='ERRORED_REQUIRED_ARTIFACT'){
-log.warn(audit.meta.id,`Caught exception: ${err.message}`);
-}
-
-Sentry.captureException(err,{tags:{audit:audit.meta.id},level:'error'});
-
-const errorMessage=err.friendlyMessage?err.friendlyMessage:err.message;
-auditResult=Audit.generateErrorAuditResult(audit,errorMessage);
-}
-
-log.timeEnd(status);
-return auditResult;
-}
-
-
-
-
-
-
-
-static getArtifactRuntimeError(artifacts){
-const possibleErrorArtifacts=[
-artifacts.PageLoadError,
-...Object.values(artifacts)];
-
-
-for(const possibleErrorArtifact of possibleErrorArtifacts){
-if(possibleErrorArtifact instanceof LHError&&possibleErrorArtifact.lhrRuntimeError){
-const errorMessage=possibleErrorArtifact.friendlyMessage||possibleErrorArtifact.message;
-
-return{
-code:possibleErrorArtifact.code,
-message:errorMessage};
-
-}
-}
-
-return undefined;
-}
-
-
-
-
-
-static getAuditList(){
-const ignoredFiles=[
-'audit.js',
-'violation-audit.js',
-'accessibility/axe-audit.js',
-'multi-check-audit.js',
-'byte-efficiency/byte-efficiency-audit.js',
-'manual/manual-audit.js'];
-
-
-const fileList=[
-...["accessibility","apple-touch-icon.js","audit.js","bootup-time.js","byte-efficiency","content-width.js","critical-request-chains.js","deprecations.js","diagnostics.js","dobetterweb","errors-in-console.js","final-screenshot.js","font-display.js","image-aspect-ratio.js","installable-manifest.js","is-on-https.js","load-fast-enough-for-pwa.js","main-thread-tasks.js","mainthread-work-breakdown.js","manual","metrics","metrics.js","mixed-content.js","multi-check-audit.js","network-requests.js","network-rtt.js","network-server-latency.js","offline-start-url.js","performance-budget.js","predictive-perf.js","redirects-http.js","redirects.js","resource-summary.js","screenshot-thumbnails.js","seo","service-worker.js","splash-screen.js","themed-omnibox.js","third-party-summary.js","time-to-first-byte.js","user-timings.js","uses-rel-preconnect.js","uses-rel-preload.js","viewport.js","violation-audit.js","without-javascript.js","works-offline.js"],
-...["appcache-manifest.js","doctype.js","dom-size.js","external-anchors-use-rel-noopener.js","geolocation-on-start.js","js-libraries.js","no-document-write.js","no-vulnerable-libraries.js","notification-on-start.js","password-inputs-can-be-pasted-into.js","uses-http2.js","uses-passive-event-listeners.js"].map(f=>`dobetterweb/${f}`),
-...["estimated-input-latency.js","first-contentful-paint-3g.js","first-contentful-paint.js","first-cpu-idle.js","first-meaningful-paint.js","interactive.js","max-potential-fid.js","speed-index.js","total-blocking-time.js"].map(f=>`metrics/${f}`),
-...["canonical.js","font-size.js","hreflang.js","http-status-code.js","is-crawlable.js","link-text.js","manual","meta-description.js","plugins.js","robots-txt.js","tap-targets.js"].map(f=>`seo/${f}`),
-...["structured-data.js"].map(f=>`seo/manual/${f}`),
-...["accesskeys.js","aria-allowed-attr.js","aria-required-attr.js","aria-required-children.js","aria-required-parent.js","aria-roles.js","aria-valid-attr-value.js","aria-valid-attr.js","audio-caption.js","axe-audit.js","button-name.js","bypass.js","color-contrast.js","definition-list.js","dlitem.js","document-title.js","duplicate-id.js","frame-title.js","html-has-lang.js","html-lang-valid.js","image-alt.js","input-image-alt.js","label.js","layout-table.js","link-name.js","list.js","listitem.js","manual","meta-refresh.js","meta-viewport.js","object-alt.js","tabindex.js","td-headers-attr.js","th-has-data-cells.js","valid-lang.js","video-caption.js","video-description.js"].
-map(f=>`accessibility/${f}`),
-...["custom-controls-labels.js","custom-controls-roles.js","focus-traps.js","focusable-controls.js","heading-levels.js","interactive-element-affordance.js","logical-tab-order.js","managed-focus.js","offscreen-content-hidden.js","use-landmarks.js","visual-order-follows-dom.js"].
-map(f=>`accessibility/manual/${f}`),
-...["byte-efficiency-audit.js","efficient-animated-content.js","offscreen-images.js","render-blocking-resources.js","total-byte-weight.js","unminified-css.js","unminified-javascript.js","unused-css-rules.js","unused-javascript.js","uses-long-cache-ttl.js","uses-optimized-images.js","uses-responsive-images.js","uses-text-compression.js","uses-webp-images.js"].
-map(f=>`byte-efficiency/${f}`),
-...["manual-audit.js","pwa-cross-browser.js","pwa-each-page-has-url.js","pwa-page-transitions.js"].map(f=>`manual/${f}`)];
-
-return fileList.filter(f=>{
-return /\.js$/.test(f)&&!ignoredFiles.includes(f);
-}).sort();
-}
-
-
-
-
-
-static getGathererList(){
-const fileList=[
-...["accessibility.js","anchor-elements.js","cache-contents.js","console-messages.js","css-usage.js","dobetterweb","gatherer.js","html-without-javascript.js","http-redirect.js","iframe-elements.js","image-elements.js","js-usage.js","link-elements.js","main-document-content.js","meta-elements.js","mixed-content.js","offline.js","runtime-exceptions.js","script-elements.js","seo","service-worker.js","source-maps.js","start-url.js","viewport-dimensions.js"],
-...["embedded-content.js","font-size.js","robots-txt.js","tap-targets.js"].map(f=>`seo/${f}`),
-...["appcache.js","doctype.js","domstats.js","optimized-images.js","password-inputs-with-prevented-paste.js","response-compression.js","tags-blocking-first-paint.js"].
-map(f=>`dobetterweb/${f}`)];
-
-return fileList.filter(f=>/\.js$/.test(f)&&f!=='gatherer.js').sort();
-}
-
-
-
-
-
-
-static _getArtifactsPath(settings){
-const{auditMode,gatherMode}=settings;
-
-
-if(typeof auditMode==='string')return path.resolve(process.cwd(),auditMode);
-if(typeof gatherMode==='string')return path.resolve(process.cwd(),gatherMode);
-
-return path.join(process.cwd(),'latest-run');
-}}
-
-
-module.exports=Runner;
-
-}).call(this,require('_process'));
-},{"../package.json":192,"./audits/audit.js":3,"./gather/driver.js":51,"./gather/gather-runner.js":52,"./lib/asset-saver.js":56,"./lib/i18n/i18n.js":66,"./lib/lh-error.js":71,"./lib/sentry.js":78,"./lib/stack-packs.js":80,"./lib/url-shim.js":"url","./report/report-generator.js":88,"./scoring.js":90,"_process":158,"lighthouse-logger":125,"lodash.isequal":142,"path":156}],90:[function(require,module,exports){
-
-
-
-
-
-
-'use strict';
-
-const Audit=require('./audits/audit.js');
-
-
-
-
-
-
-const clampTo2Decimals=val=>Math.round(val*100)/100;
-
-class ReportScoring{
-
-
-
-
-
-static arithmeticMean(items){
-
-items=items.filter(item=>item.weight>0);
-
-if(items.some(item=>item.score===null))return null;
-
-const results=items.reduce(
-(result,item)=>{
-const score=item.score;
-const weight=item.weight;
-
-return{
-weight:result.weight+weight,
-sum:result.sum+score*weight};
-
-},
-{weight:0,sum:0});
-
-
-return clampTo2Decimals(results.sum/results.weight||0);
-}
-
-
-
-
-
-
-
-static scoreAllCategories(configCategories,resultsByAuditId){
-
-const scoredCategories={};
-
-for(const[categoryId,configCategory]of Object.entries(configCategories)){
-
-const auditRefs=configCategory.auditRefs.map(configMember=>{
-const member={...configMember};
-
-
-
-
-
-const result=resultsByAuditId[member.id];
-if(result.scoreDisplayMode===Audit.SCORING_MODES.NOT_APPLICABLE||
-result.scoreDisplayMode===Audit.SCORING_MODES.INFORMATIVE||
-result.scoreDisplayMode===Audit.SCORING_MODES.MANUAL){
-member.weight=0;
-}
-
-return member;
-});
-
-const scores=auditRefs.map(auditRef=>({
-score:resultsByAuditId[auditRef.id].score,
-weight:auditRef.weight}));
-
-const score=ReportScoring.arithmeticMean(scores);
-
-scoredCategories[categoryId]={
-...configCategory,
-auditRefs,
-id:categoryId,
-score};
-
-}
-
-return scoredCategories;
-}}
-
-
-module.exports=ReportScoring;
-
-},{"./audits/audit.js":3}],91:[function(require,module,exports){
-const HEADER_REGEXP=/([a-zA-Z][a-zA-Z_-]*)\s*(?:=(?:"([^"]*)"|([^ \t",;]*)))?/g;
-
-const STRINGS={
-maxAge:'max-age',
-sharedMaxAge:'s-maxage',
-maxStale:'max-stale',
-minFresh:'min-fresh',
-immutable:'immutable',
-mustRevalidate:'must-revalidate',
-noCache:'no-cache',
-noStore:'no-store',
-noTransform:'no-transform',
-onlyIfCached:'only-if-cached',
-private:'private',
-proxyRevalidate:'proxy-revalidate',
-public:'public'};
-
-
-function parseBooleanOnly(value){
-return value===null;
-}
-
-function parseDuration(value){
-if(!value){
-return null;
-}
-
-const duration=parseInt(value,10);
-
-if(!Number.isFinite(duration)||duration<0){
-return null;
-}
-
-return duration;
-}
-
-class CacheControl{
-constructor(){
-this.maxAge=null;
-this.sharedMaxAge=null;
-this.maxStale=null;
-this.maxStaleDuration=null;
-this.minFresh=null;
-this.immutable=null;
-this.mustRevalidate=null;
-this.noCache=null;
-this.noStore=null;
-this.noTransform=null;
-this.onlyIfCached=null;
-this.private=null;
-this.proxyRevalidate=null;
-this.public=null;
-}
-
-parse(header){
-if(!header||header.length===0){
-return this;
-}
-
-const values={};
-const matches=header.match(HEADER_REGEXP)||[];
-
-Array.prototype.forEach.call(matches,match=>{
-const tokens=match.split('=',2);
-
-const[key]=tokens;
-let value=null;
-
-if(tokens.length>1){
-value=tokens[1].trim();
-}
-
-values[key.toLowerCase()]=value;
-});
-
-this.maxAge=parseDuration(values[STRINGS.maxAge]);
-this.sharedMaxAge=parseDuration(values[STRINGS.sharedMaxAge]);
-
-this.maxStale=parseBooleanOnly(values[STRINGS.maxStale]);
-this.maxStaleDuration=parseDuration(values[STRINGS.maxStale]);
-if(this.maxStaleDuration){
-this.maxStale=true;
-}
-
-this.minFresh=parseDuration(values[STRINGS.minFresh]);
-
-this.immutable=parseBooleanOnly(values[STRINGS.immutable]);
-this.mustRevalidate=parseBooleanOnly(values[STRINGS.mustRevalidate]);
-this.noCache=parseBooleanOnly(values[STRINGS.noCache]);
-this.noStore=parseBooleanOnly(values[STRINGS.noStore]);
-this.noTransform=parseBooleanOnly(values[STRINGS.noTransform]);
-this.onlyIfCached=parseBooleanOnly(values[STRINGS.onlyIfCached]);
-this.private=parseBooleanOnly(values[STRINGS.private]);
-this.proxyRevalidate=parseBooleanOnly(values[STRINGS.proxyRevalidate]);
-this.public=parseBooleanOnly(values[STRINGS.public]);
-
-return this;
-}
-
-format(){
-const tokens=[];
-
-if(this.maxAge){
-tokens.push(`${STRINGS.maxAge}=${this.maxAge}`);
-}
-
-if(this.sharedMaxAge){
-tokens.push(`${STRINGS.sharedMaxAge}=${this.sharedMaxAge}`);
-}
-
-if(this.maxStale){
-if(this.maxStaleDuration){
-tokens.push(`${STRINGS.maxStale}=${this.maxStaleDuration}`);
-}else{
-tokens.push(STRINGS.maxStale);
-}
-}
-
-if(this.minFresh){
-tokens.push(`${STRINGS.minFresh}=${this.minFresh}`);
-}
-
-if(this.immutable){
-tokens.push(STRINGS.immutable);
-}
-
-if(this.mustRevalidate){
-tokens.push(STRINGS.mustRevalidate);
-}
-
-if(this.noCache){
-tokens.push(STRINGS.noCache);
-}
-
-if(this.noStore){
-tokens.push(STRINGS.noStore);
-}
-
-if(this.noTransform){
-tokens.push(STRINGS.noTransform);
-}
-
-if(this.onlyIfCached){
-tokens.push(STRINGS.onlyIfCached);
-}
-
-if(this.private){
-tokens.push(STRINGS.private);
-}
-
-if(this.proxyRevalidate){
-tokens.push(STRINGS.proxyRevalidate);
-}
-
-if(this.public){
-tokens.push(STRINGS.public);
-}
-
-return tokens.join(', ');
-}}
-
-
-function parse(header){
-const cc=new CacheControl();
-return cc.parse(header);
-}
-
-function format(cc){
-if(!(cc instanceof CacheControl)){
-return CacheControl.prototype.format.call(cc);
-}
-
-return cc.format();
-}
-
-module.exports={
-CacheControl,
-parse,
-format};
-
-
-},{}],92:[function(require,module,exports){
-(function(global){
-'use strict';
-
-
-
-
-
-
-
-
-
-
-function compare(a,b){
-if(a===b){
-return 0;
-}
-
-var x=a.length;
-var y=b.length;
-
-for(var i=0,len=Math.min(x,y);i<len;++i){
-if(a[i]!==b[i]){
-x=a[i];
-y=b[i];
-break;
-}
-}
-
-if(x<y){
-return-1;
-}
-if(y<x){
-return 1;
-}
-return 0;
-}
-function isBuffer(b){
-if(global.Buffer&&typeof global.Buffer.isBuffer==='function'){
-return global.Buffer.isBuffer(b);
-}
-return!!(b!=null&&b._isBuffer);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-var util=require('util/');
-var hasOwn=Object.prototype.hasOwnProperty;
-var pSlice=Array.prototype.slice;
-var functionsHaveNames=function(){
-return function foo(){}.name==='foo';
-}();
-function pToString(obj){
-return Object.prototype.toString.call(obj);
-}
-function isView(arrbuf){
-if(isBuffer(arrbuf)){
-return false;
-}
-if(typeof global.ArrayBuffer!=='function'){
-return false;
-}
-if(typeof ArrayBuffer.isView==='function'){
-return ArrayBuffer.isView(arrbuf);
-}
-if(!arrbuf){
-return false;
-}
-if(arrbuf instanceof DataView){
-return true;
-}
-if(arrbuf.buffer&&arrbuf.buffer instanceof ArrayBuffer){
-return true;
-}
-return false;
-}
-
-
-
-
-var assert=module.exports=ok;
-
-
-
-
-
-
-var regex=/\s*function\s+([^\(\s]*)\s*/;
-
-function getName(func){
-if(!util.isFunction(func)){
-return;
-}
-if(functionsHaveNames){
-return func.name;
-}
-var str=func.toString();
-var match=str.match(regex);
-return match&&match[1];
-}
-assert.AssertionError=function AssertionError(options){
-this.name='AssertionError';
-this.actual=options.actual;
-this.expected=options.expected;
-this.operator=options.operator;
-if(options.message){
-this.message=options.message;
-this.generatedMessage=false;
-}else{
-this.message=getMessage(this);
-this.generatedMessage=true;
-}
-var stackStartFunction=options.stackStartFunction||fail;
-if(Error.captureStackTrace){
-Error.captureStackTrace(this,stackStartFunction);
-}else{
-
-var err=new Error();
-if(err.stack){
-var out=err.stack;
-
-
-var fn_name=getName(stackStartFunction);
-var idx=out.indexOf('\n'+fn_name);
-if(idx>=0){
-
-
-var next_line=out.indexOf('\n',idx+1);
-out=out.substring(next_line+1);
-}
-
-this.stack=out;
-}
-}
-};
-
-
-util.inherits(assert.AssertionError,Error);
-
-function truncate(s,n){
-if(typeof s==='string'){
-return s.length<n?s:s.slice(0,n);
-}else{
-return s;
-}
-}
-function inspect(something){
-if(functionsHaveNames||!util.isFunction(something)){
-return util.inspect(something);
-}
-var rawname=getName(something);
-var name=rawname?': '+rawname:'';
-return'[Function'+name+']';
-}
-function getMessage(self){
-return truncate(inspect(self.actual),128)+' '+
-self.operator+' '+
-truncate(inspect(self.expected),128);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-function fail(actual,expected,message,operator,stackStartFunction){
-throw new assert.AssertionError({
-message:message,
-actual:actual,
-expected:expected,
-operator:operator,
-stackStartFunction:stackStartFunction});
-
-}
-
-
-assert.fail=fail;
-
-
-
-
-
-
-
-
-function ok(value,message){
-if(!value)fail(value,true,message,'==',assert.ok);
-}
-assert.ok=ok;
-
-
-
-
-
-assert.equal=function equal(actual,expected,message){
-if(actual!=expected)fail(actual,expected,message,'==',assert.equal);
-};
-
-
-
-
-assert.notEqual=function notEqual(actual,expected,message){
-if(actual==expected){
-fail(actual,expected,message,'!=',assert.notEqual);
-}
-};
-
-
-
-
-assert.deepEqual=function deepEqual(actual,expected,message){
-if(!_deepEqual(actual,expected,false)){
-fail(actual,expected,message,'deepEqual',assert.deepEqual);
-}
-};
-
-assert.deepStrictEqual=function deepStrictEqual(actual,expected,message){
-if(!_deepEqual(actual,expected,true)){
-fail(actual,expected,message,'deepStrictEqual',assert.deepStrictEqual);
-}
-};
-
-function _deepEqual(actual,expected,strict,memos){
-
-if(actual===expected){
-return true;
-}else if(isBuffer(actual)&&isBuffer(expected)){
-return compare(actual,expected)===0;
-
-
-
-}else if(util.isDate(actual)&&util.isDate(expected)){
-return actual.getTime()===expected.getTime();
-
-
-
-
-}else if(util.isRegExp(actual)&&util.isRegExp(expected)){
-return actual.source===expected.source&&
-actual.global===expected.global&&
-actual.multiline===expected.multiline&&
-actual.lastIndex===expected.lastIndex&&
-actual.ignoreCase===expected.ignoreCase;
-
-
-
-}else if((actual===null||typeof actual!=='object')&&(
-expected===null||typeof expected!=='object')){
-return strict?actual===expected:actual==expected;
-
-
-
-
-
-
-
-}else if(isView(actual)&&isView(expected)&&
-pToString(actual)===pToString(expected)&&
-!(actual instanceof Float32Array||
-actual instanceof Float64Array)){
-return compare(new Uint8Array(actual.buffer),
-new Uint8Array(expected.buffer))===0;
-
-
-
-
-
-
-
-}else if(isBuffer(actual)!==isBuffer(expected)){
-return false;
-}else{
-memos=memos||{actual:[],expected:[]};
-
-var actualIndex=memos.actual.indexOf(actual);
-if(actualIndex!==-1){
-if(actualIndex===memos.expected.indexOf(expected)){
-return true;
-}
-}
-
-memos.actual.push(actual);
-memos.expected.push(expected);
-
-return objEquiv(actual,expected,strict,memos);
-}
-}
-
-function isArguments(object){
-return Object.prototype.toString.call(object)=='[object Arguments]';
-}
-
-function objEquiv(a,b,strict,actualVisitedObjects){
-if(a===null||a===undefined||b===null||b===undefined)
-return false;
-
-if(util.isPrimitive(a)||util.isPrimitive(b))
-return a===b;
-if(strict&&Object.getPrototypeOf(a)!==Object.getPrototypeOf(b))
-return false;
-var aIsArgs=isArguments(a);
-var bIsArgs=isArguments(b);
-if(aIsArgs&&!bIsArgs||!aIsArgs&&bIsArgs)
-return false;
-if(aIsArgs){
-a=pSlice.call(a);
-b=pSlice.call(b);
-return _deepEqual(a,b,strict);
-}
-var ka=objectKeys(a);
-var kb=objectKeys(b);
-var key,i;
-
-
-if(ka.length!==kb.length)
-return false;
-
-ka.sort();
-kb.sort();
-
-for(i=ka.length-1;i>=0;i--){
-if(ka[i]!==kb[i])
-return false;
-}
-
-
-for(i=ka.length-1;i>=0;i--){
-key=ka[i];
-if(!_deepEqual(a[key],b[key],strict,actualVisitedObjects))
-return false;
-}
-return true;
-}
-
-
-
-
-assert.notDeepEqual=function notDeepEqual(actual,expected,message){
-if(_deepEqual(actual,expected,false)){
-fail(actual,expected,message,'notDeepEqual',assert.notDeepEqual);
-}
-};
-
-assert.notDeepStrictEqual=notDeepStrictEqual;
-function notDeepStrictEqual(actual,expected,message){
-if(_deepEqual(actual,expected,true)){
-fail(actual,expected,message,'notDeepStrictEqual',notDeepStrictEqual);
-}
-}
-
-
-
-
-
-assert.strictEqual=function strictEqual(actual,expected,message){
-if(actual!==expected){
-fail(actual,expected,message,'===',assert.strictEqual);
-}
-};
-
-
-
-
-assert.notStrictEqual=function notStrictEqual(actual,expected,message){
-if(actual===expected){
-fail(actual,expected,message,'!==',assert.notStrictEqual);
-}
-};
-
-function expectedException(actual,expected){
-if(!actual||!expected){
-return false;
-}
-
-if(Object.prototype.toString.call(expected)=='[object RegExp]'){
-return expected.test(actual);
-}
-
-try{
-if(actual instanceof expected){
-return true;
-}
-}catch(e){
-
-}
-
-if(Error.isPrototypeOf(expected)){
-return false;
-}
-
-return expected.call({},actual)===true;
-}
-
-function _tryBlock(block){
-var error;
-try{
-block();
-}catch(e){
-error=e;
-}
-return error;
-}
-
-function _throws(shouldThrow,block,expected,message){
-var actual;
-
-if(typeof block!=='function'){
-throw new TypeError('"block" argument must be a function');
-}
-
-if(typeof expected==='string'){
-message=expected;
-expected=null;
-}
-
-actual=_tryBlock(block);
-
-message=(expected&&expected.name?' ('+expected.name+').':'.')+(
-message?' '+message:'.');
-
-if(shouldThrow&&!actual){
-fail(actual,expected,'Missing expected exception'+message);
-}
-
-var userProvidedMessage=typeof message==='string';
-var isUnwantedException=!shouldThrow&&util.isError(actual);
-var isUnexpectedException=!shouldThrow&&actual&&!expected;
-
-if(isUnwantedException&&
-userProvidedMessage&&
-expectedException(actual,expected)||
-isUnexpectedException){
-fail(actual,expected,'Got unwanted exception'+message);
-}
-
-if(shouldThrow&&actual&&expected&&
-!expectedException(actual,expected)||!shouldThrow&&actual){
-throw actual;
-}
-}
-
-
-
-
-assert.throws=function(block,error,message){
-_throws(true,block,error,message);
-};
-
-
-assert.doesNotThrow=function(block,error,message){
-_throws(false,block,error,message);
-};
-
-assert.ifError=function(err){if(err)throw err;};
-
-var objectKeys=Object.keys||function(obj){
-var keys=[];
-for(var key in obj){
-if(hasOwn.call(obj,key))keys.push(key);
-}
-return keys;
-};
-
-}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
-},{"util/":95}],93:[function(require,module,exports){
-if(typeof Object.create==='function'){
-
-module.exports=function inherits(ctor,superCtor){
-ctor.super_=superCtor;
-ctor.prototype=Object.create(superCtor.prototype,{
-constructor:{
-value:ctor,
-enumerable:false,
-writable:true,
-configurable:true}});
-
-
-};
-}else{
-
-module.exports=function inherits(ctor,superCtor){
-ctor.super_=superCtor;
-var TempCtor=function(){};
-TempCtor.prototype=superCtor.prototype;
-ctor.prototype=new TempCtor();
-ctor.prototype.constructor=ctor;
-};
-}
-
-},{}],94:[function(require,module,exports){
-module.exports=function isBuffer(arg){
-return arg&&typeof arg==='object'&&
-typeof arg.copy==='function'&&
-typeof arg.fill==='function'&&
-typeof arg.readUInt8==='function';
-};
-},{}],95:[function(require,module,exports){
-(function(process,global){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-var formatRegExp=/%[sdj%]/g;
-exports.format=function(f){
-if(!isString(f)){
-var objects=[];
-for(var i=0;i<arguments.length;i++){
-objects.push(inspect(arguments[i]));
-}
-return objects.join(' ');
-}
-
-var i=1;
-var args=arguments;
-var len=args.length;
-var str=String(f).replace(formatRegExp,function(x){
-if(x==='%%')return'%';
-if(i>=len)return x;
-switch(x){
-case'%s':return String(args[i++]);
-case'%d':return Number(args[i++]);
-case'%j':
-try{
-return JSON.stringify(args[i++]);
-}catch(_){
-return'[Circular]';
-}
-default:
-return x;}
-
-});
-for(var x=args[i];i<len;x=args[++i]){
-if(isNull(x)||!isObject(x)){
-str+=' '+x;
-}else{
-str+=' '+inspect(x);
-}
-}
-return str;
-};
-
-
-
-
-
-exports.deprecate=function(fn,msg){
-
-if(isUndefined(global.process)){
-return function(){
-return exports.deprecate(fn,msg).apply(this,arguments);
-};
-}
-
-if(process.noDeprecation===true){
-return fn;
-}
-
-var warned=false;
-function deprecated(){
-if(!warned){
-if(process.throwDeprecation){
-throw new Error(msg);
-}else if(process.traceDeprecation){
-console.trace(msg);
-}else{
-console.error(msg);
-}
-warned=true;
-}
-return fn.apply(this,arguments);
-}
-
-return deprecated;
-};
-
-
-var debugs={};
-var debugEnviron;
-exports.debuglog=function(set){
-if(isUndefined(debugEnviron))
-debugEnviron=process.env.NODE_DEBUG||'';
-set=set.toUpperCase();
-if(!debugs[set]){
-if(new RegExp('\\b'+set+'\\b','i').test(debugEnviron)){
-var pid=process.pid;
-debugs[set]=function(){
-var msg=exports.format.apply(exports,arguments);
-console.error('%s %d: %s',set,pid,msg);
-};
-}else{
-debugs[set]=function(){};
-}
-}
-return debugs[set];
-};
-
-
-
-
-
-
-
-
-
-
-function inspect(obj,opts){
-
-var ctx={
-seen:[],
-stylize:stylizeNoColor};
-
-
-if(arguments.length>=3)ctx.depth=arguments[2];
-if(arguments.length>=4)ctx.colors=arguments[3];
-if(isBoolean(opts)){
-
-ctx.showHidden=opts;
-}else if(opts){
-
-exports._extend(ctx,opts);
-}
-
-if(isUndefined(ctx.showHidden))ctx.showHidden=false;
-if(isUndefined(ctx.depth))ctx.depth=2;
-if(isUndefined(ctx.colors))ctx.colors=false;
-if(isUndefined(ctx.customInspect))ctx.customInspect=true;
-if(ctx.colors)ctx.stylize=stylizeWithColor;
-return formatValue(ctx,obj,ctx.depth);
-}
-exports.inspect=inspect;
-
-
-
-inspect.colors={
-'bold':[1,22],
-'italic':[3,23],
-'underline':[4,24],
-'inverse':[7,27],
-'white':[37,39],
-'grey':[90,39],
-'black':[30,39],
-'blue':[34,39],
-'cyan':[36,39],
-'green':[32,39],
-'magenta':[35,39],
-'red':[31,39],
-'yellow':[33,39]};
-
-
-
-inspect.styles={
-'special':'cyan',
-'number':'yellow',
-'boolean':'yellow',
-'undefined':'grey',
-'null':'bold',
-'string':'green',
-'date':'magenta',
-
-'regexp':'red'};
-
-
-
-function stylizeWithColor(str,styleType){
-var style=inspect.styles[styleType];
-
-if(style){
-return'\u001b['+inspect.colors[style][0]+'m'+str+
-'\u001b['+inspect.colors[style][1]+'m';
-}else{
-return str;
-}
-}
-
-
-function stylizeNoColor(str,styleType){
-return str;
-}
-
-
-function arrayToHash(array){
-var hash={};
-
-array.forEach(function(val,idx){
-hash[val]=true;
-});
-
-return hash;
-}
-
-
-function formatValue(ctx,value,recurseTimes){
-
-
-if(ctx.customInspect&&
-value&&
-isFunction(value.inspect)&&
-
-value.inspect!==exports.inspect&&
-
-!(value.constructor&&value.constructor.prototype===value)){
-var ret=value.inspect(recurseTimes,ctx);
-if(!isString(ret)){
-ret=formatValue(ctx,ret,recurseTimes);
-}
-return ret;
-}
-
-
-var primitive=formatPrimitive(ctx,value);
-if(primitive){
-return primitive;
-}
-
-
-var keys=Object.keys(value);
-var visibleKeys=arrayToHash(keys);
-
-if(ctx.showHidden){
-keys=Object.getOwnPropertyNames(value);
-}
-
-
-
-if(isError(value)&&(
-keys.indexOf('message')>=0||keys.indexOf('description')>=0)){
-return formatError(value);
-}
-
-
-if(keys.length===0){
-if(isFunction(value)){
-var name=value.name?': '+value.name:'';
-return ctx.stylize('[Function'+name+']','special');
-}
-if(isRegExp(value)){
-return ctx.stylize(RegExp.prototype.toString.call(value),'regexp');
-}
-if(isDate(value)){
-return ctx.stylize(Date.prototype.toString.call(value),'date');
-}
-if(isError(value)){
-return formatError(value);
-}
-}
-
-var base='',array=false,braces=['{','}'];
-
-
-if(isArray(value)){
-array=true;
-braces=['[',']'];
-}
-
-
-if(isFunction(value)){
-var n=value.name?': '+value.name:'';
-base=' [Function'+n+']';
-}
-
-
-if(isRegExp(value)){
-base=' '+RegExp.prototype.toString.call(value);
-}
-
-
-if(isDate(value)){
-base=' '+Date.prototype.toUTCString.call(value);
-}
-
-
-if(isError(value)){
-base=' '+formatError(value);
-}
-
-if(keys.length===0&&(!array||value.length==0)){
-return braces[0]+base+braces[1];
-}
-
-if(recurseTimes<0){
-if(isRegExp(value)){
-return ctx.stylize(RegExp.prototype.toString.call(value),'regexp');
-}else{
-return ctx.stylize('[Object]','special');
-}
-}
-
-ctx.seen.push(value);
-
-var output;
-if(array){
-output=formatArray(ctx,value,recurseTimes,visibleKeys,keys);
-}else{
-output=keys.map(function(key){
-return formatProperty(ctx,value,recurseTimes,visibleKeys,key,array);
-});
-}
-
-ctx.seen.pop();
-
-return reduceToSingleString(output,base,braces);
-}
-
-
-function formatPrimitive(ctx,value){
-if(isUndefined(value))
-return ctx.stylize('undefined','undefined');
-if(isString(value)){
-var simple='\''+JSON.stringify(value).replace(/^"|"$/g,'').
-replace(/'/g,"\\'").
-replace(/\\"/g,'"')+'\'';
-return ctx.stylize(simple,'string');
-}
-if(isNumber(value))
-return ctx.stylize(''+value,'number');
-if(isBoolean(value))
-return ctx.stylize(''+value,'boolean');
-
-if(isNull(value))
-return ctx.stylize('null','null');
-}
-
-
-function formatError(value){
-return'['+Error.prototype.toString.call(value)+']';
-}
-
-
-function formatArray(ctx,value,recurseTimes,visibleKeys,keys){
-var output=[];
-for(var i=0,l=value.length;i<l;++i){
-if(hasOwnProperty(value,String(i))){
-output.push(formatProperty(ctx,value,recurseTimes,visibleKeys,
-String(i),true));
-}else{
-output.push('');
-}
-}
-keys.forEach(function(key){
-if(!key.match(/^\d+$/)){
-output.push(formatProperty(ctx,value,recurseTimes,visibleKeys,
-key,true));
-}
-});
-return output;
-}
-
-
-function formatProperty(ctx,value,recurseTimes,visibleKeys,key,array){
-var name,str,desc;
-desc=Object.getOwnPropertyDescriptor(value,key)||{value:value[key]};
-if(desc.get){
-if(desc.set){
-str=ctx.stylize('[Getter/Setter]','special');
-}else{
-str=ctx.stylize('[Getter]','special');
-}
-}else{
-if(desc.set){
-str=ctx.stylize('[Setter]','special');
-}
-}
-if(!hasOwnProperty(visibleKeys,key)){
-name='['+key+']';
-}
-if(!str){
-if(ctx.seen.indexOf(desc.value)<0){
-if(isNull(recurseTimes)){
-str=formatValue(ctx,desc.value,null);
-}else{
-str=formatValue(ctx,desc.value,recurseTimes-1);
-}
-if(str.indexOf('\n')>-1){
-if(array){
-str=str.split('\n').map(function(line){
-return'  '+line;
-}).join('\n').substr(2);
-}else{
-str='\n'+str.split('\n').map(function(line){
-return'   '+line;
-}).join('\n');
-}
-}
-}else{
-str=ctx.stylize('[Circular]','special');
-}
-}
-if(isUndefined(name)){
-if(array&&key.match(/^\d+$/)){
-return str;
-}
-name=JSON.stringify(''+key);
-if(name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)){
-name=name.substr(1,name.length-2);
-name=ctx.stylize(name,'name');
-}else{
-name=name.replace(/'/g,"\\'").
-replace(/\\"/g,'"').
-replace(/(^"|"$)/g,"'");
-name=ctx.stylize(name,'string');
-}
-}
-
-return name+': '+str;
-}
-
-
-function reduceToSingleString(output,base,braces){
-var numLinesEst=0;
-var length=output.reduce(function(prev,cur){
-numLinesEst++;
-if(cur.indexOf('\n')>=0)numLinesEst++;
-return prev+cur.replace(/\u001b\[\d\d?m/g,'').length+1;
-},0);
-
-if(length>60){
-return braces[0]+(
-base===''?'':base+'\n ')+
-' '+
-output.join(',\n  ')+
-' '+
-braces[1];
-}
-
-return braces[0]+base+' '+output.join(', ')+' '+braces[1];
-}
-
-
-
-
-function isArray(ar){
-return Array.isArray(ar);
-}
-exports.isArray=isArray;
-
-function isBoolean(arg){
-return typeof arg==='boolean';
-}
-exports.isBoolean=isBoolean;
-
-function isNull(arg){
-return arg===null;
-}
-exports.isNull=isNull;
-
-function isNullOrUndefined(arg){
-return arg==null;
-}
-exports.isNullOrUndefined=isNullOrUndefined;
-
-function isNumber(arg){
-return typeof arg==='number';
-}
-exports.isNumber=isNumber;
-
-function isString(arg){
-return typeof arg==='string';
-}
-exports.isString=isString;
-
-function isSymbol(arg){
-return typeof arg==='symbol';
-}
-exports.isSymbol=isSymbol;
-
-function isUndefined(arg){
-return arg===void 0;
-}
-exports.isUndefined=isUndefined;
-
-function isRegExp(re){
-return isObject(re)&&objectToString(re)==='[object RegExp]';
-}
-exports.isRegExp=isRegExp;
-
-function isObject(arg){
-return typeof arg==='object'&&arg!==null;
-}
-exports.isObject=isObject;
-
-function isDate(d){
-return isObject(d)&&objectToString(d)==='[object Date]';
-}
-exports.isDate=isDate;
-
-function isError(e){
-return isObject(e)&&(
-objectToString(e)==='[object Error]'||e instanceof Error);
-}
-exports.isError=isError;
-
-function isFunction(arg){
-return typeof arg==='function';
-}
-exports.isFunction=isFunction;
-
-function isPrimitive(arg){
-return arg===null||
-typeof arg==='boolean'||
-typeof arg==='number'||
-typeof arg==='string'||
-typeof arg==='symbol'||
-typeof arg==='undefined';
-}
-exports.isPrimitive=isPrimitive;
-
-exports.isBuffer=require('./support/isBuffer');
-
-function objectToString(o){
-return Object.prototype.toString.call(o);
-}
-
-
-function pad(n){
-return n<10?'0'+n.toString(10):n.toString(10);
-}
-
-
-var months=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep',
-'Oct','Nov','Dec'];
-
-
-function timestamp(){
-var d=new Date();
-var time=[pad(d.getHours()),
-pad(d.getMinutes()),
-pad(d.getSeconds())].join(':');
-return[d.getDate(),months[d.getMonth()],time].join(' ');
-}
-
-
-
-exports.log=function(){
-console.log('%s - %s',timestamp(),exports.format.apply(exports,arguments));
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-exports.inherits=require('inherits');
-
-exports._extend=function(origin,add){
-
-if(!add||!isObject(add))return origin;
-
-var keys=Object.keys(add);
-var i=keys.length;
-while(i--){
-origin[keys[i]]=add[keys[i]];
-}
-return origin;
-};
-
-function hasOwnProperty(obj,prop){
-return Object.prototype.hasOwnProperty.call(obj,prop);
-}
-
-}).call(this,require('_process'),typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
-},{"./support/isBuffer":94,"_process":158,"inherits":93}],96:[function(require,module,exports){
-
-const langs=[
-'aa',
-'ab',
-'ae',
-'af',
-'ak',
-'am',
-'an',
-'ar',
-'as',
-'av',
-'ay',
-'az',
-'ba',
-'be',
-'bg',
-'bh',
-'bi',
-'bm',
-'bn',
-'bo',
-'br',
-'bs',
-'ca',
-'ce',
-'ch',
-'co',
-'cr',
-'cs',
-'cu',
-'cv',
-'cy',
-'da',
-'de',
-'dv',
-'dz',
-'ee',
-'el',
-'en',
-'eo',
-'es',
-'et',
-'eu',
-'fa',
-'ff',
-'fi',
-'fj',
-'fo',
-'fr',
-'fy',
-'ga',
-'gd',
-'gl',
-'gn',
-'gu',
-'gv',
-'ha',
-'he',
-'hi',
-'ho',
-'hr',
-'ht',
-'hu',
-'hy',
-'hz',
-'ia',
-'id',
-'ie',
-'ig',
-'ii',
-'ik',
-'in',
-'io',
-'is',
-'it',
-'iu',
-'iw',
-'ja',
-'ji',
-'jv',
-'jw',
-'ka',
-'kg',
-'ki',
-'kj',
-'kk',
-'kl',
-'km',
-'kn',
-'ko',
-'kr',
-'ks',
-'ku',
-'kv',
-'kw',
-'ky',
-'la',
-'lb',
-'lg',
-'li',
-'ln',
-'lo',
-'lt',
-'lu',
-'lv',
-'mg',
-'mh',
-'mi',
-'mk',
-'ml',
-'mn',
-'mo',
-'mr',
-'ms',
-'mt',
-'my',
-'na',
-'nb',
-'nd',
-'ne',
-'ng',
-'nl',
-'nn',
-'no',
-'nr',
-'nv',
-'ny',
-'oc',
-'oj',
-'om',
-'or',
-'os',
-'pa',
-'pi',
-'pl',
-'ps',
-'pt',
-'qu',
-'rm',
-'rn',
-'ro',
-'ru',
-'rw',
-'sa',
-'sc',
-'sd',
-'se',
-'sg',
-'sh',
-'si',
-'sk',
-'sl',
-'sm',
-'sn',
-'so',
-'sq',
-'sr',
-'ss',
-'st',
-'su',
-'sv',
-'sw',
-'ta',
-'te',
-'tg',
-'th',
-'ti',
-'tk',
-'tl',
-'tn',
-'to',
-'tr',
-'ts',
-'tt',
-'tw',
-'ty',
-'ug',
-'uk',
-'ur',
-'uz',
-'ve',
-'vi',
-'vo',
-'wa',
-'wo',
-'xh',
-'yi',
-'yo',
-'za',
-'zh',
-'zu',
-'aaa',
-'aab',
-'aac',
-'aad',
-'aae',
-'aaf',
-'aag',
-'aah',
-'aai',
-'aak',
-'aal',
-'aam',
-'aan',
-'aao',
-'aap',
-'aaq',
-'aas',
-'aat',
-'aau',
-'aav',
-'aaw',
-'aax',
-'aaz',
-'aba',
-'abb',
-'abc',
-'abd',
-'abe',
-'abf',
-'abg',
-'abh',
-'abi',
-'abj',
-'abl',
-'abm',
-'abn',
-'abo',
-'abp',
-'abq',
-'abr',
-'abs',
-'abt',
-'abu',
-'abv',
-'abw',
-'abx',
-'aby',
-'abz',
-'aca',
-'acb',
-'acd',
-'ace',
-'acf',
-'ach',
-'aci',
-'ack',
-'acl',
-'acm',
-'acn',
-'acp',
-'acq',
-'acr',
-'acs',
-'act',
-'acu',
-'acv',
-'acw',
-'acx',
-'acy',
-'acz',
-'ada',
-'adb',
-'add',
-'ade',
-'adf',
-'adg',
-'adh',
-'adi',
-'adj',
-'adl',
-'adn',
-'ado',
-'adp',
-'adq',
-'adr',
-'ads',
-'adt',
-'adu',
-'adw',
-'adx',
-'ady',
-'adz',
-'aea',
-'aeb',
-'aec',
-'aed',
-'aee',
-'aek',
-'ael',
-'aem',
-'aen',
-'aeq',
-'aer',
-'aes',
-'aeu',
-'aew',
-'aey',
-'aez',
-'afa',
-'afb',
-'afd',
-'afe',
-'afg',
-'afh',
-'afi',
-'afk',
-'afn',
-'afo',
-'afp',
-'afs',
-'aft',
-'afu',
-'afz',
-'aga',
-'agb',
-'agc',
-'agd',
-'age',
-'agf',
-'agg',
-'agh',
-'agi',
-'agj',
-'agk',
-'agl',
-'agm',
-'agn',
-'ago',
-'agp',
-'agq',
-'agr',
-'ags',
-'agt',
-'agu',
-'agv',
-'agw',
-'agx',
-'agy',
-'agz',
-'aha',
-'ahb',
-'ahg',
-'ahh',
-'ahi',
-'ahk',
-'ahl',
-'ahm',
-'ahn',
-'aho',
-'ahp',
-'ahr',
-'ahs',
-'aht',
-'aia',
-'aib',
-'aic',
-'aid',
-'aie',
-'aif',
-'aig',
-'aih',
-'aii',
-'aij',
-'aik',
-'ail',
-'aim',
-'ain',
-'aio',
-'aip',
-'aiq',
-'air',
-'ais',
-'ait',
-'aiw',
-'aix',
-'aiy',
-'aja',
-'ajg',
-'aji',
-'ajn',
-'ajp',
-'ajt',
-'aju',
-'ajw',
-'ajz',
-'akb',
-'akc',
-'akd',
-'ake',
-'akf',
-'akg',
-'akh',
-'aki',
-'akj',
-'akk',
-'akl',
-'akm',
-'ako',
-'akp',
-'akq',
-'akr',
-'aks',
-'akt',
-'aku',
-'akv',
-'akw',
-'akx',
-'aky',
-'akz',
-'ala',
-'alc',
-'ald',
-'ale',
-'alf',
-'alg',
-'alh',
-'ali',
-'alj',
-'alk',
-'all',
-'alm',
-'aln',
-'alo',
-'alp',
-'alq',
-'alr',
-'als',
-'alt',
-'alu',
-'alv',
-'alw',
-'alx',
-'aly',
-'alz',
-'ama',
-'amb',
-'amc',
-'ame',
-'amf',
-'amg',
-'ami',
-'amj',
-'amk',
-'aml',
-'amm',
-'amn',
-'amo',
-'amp',
-'amq',
-'amr',
-'ams',
-'amt',
-'amu',
-'amv',
-'amw',
-'amx',
-'amy',
-'amz',
-'ana',
-'anb',
-'anc',
-'and',
-'ane',
-'anf',
-'ang',
-'anh',
-'ani',
-'anj',
-'ank',
-'anl',
-'anm',
-'ann',
-'ano',
-'anp',
-'anq',
-'anr',
-'ans',
-'ant',
-'anu',
-'anv',
-'anw',
-'anx',
-'any',
-'anz',
-'aoa',
-'aob',
-'aoc',
-'aod',
-'aoe',
-'aof',
-'aog',
-'aoh',
-'aoi',
-'aoj',
-'aok',
-'aol',
-'aom',
-'aon',
-'aor',
-'aos',
-'aot',
-'aou',
-'aox',
-'aoz',
-'apa',
-'apb',
-'apc',
-'apd',
-'ape',
-'apf',
-'apg',
-'aph',
-'api',
-'apj',
-'apk',
-'apl',
-'apm',
-'apn',
-'apo',
-'app',
-'apq',
-'apr',
-'aps',
-'apt',
-'apu',
-'apv',
-'apw',
-'apx',
-'apy',
-'apz',
-'aqa',
-'aqc',
-'aqd',
-'aqg',
-'aql',
-'aqm',
-'aqn',
-'aqp',
-'aqr',
-'aqt',
-'aqz',
-'arb',
-'arc',
-'ard',
-'are',
-'arh',
-'ari',
-'arj',
-'ark',
-'arl',
-'arn',
-'aro',
-'arp',
-'arq',
-'arr',
-'ars',
-'art',
-'aru',
-'arv',
-'arw',
-'arx',
-'ary',
-'arz',
-'asa',
-'asb',
-'asc',
-'asd',
-'ase',
-'asf',
-'asg',
-'ash',
-'asi',
-'asj',
-'ask',
-'asl',
-'asn',
-'aso',
-'asp',
-'asq',
-'asr',
-'ass',
-'ast',
-'asu',
-'asv',
-'asw',
-'asx',
-'asy',
-'asz',
-'ata',
-'atb',
-'atc',
-'atd',
-'ate',
-'atg',
-'ath',
-'ati',
-'atj',
-'atk',
-'atl',
-'atm',
-'atn',
-'ato',
-'atp',
-'atq',
-'atr',
-'ats',
-'att',
-'atu',
-'atv',
-'atw',
-'atx',
-'aty',
-'atz',
-'aua',
-'aub',
-'auc',
-'aud',
-'aue',
-'auf',
-'aug',
-'auh',
-'aui',
-'auj',
-'auk',
-'aul',
-'aum',
-'aun',
-'auo',
-'aup',
-'auq',
-'aur',
-'aus',
-'aut',
-'auu',
-'auw',
-'aux',
-'auy',
-'auz',
-'avb',
-'avd',
-'avi',
-'avk',
-'avl',
-'avm',
-'avn',
-'avo',
-'avs',
-'avt',
-'avu',
-'avv',
-'awa',
-'awb',
-'awc',
-'awd',
-'awe',
-'awg',
-'awh',
-'awi',
-'awk',
-'awm',
-'awn',
-'awo',
-'awr',
-'aws',
-'awt',
-'awu',
-'awv',
-'aww',
-'awx',
-'awy',
-'axb',
-'axe',
-'axg',
-'axk',
-'axl',
-'axm',
-'axx',
-'aya',
-'ayb',
-'ayc',
-'ayd',
-'aye',
-'ayg',
-'ayh',
-'ayi',
-'ayk',
-'ayl',
-'ayn',
-'ayo',
-'ayp',
-'ayq',
-'ayr',
-'ays',
-'ayt',
-'ayu',
-'ayx',
-'ayy',
-'ayz',
-'aza',
-'azb',
-'azc',
-'azd',
-'azg',
-'azj',
-'azm',
-'azn',
-'azo',
-'azt',
-'azz',
-'baa',
-'bab',
-'bac',
-'bad',
-'bae',
-'baf',
-'bag',
-'bah',
-'bai',
-'baj',
-'bal',
-'ban',
-'bao',
-'bap',
-'bar',
-'bas',
-'bat',
-'bau',
-'bav',
-'baw',
-'bax',
-'bay',
-'baz',
-'bba',
-'bbb',
-'bbc',
-'bbd',
-'bbe',
-'bbf',
-'bbg',
-'bbh',
-'bbi',
-'bbj',
-'bbk',
-'bbl',
-'bbm',
-'bbn',
-'bbo',
-'bbp',
-'bbq',
-'bbr',
-'bbs',
-'bbt',
-'bbu',
-'bbv',
-'bbw',
-'bbx',
-'bby',
-'bbz',
-'bca',
-'bcb',
-'bcc',
-'bcd',
-'bce',
-'bcf',
-'bcg',
-'bch',
-'bci',
-'bcj',
-'bck',
-'bcl',
-'bcm',
-'bcn',
-'bco',
-'bcp',
-'bcq',
-'bcr',
-'bcs',
-'bct',
-'bcu',
-'bcv',
-'bcw',
-'bcy',
-'bcz',
-'bda',
-'bdb',
-'bdc',
-'bdd',
-'bde',
-'bdf',
-'bdg',
-'bdh',
-'bdi',
-'bdj',
-'bdk',
-'bdl',
-'bdm',
-'bdn',
-'bdo',
-'bdp',
-'bdq',
-'bdr',
-'bds',
-'bdt',
-'bdu',
-'bdv',
-'bdw',
-'bdx',
-'bdy',
-'bdz',
-'bea',
-'beb',
-'bec',
-'bed',
-'bee',
-'bef',
-'beg',
-'beh',
-'bei',
-'bej',
-'bek',
-'bem',
-'beo',
-'bep',
-'beq',
-'ber',
-'bes',
-'bet',
-'beu',
-'bev',
-'bew',
-'bex',
-'bey',
-'bez',
-'bfa',
-'bfb',
-'bfc',
-'bfd',
-'bfe',
-'bff',
-'bfg',
-'bfh',
-'bfi',
-'bfj',
-'bfk',
-'bfl',
-'bfm',
-'bfn',
-'bfo',
-'bfp',
-'bfq',
-'bfr',
-'bfs',
-'bft',
-'bfu',
-'bfw',
-'bfx',
-'bfy',
-'bfz',
-'bga',
-'bgb',
-'bgc',
-'bgd',
-'bge',
-'bgf',
-'bgg',
-'bgi',
-'bgj',
-'bgk',
-'bgl',
-'bgm',
-'bgn',
-'bgo',
-'bgp',
-'bgq',
-'bgr',
-'bgs',
-'bgt',
-'bgu',
-'bgv',
-'bgw',
-'bgx',
-'bgy',
-'bgz',
-'bha',
-'bhb',
-'bhc',
-'bhd',
-'bhe',
-'bhf',
-'bhg',
-'bhh',
-'bhi',
-'bhj',
-'bhk',
-'bhl',
-'bhm',
-'bhn',
-'bho',
-'bhp',
-'bhq',
-'bhr',
-'bhs',
-'bht',
-'bhu',
-'bhv',
-'bhw',
-'bhx',
-'bhy',
-'bhz',
-'bia',
-'bib',
-'bic',
-'bid',
-'bie',
-'bif',
-'big',
-'bij',
-'bik',
-'bil',
-'bim',
-'bin',
-'bio',
-'bip',
-'biq',
-'bir',
-'bit',
-'biu',
-'biv',
-'biw',
-'bix',
-'biy',
-'biz',
-'bja',
-'bjb',
-'bjc',
-'bjd',
-'bje',
-'bjf',
-'bjg',
-'bjh',
-'bji',
-'bjj',
-'bjk',
-'bjl',
-'bjm',
-'bjn',
-'bjo',
-'bjp',
-'bjq',
-'bjr',
-'bjs',
-'bjt',
-'bju',
-'bjv',
-'bjw',
-'bjx',
-'bjy',
-'bjz',
-'bka',
-'bkb',
-'bkc',
-'bkd',
-'bkf',
-'bkg',
-'bkh',
-'bki',
-'bkj',
-'bkk',
-'bkl',
-'bkm',
-'bkn',
-'bko',
-'bkp',
-'bkq',
-'bkr',
-'bks',
-'bkt',
-'bku',
-'bkv',
-'bkw',
-'bkx',
-'bky',
-'bkz',
-'bla',
-'blb',
-'blc',
-'bld',
-'ble',
-'blf',
-'blg',
-'blh',
-'bli',
-'blj',
-'blk',
-'bll',
-'blm',
-'bln',
-'blo',
-'blp',
-'blq',
-'blr',
-'bls',
-'blt',
-'blv',
-'blw',
-'blx',
-'bly',
-'blz',
-'bma',
-'bmb',
-'bmc',
-'bmd',
-'bme',
-'bmf',
-'bmg',
-'bmh',
-'bmi',
-'bmj',
-'bmk',
-'bml',
-'bmm',
-'bmn',
-'bmo',
-'bmp',
-'bmq',
-'bmr',
-'bms',
-'bmt',
-'bmu',
-'bmv',
-'bmw',
-'bmx',
-'bmy',
-'bmz',
-'bna',
-'bnb',
-'bnc',
-'bnd',
-'bne',
-'bnf',
-'bng',
-'bni',
-'bnj',
-'bnk',
-'bnl',
-'bnm',
-'bnn',
-'bno',
-'bnp',
-'bnq',
-'bnr',
-'bns',
-'bnt',
-'bnu',
-'bnv',
-'bnw',
-'bnx',
-'bny',
-'bnz',
-'boa',
-'bob',
-'boe',
-'bof',
-'bog',
-'boh',
-'boi',
-'boj',
-'bok',
-'bol',
-'bom',
-'bon',
-'boo',
-'bop',
-'boq',
-'bor',
-'bot',
-'bou',
-'bov',
-'bow',
-'box',
-'boy',
-'boz',
-'bpa',
-'bpb',
-'bpd',
-'bpg',
-'bph',
-'bpi',
-'bpj',
-'bpk',
-'bpl',
-'bpm',
-'bpn',
-'bpo',
-'bpp',
-'bpq',
-'bpr',
-'bps',
-'bpt',
-'bpu',
-'bpv',
-'bpw',
-'bpx',
-'bpy',
-'bpz',
-'bqa',
-'bqb',
-'bqc',
-'bqd',
-'bqf',
-'bqg',
-'bqh',
-'bqi',
-'bqj',
-'bqk',
-'bql',
-'bqm',
-'bqn',
-'bqo',
-'bqp',
-'bqq',
-'bqr',
-'bqs',
-'bqt',
-'bqu',
-'bqv',
-'bqw',
-'bqx',
-'bqy',
-'bqz',
-'bra',
-'brb',
-'brc',
-'brd',
-'brf',
-'brg',
-'brh',
-'bri',
-'brj',
-'brk',
-'brl',
-'brm',
-'brn',
-'bro',
-'brp',
-'brq',
-'brr',
-'brs',
-'brt',
-'bru',
-'brv',
-'brw',
-'brx',
-'bry',
-'brz',
-'bsa',
-'bsb',
-'bsc',
-'bse',
-'bsf',
-'bsg',
-'bsh',
-'bsi',
-'bsj',
-'bsk',
-'bsl',
-'bsm',
-'bsn',
-'bso',
-'bsp',
-'bsq',
-'bsr',
-'bss',
-'bst',
-'bsu',
-'bsv',
-'bsw',
-'bsx',
-'bsy',
-'bta',
-'btb',
-'btc',
-'btd',
-'bte',
-'btf',
-'btg',
-'bth',
-'bti',
-'btj',
-'btk',
-'btl',
-'btm',
-'btn',
-'bto',
-'btp',
-'btq',
-'btr',
-'bts',
-'btt',
-'btu',
-'btv',
-'btw',
-'btx',
-'bty',
-'btz',
-'bua',
-'bub',
-'buc',
-'bud',
-'bue',
-'buf',
-'bug',
-'buh',
-'bui',
-'buj',
-'buk',
-'bum',
-'bun',
-'buo',
-'bup',
-'buq',
-'bus',
-'but',
-'buu',
-'buv',
-'buw',
-'bux',
-'buy',
-'buz',
-'bva',
-'bvb',
-'bvc',
-'bvd',
-'bve',
-'bvf',
-'bvg',
-'bvh',
-'bvi',
-'bvj',
-'bvk',
-'bvl',
-'bvm',
-'bvn',
-'bvo',
-'bvp',
-'bvq',
-'bvr',
-'bvt',
-'bvu',
-'bvv',
-'bvw',
-'bvx',
-'bvy',
-'bvz',
-'bwa',
-'bwb',
-'bwc',
-'bwd',
-'bwe',
-'bwf',
-'bwg',
-'bwh',
-'bwi',
-'bwj',
-'bwk',
-'bwl',
-'bwm',
-'bwn',
-'bwo',
-'bwp',
-'bwq',
-'bwr',
-'bws',
-'bwt',
-'bwu',
-'bww',
-'bwx',
-'bwy',
-'bwz',
-'bxa',
-'bxb',
-'bxc',
-'bxd',
-'bxe',
-'bxf',
-'bxg',
-'bxh',
-'bxi',
-'bxj',
-'bxk',
-'bxl',
-'bxm',
-'bxn',
-'bxo',
-'bxp',
-'bxq',
-'bxr',
-'bxs',
-'bxu',
-'bxv',
-'bxw',
-'bxx',
-'bxz',
-'bya',
-'byb',
-'byc',
-'byd',
-'bye',
-'byf',
-'byg',
-'byh',
-'byi',
-'byj',
-'byk',
-'byl',
-'bym',
-'byn',
-'byo',
-'byp',
-'byq',
-'byr',
-'bys',
-'byt',
-'byv',
-'byw',
-'byx',
-'byy',
-'byz',
-'bza',
-'bzb',
-'bzc',
-'bzd',
-'bze',
-'bzf',
-'bzg',
-'bzh',
-'bzi',
-'bzj',
-'bzk',
-'bzl',
-'bzm',
-'bzn',
-'bzo',
-'bzp',
-'bzq',
-'bzr',
-'bzs',
-'bzt',
-'bzu',
-'bzv',
-'bzw',
-'bzx',
-'bzy',
-'bzz',
-'caa',
-'cab',
-'cac',
-'cad',
-'cae',
-'caf',
-'cag',
-'cah',
-'cai',
-'caj',
-'cak',
-'cal',
-'cam',
-'can',
-'cao',
-'cap',
-'caq',
-'car',
-'cas',
-'cau',
-'cav',
-'caw',
-'cax',
-'cay',
-'caz',
-'cba',
-'cbb',
-'cbc',
-'cbd',
-'cbe',
-'cbg',
-'cbh',
-'cbi',
-'cbj',
-'cbk',
-'cbl',
-'cbn',
-'cbo',
-'cbq',
-'cbr',
-'cbs',
-'cbt',
-'cbu',
-'cbv',
-'cbw',
-'cby',
-'cca',
-'ccc',
-'ccd',
-'cce',
-'ccg',
-'cch',
-'ccj',
-'ccl',
-'ccm',
-'ccn',
-'cco',
-'ccp',
-'ccq',
-'ccr',
-'ccs',
-'cda',
-'cdc',
-'cdd',
-'cde',
-'cdf',
-'cdg',
-'cdh',
-'cdi',
-'cdj',
-'cdm',
-'cdn',
-'cdo',
-'cdr',
-'cds',
-'cdy',
-'cdz',
-'cea',
-'ceb',
-'ceg',
-'cek',
-'cel',
-'cen',
-'cet',
-'cfa',
-'cfd',
-'cfg',
-'cfm',
-'cga',
-'cgc',
-'cgg',
-'cgk',
-'chb',
-'chc',
-'chd',
-'chf',
-'chg',
-'chh',
-'chj',
-'chk',
-'chl',
-'chm',
-'chn',
-'cho',
-'chp',
-'chq',
-'chr',
-'cht',
-'chw',
-'chx',
-'chy',
-'chz',
-'cia',
-'cib',
-'cic',
-'cid',
-'cie',
-'cih',
-'cik',
-'cim',
-'cin',
-'cip',
-'cir',
-'ciw',
-'ciy',
-'cja',
-'cje',
-'cjh',
-'cji',
-'cjk',
-'cjm',
-'cjn',
-'cjo',
-'cjp',
-'cjr',
-'cjs',
-'cjv',
-'cjy',
-'cka',
-'ckb',
-'ckh',
-'ckl',
-'ckn',
-'cko',
-'ckq',
-'ckr',
-'cks',
-'ckt',
-'cku',
-'ckv',
-'ckx',
-'cky',
-'ckz',
-'cla',
-'clc',
-'cld',
-'cle',
-'clh',
-'cli',
-'clj',
-'clk',
-'cll',
-'clm',
-'clo',
-'clt',
-'clu',
-'clw',
-'cly',
-'cma',
-'cmc',
-'cme',
-'cmg',
-'cmi',
-'cmk',
-'cml',
-'cmm',
-'cmn',
-'cmo',
-'cmr',
-'cms',
-'cmt',
-'cna',
-'cnb',
-'cnc',
-'cng',
-'cnh',
-'cni',
-'cnk',
-'cnl',
-'cno',
-'cnr',
-'cns',
-'cnt',
-'cnu',
-'cnw',
-'cnx',
-'coa',
-'cob',
-'coc',
-'cod',
-'coe',
-'cof',
-'cog',
-'coh',
-'coj',
-'cok',
-'col',
-'com',
-'con',
-'coo',
-'cop',
-'coq',
-'cot',
-'cou',
-'cov',
-'cow',
-'cox',
-'coy',
-'coz',
-'cpa',
-'cpb',
-'cpc',
-'cpe',
-'cpf',
-'cpg',
-'cpi',
-'cpn',
-'cpo',
-'cpp',
-'cps',
-'cpu',
-'cpx',
-'cpy',
-'cqd',
-'cqu',
-'cra',
-'crb',
-'crc',
-'crd',
-'crf',
-'crg',
-'crh',
-'cri',
-'crj',
-'crk',
-'crl',
-'crm',
-'crn',
-'cro',
-'crp',
-'crq',
-'crr',
-'crs',
-'crt',
-'crv',
-'crw',
-'crx',
-'cry',
-'crz',
-'csa',
-'csb',
-'csc',
-'csd',
-'cse',
-'csf',
-'csg',
-'csh',
-'csi',
-'csj',
-'csk',
-'csl',
-'csm',
-'csn',
-'cso',
-'csq',
-'csr',
-'css',
-'cst',
-'csu',
-'csv',
-'csw',
-'csy',
-'csz',
-'cta',
-'ctc',
-'ctd',
-'cte',
-'ctg',
-'cth',
-'ctl',
-'ctm',
-'ctn',
-'cto',
-'ctp',
-'cts',
-'ctt',
-'ctu',
-'ctz',
-'cua',
-'cub',
-'cuc',
-'cug',
-'cuh',
-'cui',
-'cuj',
-'cuk',
-'cul',
-'cum',
-'cuo',
-'cup',
-'cuq',
-'cur',
-'cus',
-'cut',
-'cuu',
-'cuv',
-'cuw',
-'cux',
-'cuy',
-'cvg',
-'cvn',
-'cwa',
-'cwb',
-'cwd',
-'cwe',
-'cwg',
-'cwt',
-'cya',
-'cyb',
-'cyo',
-'czh',
-'czk',
-'czn',
-'czo',
-'czt',
-'daa',
-'dac',
-'dad',
-'dae',
-'daf',
-'dag',
-'dah',
-'dai',
-'daj',
-'dak',
-'dal',
-'dam',
-'dao',
-'dap',
-'daq',
-'dar',
-'das',
-'dau',
-'dav',
-'daw',
-'dax',
-'day',
-'daz',
-'dba',
-'dbb',
-'dbd',
-'dbe',
-'dbf',
-'dbg',
-'dbi',
-'dbj',
-'dbl',
-'dbm',
-'dbn',
-'dbo',
-'dbp',
-'dbq',
-'dbr',
-'dbt',
-'dbu',
-'dbv',
-'dbw',
-'dby',
-'dcc',
-'dcr',
-'dda',
-'ddd',
-'dde',
-'ddg',
-'ddi',
-'ddj',
-'ddn',
-'ddo',
-'ddr',
-'dds',
-'ddw',
-'dec',
-'ded',
-'dee',
-'def',
-'deg',
-'deh',
-'dei',
-'dek',
-'del',
-'dem',
-'den',
-'dep',
-'deq',
-'der',
-'des',
-'dev',
-'dez',
-'dga',
-'dgb',
-'dgc',
-'dgd',
-'dge',
-'dgg',
-'dgh',
-'dgi',
-'dgk',
-'dgl',
-'dgn',
-'dgo',
-'dgr',
-'dgs',
-'dgt',
-'dgu',
-'dgw',
-'dgx',
-'dgz',
-'dha',
-'dhd',
-'dhg',
-'dhi',
-'dhl',
-'dhm',
-'dhn',
-'dho',
-'dhr',
-'dhs',
-'dhu',
-'dhv',
-'dhw',
-'dhx',
-'dia',
-'dib',
-'dic',
-'did',
-'dif',
-'dig',
-'dih',
-'dii',
-'dij',
-'dik',
-'dil',
-'dim',
-'din',
-'dio',
-'dip',
-'diq',
-'dir',
-'dis',
-'dit',
-'diu',
-'diw',
-'dix',
-'diy',
-'diz',
-'dja',
-'djb',
-'djc',
-'djd',
-'dje',
-'djf',
-'dji',
-'djj',
-'djk',
-'djl',
-'djm',
-'djn',
-'djo',
-'djr',
-'dju',
-'djw',
-'dka',
-'dkk',
-'dkl',
-'dkr',
-'dks',
-'dkx',
-'dlg',
-'dlk',
-'dlm',
-'dln',
-'dma',
-'dmb',
-'dmc',
-'dmd',
-'dme',
-'dmg',
-'dmk',
-'dml',
-'dmm',
-'dmn',
-'dmo',
-'dmr',
-'dms',
-'dmu',
-'dmv',
-'dmw',
-'dmx',
-'dmy',
-'dna',
-'dnd',
-'dne',
-'dng',
-'dni',
-'dnj',
-'dnk',
-'dnn',
-'dnr',
-'dnt',
-'dnu',
-'dnv',
-'dnw',
-'dny',
-'doa',
-'dob',
-'doc',
-'doe',
-'dof',
-'doh',
-'doi',
-'dok',
-'dol',
-'don',
-'doo',
-'dop',
-'doq',
-'dor',
-'dos',
-'dot',
-'dov',
-'dow',
-'dox',
-'doy',
-'doz',
-'dpp',
-'dra',
-'drb',
-'drc',
-'drd',
-'dre',
-'drg',
-'drh',
-'dri',
-'drl',
-'drn',
-'dro',
-'drq',
-'drr',
-'drs',
-'drt',
-'dru',
-'drw',
-'dry',
-'dsb',
-'dse',
-'dsh',
-'dsi',
-'dsl',
-'dsn',
-'dso',
-'dsq',
-'dta',
-'dtb',
-'dtd',
-'dth',
-'dti',
-'dtk',
-'dtm',
-'dtn',
-'dto',
-'dtp',
-'dtr',
-'dts',
-'dtt',
-'dtu',
-'dty',
-'dua',
-'dub',
-'duc',
-'dud',
-'due',
-'duf',
-'dug',
-'duh',
-'dui',
-'duj',
-'duk',
-'dul',
-'dum',
-'dun',
-'duo',
-'dup',
-'duq',
-'dur',
-'dus',
-'duu',
-'duv',
-'duw',
-'dux',
-'duy',
-'duz',
-'dva',
-'dwa',
-'dwl',
-'dwr',
-'dws',
-'dwu',
-'dww',
-'dwy',
-'dya',
-'dyb',
-'dyd',
-'dyg',
-'dyi',
-'dym',
-'dyn',
-'dyo',
-'dyu',
-'dyy',
-'dza',
-'dzd',
-'dze',
-'dzg',
-'dzl',
-'dzn',
-'eaa',
-'ebg',
-'ebk',
-'ebo',
-'ebr',
-'ebu',
-'ecr',
-'ecs',
-'ecy',
-'eee',
-'efa',
-'efe',
-'efi',
-'ega',
-'egl',
-'ego',
-'egx',
-'egy',
-'ehu',
-'eip',
-'eit',
-'eiv',
-'eja',
-'eka',
-'ekc',
-'eke',
-'ekg',
-'eki',
-'ekk',
-'ekl',
-'ekm',
-'eko',
-'ekp',
-'ekr',
-'eky',
-'ele',
-'elh',
-'eli',
-'elk',
-'elm',
-'elo',
-'elp',
-'elu',
-'elx',
-'ema',
-'emb',
-'eme',
-'emg',
-'emi',
-'emk',
-'emm',
-'emn',
-'emo',
-'emp',
-'ems',
-'emu',
-'emw',
-'emx',
-'emy',
-'ena',
-'enb',
-'enc',
-'end',
-'enf',
-'enh',
-'enl',
-'enm',
-'enn',
-'eno',
-'enq',
-'enr',
-'enu',
-'env',
-'enw',
-'enx',
-'eot',
-'epi',
-'era',
-'erg',
-'erh',
-'eri',
-'erk',
-'ero',
-'err',
-'ers',
-'ert',
-'erw',
-'ese',
-'esg',
-'esh',
-'esi',
-'esk',
-'esl',
-'esm',
-'esn',
-'eso',
-'esq',
-'ess',
-'esu',
-'esx',
-'esy',
-'etb',
-'etc',
-'eth',
-'etn',
-'eto',
-'etr',
-'ets',
-'ett',
-'etu',
-'etx',
-'etz',
-'euq',
-'eve',
-'evh',
-'evn',
-'ewo',
-'ext',
-'eya',
-'eyo',
-'eza',
-'eze',
-'faa',
-'fab',
-'fad',
-'faf',
-'fag',
-'fah',
-'fai',
-'faj',
-'fak',
-'fal',
-'fam',
-'fan',
-'fap',
-'far',
-'fat',
-'fau',
-'fax',
-'fay',
-'faz',
-'fbl',
-'fcs',
-'fer',
-'ffi',
-'ffm',
-'fgr',
-'fia',
-'fie',
-'fil',
-'fip',
-'fir',
-'fit',
-'fiu',
-'fiw',
-'fkk',
-'fkv',
-'fla',
-'flh',
-'fli',
-'fll',
-'fln',
-'flr',
-'fly',
-'fmp',
-'fmu',
-'fnb',
-'fng',
-'fni',
-'fod',
-'foi',
-'fom',
-'fon',
-'for',
-'fos',
-'fox',
-'fpe',
-'fqs',
-'frc',
-'frd',
-'frk',
-'frm',
-'fro',
-'frp',
-'frq',
-'frr',
-'frs',
-'frt',
-'fse',
-'fsl',
-'fss',
-'fub',
-'fuc',
-'fud',
-'fue',
-'fuf',
-'fuh',
-'fui',
-'fuj',
-'fum',
-'fun',
-'fuq',
-'fur',
-'fut',
-'fuu',
-'fuv',
-'fuy',
-'fvr',
-'fwa',
-'fwe',
-'gaa',
-'gab',
-'gac',
-'gad',
-'gae',
-'gaf',
-'gag',
-'gah',
-'gai',
-'gaj',
-'gak',
-'gal',
-'gam',
-'gan',
-'gao',
-'gap',
-'gaq',
-'gar',
-'gas',
-'gat',
-'gau',
-'gav',
-'gaw',
-'gax',
-'gay',
-'gaz',
-'gba',
-'gbb',
-'gbc',
-'gbd',
-'gbe',
-'gbf',
-'gbg',
-'gbh',
-'gbi',
-'gbj',
-'gbk',
-'gbl',
-'gbm',
-'gbn',
-'gbo',
-'gbp',
-'gbq',
-'gbr',
-'gbs',
-'gbu',
-'gbv',
-'gbw',
-'gbx',
-'gby',
-'gbz',
-'gcc',
-'gcd',
-'gce',
-'gcf',
-'gcl',
-'gcn',
-'gcr',
-'gct',
-'gda',
-'gdb',
-'gdc',
-'gdd',
-'gde',
-'gdf',
-'gdg',
-'gdh',
-'gdi',
-'gdj',
-'gdk',
-'gdl',
-'gdm',
-'gdn',
-'gdo',
-'gdq',
-'gdr',
-'gds',
-'gdt',
-'gdu',
-'gdx',
-'gea',
-'geb',
-'gec',
-'ged',
-'geg',
-'geh',
-'gei',
-'gej',
-'gek',
-'gel',
-'gem',
-'geq',
-'ges',
-'gev',
-'gew',
-'gex',
-'gey',
-'gez',
-'gfk',
-'gft',
-'gfx',
-'gga',
-'ggb',
-'ggd',
-'gge',
-'ggg',
-'ggk',
-'ggl',
-'ggn',
-'ggo',
-'ggr',
-'ggt',
-'ggu',
-'ggw',
-'gha',
-'ghc',
-'ghe',
-'ghh',
-'ghk',
-'ghl',
-'ghn',
-'gho',
-'ghr',
-'ghs',
-'ght',
-'gia',
-'gib',
-'gic',
-'gid',
-'gie',
-'gig',
-'gih',
-'gil',
-'gim',
-'gin',
-'gio',
-'gip',
-'giq',
-'gir',
-'gis',
-'git',
-'giu',
-'giw',
-'gix',
-'giy',
-'giz',
-'gji',
-'gjk',
-'gjm',
-'gjn',
-'gjr',
-'gju',
-'gka',
-'gkd',
-'gke',
-'gkn',
-'gko',
-'gkp',
-'gku',
-'glc',
-'gld',
-'glh',
-'gli',
-'glj',
-'glk',
-'gll',
-'glo',
-'glr',
-'glu',
-'glw',
-'gly',
-'gma',
-'gmb',
-'gmd',
-'gme',
-'gmg',
-'gmh',
-'gml',
-'gmm',
-'gmn',
-'gmq',
-'gmu',
-'gmv',
-'gmw',
-'gmx',
-'gmy',
-'gmz',
-'gna',
-'gnb',
-'gnc',
-'gnd',
-'gne',
-'gng',
-'gnh',
-'gni',
-'gnj',
-'gnk',
-'gnl',
-'gnm',
-'gnn',
-'gno',
-'gnq',
-'gnr',
-'gnt',
-'gnu',
-'gnw',
-'gnz',
-'goa',
-'gob',
-'goc',
-'god',
-'goe',
-'gof',
-'gog',
-'goh',
-'goi',
-'goj',
-'gok',
-'gol',
-'gom',
-'gon',
-'goo',
-'gop',
-'goq',
-'gor',
-'gos',
-'got',
-'gou',
-'gow',
-'gox',
-'goy',
-'goz',
-'gpa',
-'gpe',
-'gpn',
-'gqa',
-'gqi',
-'gqn',
-'gqr',
-'gqu',
-'gra',
-'grb',
-'grc',
-'grd',
-'grg',
-'grh',
-'gri',
-'grj',
-'grk',
-'grm',
-'gro',
-'grq',
-'grr',
-'grs',
-'grt',
-'gru',
-'grv',
-'grw',
-'grx',
-'gry',
-'grz',
-'gse',
-'gsg',
-'gsl',
-'gsm',
-'gsn',
-'gso',
-'gsp',
-'gss',
-'gsw',
-'gta',
-'gti',
-'gtu',
-'gua',
-'gub',
-'guc',
-'gud',
-'gue',
-'guf',
-'gug',
-'guh',
-'gui',
-'guk',
-'gul',
-'gum',
-'gun',
-'guo',
-'gup',
-'guq',
-'gur',
-'gus',
-'gut',
-'guu',
-'guv',
-'guw',
-'gux',
-'guz',
-'gva',
-'gvc',
-'gve',
-'gvf',
-'gvj',
-'gvl',
-'gvm',
-'gvn',
-'gvo',
-'gvp',
-'gvr',
-'gvs',
-'gvy',
-'gwa',
-'gwb',
-'gwc',
-'gwd',
-'gwe',
-'gwf',
-'gwg',
-'gwi',
-'gwj',
-'gwm',
-'gwn',
-'gwr',
-'gwt',
-'gwu',
-'gww',
-'gwx',
-'gxx',
-'gya',
-'gyb',
-'gyd',
-'gye',
-'gyf',
-'gyg',
-'gyi',
-'gyl',
-'gym',
-'gyn',
-'gyo',
-'gyr',
-'gyy',
-'gza',
-'gzi',
-'gzn',
-'haa',
-'hab',
-'hac',
-'had',
-'hae',
-'haf',
-'hag',
-'hah',
-'hai',
-'haj',
-'hak',
-'hal',
-'ham',
-'han',
-'hao',
-'hap',
-'haq',
-'har',
-'has',
-'hav',
-'haw',
-'hax',
-'hay',
-'haz',
-'hba',
-'hbb',
-'hbn',
-'hbo',
-'hbu',
-'hca',
-'hch',
-'hdn',
-'hds',
-'hdy',
-'hea',
-'hed',
-'heg',
-'heh',
-'hei',
-'hem',
-'hgm',
-'hgw',
-'hhi',
-'hhr',
-'hhy',
-'hia',
-'hib',
-'hid',
-'hif',
-'hig',
-'hih',
-'hii',
-'hij',
-'hik',
-'hil',
-'him',
-'hio',
-'hir',
-'hit',
-'hiw',
-'hix',
-'hji',
-'hka',
-'hke',
-'hkk',
-'hkn',
-'hks',
-'hla',
-'hlb',
-'hld',
-'hle',
-'hlt',
-'hlu',
-'hma',
-'hmb',
-'hmc',
-'hmd',
-'hme',
-'hmf',
-'hmg',
-'hmh',
-'hmi',
-'hmj',
-'hmk',
-'hml',
-'hmm',
-'hmn',
-'hmp',
-'hmq',
-'hmr',
-'hms',
-'hmt',
-'hmu',
-'hmv',
-'hmw',
-'hmx',
-'hmy',
-'hmz',
-'hna',
-'hnd',
-'hne',
-'hnh',
-'hni',
-'hnj',
-'hnn',
-'hno',
-'hns',
-'hnu',
-'hoa',
-'hob',
-'hoc',
-'hod',
-'hoe',
-'hoh',
-'hoi',
-'hoj',
-'hok',
-'hol',
-'hom',
-'hoo',
-'hop',
-'hor',
-'hos',
-'hot',
-'hov',
-'how',
-'hoy',
-'hoz',
-'hpo',
-'hps',
-'hra',
-'hrc',
-'hre',
-'hrk',
-'hrm',
-'hro',
-'hrp',
-'hrr',
-'hrt',
-'hru',
-'hrw',
-'hrx',
-'hrz',
-'hsb',
-'hsh',
-'hsl',
-'hsn',
-'hss',
-'hti',
-'hto',
-'hts',
-'htu',
-'htx',
-'hub',
-'huc',
-'hud',
-'hue',
-'huf',
-'hug',
-'huh',
-'hui',
-'huj',
-'huk',
-'hul',
-'hum',
-'huo',
-'hup',
-'huq',
-'hur',
-'hus',
-'hut',
-'huu',
-'huv',
-'huw',
-'hux',
-'huy',
-'huz',
-'hvc',
-'hve',
-'hvk',
-'hvn',
-'hvv',
-'hwa',
-'hwc',
-'hwo',
-'hya',
-'hyw',
-'hyx',
-'iai',
-'ian',
-'iap',
-'iar',
-'iba',
-'ibb',
-'ibd',
-'ibe',
-'ibg',
-'ibh',
-'ibi',
-'ibl',
-'ibm',
-'ibn',
-'ibr',
-'ibu',
-'iby',
-'ica',
-'ich',
-'icl',
-'icr',
-'ida',
-'idb',
-'idc',
-'idd',
-'ide',
-'idi',
-'idr',
-'ids',
-'idt',
-'idu',
-'ifa',
-'ifb',
-'ife',
-'iff',
-'ifk',
-'ifm',
-'ifu',
-'ify',
-'igb',
-'ige',
-'igg',
-'igl',
-'igm',
-'ign',
-'igo',
-'igs',
-'igw',
-'ihb',
-'ihi',
-'ihp',
-'ihw',
-'iin',
-'iir',
-'ijc',
-'ije',
-'ijj',
-'ijn',
-'ijo',
-'ijs',
-'ike',
-'iki',
-'ikk',
-'ikl',
-'iko',
-'ikp',
-'ikr',
-'iks',
-'ikt',
-'ikv',
-'ikw',
-'ikx',
-'ikz',
-'ila',
-'ilb',
-'ilg',
-'ili',
-'ilk',
-'ill',
-'ilm',
-'ilo',
-'ilp',
-'ils',
-'ilu',
-'ilv',
-'ilw',
-'ima',
-'ime',
-'imi',
-'iml',
-'imn',
-'imo',
-'imr',
-'ims',
-'imy',
-'inb',
-'inc',
-'ine',
-'ing',
-'inh',
-'inj',
-'inl',
-'inm',
-'inn',
-'ino',
-'inp',
-'ins',
-'int',
-'inz',
-'ior',
-'iou',
-'iow',
-'ipi',
-'ipo',
-'iqu',
-'iqw',
-'ira',
-'ire',
-'irh',
-'iri',
-'irk',
-'irn',
-'iro',
-'irr',
-'iru',
-'irx',
-'iry',
-'isa',
-'isc',
-'isd',
-'ise',
-'isg',
-'ish',
-'isi',
-'isk',
-'ism',
-'isn',
-'iso',
-'isr',
-'ist',
-'isu',
-'itb',
-'itc',
-'itd',
-'ite',
-'iti',
-'itk',
-'itl',
-'itm',
-'ito',
-'itr',
-'its',
-'itt',
-'itv',
-'itw',
-'itx',
-'ity',
-'itz',
-'ium',
-'ivb',
-'ivv',
-'iwk',
-'iwm',
-'iwo',
-'iws',
-'ixc',
-'ixl',
-'iya',
-'iyo',
-'iyx',
-'izh',
-'izi',
-'izr',
-'izz',
-'jaa',
-'jab',
-'jac',
-'jad',
-'jae',
-'jaf',
-'jah',
-'jaj',
-'jak',
-'jal',
-'jam',
-'jan',
-'jao',
-'jaq',
-'jar',
-'jas',
-'jat',
-'jau',
-'jax',
-'jay',
-'jaz',
-'jbe',
-'jbi',
-'jbj',
-'jbk',
-'jbn',
-'jbo',
-'jbr',
-'jbt',
-'jbu',
-'jbw',
-'jcs',
-'jct',
-'jda',
-'jdg',
-'jdt',
-'jeb',
-'jee',
-'jeg',
-'jeh',
-'jei',
-'jek',
-'jel',
-'jen',
-'jer',
-'jet',
-'jeu',
-'jgb',
-'jge',
-'jgk',
-'jgo',
-'jhi',
-'jhs',
-'jia',
-'jib',
-'jic',
-'jid',
-'jie',
-'jig',
-'jih',
-'jii',
-'jil',
-'jim',
-'jio',
-'jiq',
-'jit',
-'jiu',
-'jiv',
-'jiy',
-'jje',
-'jjr',
-'jka',
-'jkm',
-'jko',
-'jkp',
-'jkr',
-'jku',
-'jle',
-'jls',
-'jma',
-'jmb',
-'jmc',
-'jmd',
-'jmi',
-'jml',
-'jmn',
-'jmr',
-'jms',
-'jmw',
-'jmx',
-'jna',
-'jnd',
-'jng',
-'jni',
-'jnj',
-'jnl',
-'jns',
-'job',
-'jod',
-'jog',
-'jor',
-'jos',
-'jow',
-'jpa',
-'jpr',
-'jpx',
-'jqr',
-'jra',
-'jrb',
-'jrr',
-'jrt',
-'jru',
-'jsl',
-'jua',
-'jub',
-'juc',
-'jud',
-'juh',
-'jui',
-'juk',
-'jul',
-'jum',
-'jun',
-'juo',
-'jup',
-'jur',
-'jus',
-'jut',
-'juu',
-'juw',
-'juy',
-'jvd',
-'jvn',
-'jwi',
-'jya',
-'jye',
-'jyy',
-'kaa',
-'kab',
-'kac',
-'kad',
-'kae',
-'kaf',
-'kag',
-'kah',
-'kai',
-'kaj',
-'kak',
-'kam',
-'kao',
-'kap',
-'kaq',
-'kar',
-'kav',
-'kaw',
-'kax',
-'kay',
-'kba',
-'kbb',
-'kbc',
-'kbd',
-'kbe',
-'kbf',
-'kbg',
-'kbh',
-'kbi',
-'kbj',
-'kbk',
-'kbl',
-'kbm',
-'kbn',
-'kbo',
-'kbp',
-'kbq',
-'kbr',
-'kbs',
-'kbt',
-'kbu',
-'kbv',
-'kbw',
-'kbx',
-'kby',
-'kbz',
-'kca',
-'kcb',
-'kcc',
-'kcd',
-'kce',
-'kcf',
-'kcg',
-'kch',
-'kci',
-'kcj',
-'kck',
-'kcl',
-'kcm',
-'kcn',
-'kco',
-'kcp',
-'kcq',
-'kcr',
-'kcs',
-'kct',
-'kcu',
-'kcv',
-'kcw',
-'kcx',
-'kcy',
-'kcz',
-'kda',
-'kdc',
-'kdd',
-'kde',
-'kdf',
-'kdg',
-'kdh',
-'kdi',
-'kdj',
-'kdk',
-'kdl',
-'kdm',
-'kdn',
-'kdo',
-'kdp',
-'kdq',
-'kdr',
-'kdt',
-'kdu',
-'kdv',
-'kdw',
-'kdx',
-'kdy',
-'kdz',
-'kea',
-'keb',
-'kec',
-'ked',
-'kee',
-'kef',
-'keg',
-'keh',
-'kei',
-'kej',
-'kek',
-'kel',
-'kem',
-'ken',
-'keo',
-'kep',
-'keq',
-'ker',
-'kes',
-'ket',
-'keu',
-'kev',
-'kew',
-'kex',
-'key',
-'kez',
-'kfa',
-'kfb',
-'kfc',
-'kfd',
-'kfe',
-'kff',
-'kfg',
-'kfh',
-'kfi',
-'kfj',
-'kfk',
-'kfl',
-'kfm',
-'kfn',
-'kfo',
-'kfp',
-'kfq',
-'kfr',
-'kfs',
-'kft',
-'kfu',
-'kfv',
-'kfw',
-'kfx',
-'kfy',
-'kfz',
-'kga',
-'kgb',
-'kgc',
-'kgd',
-'kge',
-'kgf',
-'kgg',
-'kgh',
-'kgi',
-'kgj',
-'kgk',
-'kgl',
-'kgm',
-'kgn',
-'kgo',
-'kgp',
-'kgq',
-'kgr',
-'kgs',
-'kgt',
-'kgu',
-'kgv',
-'kgw',
-'kgx',
-'kgy',
-'kha',
-'khb',
-'khc',
-'khd',
-'khe',
-'khf',
-'khg',
-'khh',
-'khi',
-'khj',
-'khk',
-'khl',
-'khn',
-'kho',
-'khp',
-'khq',
-'khr',
-'khs',
-'kht',
-'khu',
-'khv',
-'khw',
-'khx',
-'khy',
-'khz',
-'kia',
-'kib',
-'kic',
-'kid',
-'kie',
-'kif',
-'kig',
-'kih',
-'kii',
-'kij',
-'kil',
-'kim',
-'kio',
-'kip',
-'kiq',
-'kis',
-'kit',
-'kiu',
-'kiv',
-'kiw',
-'kix',
-'kiy',
-'kiz',
-'kja',
-'kjb',
-'kjc',
-'kjd',
-'kje',
-'kjf',
-'kjg',
-'kjh',
-'kji',
-'kjj',
-'kjk',
-'kjl',
-'kjm',
-'kjn',
-'kjo',
-'kjp',
-'kjq',
-'kjr',
-'kjs',
-'kjt',
-'kju',
-'kjv',
-'kjx',
-'kjy',
-'kjz',
-'kka',
-'kkb',
-'kkc',
-'kkd',
-'kke',
-'kkf',
-'kkg',
-'kkh',
-'kki',
-'kkj',
-'kkk',
-'kkl',
-'kkm',
-'kkn',
-'kko',
-'kkp',
-'kkq',
-'kkr',
-'kks',
-'kkt',
-'kku',
-'kkv',
-'kkw',
-'kkx',
-'kky',
-'kkz',
-'kla',
-'klb',
-'klc',
-'kld',
-'kle',
-'klf',
-'klg',
-'klh',
-'kli',
-'klj',
-'klk',
-'kll',
-'klm',
-'kln',
-'klo',
-'klp',
-'klq',
-'klr',
-'kls',
-'klt',
-'klu',
-'klv',
-'klw',
-'klx',
-'kly',
-'klz',
-'kma',
-'kmb',
-'kmc',
-'kmd',
-'kme',
-'kmf',
-'kmg',
-'kmh',
-'kmi',
-'kmj',
-'kmk',
-'kml',
-'kmm',
-'kmn',
-'kmo',
-'kmp',
-'kmq',
-'kmr',
-'kms',
-'kmt',
-'kmu',
-'kmv',
-'kmw',
-'kmx',
-'kmy',
-'kmz',
-'kna',
-'knb',
-'knc',
-'knd',
-'kne',
-'knf',
-'kng',
-'kni',
-'knj',
-'knk',
-'knl',
-'knm',
-'knn',
-'kno',
-'knp',
-'knq',
-'knr',
-'kns',
-'knt',
-'knu',
-'knv',
-'knw',
-'knx',
-'kny',
-'knz',
-'koa',
-'koc',
-'kod',
-'koe',
-'kof',
-'kog',
-'koh',
-'koi',
-'koj',
-'kok',
-'kol',
-'koo',
-'kop',
-'koq',
-'kos',
-'kot',
-'kou',
-'kov',
-'kow',
-'kox',
-'koy',
-'koz',
-'kpa',
-'kpb',
-'kpc',
-'kpd',
-'kpe',
-'kpf',
-'kpg',
-'kph',
-'kpi',
-'kpj',
-'kpk',
-'kpl',
-'kpm',
-'kpn',
-'kpo',
-'kpp',
-'kpq',
-'kpr',
-'kps',
-'kpt',
-'kpu',
-'kpv',
-'kpw',
-'kpx',
-'kpy',
-'kpz',
-'kqa',
-'kqb',
-'kqc',
-'kqd',
-'kqe',
-'kqf',
-'kqg',
-'kqh',
-'kqi',
-'kqj',
-'kqk',
-'kql',
-'kqm',
-'kqn',
-'kqo',
-'kqp',
-'kqq',
-'kqr',
-'kqs',
-'kqt',
-'kqu',
-'kqv',
-'kqw',
-'kqx',
-'kqy',
-'kqz',
-'kra',
-'krb',
-'krc',
-'krd',
-'kre',
-'krf',
-'krh',
-'kri',
-'krj',
-'krk',
-'krl',
-'krm',
-'krn',
-'kro',
-'krp',
-'krr',
-'krs',
-'krt',
-'kru',
-'krv',
-'krw',
-'krx',
-'kry',
-'krz',
-'ksa',
-'ksb',
-'ksc',
-'ksd',
-'kse',
-'ksf',
-'ksg',
-'ksh',
-'ksi',
-'ksj',
-'ksk',
-'ksl',
-'ksm',
-'ksn',
-'kso',
-'ksp',
-'ksq',
-'ksr',
-'kss',
-'kst',
-'ksu',
-'ksv',
-'ksw',
-'ksx',
-'ksy',
-'ksz',
-'kta',
-'ktb',
-'ktc',
-'ktd',
-'kte',
-'ktf',
-'ktg',
-'kth',
-'kti',
-'ktj',
-'ktk',
-'ktl',
-'ktm',
-'ktn',
-'kto',
-'ktp',
-'ktq',
-'ktr',
-'kts',
-'ktt',
-'ktu',
-'ktv',
-'ktw',
-'ktx',
-'kty',
-'ktz',
-'kub',
-'kuc',
-'kud',
-'kue',
-'kuf',
-'kug',
-'kuh',
-'kui',
-'kuj',
-'kuk',
-'kul',
-'kum',
-'kun',
-'kuo',
-'kup',
-'kuq',
-'kus',
-'kut',
-'kuu',
-'kuv',
-'kuw',
-'kux',
-'kuy',
-'kuz',
-'kva',
-'kvb',
-'kvc',
-'kvd',
-'kve',
-'kvf',
-'kvg',
-'kvh',
-'kvi',
-'kvj',
-'kvk',
-'kvl',
-'kvm',
-'kvn',
-'kvo',
-'kvp',
-'kvq',
-'kvr',
-'kvs',
-'kvt',
-'kvu',
-'kvv',
-'kvw',
-'kvx',
-'kvy',
-'kvz',
-'kwa',
-'kwb',
-'kwc',
-'kwd',
-'kwe',
-'kwf',
-'kwg',
-'kwh',
-'kwi',
-'kwj',
-'kwk',
-'kwl',
-'kwm',
-'kwn',
-'kwo',
-'kwp',
-'kwq',
-'kwr',
-'kws',
-'kwt',
-'kwu',
-'kwv',
-'kww',
-'kwx',
-'kwy',
-'kwz',
-'kxa',
-'kxb',
-'kxc',
-'kxd',
-'kxe',
-'kxf',
-'kxh',
-'kxi',
-'kxj',
-'kxk',
-'kxl',
-'kxm',
-'kxn',
-'kxo',
-'kxp',
-'kxq',
-'kxr',
-'kxs',
-'kxt',
-'kxu',
-'kxv',
-'kxw',
-'kxx',
-'kxy',
-'kxz',
-'kya',
-'kyb',
-'kyc',
-'kyd',
-'kye',
-'kyf',
-'kyg',
-'kyh',
-'kyi',
-'kyj',
-'kyk',
-'kyl',
-'kym',
-'kyn',
-'kyo',
-'kyp',
-'kyq',
-'kyr',
-'kys',
-'kyt',
-'kyu',
-'kyv',
-'kyw',
-'kyx',
-'kyy',
-'kyz',
-'kza',
-'kzb',
-'kzc',
-'kzd',
-'kze',
-'kzf',
-'kzg',
-'kzh',
-'kzi',
-'kzj',
-'kzk',
-'kzl',
-'kzm',
-'kzn',
-'kzo',
-'kzp',
-'kzq',
-'kzr',
-'kzs',
-'kzt',
-'kzu',
-'kzv',
-'kzw',
-'kzx',
-'kzy',
-'kzz',
-'laa',
-'lab',
-'lac',
-'lad',
-'lae',
-'laf',
-'lag',
-'lah',
-'lai',
-'laj',
-'lak',
-'lal',
-'lam',
-'lan',
-'lap',
-'laq',
-'lar',
-'las',
-'lau',
-'law',
-'lax',
-'lay',
-'laz',
-'lba',
-'lbb',
-'lbc',
-'lbe',
-'lbf',
-'lbg',
-'lbi',
-'lbj',
-'lbk',
-'lbl',
-'lbm',
-'lbn',
-'lbo',
-'lbq',
-'lbr',
-'lbs',
-'lbt',
-'lbu',
-'lbv',
-'lbw',
-'lbx',
-'lby',
-'lbz',
-'lcc',
-'lcd',
-'lce',
-'lcf',
-'lch',
-'lcl',
-'lcm',
-'lcp',
-'lcq',
-'lcs',
-'lda',
-'ldb',
-'ldd',
-'ldg',
-'ldh',
-'ldi',
-'ldj',
-'ldk',
-'ldl',
-'ldm',
-'ldn',
-'ldo',
-'ldp',
-'ldq',
-'lea',
-'leb',
-'lec',
-'led',
-'lee',
-'lef',
-'leg',
-'leh',
-'lei',
-'lej',
-'lek',
-'lel',
-'lem',
-'len',
-'leo',
-'lep',
-'leq',
-'ler',
-'les',
-'let',
-'leu',
-'lev',
-'lew',
-'lex',
-'ley',
-'lez',
-'lfa',
-'lfn',
-'lga',
-'lgb',
-'lgg',
-'lgh',
-'lgi',
-'lgk',
-'lgl',
-'lgm',
-'lgn',
-'lgq',
-'lgr',
-'lgt',
-'lgu',
-'lgz',
-'lha',
-'lhh',
-'lhi',
-'lhl',
-'lhm',
-'lhn',
-'lhp',
-'lhs',
-'lht',
-'lhu',
-'lia',
-'lib',
-'lic',
-'lid',
-'lie',
-'lif',
-'lig',
-'lih',
-'lii',
-'lij',
-'lik',
-'lil',
-'lio',
-'lip',
-'liq',
-'lir',
-'lis',
-'liu',
-'liv',
-'liw',
-'lix',
-'liy',
-'liz',
-'lja',
-'lje',
-'lji',
-'ljl',
-'ljp',
-'ljw',
-'ljx',
-'lka',
-'lkb',
-'lkc',
-'lkd',
-'lke',
-'lkh',
-'lki',
-'lkj',
-'lkl',
-'lkm',
-'lkn',
-'lko',
-'lkr',
-'lks',
-'lkt',
-'lku',
-'lky',
-'lla',
-'llb',
-'llc',
-'lld',
-'lle',
-'llf',
-'llg',
-'llh',
-'lli',
-'llj',
-'llk',
-'lll',
-'llm',
-'lln',
-'llo',
-'llp',
-'llq',
-'lls',
-'llu',
-'llx',
-'lma',
-'lmb',
-'lmc',
-'lmd',
-'lme',
-'lmf',
-'lmg',
-'lmh',
-'lmi',
-'lmj',
-'lmk',
-'lml',
-'lmm',
-'lmn',
-'lmo',
-'lmp',
-'lmq',
-'lmr',
-'lmu',
-'lmv',
-'lmw',
-'lmx',
-'lmy',
-'lmz',
-'lna',
-'lnb',
-'lnd',
-'lng',
-'lnh',
-'lni',
-'lnj',
-'lnl',
-'lnm',
-'lnn',
-'lno',
-'lns',
-'lnu',
-'lnw',
-'lnz',
-'loa',
-'lob',
-'loc',
-'loe',
-'lof',
-'log',
-'loh',
-'loi',
-'loj',
-'lok',
-'lol',
-'lom',
-'lon',
-'loo',
-'lop',
-'loq',
-'lor',
-'los',
-'lot',
-'lou',
-'lov',
-'low',
-'lox',
-'loy',
-'loz',
-'lpa',
-'lpe',
-'lpn',
-'lpo',
-'lpx',
-'lra',
-'lrc',
-'lre',
-'lrg',
-'lri',
-'lrk',
-'lrl',
-'lrm',
-'lrn',
-'lro',
-'lrr',
-'lrt',
-'lrv',
-'lrz',
-'lsa',
-'lsd',
-'lse',
-'lsg',
-'lsh',
-'lsi',
-'lsl',
-'lsm',
-'lso',
-'lsp',
-'lsr',
-'lss',
-'lst',
-'lsy',
-'ltc',
-'ltg',
-'lth',
-'lti',
-'ltn',
-'lto',
-'lts',
-'ltu',
-'lua',
-'luc',
-'lud',
-'lue',
-'luf',
-'lui',
-'luj',
-'luk',
-'lul',
-'lum',
-'lun',
-'luo',
-'lup',
-'luq',
-'lur',
-'lus',
-'lut',
-'luu',
-'luv',
-'luw',
-'luy',
-'luz',
-'lva',
-'lvk',
-'lvs',
-'lvu',
-'lwa',
-'lwe',
-'lwg',
-'lwh',
-'lwl',
-'lwm',
-'lwo',
-'lws',
-'lwt',
-'lwu',
-'lww',
-'lya',
-'lyg',
-'lyn',
-'lzh',
-'lzl',
-'lzn',
-'lzz',
-'maa',
-'mab',
-'mad',
-'mae',
-'maf',
-'mag',
-'mai',
-'maj',
-'mak',
-'mam',
-'man',
-'map',
-'maq',
-'mas',
-'mat',
-'mau',
-'mav',
-'maw',
-'max',
-'maz',
-'mba',
-'mbb',
-'mbc',
-'mbd',
-'mbe',
-'mbf',
-'mbh',
-'mbi',
-'mbj',
-'mbk',
-'mbl',
-'mbm',
-'mbn',
-'mbo',
-'mbp',
-'mbq',
-'mbr',
-'mbs',
-'mbt',
-'mbu',
-'mbv',
-'mbw',
-'mbx',
-'mby',
-'mbz',
-'mca',
-'mcb',
-'mcc',
-'mcd',
-'mce',
-'mcf',
-'mcg',
-'mch',
-'mci',
-'mcj',
-'mck',
-'mcl',
-'mcm',
-'mcn',
-'mco',
-'mcp',
-'mcq',
-'mcr',
-'mcs',
-'mct',
-'mcu',
-'mcv',
-'mcw',
-'mcx',
-'mcy',
-'mcz',
-'mda',
-'mdb',
-'mdc',
-'mdd',
-'mde',
-'mdf',
-'mdg',
-'mdh',
-'mdi',
-'mdj',
-'mdk',
-'mdl',
-'mdm',
-'mdn',
-'mdp',
-'mdq',
-'mdr',
-'mds',
-'mdt',
-'mdu',
-'mdv',
-'mdw',
-'mdx',
-'mdy',
-'mdz',
-'mea',
-'meb',
-'mec',
-'med',
-'mee',
-'mef',
-'meg',
-'meh',
-'mei',
-'mej',
-'mek',
-'mel',
-'mem',
-'men',
-'meo',
-'mep',
-'meq',
-'mer',
-'mes',
-'met',
-'meu',
-'mev',
-'mew',
-'mey',
-'mez',
-'mfa',
-'mfb',
-'mfc',
-'mfd',
-'mfe',
-'mff',
-'mfg',
-'mfh',
-'mfi',
-'mfj',
-'mfk',
-'mfl',
-'mfm',
-'mfn',
-'mfo',
-'mfp',
-'mfq',
-'mfr',
-'mfs',
-'mft',
-'mfu',
-'mfv',
-'mfw',
-'mfx',
-'mfy',
-'mfz',
-'mga',
-'mgb',
-'mgc',
-'mgd',
-'mge',
-'mgf',
-'mgg',
-'mgh',
-'mgi',
-'mgj',
-'mgk',
-'mgl',
-'mgm',
-'mgn',
-'mgo',
-'mgp',
-'mgq',
-'mgr',
-'mgs',
-'mgt',
-'mgu',
-'mgv',
-'mgw',
-'mgx',
-'mgy',
-'mgz',
-'mha',
-'mhb',
-'mhc',
-'mhd',
-'mhe',
-'mhf',
-'mhg',
-'mhh',
-'mhi',
-'mhj',
-'mhk',
-'mhl',
-'mhm',
-'mhn',
-'mho',
-'mhp',
-'mhq',
-'mhr',
-'mhs',
-'mht',
-'mhu',
-'mhw',
-'mhx',
-'mhy',
-'mhz',
-'mia',
-'mib',
-'mic',
-'mid',
-'mie',
-'mif',
-'mig',
-'mih',
-'mii',
-'mij',
-'mik',
-'mil',
-'mim',
-'min',
-'mio',
-'mip',
-'miq',
-'mir',
-'mis',
-'mit',
-'miu',
-'miw',
-'mix',
-'miy',
-'miz',
-'mja',
-'mjb',
-'mjc',
-'mjd',
-'mje',
-'mjg',
-'mjh',
-'mji',
-'mjj',
-'mjk',
-'mjl',
-'mjm',
-'mjn',
-'mjo',
-'mjp',
-'mjq',
-'mjr',
-'mjs',
-'mjt',
-'mju',
-'mjv',
-'mjw',
-'mjx',
-'mjy',
-'mjz',
-'mka',
-'mkb',
-'mkc',
-'mke',
-'mkf',
-'mkg',
-'mkh',
-'mki',
-'mkj',
-'mkk',
-'mkl',
-'mkm',
-'mkn',
-'mko',
-'mkp',
-'mkq',
-'mkr',
-'mks',
-'mkt',
-'mku',
-'mkv',
-'mkw',
-'mkx',
-'mky',
-'mkz',
-'mla',
-'mlb',
-'mlc',
-'mld',
-'mle',
-'mlf',
-'mlh',
-'mli',
-'mlj',
-'mlk',
-'mll',
-'mlm',
-'mln',
-'mlo',
-'mlp',
-'mlq',
-'mlr',
-'mls',
-'mlu',
-'mlv',
-'mlw',
-'mlx',
-'mlz',
-'mma',
-'mmb',
-'mmc',
-'mmd',
-'mme',
-'mmf',
-'mmg',
-'mmh',
-'mmi',
-'mmj',
-'mmk',
-'mml',
-'mmm',
-'mmn',
-'mmo',
-'mmp',
-'mmq',
-'mmr',
-'mmt',
-'mmu',
-'mmv',
-'mmw',
-'mmx',
-'mmy',
-'mmz',
-'mna',
-'mnb',
-'mnc',
-'mnd',
-'mne',
-'mnf',
-'mng',
-'mnh',
-'mni',
-'mnj',
-'mnk',
-'mnl',
-'mnm',
-'mnn',
-'mno',
-'mnp',
-'mnq',
-'mnr',
-'mns',
-'mnt',
-'mnu',
-'mnv',
-'mnw',
-'mnx',
-'mny',
-'mnz',
-'moa',
-'moc',
-'mod',
-'moe',
-'mof',
-'mog',
-'moh',
-'moi',
-'moj',
-'mok',
-'mom',
-'moo',
-'mop',
-'moq',
-'mor',
-'mos',
-'mot',
-'mou',
-'mov',
-'mow',
-'mox',
-'moy',
-'moz',
-'mpa',
-'mpb',
-'mpc',
-'mpd',
-'mpe',
-'mpg',
-'mph',
-'mpi',
-'mpj',
-'mpk',
-'mpl',
-'mpm',
-'mpn',
-'mpo',
-'mpp',
-'mpq',
-'mpr',
-'mps',
-'mpt',
-'mpu',
-'mpv',
-'mpw',
-'mpx',
-'mpy',
-'mpz',
-'mqa',
-'mqb',
-'mqc',
-'mqe',
-'mqf',
-'mqg',
-'mqh',
-'mqi',
-'mqj',
-'mqk',
-'mql',
-'mqm',
-'mqn',
-'mqo',
-'mqp',
-'mqq',
-'mqr',
-'mqs',
-'mqt',
-'mqu',
-'mqv',
-'mqw',
-'mqx',
-'mqy',
-'mqz',
-'mra',
-'mrb',
-'mrc',
-'mrd',
-'mre',
-'mrf',
-'mrg',
-'mrh',
-'mrj',
-'mrk',
-'mrl',
-'mrm',
-'mrn',
-'mro',
-'mrp',
-'mrq',
-'mrr',
-'mrs',
-'mrt',
-'mru',
-'mrv',
-'mrw',
-'mrx',
-'mry',
-'mrz',
-'msb',
-'msc',
-'msd',
-'mse',
-'msf',
-'msg',
-'msh',
-'msi',
-'msj',
-'msk',
-'msl',
-'msm',
-'msn',
-'mso',
-'msp',
-'msq',
-'msr',
-'mss',
-'mst',
-'msu',
-'msv',
-'msw',
-'msx',
-'msy',
-'msz',
-'mta',
-'mtb',
-'mtc',
-'mtd',
-'mte',
-'mtf',
-'mtg',
-'mth',
-'mti',
-'mtj',
-'mtk',
-'mtl',
-'mtm',
-'mtn',
-'mto',
-'mtp',
-'mtq',
-'mtr',
-'mts',
-'mtt',
-'mtu',
-'mtv',
-'mtw',
-'mtx',
-'mty',
-'mua',
-'mub',
-'muc',
-'mud',
-'mue',
-'mug',
-'muh',
-'mui',
-'muj',
-'muk',
-'mul',
-'mum',
-'mun',
-'muo',
-'mup',
-'muq',
-'mur',
-'mus',
-'mut',
-'muu',
-'muv',
-'mux',
-'muy',
-'muz',
-'mva',
-'mvb',
-'mvd',
-'mve',
-'mvf',
-'mvg',
-'mvh',
-'mvi',
-'mvk',
-'mvl',
-'mvm',
-'mvn',
-'mvo',
-'mvp',
-'mvq',
-'mvr',
-'mvs',
-'mvt',
-'mvu',
-'mvv',
-'mvw',
-'mvx',
-'mvy',
-'mvz',
-'mwa',
-'mwb',
-'mwc',
-'mwd',
-'mwe',
-'mwf',
-'mwg',
-'mwh',
-'mwi',
-'mwj',
-'mwk',
-'mwl',
-'mwm',
-'mwn',
-'mwo',
-'mwp',
-'mwq',
-'mwr',
-'mws',
-'mwt',
-'mwu',
-'mwv',
-'mww',
-'mwx',
-'mwy',
-'mwz',
-'mxa',
-'mxb',
-'mxc',
-'mxd',
-'mxe',
-'mxf',
-'mxg',
-'mxh',
-'mxi',
-'mxj',
-'mxk',
-'mxl',
-'mxm',
-'mxn',
-'mxo',
-'mxp',
-'mxq',
-'mxr',
-'mxs',
-'mxt',
-'mxu',
-'mxv',
-'mxw',
-'mxx',
-'mxy',
-'mxz',
-'myb',
-'myc',
-'myd',
-'mye',
-'myf',
-'myg',
-'myh',
-'myi',
-'myj',
-'myk',
-'myl',
-'mym',
-'myn',
-'myo',
-'myp',
-'myq',
-'myr',
-'mys',
-'myt',
-'myu',
-'myv',
-'myw',
-'myx',
-'myy',
-'myz',
-'mza',
-'mzb',
-'mzc',
-'mzd',
-'mze',
-'mzg',
-'mzh',
-'mzi',
-'mzj',
-'mzk',
-'mzl',
-'mzm',
-'mzn',
-'mzo',
-'mzp',
-'mzq',
-'mzr',
-'mzs',
-'mzt',
-'mzu',
-'mzv',
-'mzw',
-'mzx',
-'mzy',
-'mzz',
-'naa',
-'nab',
-'nac',
-'nad',
-'nae',
-'naf',
-'nag',
-'nah',
-'nai',
-'naj',
-'nak',
-'nal',
-'nam',
-'nan',
-'nao',
-'nap',
-'naq',
-'nar',
-'nas',
-'nat',
-'naw',
-'nax',
-'nay',
-'naz',
-'nba',
-'nbb',
-'nbc',
-'nbd',
-'nbe',
-'nbf',
-'nbg',
-'nbh',
-'nbi',
-'nbj',
-'nbk',
-'nbm',
-'nbn',
-'nbo',
-'nbp',
-'nbq',
-'nbr',
-'nbs',
-'nbt',
-'nbu',
-'nbv',
-'nbw',
-'nbx',
-'nby',
-'nca',
-'ncb',
-'ncc',
-'ncd',
-'nce',
-'ncf',
-'ncg',
-'nch',
-'nci',
-'ncj',
-'nck',
-'ncl',
-'ncm',
-'ncn',
-'nco',
-'ncp',
-'ncq',
-'ncr',
-'ncs',
-'nct',
-'ncu',
-'ncx',
-'ncz',
-'nda',
-'ndb',
-'ndc',
-'ndd',
-'ndf',
-'ndg',
-'ndh',
-'ndi',
-'ndj',
-'ndk',
-'ndl',
-'ndm',
-'ndn',
-'ndp',
-'ndq',
-'ndr',
-'nds',
-'ndt',
-'ndu',
-'ndv',
-'ndw',
-'ndx',
-'ndy',
-'ndz',
-'nea',
-'neb',
-'nec',
-'ned',
-'nee',
-'nef',
-'neg',
-'neh',
-'nei',
-'nej',
-'nek',
-'nem',
-'nen',
-'neo',
-'neq',
-'ner',
-'nes',
-'net',
-'neu',
-'nev',
-'new',
-'nex',
-'ney',
-'nez',
-'nfa',
-'nfd',
-'nfl',
-'nfr',
-'nfu',
-'nga',
-'ngb',
-'ngc',
-'ngd',
-'nge',
-'ngf',
-'ngg',
-'ngh',
-'ngi',
-'ngj',
-'ngk',
-'ngl',
-'ngm',
-'ngn',
-'ngo',
-'ngp',
-'ngq',
-'ngr',
-'ngs',
-'ngt',
-'ngu',
-'ngv',
-'ngw',
-'ngx',
-'ngy',
-'ngz',
-'nha',
-'nhb',
-'nhc',
-'nhd',
-'nhe',
-'nhf',
-'nhg',
-'nhh',
-'nhi',
-'nhk',
-'nhm',
-'nhn',
-'nho',
-'nhp',
-'nhq',
-'nhr',
-'nht',
-'nhu',
-'nhv',
-'nhw',
-'nhx',
-'nhy',
-'nhz',
-'nia',
-'nib',
-'nic',
-'nid',
-'nie',
-'nif',
-'nig',
-'nih',
-'nii',
-'nij',
-'nik',
-'nil',
-'nim',
-'nin',
-'nio',
-'niq',
-'nir',
-'nis',
-'nit',
-'niu',
-'niv',
-'niw',
-'nix',
-'niy',
-'niz',
-'nja',
-'njb',
-'njd',
-'njh',
-'nji',
-'njj',
-'njl',
-'njm',
-'njn',
-'njo',
-'njr',
-'njs',
-'njt',
-'nju',
-'njx',
-'njy',
-'njz',
-'nka',
-'nkb',
-'nkc',
-'nkd',
-'nke',
-'nkf',
-'nkg',
-'nkh',
-'nki',
-'nkj',
-'nkk',
-'nkm',
-'nkn',
-'nko',
-'nkp',
-'nkq',
-'nkr',
-'nks',
-'nkt',
-'nku',
-'nkv',
-'nkw',
-'nkx',
-'nkz',
-'nla',
-'nlc',
-'nle',
-'nlg',
-'nli',
-'nlj',
-'nlk',
-'nll',
-'nlm',
-'nln',
-'nlo',
-'nlq',
-'nlr',
-'nlu',
-'nlv',
-'nlw',
-'nlx',
-'nly',
-'nlz',
-'nma',
-'nmb',
-'nmc',
-'nmd',
-'nme',
-'nmf',
-'nmg',
-'nmh',
-'nmi',
-'nmj',
-'nmk',
-'nml',
-'nmm',
-'nmn',
-'nmo',
-'nmp',
-'nmq',
-'nmr',
-'nms',
-'nmt',
-'nmu',
-'nmv',
-'nmw',
-'nmx',
-'nmy',
-'nmz',
-'nna',
-'nnb',
-'nnc',
-'nnd',
-'nne',
-'nnf',
-'nng',
-'nnh',
-'nni',
-'nnj',
-'nnk',
-'nnl',
-'nnm',
-'nnn',
-'nnp',
-'nnq',
-'nnr',
-'nns',
-'nnt',
-'nnu',
-'nnv',
-'nnw',
-'nnx',
-'nny',
-'nnz',
-'noa',
-'noc',
-'nod',
-'noe',
-'nof',
-'nog',
-'noh',
-'noi',
-'noj',
-'nok',
-'nol',
-'nom',
-'non',
-'noo',
-'nop',
-'noq',
-'nos',
-'not',
-'nou',
-'nov',
-'now',
-'noy',
-'noz',
-'npa',
-'npb',
-'npg',
-'nph',
-'npi',
-'npl',
-'npn',
-'npo',
-'nps',
-'npu',
-'npx',
-'npy',
-'nqg',
-'nqk',
-'nql',
-'nqm',
-'nqn',
-'nqo',
-'nqq',
-'nqy',
-'nra',
-'nrb',
-'nrc',
-'nre',
-'nrf',
-'nrg',
-'nri',
-'nrk',
-'nrl',
-'nrm',
-'nrn',
-'nrp',
-'nrr',
-'nrt',
-'nru',
-'nrx',
-'nrz',
-'nsa',
-'nsc',
-'nsd',
-'nse',
-'nsf',
-'nsg',
-'nsh',
-'nsi',
-'nsk',
-'nsl',
-'nsm',
-'nsn',
-'nso',
-'nsp',
-'nsq',
-'nsr',
-'nss',
-'nst',
-'nsu',
-'nsv',
-'nsw',
-'nsx',
-'nsy',
-'nsz',
-'ntd',
-'nte',
-'ntg',
-'nti',
-'ntj',
-'ntk',
-'ntm',
-'nto',
-'ntp',
-'ntr',
-'nts',
-'ntu',
-'ntw',
-'ntx',
-'nty',
-'ntz',
-'nua',
-'nub',
-'nuc',
-'nud',
-'nue',
-'nuf',
-'nug',
-'nuh',
-'nui',
-'nuj',
-'nuk',
-'nul',
-'num',
-'nun',
-'nuo',
-'nup',
-'nuq',
-'nur',
-'nus',
-'nut',
-'nuu',
-'nuv',
-'nuw',
-'nux',
-'nuy',
-'nuz',
-'nvh',
-'nvm',
-'nvo',
-'nwa',
-'nwb',
-'nwc',
-'nwe',
-'nwg',
-'nwi',
-'nwm',
-'nwo',
-'nwr',
-'nwx',
-'nwy',
-'nxa',
-'nxd',
-'nxe',
-'nxg',
-'nxi',
-'nxk',
-'nxl',
-'nxm',
-'nxn',
-'nxo',
-'nxq',
-'nxr',
-'nxu',
-'nxx',
-'nyb',
-'nyc',
-'nyd',
-'nye',
-'nyf',
-'nyg',
-'nyh',
-'nyi',
-'nyj',
-'nyk',
-'nyl',
-'nym',
-'nyn',
-'nyo',
-'nyp',
-'nyq',
-'nyr',
-'nys',
-'nyt',
-'nyu',
-'nyv',
-'nyw',
-'nyx',
-'nyy',
-'nza',
-'nzb',
-'nzd',
-'nzi',
-'nzk',
-'nzm',
-'nzs',
-'nzu',
-'nzy',
-'nzz',
-'oaa',
-'oac',
-'oar',
-'oav',
-'obi',
-'obk',
-'obl',
-'obm',
-'obo',
-'obr',
-'obt',
-'obu',
-'oca',
-'och',
-'oco',
-'ocu',
-'oda',
-'odk',
-'odt',
-'odu',
-'ofo',
-'ofs',
-'ofu',
-'ogb',
-'ogc',
-'oge',
-'ogg',
-'ogo',
-'ogu',
-'oht',
-'ohu',
-'oia',
-'oin',
-'ojb',
-'ojc',
-'ojg',
-'ojp',
-'ojs',
-'ojv',
-'ojw',
-'oka',
-'okb',
-'okd',
-'oke',
-'okg',
-'okh',
-'oki',
-'okj',
-'okk',
-'okl',
-'okm',
-'okn',
-'oko',
-'okr',
-'oks',
-'oku',
-'okv',
-'okx',
-'ola',
-'old',
-'ole',
-'olk',
-'olm',
-'olo',
-'olr',
-'olt',
-'olu',
-'oma',
-'omb',
-'omc',
-'ome',
-'omg',
-'omi',
-'omk',
-'oml',
-'omn',
-'omo',
-'omp',
-'omq',
-'omr',
-'omt',
-'omu',
-'omv',
-'omw',
-'omx',
-'ona',
-'onb',
-'one',
-'ong',
-'oni',
-'onj',
-'onk',
-'onn',
-'ono',
-'onp',
-'onr',
-'ons',
-'ont',
-'onu',
-'onw',
-'onx',
-'ood',
-'oog',
-'oon',
-'oor',
-'oos',
-'opa',
-'opk',
-'opm',
-'opo',
-'opt',
-'opy',
-'ora',
-'orc',
-'ore',
-'org',
-'orh',
-'orn',
-'oro',
-'orr',
-'ors',
-'ort',
-'oru',
-'orv',
-'orw',
-'orx',
-'ory',
-'orz',
-'osa',
-'osc',
-'osi',
-'oso',
-'osp',
-'ost',
-'osu',
-'osx',
-'ota',
-'otb',
-'otd',
-'ote',
-'oti',
-'otk',
-'otl',
-'otm',
-'otn',
-'oto',
-'otq',
-'otr',
-'ots',
-'ott',
-'otu',
-'otw',
-'otx',
-'oty',
-'otz',
-'oua',
-'oub',
-'oue',
-'oui',
-'oum',
-'oun',
-'ovd',
-'owi',
-'owl',
-'oyb',
-'oyd',
-'oym',
-'oyy',
-'ozm',
-'paa',
-'pab',
-'pac',
-'pad',
-'pae',
-'paf',
-'pag',
-'pah',
-'pai',
-'pak',
-'pal',
-'pam',
-'pao',
-'pap',
-'paq',
-'par',
-'pas',
-'pat',
-'pau',
-'pav',
-'paw',
-'pax',
-'pay',
-'paz',
-'pbb',
-'pbc',
-'pbe',
-'pbf',
-'pbg',
-'pbh',
-'pbi',
-'pbl',
-'pbm',
-'pbn',
-'pbo',
-'pbp',
-'pbr',
-'pbs',
-'pbt',
-'pbu',
-'pbv',
-'pby',
-'pbz',
-'pca',
-'pcb',
-'pcc',
-'pcd',
-'pce',
-'pcf',
-'pcg',
-'pch',
-'pci',
-'pcj',
-'pck',
-'pcl',
-'pcm',
-'pcn',
-'pcp',
-'pcr',
-'pcw',
-'pda',
-'pdc',
-'pdi',
-'pdn',
-'pdo',
-'pdt',
-'pdu',
-'pea',
-'peb',
-'ped',
-'pee',
-'pef',
-'peg',
-'peh',
-'pei',
-'pej',
-'pek',
-'pel',
-'pem',
-'peo',
-'pep',
-'peq',
-'pes',
-'pev',
-'pex',
-'pey',
-'pez',
-'pfa',
-'pfe',
-'pfl',
-'pga',
-'pgd',
-'pgg',
-'pgi',
-'pgk',
-'pgl',
-'pgn',
-'pgs',
-'pgu',
-'pgy',
-'pgz',
-'pha',
-'phd',
-'phg',
-'phh',
-'phi',
-'phk',
-'phl',
-'phm',
-'phn',
-'pho',
-'phq',
-'phr',
-'pht',
-'phu',
-'phv',
-'phw',
-'pia',
-'pib',
-'pic',
-'pid',
-'pie',
-'pif',
-'pig',
-'pih',
-'pii',
-'pij',
-'pil',
-'pim',
-'pin',
-'pio',
-'pip',
-'pir',
-'pis',
-'pit',
-'piu',
-'piv',
-'piw',
-'pix',
-'piy',
-'piz',
-'pjt',
-'pka',
-'pkb',
-'pkc',
-'pkg',
-'pkh',
-'pkn',
-'pko',
-'pkp',
-'pkr',
-'pks',
-'pkt',
-'pku',
-'pla',
-'plb',
-'plc',
-'pld',
-'ple',
-'plf',
-'plg',
-'plh',
-'plj',
-'plk',
-'pll',
-'pln',
-'plo',
-'plp',
-'plq',
-'plr',
-'pls',
-'plt',
-'plu',
-'plv',
-'plw',
-'ply',
-'plz',
-'pma',
-'pmb',
-'pmc',
-'pmd',
-'pme',
-'pmf',
-'pmh',
-'pmi',
-'pmj',
-'pmk',
-'pml',
-'pmm',
-'pmn',
-'pmo',
-'pmq',
-'pmr',
-'pms',
-'pmt',
-'pmu',
-'pmw',
-'pmx',
-'pmy',
-'pmz',
-'pna',
-'pnb',
-'pnc',
-'pne',
-'png',
-'pnh',
-'pni',
-'pnj',
-'pnk',
-'pnl',
-'pnm',
-'pnn',
-'pno',
-'pnp',
-'pnq',
-'pnr',
-'pns',
-'pnt',
-'pnu',
-'pnv',
-'pnw',
-'pnx',
-'pny',
-'pnz',
-'poc',
-'pod',
-'poe',
-'pof',
-'pog',
-'poh',
-'poi',
-'pok',
-'pom',
-'pon',
-'poo',
-'pop',
-'poq',
-'pos',
-'pot',
-'pov',
-'pow',
-'pox',
-'poy',
-'poz',
-'ppa',
-'ppe',
-'ppi',
-'ppk',
-'ppl',
-'ppm',
-'ppn',
-'ppo',
-'ppp',
-'ppq',
-'ppr',
-'pps',
-'ppt',
-'ppu',
-'pqa',
-'pqe',
-'pqm',
-'pqw',
-'pra',
-'prb',
-'prc',
-'prd',
-'pre',
-'prf',
-'prg',
-'prh',
-'pri',
-'prk',
-'prl',
-'prm',
-'prn',
-'pro',
-'prp',
-'prq',
-'prr',
-'prs',
-'prt',
-'pru',
-'prw',
-'prx',
-'pry',
-'prz',
-'psa',
-'psc',
-'psd',
-'pse',
-'psg',
-'psh',
-'psi',
-'psl',
-'psm',
-'psn',
-'pso',
-'psp',
-'psq',
-'psr',
-'pss',
-'pst',
-'psu',
-'psw',
-'psy',
-'pta',
-'pth',
-'pti',
-'ptn',
-'pto',
-'ptp',
-'ptq',
-'ptr',
-'ptt',
-'ptu',
-'ptv',
-'ptw',
-'pty',
-'pua',
-'pub',
-'puc',
-'pud',
-'pue',
-'puf',
-'pug',
-'pui',
-'puj',
-'puk',
-'pum',
-'puo',
-'pup',
-'puq',
-'pur',
-'put',
-'puu',
-'puw',
-'pux',
-'puy',
-'puz',
-'pwa',
-'pwb',
-'pwg',
-'pwi',
-'pwm',
-'pwn',
-'pwo',
-'pwr',
-'pww',
-'pxm',
-'pye',
-'pym',
-'pyn',
-'pys',
-'pyu',
-'pyx',
-'pyy',
-'pzn',
-'qaa..qtz',
-'qua',
-'qub',
-'quc',
-'qud',
-'quf',
-'qug',
-'quh',
-'qui',
-'quk',
-'qul',
-'qum',
-'qun',
-'qup',
-'quq',
-'qur',
-'qus',
-'quv',
-'quw',
-'qux',
-'quy',
-'quz',
-'qva',
-'qvc',
-'qve',
-'qvh',
-'qvi',
-'qvj',
-'qvl',
-'qvm',
-'qvn',
-'qvo',
-'qvp',
-'qvs',
-'qvw',
-'qvy',
-'qvz',
-'qwa',
-'qwc',
-'qwe',
-'qwh',
-'qwm',
-'qws',
-'qwt',
-'qxa',
-'qxc',
-'qxh',
-'qxl',
-'qxn',
-'qxo',
-'qxp',
-'qxq',
-'qxr',
-'qxs',
-'qxt',
-'qxu',
-'qxw',
-'qya',
-'qyp',
-'raa',
-'rab',
-'rac',
-'rad',
-'raf',
-'rag',
-'rah',
-'rai',
-'raj',
-'rak',
-'ral',
-'ram',
-'ran',
-'rao',
-'rap',
-'raq',
-'rar',
-'ras',
-'rat',
-'rau',
-'rav',
-'raw',
-'rax',
-'ray',
-'raz',
-'rbb',
-'rbk',
-'rbl',
-'rbp',
-'rcf',
-'rdb',
-'rea',
-'reb',
-'ree',
-'reg',
-'rei',
-'rej',
-'rel',
-'rem',
-'ren',
-'rer',
-'res',
-'ret',
-'rey',
-'rga',
-'rge',
-'rgk',
-'rgn',
-'rgr',
-'rgs',
-'rgu',
-'rhg',
-'rhp',
-'ria',
-'rie',
-'rif',
-'ril',
-'rim',
-'rin',
-'rir',
-'rit',
-'riu',
-'rjg',
-'rji',
-'rjs',
-'rka',
-'rkb',
-'rkh',
-'rki',
-'rkm',
-'rkt',
-'rkw',
-'rma',
-'rmb',
-'rmc',
-'rmd',
-'rme',
-'rmf',
-'rmg',
-'rmh',
-'rmi',
-'rmk',
-'rml',
-'rmm',
-'rmn',
-'rmo',
-'rmp',
-'rmq',
-'rmr',
-'rms',
-'rmt',
-'rmu',
-'rmv',
-'rmw',
-'rmx',
-'rmy',
-'rmz',
-'rna',
-'rnd',
-'rng',
-'rnl',
-'rnn',
-'rnp',
-'rnr',
-'rnw',
-'roa',
-'rob',
-'roc',
-'rod',
-'roe',
-'rof',
-'rog',
-'rol',
-'rom',
-'roo',
-'rop',
-'ror',
-'rou',
-'row',
-'rpn',
-'rpt',
-'rri',
-'rro',
-'rrt',
-'rsb',
-'rsi',
-'rsl',
-'rsm',
-'rtc',
-'rth',
-'rtm',
-'rts',
-'rtw',
-'rub',
-'ruc',
-'rue',
-'ruf',
-'rug',
-'ruh',
-'rui',
-'ruk',
-'ruo',
-'rup',
-'ruq',
-'rut',
-'ruu',
-'ruy',
-'ruz',
-'rwa',
-'rwk',
-'rwm',
-'rwo',
-'rwr',
-'rxd',
-'rxw',
-'ryn',
-'rys',
-'ryu',
-'rzh',
-'saa',
-'sab',
-'sac',
-'sad',
-'sae',
-'saf',
-'sah',
-'sai',
-'saj',
-'sak',
-'sal',
-'sam',
-'sao',
-'sap',
-'saq',
-'sar',
-'sas',
-'sat',
-'sau',
-'sav',
-'saw',
-'sax',
-'say',
-'saz',
-'sba',
-'sbb',
-'sbc',
-'sbd',
-'sbe',
-'sbf',
-'sbg',
-'sbh',
-'sbi',
-'sbj',
-'sbk',
-'sbl',
-'sbm',
-'sbn',
-'sbo',
-'sbp',
-'sbq',
-'sbr',
-'sbs',
-'sbt',
-'sbu',
-'sbv',
-'sbw',
-'sbx',
-'sby',
-'sbz',
-'sca',
-'scb',
-'sce',
-'scf',
-'scg',
-'sch',
-'sci',
-'sck',
-'scl',
-'scn',
-'sco',
-'scp',
-'scq',
-'scs',
-'sct',
-'scu',
-'scv',
-'scw',
-'scx',
-'sda',
-'sdb',
-'sdc',
-'sde',
-'sdf',
-'sdg',
-'sdh',
-'sdj',
-'sdk',
-'sdl',
-'sdm',
-'sdn',
-'sdo',
-'sdp',
-'sdr',
-'sds',
-'sdt',
-'sdu',
-'sdv',
-'sdx',
-'sdz',
-'sea',
-'seb',
-'sec',
-'sed',
-'see',
-'sef',
-'seg',
-'seh',
-'sei',
-'sej',
-'sek',
-'sel',
-'sem',
-'sen',
-'seo',
-'sep',
-'seq',
-'ser',
-'ses',
-'set',
-'seu',
-'sev',
-'sew',
-'sey',
-'sez',
-'sfb',
-'sfe',
-'sfm',
-'sfs',
-'sfw',
-'sga',
-'sgb',
-'sgc',
-'sgd',
-'sge',
-'sgg',
-'sgh',
-'sgi',
-'sgj',
-'sgk',
-'sgl',
-'sgm',
-'sgn',
-'sgo',
-'sgp',
-'sgr',
-'sgs',
-'sgt',
-'sgu',
-'sgw',
-'sgx',
-'sgy',
-'sgz',
-'sha',
-'shb',
-'shc',
-'shd',
-'she',
-'shg',
-'shh',
-'shi',
-'shj',
-'shk',
-'shl',
-'shm',
-'shn',
-'sho',
-'shp',
-'shq',
-'shr',
-'shs',
-'sht',
-'shu',
-'shv',
-'shw',
-'shx',
-'shy',
-'shz',
-'sia',
-'sib',
-'sid',
-'sie',
-'sif',
-'sig',
-'sih',
-'sii',
-'sij',
-'sik',
-'sil',
-'sim',
-'sio',
-'sip',
-'siq',
-'sir',
-'sis',
-'sit',
-'siu',
-'siv',
-'siw',
-'six',
-'siy',
-'siz',
-'sja',
-'sjb',
-'sjd',
-'sje',
-'sjg',
-'sjk',
-'sjl',
-'sjm',
-'sjn',
-'sjo',
-'sjp',
-'sjr',
-'sjs',
-'sjt',
-'sju',
-'sjw',
-'ska',
-'skb',
-'skc',
-'skd',
-'ske',
-'skf',
-'skg',
-'skh',
-'ski',
-'skj',
-'skk',
-'skm',
-'skn',
-'sko',
-'skp',
-'skq',
-'skr',
-'sks',
-'skt',
-'sku',
-'skv',
-'skw',
-'skx',
-'sky',
-'skz',
-'sla',
-'slc',
-'sld',
-'sle',
-'slf',
-'slg',
-'slh',
-'sli',
-'slj',
-'sll',
-'slm',
-'sln',
-'slp',
-'slq',
-'slr',
-'sls',
-'slt',
-'slu',
-'slw',
-'slx',
-'sly',
-'slz',
-'sma',
-'smb',
-'smc',
-'smd',
-'smf',
-'smg',
-'smh',
-'smi',
-'smj',
-'smk',
-'sml',
-'smm',
-'smn',
-'smp',
-'smq',
-'smr',
-'sms',
-'smt',
-'smu',
-'smv',
-'smw',
-'smx',
-'smy',
-'smz',
-'snb',
-'snc',
-'sne',
-'snf',
-'sng',
-'snh',
-'sni',
-'snj',
-'snk',
-'snl',
-'snm',
-'snn',
-'sno',
-'snp',
-'snq',
-'snr',
-'sns',
-'snu',
-'snv',
-'snw',
-'snx',
-'sny',
-'snz',
-'soa',
-'sob',
-'soc',
-'sod',
-'soe',
-'sog',
-'soh',
-'soi',
-'soj',
-'sok',
-'sol',
-'son',
-'soo',
-'sop',
-'soq',
-'sor',
-'sos',
-'sou',
-'sov',
-'sow',
-'sox',
-'soy',
-'soz',
-'spb',
-'spc',
-'spd',
-'spe',
-'spg',
-'spi',
-'spk',
-'spl',
-'spm',
-'spn',
-'spo',
-'spp',
-'spq',
-'spr',
-'sps',
-'spt',
-'spu',
-'spv',
-'spx',
-'spy',
-'sqa',
-'sqh',
-'sqj',
-'sqk',
-'sqm',
-'sqn',
-'sqo',
-'sqq',
-'sqr',
-'sqs',
-'sqt',
-'squ',
-'sra',
-'srb',
-'src',
-'sre',
-'srf',
-'srg',
-'srh',
-'sri',
-'srk',
-'srl',
-'srm',
-'srn',
-'sro',
-'srq',
-'srr',
-'srs',
-'srt',
-'sru',
-'srv',
-'srw',
-'srx',
-'sry',
-'srz',
-'ssa',
-'ssb',
-'ssc',
-'ssd',
-'sse',
-'ssf',
-'ssg',
-'ssh',
-'ssi',
-'ssj',
-'ssk',
-'ssl',
-'ssm',
-'ssn',
-'sso',
-'ssp',
-'ssq',
-'ssr',
-'sss',
-'sst',
-'ssu',
-'ssv',
-'ssx',
-'ssy',
-'ssz',
-'sta',
-'stb',
-'std',
-'ste',
-'stf',
-'stg',
-'sth',
-'sti',
-'stj',
-'stk',
-'stl',
-'stm',
-'stn',
-'sto',
-'stp',
-'stq',
-'str',
-'sts',
-'stt',
-'stu',
-'stv',
-'stw',
-'sty',
-'sua',
-'sub',
-'suc',
-'sue',
-'sug',
-'sui',
-'suj',
-'suk',
-'sul',
-'sum',
-'suq',
-'sur',
-'sus',
-'sut',
-'suv',
-'suw',
-'sux',
-'suy',
-'suz',
-'sva',
-'svb',
-'svc',
-'sve',
-'svk',
-'svm',
-'svr',
-'svs',
-'svx',
-'swb',
-'swc',
-'swf',
-'swg',
-'swh',
-'swi',
-'swj',
-'swk',
-'swl',
-'swm',
-'swn',
-'swo',
-'swp',
-'swq',
-'swr',
-'sws',
-'swt',
-'swu',
-'swv',
-'sww',
-'swx',
-'swy',
-'sxb',
-'sxc',
-'sxe',
-'sxg',
-'sxk',
-'sxl',
-'sxm',
-'sxn',
-'sxo',
-'sxr',
-'sxs',
-'sxu',
-'sxw',
-'sya',
-'syb',
-'syc',
-'syd',
-'syi',
-'syk',
-'syl',
-'sym',
-'syn',
-'syo',
-'syr',
-'sys',
-'syw',
-'syx',
-'syy',
-'sza',
-'szb',
-'szc',
-'szd',
-'sze',
-'szg',
-'szl',
-'szn',
-'szp',
-'szs',
-'szv',
-'szw',
-'taa',
-'tab',
-'tac',
-'tad',
-'tae',
-'taf',
-'tag',
-'tai',
-'taj',
-'tak',
-'tal',
-'tan',
-'tao',
-'tap',
-'taq',
-'tar',
-'tas',
-'tau',
-'tav',
-'taw',
-'tax',
-'tay',
-'taz',
-'tba',
-'tbb',
-'tbc',
-'tbd',
-'tbe',
-'tbf',
-'tbg',
-'tbh',
-'tbi',
-'tbj',
-'tbk',
-'tbl',
-'tbm',
-'tbn',
-'tbo',
-'tbp',
-'tbq',
-'tbr',
-'tbs',
-'tbt',
-'tbu',
-'tbv',
-'tbw',
-'tbx',
-'tby',
-'tbz',
-'tca',
-'tcb',
-'tcc',
-'tcd',
-'tce',
-'tcf',
-'tcg',
-'tch',
-'tci',
-'tck',
-'tcl',
-'tcm',
-'tcn',
-'tco',
-'tcp',
-'tcq',
-'tcs',
-'tct',
-'tcu',
-'tcw',
-'tcx',
-'tcy',
-'tcz',
-'tda',
-'tdb',
-'tdc',
-'tdd',
-'tde',
-'tdf',
-'tdg',
-'tdh',
-'tdi',
-'tdj',
-'tdk',
-'tdl',
-'tdm',
-'tdn',
-'tdo',
-'tdq',
-'tdr',
-'tds',
-'tdt',
-'tdu',
-'tdv',
-'tdx',
-'tdy',
-'tea',
-'teb',
-'tec',
-'ted',
-'tee',
-'tef',
-'teg',
-'teh',
-'tei',
-'tek',
-'tem',
-'ten',
-'teo',
-'tep',
-'teq',
-'ter',
-'tes',
-'tet',
-'teu',
-'tev',
-'tew',
-'tex',
-'tey',
-'tez',
-'tfi',
-'tfn',
-'tfo',
-'tfr',
-'tft',
-'tga',
-'tgb',
-'tgc',
-'tgd',
-'tge',
-'tgf',
-'tgg',
-'tgh',
-'tgi',
-'tgj',
-'tgn',
-'tgo',
-'tgp',
-'tgq',
-'tgr',
-'tgs',
-'tgt',
-'tgu',
-'tgv',
-'tgw',
-'tgx',
-'tgy',
-'tgz',
-'thc',
-'thd',
-'the',
-'thf',
-'thh',
-'thi',
-'thk',
-'thl',
-'thm',
-'thn',
-'thp',
-'thq',
-'thr',
-'ths',
-'tht',
-'thu',
-'thv',
-'thw',
-'thx',
-'thy',
-'thz',
-'tia',
-'tic',
-'tid',
-'tie',
-'tif',
-'tig',
-'tih',
-'tii',
-'tij',
-'tik',
-'til',
-'tim',
-'tin',
-'tio',
-'tip',
-'tiq',
-'tis',
-'tit',
-'tiu',
-'tiv',
-'tiw',
-'tix',
-'tiy',
-'tiz',
-'tja',
-'tjg',
-'tji',
-'tjl',
-'tjm',
-'tjn',
-'tjo',
-'tjs',
-'tju',
-'tjw',
-'tka',
-'tkb',
-'tkd',
-'tke',
-'tkf',
-'tkg',
-'tkk',
-'tkl',
-'tkm',
-'tkn',
-'tkp',
-'tkq',
-'tkr',
-'tks',
-'tkt',
-'tku',
-'tkv',
-'tkw',
-'tkx',
-'tkz',
-'tla',
-'tlb',
-'tlc',
-'tld',
-'tlf',
-'tlg',
-'tlh',
-'tli',
-'tlj',
-'tlk',
-'tll',
-'tlm',
-'tln',
-'tlo',
-'tlp',
-'tlq',
-'tlr',
-'tls',
-'tlt',
-'tlu',
-'tlv',
-'tlw',
-'tlx',
-'tly',
-'tma',
-'tmb',
-'tmc',
-'tmd',
-'tme',
-'tmf',
-'tmg',
-'tmh',
-'tmi',
-'tmj',
-'tmk',
-'tml',
-'tmm',
-'tmn',
-'tmo',
-'tmp',
-'tmq',
-'tmr',
-'tms',
-'tmt',
-'tmu',
-'tmv',
-'tmw',
-'tmy',
-'tmz',
-'tna',
-'tnb',
-'tnc',
-'tnd',
-'tne',
-'tnf',
-'tng',
-'tnh',
-'tni',
-'tnk',
-'tnl',
-'tnm',
-'tnn',
-'tno',
-'tnp',
-'tnq',
-'tnr',
-'tns',
-'tnt',
-'tnu',
-'tnv',
-'tnw',
-'tnx',
-'tny',
-'tnz',
-'tob',
-'toc',
-'tod',
-'toe',
-'tof',
-'tog',
-'toh',
-'toi',
-'toj',
-'tol',
-'tom',
-'too',
-'top',
-'toq',
-'tor',
-'tos',
-'tou',
-'tov',
-'tow',
-'tox',
-'toy',
-'toz',
-'tpa',
-'tpc',
-'tpe',
-'tpf',
-'tpg',
-'tpi',
-'tpj',
-'tpk',
-'tpl',
-'tpm',
-'tpn',
-'tpo',
-'tpp',
-'tpq',
-'tpr',
-'tpt',
-'tpu',
-'tpv',
-'tpw',
-'tpx',
-'tpy',
-'tpz',
-'tqb',
-'tql',
-'tqm',
-'tqn',
-'tqo',
-'tqp',
-'tqq',
-'tqr',
-'tqt',
-'tqu',
-'tqw',
-'tra',
-'trb',
-'trc',
-'trd',
-'tre',
-'trf',
-'trg',
-'trh',
-'tri',
-'trj',
-'trk',
-'trl',
-'trm',
-'trn',
-'tro',
-'trp',
-'trq',
-'trr',
-'trs',
-'trt',
-'tru',
-'trv',
-'trw',
-'trx',
-'try',
-'trz',
-'tsa',
-'tsb',
-'tsc',
-'tsd',
-'tse',
-'tsf',
-'tsg',
-'tsh',
-'tsi',
-'tsj',
-'tsk',
-'tsl',
-'tsm',
-'tsp',
-'tsq',
-'tsr',
-'tss',
-'tst',
-'tsu',
-'tsv',
-'tsw',
-'tsx',
-'tsy',
-'tsz',
-'tta',
-'ttb',
-'ttc',
-'ttd',
-'tte',
-'ttf',
-'ttg',
-'tth',
-'tti',
-'ttj',
-'ttk',
-'ttl',
-'ttm',
-'ttn',
-'tto',
-'ttp',
-'ttq',
-'ttr',
-'tts',
-'ttt',
-'ttu',
-'ttv',
-'ttw',
-'tty',
-'ttz',
-'tua',
-'tub',
-'tuc',
-'tud',
-'tue',
-'tuf',
-'tug',
-'tuh',
-'tui',
-'tuj',
-'tul',
-'tum',
-'tun',
-'tuo',
-'tup',
-'tuq',
-'tus',
-'tut',
-'tuu',
-'tuv',
-'tuw',
-'tux',
-'tuy',
-'tuz',
-'tva',
-'tvd',
-'tve',
-'tvk',
-'tvl',
-'tvm',
-'tvn',
-'tvo',
-'tvs',
-'tvt',
-'tvu',
-'tvw',
-'tvy',
-'twa',
-'twb',
-'twc',
-'twd',
-'twe',
-'twf',
-'twg',
-'twh',
-'twl',
-'twm',
-'twn',
-'two',
-'twp',
-'twq',
-'twr',
-'twt',
-'twu',
-'tww',
-'twx',
-'twy',
-'txa',
-'txb',
-'txc',
-'txe',
-'txg',
-'txh',
-'txi',
-'txj',
-'txm',
-'txn',
-'txo',
-'txq',
-'txr',
-'txs',
-'txt',
-'txu',
-'txx',
-'txy',
-'tya',
-'tye',
-'tyh',
-'tyi',
-'tyj',
-'tyl',
-'tyn',
-'typ',
-'tyr',
-'tys',
-'tyt',
-'tyu',
-'tyv',
-'tyx',
-'tyz',
-'tza',
-'tzh',
-'tzj',
-'tzl',
-'tzm',
-'tzn',
-'tzo',
-'tzx',
-'uam',
-'uan',
-'uar',
-'uba',
-'ubi',
-'ubl',
-'ubr',
-'ubu',
-'uby',
-'uda',
-'ude',
-'udg',
-'udi',
-'udj',
-'udl',
-'udm',
-'udu',
-'ues',
-'ufi',
-'uga',
-'ugb',
-'uge',
-'ugn',
-'ugo',
-'ugy',
-'uha',
-'uhn',
-'uis',
-'uiv',
-'uji',
-'uka',
-'ukg',
-'ukh',
-'ukk',
-'ukl',
-'ukp',
-'ukq',
-'uks',
-'uku',
-'ukw',
-'uky',
-'ula',
-'ulb',
-'ulc',
-'ule',
-'ulf',
-'uli',
-'ulk',
-'ull',
-'ulm',
-'uln',
-'ulu',
-'ulw',
-'uma',
-'umb',
-'umc',
-'umd',
-'umg',
-'umi',
-'umm',
-'umn',
-'umo',
-'ump',
-'umr',
-'ums',
-'umu',
-'una',
-'und',
-'une',
-'ung',
-'unk',
-'unm',
-'unn',
-'unp',
-'unr',
-'unu',
-'unx',
-'unz',
-'uok',
-'upi',
-'upv',
-'ura',
-'urb',
-'urc',
-'ure',
-'urf',
-'urg',
-'urh',
-'uri',
-'urj',
-'urk',
-'url',
-'urm',
-'urn',
-'uro',
-'urp',
-'urr',
-'urt',
-'uru',
-'urv',
-'urw',
-'urx',
-'ury',
-'urz',
-'usa',
-'ush',
-'usi',
-'usk',
-'usp',
-'usu',
-'uta',
-'ute',
-'utp',
-'utr',
-'utu',
-'uum',
-'uun',
-'uur',
-'uuu',
-'uve',
-'uvh',
-'uvl',
-'uwa',
-'uya',
-'uzn',
-'uzs',
-'vaa',
-'vae',
-'vaf',
-'vag',
-'vah',
-'vai',
-'vaj',
-'val',
-'vam',
-'van',
-'vao',
-'vap',
-'var',
-'vas',
-'vau',
-'vav',
-'vay',
-'vbb',
-'vbk',
-'vec',
-'ved',
-'vel',
-'vem',
-'veo',
-'vep',
-'ver',
-'vgr',
-'vgt',
-'vic',
-'vid',
-'vif',
-'vig',
-'vil',
-'vin',
-'vis',
-'vit',
-'viv',
-'vka',
-'vki',
-'vkj',
-'vkk',
-'vkl',
-'vkm',
-'vko',
-'vkp',
-'vkt',
-'vku',
-'vlp',
-'vls',
-'vma',
-'vmb',
-'vmc',
-'vmd',
-'vme',
-'vmf',
-'vmg',
-'vmh',
-'vmi',
-'vmj',
-'vmk',
-'vml',
-'vmm',
-'vmp',
-'vmq',
-'vmr',
-'vms',
-'vmu',
-'vmv',
-'vmw',
-'vmx',
-'vmy',
-'vmz',
-'vnk',
-'vnm',
-'vnp',
-'vor',
-'vot',
-'vra',
-'vro',
-'vrs',
-'vrt',
-'vsi',
-'vsl',
-'vsv',
-'vto',
-'vum',
-'vun',
-'vut',
-'vwa',
-'waa',
-'wab',
-'wac',
-'wad',
-'wae',
-'waf',
-'wag',
-'wah',
-'wai',
-'waj',
-'wak',
-'wal',
-'wam',
-'wan',
-'wao',
-'wap',
-'waq',
-'war',
-'was',
-'wat',
-'wau',
-'wav',
-'waw',
-'wax',
-'way',
-'waz',
-'wba',
-'wbb',
-'wbe',
-'wbf',
-'wbh',
-'wbi',
-'wbj',
-'wbk',
-'wbl',
-'wbm',
-'wbp',
-'wbq',
-'wbr',
-'wbs',
-'wbt',
-'wbv',
-'wbw',
-'wca',
-'wci',
-'wdd',
-'wdg',
-'wdj',
-'wdk',
-'wdu',
-'wdy',
-'wea',
-'wec',
-'wed',
-'weg',
-'weh',
-'wei',
-'wem',
-'wen',
-'weo',
-'wep',
-'wer',
-'wes',
-'wet',
-'weu',
-'wew',
-'wfg',
-'wga',
-'wgb',
-'wgg',
-'wgi',
-'wgo',
-'wgu',
-'wgw',
-'wgy',
-'wha',
-'whg',
-'whk',
-'whu',
-'wib',
-'wic',
-'wie',
-'wif',
-'wig',
-'wih',
-'wii',
-'wij',
-'wik',
-'wil',
-'wim',
-'win',
-'wir',
-'wit',
-'wiu',
-'wiv',
-'wiw',
-'wiy',
-'wja',
-'wji',
-'wka',
-'wkb',
-'wkd',
-'wkl',
-'wku',
-'wkw',
-'wky',
-'wla',
-'wlc',
-'wle',
-'wlg',
-'wli',
-'wlk',
-'wll',
-'wlm',
-'wlo',
-'wlr',
-'wls',
-'wlu',
-'wlv',
-'wlw',
-'wlx',
-'wly',
-'wma',
-'wmb',
-'wmc',
-'wmd',
-'wme',
-'wmh',
-'wmi',
-'wmm',
-'wmn',
-'wmo',
-'wms',
-'wmt',
-'wmw',
-'wmx',
-'wnb',
-'wnc',
-'wnd',
-'wne',
-'wng',
-'wni',
-'wnk',
-'wnm',
-'wnn',
-'wno',
-'wnp',
-'wnu',
-'wnw',
-'wny',
-'woa',
-'wob',
-'woc',
-'wod',
-'woe',
-'wof',
-'wog',
-'woi',
-'wok',
-'wom',
-'won',
-'woo',
-'wor',
-'wos',
-'wow',
-'woy',
-'wpc',
-'wra',
-'wrb',
-'wrd',
-'wrg',
-'wrh',
-'wri',
-'wrk',
-'wrl',
-'wrm',
-'wrn',
-'wro',
-'wrp',
-'wrr',
-'wrs',
-'wru',
-'wrv',
-'wrw',
-'wrx',
-'wry',
-'wrz',
-'wsa',
-'wsg',
-'wsi',
-'wsk',
-'wsr',
-'wss',
-'wsu',
-'wsv',
-'wtf',
-'wth',
-'wti',
-'wtk',
-'wtm',
-'wtw',
-'wua',
-'wub',
-'wud',
-'wuh',
-'wul',
-'wum',
-'wun',
-'wur',
-'wut',
-'wuu',
-'wuv',
-'wux',
-'wuy',
-'wwa',
-'wwb',
-'wwo',
-'wwr',
-'www',
-'wxa',
-'wxw',
-'wya',
-'wyb',
-'wyi',
-'wym',
-'wyr',
-'wyy',
-'xaa',
-'xab',
-'xac',
-'xad',
-'xae',
-'xag',
-'xai',
-'xaj',
-'xak',
-'xal',
-'xam',
-'xan',
-'xao',
-'xap',
-'xaq',
-'xar',
-'xas',
-'xat',
-'xau',
-'xav',
-'xaw',
-'xay',
-'xba',
-'xbb',
-'xbc',
-'xbd',
-'xbe',
-'xbg',
-'xbi',
-'xbj',
-'xbm',
-'xbn',
-'xbo',
-'xbp',
-'xbr',
-'xbw',
-'xbx',
-'xby',
-'xcb',
-'xcc',
-'xce',
-'xcg',
-'xch',
-'xcl',
-'xcm',
-'xcn',
-'xco',
-'xcr',
-'xct',
-'xcu',
-'xcv',
-'xcw',
-'xcy',
-'xda',
-'xdc',
-'xdk',
-'xdm',
-'xdo',
-'xdy',
-'xeb',
-'xed',
-'xeg',
-'xel',
-'xem',
-'xep',
-'xer',
-'xes',
-'xet',
-'xeu',
-'xfa',
-'xga',
-'xgb',
-'xgd',
-'xgf',
-'xgg',
-'xgi',
-'xgl',
-'xgm',
-'xgn',
-'xgr',
-'xgu',
-'xgw',
-'xha',
-'xhc',
-'xhd',
-'xhe',
-'xhr',
-'xht',
-'xhu',
-'xhv',
-'xia',
-'xib',
-'xii',
-'xil',
-'xin',
-'xip',
-'xir',
-'xis',
-'xiv',
-'xiy',
-'xjb',
-'xjt',
-'xka',
-'xkb',
-'xkc',
-'xkd',
-'xke',
-'xkf',
-'xkg',
-'xkh',
-'xki',
-'xkj',
-'xkk',
-'xkl',
-'xkn',
-'xko',
-'xkp',
-'xkq',
-'xkr',
-'xks',
-'xkt',
-'xku',
-'xkv',
-'xkw',
-'xkx',
-'xky',
-'xkz',
-'xla',
-'xlb',
-'xlc',
-'xld',
-'xle',
-'xlg',
-'xli',
-'xln',
-'xlo',
-'xlp',
-'xls',
-'xlu',
-'xly',
-'xma',
-'xmb',
-'xmc',
-'xmd',
-'xme',
-'xmf',
-'xmg',
-'xmh',
-'xmj',
-'xmk',
-'xml',
-'xmm',
-'xmn',
-'xmo',
-'xmp',
-'xmq',
-'xmr',
-'xms',
-'xmt',
-'xmu',
-'xmv',
-'xmw',
-'xmx',
-'xmy',
-'xmz',
-'xna',
-'xnb',
-'xnd',
-'xng',
-'xnh',
-'xni',
-'xnk',
-'xnn',
-'xno',
-'xnr',
-'xns',
-'xnt',
-'xnu',
-'xny',
-'xnz',
-'xoc',
-'xod',
-'xog',
-'xoi',
-'xok',
-'xom',
-'xon',
-'xoo',
-'xop',
-'xor',
-'xow',
-'xpa',
-'xpc',
-'xpe',
-'xpg',
-'xpi',
-'xpj',
-'xpk',
-'xpm',
-'xpn',
-'xpo',
-'xpp',
-'xpq',
-'xpr',
-'xps',
-'xpt',
-'xpu',
-'xpy',
-'xqa',
-'xqt',
-'xra',
-'xrb',
-'xrd',
-'xre',
-'xrg',
-'xri',
-'xrm',
-'xrn',
-'xrq',
-'xrr',
-'xrt',
-'xru',
-'xrw',
-'xsa',
-'xsb',
-'xsc',
-'xsd',
-'xse',
-'xsh',
-'xsi',
-'xsj',
-'xsl',
-'xsm',
-'xsn',
-'xso',
-'xsp',
-'xsq',
-'xsr',
-'xss',
-'xsu',
-'xsv',
-'xsy',
-'xta',
-'xtb',
-'xtc',
-'xtd',
-'xte',
-'xtg',
-'xth',
-'xti',
-'xtj',
-'xtl',
-'xtm',
-'xtn',
-'xto',
-'xtp',
-'xtq',
-'xtr',
-'xts',
-'xtt',
-'xtu',
-'xtv',
-'xtw',
-'xty',
-'xtz',
-'xua',
-'xub',
-'xud',
-'xug',
-'xuj',
-'xul',
-'xum',
-'xun',
-'xuo',
-'xup',
-'xur',
-'xut',
-'xuu',
-'xve',
-'xvi',
-'xvn',
-'xvo',
-'xvs',
-'xwa',
-'xwc',
-'xwd',
-'xwe',
-'xwg',
-'xwj',
-'xwk',
-'xwl',
-'xwo',
-'xwr',
-'xwt',
-'xww',
-'xxb',
-'xxk',
-'xxm',
-'xxr',
-'xxt',
-'xya',
-'xyb',
-'xyj',
-'xyk',
-'xyl',
-'xyt',
-'xyy',
-'xzh',
-'xzm',
-'xzp',
-'yaa',
-'yab',
-'yac',
-'yad',
-'yae',
-'yaf',
-'yag',
-'yah',
-'yai',
-'yaj',
-'yak',
-'yal',
-'yam',
-'yan',
-'yao',
-'yap',
-'yaq',
-'yar',
-'yas',
-'yat',
-'yau',
-'yav',
-'yaw',
-'yax',
-'yay',
-'yaz',
-'yba',
-'ybb',
-'ybd',
-'ybe',
-'ybh',
-'ybi',
-'ybj',
-'ybk',
-'ybl',
-'ybm',
-'ybn',
-'ybo',
-'ybx',
-'yby',
-'ych',
-'ycl',
-'ycn',
-'ycp',
-'yda',
-'ydd',
-'yde',
-'ydg',
-'ydk',
-'yds',
-'yea',
-'yec',
-'yee',
-'yei',
-'yej',
-'yel',
-'yen',
-'yer',
-'yes',
-'yet',
-'yeu',
-'yev',
-'yey',
-'yga',
-'ygi',
-'ygl',
-'ygm',
-'ygp',
-'ygr',
-'ygs',
-'ygu',
-'ygw',
-'yha',
-'yhd',
-'yhl',
-'yhs',
-'yia',
-'yif',
-'yig',
-'yih',
-'yii',
-'yij',
-'yik',
-'yil',
-'yim',
-'yin',
-'yip',
-'yiq',
-'yir',
-'yis',
-'yit',
-'yiu',
-'yiv',
-'yix',
-'yiy',
-'yiz',
-'yka',
-'ykg',
-'yki',
-'ykk',
-'ykl',
-'ykm',
-'ykn',
-'yko',
-'ykr',
-'ykt',
-'yku',
-'yky',
-'yla',
-'ylb',
-'yle',
-'ylg',
-'yli',
-'yll',
-'ylm',
-'yln',
-'ylo',
-'ylr',
-'ylu',
-'yly',
-'yma',
-'ymb',
-'ymc',
-'ymd',
-'yme',
-'ymg',
-'ymh',
-'ymi',
-'ymk',
-'yml',
-'ymm',
-'ymn',
-'ymo',
-'ymp',
-'ymq',
-'ymr',
-'yms',
-'ymt',
-'ymx',
-'ymz',
-'yna',
-'ynd',
-'yne',
-'yng',
-'ynh',
-'ynk',
-'ynl',
-'ynn',
-'yno',
-'ynq',
-'yns',
-'ynu',
-'yob',
-'yog',
-'yoi',
-'yok',
-'yol',
-'yom',
-'yon',
-'yos',
-'yot',
-'yox',
-'yoy',
-'ypa',
-'ypb',
-'ypg',
-'yph',
-'ypk',
-'ypm',
-'ypn',
-'ypo',
-'ypp',
-'ypz',
-'yra',
-'yrb',
-'yre',
-'yri',
-'yrk',
-'yrl',
-'yrm',
-'yrn',
-'yro',
-'yrs',
-'yrw',
-'yry',
-'ysc',
-'ysd',
-'ysg',
-'ysl',
-'ysn',
-'yso',
-'ysp',
-'ysr',
-'yss',
-'ysy',
-'yta',
-'ytl',
-'ytp',
-'ytw',
-'yty',
-'yua',
-'yub',
-'yuc',
-'yud',
-'yue',
-'yuf',
-'yug',
-'yui',
-'yuj',
-'yuk',
-'yul',
-'yum',
-'yun',
-'yup',
-'yuq',
-'yur',
-'yut',
-'yuu',
-'yuw',
-'yux',
-'yuy',
-'yuz',
-'yva',
-'yvt',
-'ywa',
-'ywg',
-'ywl',
-'ywn',
-'ywq',
-'ywr',
-'ywt',
-'ywu',
-'yww',
-'yxa',
-'yxg',
-'yxl',
-'yxm',
-'yxu',
-'yxy',
-'yyr',
-'yyu',
-'yyz',
-'yzg',
-'yzk',
-'zaa',
-'zab',
-'zac',
-'zad',
-'zae',
-'zaf',
-'zag',
-'zah',
-'zai',
-'zaj',
-'zak',
-'zal',
-'zam',
-'zao',
-'zap',
-'zaq',
-'zar',
-'zas',
-'zat',
-'zau',
-'zav',
-'zaw',
-'zax',
-'zay',
-'zaz',
-'zbc',
-'zbe',
-'zbl',
-'zbt',
-'zbw',
-'zca',
-'zch',
-'zdj',
-'zea',
-'zeg',
-'zeh',
-'zen',
-'zga',
-'zgb',
-'zgh',
-'zgm',
-'zgn',
-'zgr',
-'zhb',
-'zhd',
-'zhi',
-'zhn',
-'zhw',
-'zhx',
-'zia',
-'zib',
-'zik',
-'zil',
-'zim',
-'zin',
-'zir',
-'ziw',
-'ziz',
-'zka',
-'zkb',
-'zkd',
-'zkg',
-'zkh',
-'zkk',
-'zkn',
-'zko',
-'zkp',
-'zkr',
-'zkt',
-'zku',
-'zkv',
-'zkz',
-'zle',
-'zlj',
-'zlm',
-'zln',
-'zlq',
-'zls',
-'zlw',
-'zma',
-'zmb',
-'zmc',
-'zmd',
-'zme',
-'zmf',
-'zmg',
-'zmh',
-'zmi',
-'zmj',
-'zmk',
-'zml',
-'zmm',
-'zmn',
-'zmo',
-'zmp',
-'zmq',
-'zmr',
-'zms',
-'zmt',
-'zmu',
-'zmv',
-'zmw',
-'zmx',
-'zmy',
-'zmz',
-'zna',
-'znd',
-'zne',
-'zng',
-'znk',
-'zns',
-'zoc',
-'zoh',
-'zom',
-'zoo',
-'zoq',
-'zor',
-'zos',
-'zpa',
-'zpb',
-'zpc',
-'zpd',
-'zpe',
-'zpf',
-'zpg',
-'zph',
-'zpi',
-'zpj',
-'zpk',
-'zpl',
-'zpm',
-'zpn',
-'zpo',
-'zpp',
-'zpq',
-'zpr',
-'zps',
-'zpt',
-'zpu',
-'zpv',
-'zpw',
-'zpx',
-'zpy',
-'zpz',
-'zqe',
-'zra',
-'zrg',
-'zrn',
-'zro',
-'zrp',
-'zrs',
-'zsa',
-'zsk',
-'zsl',
-'zsm',
-'zsr',
-'zsu',
-'zte',
-'ztg',
-'ztl',
-'ztm',
-'ztn',
-'ztp',
-'ztq',
-'zts',
-'ztt',
-'ztu',
-'ztx',
-'zty',
-'zua',
-'zuh',
-'zum',
-'zun',
-'zuy',
-'zwa',
-'zxx',
-'zyb',
-'zyg',
-'zyj',
-'zyn',
-'zyp',
-'zza',
-'zzj'];
-
-
-
-
-
-
-
-
-axe.utils.validLangs=function(){
-'use strict';
-return langs;
-};
-
-},{}],97:[function(require,module,exports){
-'use strict';
-
-exports.byteLength=byteLength;
-exports.toByteArray=toByteArray;
-exports.fromByteArray=fromByteArray;
-
-var lookup=[];
-var revLookup=[];
-var Arr=typeof Uint8Array!=='undefined'?Uint8Array:Array;
-
-var code='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
-for(var i=0,len=code.length;i<len;++i){
-lookup[i]=code[i];
-revLookup[code.charCodeAt(i)]=i;
-}
-
-
-
-revLookup['-'.charCodeAt(0)]=62;
-revLookup['_'.charCodeAt(0)]=63;
-
-function getLens(b64){
-var len=b64.length;
-
-if(len%4>0){
-throw new Error('Invalid string. Length must be a multiple of 4');
-}
-
-
-
-var validLen=b64.indexOf('=');
-if(validLen===-1)validLen=len;
-
-var placeHoldersLen=validLen===len?
-0:
-4-validLen%4;
-
-return[validLen,placeHoldersLen];
-}
-
-
-function byteLength(b64){
-var lens=getLens(b64);
-var validLen=lens[0];
-var placeHoldersLen=lens[1];
-return(validLen+placeHoldersLen)*3/4-placeHoldersLen;
-}
-
-function _byteLength(b64,validLen,placeHoldersLen){
-return(validLen+placeHoldersLen)*3/4-placeHoldersLen;
-}
-
-function toByteArray(b64){
-var tmp;
-var lens=getLens(b64);
-var validLen=lens[0];
-var placeHoldersLen=lens[1];
-
-var arr=new Arr(_byteLength(b64,validLen,placeHoldersLen));
-
-var curByte=0;
-
-
-var len=placeHoldersLen>0?
-validLen-4:
-validLen;
-
-for(var i=0;i<len;i+=4){
-tmp=
-revLookup[b64.charCodeAt(i)]<<18|
-revLookup[b64.charCodeAt(i+1)]<<12|
-revLookup[b64.charCodeAt(i+2)]<<6|
-revLookup[b64.charCodeAt(i+3)];
-arr[curByte++]=tmp>>16&0xFF;
-arr[curByte++]=tmp>>8&0xFF;
-arr[curByte++]=tmp&0xFF;
-}
-
-if(placeHoldersLen===2){
-tmp=
-revLookup[b64.charCodeAt(i)]<<2|
-revLookup[b64.charCodeAt(i+1)]>>4;
-arr[curByte++]=tmp&0xFF;
-}
-
-if(placeHoldersLen===1){
-tmp=
-revLookup[b64.charCodeAt(i)]<<10|
-revLookup[b64.charCodeAt(i+1)]<<4|
-revLookup[b64.charCodeAt(i+2)]>>2;
-arr[curByte++]=tmp>>8&0xFF;
-arr[curByte++]=tmp&0xFF;
-}
-
-return arr;
-}
-
-function tripletToBase64(num){
-return lookup[num>>18&0x3F]+
-lookup[num>>12&0x3F]+
-lookup[num>>6&0x3F]+
-lookup[num&0x3F];
-}
-
-function encodeChunk(uint8,start,end){
-var tmp;
-var output=[];
-for(var i=start;i<end;i+=3){
-tmp=
-(uint8[i]<<16&0xFF0000)+(
-uint8[i+1]<<8&0xFF00)+(
-uint8[i+2]&0xFF);
-output.push(tripletToBase64(tmp));
-}
-return output.join('');
-}
-
-function fromByteArray(uint8){
-var tmp;
-var len=uint8.length;
-var extraBytes=len%3;
-var parts=[];
-var maxChunkLength=16383;
-
-
-for(var i=0,len2=len-extraBytes;i<len2;i+=maxChunkLength){
-parts.push(encodeChunk(
-uint8,i,i+maxChunkLength>len2?len2:i+maxChunkLength));
-
-}
-
-
-if(extraBytes===1){
-tmp=uint8[len-1];
-parts.push(
-lookup[tmp>>2]+
-lookup[tmp<<4&0x3F]+
-'==');
-
-}else if(extraBytes===2){
-tmp=(uint8[len-2]<<8)+uint8[len-1];
-parts.push(
-lookup[tmp>>10]+
-lookup[tmp>>4&0x3F]+
-lookup[tmp<<2&0x3F]+
-'=');
-
-}
-
-return parts.join('');
-}
-
-},{}],98:[function(require,module,exports){
-
-},{}],99:[function(require,module,exports){
-(function(process,Buffer){
-'use strict';
-
-
-var assert=require('assert');
-
-var Zstream=require('pako/lib/zlib/zstream');
-var zlib_deflate=require('pako/lib/zlib/deflate.js');
-var zlib_inflate=require('pako/lib/zlib/inflate.js');
-var constants=require('pako/lib/zlib/constants');
-
-for(var key in constants){
-exports[key]=constants[key];
-}
-
-
-exports.NONE=0;
-exports.DEFLATE=1;
-exports.INFLATE=2;
-exports.GZIP=3;
-exports.GUNZIP=4;
-exports.DEFLATERAW=5;
-exports.INFLATERAW=6;
-exports.UNZIP=7;
-
-var GZIP_HEADER_ID1=0x1f;
-var GZIP_HEADER_ID2=0x8b;
-
-
-
-
-function Zlib(mode){
-if(typeof mode!=='number'||mode<exports.DEFLATE||mode>exports.UNZIP){
-throw new TypeError('Bad argument');
-}
-
-this.dictionary=null;
-this.err=0;
-this.flush=0;
-this.init_done=false;
-this.level=0;
-this.memLevel=0;
-this.mode=mode;
-this.strategy=0;
-this.windowBits=0;
-this.write_in_progress=false;
-this.pending_close=false;
-this.gzip_id_bytes_read=0;
-}
-
-Zlib.prototype.close=function(){
-if(this.write_in_progress){
-this.pending_close=true;
-return;
-}
-
-this.pending_close=false;
-
-assert(this.init_done,'close before init');
-assert(this.mode<=exports.UNZIP);
-
-if(this.mode===exports.DEFLATE||this.mode===exports.GZIP||this.mode===exports.DEFLATERAW){
-zlib_deflate.deflateEnd(this.strm);
-}else if(this.mode===exports.INFLATE||this.mode===exports.GUNZIP||this.mode===exports.INFLATERAW||this.mode===exports.UNZIP){
-zlib_inflate.inflateEnd(this.strm);
-}
-
-this.mode=exports.NONE;
-
-this.dictionary=null;
-};
-
-Zlib.prototype.write=function(flush,input,in_off,in_len,out,out_off,out_len){
-return this._write(true,flush,input,in_off,in_len,out,out_off,out_len);
-};
-
-Zlib.prototype.writeSync=function(flush,input,in_off,in_len,out,out_off,out_len){
-return this._write(false,flush,input,in_off,in_len,out,out_off,out_len);
-};
-
-Zlib.prototype._write=function(async,flush,input,in_off,in_len,out,out_off,out_len){
-assert.equal(arguments.length,8);
-
-assert(this.init_done,'write before init');
-assert(this.mode!==exports.NONE,'already finalized');
-assert.equal(false,this.write_in_progress,'write already in progress');
-assert.equal(false,this.pending_close,'close is pending');
-
-this.write_in_progress=true;
-
-assert.equal(false,flush===undefined,'must provide flush value');
-
-this.write_in_progress=true;
-
-if(flush!==exports.Z_NO_FLUSH&&flush!==exports.Z_PARTIAL_FLUSH&&flush!==exports.Z_SYNC_FLUSH&&flush!==exports.Z_FULL_FLUSH&&flush!==exports.Z_FINISH&&flush!==exports.Z_BLOCK){
-throw new Error('Invalid flush value');
-}
-
-if(input==null){
-input=Buffer.alloc(0);
-in_len=0;
-in_off=0;
-}
-
-this.strm.avail_in=in_len;
-this.strm.input=input;
-this.strm.next_in=in_off;
-this.strm.avail_out=out_len;
-this.strm.output=out;
-this.strm.next_out=out_off;
-this.flush=flush;
-
-if(!async){
-
-this._process();
-
-if(this._checkError()){
-return this._afterSync();
-}
-return;
-}
-
-
-var self=this;
-process.nextTick(function(){
-self._process();
-self._after();
-});
-
-return this;
-};
-
-Zlib.prototype._afterSync=function(){
-var avail_out=this.strm.avail_out;
-var avail_in=this.strm.avail_in;
-
-this.write_in_progress=false;
-
-return[avail_in,avail_out];
-};
-
-Zlib.prototype._process=function(){
-var next_expected_header_byte=null;
-
-
-
-
-switch(this.mode){
-case exports.DEFLATE:
-case exports.GZIP:
-case exports.DEFLATERAW:
-this.err=zlib_deflate.deflate(this.strm,this.flush);
-break;
-case exports.UNZIP:
-if(this.strm.avail_in>0){
-next_expected_header_byte=this.strm.next_in;
-}
-
-switch(this.gzip_id_bytes_read){
-case 0:
-if(next_expected_header_byte===null){
-break;
-}
-
-if(this.strm.input[next_expected_header_byte]===GZIP_HEADER_ID1){
-this.gzip_id_bytes_read=1;
-next_expected_header_byte++;
-
-if(this.strm.avail_in===1){
-
-break;
-}
-}else{
-this.mode=exports.INFLATE;
-break;
-}
-
-
-case 1:
-if(next_expected_header_byte===null){
-break;
-}
-
-if(this.strm.input[next_expected_header_byte]===GZIP_HEADER_ID2){
-this.gzip_id_bytes_read=2;
-this.mode=exports.GUNZIP;
-}else{
-
-
-this.mode=exports.INFLATE;
-}
-
-break;
-default:
-throw new Error('invalid number of gzip magic number bytes read');}
-
-
-
-case exports.INFLATE:
-case exports.GUNZIP:
-case exports.INFLATERAW:
-this.err=zlib_inflate.inflate(this.strm,this.flush);
-
-
-if(this.err===exports.Z_NEED_DICT&&this.dictionary){
-
-this.err=zlib_inflate.inflateSetDictionary(this.strm,this.dictionary);
-if(this.err===exports.Z_OK){
-
-this.err=zlib_inflate.inflate(this.strm,this.flush);
-}else if(this.err===exports.Z_DATA_ERROR){
-
-
-
-this.err=exports.Z_NEED_DICT;
-}
-}
-while(this.strm.avail_in>0&&this.mode===exports.GUNZIP&&this.err===exports.Z_STREAM_END&&this.strm.next_in[0]!==0x00){
-
-
-
-
-
-this.reset();
-this.err=zlib_inflate.inflate(this.strm,this.flush);
-}
-break;
-default:
-throw new Error('Unknown mode '+this.mode);}
-
-};
-
-Zlib.prototype._checkError=function(){
-
-switch(this.err){
-case exports.Z_OK:
-case exports.Z_BUF_ERROR:
-if(this.strm.avail_out!==0&&this.flush===exports.Z_FINISH){
-this._error('unexpected end of file');
-return false;
-}
-break;
-case exports.Z_STREAM_END:
-
-break;
-case exports.Z_NEED_DICT:
-if(this.dictionary==null){
-this._error('Missing dictionary');
-}else{
-this._error('Bad dictionary');
-}
-return false;
-default:
-
-this._error('Zlib error');
-return false;}
-
-
-return true;
-};
-
-Zlib.prototype._after=function(){
-if(!this._checkError()){
-return;
-}
-
-var avail_out=this.strm.avail_out;
-var avail_in=this.strm.avail_in;
-
-this.write_in_progress=false;
-
-
-this.callback(avail_in,avail_out);
-
-if(this.pending_close){
-this.close();
-}
-};
-
-Zlib.prototype._error=function(message){
-if(this.strm.msg){
-message=this.strm.msg;
-}
-this.onerror(message,this.err);
-
-
-this.write_in_progress=false;
-if(this.pending_close){
-this.close();
-}
-};
-
-Zlib.prototype.init=function(windowBits,level,memLevel,strategy,dictionary){
-assert(arguments.length===4||arguments.length===5,'init(windowBits, level, memLevel, strategy, [dictionary])');
-
-assert(windowBits>=8&&windowBits<=15,'invalid windowBits');
-assert(level>=-1&&level<=9,'invalid compression level');
-
-assert(memLevel>=1&&memLevel<=9,'invalid memlevel');
-
-assert(strategy===exports.Z_FILTERED||strategy===exports.Z_HUFFMAN_ONLY||strategy===exports.Z_RLE||strategy===exports.Z_FIXED||strategy===exports.Z_DEFAULT_STRATEGY,'invalid strategy');
-
-this._init(level,windowBits,memLevel,strategy,dictionary);
-this._setDictionary();
-};
-
-Zlib.prototype.params=function(){
-throw new Error('deflateParams Not supported');
-};
-
-Zlib.prototype.reset=function(){
-this._reset();
-this._setDictionary();
-};
-
-Zlib.prototype._init=function(level,windowBits,memLevel,strategy,dictionary){
-this.level=level;
-this.windowBits=windowBits;
-this.memLevel=memLevel;
-this.strategy=strategy;
-
-this.flush=exports.Z_NO_FLUSH;
-
-this.err=exports.Z_OK;
-
-if(this.mode===exports.GZIP||this.mode===exports.GUNZIP){
-this.windowBits+=16;
-}
-
-if(this.mode===exports.UNZIP){
-this.windowBits+=32;
-}
-
-if(this.mode===exports.DEFLATERAW||this.mode===exports.INFLATERAW){
-this.windowBits=-1*this.windowBits;
-}
-
-this.strm=new Zstream();
-
-switch(this.mode){
-case exports.DEFLATE:
-case exports.GZIP:
-case exports.DEFLATERAW:
-this.err=zlib_deflate.deflateInit2(this.strm,this.level,exports.Z_DEFLATED,this.windowBits,this.memLevel,this.strategy);
-break;
-case exports.INFLATE:
-case exports.GUNZIP:
-case exports.INFLATERAW:
-case exports.UNZIP:
-this.err=zlib_inflate.inflateInit2(this.strm,this.windowBits);
-break;
-default:
-throw new Error('Unknown mode '+this.mode);}
-
-
-if(this.err!==exports.Z_OK){
-this._error('Init error');
-}
-
-this.dictionary=dictionary;
-
-this.write_in_progress=false;
-this.init_done=true;
-};
-
-Zlib.prototype._setDictionary=function(){
-if(this.dictionary==null){
-return;
-}
-
-this.err=exports.Z_OK;
-
-switch(this.mode){
-case exports.DEFLATE:
-case exports.DEFLATERAW:
-this.err=zlib_deflate.deflateSetDictionary(this.strm,this.dictionary);
-break;
-default:
-break;}
-
-
-if(this.err!==exports.Z_OK){
-this._error('Failed to set dictionary');
-}
-};
-
-Zlib.prototype._reset=function(){
-this.err=exports.Z_OK;
-
-switch(this.mode){
-case exports.DEFLATE:
-case exports.DEFLATERAW:
-case exports.GZIP:
-this.err=zlib_deflate.deflateReset(this.strm);
-break;
-case exports.INFLATE:
-case exports.INFLATERAW:
-case exports.GUNZIP:
-this.err=zlib_inflate.inflateReset(this.strm);
-break;
-default:
-break;}
-
-
-if(this.err!==exports.Z_OK){
-this._error('Failed to reset stream');
-}
-};
-
-exports.Zlib=Zlib;
-}).call(this,require('_process'),require("buffer").Buffer);
-},{"_process":158,"assert":92,"buffer":102,"pako/lib/zlib/constants":149,"pako/lib/zlib/deflate.js":151,"pako/lib/zlib/inflate.js":101,"pako/lib/zlib/zstream":154}],100:[function(require,module,exports){
-(function(process){
-'use strict';
-
-var Buffer=require('buffer').Buffer;
-var Transform=require('stream').Transform;
-var binding=require('./binding');
-var util=require('util');
-var assert=require('assert').ok;
-var kMaxLength=require('buffer').kMaxLength;
-var kRangeErrorMessage='Cannot create final Buffer. It would be larger '+'than 0x'+kMaxLength.toString(16)+' bytes';
-
-
-
-binding.Z_MIN_WINDOWBITS=8;
-binding.Z_MAX_WINDOWBITS=15;
-binding.Z_DEFAULT_WINDOWBITS=15;
-
-
-
-
-binding.Z_MIN_CHUNK=64;
-binding.Z_MAX_CHUNK=Infinity;
-binding.Z_DEFAULT_CHUNK=16*1024;
-
-binding.Z_MIN_MEMLEVEL=1;
-binding.Z_MAX_MEMLEVEL=9;
-binding.Z_DEFAULT_MEMLEVEL=8;
-
-binding.Z_MIN_LEVEL=-1;
-binding.Z_MAX_LEVEL=9;
-binding.Z_DEFAULT_LEVEL=binding.Z_DEFAULT_COMPRESSION;
-
-
-var bkeys=Object.keys(binding);
-for(var bk=0;bk<bkeys.length;bk++){
-var bkey=bkeys[bk];
-if(bkey.match(/^Z/)){
-Object.defineProperty(exports,bkey,{
-enumerable:true,value:binding[bkey],writable:false});
-
-}
-}
-
-
-var codes={
-Z_OK:binding.Z_OK,
-Z_STREAM_END:binding.Z_STREAM_END,
-Z_NEED_DICT:binding.Z_NEED_DICT,
-Z_ERRNO:binding.Z_ERRNO,
-Z_STREAM_ERROR:binding.Z_STREAM_ERROR,
-Z_DATA_ERROR:binding.Z_DATA_ERROR,
-Z_MEM_ERROR:binding.Z_MEM_ERROR,
-Z_BUF_ERROR:binding.Z_BUF_ERROR,
-Z_VERSION_ERROR:binding.Z_VERSION_ERROR};
-
-
-var ckeys=Object.keys(codes);
-for(var ck=0;ck<ckeys.length;ck++){
-var ckey=ckeys[ck];
-codes[codes[ckey]]=ckey;
-}
-
-Object.defineProperty(exports,'codes',{
-enumerable:true,value:Object.freeze(codes),writable:false});
-
-
-exports.Deflate=Deflate;
-exports.Inflate=Inflate;
-exports.Gzip=Gzip;
-exports.Gunzip=Gunzip;
-exports.DeflateRaw=DeflateRaw;
-exports.InflateRaw=InflateRaw;
-exports.Unzip=Unzip;
-
-exports.createDeflate=function(o){
-return new Deflate(o);
-};
-
-exports.createInflate=function(o){
-return new Inflate(o);
-};
-
-exports.createDeflateRaw=function(o){
-return new DeflateRaw(o);
-};
-
-exports.createInflateRaw=function(o){
-return new InflateRaw(o);
-};
-
-exports.createGzip=function(o){
-return new Gzip(o);
-};
-
-exports.createGunzip=function(o){
-return new Gunzip(o);
-};
-
-exports.createUnzip=function(o){
-return new Unzip(o);
-};
-
-
-
-exports.deflate=function(buffer,opts,callback){
-if(typeof opts==='function'){
-callback=opts;
-opts={};
-}
-return zlibBuffer(new Deflate(opts),buffer,callback);
-};
-
-exports.deflateSync=function(buffer,opts){
-return zlibBufferSync(new Deflate(opts),buffer);
-};
-
-exports.gzip=function(buffer,opts,callback){
-if(typeof opts==='function'){
-callback=opts;
-opts={};
-}
-return zlibBuffer(new Gzip(opts),buffer,callback);
-};
-
-exports.gzipSync=function(buffer,opts){
-return zlibBufferSync(new Gzip(opts),buffer);
-};
-
-exports.deflateRaw=function(buffer,opts,callback){
-if(typeof opts==='function'){
-callback=opts;
-opts={};
-}
-return zlibBuffer(new DeflateRaw(opts),buffer,callback);
-};
-
-exports.deflateRawSync=function(buffer,opts){
-return zlibBufferSync(new DeflateRaw(opts),buffer);
-};
-
-exports.unzip=function(buffer,opts,callback){
-if(typeof opts==='function'){
-callback=opts;
-opts={};
-}
-return zlibBuffer(new Unzip(opts),buffer,callback);
-};
-
-exports.unzipSync=function(buffer,opts){
-return zlibBufferSync(new Unzip(opts),buffer);
-};
-
-exports.inflate=function(buffer,opts,callback){
-if(typeof opts==='function'){
-callback=opts;
-opts={};
-}
-return zlibBuffer(new Inflate(opts),buffer,callback);
-};
-
-exports.inflateSync=function(buffer,opts){
-return zlibBufferSync(new Inflate(opts),buffer);
-};
-
-exports.gunzip=function(buffer,opts,callback){
-if(typeof opts==='function'){
-callback=opts;
-opts={};
-}
-return zlibBuffer(new Gunzip(opts),buffer,callback);
-};
-
-exports.gunzipSync=function(buffer,opts){
-return zlibBufferSync(new Gunzip(opts),buffer);
-};
-
-exports.inflateRaw=function(buffer,opts,callback){
-if(typeof opts==='function'){
-callback=opts;
-opts={};
-}
-return zlibBuffer(new InflateRaw(opts),buffer,callback);
-};
-
-exports.inflateRawSync=function(buffer,opts){
-return zlibBufferSync(new InflateRaw(opts),buffer);
-};
-
-function zlibBuffer(engine,buffer,callback){
-var buffers=[];
-var nread=0;
-
-engine.on('error',onError);
-engine.on('end',onEnd);
-
-engine.end(buffer);
-flow();
-
-function flow(){
-var chunk;
-while(null!==(chunk=engine.read())){
-buffers.push(chunk);
-nread+=chunk.length;
-}
-engine.once('readable',flow);
-}
-
-function onError(err){
-engine.removeListener('end',onEnd);
-engine.removeListener('readable',flow);
-callback(err);
-}
-
-function onEnd(){
-var buf;
-var err=null;
-
-if(nread>=kMaxLength){
-err=new RangeError(kRangeErrorMessage);
-}else{
-buf=Buffer.concat(buffers,nread);
-}
-
-buffers=[];
-engine.close();
-callback(err,buf);
-}
-}
-
-function zlibBufferSync(engine,buffer){
-if(typeof buffer==='string')buffer=Buffer.from(buffer);
-
-if(!Buffer.isBuffer(buffer))throw new TypeError('Not a string or buffer');
-
-var flushFlag=engine._finishFlushFlag;
-
-return engine._processChunk(buffer,flushFlag);
-}
-
-
-
-function Deflate(opts){
-if(!(this instanceof Deflate))return new Deflate(opts);
-Zlib.call(this,opts,binding.DEFLATE);
-}
-
-function Inflate(opts){
-if(!(this instanceof Inflate))return new Inflate(opts);
-Zlib.call(this,opts,binding.INFLATE);
-}
-
-
-function Gzip(opts){
-if(!(this instanceof Gzip))return new Gzip(opts);
-Zlib.call(this,opts,binding.GZIP);
-}
-
-function Gunzip(opts){
-if(!(this instanceof Gunzip))return new Gunzip(opts);
-Zlib.call(this,opts,binding.GUNZIP);
-}
-
-
-function DeflateRaw(opts){
-if(!(this instanceof DeflateRaw))return new DeflateRaw(opts);
-Zlib.call(this,opts,binding.DEFLATERAW);
-}
-
-function InflateRaw(opts){
-if(!(this instanceof InflateRaw))return new InflateRaw(opts);
-Zlib.call(this,opts,binding.INFLATERAW);
-}
-
-
-function Unzip(opts){
-if(!(this instanceof Unzip))return new Unzip(opts);
-Zlib.call(this,opts,binding.UNZIP);
-}
-
-function isValidFlushFlag(flag){
-return flag===binding.Z_NO_FLUSH||flag===binding.Z_PARTIAL_FLUSH||flag===binding.Z_SYNC_FLUSH||flag===binding.Z_FULL_FLUSH||flag===binding.Z_FINISH||flag===binding.Z_BLOCK;
-}
-
-
-
-
-
-
-function Zlib(opts,mode){
-var _this=this;
-
-this._opts=opts=opts||{};
-this._chunkSize=opts.chunkSize||exports.Z_DEFAULT_CHUNK;
-
-Transform.call(this,opts);
-
-if(opts.flush&&!isValidFlushFlag(opts.flush)){
-throw new Error('Invalid flush flag: '+opts.flush);
-}
-if(opts.finishFlush&&!isValidFlushFlag(opts.finishFlush)){
-throw new Error('Invalid flush flag: '+opts.finishFlush);
-}
-
-this._flushFlag=opts.flush||binding.Z_NO_FLUSH;
-this._finishFlushFlag=typeof opts.finishFlush!=='undefined'?opts.finishFlush:binding.Z_FINISH;
-
-if(opts.chunkSize){
-if(opts.chunkSize<exports.Z_MIN_CHUNK||opts.chunkSize>exports.Z_MAX_CHUNK){
-throw new Error('Invalid chunk size: '+opts.chunkSize);
-}
-}
-
-if(opts.windowBits){
-if(opts.windowBits<exports.Z_MIN_WINDOWBITS||opts.windowBits>exports.Z_MAX_WINDOWBITS){
-throw new Error('Invalid windowBits: '+opts.windowBits);
-}
-}
-
-if(opts.level){
-if(opts.level<exports.Z_MIN_LEVEL||opts.level>exports.Z_MAX_LEVEL){
-throw new Error('Invalid compression level: '+opts.level);
-}
-}
-
-if(opts.memLevel){
-if(opts.memLevel<exports.Z_MIN_MEMLEVEL||opts.memLevel>exports.Z_MAX_MEMLEVEL){
-throw new Error('Invalid memLevel: '+opts.memLevel);
-}
-}
-
-if(opts.strategy){
-if(opts.strategy!=exports.Z_FILTERED&&opts.strategy!=exports.Z_HUFFMAN_ONLY&&opts.strategy!=exports.Z_RLE&&opts.strategy!=exports.Z_FIXED&&opts.strategy!=exports.Z_DEFAULT_STRATEGY){
-throw new Error('Invalid strategy: '+opts.strategy);
-}
-}
-
-if(opts.dictionary){
-if(!Buffer.isBuffer(opts.dictionary)){
-throw new Error('Invalid dictionary: it should be a Buffer instance');
-}
-}
-
-this._handle=new binding.Zlib(mode);
-
-var self=this;
-this._hadError=false;
-this._handle.onerror=function(message,errno){
-
-
-_close(self);
-self._hadError=true;
-
-var error=new Error(message);
-error.errno=errno;
-error.code=exports.codes[errno];
-self.emit('error',error);
-};
-
-var level=exports.Z_DEFAULT_COMPRESSION;
-if(typeof opts.level==='number')level=opts.level;
-
-var strategy=exports.Z_DEFAULT_STRATEGY;
-if(typeof opts.strategy==='number')strategy=opts.strategy;
-
-this._handle.init(opts.windowBits||exports.Z_DEFAULT_WINDOWBITS,level,opts.memLevel||exports.Z_DEFAULT_MEMLEVEL,strategy,opts.dictionary);
-
-this._buffer=Buffer.allocUnsafe(this._chunkSize);
-this._offset=0;
-this._level=level;
-this._strategy=strategy;
-
-this.once('end',this.close);
-
-Object.defineProperty(this,'_closed',{
-get:function(){
-return!_this._handle;
-},
-configurable:true,
-enumerable:true});
-
-}
-
-util.inherits(Zlib,Transform);
-
-Zlib.prototype.params=function(level,strategy,callback){
-if(level<exports.Z_MIN_LEVEL||level>exports.Z_MAX_LEVEL){
-throw new RangeError('Invalid compression level: '+level);
-}
-if(strategy!=exports.Z_FILTERED&&strategy!=exports.Z_HUFFMAN_ONLY&&strategy!=exports.Z_RLE&&strategy!=exports.Z_FIXED&&strategy!=exports.Z_DEFAULT_STRATEGY){
-throw new TypeError('Invalid strategy: '+strategy);
-}
-
-if(this._level!==level||this._strategy!==strategy){
-var self=this;
-this.flush(binding.Z_SYNC_FLUSH,function(){
-assert(self._handle,'zlib binding closed');
-self._handle.params(level,strategy);
-if(!self._hadError){
-self._level=level;
-self._strategy=strategy;
-if(callback)callback();
-}
-});
-}else{
-process.nextTick(callback);
-}
-};
-
-Zlib.prototype.reset=function(){
-assert(this._handle,'zlib binding closed');
-return this._handle.reset();
-};
-
-
-
-Zlib.prototype._flush=function(callback){
-this._transform(Buffer.alloc(0),'',callback);
-};
-
-Zlib.prototype.flush=function(kind,callback){
-var _this2=this;
-
-var ws=this._writableState;
-
-if(typeof kind==='function'||kind===undefined&&!callback){
-callback=kind;
-kind=binding.Z_FULL_FLUSH;
-}
-
-if(ws.ended){
-if(callback)process.nextTick(callback);
-}else if(ws.ending){
-if(callback)this.once('end',callback);
-}else if(ws.needDrain){
-if(callback){
-this.once('drain',function(){
-return _this2.flush(kind,callback);
-});
-}
-}else{
-this._flushFlag=kind;
-this.write(Buffer.alloc(0),'',callback);
-}
-};
-
-Zlib.prototype.close=function(callback){
-_close(this,callback);
-process.nextTick(emitCloseNT,this);
-};
-
-function _close(engine,callback){
-if(callback)process.nextTick(callback);
-
-
-if(!engine._handle)return;
-
-engine._handle.close();
-engine._handle=null;
-}
-
-function emitCloseNT(self){
-self.emit('close');
-}
-
-Zlib.prototype._transform=function(chunk,encoding,cb){
-var flushFlag;
-var ws=this._writableState;
-var ending=ws.ending||ws.ended;
-var last=ending&&(!chunk||ws.length===chunk.length);
-
-if(chunk!==null&&!Buffer.isBuffer(chunk))return cb(new Error('invalid input'));
-
-if(!this._handle)return cb(new Error('zlib binding closed'));
-
-
-
-
-
-
-if(last)flushFlag=this._finishFlushFlag;else{
-flushFlag=this._flushFlag;
-
-
-if(chunk.length>=ws.length){
-this._flushFlag=this._opts.flush||binding.Z_NO_FLUSH;
-}
-}
-
-this._processChunk(chunk,flushFlag,cb);
-};
-
-Zlib.prototype._processChunk=function(chunk,flushFlag,cb){
-var availInBefore=chunk&&chunk.length;
-var availOutBefore=this._chunkSize-this._offset;
-var inOff=0;
-
-var self=this;
-
-var async=typeof cb==='function';
-
-if(!async){
-var buffers=[];
-var nread=0;
-
-var error;
-this.on('error',function(er){
-error=er;
-});
-
-assert(this._handle,'zlib binding closed');
-do{
-var res=this._handle.writeSync(flushFlag,chunk,
-inOff,
-availInBefore,
-this._buffer,
-this._offset,
-availOutBefore);
-}while(!this._hadError&&callback(res[0],res[1]));
-
-if(this._hadError){
-throw error;
-}
-
-if(nread>=kMaxLength){
-_close(this);
-throw new RangeError(kRangeErrorMessage);
-}
-
-var buf=Buffer.concat(buffers,nread);
-_close(this);
-
-return buf;
-}
-
-assert(this._handle,'zlib binding closed');
-var req=this._handle.write(flushFlag,chunk,
-inOff,
-availInBefore,
-this._buffer,
-this._offset,
-availOutBefore);
-
-req.buffer=chunk;
-req.callback=callback;
-
-function callback(availInAfter,availOutAfter){
-
-
-
-
-
-if(this){
-this.buffer=null;
-this.callback=null;
-}
-
-if(self._hadError)return;
-
-var have=availOutBefore-availOutAfter;
-assert(have>=0,'have should not go down');
-
-if(have>0){
-var out=self._buffer.slice(self._offset,self._offset+have);
-self._offset+=have;
-
-if(async){
-self.push(out);
-}else{
-buffers.push(out);
-nread+=out.length;
-}
-}
-
-
-if(availOutAfter===0||self._offset>=self._chunkSize){
-availOutBefore=self._chunkSize;
-self._offset=0;
-self._buffer=Buffer.allocUnsafe(self._chunkSize);
-}
-
-if(availOutAfter===0){
-
-
-
-
-inOff+=availInBefore-availInAfter;
-availInBefore=availInAfter;
-
-if(!async)return true;
-
-var newReq=self._handle.write(flushFlag,chunk,inOff,availInBefore,self._buffer,self._offset,self._chunkSize);
-newReq.callback=callback;
-newReq.buffer=chunk;
-return;
-}
-
-if(!async)return false;
-
-
-cb();
-}
-};
-
-util.inherits(Deflate,Zlib);
-util.inherits(Inflate,Zlib);
-util.inherits(Gzip,Zlib);
-util.inherits(Gunzip,Zlib);
-util.inherits(DeflateRaw,Zlib);
-util.inherits(InflateRaw,Zlib);
-util.inherits(Unzip,Zlib);
-}).call(this,require('_process'));
-},{"./binding":99,"_process":158,"assert":92,"buffer":102,"stream":183,"util":191}],101:[function(require,module,exports){
-arguments[4][98][0].apply(exports,arguments);
-},{"dup":98}],102:[function(require,module,exports){
-(function(Buffer){
-
-
-
-
-
-
-
-
-'use strict';
-
-var base64=require('base64-js');
-var ieee754=require('ieee754');
-
-exports.Buffer=Buffer;
-exports.SlowBuffer=SlowBuffer;
-exports.INSPECT_MAX_BYTES=50;
-
-var K_MAX_LENGTH=0x7fffffff;
-exports.kMaxLength=K_MAX_LENGTH;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Buffer.TYPED_ARRAY_SUPPORT=typedArraySupport();
-
-if(!Buffer.TYPED_ARRAY_SUPPORT&&typeof console!=='undefined'&&
-typeof console.error==='function'){
-console.error(
-'This browser lacks typed array (Uint8Array) support which is required by '+
-'`buffer` v5.x. Use `buffer` v4.x if you require old browser support.');
-
-}
-
-function typedArraySupport(){
-
-try{
-var arr=new Uint8Array(1);
-arr.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42;}};
-return arr.foo()===42;
-}catch(e){
-return false;
-}
-}
-
-Object.defineProperty(Buffer.prototype,'parent',{
-enumerable:true,
-get:function(){
-if(!Buffer.isBuffer(this))return undefined;
-return this.buffer;
-}});
-
-
-Object.defineProperty(Buffer.prototype,'offset',{
-enumerable:true,
-get:function(){
-if(!Buffer.isBuffer(this))return undefined;
-return this.byteOffset;
-}});
-
-
-function createBuffer(length){
-if(length>K_MAX_LENGTH){
-throw new RangeError('The value "'+length+'" is invalid for option "size"');
-}
-
-var buf=new Uint8Array(length);
-buf.__proto__=Buffer.prototype;
-return buf;
-}
-
-
-
-
-
-
-
-
-
-
-
-function Buffer(arg,encodingOrOffset,length){
-
-if(typeof arg==='number'){
-if(typeof encodingOrOffset==='string'){
-throw new TypeError(
-'The "string" argument must be of type string. Received type number');
-
-}
-return allocUnsafe(arg);
-}
-return from(arg,encodingOrOffset,length);
-}
-
-
-if(typeof Symbol!=='undefined'&&Symbol.species!=null&&
-Buffer[Symbol.species]===Buffer){
-Object.defineProperty(Buffer,Symbol.species,{
-value:null,
-configurable:true,
-enumerable:false,
-writable:false});
-
-}
-
-Buffer.poolSize=8192;
-
-function from(value,encodingOrOffset,length){
-if(typeof value==='string'){
-return fromString(value,encodingOrOffset);
-}
-
-if(ArrayBuffer.isView(value)){
-return fromArrayLike(value);
-}
-
-if(value==null){
-throw TypeError(
-'The first argument must be one of type string, Buffer, ArrayBuffer, Array, '+
-'or Array-like Object. Received type '+typeof value);
-
-}
-
-if(isInstance(value,ArrayBuffer)||
-value&&isInstance(value.buffer,ArrayBuffer)){
-return fromArrayBuffer(value,encodingOrOffset,length);
-}
-
-if(typeof value==='number'){
-throw new TypeError(
-'The "value" argument must not be of type number. Received type number');
-
-}
-
-var valueOf=value.valueOf&&value.valueOf();
-if(valueOf!=null&&valueOf!==value){
-return Buffer.from(valueOf,encodingOrOffset,length);
-}
-
-var b=fromObject(value);
-if(b)return b;
-
-if(typeof Symbol!=='undefined'&&Symbol.toPrimitive!=null&&
-typeof value[Symbol.toPrimitive]==='function'){
-return Buffer.from(
-value[Symbol.toPrimitive]('string'),encodingOrOffset,length);
-
-}
-
-throw new TypeError(
-'The first argument must be one of type string, Buffer, ArrayBuffer, Array, '+
-'or Array-like Object. Received type '+typeof value);
-
-}
-
-
-
-
-
-
-
-
-
-Buffer.from=function(value,encodingOrOffset,length){
-return from(value,encodingOrOffset,length);
-};
-
-
-
-Buffer.prototype.__proto__=Uint8Array.prototype;
-Buffer.__proto__=Uint8Array;
-
-function assertSize(size){
-if(typeof size!=='number'){
-throw new TypeError('"size" argument must be of type number');
-}else if(size<0){
-throw new RangeError('The value "'+size+'" is invalid for option "size"');
-}
-}
-
-function alloc(size,fill,encoding){
-assertSize(size);
-if(size<=0){
-return createBuffer(size);
-}
-if(fill!==undefined){
-
-
-
-return typeof encoding==='string'?
-createBuffer(size).fill(fill,encoding):
-createBuffer(size).fill(fill);
-}
-return createBuffer(size);
-}
-
-
-
-
-
-Buffer.alloc=function(size,fill,encoding){
-return alloc(size,fill,encoding);
-};
-
-function allocUnsafe(size){
-assertSize(size);
-return createBuffer(size<0?0:checked(size)|0);
-}
-
-
-
-
-Buffer.allocUnsafe=function(size){
-return allocUnsafe(size);
-};
-
-
-
-Buffer.allocUnsafeSlow=function(size){
-return allocUnsafe(size);
-};
-
-function fromString(string,encoding){
-if(typeof encoding!=='string'||encoding===''){
-encoding='utf8';
-}
-
-if(!Buffer.isEncoding(encoding)){
-throw new TypeError('Unknown encoding: '+encoding);
-}
-
-var length=byteLength(string,encoding)|0;
-var buf=createBuffer(length);
-
-var actual=buf.write(string,encoding);
-
-if(actual!==length){
-
-
-
-buf=buf.slice(0,actual);
-}
-
-return buf;
-}
-
-function fromArrayLike(array){
-var length=array.length<0?0:checked(array.length)|0;
-var buf=createBuffer(length);
-for(var i=0;i<length;i+=1){
-buf[i]=array[i]&255;
-}
-return buf;
-}
-
-function fromArrayBuffer(array,byteOffset,length){
-if(byteOffset<0||array.byteLength<byteOffset){
-throw new RangeError('"offset" is outside of buffer bounds');
-}
-
-if(array.byteLength<byteOffset+(length||0)){
-throw new RangeError('"length" is outside of buffer bounds');
-}
-
-var buf;
-if(byteOffset===undefined&&length===undefined){
-buf=new Uint8Array(array);
-}else if(length===undefined){
-buf=new Uint8Array(array,byteOffset);
-}else{
-buf=new Uint8Array(array,byteOffset,length);
-}
-
-
-buf.__proto__=Buffer.prototype;
-return buf;
-}
-
-function fromObject(obj){
-if(Buffer.isBuffer(obj)){
-var len=checked(obj.length)|0;
-var buf=createBuffer(len);
-
-if(buf.length===0){
-return buf;
-}
-
-obj.copy(buf,0,0,len);
-return buf;
-}
-
-if(obj.length!==undefined){
-if(typeof obj.length!=='number'||numberIsNaN(obj.length)){
-return createBuffer(0);
-}
-return fromArrayLike(obj);
-}
-
-if(obj.type==='Buffer'&&Array.isArray(obj.data)){
-return fromArrayLike(obj.data);
-}
-}
-
-function checked(length){
-
-
-if(length>=K_MAX_LENGTH){
-throw new RangeError('Attempt to allocate Buffer larger than maximum '+
-'size: 0x'+K_MAX_LENGTH.toString(16)+' bytes');
-}
-return length|0;
-}
-
-function SlowBuffer(length){
-if(+length!=length){
-length=0;
-}
-return Buffer.alloc(+length);
-}
-
-Buffer.isBuffer=function isBuffer(b){
-return b!=null&&b._isBuffer===true&&
-b!==Buffer.prototype;
-};
-
-Buffer.compare=function compare(a,b){
-if(isInstance(a,Uint8Array))a=Buffer.from(a,a.offset,a.byteLength);
-if(isInstance(b,Uint8Array))b=Buffer.from(b,b.offset,b.byteLength);
-if(!Buffer.isBuffer(a)||!Buffer.isBuffer(b)){
-throw new TypeError(
-'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');
-
-}
-
-if(a===b)return 0;
-
-var x=a.length;
-var y=b.length;
-
-for(var i=0,len=Math.min(x,y);i<len;++i){
-if(a[i]!==b[i]){
-x=a[i];
-y=b[i];
-break;
-}
-}
-
-if(x<y)return-1;
-if(y<x)return 1;
-return 0;
-};
-
-Buffer.isEncoding=function isEncoding(encoding){
-switch(String(encoding).toLowerCase()){
-case'hex':
-case'utf8':
-case'utf-8':
-case'ascii':
-case'latin1':
-case'binary':
-case'base64':
-case'ucs2':
-case'ucs-2':
-case'utf16le':
-case'utf-16le':
-return true;
-default:
-return false;}
-
-};
-
-Buffer.concat=function concat(list,length){
-if(!Array.isArray(list)){
-throw new TypeError('"list" argument must be an Array of Buffers');
-}
-
-if(list.length===0){
-return Buffer.alloc(0);
-}
-
-var i;
-if(length===undefined){
-length=0;
-for(i=0;i<list.length;++i){
-length+=list[i].length;
-}
-}
-
-var buffer=Buffer.allocUnsafe(length);
-var pos=0;
-for(i=0;i<list.length;++i){
-var buf=list[i];
-if(isInstance(buf,Uint8Array)){
-buf=Buffer.from(buf);
-}
-if(!Buffer.isBuffer(buf)){
-throw new TypeError('"list" argument must be an Array of Buffers');
-}
-buf.copy(buffer,pos);
-pos+=buf.length;
-}
-return buffer;
-};
-
-function byteLength(string,encoding){
-if(Buffer.isBuffer(string)){
-return string.length;
-}
-if(ArrayBuffer.isView(string)||isInstance(string,ArrayBuffer)){
-return string.byteLength;
-}
-if(typeof string!=='string'){
-throw new TypeError(
-'The "string" argument must be one of type string, Buffer, or ArrayBuffer. '+
-'Received type '+typeof string);
-
-}
-
-var len=string.length;
-var mustMatch=arguments.length>2&&arguments[2]===true;
-if(!mustMatch&&len===0)return 0;
-
-
-var loweredCase=false;
-for(;;){
-switch(encoding){
-case'ascii':
-case'latin1':
-case'binary':
-return len;
-case'utf8':
-case'utf-8':
-return utf8ToBytes(string).length;
-case'ucs2':
-case'ucs-2':
-case'utf16le':
-case'utf-16le':
-return len*2;
-case'hex':
-return len>>>1;
-case'base64':
-return base64ToBytes(string).length;
-default:
-if(loweredCase){
-return mustMatch?-1:utf8ToBytes(string).length;
-}
-encoding=(''+encoding).toLowerCase();
-loweredCase=true;}
-
-}
-}
-Buffer.byteLength=byteLength;
-
-function slowToString(encoding,start,end){
-var loweredCase=false;
-
-
-
-
-
-
-
-
-if(start===undefined||start<0){
-start=0;
-}
-
-
-if(start>this.length){
-return'';
-}
-
-if(end===undefined||end>this.length){
-end=this.length;
-}
-
-if(end<=0){
-return'';
-}
-
-
-end>>>=0;
-start>>>=0;
-
-if(end<=start){
-return'';
-}
-
-if(!encoding)encoding='utf8';
-
-while(true){
-switch(encoding){
-case'hex':
-return hexSlice(this,start,end);
-
-case'utf8':
-case'utf-8':
-return utf8Slice(this,start,end);
-
-case'ascii':
-return asciiSlice(this,start,end);
-
-case'latin1':
-case'binary':
-return latin1Slice(this,start,end);
-
-case'base64':
-return base64Slice(this,start,end);
-
-case'ucs2':
-case'ucs-2':
-case'utf16le':
-case'utf-16le':
-return utf16leSlice(this,start,end);
-
-default:
-if(loweredCase)throw new TypeError('Unknown encoding: '+encoding);
-encoding=(encoding+'').toLowerCase();
-loweredCase=true;}
-
-}
-}
-
-
-
-
-
-
-
-Buffer.prototype._isBuffer=true;
-
-function swap(b,n,m){
-var i=b[n];
-b[n]=b[m];
-b[m]=i;
-}
-
-Buffer.prototype.swap16=function swap16(){
-var len=this.length;
-if(len%2!==0){
-throw new RangeError('Buffer size must be a multiple of 16-bits');
-}
-for(var i=0;i<len;i+=2){
-swap(this,i,i+1);
-}
-return this;
-};
-
-Buffer.prototype.swap32=function swap32(){
-var len=this.length;
-if(len%4!==0){
-throw new RangeError('Buffer size must be a multiple of 32-bits');
-}
-for(var i=0;i<len;i+=4){
-swap(this,i,i+3);
-swap(this,i+1,i+2);
-}
-return this;
-};
-
-Buffer.prototype.swap64=function swap64(){
-var len=this.length;
-if(len%8!==0){
-throw new RangeError('Buffer size must be a multiple of 64-bits');
-}
-for(var i=0;i<len;i+=8){
-swap(this,i,i+7);
-swap(this,i+1,i+6);
-swap(this,i+2,i+5);
-swap(this,i+3,i+4);
-}
-return this;
-};
-
-Buffer.prototype.toString=function toString(){
-var length=this.length;
-if(length===0)return'';
-if(arguments.length===0)return utf8Slice(this,0,length);
-return slowToString.apply(this,arguments);
-};
-
-Buffer.prototype.toLocaleString=Buffer.prototype.toString;
-
-Buffer.prototype.equals=function equals(b){
-if(!Buffer.isBuffer(b))throw new TypeError('Argument must be a Buffer');
-if(this===b)return true;
-return Buffer.compare(this,b)===0;
-};
-
-Buffer.prototype.inspect=function inspect(){
-var str='';
-var max=exports.INSPECT_MAX_BYTES;
-str=this.toString('hex',0,max).replace(/(.{2})/g,'$1 ').trim();
-if(this.length>max)str+=' ... ';
-return'<Buffer '+str+'>';
-};
-
-Buffer.prototype.compare=function compare(target,start,end,thisStart,thisEnd){
-if(isInstance(target,Uint8Array)){
-target=Buffer.from(target,target.offset,target.byteLength);
-}
-if(!Buffer.isBuffer(target)){
-throw new TypeError(
-'The "target" argument must be one of type Buffer or Uint8Array. '+
-'Received type '+typeof target);
-
-}
-
-if(start===undefined){
-start=0;
-}
-if(end===undefined){
-end=target?target.length:0;
-}
-if(thisStart===undefined){
-thisStart=0;
-}
-if(thisEnd===undefined){
-thisEnd=this.length;
-}
-
-if(start<0||end>target.length||thisStart<0||thisEnd>this.length){
-throw new RangeError('out of range index');
-}
-
-if(thisStart>=thisEnd&&start>=end){
-return 0;
-}
-if(thisStart>=thisEnd){
-return-1;
-}
-if(start>=end){
-return 1;
-}
-
-start>>>=0;
-end>>>=0;
-thisStart>>>=0;
-thisEnd>>>=0;
-
-if(this===target)return 0;
-
-var x=thisEnd-thisStart;
-var y=end-start;
-var len=Math.min(x,y);
-
-var thisCopy=this.slice(thisStart,thisEnd);
-var targetCopy=target.slice(start,end);
-
-for(var i=0;i<len;++i){
-if(thisCopy[i]!==targetCopy[i]){
-x=thisCopy[i];
-y=targetCopy[i];
-break;
-}
-}
-
-if(x<y)return-1;
-if(y<x)return 1;
-return 0;
-};
-
-
-
-
-
-
-
-
-
-
-function bidirectionalIndexOf(buffer,val,byteOffset,encoding,dir){
-
-if(buffer.length===0)return-1;
-
-
-if(typeof byteOffset==='string'){
-encoding=byteOffset;
-byteOffset=0;
-}else if(byteOffset>0x7fffffff){
-byteOffset=0x7fffffff;
-}else if(byteOffset<-0x80000000){
-byteOffset=-0x80000000;
-}
-byteOffset=+byteOffset;
-if(numberIsNaN(byteOffset)){
-
-byteOffset=dir?0:buffer.length-1;
-}
-
-
-if(byteOffset<0)byteOffset=buffer.length+byteOffset;
-if(byteOffset>=buffer.length){
-if(dir)return-1;else
-byteOffset=buffer.length-1;
-}else if(byteOffset<0){
-if(dir)byteOffset=0;else
-return-1;
-}
-
-
-if(typeof val==='string'){
-val=Buffer.from(val,encoding);
-}
-
-
-if(Buffer.isBuffer(val)){
-
-if(val.length===0){
-return-1;
-}
-return arrayIndexOf(buffer,val,byteOffset,encoding,dir);
-}else if(typeof val==='number'){
-val=val&0xFF;
-if(typeof Uint8Array.prototype.indexOf==='function'){
-if(dir){
-return Uint8Array.prototype.indexOf.call(buffer,val,byteOffset);
-}else{
-return Uint8Array.prototype.lastIndexOf.call(buffer,val,byteOffset);
-}
-}
-return arrayIndexOf(buffer,[val],byteOffset,encoding,dir);
-}
-
-throw new TypeError('val must be string, number or Buffer');
-}
-
-function arrayIndexOf(arr,val,byteOffset,encoding,dir){
-var indexSize=1;
-var arrLength=arr.length;
-var valLength=val.length;
-
-if(encoding!==undefined){
-encoding=String(encoding).toLowerCase();
-if(encoding==='ucs2'||encoding==='ucs-2'||
-encoding==='utf16le'||encoding==='utf-16le'){
-if(arr.length<2||val.length<2){
-return-1;
-}
-indexSize=2;
-arrLength/=2;
-valLength/=2;
-byteOffset/=2;
-}
-}
-
-function read(buf,i){
-if(indexSize===1){
-return buf[i];
-}else{
-return buf.readUInt16BE(i*indexSize);
-}
-}
-
-var i;
-if(dir){
-var foundIndex=-1;
-for(i=byteOffset;i<arrLength;i++){
-if(read(arr,i)===read(val,foundIndex===-1?0:i-foundIndex)){
-if(foundIndex===-1)foundIndex=i;
-if(i-foundIndex+1===valLength)return foundIndex*indexSize;
-}else{
-if(foundIndex!==-1)i-=i-foundIndex;
-foundIndex=-1;
-}
-}
-}else{
-if(byteOffset+valLength>arrLength)byteOffset=arrLength-valLength;
-for(i=byteOffset;i>=0;i--){
-var found=true;
-for(var j=0;j<valLength;j++){
-if(read(arr,i+j)!==read(val,j)){
-found=false;
-break;
-}
-}
-if(found)return i;
-}
-}
-
-return-1;
-}
-
-Buffer.prototype.includes=function includes(val,byteOffset,encoding){
-return this.indexOf(val,byteOffset,encoding)!==-1;
-};
-
-Buffer.prototype.indexOf=function indexOf(val,byteOffset,encoding){
-return bidirectionalIndexOf(this,val,byteOffset,encoding,true);
-};
-
-Buffer.prototype.lastIndexOf=function lastIndexOf(val,byteOffset,encoding){
-return bidirectionalIndexOf(this,val,byteOffset,encoding,false);
-};
-
-function hexWrite(buf,string,offset,length){
-offset=Number(offset)||0;
-var remaining=buf.length-offset;
-if(!length){
-length=remaining;
-}else{
-length=Number(length);
-if(length>remaining){
-length=remaining;
-}
-}
-
-var strLen=string.length;
-
-if(length>strLen/2){
-length=strLen/2;
-}
-for(var i=0;i<length;++i){
-var parsed=parseInt(string.substr(i*2,2),16);
-if(numberIsNaN(parsed))return i;
-buf[offset+i]=parsed;
-}
-return i;
-}
-
-function utf8Write(buf,string,offset,length){
-return blitBuffer(utf8ToBytes(string,buf.length-offset),buf,offset,length);
-}
-
-function asciiWrite(buf,string,offset,length){
-return blitBuffer(asciiToBytes(string),buf,offset,length);
-}
-
-function latin1Write(buf,string,offset,length){
-return asciiWrite(buf,string,offset,length);
-}
-
-function base64Write(buf,string,offset,length){
-return blitBuffer(base64ToBytes(string),buf,offset,length);
-}
-
-function ucs2Write(buf,string,offset,length){
-return blitBuffer(utf16leToBytes(string,buf.length-offset),buf,offset,length);
-}
-
-Buffer.prototype.write=function write(string,offset,length,encoding){
-
-if(offset===undefined){
-encoding='utf8';
-length=this.length;
-offset=0;
-
-}else if(length===undefined&&typeof offset==='string'){
-encoding=offset;
-length=this.length;
-offset=0;
-
-}else if(isFinite(offset)){
-offset=offset>>>0;
-if(isFinite(length)){
-length=length>>>0;
-if(encoding===undefined)encoding='utf8';
-}else{
-encoding=length;
-length=undefined;
-}
-}else{
-throw new Error(
-'Buffer.write(string, encoding, offset[, length]) is no longer supported');
-
-}
-
-var remaining=this.length-offset;
-if(length===undefined||length>remaining)length=remaining;
-
-if(string.length>0&&(length<0||offset<0)||offset>this.length){
-throw new RangeError('Attempt to write outside buffer bounds');
-}
-
-if(!encoding)encoding='utf8';
-
-var loweredCase=false;
-for(;;){
-switch(encoding){
-case'hex':
-return hexWrite(this,string,offset,length);
-
-case'utf8':
-case'utf-8':
-return utf8Write(this,string,offset,length);
-
-case'ascii':
-return asciiWrite(this,string,offset,length);
-
-case'latin1':
-case'binary':
-return latin1Write(this,string,offset,length);
-
-case'base64':
-
-return base64Write(this,string,offset,length);
-
-case'ucs2':
-case'ucs-2':
-case'utf16le':
-case'utf-16le':
-return ucs2Write(this,string,offset,length);
-
-default:
-if(loweredCase)throw new TypeError('Unknown encoding: '+encoding);
-encoding=(''+encoding).toLowerCase();
-loweredCase=true;}
-
-}
-};
-
-Buffer.prototype.toJSON=function toJSON(){
-return{
-type:'Buffer',
-data:Array.prototype.slice.call(this._arr||this,0)};
-
-};
-
-function base64Slice(buf,start,end){
-if(start===0&&end===buf.length){
-return base64.fromByteArray(buf);
-}else{
-return base64.fromByteArray(buf.slice(start,end));
-}
-}
-
-function utf8Slice(buf,start,end){
-end=Math.min(buf.length,end);
-var res=[];
-
-var i=start;
-while(i<end){
-var firstByte=buf[i];
-var codePoint=null;
-var bytesPerSequence=firstByte>0xEF?4:
-firstByte>0xDF?3:
-firstByte>0xBF?2:
-1;
-
-if(i+bytesPerSequence<=end){
-var secondByte,thirdByte,fourthByte,tempCodePoint;
-
-switch(bytesPerSequence){
-case 1:
-if(firstByte<0x80){
-codePoint=firstByte;
-}
-break;
-case 2:
-secondByte=buf[i+1];
-if((secondByte&0xC0)===0x80){
-tempCodePoint=(firstByte&0x1F)<<0x6|secondByte&0x3F;
-if(tempCodePoint>0x7F){
-codePoint=tempCodePoint;
-}
-}
-break;
-case 3:
-secondByte=buf[i+1];
-thirdByte=buf[i+2];
-if((secondByte&0xC0)===0x80&&(thirdByte&0xC0)===0x80){
-tempCodePoint=(firstByte&0xF)<<0xC|(secondByte&0x3F)<<0x6|thirdByte&0x3F;
-if(tempCodePoint>0x7FF&&(tempCodePoint<0xD800||tempCodePoint>0xDFFF)){
-codePoint=tempCodePoint;
-}
-}
-break;
-case 4:
-secondByte=buf[i+1];
-thirdByte=buf[i+2];
-fourthByte=buf[i+3];
-if((secondByte&0xC0)===0x80&&(thirdByte&0xC0)===0x80&&(fourthByte&0xC0)===0x80){
-tempCodePoint=(firstByte&0xF)<<0x12|(secondByte&0x3F)<<0xC|(thirdByte&0x3F)<<0x6|fourthByte&0x3F;
-if(tempCodePoint>0xFFFF&&tempCodePoint<0x110000){
-codePoint=tempCodePoint;
-}
-}}
-
-}
-
-if(codePoint===null){
-
-
-codePoint=0xFFFD;
-bytesPerSequence=1;
-}else if(codePoint>0xFFFF){
-
-codePoint-=0x10000;
-res.push(codePoint>>>10&0x3FF|0xD800);
-codePoint=0xDC00|codePoint&0x3FF;
-}
-
-res.push(codePoint);
-i+=bytesPerSequence;
-}
-
-return decodeCodePointsArray(res);
-}
-
-
-
-
-var MAX_ARGUMENTS_LENGTH=0x1000;
-
-function decodeCodePointsArray(codePoints){
-var len=codePoints.length;
-if(len<=MAX_ARGUMENTS_LENGTH){
-return String.fromCharCode.apply(String,codePoints);
-}
-
-
-var res='';
-var i=0;
-while(i<len){
-res+=String.fromCharCode.apply(
-String,
-codePoints.slice(i,i+=MAX_ARGUMENTS_LENGTH));
-
-}
-return res;
-}
-
-function asciiSlice(buf,start,end){
-var ret='';
-end=Math.min(buf.length,end);
-
-for(var i=start;i<end;++i){
-ret+=String.fromCharCode(buf[i]&0x7F);
-}
-return ret;
-}
-
-function latin1Slice(buf,start,end){
-var ret='';
-end=Math.min(buf.length,end);
-
-for(var i=start;i<end;++i){
-ret+=String.fromCharCode(buf[i]);
-}
-return ret;
-}
-
-function hexSlice(buf,start,end){
-var len=buf.length;
-
-if(!start||start<0)start=0;
-if(!end||end<0||end>len)end=len;
-
-var out='';
-for(var i=start;i<end;++i){
-out+=toHex(buf[i]);
-}
-return out;
-}
-
-function utf16leSlice(buf,start,end){
-var bytes=buf.slice(start,end);
-var res='';
-for(var i=0;i<bytes.length;i+=2){
-res+=String.fromCharCode(bytes[i]+bytes[i+1]*256);
-}
-return res;
-}
-
-Buffer.prototype.slice=function slice(start,end){
-var len=this.length;
-start=~~start;
-end=end===undefined?len:~~end;
-
-if(start<0){
-start+=len;
-if(start<0)start=0;
-}else if(start>len){
-start=len;
-}
-
-if(end<0){
-end+=len;
-if(end<0)end=0;
-}else if(end>len){
-end=len;
-}
-
-if(end<start)end=start;
-
-var newBuf=this.subarray(start,end);
-
-newBuf.__proto__=Buffer.prototype;
-return newBuf;
-};
-
-
-
-
-function checkOffset(offset,ext,length){
-if(offset%1!==0||offset<0)throw new RangeError('offset is not uint');
-if(offset+ext>length)throw new RangeError('Trying to access beyond buffer length');
-}
-
-Buffer.prototype.readUIntLE=function readUIntLE(offset,byteLength,noAssert){
-offset=offset>>>0;
-byteLength=byteLength>>>0;
-if(!noAssert)checkOffset(offset,byteLength,this.length);
-
-var val=this[offset];
-var mul=1;
-var i=0;
-while(++i<byteLength&&(mul*=0x100)){
-val+=this[offset+i]*mul;
-}
-
-return val;
-};
-
-Buffer.prototype.readUIntBE=function readUIntBE(offset,byteLength,noAssert){
-offset=offset>>>0;
-byteLength=byteLength>>>0;
-if(!noAssert){
-checkOffset(offset,byteLength,this.length);
-}
-
-var val=this[offset+--byteLength];
-var mul=1;
-while(byteLength>0&&(mul*=0x100)){
-val+=this[offset+--byteLength]*mul;
-}
-
-return val;
-};
-
-Buffer.prototype.readUInt8=function readUInt8(offset,noAssert){
-offset=offset>>>0;
-if(!noAssert)checkOffset(offset,1,this.length);
-return this[offset];
-};
-
-Buffer.prototype.readUInt16LE=function readUInt16LE(offset,noAssert){
-offset=offset>>>0;
-if(!noAssert)checkOffset(offset,2,this.length);
-return this[offset]|this[offset+1]<<8;
-};
-
-Buffer.prototype.readUInt16BE=function readUInt16BE(offset,noAssert){
-offset=offset>>>0;
-if(!noAssert)checkOffset(offset,2,this.length);
-return this[offset]<<8|this[offset+1];
-};
-
-Buffer.prototype.readUInt32LE=function readUInt32LE(offset,noAssert){
-offset=offset>>>0;
-if(!noAssert)checkOffset(offset,4,this.length);
-
-return(this[offset]|
-this[offset+1]<<8|
-this[offset+2]<<16)+
-this[offset+3]*0x1000000;
-};
-
-Buffer.prototype.readUInt32BE=function readUInt32BE(offset,noAssert){
-offset=offset>>>0;
-if(!noAssert)checkOffset(offset,4,this.length);
-
-return this[offset]*0x1000000+(
-this[offset+1]<<16|
-this[offset+2]<<8|
-this[offset+3]);
-};
-
-Buffer.prototype.readIntLE=function readIntLE(offset,byteLength,noAssert){
-offset=offset>>>0;
-byteLength=byteLength>>>0;
-if(!noAssert)checkOffset(offset,byteLength,this.length);
-
-var val=this[offset];
-var mul=1;
-var i=0;
-while(++i<byteLength&&(mul*=0x100)){
-val+=this[offset+i]*mul;
-}
-mul*=0x80;
-
-if(val>=mul)val-=Math.pow(2,8*byteLength);
-
-return val;
-};
-
-Buffer.prototype.readIntBE=function readIntBE(offset,byteLength,noAssert){
-offset=offset>>>0;
-byteLength=byteLength>>>0;
-if(!noAssert)checkOffset(offset,byteLength,this.length);
-
-var i=byteLength;
-var mul=1;
-var val=this[offset+--i];
-while(i>0&&(mul*=0x100)){
-val+=this[offset+--i]*mul;
-}
-mul*=0x80;
-
-if(val>=mul)val-=Math.pow(2,8*byteLength);
-
-return val;
-};
-
-Buffer.prototype.readInt8=function readInt8(offset,noAssert){
-offset=offset>>>0;
-if(!noAssert)checkOffset(offset,1,this.length);
-if(!(this[offset]&0x80))return this[offset];
-return(0xff-this[offset]+1)*-1;
-};
-
-Buffer.prototype.readInt16LE=function readInt16LE(offset,noAssert){
-offset=offset>>>0;
-if(!noAssert)checkOffset(offset,2,this.length);
-var val=this[offset]|this[offset+1]<<8;
-return val&0x8000?val|0xFFFF0000:val;
-};
-
-Buffer.prototype.readInt16BE=function readInt16BE(offset,noAssert){
-offset=offset>>>0;
-if(!noAssert)checkOffset(offset,2,this.length);
-var val=this[offset+1]|this[offset]<<8;
-return val&0x8000?val|0xFFFF0000:val;
-};
-
-Buffer.prototype.readInt32LE=function readInt32LE(offset,noAssert){
-offset=offset>>>0;
-if(!noAssert)checkOffset(offset,4,this.length);
-
-return this[offset]|
-this[offset+1]<<8|
-this[offset+2]<<16|
-this[offset+3]<<24;
-};
-
-Buffer.prototype.readInt32BE=function readInt32BE(offset,noAssert){
-offset=offset>>>0;
-if(!noAssert)checkOffset(offset,4,this.length);
-
-return this[offset]<<24|
-this[offset+1]<<16|
-this[offset+2]<<8|
-this[offset+3];
-};
-
-Buffer.prototype.readFloatLE=function readFloatLE(offset,noAssert){
-offset=offset>>>0;
-if(!noAssert)checkOffset(offset,4,this.length);
-return ieee754.read(this,offset,true,23,4);
-};
-
-Buffer.prototype.readFloatBE=function readFloatBE(offset,noAssert){
-offset=offset>>>0;
-if(!noAssert)checkOffset(offset,4,this.length);
-return ieee754.read(this,offset,false,23,4);
-};
-
-Buffer.prototype.readDoubleLE=function readDoubleLE(offset,noAssert){
-offset=offset>>>0;
-if(!noAssert)checkOffset(offset,8,this.length);
-return ieee754.read(this,offset,true,52,8);
-};
-
-Buffer.prototype.readDoubleBE=function readDoubleBE(offset,noAssert){
-offset=offset>>>0;
-if(!noAssert)checkOffset(offset,8,this.length);
-return ieee754.read(this,offset,false,52,8);
-};
-
-function checkInt(buf,value,offset,ext,max,min){
-if(!Buffer.isBuffer(buf))throw new TypeError('"buffer" argument must be a Buffer instance');
-if(value>max||value<min)throw new RangeError('"value" argument is out of bounds');
-if(offset+ext>buf.length)throw new RangeError('Index out of range');
-}
-
-Buffer.prototype.writeUIntLE=function writeUIntLE(value,offset,byteLength,noAssert){
-value=+value;
-offset=offset>>>0;
-byteLength=byteLength>>>0;
-if(!noAssert){
-var maxBytes=Math.pow(2,8*byteLength)-1;
-checkInt(this,value,offset,byteLength,maxBytes,0);
-}
-
-var mul=1;
-var i=0;
-this[offset]=value&0xFF;
-while(++i<byteLength&&(mul*=0x100)){
-this[offset+i]=value/mul&0xFF;
-}
-
-return offset+byteLength;
-};
-
-Buffer.prototype.writeUIntBE=function writeUIntBE(value,offset,byteLength,noAssert){
-value=+value;
-offset=offset>>>0;
-byteLength=byteLength>>>0;
-if(!noAssert){
-var maxBytes=Math.pow(2,8*byteLength)-1;
-checkInt(this,value,offset,byteLength,maxBytes,0);
-}
-
-var i=byteLength-1;
-var mul=1;
-this[offset+i]=value&0xFF;
-while(--i>=0&&(mul*=0x100)){
-this[offset+i]=value/mul&0xFF;
-}
-
-return offset+byteLength;
-};
-
-Buffer.prototype.writeUInt8=function writeUInt8(value,offset,noAssert){
-value=+value;
-offset=offset>>>0;
-if(!noAssert)checkInt(this,value,offset,1,0xff,0);
-this[offset]=value&0xff;
-return offset+1;
-};
-
-Buffer.prototype.writeUInt16LE=function writeUInt16LE(value,offset,noAssert){
-value=+value;
-offset=offset>>>0;
-if(!noAssert)checkInt(this,value,offset,2,0xffff,0);
-this[offset]=value&0xff;
-this[offset+1]=value>>>8;
-return offset+2;
-};
-
-Buffer.prototype.writeUInt16BE=function writeUInt16BE(value,offset,noAssert){
-value=+value;
-offset=offset>>>0;
-if(!noAssert)checkInt(this,value,offset,2,0xffff,0);
-this[offset]=value>>>8;
-this[offset+1]=value&0xff;
-return offset+2;
-};
-
-Buffer.prototype.writeUInt32LE=function writeUInt32LE(value,offset,noAssert){
-value=+value;
-offset=offset>>>0;
-if(!noAssert)checkInt(this,value,offset,4,0xffffffff,0);
-this[offset+3]=value>>>24;
-this[offset+2]=value>>>16;
-this[offset+1]=value>>>8;
-this[offset]=value&0xff;
-return offset+4;
-};
-
-Buffer.prototype.writeUInt32BE=function writeUInt32BE(value,offset,noAssert){
-value=+value;
-offset=offset>>>0;
-if(!noAssert)checkInt(this,value,offset,4,0xffffffff,0);
-this[offset]=value>>>24;
-this[offset+1]=value>>>16;
-this[offset+2]=value>>>8;
-this[offset+3]=value&0xff;
-return offset+4;
-};
-
-Buffer.prototype.writeIntLE=function writeIntLE(value,offset,byteLength,noAssert){
-value=+value;
-offset=offset>>>0;
-if(!noAssert){
-var limit=Math.pow(2,8*byteLength-1);
-
-checkInt(this,value,offset,byteLength,limit-1,-limit);
-}
-
-var i=0;
-var mul=1;
-var sub=0;
-this[offset]=value&0xFF;
-while(++i<byteLength&&(mul*=0x100)){
-if(value<0&&sub===0&&this[offset+i-1]!==0){
-sub=1;
-}
-this[offset+i]=(value/mul>>0)-sub&0xFF;
-}
-
-return offset+byteLength;
-};
-
-Buffer.prototype.writeIntBE=function writeIntBE(value,offset,byteLength,noAssert){
-value=+value;
-offset=offset>>>0;
-if(!noAssert){
-var limit=Math.pow(2,8*byteLength-1);
-
-checkInt(this,value,offset,byteLength,limit-1,-limit);
-}
-
-var i=byteLength-1;
-var mul=1;
-var sub=0;
-this[offset+i]=value&0xFF;
-while(--i>=0&&(mul*=0x100)){
-if(value<0&&sub===0&&this[offset+i+1]!==0){
-sub=1;
-}
-this[offset+i]=(value/mul>>0)-sub&0xFF;
-}
-
-return offset+byteLength;
-};
-
-Buffer.prototype.writeInt8=function writeInt8(value,offset,noAssert){
-value=+value;
-offset=offset>>>0;
-if(!noAssert)checkInt(this,value,offset,1,0x7f,-0x80);
-if(value<0)value=0xff+value+1;
-this[offset]=value&0xff;
-return offset+1;
-};
-
-Buffer.prototype.writeInt16LE=function writeInt16LE(value,offset,noAssert){
-value=+value;
-offset=offset>>>0;
-if(!noAssert)checkInt(this,value,offset,2,0x7fff,-0x8000);
-this[offset]=value&0xff;
-this[offset+1]=value>>>8;
-return offset+2;
-};
-
-Buffer.prototype.writeInt16BE=function writeInt16BE(value,offset,noAssert){
-value=+value;
-offset=offset>>>0;
-if(!noAssert)checkInt(this,value,offset,2,0x7fff,-0x8000);
-this[offset]=value>>>8;
-this[offset+1]=value&0xff;
-return offset+2;
-};
-
-Buffer.prototype.writeInt32LE=function writeInt32LE(value,offset,noAssert){
-value=+value;
-offset=offset>>>0;
-if(!noAssert)checkInt(this,value,offset,4,0x7fffffff,-0x80000000);
-this[offset]=value&0xff;
-this[offset+1]=value>>>8;
-this[offset+2]=value>>>16;
-this[offset+3]=value>>>24;
-return offset+4;
-};
-
-Buffer.prototype.writeInt32BE=function writeInt32BE(value,offset,noAssert){
-value=+value;
-offset=offset>>>0;
-if(!noAssert)checkInt(this,value,offset,4,0x7fffffff,-0x80000000);
-if(value<0)value=0xffffffff+value+1;
-this[offset]=value>>>24;
-this[offset+1]=value>>>16;
-this[offset+2]=value>>>8;
-this[offset+3]=value&0xff;
-return offset+4;
-};
-
-function checkIEEE754(buf,value,offset,ext,max,min){
-if(offset+ext>buf.length)throw new RangeError('Index out of range');
-if(offset<0)throw new RangeError('Index out of range');
-}
-
-function writeFloat(buf,value,offset,littleEndian,noAssert){
-value=+value;
-offset=offset>>>0;
-if(!noAssert){
-checkIEEE754(buf,value,offset,4,3.4028234663852886e+38,-3.4028234663852886e+38);
-}
-ieee754.write(buf,value,offset,littleEndian,23,4);
-return offset+4;
-}
-
-Buffer.prototype.writeFloatLE=function writeFloatLE(value,offset,noAssert){
-return writeFloat(this,value,offset,true,noAssert);
-};
-
-Buffer.prototype.writeFloatBE=function writeFloatBE(value,offset,noAssert){
-return writeFloat(this,value,offset,false,noAssert);
-};
-
-function writeDouble(buf,value,offset,littleEndian,noAssert){
-value=+value;
-offset=offset>>>0;
-if(!noAssert){
-checkIEEE754(buf,value,offset,8,1.7976931348623157E+308,-1.7976931348623157E+308);
-}
-ieee754.write(buf,value,offset,littleEndian,52,8);
-return offset+8;
-}
-
-Buffer.prototype.writeDoubleLE=function writeDoubleLE(value,offset,noAssert){
-return writeDouble(this,value,offset,true,noAssert);
-};
-
-Buffer.prototype.writeDoubleBE=function writeDoubleBE(value,offset,noAssert){
-return writeDouble(this,value,offset,false,noAssert);
-};
-
-
-Buffer.prototype.copy=function copy(target,targetStart,start,end){
-if(!Buffer.isBuffer(target))throw new TypeError('argument should be a Buffer');
-if(!start)start=0;
-if(!end&&end!==0)end=this.length;
-if(targetStart>=target.length)targetStart=target.length;
-if(!targetStart)targetStart=0;
-if(end>0&&end<start)end=start;
-
-
-if(end===start)return 0;
-if(target.length===0||this.length===0)return 0;
-
-
-if(targetStart<0){
-throw new RangeError('targetStart out of bounds');
-}
-if(start<0||start>=this.length)throw new RangeError('Index out of range');
-if(end<0)throw new RangeError('sourceEnd out of bounds');
-
-
-if(end>this.length)end=this.length;
-if(target.length-targetStart<end-start){
-end=target.length-targetStart+start;
-}
-
-var len=end-start;
-
-if(this===target&&typeof Uint8Array.prototype.copyWithin==='function'){
-
-this.copyWithin(targetStart,start,end);
-}else if(this===target&&start<targetStart&&targetStart<end){
-
-for(var i=len-1;i>=0;--i){
-target[i+targetStart]=this[i+start];
-}
-}else{
-Uint8Array.prototype.set.call(
-target,
-this.subarray(start,end),
-targetStart);
-
-}
-
-return len;
-};
-
-
-
-
-
-Buffer.prototype.fill=function fill(val,start,end,encoding){
-
-if(typeof val==='string'){
-if(typeof start==='string'){
-encoding=start;
-start=0;
-end=this.length;
-}else if(typeof end==='string'){
-encoding=end;
-end=this.length;
-}
-if(encoding!==undefined&&typeof encoding!=='string'){
-throw new TypeError('encoding must be a string');
-}
-if(typeof encoding==='string'&&!Buffer.isEncoding(encoding)){
-throw new TypeError('Unknown encoding: '+encoding);
-}
-if(val.length===1){
-var code=val.charCodeAt(0);
-if(encoding==='utf8'&&code<128||
-encoding==='latin1'){
-
-val=code;
-}
-}
-}else if(typeof val==='number'){
-val=val&255;
-}
-
-
-if(start<0||this.length<start||this.length<end){
-throw new RangeError('Out of range index');
-}
-
-if(end<=start){
-return this;
-}
-
-start=start>>>0;
-end=end===undefined?this.length:end>>>0;
-
-if(!val)val=0;
-
-var i;
-if(typeof val==='number'){
-for(i=start;i<end;++i){
-this[i]=val;
-}
-}else{
-var bytes=Buffer.isBuffer(val)?
-val:
-Buffer.from(val,encoding);
-var len=bytes.length;
-if(len===0){
-throw new TypeError('The value "'+val+
-'" is invalid for argument "value"');
-}
-for(i=0;i<end-start;++i){
-this[i+start]=bytes[i%len];
-}
-}
-
-return this;
-};
-
-
-
-
-var INVALID_BASE64_RE=/[^+/0-9A-Za-z-_]/g;
-
-function base64clean(str){
-
-str=str.split('=')[0];
-
-str=str.trim().replace(INVALID_BASE64_RE,'');
-
-if(str.length<2)return'';
-
-while(str.length%4!==0){
-str=str+'=';
-}
-return str;
-}
-
-function toHex(n){
-if(n<16)return'0'+n.toString(16);
-return n.toString(16);
-}
-
-function utf8ToBytes(string,units){
-units=units||Infinity;
-var codePoint;
-var length=string.length;
-var leadSurrogate=null;
-var bytes=[];
-
-for(var i=0;i<length;++i){
-codePoint=string.charCodeAt(i);
-
-
-if(codePoint>0xD7FF&&codePoint<0xE000){
-
-if(!leadSurrogate){
-
-if(codePoint>0xDBFF){
-
-if((units-=3)>-1)bytes.push(0xEF,0xBF,0xBD);
-continue;
-}else if(i+1===length){
-
-if((units-=3)>-1)bytes.push(0xEF,0xBF,0xBD);
-continue;
-}
-
-
-leadSurrogate=codePoint;
-
-continue;
-}
-
-
-if(codePoint<0xDC00){
-if((units-=3)>-1)bytes.push(0xEF,0xBF,0xBD);
-leadSurrogate=codePoint;
-continue;
-}
-
-
-codePoint=(leadSurrogate-0xD800<<10|codePoint-0xDC00)+0x10000;
-}else if(leadSurrogate){
-
-if((units-=3)>-1)bytes.push(0xEF,0xBF,0xBD);
-}
-
-leadSurrogate=null;
-
-
-if(codePoint<0x80){
-if((units-=1)<0)break;
-bytes.push(codePoint);
-}else if(codePoint<0x800){
-if((units-=2)<0)break;
-bytes.push(
-codePoint>>0x6|0xC0,
-codePoint&0x3F|0x80);
-
-}else if(codePoint<0x10000){
-if((units-=3)<0)break;
-bytes.push(
-codePoint>>0xC|0xE0,
-codePoint>>0x6&0x3F|0x80,
-codePoint&0x3F|0x80);
-
-}else if(codePoint<0x110000){
-if((units-=4)<0)break;
-bytes.push(
-codePoint>>0x12|0xF0,
-codePoint>>0xC&0x3F|0x80,
-codePoint>>0x6&0x3F|0x80,
-codePoint&0x3F|0x80);
-
-}else{
-throw new Error('Invalid code point');
-}
-}
-
-return bytes;
-}
-
-function asciiToBytes(str){
-var byteArray=[];
-for(var i=0;i<str.length;++i){
-
-byteArray.push(str.charCodeAt(i)&0xFF);
-}
-return byteArray;
-}
-
-function utf16leToBytes(str,units){
-var c,hi,lo;
-var byteArray=[];
-for(var i=0;i<str.length;++i){
-if((units-=2)<0)break;
-
-c=str.charCodeAt(i);
-hi=c>>8;
-lo=c%256;
-byteArray.push(lo);
-byteArray.push(hi);
-}
-
-return byteArray;
-}
-
-function base64ToBytes(str){
-return base64.toByteArray(base64clean(str));
-}
-
-function blitBuffer(src,dst,offset,length){
-for(var i=0;i<length;++i){
-if(i+offset>=dst.length||i>=src.length)break;
-dst[i+offset]=src[i];
-}
-return i;
-}
-
-
-
-
-function isInstance(obj,type){
-return obj instanceof type||
-obj!=null&&obj.constructor!=null&&obj.constructor.name!=null&&
-obj.constructor.name===type.name;
-}
-function numberIsNaN(obj){
-
-return obj!==obj;
-}
-
-}).call(this,require("buffer").Buffer);
-},{"base64-js":97,"buffer":102,"ieee754":111}],103:[function(require,module,exports){
-(function(Buffer){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function isArray(arg){
-if(Array.isArray){
-return Array.isArray(arg);
-}
-return objectToString(arg)==='[object Array]';
-}
-exports.isArray=isArray;
-
-function isBoolean(arg){
-return typeof arg==='boolean';
-}
-exports.isBoolean=isBoolean;
-
-function isNull(arg){
-return arg===null;
-}
-exports.isNull=isNull;
-
-function isNullOrUndefined(arg){
-return arg==null;
-}
-exports.isNullOrUndefined=isNullOrUndefined;
-
-function isNumber(arg){
-return typeof arg==='number';
-}
-exports.isNumber=isNumber;
-
-function isString(arg){
-return typeof arg==='string';
-}
-exports.isString=isString;
-
-function isSymbol(arg){
-return typeof arg==='symbol';
-}
-exports.isSymbol=isSymbol;
-
-function isUndefined(arg){
-return arg===void 0;
-}
-exports.isUndefined=isUndefined;
-
-function isRegExp(re){
-return objectToString(re)==='[object RegExp]';
-}
-exports.isRegExp=isRegExp;
-
-function isObject(arg){
-return typeof arg==='object'&&arg!==null;
-}
-exports.isObject=isObject;
-
-function isDate(d){
-return objectToString(d)==='[object Date]';
-}
-exports.isDate=isDate;
-
-function isError(e){
-return objectToString(e)==='[object Error]'||e instanceof Error;
-}
-exports.isError=isError;
-
-function isFunction(arg){
-return typeof arg==='function';
-}
-exports.isFunction=isFunction;
-
-function isPrimitive(arg){
-return arg===null||
-typeof arg==='boolean'||
-typeof arg==='number'||
-typeof arg==='string'||
-typeof arg==='symbol'||
-typeof arg==='undefined';
-}
-exports.isPrimitive=isPrimitive;
-
-exports.isBuffer=Buffer.isBuffer;
-
-function objectToString(o){
-return Object.prototype.toString.call(o);
-}
-
-}).call(this,{"isBuffer":require("../../is-buffer/index.js")});
-},{"../../is-buffer/index.js":120}],104:[function(require,module,exports){
-module.exports=[
-"aliceblue",
-"antiquewhite",
-"aqua",
-"aquamarine",
-"azure",
-"beige",
-"bisque",
-"black",
-"blanchedalmond",
-"blue",
-"blueviolet",
-"brown",
-"burlywood",
-"cadetblue",
-"chartreuse",
-"chocolate",
-"coral",
-"cornflowerblue",
-"cornsilk",
-"crimson",
-"cyan",
-"darkblue",
-"darkcyan",
-"darkgoldenrod",
-"darkgray",
-"darkgreen",
-"darkgrey",
-"darkkhaki",
-"darkmagenta",
-"darkolivegreen",
-"darkorange",
-"darkorchid",
-"darkred",
-"darksalmon",
-"darkseagreen",
-"darkslateblue",
-"darkslategray",
-"darkslategrey",
-"darkturquoise",
-"darkviolet",
-"deeppink",
-"deepskyblue",
-"dimgray",
-"dimgrey",
-"dodgerblue",
-"firebrick",
-"floralwhite",
-"forestgreen",
-"fuchsia",
-"gainsboro",
-"ghostwhite",
-"gold",
-"goldenrod",
-"gray",
-"green",
-"greenyellow",
-"grey",
-"honeydew",
-"hotpink",
-"indianred",
-"indigo",
-"ivory",
-"khaki",
-"lavender",
-"lavenderblush",
-"lawngreen",
-"lemonchiffon",
-"lightblue",
-"lightcoral",
-"lightcyan",
-"lightgoldenrodyellow",
-"lightgray",
-"lightgreen",
-"lightgrey",
-"lightpink",
-"lightsalmon",
-"lightseagreen",
-"lightskyblue",
-"lightslategray",
-"lightslategrey",
-"lightsteelblue",
-"lightyellow",
-"lime",
-"limegreen",
-"linen",
-"magenta",
-"maroon",
-"mediumaquamarine",
-"mediumblue",
-"mediumorchid",
-"mediumpurple",
-"mediumseagreen",
-"mediumslateblue",
-"mediumspringgreen",
-"mediumturquoise",
-"mediumvioletred",
-"midnightblue",
-"mintcream",
-"mistyrose",
-"moccasin",
-"navajowhite",
-"navy",
-"oldlace",
-"olive",
-"olivedrab",
-"orange",
-"orangered",
-"orchid",
-"palegoldenrod",
-"palegreen",
-"paleturquoise",
-"palevioletred",
-"papayawhip",
-"peachpuff",
-"peru",
-"pink",
-"plum",
-"powderblue",
-"purple",
-"rebeccapurple",
-"red",
-"rosybrown",
-"royalblue",
-"saddlebrown",
-"salmon",
-"sandybrown",
-"seagreen",
-"seashell",
-"sienna",
-"silver",
-"skyblue",
-"slateblue",
-"slategray",
-"slategrey",
-"snow",
-"springgreen",
-"steelblue",
-"tan",
-"teal",
-"thistle",
-"tomato",
-"turquoise",
-"violet",
-"wheat",
-"white",
-"whitesmoke",
-"yellow",
-"yellowgreen"];
-
-
-},{}],105:[function(require,module,exports){
-
-
-
-
-'use strict';
-
-const namedColors=require('./named_colors.json');
-
-exports.TYPES={
-INTEGER:1,
-NUMBER:2,
-LENGTH:3,
-PERCENT:4,
-URL:5,
-COLOR:6,
-STRING:7,
-ANGLE:8,
-KEYWORD:9,
-NULL_OR_EMPTY_STR:10};
-
-
-
-var integerRegEx=/^[-+]?[0-9]+$/;
-var numberRegEx=/^[-+]?[0-9]*\.[0-9]+$/;
-var lengthRegEx=/^(0|[-+]?[0-9]*\.?[0-9]+(in|cm|em|mm|pt|pc|px|ex|rem|vh|vw))$/;
-var percentRegEx=/^[-+]?[0-9]*\.?[0-9]+%$/;
-var urlRegEx=/^url\(\s*([^)]*)\s*\)$/;
-var stringRegEx=/^("[^"]*"|'[^']*')$/;
-var colorRegEx1=/^#[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]([0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])?$/;
-var colorRegEx2=/^rgb\(([^)]*)\)$/;
-var colorRegEx3=/^rgba\(([^)]*)\)$/;
-var colorRegEx4=/^hsla?\(\s*(-?\d+|-?\d*.\d+)\s*,\s*(-?\d+|-?\d*.\d+)%\s*,\s*(-?\d+|-?\d*.\d+)%\s*(,\s*(-?\d+|-?\d*.\d+)\s*)?\)/;
-var angleRegEx=/^([-+]?[0-9]*\.?[0-9]+)(deg|grad|rad)$/;
-
-
-exports.valueType=function valueType(val){
-if(val===''||val===null){
-return exports.TYPES.NULL_OR_EMPTY_STR;
-}
-if(typeof val==='number'){
-val=val.toString();
-}
-
-if(typeof val!=='string'){
-return undefined;
-}
-
-if(integerRegEx.test(val)){
-return exports.TYPES.INTEGER;
-}
-if(numberRegEx.test(val)){
-return exports.TYPES.NUMBER;
-}
-if(lengthRegEx.test(val)){
-return exports.TYPES.LENGTH;
-}
-if(percentRegEx.test(val)){
-return exports.TYPES.PERCENT;
-}
-if(urlRegEx.test(val)){
-return exports.TYPES.URL;
-}
-if(stringRegEx.test(val)){
-return exports.TYPES.STRING;
-}
-if(angleRegEx.test(val)){
-return exports.TYPES.ANGLE;
-}
-if(colorRegEx1.test(val)){
-return exports.TYPES.COLOR;
-}
-var res=colorRegEx2.exec(val);
-var parts;
-if(res!==null){
-parts=res[1].split(/\s*,\s*/);
-if(parts.length!==3){
-return undefined;
-}
-if(
-parts.every(percentRegEx.test.bind(percentRegEx))||
-parts.every(integerRegEx.test.bind(integerRegEx)))
-{
-return exports.TYPES.COLOR;
-}
-return undefined;
-}
-res=colorRegEx3.exec(val);
-if(res!==null){
-parts=res[1].split(/\s*,\s*/);
-if(parts.length!==4){
-return undefined;
-}
-if(
-parts.slice(0,3).every(percentRegEx.test.bind(percentRegEx))||
-parts.every(integerRegEx.test.bind(integerRegEx)))
-{
-if(numberRegEx.test(parts[3])){
-return exports.TYPES.COLOR;
-}
-}
-return undefined;
-}
-
-if(colorRegEx4.test(val)){
-return exports.TYPES.COLOR;
-}
-
-
-val=val.toLowerCase();
-
-if(namedColors.includes(val)){
-return exports.TYPES.COLOR;
-}
-
-switch(val){
-
-case'activeborder':
-case'activecaption':
-case'appworkspace':
-case'background':
-case'buttonface':
-case'buttonhighlight':
-case'buttonshadow':
-case'buttontext':
-case'captiontext':
-case'graytext':
-case'highlight':
-case'highlighttext':
-case'inactiveborder':
-case'inactivecaption':
-case'inactivecaptiontext':
-case'infobackground':
-case'infotext':
-case'menu':
-case'menutext':
-case'scrollbar':
-case'threeddarkshadow':
-case'threedface':
-case'threedhighlight':
-case'threedlightshadow':
-case'threedshadow':
-case'window':
-case'windowframe':
-case'windowtext':
-return exports.TYPES.COLOR;
-default:
-return exports.TYPES.KEYWORD;}
-
-};
-
-exports.parseInteger=function parseInteger(val){
-var type=exports.valueType(val);
-if(type===exports.TYPES.NULL_OR_EMPTY_STR){
-return val;
-}
-if(type!==exports.TYPES.INTEGER){
-return undefined;
-}
-return String(parseInt(val,10));
-};
-
-exports.parseNumber=function parseNumber(val){
-var type=exports.valueType(val);
-if(type===exports.TYPES.NULL_OR_EMPTY_STR){
-return val;
-}
-if(type!==exports.TYPES.NUMBER&&type!==exports.TYPES.INTEGER){
-return undefined;
-}
-return String(parseFloat(val));
-};
-
-exports.parseLength=function parseLength(val){
-if(val===0||val==='0'){
-return'0px';
-}
-var type=exports.valueType(val);
-if(type===exports.TYPES.NULL_OR_EMPTY_STR){
-return val;
-}
-if(type!==exports.TYPES.LENGTH){
-return undefined;
-}
-return val;
-};
-
-exports.parsePercent=function parsePercent(val){
-if(val===0||val==='0'){
-return'0%';
-}
-var type=exports.valueType(val);
-if(type===exports.TYPES.NULL_OR_EMPTY_STR){
-return val;
-}
-if(type!==exports.TYPES.PERCENT){
-return undefined;
-}
-return val;
-};
-
-
-exports.parseMeasurement=function parseMeasurement(val){
-var length=exports.parseLength(val);
-if(length!==undefined){
-return length;
-}
-return exports.parsePercent(val);
-};
-
-exports.parseUrl=function parseUrl(val){
-var type=exports.valueType(val);
-if(type===exports.TYPES.NULL_OR_EMPTY_STR){
-return val;
-}
-var res=urlRegEx.exec(val);
-
-if(!res){
-return undefined;
-}
-var str=res[1];
-
-if((str[0]==='"'||str[0]==="'")&&str[0]!==str[str.length-1]){
-return undefined;
-}
-if(str[0]==='"'||str[0]==="'"){
-str=str.substr(1,str.length-2);
-}
-
-var i;
-for(i=0;i<str.length;i++){
-switch(str[i]){
-case'(':
-case')':
-case' ':
-case'\t':
-case'\n':
-case"'":
-case'"':
-return undefined;
-case'\\':
-i++;
-break;}
-
-}
-
-return'url('+str+')';
-};
-
-exports.parseString=function parseString(val){
-var type=exports.valueType(val);
-if(type===exports.TYPES.NULL_OR_EMPTY_STR){
-return val;
-}
-if(type!==exports.TYPES.STRING){
-return undefined;
-}
-var i;
-for(i=1;i<val.length-1;i++){
-switch(val[i]){
-case val[0]:
-return undefined;
-case'\\':
-i++;
-while(i<val.length-1&&/[0-9A-Fa-f]/.test(val[i])){
-i++;
-}
-break;}
-
-}
-if(i>=val.length){
-return undefined;
-}
-return val;
-};
-
-exports.parseColor=function parseColor(val){
-var type=exports.valueType(val);
-if(type===exports.TYPES.NULL_OR_EMPTY_STR){
-return val;
-}
-var red,
-green,
-blue,
-hue,
-saturation,
-lightness,
-alpha=1;
-var parts;
-var res=colorRegEx1.exec(val);
-
-if(res){
-var hex=val.substr(1);
-if(hex.length===3){
-hex=hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2];
-}
-red=parseInt(hex.substr(0,2),16);
-green=parseInt(hex.substr(2,2),16);
-blue=parseInt(hex.substr(4,2),16);
-return'rgb('+red+', '+green+', '+blue+')';
-}
-
-res=colorRegEx2.exec(val);
-if(res){
-parts=res[1].split(/\s*,\s*/);
-if(parts.length!==3){
-return undefined;
-}
-if(parts.every(percentRegEx.test.bind(percentRegEx))){
-red=Math.floor(parseFloat(parts[0].slice(0,-1))*255/100);
-green=Math.floor(parseFloat(parts[1].slice(0,-1))*255/100);
-blue=Math.floor(parseFloat(parts[2].slice(0,-1))*255/100);
-}else if(parts.every(integerRegEx.test.bind(integerRegEx))){
-red=parseInt(parts[0],10);
-green=parseInt(parts[1],10);
-blue=parseInt(parts[2],10);
-}else{
-return undefined;
-}
-red=Math.min(255,Math.max(0,red));
-green=Math.min(255,Math.max(0,green));
-blue=Math.min(255,Math.max(0,blue));
-return'rgb('+red+', '+green+', '+blue+')';
-}
-
-res=colorRegEx3.exec(val);
-if(res){
-parts=res[1].split(/\s*,\s*/);
-if(parts.length!==4){
-return undefined;
-}
-if(parts.slice(0,3).every(percentRegEx.test.bind(percentRegEx))){
-red=Math.floor(parseFloat(parts[0].slice(0,-1))*255/100);
-green=Math.floor(parseFloat(parts[1].slice(0,-1))*255/100);
-blue=Math.floor(parseFloat(parts[2].slice(0,-1))*255/100);
-alpha=parseFloat(parts[3]);
-}else if(parts.slice(0,3).every(integerRegEx.test.bind(integerRegEx))){
-red=parseInt(parts[0],10);
-green=parseInt(parts[1],10);
-blue=parseInt(parts[2],10);
-alpha=parseFloat(parts[3]);
-}else{
-return undefined;
-}
-if(isNaN(alpha)){
-alpha=1;
-}
-red=Math.min(255,Math.max(0,red));
-green=Math.min(255,Math.max(0,green));
-blue=Math.min(255,Math.max(0,blue));
-alpha=Math.min(1,Math.max(0,alpha));
-if(alpha===1){
-return'rgb('+red+', '+green+', '+blue+')';
-}
-return'rgba('+red+', '+green+', '+blue+', '+alpha+')';
-}
-
-res=colorRegEx4.exec(val);
-if(res){
-const[,_hue,_saturation,_lightness,_alphaString='']=res;
-const _alpha=parseFloat(_alphaString.replace(',','').trim());
-if(!_hue||!_saturation||!_lightness){
-return undefined;
-}
-hue=parseFloat(_hue);
-saturation=parseInt(_saturation,10);
-lightness=parseInt(_lightness,10);
-if(_alpha&&numberRegEx.test(_alpha)){
-alpha=parseFloat(_alpha);
-}
-if(!_alphaString||alpha===1){
-return'hsl('+hue+', '+saturation+'%, '+lightness+'%)';
-}
-return'hsla('+hue+', '+saturation+'%, '+lightness+'%, '+alpha+')';
-}
-
-if(type===exports.TYPES.COLOR){
-return val;
-}
-return undefined;
-};
-
-exports.parseAngle=function parseAngle(val){
-var type=exports.valueType(val);
-if(type===exports.TYPES.NULL_OR_EMPTY_STR){
-return val;
-}
-if(type!==exports.TYPES.ANGLE){
-return undefined;
-}
-var res=angleRegEx.exec(val);
-var flt=parseFloat(res[1]);
-if(res[2]==='rad'){
-flt*=180/Math.PI;
-}else if(res[2]==='grad'){
-flt*=360/400;
-}
-
-while(flt<0){
-flt+=360;
-}
-while(flt>360){
-flt-=360;
-}
-return flt+'deg';
-};
-
-exports.parseKeyword=function parseKeyword(val,valid_keywords){
-var type=exports.valueType(val);
-if(type===exports.TYPES.NULL_OR_EMPTY_STR){
-return val;
-}
-if(type!==exports.TYPES.KEYWORD){
-return undefined;
-}
-val=val.toString().toLowerCase();
-var i;
-for(i=0;i<valid_keywords.length;i++){
-if(valid_keywords[i].toLowerCase()===val){
-return valid_keywords[i];
-}
-}
-return undefined;
-};
-
-
-var dashedToCamelCase=function(dashed){
-var i;
-var camel='';
-var nextCap=false;
-for(i=0;i<dashed.length;i++){
-if(dashed[i]!=='-'){
-camel+=nextCap?dashed[i].toUpperCase():dashed[i];
-nextCap=false;
-}else{
-nextCap=true;
-}
-}
-return camel;
-};
-exports.dashedToCamelCase=dashedToCamelCase;
-
-var is_space=/\s/;
-var opening_deliminators=['"',"'",'('];
-var closing_deliminators=['"',"'",')'];
-
-var getParts=function(str){
-var deliminator_stack=[];
-var length=str.length;
-var i;
-var parts=[];
-var current_part='';
-var opening_index;
-var closing_index;
-for(i=0;i<length;i++){
-opening_index=opening_deliminators.indexOf(str[i]);
-closing_index=closing_deliminators.indexOf(str[i]);
-if(is_space.test(str[i])){
-if(deliminator_stack.length===0){
-if(current_part!==''){
-parts.push(current_part);
-}
-current_part='';
-}else{
-current_part+=str[i];
-}
-}else{
-if(str[i]==='\\'){
-i++;
-current_part+=str[i];
-}else{
-current_part+=str[i];
-if(
-closing_index!==-1&&
-closing_index===deliminator_stack[deliminator_stack.length-1])
-{
-deliminator_stack.pop();
-}else if(opening_index!==-1){
-deliminator_stack.push(opening_index);
-}
-}
-}
-}
-if(current_part!==''){
-parts.push(current_part);
-}
-return parts;
-};
-
-
-
-
-
-
-
-exports.shorthandParser=function parse(v,shorthand_for){
-var obj={};
-var type=exports.valueType(v);
-if(type===exports.TYPES.NULL_OR_EMPTY_STR){
-Object.keys(shorthand_for).forEach(function(property){
-obj[property]='';
-});
-return obj;
-}
-
-if(typeof v==='number'){
-v=v.toString();
-}
-
-if(typeof v!=='string'){
-return undefined;
-}
-
-if(v.toLowerCase()==='inherit'){
-return{};
-}
-var parts=getParts(v);
-var valid=true;
-parts.forEach(function(part,i){
-var part_valid=false;
-Object.keys(shorthand_for).forEach(function(property){
-if(shorthand_for[property].isValid(part,i)){
-part_valid=true;
-obj[property]=part;
-}
-});
-valid=valid&&part_valid;
-});
-if(!valid){
-return undefined;
-}
-return obj;
-};
-
-exports.shorthandSetter=function(property,shorthand_for){
-return function(v){
-var obj=exports.shorthandParser(v,shorthand_for);
-if(obj===undefined){
-return;
-}
-
-Object.keys(obj).forEach(function(subprop){
-
-
-var camel=dashedToCamelCase(subprop);
-this[camel]=obj[subprop];
-
-obj[subprop]=this[camel];
-this.removeProperty(subprop);
-
-if(obj[subprop]!==''){
-this._values[subprop]=obj[subprop];
-}
-},this);
-Object.keys(shorthand_for).forEach(function(subprop){
-if(!obj.hasOwnProperty(subprop)){
-this.removeProperty(subprop);
-delete this._values[subprop];
-}
-},this);
-
-
-
-
-this.removeProperty(property);
-var calculated=exports.shorthandGetter(property,shorthand_for).call(this);
-if(calculated!==''){
-this._setProperty(property,calculated);
-}
-};
-};
-
-exports.shorthandGetter=function(property,shorthand_for){
-return function(){
-if(this._values[property]!==undefined){
-return this.getPropertyValue(property);
-}
-return Object.keys(shorthand_for).
-map(function(subprop){
-return this.getPropertyValue(subprop);
-},this).
-filter(function(value){
-return value!=='';
-}).
-join(' ');
-};
-};
-
-
-
-
-
-
-exports.implicitSetter=function(property_before,property_after,isValid,parser){
-property_after=property_after||'';
-if(property_after!==''){
-property_after='-'+property_after;
-}
-var part_names=['top','right','bottom','left'];
-
-return function(v){
-if(typeof v==='number'){
-v=v.toString();
-}
-if(typeof v!=='string'){
-return undefined;
-}
-var parts;
-if(v.toLowerCase()==='inherit'||v===''){
-parts=[v];
-}else{
-parts=getParts(v);
-}
-if(parts.length<1||parts.length>4){
-return undefined;
-}
-
-if(!parts.every(isValid)){
-return undefined;
-}
-
-parts=parts.map(function(part){
-return parser(part);
-});
-this._setProperty(property_before+property_after,parts.join(' '));
-if(parts.length===1){
-parts[1]=parts[0];
-}
-if(parts.length===2){
-parts[2]=parts[0];
-}
-if(parts.length===3){
-parts[3]=parts[1];
-}
-
-for(var i=0;i<4;i++){
-var property=property_before+'-'+part_names[i]+property_after;
-this.removeProperty(property);
-if(parts[i]!==''){
-this._values[property]=parts[i];
-}
-}
-return v;
-};
-};
-
-
-
-
-
-
-
-exports.subImplicitSetter=function(prefix,part,isValid,parser){
-var property=prefix+'-'+part;
-var subparts=[prefix+'-top',prefix+'-right',prefix+'-bottom',prefix+'-left'];
-
-return function(v){
-if(typeof v==='number'){
-v=v.toString();
-}
-if(typeof v!=='string'){
-return undefined;
-}
-if(!isValid(v)){
-return undefined;
-}
-v=parser(v);
-this._setProperty(property,v);
-var parts=[];
-for(var i=0;i<4;i++){
-if(this._values[subparts[i]]==null||this._values[subparts[i]]===''){
-break;
-}
-parts.push(this._values[subparts[i]]);
-}
-if(parts.length===4){
-for(i=0;i<4;i++){
-this.removeProperty(subparts[i]);
-this._values[subparts[i]]=parts[i];
-}
-this._setProperty(prefix,parts.join(' '));
-}
-return v;
-};
-};
-
-var camel_to_dashed=/[A-Z]/g;
-var first_segment=/^\([^-]\)-/;
-var vendor_prefixes=['o','moz','ms','webkit'];
-exports.camelToDashed=function(camel_case){
-var match;
-var dashed=camel_case.replace(camel_to_dashed,'-$&').toLowerCase();
-match=dashed.match(first_segment);
-if(match&&vendor_prefixes.indexOf(match[1])!==-1){
-dashed='-'+dashed;
-}
-return dashed;
-};
-
-},{"./named_colors.json":104}],106:[function(require,module,exports){
-(function(process){
-
-
-
-
-
-
-exports=module.exports=require('./debug');
-exports.log=log;
-exports.formatArgs=formatArgs;
-exports.save=save;
-exports.load=load;
-exports.useColors=useColors;
-exports.storage='undefined'!=typeof chrome&&
-'undefined'!=typeof chrome.storage?
-chrome.storage.local:
-localstorage();
-
-
-
-
-
-exports.colors=[
-'lightseagreen',
-'forestgreen',
-'goldenrod',
-'dodgerblue',
-'darkorchid',
-'crimson'];
-
-
-
-
-
-
-
-
-
-
-function useColors(){
-
-
-
-if(typeof window!=='undefined'&&window.process&&window.process.type==='renderer'){
-return true;
-}
-
-
-
-return typeof document!=='undefined'&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||
-
-typeof window!=='undefined'&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||
-
-
-typeof navigator!=='undefined'&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||
-
-typeof navigator!=='undefined'&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/);
-}
-
-
-
-
-
-exports.formatters.j=function(v){
-try{
-return JSON.stringify(v);
-}catch(err){
-return'[UnexpectedJSONParseError]: '+err.message;
-}
-};
-
-
-
-
-
-
-
-
-function formatArgs(args){
-var useColors=this.useColors;
-
-args[0]=(useColors?'%c':'')+
-this.namespace+(
-useColors?' %c':' ')+
-args[0]+(
-useColors?'%c ':' ')+
-'+'+exports.humanize(this.diff);
-
-if(!useColors)return;
-
-var c='color: '+this.color;
-args.splice(1,0,c,'color: inherit');
-
-
-
-
-var index=0;
-var lastC=0;
-args[0].replace(/%[a-zA-Z%]/g,function(match){
-if('%%'===match)return;
-index++;
-if('%c'===match){
-
-
-lastC=index;
-}
-});
-
-args.splice(lastC,0,c);
-}
-
-
-
-
-
-
-
-
-function log(){
-
-
-return'object'===typeof console&&
-console.log&&
-Function.prototype.apply.call(console.log,console,arguments);
-}
-
-
-
-
-
-
-
-
-function save(namespaces){
-try{
-if(null==namespaces){
-exports.storage.removeItem('debug');
-}else{
-exports.storage.debug=namespaces;
-}
-}catch(e){}
-}
-
-
-
-
-
-
-
-
-function load(){
-var r;
-try{
-r=exports.storage.debug;
-}catch(e){}
-
-
-if(!r&&typeof process!=='undefined'&&'env'in process){
-r=process.env.DEBUG;
-}
-
-return r;
-}
-
-
-
-
-
-exports.enable(load());
-
-
-
-
-
-
-
-
-
-
-
-
-function localstorage(){
-try{
-return window.localStorage;
-}catch(e){}
-}
-
-}).call(this,require('_process'));
-},{"./debug":107,"_process":158}],107:[function(require,module,exports){
-
-
-
-
-
-
-
-
-exports=module.exports=createDebug.debug=createDebug['default']=createDebug;
-exports.coerce=coerce;
-exports.disable=disable;
-exports.enable=enable;
-exports.enabled=enabled;
-exports.humanize=require('ms');
-
-
-
-
-
-exports.names=[];
-exports.skips=[];
-
-
-
-
-
-
-
-exports.formatters={};
-
-
-
-
-
-var prevTime;
-
-
-
-
-
-
-
-
-function selectColor(namespace){
-var hash=0,i;
-
-for(i in namespace){
-hash=(hash<<5)-hash+namespace.charCodeAt(i);
-hash|=0;
-}
-
-return exports.colors[Math.abs(hash)%exports.colors.length];
-}
-
-
-
-
-
-
-
-
-
-function createDebug(namespace){
-
-function debug(){
-
-if(!debug.enabled)return;
-
-var self=debug;
-
-
-var curr=+new Date();
-var ms=curr-(prevTime||curr);
-self.diff=ms;
-self.prev=prevTime;
-self.curr=curr;
-prevTime=curr;
-
-
-var args=new Array(arguments.length);
-for(var i=0;i<args.length;i++){
-args[i]=arguments[i];
-}
-
-args[0]=exports.coerce(args[0]);
-
-if('string'!==typeof args[0]){
-
-args.unshift('%O');
-}
-
-
-var index=0;
-args[0]=args[0].replace(/%([a-zA-Z%])/g,function(match,format){
-
-if(match==='%%')return match;
-index++;
-var formatter=exports.formatters[format];
-if('function'===typeof formatter){
-var val=args[index];
-match=formatter.call(self,val);
-
-
-args.splice(index,1);
-index--;
-}
-return match;
-});
-
-
-exports.formatArgs.call(self,args);
-
-var logFn=debug.log||exports.log||console.log.bind(console);
-logFn.apply(self,args);
-}
-
-debug.namespace=namespace;
-debug.enabled=exports.enabled(namespace);
-debug.useColors=exports.useColors();
-debug.color=selectColor(namespace);
-
-
-if('function'===typeof exports.init){
-exports.init(debug);
-}
-
-return debug;
-}
-
-
-
-
-
-
-
-
-
-function enable(namespaces){
-exports.save(namespaces);
-
-exports.names=[];
-exports.skips=[];
-
-var split=(typeof namespaces==='string'?namespaces:'').split(/[\s,]+/);
-var len=split.length;
-
-for(var i=0;i<len;i++){
-if(!split[i])continue;
-namespaces=split[i].replace(/\*/g,'.*?');
-if(namespaces[0]==='-'){
-exports.skips.push(new RegExp('^'+namespaces.substr(1)+'$'));
-}else{
-exports.names.push(new RegExp('^'+namespaces+'$'));
-}
-}
-}
-
-
-
-
-
-
-
-function disable(){
-exports.enable('');
-}
-
-
-
-
-
-
-
-
-
-function enabled(name){
-var i,len;
-for(i=0,len=exports.skips.length;i<len;i++){
-if(exports.skips[i].test(name)){
-return false;
-}
-}
-for(i=0,len=exports.names.length;i<len;i++){
-if(exports.names[i].test(name)){
-return true;
-}
-}
-return false;
-}
-
-
-
-
-
-
-
-
-
-function coerce(val){
-if(val instanceof Error)return val.stack||val.message;
-return val;
-}
-
-},{"ms":146}],108:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-var objectCreate=Object.create||objectCreatePolyfill;
-var objectKeys=Object.keys||objectKeysPolyfill;
-var bind=Function.prototype.bind||functionBindPolyfill;
-
-function EventEmitter(){
-if(!this._events||!Object.prototype.hasOwnProperty.call(this,'_events')){
-this._events=objectCreate(null);
-this._eventsCount=0;
-}
-
-this._maxListeners=this._maxListeners||undefined;
-}
-module.exports=EventEmitter;
-
-
-EventEmitter.EventEmitter=EventEmitter;
-
-EventEmitter.prototype._events=undefined;
-EventEmitter.prototype._maxListeners=undefined;
-
-
-
-var defaultMaxListeners=10;
-
-var hasDefineProperty;
-try{
-var o={};
-if(Object.defineProperty)Object.defineProperty(o,'x',{value:0});
-hasDefineProperty=o.x===0;
-}catch(err){hasDefineProperty=false;}
-if(hasDefineProperty){
-Object.defineProperty(EventEmitter,'defaultMaxListeners',{
-enumerable:true,
-get:function(){
-return defaultMaxListeners;
-},
-set:function(arg){
-
-
-if(typeof arg!=='number'||arg<0||arg!==arg)
-throw new TypeError('"defaultMaxListeners" must be a positive number');
-defaultMaxListeners=arg;
-}});
-
-}else{
-EventEmitter.defaultMaxListeners=defaultMaxListeners;
-}
-
-
-
-EventEmitter.prototype.setMaxListeners=function setMaxListeners(n){
-if(typeof n!=='number'||n<0||isNaN(n))
-throw new TypeError('"n" argument must be a positive number');
-this._maxListeners=n;
-return this;
-};
-
-function $getMaxListeners(that){
-if(that._maxListeners===undefined)
-return EventEmitter.defaultMaxListeners;
-return that._maxListeners;
-}
-
-EventEmitter.prototype.getMaxListeners=function getMaxListeners(){
-return $getMaxListeners(this);
-};
-
-
-
-
-
-
-function emitNone(handler,isFn,self){
-if(isFn)
-handler.call(self);else
-{
-var len=handler.length;
-var listeners=arrayClone(handler,len);
-for(var i=0;i<len;++i)
-listeners[i].call(self);
-}
-}
-function emitOne(handler,isFn,self,arg1){
-if(isFn)
-handler.call(self,arg1);else
-{
-var len=handler.length;
-var listeners=arrayClone(handler,len);
-for(var i=0;i<len;++i)
-listeners[i].call(self,arg1);
-}
-}
-function emitTwo(handler,isFn,self,arg1,arg2){
-if(isFn)
-handler.call(self,arg1,arg2);else
-{
-var len=handler.length;
-var listeners=arrayClone(handler,len);
-for(var i=0;i<len;++i)
-listeners[i].call(self,arg1,arg2);
-}
-}
-function emitThree(handler,isFn,self,arg1,arg2,arg3){
-if(isFn)
-handler.call(self,arg1,arg2,arg3);else
-{
-var len=handler.length;
-var listeners=arrayClone(handler,len);
-for(var i=0;i<len;++i)
-listeners[i].call(self,arg1,arg2,arg3);
-}
-}
-
-function emitMany(handler,isFn,self,args){
-if(isFn)
-handler.apply(self,args);else
-{
-var len=handler.length;
-var listeners=arrayClone(handler,len);
-for(var i=0;i<len;++i)
-listeners[i].apply(self,args);
-}
-}
-
-EventEmitter.prototype.emit=function emit(type){
-var er,handler,len,args,i,events;
-var doError=type==='error';
-
-events=this._events;
-if(events)
-doError=doError&&events.error==null;else
-if(!doError)
-return false;
-
-
-if(doError){
-if(arguments.length>1)
-er=arguments[1];
-if(er instanceof Error){
-throw er;
-}else{
-
-var err=new Error('Unhandled "error" event. ('+er+')');
-err.context=er;
-throw err;
-}
-return false;
-}
-
-handler=events[type];
-
-if(!handler)
-return false;
-
-var isFn=typeof handler==='function';
-len=arguments.length;
-switch(len){
-
-case 1:
-emitNone(handler,isFn,this);
-break;
-case 2:
-emitOne(handler,isFn,this,arguments[1]);
-break;
-case 3:
-emitTwo(handler,isFn,this,arguments[1],arguments[2]);
-break;
-case 4:
-emitThree(handler,isFn,this,arguments[1],arguments[2],arguments[3]);
-break;
-
-default:
-args=new Array(len-1);
-for(i=1;i<len;i++)
-args[i-1]=arguments[i];
-emitMany(handler,isFn,this,args);}
-
-
-return true;
-};
-
-function _addListener(target,type,listener,prepend){
-var m;
-var events;
-var existing;
-
-if(typeof listener!=='function')
-throw new TypeError('"listener" argument must be a function');
-
-events=target._events;
-if(!events){
-events=target._events=objectCreate(null);
-target._eventsCount=0;
-}else{
-
-
-if(events.newListener){
-target.emit('newListener',type,
-listener.listener?listener.listener:listener);
-
-
-
-events=target._events;
-}
-existing=events[type];
-}
-
-if(!existing){
-
-existing=events[type]=listener;
-++target._eventsCount;
-}else{
-if(typeof existing==='function'){
-
-existing=events[type]=
-prepend?[listener,existing]:[existing,listener];
-}else{
-
-if(prepend){
-existing.unshift(listener);
-}else{
-existing.push(listener);
-}
-}
-
-
-if(!existing.warned){
-m=$getMaxListeners(target);
-if(m&&m>0&&existing.length>m){
-existing.warned=true;
-var w=new Error('Possible EventEmitter memory leak detected. '+
-existing.length+' "'+String(type)+'" listeners '+
-'added. Use emitter.setMaxListeners() to '+
-'increase limit.');
-w.name='MaxListenersExceededWarning';
-w.emitter=target;
-w.type=type;
-w.count=existing.length;
-if(typeof console==='object'&&console.warn){
-console.warn('%s: %s',w.name,w.message);
-}
-}
-}
-}
-
-return target;
-}
-
-EventEmitter.prototype.addListener=function addListener(type,listener){
-return _addListener(this,type,listener,false);
-};
-
-EventEmitter.prototype.on=EventEmitter.prototype.addListener;
-
-EventEmitter.prototype.prependListener=
-function prependListener(type,listener){
-return _addListener(this,type,listener,true);
-};
-
-function onceWrapper(){
-if(!this.fired){
-this.target.removeListener(this.type,this.wrapFn);
-this.fired=true;
-switch(arguments.length){
-case 0:
-return this.listener.call(this.target);
-case 1:
-return this.listener.call(this.target,arguments[0]);
-case 2:
-return this.listener.call(this.target,arguments[0],arguments[1]);
-case 3:
-return this.listener.call(this.target,arguments[0],arguments[1],
-arguments[2]);
-default:
-var args=new Array(arguments.length);
-for(var i=0;i<args.length;++i)
-args[i]=arguments[i];
-this.listener.apply(this.target,args);}
-
-}
-}
-
-function _onceWrap(target,type,listener){
-var state={fired:false,wrapFn:undefined,target:target,type:type,listener:listener};
-var wrapped=bind.call(onceWrapper,state);
-wrapped.listener=listener;
-state.wrapFn=wrapped;
-return wrapped;
-}
-
-EventEmitter.prototype.once=function once(type,listener){
-if(typeof listener!=='function')
-throw new TypeError('"listener" argument must be a function');
-this.on(type,_onceWrap(this,type,listener));
-return this;
-};
-
-EventEmitter.prototype.prependOnceListener=
-function prependOnceListener(type,listener){
-if(typeof listener!=='function')
-throw new TypeError('"listener" argument must be a function');
-this.prependListener(type,_onceWrap(this,type,listener));
-return this;
-};
-
-
-EventEmitter.prototype.removeListener=
-function removeListener(type,listener){
-var list,events,position,i,originalListener;
-
-if(typeof listener!=='function')
-throw new TypeError('"listener" argument must be a function');
-
-events=this._events;
-if(!events)
-return this;
-
-list=events[type];
-if(!list)
-return this;
-
-if(list===listener||list.listener===listener){
-if(--this._eventsCount===0)
-this._events=objectCreate(null);else
-{
-delete events[type];
-if(events.removeListener)
-this.emit('removeListener',type,list.listener||listener);
-}
-}else if(typeof list!=='function'){
-position=-1;
-
-for(i=list.length-1;i>=0;i--){
-if(list[i]===listener||list[i].listener===listener){
-originalListener=list[i].listener;
-position=i;
-break;
-}
-}
-
-if(position<0)
-return this;
-
-if(position===0)
-list.shift();else
-
-spliceOne(list,position);
-
-if(list.length===1)
-events[type]=list[0];
-
-if(events.removeListener)
-this.emit('removeListener',type,originalListener||listener);
-}
-
-return this;
-};
-
-EventEmitter.prototype.removeAllListeners=
-function removeAllListeners(type){
-var listeners,events,i;
-
-events=this._events;
-if(!events)
-return this;
-
-
-if(!events.removeListener){
-if(arguments.length===0){
-this._events=objectCreate(null);
-this._eventsCount=0;
-}else if(events[type]){
-if(--this._eventsCount===0)
-this._events=objectCreate(null);else
-
-delete events[type];
-}
-return this;
-}
-
-
-if(arguments.length===0){
-var keys=objectKeys(events);
-var key;
-for(i=0;i<keys.length;++i){
-key=keys[i];
-if(key==='removeListener')continue;
-this.removeAllListeners(key);
-}
-this.removeAllListeners('removeListener');
-this._events=objectCreate(null);
-this._eventsCount=0;
-return this;
-}
-
-listeners=events[type];
-
-if(typeof listeners==='function'){
-this.removeListener(type,listeners);
-}else if(listeners){
-
-for(i=listeners.length-1;i>=0;i--){
-this.removeListener(type,listeners[i]);
-}
-}
-
-return this;
-};
-
-function _listeners(target,type,unwrap){
-var events=target._events;
-
-if(!events)
-return[];
-
-var evlistener=events[type];
-if(!evlistener)
-return[];
-
-if(typeof evlistener==='function')
-return unwrap?[evlistener.listener||evlistener]:[evlistener];
-
-return unwrap?unwrapListeners(evlistener):arrayClone(evlistener,evlistener.length);
-}
-
-EventEmitter.prototype.listeners=function listeners(type){
-return _listeners(this,type,true);
-};
-
-EventEmitter.prototype.rawListeners=function rawListeners(type){
-return _listeners(this,type,false);
-};
-
-EventEmitter.listenerCount=function(emitter,type){
-if(typeof emitter.listenerCount==='function'){
-return emitter.listenerCount(type);
-}else{
-return listenerCount.call(emitter,type);
-}
-};
-
-EventEmitter.prototype.listenerCount=listenerCount;
-function listenerCount(type){
-var events=this._events;
-
-if(events){
-var evlistener=events[type];
-
-if(typeof evlistener==='function'){
-return 1;
-}else if(evlistener){
-return evlistener.length;
-}
-}
-
-return 0;
-}
-
-EventEmitter.prototype.eventNames=function eventNames(){
-return this._eventsCount>0?Reflect.ownKeys(this._events):[];
-};
-
-
-function spliceOne(list,index){
-for(var i=index,k=i+1,n=list.length;k<n;i+=1,k+=1)
-list[i]=list[k];
-list.pop();
-}
-
-function arrayClone(arr,n){
-var copy=new Array(n);
-for(var i=0;i<n;++i)
-copy[i]=arr[i];
-return copy;
-}
-
-function unwrapListeners(arr){
-var ret=new Array(arr.length);
-for(var i=0;i<ret.length;++i){
-ret[i]=arr[i].listener||arr[i];
-}
-return ret;
-}
-
-function objectCreatePolyfill(proto){
-var F=function(){};
-F.prototype=proto;
-return new F();
-}
-function objectKeysPolyfill(obj){
-var keys=[];
-for(var k in obj)if(Object.prototype.hasOwnProperty.call(obj,k)){
-keys.push(k);
-}
-return k;
-}
-function functionBindPolyfill(context){
-var fn=this;
-return function(){
-return fn.apply(context,arguments);
-};
-}
-
-},{}],109:[function(require,module,exports){
-(function(Buffer){
-var querystring=require('querystring');
-var trim=require('./trim');
-
-
-
-
-
-
-function Link(value){
-
-if(!(this instanceof Link)){
-return new Link(value);
-}
-
-
-this.refs=[];
-
-}
-
-
-
-
-
-Link.pattern=/(?:\<([^\>]+)\>)((\s*;\s*([a-z\*]+)=(("[^"]+")|('[^']+')|([^\,\;]+)))*)(\s*,\s*|$)/gi;
-
-
-
-
-
-Link.attrPattern=/([a-z\*]+)=(?:(?:"([^"]+)")|(?:'([^']+)')|([^\,\;]+))/gi;
-
-
-
-
-
-
-
-Link.isCompatibleEncoding=function(value){
-return /^utf-?8|ascii|utf-?16-?le|ucs-?2|base-?64|latin-?1$/i.test(value);
-};
-
-
-
-
-
-
-
-Link.formatExtendedAttribute=function(attr,data){
-
-var encoding=(data.encoding||'utf-8').toUpperCase();
-var language=data.language||'en';
-
-var encodedValue='';
-
-if(Buffer.isBuffer(data.value)&&Link.isCompatibleEncoding(encoding)){
-encodedValue=data.value.toString(encoding);
-}else if(Buffer.isBuffer(data.value)){
-encodedValue=data.value.toString('hex').
-replace(/[0-9a-f]{2}/gi,'%$1');
-}else{
-encodedValue=querystring.escape(data.value);
-}
-
-return attr+'='+encoding+'\''+
-language+'\''+encodedValue;
-
-};
-
-
-
-
-
-
-
-Link.formatAttribute=function(attr,value){
-
-
-if(/\*$/.test(attr)||typeof value!=='string')
-return Link.formatExtendedAttribute(attr,value);
-
-
-
-var needsQuotes=/[^a-z]/i.test(value);
-
-if(needsQuotes){
-
-value=querystring.escape(value).
-replace(/%20/g,' ').
-replace(/%2C/g,',').
-replace(/%3B/g,';');
-
-value='"'+value+'"';
-}
-
-return attr+'='+value;
-
-};
-
-
-
-
-
-
-
-Link.parseExtendedValue=function(value){
-var parts=/([^']+)?(?:'([^']+)')?(.+)/.exec(value);
-return{
-language:parts[2].toLowerCase(),
-encoding:Link.isCompatibleEncoding(parts[1])?
-null:parts[1].toLowerCase(),
-value:Link.isCompatibleEncoding(parts[1])?
-querystring.unescape(parts[3]):parts[3]};
-
-};
-
-
-
-
-
-
-
-Link.setAttr=function(link,attr,value){
-
-
-
-if(attr==='rel'&&link[attr]!=null)
-return link;
-
-if(Array.isArray(link[attr])){
-link[attr].push(value);
-}else if(link[attr]!=null){
-link[attr]=[link[attr],value];
-}else{
-link[attr]=value;
-}
-
-return link;
-
-};
-
-
-
-
-Link.parseParams=function(link,uri){
-
-var kvs={};
-var params=/(.+)\?(.+)/gi.exec(uri);
-
-if(!params){
-return link;
-}
-
-params=params[2].split('&');
-
-for(var i=0;i<params.length;i++){
-var param=params[i].split('=');
-kvs[param[0]]=param[1];
-}
-
-Link.setAttr(link,'params',kvs);
-
-return link;
-
-};
-
-
-
-
-
-
-
-
-Link.parseAttrs=function(link,parts){
-
-var match=null;
-var attr='';
-var value='';
-var attrs='';
-
-var uriAttrs=/<(.*)>;\s*(.*)/gi.exec(parts);
-if(uriAttrs){
-attrs=uriAttrs[2];
-link=Link.parseParams(link,uriAttrs[1]);
-}
-
-while(match=Link.attrPattern.exec(attrs)){
-attr=match[1].toLowerCase();
-value=match[4]||match[3]||match[2];
-if(/\*$/.test(attr)){
-Link.setAttr(link,attr,Link.parseExtendedValue(value));
-}else if(/%/.test(value)){
-Link.setAttr(link,attr,querystring.unescape(value));
-}else{
-Link.setAttr(link,attr,value);
-}
-}
-
-return link;
-
-};
-
-Link.parse=function(value){
-return new Link().parse(value);
-};
-
-
-
-
-
-Link.prototype={
-
-constructor:Link,
-
-
-
-
-
-
-rel:function(value){
-
-var links=[];
-
-for(var i=0;i<this.refs.length;i++){
-if(this.refs[i].rel===value){
-links.push(this.refs[i]);
-}
-}
-
-return links;
-
-},
-
-
-
-
-
-
-
-get:function(attr,value){
-
-attr=attr.toLowerCase();
-
-var links=[];
-
-for(var i=0;i<this.refs.length;i++){
-if(this.refs[i][attr]===value){
-links.push(this.refs[i]);
-}
-}
-
-return links;
-
-},
-
-set:function(link){
-this.refs.push(link);
-return this;
-},
-
-has:function(attr,value){
-return this.get(attr,value)!=null;
-},
-
-parse:function(value){
-
-
-value=trim(value).
-replace(/\r?\n[\x20\x09]+/g,'');
-
-var match=null;
-
-while(match=Link.pattern.exec(value)){
-var link=Link.parseAttrs({uri:match[1]},match[0]);
-this.refs.push(link);
-}
-
-return this;
-
-},
-
-toString:function(){
-
-var refs=[];
-var link='';
-var ref=null;
-
-for(var i=0;i<this.refs.length;i++){
-ref=this.refs[i];
-link=Object.keys(this.refs[i]).reduce(function(link,attr){
-if(attr==='uri')return link;
-return link+'; '+Link.formatAttribute(attr,ref[attr]);
-},'<'+ref.uri+'>');
-refs.push(link);
-}
-
-return refs.join(', ');
-
-}};
-
-
-
-
-module.exports=Link;
-
-}).call(this,{"isBuffer":require("../../is-buffer/index.js")});
-},{"../../is-buffer/index.js":120,"./trim":110,"querystring":161}],110:[function(require,module,exports){
-module.exports=function trim(value){
-return value.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,'');
-};
-
-},{}],111:[function(require,module,exports){
-exports.read=function(buffer,offset,isLE,mLen,nBytes){
-var e,m;
-var eLen=nBytes*8-mLen-1;
-var eMax=(1<<eLen)-1;
-var eBias=eMax>>1;
-var nBits=-7;
-var i=isLE?nBytes-1:0;
-var d=isLE?-1:1;
-var s=buffer[offset+i];
-
-i+=d;
-
-e=s&(1<<-nBits)-1;
-s>>=-nBits;
-nBits+=eLen;
-for(;nBits>0;e=e*256+buffer[offset+i],i+=d,nBits-=8){}
-
-m=e&(1<<-nBits)-1;
-e>>=-nBits;
-nBits+=mLen;
-for(;nBits>0;m=m*256+buffer[offset+i],i+=d,nBits-=8){}
-
-if(e===0){
-e=1-eBias;
-}else if(e===eMax){
-return m?NaN:(s?-1:1)*Infinity;
-}else{
-m=m+Math.pow(2,mLen);
-e=e-eBias;
-}
-return(s?-1:1)*m*Math.pow(2,e-mLen);
-};
-
-exports.write=function(buffer,value,offset,isLE,mLen,nBytes){
-var e,m,c;
-var eLen=nBytes*8-mLen-1;
-var eMax=(1<<eLen)-1;
-var eBias=eMax>>1;
-var rt=mLen===23?Math.pow(2,-24)-Math.pow(2,-77):0;
-var i=isLE?0:nBytes-1;
-var d=isLE?1:-1;
-var s=value<0||value===0&&1/value<0?1:0;
-
-value=Math.abs(value);
-
-if(isNaN(value)||value===Infinity){
-m=isNaN(value)?1:0;
-e=eMax;
-}else{
-e=Math.floor(Math.log(value)/Math.LN2);
-if(value*(c=Math.pow(2,-e))<1){
-e--;
-c*=2;
-}
-if(e+eBias>=1){
-value+=rt/c;
-}else{
-value+=rt*Math.pow(2,1-eBias);
-}
-if(value*c>=2){
-e++;
-c/=2;
-}
-
-if(e+eBias>=eMax){
-m=0;
-e=eMax;
-}else if(e+eBias>=1){
-m=(value*c-1)*Math.pow(2,mLen);
-e=e+eBias;
-}else{
-m=value*Math.pow(2,eBias-1)*Math.pow(2,mLen);
-e=0;
-}
-}
-
-for(;mLen>=8;buffer[offset+i]=m&0xff,i+=d,m/=256,mLen-=8){}
-
-e=e<<mLen|m;
-eLen+=mLen;
-for(;eLen>0;buffer[offset+i]=e&0xff,i+=d,e/=256,eLen-=8){}
-
-buffer[offset+i-d]|=s*128;
-};
-
-},{}],112:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-var ImageSSIM;
-(function(ImageSSIM){
-'use strict';
-
-
-
-(function(Channels){
-Channels[Channels["Grey"]=1]="Grey";
-Channels[Channels["GreyAlpha"]=2]="GreyAlpha";
-Channels[Channels["RGB"]=3]="RGB";
-Channels[Channels["RGBAlpha"]=4]="RGBAlpha";
-})(ImageSSIM.Channels||(ImageSSIM.Channels={}));
-var Channels=ImageSSIM.Channels;
-
-
-
-
-function compare(image1,image2,windowSize,K1,K2,luminance,bitsPerComponent){
-if(windowSize===void 0){windowSize=8;}
-if(K1===void 0){K1=0.01;}
-if(K2===void 0){K2=0.03;}
-if(luminance===void 0){luminance=true;}
-if(bitsPerComponent===void 0){bitsPerComponent=8;}
-if(image1.width!==image2.width||image1.height!==image2.height){
-throw new Error('Images have different sizes!');
-}
-
-var L=(1<<bitsPerComponent)-1;
-
-var c1=Math.pow(K1*L,2),c2=Math.pow(K2*L,2),numWindows=0,mssim=0.0;
-var mcs=0.0;
-function iteration(lumaValues1,lumaValues2,averageLumaValue1,averageLumaValue2){
-
-var sigxy,sigsqx,sigsqy;
-sigxy=sigsqx=sigsqy=0.0;
-for(var i=0;i<lumaValues1.length;i++){
-sigsqx+=Math.pow(lumaValues1[i]-averageLumaValue1,2);
-sigsqy+=Math.pow(lumaValues2[i]-averageLumaValue2,2);
-sigxy+=(lumaValues1[i]-averageLumaValue1)*(lumaValues2[i]-averageLumaValue2);
-}
-var numPixelsInWin=lumaValues1.length-1;
-sigsqx/=numPixelsInWin;
-sigsqy/=numPixelsInWin;
-sigxy/=numPixelsInWin;
-
-var numerator=(2*averageLumaValue1*averageLumaValue2+c1)*(2*sigxy+c2);
-var denominator=(Math.pow(averageLumaValue1,2)+Math.pow(averageLumaValue2,2)+c1)*(sigsqx+sigsqy+c2);
-mssim+=numerator/denominator;
-mcs+=(2*sigxy+c2)/(sigsqx+sigsqy+c2);
-numWindows++;
-}
-
-Internals._iterate(image1,image2,windowSize,luminance,iteration);
-return{ssim:mssim/numWindows,mcs:mcs/numWindows};
-}
-ImageSSIM.compare=compare;
-
-
-
-var Internals;
-(function(Internals){
-function _iterate(image1,image2,windowSize,luminance,callback){
-var width=image1.width,height=image1.height;
-for(var y=0;y<height;y+=windowSize){
-for(var x=0;x<width;x+=windowSize){
-
-var windowWidth=Math.min(windowSize,width-x),windowHeight=Math.min(windowSize,height-y);
-var lumaValues1=_lumaValuesForWindow(image1,x,y,windowWidth,windowHeight,luminance),lumaValues2=_lumaValuesForWindow(image2,x,y,windowWidth,windowHeight,luminance),averageLuma1=_averageLuma(lumaValues1),averageLuma2=_averageLuma(lumaValues2);
-callback(lumaValues1,lumaValues2,averageLuma1,averageLuma2);
-}
-}
-}
-Internals._iterate=_iterate;
-function _lumaValuesForWindow(image,x,y,width,height,luminance){
-var array=image.data,lumaValues=new Float32Array(new ArrayBuffer(width*height*4)),counter=0;
-var maxj=y+height;
-for(var j=y;j<maxj;j++){
-var offset=j*image.width;
-var i=(offset+x)*image.channels;
-var maxi=(offset+x+width)*image.channels;
-switch(image.channels){
-case 1:
-while(i<maxi){
-
-lumaValues[counter++]=array[i++];
-}
-break;
-case 2:
-while(i<maxi){
-lumaValues[counter++]=array[i++]*(array[i++]/255);
-}
-break;
-case 3:
-if(luminance){
-while(i<maxi){
-lumaValues[counter++]=array[i++]*0.212655+array[i++]*0.715158+array[i++]*0.072187;
-}
-}else
-{
-while(i<maxi){
-lumaValues[counter++]=array[i++]+array[i++]+array[i++];
-}
-}
-break;
-case 4:
-if(luminance){
-while(i<maxi){
-lumaValues[counter++]=(array[i++]*0.212655+array[i++]*0.715158+array[i++]*0.072187)*(array[i++]/255);
-}
-}else
-{
-while(i<maxi){
-lumaValues[counter++]=(array[i++]+array[i++]+array[i++])*(array[i++]/255);
-}
-}
-break;}
-
-}
-return lumaValues;
-}
-function _averageLuma(lumaValues){
-var sumLuma=0.0;
-for(var i=0;i<lumaValues.length;i++){
-sumLuma+=lumaValues[i];
-}
-return sumLuma/lumaValues.length;
-}
-})(Internals||(Internals={}));
-})(ImageSSIM||(ImageSSIM={}));
-module.exports=ImageSSIM;
-
-},{}],113:[function(require,module,exports){
-arguments[4][93][0].apply(exports,arguments);
-},{"dup":93}],114:[function(require,module,exports){
-'use strict';
-
-var parser=require('./lib/parser');
-
-module.exports=parser;
-module.exports['default']=parser;
-
-},{"./lib/parser":115}],115:[function(require,module,exports){
-
-
-
-
-
-
-"use strict";
-
-function peg$subclass(child,parent){
-function ctor(){this.constructor=child;}
-ctor.prototype=parent.prototype;
-child.prototype=new ctor();
-}
-
-function peg$SyntaxError(message,expected,found,location){
-this.message=message;
-this.expected=expected;
-this.found=found;
-this.location=location;
-this.name="SyntaxError";
-
-if(typeof Error.captureStackTrace==="function"){
-Error.captureStackTrace(this,peg$SyntaxError);
-}
-}
-
-peg$subclass(peg$SyntaxError,Error);
-
-peg$SyntaxError.buildMessage=function(expected,found){
-var DESCRIBE_EXPECTATION_FNS={
-literal:function(expectation){
-return"\""+literalEscape(expectation.text)+"\"";
-},
-
-"class":function(expectation){
-var escapedParts="",
-i;
-
-for(i=0;i<expectation.parts.length;i++){
-escapedParts+=expectation.parts[i]instanceof Array?
-classEscape(expectation.parts[i][0])+"-"+classEscape(expectation.parts[i][1]):
-classEscape(expectation.parts[i]);
-}
-
-return"["+(expectation.inverted?"^":"")+escapedParts+"]";
-},
-
-any:function(expectation){
-return"any character";
-},
-
-end:function(expectation){
-return"end of input";
-},
-
-other:function(expectation){
-return expectation.description;
-}};
-
-
-function hex(ch){
-return ch.charCodeAt(0).toString(16).toUpperCase();
-}
-
-function literalEscape(s){
-return s.
-replace(/\\/g,'\\\\').
-replace(/"/g,'\\"').
-replace(/\0/g,'\\0').
-replace(/\t/g,'\\t').
-replace(/\n/g,'\\n').
-replace(/\r/g,'\\r').
-replace(/[\x00-\x0F]/g,function(ch){return'\\x0'+hex(ch);}).
-replace(/[\x10-\x1F\x7F-\x9F]/g,function(ch){return'\\x'+hex(ch);});
-}
-
-function classEscape(s){
-return s.
-replace(/\\/g,'\\\\').
-replace(/\]/g,'\\]').
-replace(/\^/g,'\\^').
-replace(/-/g,'\\-').
-replace(/\0/g,'\\0').
-replace(/\t/g,'\\t').
-replace(/\n/g,'\\n').
-replace(/\r/g,'\\r').
-replace(/[\x00-\x0F]/g,function(ch){return'\\x0'+hex(ch);}).
-replace(/[\x10-\x1F\x7F-\x9F]/g,function(ch){return'\\x'+hex(ch);});
-}
-
-function describeExpectation(expectation){
-return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);
-}
-
-function describeExpected(expected){
-var descriptions=new Array(expected.length),
-i,j;
-
-for(i=0;i<expected.length;i++){
-descriptions[i]=describeExpectation(expected[i]);
-}
-
-descriptions.sort();
-
-if(descriptions.length>0){
-for(i=1,j=1;i<descriptions.length;i++){
-if(descriptions[i-1]!==descriptions[i]){
-descriptions[j]=descriptions[i];
-j++;
-}
-}
-descriptions.length=j;
-}
-
-switch(descriptions.length){
-case 1:
-return descriptions[0];
-
-case 2:
-return descriptions[0]+" or "+descriptions[1];
-
-default:
-return descriptions.slice(0,-1).join(", ")+
-", or "+
-descriptions[descriptions.length-1];}
-
-}
-
-function describeFound(found){
-return found?"\""+literalEscape(found)+"\"":"end of input";
-}
-
-return"Expected "+describeExpected(expected)+" but "+describeFound(found)+" found.";
-};
-
-function peg$parse(input,options){
-options=options!==void 0?options:{};
-
-var peg$FAILED={},
-
-peg$startRuleFunctions={start:peg$parsestart},
-peg$startRuleFunction=peg$parsestart,
-
-peg$c0=function(elements){
-return{
-type:'messageFormatPattern',
-elements:elements,
-location:location()};
-
-},
-peg$c1=function(chunks){
-return chunks.reduce(function(all,chunk){
-return all.concat(chunk);
-},[]).join('');
-},
-peg$c2=function(messageText){
-return{
-type:'messageTextElement',
-value:messageText,
-location:location()};
-
-},
-peg$c3=function(chars){return chars.join('');},
-peg$c4="{",
-peg$c5=peg$literalExpectation("{",false),
-peg$c6=",",
-peg$c7=peg$literalExpectation(",",false),
-peg$c8="}",
-peg$c9=peg$literalExpectation("}",false),
-peg$c10=function(id,format){
-return{
-type:'argumentElement',
-id:id,
-format:format&&format[2],
-location:location()};
-
-},
-peg$c11="number",
-peg$c12=peg$literalExpectation("number",false),
-peg$c13="date",
-peg$c14=peg$literalExpectation("date",false),
-peg$c15="time",
-peg$c16=peg$literalExpectation("time",false),
-peg$c17=function(type,style){
-return{
-type:type+'Format',
-style:style&&style[2],
-location:location()};
-
-},
-peg$c18="plural",
-peg$c19=peg$literalExpectation("plural",false),
-peg$c20=function(pluralStyle){
-return{
-type:pluralStyle.type,
-ordinal:false,
-offset:pluralStyle.offset||0,
-options:pluralStyle.options,
-location:location()};
-
-},
-peg$c21="selectordinal",
-peg$c22=peg$literalExpectation("selectordinal",false),
-peg$c23=function(pluralStyle){
-return{
-type:pluralStyle.type,
-ordinal:true,
-offset:pluralStyle.offset||0,
-options:pluralStyle.options,
-location:location()};
-
-},
-peg$c24="select",
-peg$c25=peg$literalExpectation("select",false),
-peg$c26=function(options){
-return{
-type:'selectFormat',
-options:options,
-location:location()};
-
-},
-peg$c27="=",
-peg$c28=peg$literalExpectation("=",false),
-peg$c29=function(selector,pattern){
-return{
-type:'optionalFormatPattern',
-selector:selector,
-value:pattern,
-location:location()};
-
-},
-peg$c30="offset:",
-peg$c31=peg$literalExpectation("offset:",false),
-peg$c32=function(number){
-return number;
-},
-peg$c33=function(offset,options){
-return{
-type:'pluralFormat',
-offset:offset,
-options:options,
-location:location()};
-
-},
-peg$c34=peg$otherExpectation("whitespace"),
-peg$c35=/^[ \t\n\r]/,
-peg$c36=peg$classExpectation([" ","\t","\n","\r"],false,false),
-peg$c37=peg$otherExpectation("optionalWhitespace"),
-peg$c38=/^[0-9]/,
-peg$c39=peg$classExpectation([["0","9"]],false,false),
-peg$c40=/^[0-9a-f]/i,
-peg$c41=peg$classExpectation([["0","9"],["a","f"]],false,true),
-peg$c42="0",
-peg$c43=peg$literalExpectation("0",false),
-peg$c44=/^[1-9]/,
-peg$c45=peg$classExpectation([["1","9"]],false,false),
-peg$c46=function(digits){
-return parseInt(digits,10);
-},
-peg$c47="'",
-peg$c48=peg$literalExpectation("'",false),
-peg$c49=/^[ \t\n\r,.+={}#]/,
-peg$c50=peg$classExpectation([" ","\t","\n","\r",",",".","+","=","{","}","#"],false,false),
-peg$c51=peg$anyExpectation(),
-peg$c52=function(char){return char;},
-peg$c53=function(sequence){return sequence;},
-peg$c54=/^[^{}\\\0-\x1F\x7F \t\n\r]/,
-peg$c55=peg$classExpectation(["{","}","\\",["\0","\x1F"],"\x7F"," ","\t","\n","\r"],true,false),
-peg$c56="\\\\",
-peg$c57=peg$literalExpectation("\\\\",false),
-peg$c58=function(){return'\\';},
-peg$c59="\\#",
-peg$c60=peg$literalExpectation("\\#",false),
-peg$c61=function(){return'\\#';},
-peg$c62="\\{",
-peg$c63=peg$literalExpectation("\\{",false),
-peg$c64=function(){return'\u007B';},
-peg$c65="\\}",
-peg$c66=peg$literalExpectation("\\}",false),
-peg$c67=function(){return'\u007D';},
-peg$c68="\\u",
-peg$c69=peg$literalExpectation("\\u",false),
-peg$c70=function(digits){
-return String.fromCharCode(parseInt(digits,16));
-},
-
-peg$currPos=0,
-peg$savedPos=0,
-peg$posDetailsCache=[{line:1,column:1}],
-peg$maxFailPos=0,
-peg$maxFailExpected=[],
-peg$silentFails=0,
-
-peg$result;
-
-if("startRule"in options){
-if(!(options.startRule in peg$startRuleFunctions)){
-throw new Error("Can't start parsing from rule \""+options.startRule+"\".");
-}
-
-peg$startRuleFunction=peg$startRuleFunctions[options.startRule];
-}
-
-function text(){
-return input.substring(peg$savedPos,peg$currPos);
-}
-
-function location(){
-return peg$computeLocation(peg$savedPos,peg$currPos);
-}
-
-function expected(description,location){
-location=location!==void 0?location:peg$computeLocation(peg$savedPos,peg$currPos);
-
-throw peg$buildStructuredError(
-[peg$otherExpectation(description)],
-input.substring(peg$savedPos,peg$currPos),
-location);
-
-}
-
-function error(message,location){
-location=location!==void 0?location:peg$computeLocation(peg$savedPos,peg$currPos);
-
-throw peg$buildSimpleError(message,location);
-}
-
-function peg$literalExpectation(text,ignoreCase){
-return{type:"literal",text:text,ignoreCase:ignoreCase};
-}
-
-function peg$classExpectation(parts,inverted,ignoreCase){
-return{type:"class",parts:parts,inverted:inverted,ignoreCase:ignoreCase};
-}
-
-function peg$anyExpectation(){
-return{type:"any"};
-}
-
-function peg$endExpectation(){
-return{type:"end"};
-}
-
-function peg$otherExpectation(description){
-return{type:"other",description:description};
-}
-
-function peg$computePosDetails(pos){
-var details=peg$posDetailsCache[pos],p;
-
-if(details){
-return details;
-}else{
-p=pos-1;
-while(!peg$posDetailsCache[p]){
-p--;
-}
-
-details=peg$posDetailsCache[p];
-details={
-line:details.line,
-column:details.column};
-
-
-while(p<pos){
-if(input.charCodeAt(p)===10){
-details.line++;
-details.column=1;
-}else{
-details.column++;
-}
-
-p++;
-}
-
-peg$posDetailsCache[pos]=details;
-return details;
-}
-}
-
-function peg$computeLocation(startPos,endPos){
-var startPosDetails=peg$computePosDetails(startPos),
-endPosDetails=peg$computePosDetails(endPos);
-
-return{
-start:{
-offset:startPos,
-line:startPosDetails.line,
-column:startPosDetails.column},
-
-end:{
-offset:endPos,
-line:endPosDetails.line,
-column:endPosDetails.column}};
-
-
-}
-
-function peg$fail(expected){
-if(peg$currPos<peg$maxFailPos){return;}
-
-if(peg$currPos>peg$maxFailPos){
-peg$maxFailPos=peg$currPos;
-peg$maxFailExpected=[];
-}
-
-peg$maxFailExpected.push(expected);
-}
-
-function peg$buildSimpleError(message,location){
-return new peg$SyntaxError(message,null,null,location);
-}
-
-function peg$buildStructuredError(expected,found,location){
-return new peg$SyntaxError(
-peg$SyntaxError.buildMessage(expected,found),
-expected,
-found,
-location);
-
-}
-
-function peg$parsestart(){
-var s0;
-
-s0=peg$parsemessageFormatPattern();
-
-return s0;
-}
-
-function peg$parsemessageFormatPattern(){
-var s0,s1,s2;
-
-s0=peg$currPos;
-s1=[];
-s2=peg$parsemessageFormatElement();
-while(s2!==peg$FAILED){
-s1.push(s2);
-s2=peg$parsemessageFormatElement();
-}
-if(s1!==peg$FAILED){
-peg$savedPos=s0;
-s1=peg$c0(s1);
-}
-s0=s1;
-
-return s0;
-}
-
-function peg$parsemessageFormatElement(){
-var s0;
-
-s0=peg$parsemessageTextElement();
-if(s0===peg$FAILED){
-s0=peg$parseargumentElement();
-}
-
-return s0;
-}
-
-function peg$parsemessageText(){
-var s0,s1,s2,s3,s4,s5;
-
-s0=peg$currPos;
-s1=[];
-s2=peg$currPos;
-s3=peg$parse_();
-if(s3!==peg$FAILED){
-s4=peg$parsechars();
-if(s4!==peg$FAILED){
-s5=peg$parse_();
-if(s5!==peg$FAILED){
-s3=[s3,s4,s5];
-s2=s3;
-}else{
-peg$currPos=s2;
-s2=peg$FAILED;
-}
-}else{
-peg$currPos=s2;
-s2=peg$FAILED;
-}
-}else{
-peg$currPos=s2;
-s2=peg$FAILED;
-}
-if(s2!==peg$FAILED){
-while(s2!==peg$FAILED){
-s1.push(s2);
-s2=peg$currPos;
-s3=peg$parse_();
-if(s3!==peg$FAILED){
-s4=peg$parsechars();
-if(s4!==peg$FAILED){
-s5=peg$parse_();
-if(s5!==peg$FAILED){
-s3=[s3,s4,s5];
-s2=s3;
-}else{
-peg$currPos=s2;
-s2=peg$FAILED;
-}
-}else{
-peg$currPos=s2;
-s2=peg$FAILED;
-}
-}else{
-peg$currPos=s2;
-s2=peg$FAILED;
-}
-}
-}else{
-s1=peg$FAILED;
-}
-if(s1!==peg$FAILED){
-peg$savedPos=s0;
-s1=peg$c1(s1);
-}
-s0=s1;
-if(s0===peg$FAILED){
-s0=peg$currPos;
-s1=peg$parsews();
-if(s1!==peg$FAILED){
-s0=input.substring(s0,peg$currPos);
-}else{
-s0=s1;
-}
-}
-
-return s0;
-}
-
-function peg$parsemessageTextElement(){
-var s0,s1;
-
-s0=peg$currPos;
-s1=peg$parsemessageText();
-if(s1!==peg$FAILED){
-peg$savedPos=s0;
-s1=peg$c2(s1);
-}
-s0=s1;
-
-return s0;
-}
-
-function peg$parseargument(){
-var s0,s1,s2;
-
-s0=peg$parsenumber();
-if(s0===peg$FAILED){
-s0=peg$currPos;
-s1=[];
-s2=peg$parsequoteEscapedChar();
-while(s2!==peg$FAILED){
-s1.push(s2);
-s2=peg$parsequoteEscapedChar();
-}
-if(s1!==peg$FAILED){
-peg$savedPos=s0;
-s1=peg$c3(s1);
-}
-s0=s1;
-}
-
-return s0;
-}
-
-function peg$parseargumentElement(){
-var s0,s1,s2,s3,s4,s5,s6,s7,s8;
-
-s0=peg$currPos;
-if(input.charCodeAt(peg$currPos)===123){
-s1=peg$c4;
-peg$currPos++;
-}else{
-s1=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c5);}
-}
-if(s1!==peg$FAILED){
-s2=peg$parse_();
-if(s2!==peg$FAILED){
-s3=peg$parseargument();
-if(s3!==peg$FAILED){
-s4=peg$parse_();
-if(s4!==peg$FAILED){
-s5=peg$currPos;
-if(input.charCodeAt(peg$currPos)===44){
-s6=peg$c6;
-peg$currPos++;
-}else{
-s6=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c7);}
-}
-if(s6!==peg$FAILED){
-s7=peg$parse_();
-if(s7!==peg$FAILED){
-s8=peg$parseelementFormat();
-if(s8!==peg$FAILED){
-s6=[s6,s7,s8];
-s5=s6;
-}else{
-peg$currPos=s5;
-s5=peg$FAILED;
-}
-}else{
-peg$currPos=s5;
-s5=peg$FAILED;
-}
-}else{
-peg$currPos=s5;
-s5=peg$FAILED;
-}
-if(s5===peg$FAILED){
-s5=null;
-}
-if(s5!==peg$FAILED){
-s6=peg$parse_();
-if(s6!==peg$FAILED){
-if(input.charCodeAt(peg$currPos)===125){
-s7=peg$c8;
-peg$currPos++;
-}else{
-s7=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c9);}
-}
-if(s7!==peg$FAILED){
-peg$savedPos=s0;
-s1=peg$c10(s3,s5);
-s0=s1;
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-
-return s0;
-}
-
-function peg$parseelementFormat(){
-var s0;
-
-s0=peg$parsesimpleFormat();
-if(s0===peg$FAILED){
-s0=peg$parsepluralFormat();
-if(s0===peg$FAILED){
-s0=peg$parseselectOrdinalFormat();
-if(s0===peg$FAILED){
-s0=peg$parseselectFormat();
-}
-}
-}
-
-return s0;
-}
-
-function peg$parsesimpleFormat(){
-var s0,s1,s2,s3,s4,s5,s6;
-
-s0=peg$currPos;
-if(input.substr(peg$currPos,6)===peg$c11){
-s1=peg$c11;
-peg$currPos+=6;
-}else{
-s1=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c12);}
-}
-if(s1===peg$FAILED){
-if(input.substr(peg$currPos,4)===peg$c13){
-s1=peg$c13;
-peg$currPos+=4;
-}else{
-s1=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c14);}
-}
-if(s1===peg$FAILED){
-if(input.substr(peg$currPos,4)===peg$c15){
-s1=peg$c15;
-peg$currPos+=4;
-}else{
-s1=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c16);}
-}
-}
-}
-if(s1!==peg$FAILED){
-s2=peg$parse_();
-if(s2!==peg$FAILED){
-s3=peg$currPos;
-if(input.charCodeAt(peg$currPos)===44){
-s4=peg$c6;
-peg$currPos++;
-}else{
-s4=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c7);}
-}
-if(s4!==peg$FAILED){
-s5=peg$parse_();
-if(s5!==peg$FAILED){
-s6=peg$parsechars();
-if(s6!==peg$FAILED){
-s4=[s4,s5,s6];
-s3=s4;
-}else{
-peg$currPos=s3;
-s3=peg$FAILED;
-}
-}else{
-peg$currPos=s3;
-s3=peg$FAILED;
-}
-}else{
-peg$currPos=s3;
-s3=peg$FAILED;
-}
-if(s3===peg$FAILED){
-s3=null;
-}
-if(s3!==peg$FAILED){
-peg$savedPos=s0;
-s1=peg$c17(s1,s3);
-s0=s1;
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-
-return s0;
-}
-
-function peg$parsepluralFormat(){
-var s0,s1,s2,s3,s4,s5;
-
-s0=peg$currPos;
-if(input.substr(peg$currPos,6)===peg$c18){
-s1=peg$c18;
-peg$currPos+=6;
-}else{
-s1=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c19);}
-}
-if(s1!==peg$FAILED){
-s2=peg$parse_();
-if(s2!==peg$FAILED){
-if(input.charCodeAt(peg$currPos)===44){
-s3=peg$c6;
-peg$currPos++;
-}else{
-s3=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c7);}
-}
-if(s3!==peg$FAILED){
-s4=peg$parse_();
-if(s4!==peg$FAILED){
-s5=peg$parsepluralStyle();
-if(s5!==peg$FAILED){
-peg$savedPos=s0;
-s1=peg$c20(s5);
-s0=s1;
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-
-return s0;
-}
-
-function peg$parseselectOrdinalFormat(){
-var s0,s1,s2,s3,s4,s5;
-
-s0=peg$currPos;
-if(input.substr(peg$currPos,13)===peg$c21){
-s1=peg$c21;
-peg$currPos+=13;
-}else{
-s1=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c22);}
-}
-if(s1!==peg$FAILED){
-s2=peg$parse_();
-if(s2!==peg$FAILED){
-if(input.charCodeAt(peg$currPos)===44){
-s3=peg$c6;
-peg$currPos++;
-}else{
-s3=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c7);}
-}
-if(s3!==peg$FAILED){
-s4=peg$parse_();
-if(s4!==peg$FAILED){
-s5=peg$parsepluralStyle();
-if(s5!==peg$FAILED){
-peg$savedPos=s0;
-s1=peg$c23(s5);
-s0=s1;
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-
-return s0;
-}
-
-function peg$parseselectFormat(){
-var s0,s1,s2,s3,s4,s5,s6;
-
-s0=peg$currPos;
-if(input.substr(peg$currPos,6)===peg$c24){
-s1=peg$c24;
-peg$currPos+=6;
-}else{
-s1=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c25);}
-}
-if(s1!==peg$FAILED){
-s2=peg$parse_();
-if(s2!==peg$FAILED){
-if(input.charCodeAt(peg$currPos)===44){
-s3=peg$c6;
-peg$currPos++;
-}else{
-s3=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c7);}
-}
-if(s3!==peg$FAILED){
-s4=peg$parse_();
-if(s4!==peg$FAILED){
-s5=[];
-s6=peg$parseoptionalFormatPattern();
-if(s6!==peg$FAILED){
-while(s6!==peg$FAILED){
-s5.push(s6);
-s6=peg$parseoptionalFormatPattern();
-}
-}else{
-s5=peg$FAILED;
-}
-if(s5!==peg$FAILED){
-peg$savedPos=s0;
-s1=peg$c26(s5);
-s0=s1;
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-
-return s0;
-}
-
-function peg$parseselector(){
-var s0,s1,s2,s3;
-
-s0=peg$currPos;
-s1=peg$currPos;
-if(input.charCodeAt(peg$currPos)===61){
-s2=peg$c27;
-peg$currPos++;
-}else{
-s2=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c28);}
-}
-if(s2!==peg$FAILED){
-s3=peg$parsenumber();
-if(s3!==peg$FAILED){
-s2=[s2,s3];
-s1=s2;
-}else{
-peg$currPos=s1;
-s1=peg$FAILED;
-}
-}else{
-peg$currPos=s1;
-s1=peg$FAILED;
-}
-if(s1!==peg$FAILED){
-s0=input.substring(s0,peg$currPos);
-}else{
-s0=s1;
-}
-if(s0===peg$FAILED){
-s0=peg$parsechars();
-}
-
-return s0;
-}
-
-function peg$parseoptionalFormatPattern(){
-var s0,s1,s2,s3,s4,s5,s6;
-
-s0=peg$currPos;
-s1=peg$parse_();
-if(s1!==peg$FAILED){
-s2=peg$parseselector();
-if(s2!==peg$FAILED){
-s3=peg$parse_();
-if(s3!==peg$FAILED){
-if(input.charCodeAt(peg$currPos)===123){
-s4=peg$c4;
-peg$currPos++;
-}else{
-s4=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c5);}
-}
-if(s4!==peg$FAILED){
-s5=peg$parsemessageFormatPattern();
-if(s5!==peg$FAILED){
-if(input.charCodeAt(peg$currPos)===125){
-s6=peg$c8;
-peg$currPos++;
-}else{
-s6=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c9);}
-}
-if(s6!==peg$FAILED){
-peg$savedPos=s0;
-s1=peg$c29(s2,s5);
-s0=s1;
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-
-return s0;
-}
-
-function peg$parseoffset(){
-var s0,s1,s2,s3;
-
-s0=peg$currPos;
-if(input.substr(peg$currPos,7)===peg$c30){
-s1=peg$c30;
-peg$currPos+=7;
-}else{
-s1=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c31);}
-}
-if(s1!==peg$FAILED){
-s2=peg$parse_();
-if(s2!==peg$FAILED){
-s3=peg$parsenumber();
-if(s3!==peg$FAILED){
-peg$savedPos=s0;
-s1=peg$c32(s3);
-s0=s1;
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-
-return s0;
-}
-
-function peg$parsepluralStyle(){
-var s0,s1,s2,s3,s4;
-
-s0=peg$currPos;
-s1=peg$parseoffset();
-if(s1===peg$FAILED){
-s1=null;
-}
-if(s1!==peg$FAILED){
-s2=peg$parse_();
-if(s2!==peg$FAILED){
-s3=[];
-s4=peg$parseoptionalFormatPattern();
-if(s4!==peg$FAILED){
-while(s4!==peg$FAILED){
-s3.push(s4);
-s4=peg$parseoptionalFormatPattern();
-}
-}else{
-s3=peg$FAILED;
-}
-if(s3!==peg$FAILED){
-peg$savedPos=s0;
-s1=peg$c33(s1,s3);
-s0=s1;
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-
-return s0;
-}
-
-function peg$parsews(){
-var s0,s1;
-
-peg$silentFails++;
-s0=[];
-if(peg$c35.test(input.charAt(peg$currPos))){
-s1=input.charAt(peg$currPos);
-peg$currPos++;
-}else{
-s1=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c36);}
-}
-if(s1!==peg$FAILED){
-while(s1!==peg$FAILED){
-s0.push(s1);
-if(peg$c35.test(input.charAt(peg$currPos))){
-s1=input.charAt(peg$currPos);
-peg$currPos++;
-}else{
-s1=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c36);}
-}
-}
-}else{
-s0=peg$FAILED;
-}
-peg$silentFails--;
-if(s0===peg$FAILED){
-s1=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c34);}
-}
-
-return s0;
-}
-
-function peg$parse_(){
-var s0,s1,s2;
-
-peg$silentFails++;
-s0=peg$currPos;
-s1=[];
-s2=peg$parsews();
-while(s2!==peg$FAILED){
-s1.push(s2);
-s2=peg$parsews();
-}
-if(s1!==peg$FAILED){
-s0=input.substring(s0,peg$currPos);
-}else{
-s0=s1;
-}
-peg$silentFails--;
-if(s0===peg$FAILED){
-s1=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c37);}
-}
-
-return s0;
-}
-
-function peg$parsedigit(){
-var s0;
-
-if(peg$c38.test(input.charAt(peg$currPos))){
-s0=input.charAt(peg$currPos);
-peg$currPos++;
-}else{
-s0=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c39);}
-}
-
-return s0;
-}
-
-function peg$parsehexDigit(){
-var s0;
-
-if(peg$c40.test(input.charAt(peg$currPos))){
-s0=input.charAt(peg$currPos);
-peg$currPos++;
-}else{
-s0=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c41);}
-}
-
-return s0;
-}
-
-function peg$parsenumber(){
-var s0,s1,s2,s3,s4,s5;
-
-s0=peg$currPos;
-if(input.charCodeAt(peg$currPos)===48){
-s1=peg$c42;
-peg$currPos++;
-}else{
-s1=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c43);}
-}
-if(s1===peg$FAILED){
-s1=peg$currPos;
-s2=peg$currPos;
-if(peg$c44.test(input.charAt(peg$currPos))){
-s3=input.charAt(peg$currPos);
-peg$currPos++;
-}else{
-s3=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c45);}
-}
-if(s3!==peg$FAILED){
-s4=[];
-s5=peg$parsedigit();
-while(s5!==peg$FAILED){
-s4.push(s5);
-s5=peg$parsedigit();
-}
-if(s4!==peg$FAILED){
-s3=[s3,s4];
-s2=s3;
-}else{
-peg$currPos=s2;
-s2=peg$FAILED;
-}
-}else{
-peg$currPos=s2;
-s2=peg$FAILED;
-}
-if(s2!==peg$FAILED){
-s1=input.substring(s1,peg$currPos);
-}else{
-s1=s2;
-}
-}
-if(s1!==peg$FAILED){
-peg$savedPos=s0;
-s1=peg$c46(s1);
-}
-s0=s1;
-
-return s0;
-}
-
-function peg$parsequoteEscapedChar(){
-var s0,s1,s2;
-
-s0=peg$currPos;
-s1=peg$currPos;
-peg$silentFails++;
-if(input.charCodeAt(peg$currPos)===39){
-s2=peg$c47;
-peg$currPos++;
-}else{
-s2=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c48);}
-}
-if(s2===peg$FAILED){
-if(peg$c49.test(input.charAt(peg$currPos))){
-s2=input.charAt(peg$currPos);
-peg$currPos++;
-}else{
-s2=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c50);}
-}
-}
-peg$silentFails--;
-if(s2===peg$FAILED){
-s1=void 0;
-}else{
-peg$currPos=s1;
-s1=peg$FAILED;
-}
-if(s1!==peg$FAILED){
-if(input.length>peg$currPos){
-s2=input.charAt(peg$currPos);
-peg$currPos++;
-}else{
-s2=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c51);}
-}
-if(s2!==peg$FAILED){
-peg$savedPos=s0;
-s1=peg$c52(s2);
-s0=s1;
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-if(s0===peg$FAILED){
-s0=peg$currPos;
-if(input.charCodeAt(peg$currPos)===39){
-s1=peg$c47;
-peg$currPos++;
-}else{
-s1=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c48);}
-}
-if(s1!==peg$FAILED){
-s2=peg$parseescape();
-if(s2!==peg$FAILED){
-peg$savedPos=s0;
-s1=peg$c53(s2);
-s0=s1;
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}
-
-return s0;
-}
-
-function peg$parseapostrophe(){
-var s0;
-
-if(input.charCodeAt(peg$currPos)===39){
-s0=peg$c47;
-peg$currPos++;
-}else{
-s0=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c48);}
-}
-
-return s0;
-}
-
-function peg$parseescape(){
-var s0;
-
-if(peg$c49.test(input.charAt(peg$currPos))){
-s0=input.charAt(peg$currPos);
-peg$currPos++;
-}else{
-s0=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c50);}
-}
-if(s0===peg$FAILED){
-s0=peg$parseapostrophe();
-}
-
-return s0;
-}
-
-function peg$parsechar(){
-var s0,s1,s2,s3,s4,s5,s6,s7;
-
-s0=peg$currPos;
-if(input.charCodeAt(peg$currPos)===39){
-s1=peg$c47;
-peg$currPos++;
-}else{
-s1=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c48);}
-}
-if(s1!==peg$FAILED){
-s2=peg$parseapostrophe();
-if(s2!==peg$FAILED){
-peg$savedPos=s0;
-s1=peg$c53(s2);
-s0=s1;
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-if(s0===peg$FAILED){
-if(peg$c54.test(input.charAt(peg$currPos))){
-s0=input.charAt(peg$currPos);
-peg$currPos++;
-}else{
-s0=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c55);}
-}
-if(s0===peg$FAILED){
-s0=peg$currPos;
-if(input.substr(peg$currPos,2)===peg$c56){
-s1=peg$c56;
-peg$currPos+=2;
-}else{
-s1=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c57);}
-}
-if(s1!==peg$FAILED){
-peg$savedPos=s0;
-s1=peg$c58();
-}
-s0=s1;
-if(s0===peg$FAILED){
-s0=peg$currPos;
-if(input.substr(peg$currPos,2)===peg$c59){
-s1=peg$c59;
-peg$currPos+=2;
-}else{
-s1=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c60);}
-}
-if(s1!==peg$FAILED){
-peg$savedPos=s0;
-s1=peg$c61();
-}
-s0=s1;
-if(s0===peg$FAILED){
-s0=peg$currPos;
-if(input.substr(peg$currPos,2)===peg$c62){
-s1=peg$c62;
-peg$currPos+=2;
-}else{
-s1=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c63);}
-}
-if(s1!==peg$FAILED){
-peg$savedPos=s0;
-s1=peg$c64();
-}
-s0=s1;
-if(s0===peg$FAILED){
-s0=peg$currPos;
-if(input.substr(peg$currPos,2)===peg$c65){
-s1=peg$c65;
-peg$currPos+=2;
-}else{
-s1=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c66);}
-}
-if(s1!==peg$FAILED){
-peg$savedPos=s0;
-s1=peg$c67();
-}
-s0=s1;
-if(s0===peg$FAILED){
-s0=peg$currPos;
-if(input.substr(peg$currPos,2)===peg$c68){
-s1=peg$c68;
-peg$currPos+=2;
-}else{
-s1=peg$FAILED;
-if(peg$silentFails===0){peg$fail(peg$c69);}
-}
-if(s1!==peg$FAILED){
-s2=peg$currPos;
-s3=peg$currPos;
-s4=peg$parsehexDigit();
-if(s4!==peg$FAILED){
-s5=peg$parsehexDigit();
-if(s5!==peg$FAILED){
-s6=peg$parsehexDigit();
-if(s6!==peg$FAILED){
-s7=peg$parsehexDigit();
-if(s7!==peg$FAILED){
-s4=[s4,s5,s6,s7];
-s3=s4;
-}else{
-peg$currPos=s3;
-s3=peg$FAILED;
-}
-}else{
-peg$currPos=s3;
-s3=peg$FAILED;
-}
-}else{
-peg$currPos=s3;
-s3=peg$FAILED;
-}
-}else{
-peg$currPos=s3;
-s3=peg$FAILED;
-}
-if(s3!==peg$FAILED){
-s2=input.substring(s2,peg$currPos);
-}else{
-s2=s3;
-}
-if(s2!==peg$FAILED){
-peg$savedPos=s0;
-s1=peg$c70(s2);
-s0=s1;
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}else{
-peg$currPos=s0;
-s0=peg$FAILED;
-}
-}
-}
-}
-}
-}
-}
-
-return s0;
-}
-
-function peg$parsechars(){
-var s0,s1,s2;
-
-s0=peg$currPos;
-s1=[];
-s2=peg$parsechar();
-if(s2!==peg$FAILED){
-while(s2!==peg$FAILED){
-s1.push(s2);
-s2=peg$parsechar();
-}
-}else{
-s1=peg$FAILED;
-}
-if(s1!==peg$FAILED){
-peg$savedPos=s0;
-s1=peg$c3(s1);
-}
-s0=s1;
-
-return s0;
-}
-
-peg$result=peg$startRuleFunction();
-
-if(peg$result!==peg$FAILED&&peg$currPos===input.length){
-return peg$result;
-}else{
-if(peg$result!==peg$FAILED&&peg$currPos<input.length){
-peg$fail(peg$endExpectation());
-}
-
-throw peg$buildStructuredError(
-peg$maxFailExpected,
-peg$maxFailPos<input.length?input.charAt(peg$maxFailPos):null,
-peg$maxFailPos<input.length?
-peg$computeLocation(peg$maxFailPos,peg$maxFailPos+1):
-peg$computeLocation(peg$maxFailPos,peg$maxFailPos));
-
-}
-}
-
-module.exports={
-SyntaxError:peg$SyntaxError,
-parse:peg$parse};
-
-
-},{}],116:[function(require,module,exports){
-"use strict";
-
-
-
-
-
-var __extends=this&&this.__extends||function(){
-var extendStatics=function(d,b){
-extendStatics=Object.setPrototypeOf||
-{__proto__:[]}instanceof Array&&function(d,b){d.__proto__=b;}||
-function(d,b){for(var p in b)if(b.hasOwnProperty(p))d[p]=b[p];};
-return extendStatics(d,b);
-};
-return function(d,b){
-extendStatics(d,b);
-function __(){this.constructor=d;}
-d.prototype=b===null?Object.create(b):(__.prototype=b.prototype,new __());
-};
-}();
-Object.defineProperty(exports,"__esModule",{value:true});
-var Compiler=function(){
-function Compiler(locales,formats,formatters){
-this.locales=[];
-this.formats={
-number:{},
-date:{},
-time:{}};
-
-this.pluralNumberFormat=null;
-this.currentPlural=null;
-this.pluralStack=[];
-this.locales=locales;
-this.formats=formats;
-this.formatters=formatters;
-}
-Compiler.prototype.compile=function(ast){
-this.pluralStack=[];
-this.currentPlural=null;
-this.pluralNumberFormat=null;
-return this.compileMessage(ast);
-};
-Compiler.prototype.compileMessage=function(ast){
-var _this=this;
-if(!(ast&&ast.type==='messageFormatPattern')){
-throw new Error('Message AST is not of type: "messageFormatPattern"');
-}
-var elements=ast.elements;
-var pattern=elements.
-filter(function(el){
-return el.type==='messageTextElement'||el.type==='argumentElement';
-}).
-map(function(el){
-return el.type==='messageTextElement'?
-_this.compileMessageText(el):
-_this.compileArgument(el);
-});
-if(pattern.length!==elements.length){
-throw new Error('Message element does not have a valid type');
-}
-return pattern;
-};
-Compiler.prototype.compileMessageText=function(element){
-
-
-
-if(this.currentPlural&&/(^|[^\\])#/g.test(element.value)){
-
-
-if(!this.pluralNumberFormat){
-this.pluralNumberFormat=new Intl.NumberFormat(this.locales);
-}
-return new PluralOffsetString(this.currentPlural.id,this.currentPlural.format.offset,this.pluralNumberFormat,element.value);
-}
-
-return element.value.replace(/\\#/g,'#');
-};
-Compiler.prototype.compileArgument=function(element){
-var format=element.format,id=element.id;
-var formatters=this.formatters;
-if(!format){
-return new StringFormat(id);
-}
-var _a=this,formats=_a.formats,locales=_a.locales;
-switch(format.type){
-case'numberFormat':
-return{
-id:id,
-format:formatters.getNumberFormat(locales,formats.number[format.style]).format};
-
-case'dateFormat':
-return{
-id:id,
-format:formatters.getDateTimeFormat(locales,formats.date[format.style]).format};
-
-case'timeFormat':
-return{
-id:id,
-format:formatters.getDateTimeFormat(locales,formats.time[format.style]).format};
-
-case'pluralFormat':
-return new PluralFormat(id,format.offset,this.compileOptions(element),formatters.getPluralRules(locales,{
-type:format.ordinal?'ordinal':'cardinal'}));
-
-case'selectFormat':
-return new SelectFormat(id,this.compileOptions(element));
-default:
-throw new Error('Message element does not have a valid format type');}
-
-};
-Compiler.prototype.compileOptions=function(element){
-var _this=this;
-var format=element.format;
-var options=format.options;
-
-
-
-this.pluralStack.push(this.currentPlural);
-this.currentPlural=format.type==='pluralFormat'?element:null;
-var optionsHash=options.reduce(function(all,option){
-
-all[option.selector]=_this.compileMessage(option.value);
-return all;
-},{});
-
-this.currentPlural=this.pluralStack.pop();
-return optionsHash;
-};
-return Compiler;
-}();
-exports.default=Compiler;
-
-var Formatter=function(){
-function Formatter(id){
-this.id=id;
-}
-return Formatter;
-}();
-var StringFormat=function(_super){
-__extends(StringFormat,_super);
-function StringFormat(){
-return _super!==null&&_super.apply(this,arguments)||this;
-}
-StringFormat.prototype.format=function(value){
-if(!value&&typeof value!=='number'){
-return'';
-}
-return typeof value==='string'?value:String(value);
-};
-return StringFormat;
-}(Formatter);
-var PluralFormat=function(){
-function PluralFormat(id,offset,options,pluralRules){
-this.id=id;
-this.offset=offset;
-this.options=options;
-this.pluralRules=pluralRules;
-}
-PluralFormat.prototype.getOption=function(value){
-var options=this.options;
-var option=options['='+value]||
-options[this.pluralRules.select(value-this.offset)];
-return option||options.other;
-};
-return PluralFormat;
-}();
-var PluralOffsetString=function(_super){
-__extends(PluralOffsetString,_super);
-function PluralOffsetString(id,offset,numberFormat,string){
-var _this=_super.call(this,id)||this;
-_this.offset=offset;
-_this.numberFormat=numberFormat;
-_this.string=string;
-return _this;
-}
-PluralOffsetString.prototype.format=function(value){
-var number=this.numberFormat.format(value-this.offset);
-return this.string.
-replace(/(^|[^\\])#/g,'$1'+number).
-replace(/\\#/g,'#');
-};
-return PluralOffsetString;
-}(Formatter);
-exports.PluralOffsetString=PluralOffsetString;
-var SelectFormat=function(){
-function SelectFormat(id,options){
-this.id=id;
-this.options=options;
-}
-SelectFormat.prototype.getOption=function(value){
-var options=this.options;
-return options[value]||options.other;
-};
-return SelectFormat;
-}();
-exports.SelectFormat=SelectFormat;
-function isSelectOrPluralFormat(f){
-return!!f.options;
-}
-exports.isSelectOrPluralFormat=isSelectOrPluralFormat;
-
-},{}],117:[function(require,module,exports){
-"use strict";
-
-
-
-
-
-var __extends=this&&this.__extends||function(){
-var extendStatics=function(d,b){
-extendStatics=Object.setPrototypeOf||
-{__proto__:[]}instanceof Array&&function(d,b){d.__proto__=b;}||
-function(d,b){for(var p in b)if(b.hasOwnProperty(p))d[p]=b[p];};
-return extendStatics(d,b);
-};
-return function(d,b){
-extendStatics(d,b);
-function __(){this.constructor=d;}
-d.prototype=b===null?Object.create(b):(__.prototype=b.prototype,new __());
-};
-}();
-var __assign=this&&this.__assign||function(){
-__assign=Object.assign||function(t){
-for(var s,i=1,n=arguments.length;i<n;i++){
-s=arguments[i];
-for(var p in s)if(Object.prototype.hasOwnProperty.call(s,p))
-t[p]=s[p];
-}
-return t;
-};
-return __assign.apply(this,arguments);
-};
-Object.defineProperty(exports,"__esModule",{value:true});
-
-var compiler_1=require("./compiler");
-
-function resolveLocale(locales){
-if(typeof locales==='string'){
-locales=[locales];
-}
-try{
-return Intl.NumberFormat.supportedLocalesOf(locales,{
-
-
-localeMatcher:'best fit'})[
-0];
-}
-catch(e){
-return IntlMessageFormat.defaultLocale;
-}
-}
-function formatPatterns(pattern,values){
-var result='';
-for(var _i=0,pattern_1=pattern;_i<pattern_1.length;_i++){
-var part=pattern_1[_i];
-
-if(typeof part==='string'){
-result+=part;
-continue;
-}
-var id=part.id;
-
-if(!(values&&id in values)){
-throw new FormatError("A value must be provided for: "+id,id);
-}
-var value=values[id];
-
-
-
-if(compiler_1.isSelectOrPluralFormat(part)){
-result+=formatPatterns(part.getOption(value),values);
-}else
-{
-result+=part.format(value);
-}
-}
-return result;
-}
-function mergeConfig(c1,c2){
-if(!c2){
-return c1;
-}
-return __assign({},c1||{},c2||{},Object.keys(c1).reduce(function(all,k){
-all[k]=__assign({},c1[k],c2[k]||{});
-return all;
-},{}));
-}
-function mergeConfigs(defaultConfig,configs){
-if(!configs){
-return defaultConfig;
-}
-return Object.keys(defaultConfig).reduce(function(all,k){
-all[k]=mergeConfig(defaultConfig[k],configs[k]);
-return all;
-},__assign({},defaultConfig));
-}
-var FormatError=function(_super){
-__extends(FormatError,_super);
-function FormatError(msg,variableId){
-var _this=_super.call(this,msg)||this;
-_this.variableId=variableId;
-return _this;
-}
-return FormatError;
-}(Error);
-function createDefaultFormatters(){
-return{
-getNumberFormat:function(){
-var _a;
-var args=[];
-for(var _i=0;_i<arguments.length;_i++){
-args[_i]=arguments[_i];
-}
-return new((_a=Intl.NumberFormat).bind.apply(_a,[void 0].concat(args)))();
-},
-getDateTimeFormat:function(){
-var _a;
-var args=[];
-for(var _i=0;_i<arguments.length;_i++){
-args[_i]=arguments[_i];
-}
-return new((_a=Intl.DateTimeFormat).bind.apply(_a,[void 0].concat(args)))();
-},
-getPluralRules:function(){
-var _a;
-var args=[];
-for(var _i=0;_i<arguments.length;_i++){
-args[_i]=arguments[_i];
-}
-return new((_a=Intl.PluralRules).bind.apply(_a,[void 0].concat(args)))();
-}};
-
-}
-exports.createDefaultFormatters=createDefaultFormatters;
-var IntlMessageFormat=function(){
-function IntlMessageFormat(message,locales,overrideFormats,opts){
-var _this=this;
-if(locales===void 0){locales=IntlMessageFormat.defaultLocale;}
-this.format=function(values){
-try{
-return formatPatterns(_this.pattern,values);
-}
-catch(e){
-if(e.variableId){
-throw new Error("The intl string context variable '"+e.variableId+"' was not provided to the string '"+_this.message+"'");
-}else
-{
-throw e;
-}
-}
-};
-if(typeof message==='string'){
-if(!IntlMessageFormat.__parse){
-throw new TypeError('IntlMessageFormat.__parse must be set to process `message` of type `string`');
-}
-
-this.ast=IntlMessageFormat.__parse(message);
-}else
-{
-this.ast=message;
-}
-this.message=message;
-if(!(this.ast&&this.ast.type==='messageFormatPattern')){
-throw new TypeError('A message must be provided as a String or AST.');
-}
-
-
-var formats=mergeConfigs(IntlMessageFormat.formats,overrideFormats);
-
-this.locale=resolveLocale(locales||[]);
-var formatters=opts&&opts.formatters||createDefaultFormatters();
-
-
-
-this.pattern=new compiler_1.default(locales,formats,formatters).compile(this.ast);
-
-
-}
-IntlMessageFormat.prototype.resolvedOptions=function(){
-return{locale:this.locale};
-};
-IntlMessageFormat.prototype.getAst=function(){
-return this.ast;
-};
-IntlMessageFormat.defaultLocale='en';
-IntlMessageFormat.__parse=undefined;
-
-
-
-IntlMessageFormat.formats={
-number:{
-currency:{
-style:'currency'},
-
-percent:{
-style:'percent'}},
-
-
-date:{
-short:{
-month:'numeric',
-day:'numeric',
-year:'2-digit'},
-
-medium:{
-month:'short',
-day:'numeric',
-year:'numeric'},
-
-long:{
-month:'long',
-day:'numeric',
-year:'numeric'},
-
-full:{
-weekday:'long',
-month:'long',
-day:'numeric',
-year:'numeric'}},
-
-
-time:{
-short:{
-hour:'numeric',
-minute:'numeric'},
-
-medium:{
-hour:'numeric',
-minute:'numeric',
-second:'numeric'},
-
-long:{
-hour:'numeric',
-minute:'numeric',
-second:'numeric',
-timeZoneName:'short'},
-
-full:{
-hour:'numeric',
-minute:'numeric',
-second:'numeric',
-timeZoneName:'short'}}};
-
-
-
-return IntlMessageFormat;
-}();
-exports.IntlMessageFormat=IntlMessageFormat;
-exports.default=IntlMessageFormat;
-
-},{"./compiler":116}],118:[function(require,module,exports){
-"use strict";
-
-
-
-
-
-function __export(m){
-for(var p in m)if(!exports.hasOwnProperty(p))exports[p]=m[p];
-}
-Object.defineProperty(exports,"__esModule",{value:true});
-var intl_messageformat_parser_1=require("intl-messageformat-parser");
-var core_1=require("./core");
-core_1.default.__parse=intl_messageformat_parser_1.default.parse;
-__export(require("./core"));
-exports.default=core_1.default;
-
-},{"./core":117,"intl-messageformat-parser":114}],119:[function(require,module,exports){
-'use strict';
-var IntlMessageFormat=require('./dist').default;
-
-
-
-
-exports=module.exports=IntlMessageFormat;
-exports['default']=exports;
-
-},{"./dist":118}],120:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-module.exports=function(obj){
-return obj!=null&&(isBuffer(obj)||isSlowBuffer(obj)||!!obj._isBuffer);
-};
-
-function isBuffer(obj){
-return!!obj.constructor&&typeof obj.constructor.isBuffer==='function'&&obj.constructor.isBuffer(obj);
-}
-
-
-function isSlowBuffer(obj){
-return typeof obj.readFloatLE==='function'&&typeof obj.slice==='function'&&isBuffer(obj.slice(0,0));
-}
-
-},{}],121:[function(require,module,exports){
-var toString={}.toString;
-
-module.exports=Array.isArray||function(arr){
-return toString.call(arr)=='[object Array]';
-};
-
-},{}],122:[function(require,module,exports){
-var encode=require('./lib/encoder'),
-decode=require('./lib/decoder');
-
-module.exports={
-encode:encode,
-decode:decode};
-
-
-},{"./lib/decoder":123,"./lib/encoder":124}],123:[function(require,module,exports){
-(function(Buffer){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-var JpegImage=function jpegImage(){
-"use strict";
-var dctZigZag=new Int32Array([
-0,
-1,8,
-16,9,2,
-3,10,17,24,
-32,25,18,11,4,
-5,12,19,26,33,40,
-48,41,34,27,20,13,6,
-7,14,21,28,35,42,49,56,
-57,50,43,36,29,22,15,
-23,30,37,44,51,58,
-59,52,45,38,31,
-39,46,53,60,
-61,54,47,
-55,62,
-63]);
-
-
-var dctCos1=4017;
-var dctSin1=799;
-var dctCos3=3406;
-var dctSin3=2276;
-var dctCos6=1567;
-var dctSin6=3784;
-var dctSqrt2=5793;
-var dctSqrt1d2=2896;
-
-function constructor(){
-}
-
-function buildHuffmanTable(codeLengths,values){
-var k=0,code=[],i,j,length=16;
-while(length>0&&!codeLengths[length-1])
-length--;
-code.push({children:[],index:0});
-var p=code[0],q;
-for(i=0;i<length;i++){
-for(j=0;j<codeLengths[i];j++){
-p=code.pop();
-p.children[p.index]=values[k];
-while(p.index>0){
-p=code.pop();
-}
-p.index++;
-code.push(p);
-while(code.length<=i){
-code.push(q={children:[],index:0});
-p.children[p.index]=q.children;
-p=q;
-}
-k++;
-}
-if(i+1<length){
-
-code.push(q={children:[],index:0});
-p.children[p.index]=q.children;
-p=q;
-}
-}
-return code[0].children;
-}
-
-function decodeScan(data,offset,
-frame,components,resetInterval,
-spectralStart,spectralEnd,
-successivePrev,successive){
-var precision=frame.precision;
-var samplesPerLine=frame.samplesPerLine;
-var scanLines=frame.scanLines;
-var mcusPerLine=frame.mcusPerLine;
-var progressive=frame.progressive;
-var maxH=frame.maxH,maxV=frame.maxV;
-
-var startOffset=offset,bitsData=0,bitsCount=0;
-function readBit(){
-if(bitsCount>0){
-bitsCount--;
-return bitsData>>bitsCount&1;
-}
-bitsData=data[offset++];
-if(bitsData==0xFF){
-var nextByte=data[offset++];
-if(nextByte){
-throw"unexpected marker: "+(bitsData<<8|nextByte).toString(16);
-}
-
-}
-bitsCount=7;
-return bitsData>>>7;
-}
-function decodeHuffman(tree){
-var node=tree,bit;
-while((bit=readBit())!==null){
-node=node[bit];
-if(typeof node==='number')
-return node;
-if(typeof node!=='object')
-throw"invalid huffman sequence";
-}
-return null;
-}
-function receive(length){
-var n=0;
-while(length>0){
-var bit=readBit();
-if(bit===null)return;
-n=n<<1|bit;
-length--;
-}
-return n;
-}
-function receiveAndExtend(length){
-var n=receive(length);
-if(n>=1<<length-1)
-return n;
-return n+(-1<<length)+1;
-}
-function decodeBaseline(component,zz){
-var t=decodeHuffman(component.huffmanTableDC);
-var diff=t===0?0:receiveAndExtend(t);
-zz[0]=component.pred+=diff;
-var k=1;
-while(k<64){
-var rs=decodeHuffman(component.huffmanTableAC);
-var s=rs&15,r=rs>>4;
-if(s===0){
-if(r<15)
-break;
-k+=16;
-continue;
-}
-k+=r;
-var z=dctZigZag[k];
-zz[z]=receiveAndExtend(s);
-k++;
-}
-}
-function decodeDCFirst(component,zz){
-var t=decodeHuffman(component.huffmanTableDC);
-var diff=t===0?0:receiveAndExtend(t)<<successive;
-zz[0]=component.pred+=diff;
-}
-function decodeDCSuccessive(component,zz){
-zz[0]|=readBit()<<successive;
-}
-var eobrun=0;
-function decodeACFirst(component,zz){
-if(eobrun>0){
-eobrun--;
-return;
-}
-var k=spectralStart,e=spectralEnd;
-while(k<=e){
-var rs=decodeHuffman(component.huffmanTableAC);
-var s=rs&15,r=rs>>4;
-if(s===0){
-if(r<15){
-eobrun=receive(r)+(1<<r)-1;
-break;
-}
-k+=16;
-continue;
-}
-k+=r;
-var z=dctZigZag[k];
-zz[z]=receiveAndExtend(s)*(1<<successive);
-k++;
-}
-}
-var successiveACState=0,successiveACNextValue;
-function decodeACSuccessive(component,zz){
-var k=spectralStart,e=spectralEnd,r=0;
-while(k<=e){
-var z=dctZigZag[k];
-switch(successiveACState){
-case 0:
-var rs=decodeHuffman(component.huffmanTableAC);
-var s=rs&15,r=rs>>4;
-if(s===0){
-if(r<15){
-eobrun=receive(r)+(1<<r);
-successiveACState=4;
-}else{
-r=16;
-successiveACState=1;
-}
-}else{
-if(s!==1)
-throw"invalid ACn encoding";
-successiveACNextValue=receiveAndExtend(s);
-successiveACState=r?2:3;
-}
-continue;
-case 1:
-case 2:
-if(zz[z])
-zz[z]+=readBit()<<successive;else
-{
-r--;
-if(r===0)
-successiveACState=successiveACState==2?3:0;
-}
-break;
-case 3:
-if(zz[z])
-zz[z]+=readBit()<<successive;else
-{
-zz[z]=successiveACNextValue<<successive;
-successiveACState=0;
-}
-break;
-case 4:
-if(zz[z])
-zz[z]+=readBit()<<successive;
-break;}
-
-k++;
-}
-if(successiveACState===4){
-eobrun--;
-if(eobrun===0)
-successiveACState=0;
-}
-}
-function decodeMcu(component,decode,mcu,row,col){
-var mcuRow=mcu/mcusPerLine|0;
-var mcuCol=mcu%mcusPerLine;
-var blockRow=mcuRow*component.v+row;
-var blockCol=mcuCol*component.h+col;
-decode(component,component.blocks[blockRow][blockCol]);
-}
-function decodeBlock(component,decode,mcu){
-var blockRow=mcu/component.blocksPerLine|0;
-var blockCol=mcu%component.blocksPerLine;
-decode(component,component.blocks[blockRow][blockCol]);
-}
-
-var componentsLength=components.length;
-var component,i,j,k,n;
-var decodeFn;
-if(progressive){
-if(spectralStart===0)
-decodeFn=successivePrev===0?decodeDCFirst:decodeDCSuccessive;else
-
-decodeFn=successivePrev===0?decodeACFirst:decodeACSuccessive;
-}else{
-decodeFn=decodeBaseline;
-}
-
-var mcu=0,marker;
-var mcuExpected;
-if(componentsLength==1){
-mcuExpected=components[0].blocksPerLine*components[0].blocksPerColumn;
-}else{
-mcuExpected=mcusPerLine*frame.mcusPerColumn;
-}
-if(!resetInterval)resetInterval=mcuExpected;
-
-var h,v;
-while(mcu<mcuExpected){
-
-for(i=0;i<componentsLength;i++)
-components[i].pred=0;
-eobrun=0;
-
-if(componentsLength==1){
-component=components[0];
-for(n=0;n<resetInterval;n++){
-decodeBlock(component,decodeFn,mcu);
-mcu++;
-}
-}else{
-for(n=0;n<resetInterval;n++){
-for(i=0;i<componentsLength;i++){
-component=components[i];
-h=component.h;
-v=component.v;
-for(j=0;j<v;j++){
-for(k=0;k<h;k++){
-decodeMcu(component,decodeFn,mcu,j,k);
-}
-}
-}
-mcu++;
-
-
-if(mcu===mcuExpected)break;
-}
-}
-
-
-bitsCount=0;
-marker=data[offset]<<8|data[offset+1];
-if(marker<0xFF00){
-throw"marker was not found";
-}
-
-if(marker>=0xFFD0&&marker<=0xFFD7){
-offset+=2;
-}else
-
-break;
-}
-
-return offset-startOffset;
-}
-
-function buildComponentData(frame,component){
-var lines=[];
-var blocksPerLine=component.blocksPerLine;
-var blocksPerColumn=component.blocksPerColumn;
-var samplesPerLine=blocksPerLine<<3;
-var R=new Int32Array(64),r=new Uint8Array(64);
-
-
-
-
-
-
-function quantizeAndInverse(zz,dataOut,dataIn){
-var qt=component.quantizationTable;
-var v0,v1,v2,v3,v4,v5,v6,v7,t;
-var p=dataIn;
-var i;
-
-
-for(i=0;i<64;i++)
-p[i]=zz[i]*qt[i];
-
-
-for(i=0;i<8;++i){
-var row=8*i;
-
-
-if(p[1+row]==0&&p[2+row]==0&&p[3+row]==0&&
-p[4+row]==0&&p[5+row]==0&&p[6+row]==0&&
-p[7+row]==0){
-t=dctSqrt2*p[0+row]+512>>10;
-p[0+row]=t;
-p[1+row]=t;
-p[2+row]=t;
-p[3+row]=t;
-p[4+row]=t;
-p[5+row]=t;
-p[6+row]=t;
-p[7+row]=t;
-continue;
-}
-
-
-v0=dctSqrt2*p[0+row]+128>>8;
-v1=dctSqrt2*p[4+row]+128>>8;
-v2=p[2+row];
-v3=p[6+row];
-v4=dctSqrt1d2*(p[1+row]-p[7+row])+128>>8;
-v7=dctSqrt1d2*(p[1+row]+p[7+row])+128>>8;
-v5=p[3+row]<<4;
-v6=p[5+row]<<4;
-
-
-t=v0-v1+1>>1;
-v0=v0+v1+1>>1;
-v1=t;
-t=v2*dctSin6+v3*dctCos6+128>>8;
-v2=v2*dctCos6-v3*dctSin6+128>>8;
-v3=t;
-t=v4-v6+1>>1;
-v4=v4+v6+1>>1;
-v6=t;
-t=v7+v5+1>>1;
-v5=v7-v5+1>>1;
-v7=t;
-
-
-t=v0-v3+1>>1;
-v0=v0+v3+1>>1;
-v3=t;
-t=v1-v2+1>>1;
-v1=v1+v2+1>>1;
-v2=t;
-t=v4*dctSin3+v7*dctCos3+2048>>12;
-v4=v4*dctCos3-v7*dctSin3+2048>>12;
-v7=t;
-t=v5*dctSin1+v6*dctCos1+2048>>12;
-v5=v5*dctCos1-v6*dctSin1+2048>>12;
-v6=t;
-
-
-p[0+row]=v0+v7;
-p[7+row]=v0-v7;
-p[1+row]=v1+v6;
-p[6+row]=v1-v6;
-p[2+row]=v2+v5;
-p[5+row]=v2-v5;
-p[3+row]=v3+v4;
-p[4+row]=v3-v4;
-}
-
-
-for(i=0;i<8;++i){
-var col=i;
-
-
-if(p[1*8+col]==0&&p[2*8+col]==0&&p[3*8+col]==0&&
-p[4*8+col]==0&&p[5*8+col]==0&&p[6*8+col]==0&&
-p[7*8+col]==0){
-t=dctSqrt2*dataIn[i+0]+8192>>14;
-p[0*8+col]=t;
-p[1*8+col]=t;
-p[2*8+col]=t;
-p[3*8+col]=t;
-p[4*8+col]=t;
-p[5*8+col]=t;
-p[6*8+col]=t;
-p[7*8+col]=t;
-continue;
-}
-
-
-v0=dctSqrt2*p[0*8+col]+2048>>12;
-v1=dctSqrt2*p[4*8+col]+2048>>12;
-v2=p[2*8+col];
-v3=p[6*8+col];
-v4=dctSqrt1d2*(p[1*8+col]-p[7*8+col])+2048>>12;
-v7=dctSqrt1d2*(p[1*8+col]+p[7*8+col])+2048>>12;
-v5=p[3*8+col];
-v6=p[5*8+col];
-
-
-t=v0-v1+1>>1;
-v0=v0+v1+1>>1;
-v1=t;
-t=v2*dctSin6+v3*dctCos6+2048>>12;
-v2=v2*dctCos6-v3*dctSin6+2048>>12;
-v3=t;
-t=v4-v6+1>>1;
-v4=v4+v6+1>>1;
-v6=t;
-t=v7+v5+1>>1;
-v5=v7-v5+1>>1;
-v7=t;
-
-
-t=v0-v3+1>>1;
-v0=v0+v3+1>>1;
-v3=t;
-t=v1-v2+1>>1;
-v1=v1+v2+1>>1;
-v2=t;
-t=v4*dctSin3+v7*dctCos3+2048>>12;
-v4=v4*dctCos3-v7*dctSin3+2048>>12;
-v7=t;
-t=v5*dctSin1+v6*dctCos1+2048>>12;
-v5=v5*dctCos1-v6*dctSin1+2048>>12;
-v6=t;
-
-
-p[0*8+col]=v0+v7;
-p[7*8+col]=v0-v7;
-p[1*8+col]=v1+v6;
-p[6*8+col]=v1-v6;
-p[2*8+col]=v2+v5;
-p[5*8+col]=v2-v5;
-p[3*8+col]=v3+v4;
-p[4*8+col]=v3-v4;
-}
-
-
-for(i=0;i<64;++i){
-var sample=128+(p[i]+8>>4);
-dataOut[i]=sample<0?0:sample>0xFF?0xFF:sample;
-}
-}
-
-var i,j;
-for(var blockRow=0;blockRow<blocksPerColumn;blockRow++){
-var scanLine=blockRow<<3;
-for(i=0;i<8;i++)
-lines.push(new Uint8Array(samplesPerLine));
-for(var blockCol=0;blockCol<blocksPerLine;blockCol++){
-quantizeAndInverse(component.blocks[blockRow][blockCol],r,R);
-
-var offset=0,sample=blockCol<<3;
-for(j=0;j<8;j++){
-var line=lines[scanLine+j];
-for(i=0;i<8;i++)
-line[sample+i]=r[offset++];
-}
-}
-}
-return lines;
-}
-
-function clampTo8bit(a){
-return a<0?0:a>255?255:a;
-}
-
-constructor.prototype={
-load:function load(path){
-var xhr=new XMLHttpRequest();
-xhr.open("GET",path,true);
-xhr.responseType="arraybuffer";
-xhr.onload=function(){
-
-var data=new Uint8Array(xhr.response||xhr.mozResponseArrayBuffer);
-this.parse(data);
-if(this.onload)
-this.onload();
-}.bind(this);
-xhr.send(null);
-},
-parse:function parse(data){
-var offset=0,length=data.length;
-function readUint16(){
-var value=data[offset]<<8|data[offset+1];
-offset+=2;
-return value;
-}
-function readDataBlock(){
-var length=readUint16();
-var array=data.subarray(offset,offset+length-2);
-offset+=array.length;
-return array;
-}
-function prepareComponents(frame){
-var maxH=0,maxV=0;
-var component,componentId;
-for(componentId in frame.components){
-if(frame.components.hasOwnProperty(componentId)){
-component=frame.components[componentId];
-if(maxH<component.h)maxH=component.h;
-if(maxV<component.v)maxV=component.v;
-}
-}
-var mcusPerLine=Math.ceil(frame.samplesPerLine/8/maxH);
-var mcusPerColumn=Math.ceil(frame.scanLines/8/maxV);
-for(componentId in frame.components){
-if(frame.components.hasOwnProperty(componentId)){
-component=frame.components[componentId];
-var blocksPerLine=Math.ceil(Math.ceil(frame.samplesPerLine/8)*component.h/maxH);
-var blocksPerColumn=Math.ceil(Math.ceil(frame.scanLines/8)*component.v/maxV);
-var blocksPerLineForMcu=mcusPerLine*component.h;
-var blocksPerColumnForMcu=mcusPerColumn*component.v;
-var blocks=[];
-for(var i=0;i<blocksPerColumnForMcu;i++){
-var row=[];
-for(var j=0;j<blocksPerLineForMcu;j++)
-row.push(new Int32Array(64));
-blocks.push(row);
-}
-component.blocksPerLine=blocksPerLine;
-component.blocksPerColumn=blocksPerColumn;
-component.blocks=blocks;
-}
-}
-frame.maxH=maxH;
-frame.maxV=maxV;
-frame.mcusPerLine=mcusPerLine;
-frame.mcusPerColumn=mcusPerColumn;
-}
-var jfif=null;
-var adobe=null;
-var pixels=null;
-var frame,resetInterval;
-var quantizationTables=[],frames=[];
-var huffmanTablesAC=[],huffmanTablesDC=[];
-var fileMarker=readUint16();
-if(fileMarker!=0xFFD8){
-throw"SOI not found";
-}
-
-fileMarker=readUint16();
-while(fileMarker!=0xFFD9){
-var i,j,l;
-switch(fileMarker){
-case 0xFF00:break;
-case 0xFFE0:
-case 0xFFE1:
-case 0xFFE2:
-case 0xFFE3:
-case 0xFFE4:
-case 0xFFE5:
-case 0xFFE6:
-case 0xFFE7:
-case 0xFFE8:
-case 0xFFE9:
-case 0xFFEA:
-case 0xFFEB:
-case 0xFFEC:
-case 0xFFED:
-case 0xFFEE:
-case 0xFFEF:
-case 0xFFFE:
-var appData=readDataBlock();
-
-if(fileMarker===0xFFE0){
-if(appData[0]===0x4A&&appData[1]===0x46&&appData[2]===0x49&&
-appData[3]===0x46&&appData[4]===0){
-jfif={
-version:{major:appData[5],minor:appData[6]},
-densityUnits:appData[7],
-xDensity:appData[8]<<8|appData[9],
-yDensity:appData[10]<<8|appData[11],
-thumbWidth:appData[12],
-thumbHeight:appData[13],
-thumbData:appData.subarray(14,14+3*appData[12]*appData[13])};
-
-}
-}
-
-if(fileMarker===0xFFEE){
-if(appData[0]===0x41&&appData[1]===0x64&&appData[2]===0x6F&&
-appData[3]===0x62&&appData[4]===0x65&&appData[5]===0){
-adobe={
-version:appData[6],
-flags0:appData[7]<<8|appData[8],
-flags1:appData[9]<<8|appData[10],
-transformCode:appData[11]};
-
-}
-}
-break;
-
-case 0xFFDB:
-var quantizationTablesLength=readUint16();
-var quantizationTablesEnd=quantizationTablesLength+offset-2;
-while(offset<quantizationTablesEnd){
-var quantizationTableSpec=data[offset++];
-var tableData=new Int32Array(64);
-if(quantizationTableSpec>>4===0){
-for(j=0;j<64;j++){
-var z=dctZigZag[j];
-tableData[z]=data[offset++];
-}
-}else if(quantizationTableSpec>>4===1){
-for(j=0;j<64;j++){
-var z=dctZigZag[j];
-tableData[z]=readUint16();
-}
-}else
-throw"DQT: invalid table spec";
-quantizationTables[quantizationTableSpec&15]=tableData;
-}
-break;
-
-case 0xFFC0:
-case 0xFFC1:
-case 0xFFC2:
-readUint16();
-frame={};
-frame.extended=fileMarker===0xFFC1;
-frame.progressive=fileMarker===0xFFC2;
-frame.precision=data[offset++];
-frame.scanLines=readUint16();
-frame.samplesPerLine=readUint16();
-frame.components={};
-frame.componentsOrder=[];
-var componentsCount=data[offset++],componentId;
-var maxH=0,maxV=0;
-for(i=0;i<componentsCount;i++){
-componentId=data[offset];
-var h=data[offset+1]>>4;
-var v=data[offset+1]&15;
-var qId=data[offset+2];
-frame.componentsOrder.push(componentId);
-frame.components[componentId]={
-h:h,
-v:v,
-quantizationIdx:qId};
-
-offset+=3;
-}
-prepareComponents(frame);
-frames.push(frame);
-break;
-
-case 0xFFC4:
-var huffmanLength=readUint16();
-for(i=2;i<huffmanLength;){
-var huffmanTableSpec=data[offset++];
-var codeLengths=new Uint8Array(16);
-var codeLengthSum=0;
-for(j=0;j<16;j++,offset++)
-codeLengthSum+=codeLengths[j]=data[offset];
-var huffmanValues=new Uint8Array(codeLengthSum);
-for(j=0;j<codeLengthSum;j++,offset++)
-huffmanValues[j]=data[offset];
-i+=17+codeLengthSum;
-
-(huffmanTableSpec>>4===0?
-huffmanTablesDC:huffmanTablesAC)[huffmanTableSpec&15]=
-buildHuffmanTable(codeLengths,huffmanValues);
-}
-break;
-
-case 0xFFDD:
-readUint16();
-resetInterval=readUint16();
-break;
-
-case 0xFFDA:
-var scanLength=readUint16();
-var selectorsCount=data[offset++];
-var components=[],component;
-for(i=0;i<selectorsCount;i++){
-component=frame.components[data[offset++]];
-var tableSpec=data[offset++];
-component.huffmanTableDC=huffmanTablesDC[tableSpec>>4];
-component.huffmanTableAC=huffmanTablesAC[tableSpec&15];
-components.push(component);
-}
-var spectralStart=data[offset++];
-var spectralEnd=data[offset++];
-var successiveApproximation=data[offset++];
-var processed=decodeScan(data,offset,
-frame,components,resetInterval,
-spectralStart,spectralEnd,
-successiveApproximation>>4,successiveApproximation&15);
-offset+=processed;
-break;
-default:
-if(data[offset-3]==0xFF&&
-data[offset-2]>=0xC0&&data[offset-2]<=0xFE){
-
-
-offset-=3;
-break;
-}
-throw"unknown JPEG marker "+fileMarker.toString(16);}
-
-fileMarker=readUint16();
-}
-if(frames.length!=1)
-throw"only single frame JPEGs supported";
-
-
-for(var i=0;i<frames.length;i++){
-var cp=frames[i].components;
-for(var j in cp){
-cp[j].quantizationTable=quantizationTables[cp[j].quantizationIdx];
-delete cp[j].quantizationIdx;
-}
-}
-
-this.width=frame.samplesPerLine;
-this.height=frame.scanLines;
-this.jfif=jfif;
-this.adobe=adobe;
-this.components=[];
-for(var i=0;i<frame.componentsOrder.length;i++){
-var component=frame.components[frame.componentsOrder[i]];
-this.components.push({
-lines:buildComponentData(frame,component),
-scaleX:component.h/frame.maxH,
-scaleY:component.v/frame.maxV});
-
-}
-},
-getData:function getData(width,height){
-var scaleX=this.width/width,scaleY=this.height/height;
-
-var component1,component2,component3,component4;
-var component1Line,component2Line,component3Line,component4Line;
-var x,y;
-var offset=0;
-var Y,Cb,Cr,K,C,M,Ye,R,G,B;
-var colorTransform;
-var dataLength=width*height*this.components.length;
-var data=new Uint8Array(dataLength);
-switch(this.components.length){
-case 1:
-component1=this.components[0];
-for(y=0;y<height;y++){
-component1Line=component1.lines[0|y*component1.scaleY*scaleY];
-for(x=0;x<width;x++){
-Y=component1Line[0|x*component1.scaleX*scaleX];
-
-data[offset++]=Y;
-}
-}
-break;
-case 2:
-
-component1=this.components[0];
-component2=this.components[1];
-for(y=0;y<height;y++){
-component1Line=component1.lines[0|y*component1.scaleY*scaleY];
-component2Line=component2.lines[0|y*component2.scaleY*scaleY];
-for(x=0;x<width;x++){
-Y=component1Line[0|x*component1.scaleX*scaleX];
-data[offset++]=Y;
-Y=component2Line[0|x*component2.scaleX*scaleX];
-data[offset++]=Y;
-}
-}
-break;
-case 3:
-
-colorTransform=true;
-
-if(this.adobe&&this.adobe.transformCode)
-colorTransform=true;else
-if(typeof this.colorTransform!=='undefined')
-colorTransform=!!this.colorTransform;
-
-component1=this.components[0];
-component2=this.components[1];
-component3=this.components[2];
-for(y=0;y<height;y++){
-component1Line=component1.lines[0|y*component1.scaleY*scaleY];
-component2Line=component2.lines[0|y*component2.scaleY*scaleY];
-component3Line=component3.lines[0|y*component3.scaleY*scaleY];
-for(x=0;x<width;x++){
-if(!colorTransform){
-R=component1Line[0|x*component1.scaleX*scaleX];
-G=component2Line[0|x*component2.scaleX*scaleX];
-B=component3Line[0|x*component3.scaleX*scaleX];
-}else{
-Y=component1Line[0|x*component1.scaleX*scaleX];
-Cb=component2Line[0|x*component2.scaleX*scaleX];
-Cr=component3Line[0|x*component3.scaleX*scaleX];
-
-R=clampTo8bit(Y+1.402*(Cr-128));
-G=clampTo8bit(Y-0.3441363*(Cb-128)-0.71413636*(Cr-128));
-B=clampTo8bit(Y+1.772*(Cb-128));
-}
-
-data[offset++]=R;
-data[offset++]=G;
-data[offset++]=B;
-}
-}
-break;
-case 4:
-if(!this.adobe)
-throw'Unsupported color mode (4 components)';
-
-colorTransform=false;
-
-if(this.adobe&&this.adobe.transformCode)
-colorTransform=true;else
-if(typeof this.colorTransform!=='undefined')
-colorTransform=!!this.colorTransform;
-
-component1=this.components[0];
-component2=this.components[1];
-component3=this.components[2];
-component4=this.components[3];
-for(y=0;y<height;y++){
-component1Line=component1.lines[0|y*component1.scaleY*scaleY];
-component2Line=component2.lines[0|y*component2.scaleY*scaleY];
-component3Line=component3.lines[0|y*component3.scaleY*scaleY];
-component4Line=component4.lines[0|y*component4.scaleY*scaleY];
-for(x=0;x<width;x++){
-if(!colorTransform){
-C=component1Line[0|x*component1.scaleX*scaleX];
-M=component2Line[0|x*component2.scaleX*scaleX];
-Ye=component3Line[0|x*component3.scaleX*scaleX];
-K=component4Line[0|x*component4.scaleX*scaleX];
-}else{
-Y=component1Line[0|x*component1.scaleX*scaleX];
-Cb=component2Line[0|x*component2.scaleX*scaleX];
-Cr=component3Line[0|x*component3.scaleX*scaleX];
-K=component4Line[0|x*component4.scaleX*scaleX];
-
-C=255-clampTo8bit(Y+1.402*(Cr-128));
-M=255-clampTo8bit(Y-0.3441363*(Cb-128)-0.71413636*(Cr-128));
-Ye=255-clampTo8bit(Y+1.772*(Cb-128));
-}
-data[offset++]=255-C;
-data[offset++]=255-M;
-data[offset++]=255-Ye;
-data[offset++]=255-K;
-}
-}
-break;
-default:
-throw'Unsupported color mode';}
-
-return data;
-},
-copyToImageData:function copyToImageData(imageData){
-var width=imageData.width,height=imageData.height;
-var imageDataArray=imageData.data;
-var data=this.getData(width,height);
-var i=0,j=0,x,y;
-var Y,K,C,M,R,G,B;
-switch(this.components.length){
-case 1:
-for(y=0;y<height;y++){
-for(x=0;x<width;x++){
-Y=data[i++];
-
-imageDataArray[j++]=Y;
-imageDataArray[j++]=Y;
-imageDataArray[j++]=Y;
-imageDataArray[j++]=255;
-}
-}
-break;
-case 3:
-for(y=0;y<height;y++){
-for(x=0;x<width;x++){
-R=data[i++];
-G=data[i++];
-B=data[i++];
-
-imageDataArray[j++]=R;
-imageDataArray[j++]=G;
-imageDataArray[j++]=B;
-imageDataArray[j++]=255;
-}
-}
-break;
-case 4:
-for(y=0;y<height;y++){
-for(x=0;x<width;x++){
-C=data[i++];
-M=data[i++];
-Y=data[i++];
-K=data[i++];
-
-R=255-clampTo8bit(C*(1-K/255)+K);
-G=255-clampTo8bit(M*(1-K/255)+K);
-B=255-clampTo8bit(Y*(1-K/255)+K);
-
-imageDataArray[j++]=R;
-imageDataArray[j++]=G;
-imageDataArray[j++]=B;
-imageDataArray[j++]=255;
-}
-}
-break;
-default:
-throw'Unsupported color mode';}
-
-}};
-
-
-return constructor;
-}();
-module.exports=decode;
-
-function decode(jpegData){
-var arr=new Uint8Array(jpegData);
-var decoder=new JpegImage();
-decoder.parse(arr);
-
-var image={
-width:decoder.width,
-height:decoder.height,
-data:new Buffer(decoder.width*decoder.height*4)};
-
-
-decoder.copyToImageData(image);
-
-return image;
-}
-
-}).call(this,require("buffer").Buffer);
-},{"buffer":102}],124:[function(require,module,exports){
-(function(Buffer){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-var btoa=btoa||function(buf){
-return new Buffer(buf).toString('base64');
-};
-
-function JPEGEncoder(quality){
-var self=this;
-var fround=Math.round;
-var ffloor=Math.floor;
-var YTable=new Array(64);
-var UVTable=new Array(64);
-var fdtbl_Y=new Array(64);
-var fdtbl_UV=new Array(64);
-var YDC_HT;
-var UVDC_HT;
-var YAC_HT;
-var UVAC_HT;
-
-var bitcode=new Array(65535);
-var category=new Array(65535);
-var outputfDCTQuant=new Array(64);
-var DU=new Array(64);
-var byteout=[];
-var bytenew=0;
-var bytepos=7;
-
-var YDU=new Array(64);
-var UDU=new Array(64);
-var VDU=new Array(64);
-var clt=new Array(256);
-var RGB_YUV_TABLE=new Array(2048);
-var currentQuality;
-
-var ZigZag=[
-0,1,5,6,14,15,27,28,
-2,4,7,13,16,26,29,42,
-3,8,12,17,25,30,41,43,
-9,11,18,24,31,40,44,53,
-10,19,23,32,39,45,52,54,
-20,22,33,38,46,51,55,60,
-21,34,37,47,50,56,59,61,
-35,36,48,49,57,58,62,63];
-
-
-var std_dc_luminance_nrcodes=[0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0];
-var std_dc_luminance_values=[0,1,2,3,4,5,6,7,8,9,10,11];
-var std_ac_luminance_nrcodes=[0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d];
-var std_ac_luminance_values=[
-0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,
-0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,
-0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,
-0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,
-0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,
-0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,
-0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,
-0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
-0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
-0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
-0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,
-0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
-0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,
-0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,
-0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,
-0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,
-0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,
-0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,
-0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,
-0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
-0xf9,0xfa];
-
-
-var std_dc_chrominance_nrcodes=[0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0];
-var std_dc_chrominance_values=[0,1,2,3,4,5,6,7,8,9,10,11];
-var std_ac_chrominance_nrcodes=[0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77];
-var std_ac_chrominance_values=[
-0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,
-0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,
-0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,
-0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,
-0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,
-0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26,
-0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,
-0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,
-0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,
-0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,
-0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,
-0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87,
-0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,
-0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,
-0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,
-0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,
-0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,
-0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,
-0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,
-0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
-0xf9,0xfa];
-
-
-function initQuantTables(sf){
-var YQT=[
-16,11,10,16,24,40,51,61,
-12,12,14,19,26,58,60,55,
-14,13,16,24,40,57,69,56,
-14,17,22,29,51,87,80,62,
-18,22,37,56,68,109,103,77,
-24,35,55,64,81,104,113,92,
-49,64,78,87,103,121,120,101,
-72,92,95,98,112,100,103,99];
-
-
-for(var i=0;i<64;i++){
-var t=ffloor((YQT[i]*sf+50)/100);
-if(t<1){
-t=1;
-}else if(t>255){
-t=255;
-}
-YTable[ZigZag[i]]=t;
-}
-var UVQT=[
-17,18,24,47,99,99,99,99,
-18,21,26,66,99,99,99,99,
-24,26,56,99,99,99,99,99,
-47,66,99,99,99,99,99,99,
-99,99,99,99,99,99,99,99,
-99,99,99,99,99,99,99,99,
-99,99,99,99,99,99,99,99,
-99,99,99,99,99,99,99,99];
-
-for(var j=0;j<64;j++){
-var u=ffloor((UVQT[j]*sf+50)/100);
-if(u<1){
-u=1;
-}else if(u>255){
-u=255;
-}
-UVTable[ZigZag[j]]=u;
-}
-var aasf=[
-1.0,1.387039845,1.306562965,1.175875602,
-1.0,0.785694958,0.541196100,0.275899379];
-
-var k=0;
-for(var row=0;row<8;row++)
-{
-for(var col=0;col<8;col++)
-{
-fdtbl_Y[k]=1.0/(YTable[ZigZag[k]]*aasf[row]*aasf[col]*8.0);
-fdtbl_UV[k]=1.0/(UVTable[ZigZag[k]]*aasf[row]*aasf[col]*8.0);
-k++;
-}
-}
-}
-
-function computeHuffmanTbl(nrcodes,std_table){
-var codevalue=0;
-var pos_in_table=0;
-var HT=new Array();
-for(var k=1;k<=16;k++){
-for(var j=1;j<=nrcodes[k];j++){
-HT[std_table[pos_in_table]]=[];
-HT[std_table[pos_in_table]][0]=codevalue;
-HT[std_table[pos_in_table]][1]=k;
-pos_in_table++;
-codevalue++;
-}
-codevalue*=2;
-}
-return HT;
-}
-
-function initHuffmanTbl()
-{
-YDC_HT=computeHuffmanTbl(std_dc_luminance_nrcodes,std_dc_luminance_values);
-UVDC_HT=computeHuffmanTbl(std_dc_chrominance_nrcodes,std_dc_chrominance_values);
-YAC_HT=computeHuffmanTbl(std_ac_luminance_nrcodes,std_ac_luminance_values);
-UVAC_HT=computeHuffmanTbl(std_ac_chrominance_nrcodes,std_ac_chrominance_values);
-}
-
-function initCategoryNumber()
-{
-var nrlower=1;
-var nrupper=2;
-for(var cat=1;cat<=15;cat++){
-
-for(var nr=nrlower;nr<nrupper;nr++){
-category[32767+nr]=cat;
-bitcode[32767+nr]=[];
-bitcode[32767+nr][1]=cat;
-bitcode[32767+nr][0]=nr;
-}
-
-for(var nrneg=-(nrupper-1);nrneg<=-nrlower;nrneg++){
-category[32767+nrneg]=cat;
-bitcode[32767+nrneg]=[];
-bitcode[32767+nrneg][1]=cat;
-bitcode[32767+nrneg][0]=nrupper-1+nrneg;
-}
-nrlower<<=1;
-nrupper<<=1;
-}
-}
-
-function initRGBYUVTable(){
-for(var i=0;i<256;i++){
-RGB_YUV_TABLE[i]=19595*i;
-RGB_YUV_TABLE[i+256>>0]=38470*i;
-RGB_YUV_TABLE[i+512>>0]=7471*i+0x8000;
-RGB_YUV_TABLE[i+768>>0]=-11059*i;
-RGB_YUV_TABLE[i+1024>>0]=-21709*i;
-RGB_YUV_TABLE[i+1280>>0]=32768*i+0x807FFF;
-RGB_YUV_TABLE[i+1536>>0]=-27439*i;
-RGB_YUV_TABLE[i+1792>>0]=-5329*i;
-}
-}
-
-
-function writeBits(bs)
-{
-var value=bs[0];
-var posval=bs[1]-1;
-while(posval>=0){
-if(value&1<<posval){
-bytenew|=1<<bytepos;
-}
-posval--;
-bytepos--;
-if(bytepos<0){
-if(bytenew==0xFF){
-writeByte(0xFF);
-writeByte(0);
-}else
-{
-writeByte(bytenew);
-}
-bytepos=7;
-bytenew=0;
-}
-}
-}
-
-function writeByte(value)
-{
-
-byteout.push(value);
-}
-
-function writeWord(value)
-{
-writeByte(value>>8&0xFF);
-writeByte(value&0xFF);
-}
-
-
-function fDCTQuant(data,fdtbl)
-{
-var d0,d1,d2,d3,d4,d5,d6,d7;
-
-var dataOff=0;
-var i;
-const I8=8;
-const I64=64;
-for(i=0;i<I8;++i)
-{
-d0=data[dataOff];
-d1=data[dataOff+1];
-d2=data[dataOff+2];
-d3=data[dataOff+3];
-d4=data[dataOff+4];
-d5=data[dataOff+5];
-d6=data[dataOff+6];
-d7=data[dataOff+7];
-
-var tmp0=d0+d7;
-var tmp7=d0-d7;
-var tmp1=d1+d6;
-var tmp6=d1-d6;
-var tmp2=d2+d5;
-var tmp5=d2-d5;
-var tmp3=d3+d4;
-var tmp4=d3-d4;
-
-
-var tmp10=tmp0+tmp3;
-var tmp13=tmp0-tmp3;
-var tmp11=tmp1+tmp2;
-var tmp12=tmp1-tmp2;
-
-data[dataOff]=tmp10+tmp11;
-data[dataOff+4]=tmp10-tmp11;
-
-var z1=(tmp12+tmp13)*0.707106781;
-data[dataOff+2]=tmp13+z1;
-data[dataOff+6]=tmp13-z1;
-
-
-tmp10=tmp4+tmp5;
-tmp11=tmp5+tmp6;
-tmp12=tmp6+tmp7;
-
-
-var z5=(tmp10-tmp12)*0.382683433;
-var z2=0.541196100*tmp10+z5;
-var z4=1.306562965*tmp12+z5;
-var z3=tmp11*0.707106781;
-
-var z11=tmp7+z3;
-var z13=tmp7-z3;
-
-data[dataOff+5]=z13+z2;
-data[dataOff+3]=z13-z2;
-data[dataOff+1]=z11+z4;
-data[dataOff+7]=z11-z4;
-
-dataOff+=8;
-}
-
-
-dataOff=0;
-for(i=0;i<I8;++i)
-{
-d0=data[dataOff];
-d1=data[dataOff+8];
-d2=data[dataOff+16];
-d3=data[dataOff+24];
-d4=data[dataOff+32];
-d5=data[dataOff+40];
-d6=data[dataOff+48];
-d7=data[dataOff+56];
-
-var tmp0p2=d0+d7;
-var tmp7p2=d0-d7;
-var tmp1p2=d1+d6;
-var tmp6p2=d1-d6;
-var tmp2p2=d2+d5;
-var tmp5p2=d2-d5;
-var tmp3p2=d3+d4;
-var tmp4p2=d3-d4;
-
-
-var tmp10p2=tmp0p2+tmp3p2;
-var tmp13p2=tmp0p2-tmp3p2;
-var tmp11p2=tmp1p2+tmp2p2;
-var tmp12p2=tmp1p2-tmp2p2;
-
-data[dataOff]=tmp10p2+tmp11p2;
-data[dataOff+32]=tmp10p2-tmp11p2;
-
-var z1p2=(tmp12p2+tmp13p2)*0.707106781;
-data[dataOff+16]=tmp13p2+z1p2;
-data[dataOff+48]=tmp13p2-z1p2;
-
-
-tmp10p2=tmp4p2+tmp5p2;
-tmp11p2=tmp5p2+tmp6p2;
-tmp12p2=tmp6p2+tmp7p2;
-
-
-var z5p2=(tmp10p2-tmp12p2)*0.382683433;
-var z2p2=0.541196100*tmp10p2+z5p2;
-var z4p2=1.306562965*tmp12p2+z5p2;
-var z3p2=tmp11p2*0.707106781;
-
-var z11p2=tmp7p2+z3p2;
-var z13p2=tmp7p2-z3p2;
-
-data[dataOff+40]=z13p2+z2p2;
-data[dataOff+24]=z13p2-z2p2;
-data[dataOff+8]=z11p2+z4p2;
-data[dataOff+56]=z11p2-z4p2;
-
-dataOff++;
-}
-
-
-var fDCTQuant;
-for(i=0;i<I64;++i)
-{
-
-fDCTQuant=data[i]*fdtbl[i];
-outputfDCTQuant[i]=fDCTQuant>0.0?fDCTQuant+0.5|0:fDCTQuant-0.5|0;
-
-
-}
-return outputfDCTQuant;
-}
-
-function writeAPP0()
-{
-writeWord(0xFFE0);
-writeWord(16);
-writeByte(0x4A);
-writeByte(0x46);
-writeByte(0x49);
-writeByte(0x46);
-writeByte(0);
-writeByte(1);
-writeByte(1);
-writeByte(0);
-writeWord(1);
-writeWord(1);
-writeByte(0);
-writeByte(0);
-}
-
-function writeSOF0(width,height)
-{
-writeWord(0xFFC0);
-writeWord(17);
-writeByte(8);
-writeWord(height);
-writeWord(width);
-writeByte(3);
-writeByte(1);
-writeByte(0x11);
-writeByte(0);
-writeByte(2);
-writeByte(0x11);
-writeByte(1);
-writeByte(3);
-writeByte(0x11);
-writeByte(1);
-}
-
-function writeDQT()
-{
-writeWord(0xFFDB);
-writeWord(132);
-writeByte(0);
-for(var i=0;i<64;i++){
-writeByte(YTable[i]);
-}
-writeByte(1);
-for(var j=0;j<64;j++){
-writeByte(UVTable[j]);
-}
-}
-
-function writeDHT()
-{
-writeWord(0xFFC4);
-writeWord(0x01A2);
-
-writeByte(0);
-for(var i=0;i<16;i++){
-writeByte(std_dc_luminance_nrcodes[i+1]);
-}
-for(var j=0;j<=11;j++){
-writeByte(std_dc_luminance_values[j]);
-}
-
-writeByte(0x10);
-for(var k=0;k<16;k++){
-writeByte(std_ac_luminance_nrcodes[k+1]);
-}
-for(var l=0;l<=161;l++){
-writeByte(std_ac_luminance_values[l]);
-}
-
-writeByte(1);
-for(var m=0;m<16;m++){
-writeByte(std_dc_chrominance_nrcodes[m+1]);
-}
-for(var n=0;n<=11;n++){
-writeByte(std_dc_chrominance_values[n]);
-}
-
-writeByte(0x11);
-for(var o=0;o<16;o++){
-writeByte(std_ac_chrominance_nrcodes[o+1]);
-}
-for(var p=0;p<=161;p++){
-writeByte(std_ac_chrominance_values[p]);
-}
-}
-
-function writeSOS()
-{
-writeWord(0xFFDA);
-writeWord(12);
-writeByte(3);
-writeByte(1);
-writeByte(0);
-writeByte(2);
-writeByte(0x11);
-writeByte(3);
-writeByte(0x11);
-writeByte(0);
-writeByte(0x3f);
-writeByte(0);
-}
-
-function processDU(CDU,fdtbl,DC,HTDC,HTAC){
-var EOB=HTAC[0x00];
-var M16zeroes=HTAC[0xF0];
-var pos;
-const I16=16;
-const I63=63;
-const I64=64;
-var DU_DCT=fDCTQuant(CDU,fdtbl);
-
-for(var j=0;j<I64;++j){
-DU[ZigZag[j]]=DU_DCT[j];
-}
-var Diff=DU[0]-DC;DC=DU[0];
-
-if(Diff==0){
-writeBits(HTDC[0]);
-}else{
-pos=32767+Diff;
-writeBits(HTDC[category[pos]]);
-writeBits(bitcode[pos]);
-}
-
-var end0pos=63;
-for(;end0pos>0&&DU[end0pos]==0;end0pos--){};
-
-if(end0pos==0){
-writeBits(EOB);
-return DC;
-}
-var i=1;
-var lng;
-while(i<=end0pos){
-var startpos=i;
-for(;DU[i]==0&&i<=end0pos;++i){}
-var nrzeroes=i-startpos;
-if(nrzeroes>=I16){
-lng=nrzeroes>>4;
-for(var nrmarker=1;nrmarker<=lng;++nrmarker)
-writeBits(M16zeroes);
-nrzeroes=nrzeroes&0xF;
-}
-pos=32767+DU[i];
-writeBits(HTAC[(nrzeroes<<4)+category[pos]]);
-writeBits(bitcode[pos]);
-i++;
-}
-if(end0pos!=I63){
-writeBits(EOB);
-}
-return DC;
-}
-
-function initCharLookupTable(){
-var sfcc=String.fromCharCode;
-for(var i=0;i<256;i++){
-clt[i]=sfcc(i);
-}
-}
-
-this.encode=function(image,quality)
-{
-var time_start=new Date().getTime();
-
-if(quality)setQuality(quality);
-
-
-byteout=new Array();
-bytenew=0;
-bytepos=7;
-
-
-writeWord(0xFFD8);
-writeAPP0();
-writeDQT();
-writeSOF0(image.width,image.height);
-writeDHT();
-writeSOS();
-
-
-
-var DCY=0;
-var DCU=0;
-var DCV=0;
-
-bytenew=0;
-bytepos=7;
-
-
-this.encode.displayName="_encode_";
-
-var imageData=image.data;
-var width=image.width;
-var height=image.height;
-
-var quadWidth=width*4;
-var tripleWidth=width*3;
-
-var x,y=0;
-var r,g,b;
-var start,p,col,row,pos;
-while(y<height){
-x=0;
-while(x<quadWidth){
-start=quadWidth*y+x;
-p=start;
-col=-1;
-row=0;
-
-for(pos=0;pos<64;pos++){
-row=pos>>3;
-col=(pos&7)*4;
-p=start+row*quadWidth+col;
-
-if(y+row>=height){
-p-=quadWidth*(y+1+row-height);
-}
-
-if(x+col>=quadWidth){
-p-=x+col-quadWidth+4;
-}
-
-r=imageData[p++];
-g=imageData[p++];
-b=imageData[p++];
-
-
-
-
-
-
-
-
-
-YDU[pos]=(RGB_YUV_TABLE[r]+RGB_YUV_TABLE[g+256>>0]+RGB_YUV_TABLE[b+512>>0]>>16)-128;
-UDU[pos]=(RGB_YUV_TABLE[r+768>>0]+RGB_YUV_TABLE[g+1024>>0]+RGB_YUV_TABLE[b+1280>>0]>>16)-128;
-VDU[pos]=(RGB_YUV_TABLE[r+1280>>0]+RGB_YUV_TABLE[g+1536>>0]+RGB_YUV_TABLE[b+1792>>0]>>16)-128;
-
-}
-
-DCY=processDU(YDU,fdtbl_Y,DCY,YDC_HT,YAC_HT);
-DCU=processDU(UDU,fdtbl_UV,DCU,UVDC_HT,UVAC_HT);
-DCV=processDU(VDU,fdtbl_UV,DCV,UVDC_HT,UVAC_HT);
-x+=32;
-}
-y+=8;
-}
-
-
-
-
-
-if(bytepos>=0){
-var fillbits=[];
-fillbits[1]=bytepos+1;
-fillbits[0]=(1<<bytepos+1)-1;
-writeBits(fillbits);
-}
-
-writeWord(0xFFD9);
-
-
-return new Buffer(byteout);
-
-var jpegDataUri='data:image/jpeg;base64,'+btoa(byteout.join(''));
-
-byteout=[];
-
-
-var duration=new Date().getTime()-time_start;
-
-
-
-return jpegDataUri;
-};
-
-function setQuality(quality){
-if(quality<=0){
-quality=1;
-}
-if(quality>100){
-quality=100;
-}
-
-if(currentQuality==quality)return;
-
-var sf=0;
-if(quality<50){
-sf=Math.floor(5000/quality);
-}else{
-sf=Math.floor(200-quality*2);
-}
-
-initQuantTables(sf);
-currentQuality=quality;
-
-}
-
-function init(){
-var time_start=new Date().getTime();
-if(!quality)quality=50;
-
-initCharLookupTable();
-initHuffmanTbl();
-initCategoryNumber();
-initRGBYUVTable();
-
-setQuality(quality);
-var duration=new Date().getTime()-time_start;
-
-}
-
-init();
-
-};
-module.exports=encode;
-
-function encode(imgData,qu){
-if(typeof qu==='undefined')qu=50;
-var encoder=new JPEGEncoder(qu);
-var data=encoder.encode(imgData,qu);
-return{
-data:data,
-width:imgData.width,
-height:imgData.height};
-
-}
-
-
-function getImageDataFromImage(idOrElement){
-var theImg=typeof idOrElement=='string'?document.getElementById(idOrElement):idOrElement;
-var cvs=document.createElement('canvas');
-cvs.width=theImg.width;
-cvs.height=theImg.height;
-var ctx=cvs.getContext("2d");
-ctx.drawImage(theImg,0,0);
-
-return ctx.getImageData(0,0,cvs.width,cvs.height);
-}
-
-}).call(this,require("buffer").Buffer);
-},{"buffer":102}],125:[function(require,module,exports){
-(function(process){
-
-
-
-
-
-'use strict';
-
-const debug=require('debug');
-const marky=require('marky');
-
-const EventEmitter=require('events').EventEmitter;
-const isWindows=process.platform==='win32';
-
-
-const isBrowser=process.browser;
-
-const colors={
-red:isBrowser?'crimson':1,
-yellow:isBrowser?'gold':3,
-cyan:isBrowser?'darkturquoise':6,
-green:isBrowser?'forestgreen':2,
-blue:isBrowser?'steelblue':4,
-magenta:isBrowser?'palevioletred':5};
-
-
-
-debug.colors=[colors.cyan,colors.green,colors.blue,colors.magenta];
-
-class Emitter extends EventEmitter{
-
-
-
-
-
-
-issueStatus(title,argsArray){
-if(title==='status'||title==='statusEnd'){
-this.emit(title,[title,...argsArray]);
-}
-}
-
-
-
-
-
-
-
-issueWarning(title,argsArray){
-this.emit('warning',[title,...argsArray]);
-}}
-
-
-const loggersByTitle={};
-const loggingBufferColumns=25;
-let level_;
-
-class Log{
-static _logToStdErr(title,argsArray){
-const log=Log.loggerfn(title);
-log(...argsArray);
-}
-
-static loggerfn(title){
-let log=loggersByTitle[title];
-if(!log){
-log=debug(title);
-loggersByTitle[title]=log;
-
-if(title.endsWith('error')){
-log.color=colors.red;
-}else if(title.endsWith('warn')){
-log.color=colors.yellow;
-}
-}
-return log;
-}
-
-
-
-
-static setLevel(level){
-level_=level;
-switch(level){
-case'silent':
-debug.enable('-*');
-break;
-case'verbose':
-debug.enable('*');
-break;
-case'error':
-debug.enable('-*, *:error');
-break;
-default:
-debug.enable('*, -*:verbose');}
-
-}
-
-
-
-
-
-
-
-static formatProtocol(prefix,data,level){
-const columns=!process||process.browser?Infinity:process.stdout.columns;
-const method=data.method||'?????';
-const maxLength=columns-method.length-prefix.length-loggingBufferColumns;
-
-const snippet=data.params&&method!=='IO.read'?
-JSON.stringify(data.params).substr(0,maxLength):'';
-Log._logToStdErr(`${prefix}:${level||''}`,[method,snippet]);
-}
-
-
-
-
-static isVerbose(){
-return level_==='verbose';
-}
-
-static time({msg,id,args=[]},level='log'){
-marky.mark(id);
-Log[level]('status',msg,...args);
-}
-
-static timeEnd({msg,id,args=[]},level='verbose'){
-Log[level]('statusEnd',msg,...args);
-marky.stop(id);
-}
-
-static log(title,...args){
-Log.events.issueStatus(title,args);
-return Log._logToStdErr(title,args);
-}
-
-static warn(title,...args){
-Log.events.issueWarning(title,args);
-return Log._logToStdErr(`${title}:warn`,args);
-}
-
-static error(title,...args){
-return Log._logToStdErr(`${title}:error`,args);
-}
-
-static verbose(title,...args){
-Log.events.issueStatus(title,args);
-return Log._logToStdErr(`${title}:verbose`,args);
-}
-
-
-
-
-
-
-static greenify(str){
-return`${Log.green}${str}${Log.reset}`;
-}
-
-
-
-
-
-
-static redify(str){
-return`${Log.red}${str}${Log.reset}`;
-}
-
-static get green(){
-return'\x1B[32m';
-}
-
-static get red(){
-return'\x1B[31m';
-}
-
-static get yellow(){
-return'\x1b[33m';
-}
-
-static get purple(){
-return'\x1b[95m';
-}
-
-static get reset(){
-return'\x1B[0m';
-}
-
-static get bold(){
-return'\x1b[1m';
-}
-
-static get dim(){
-return'\x1b[2m';
-}
-
-static get tick(){
-return isWindows?'\u221A':'✓';
-}
-
-static get cross(){
-return isWindows?'\u00D7':'✘';
-}
-
-static get whiteSmallSquare(){
-return isWindows?'\u0387':'▫';
-}
-
-static get heavyHorizontal(){
-return isWindows?'\u2500':'━';
-}
-
-static get heavyVertical(){
-return isWindows?'\u2502 ':'┃ ';
-}
-
-static get heavyUpAndRight(){
-return isWindows?'\u2514':'┗';
-}
-
-static get heavyVerticalAndRight(){
-return isWindows?'\u251C':'┣';
-}
-
-static get heavyDownAndHorizontal(){
-return isWindows?'\u252C':'┳';
-}
-
-static get doubleLightHorizontal(){
-return'──';
-}}
-
-
-Log.events=new Emitter();
-Log.takeTimeEntries=()=>{
-const entries=marky.getEntries();
-marky.clear();
-return entries;
-};
-Log.getTimeEntries=()=>marky.getEntries();
-
-module.exports=Log;
-
-}).call(this,require('_process'));
-},{"_process":158,"debug":106,"events":108,"marky":144}],126:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const BaseNode=require('lighthouse/lighthouse-core/lib/dependency-graph/base-node.js');
-
-const CpuNode=require('lighthouse/lighthouse-core/lib/dependency-graph/cpu-node.js');
-
-const LanternMetric=require('lighthouse/lighthouse-core/computed/metrics/lantern-metric');
-
-const NetworkNode=require('lighthouse/lighthouse-core/lib/dependency-graph/network-node.js');
-const{isBidRelatedRequest,isImpressionPing,isGoogleAds,isGptAdRequest}=require('../utils/resource-classification');
-const{URL}=require('url');
-
-
-
-
-
-
-
-
-
-function getFrame(event){
-
-return event.args.frame||event.args.data&&event.args.data.frame||null;
-}
-
-
-
-
-
-
-function getCpuNodeUrls(cpuNode){
-const results=new Set();
-for(const{args}of cpuNode.childEvents){
-if(args.data&&args.data.url){
-results.add(args.data.url);
-}
-}
-return Array.from(results);
-}
-
-
-
-
-
-
-function isAdTask(cpuNode){
-return!!getCpuNodeUrls(cpuNode).find(
-url=>isBidRelatedRequest(url)||isGoogleAds(new URL(url)));
-}
-
-
-
-
-
-
-function isLongTask(cpuNode){
-
-
-return cpuNode.event.dur>50*1000;
-}
-
-
-
-
-
-function addEdges(graph){
-const adRequestNodes=[];
-graph.traverse(node=>{
-if(node.type===BaseNode.TYPES.NETWORK&&isGptAdRequest(node.record)){
-adRequestNodes.push(node);
-}
-});
-graph.traverse(node=>{
-if(node.type!==BaseNode.TYPES.NETWORK){
-return;
-}
-if(isBidRelatedRequest(node.record)){
-for(const adNode of adRequestNodes){
-
-
-if(adNode.record.startTime>=node.record.endTime){
-node.addDependent(adNode);
-}
-}
-}
-if(isImpressionPing(node.record.url)){
-for(const adNode of adRequestNodes){
-if(adNode.record.endTime>node.record.startTime){
-continue;
-}
-adNode.addDependent(node);
-for(const dependent of adNode.getDependents()){
-if(dependent.endTime<=node.startTime){
-dependent.addDependency(node);
-}
-}
-}
-}
-});
-}
-
-
-class AdLanternMetric extends LanternMetric{
-
-
-
-
-static get COEFFICIENTS(){
-return{
-intercept:0,
-
-optimistic:1,
-pessimistic:0};
-
-}
-
-
-
-
-
-
-
-static getPessimisticGraph(graph){
-
-const pessimisticGraph=graph.cloneWithRelationships(_=>true);
-addEdges(pessimisticGraph);
-return pessimisticGraph;
-}
-
-
-
-
-
-
-
-static getOptimisticGraph(graph){
-
-const mainFrame=graph.record.frameId;
-const pessimisticGraph=AdLanternMetric.getPessimisticGraph(graph);
-
-const optimisticGraph=pessimisticGraph.cloneWithRelationships(node=>{
-if(node.type===BaseNode.TYPES.CPU){
-return(
-isLongTask(node)||
-isAdTask(node)||
-!!getFrame(node.event)&&getFrame(node.event)!==mainFrame);
-}
-if(node.hasRenderBlockingPriority()){
-return true;
-}
-const url=node.record.url;
-return isBidRelatedRequest(url)||isGoogleAds(new URL(url));
-});
-return optimisticGraph;
-}
-
-
-
-
-
-
-
-static getEstimateFromSimulation(simulationResult,extras){
-throw new Error(
-'getEstimateFromSimulation not implemented by '+this.name);
-}
-
-
-
-
-
-
-static findTiming(nodeTimings,isTargetNode){
-let leastTiming={startTime:Infinity,endTime:-Infinity,duration:0};
-for(const[node,timing]of nodeTimings.entries()){
-if(isTargetNode(node,timing)&&
-leastTiming.startTime>timing.startTime){
-leastTiming=timing;
-}
-}
-return leastTiming;
-}
-
-
-
-
-
-
-static findNetworkTiming(nodeTimings,isTargetRequest){
-return this.findTiming(
-nodeTimings,
-node=>
-node.type===BaseNode.TYPES.NETWORK&&isTargetRequest(node.record));
-}}
-
-
-module.exports=AdLanternMetric;
-
-},{"../utils/resource-classification":140,"lighthouse/lighthouse-core/computed/metrics/lantern-metric":25,"lighthouse/lighthouse-core/lib/dependency-graph/base-node.js":57,"lighthouse/lighthouse-core/lib/dependency-graph/cpu-node.js":58,"lighthouse/lighthouse-core/lib/dependency-graph/network-node.js":59,"url":"url"}],127:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const AdLanternMetric=require('./ad-lantern-metric');
-
-const ComputedMetric=require('lighthouse/lighthouse-core/computed/metrics/metric');
-
-const makeComputedArtifact=require('lighthouse/lighthouse-core/computed/computed-artifact');
-const{getPageStartTime,getImpressionStartTime}=require('../utils/network-timing');
-const{isImpressionPing}=require('../utils/resource-classification');
-
-
-
-
-
-
-class LanternAdRenderTime extends AdLanternMetric{
-
-
-
-
-
-
-static getEstimateFromSimulation(simulationResult,extras){
-const{nodeTimings}=simulationResult;
-const timeInMs=AdLanternMetric.findNetworkTiming(
-nodeTimings,
-req=>!!req.url&&isImpressionPing(new URL(req.url))).startTime;
-return{timeInMs,nodeTimings};
-}}
-
-
-
-
-
-LanternAdRenderTime=makeComputedArtifact(LanternAdRenderTime);
-
-
-class AdRenderTime extends ComputedMetric{
-
-
-
-
-
-
-static async computeSimulatedMetric(data,context){
-
-return LanternAdRenderTime.request(data,context);
-}
-
-
-
-
-
-
-
-static async computeObservedMetric(data,context){
-const{networkRecords}=data;
-const pageStartTime=getPageStartTime(networkRecords);
-const impressionStartTime=getImpressionStartTime(networkRecords);
-const firstPaintMs=(impressionStartTime-pageStartTime)*1000;
-return Promise.resolve({timing:firstPaintMs});
-}}
-
-
-
-
-
-AdRenderTime=makeComputedArtifact(AdRenderTime);
-
-module.exports=AdRenderTime;
-
-
-},{"../utils/network-timing":138,"../utils/resource-classification":140,"./ad-lantern-metric":126,"lighthouse/lighthouse-core/computed/computed-artifact":8,"lighthouse/lighthouse-core/computed/metrics/metric":30}],128:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const AdLanternMetric=require('./ad-lantern-metric');
-
-const ComputedMetric=require('lighthouse/lighthouse-core/computed/metrics/metric');
-
-const makeComputedArtifact=require('lighthouse/lighthouse-core/computed/computed-artifact');
-const{getAdStartTime,getPageStartTime}=require('../utils/network-timing');
-const{isAdRequest}=require('../utils/resource-classification');
-
-
-
-
-
-
-class LanternAdRequestTime extends AdLanternMetric{
-
-
-
-
-
-
-static getEstimateFromSimulation(simulationResult,extras){
-const{nodeTimings}=simulationResult;
-const timeInMs=AdLanternMetric.findNetworkTiming(
-nodeTimings,isAdRequest).startTime;
-return{timeInMs,nodeTimings};
-}}
-
-
-
-
-
-LanternAdRequestTime=makeComputedArtifact(LanternAdRequestTime);
-
-
-class AdRequestTime extends ComputedMetric{
-
-
-
-
-
-
-static async computeSimulatedMetric(data,context){
-
-return LanternAdRequestTime.request(data,context);
-}
-
-
-
-
-
-
-static async computeObservedMetric(data){
-const{networkRecords}=data;
-const pageStartTime=getPageStartTime(networkRecords);
-const adStartTime=getAdStartTime(networkRecords);
-const adRequestTimeMs=(adStartTime-pageStartTime)*1000;
-return Promise.resolve({timing:adRequestTimeMs});
-}}
-
-
-
-
-
-AdRequestTime=makeComputedArtifact(AdRequestTime);
-
-module.exports=AdRequestTime;
-
-},{"../utils/network-timing":138,"../utils/resource-classification":140,"./ad-lantern-metric":126,"lighthouse/lighthouse-core/computed/computed-artifact":8,"lighthouse/lighthouse-core/computed/metrics/metric":30}],129:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const AdLanternMetric=require('./ad-lantern-metric');
-
-const ComputedMetric=require('lighthouse/lighthouse-core/computed/metrics/metric');
-
-const makeComputedArtifact=require('lighthouse/lighthouse-core/computed/computed-artifact');
-const{getBidStartTime,getPageStartTime}=require('../utils/network-timing');
-const{isBidRequest}=require('../utils/resource-classification');
-
-
-
-
-
-
-class LanternBidRequestTime extends AdLanternMetric{
-
-
-
-
-
-
-static getEstimateFromSimulation(simulationResult,extras){
-const{nodeTimings}=simulationResult;
-const timeInMs=AdLanternMetric.findNetworkTiming(
-nodeTimings,isBidRequest).startTime;
-return{timeInMs,nodeTimings};
-}}
-
-
-
-
-
-LanternBidRequestTime=makeComputedArtifact(LanternBidRequestTime);
-
-
-class BidRequestTime extends ComputedMetric{
-
-
-
-
-
-
-static async computeSimulatedMetric(data,context){
-
-return LanternBidRequestTime.request(data,context);
-}
-
-
-
-
-
-
-static async computeObservedMetric(data){
-const{networkRecords}=data;
-const pageStartTime=getPageStartTime(networkRecords);
-const bidStartTime=getBidStartTime(networkRecords);
-const bidRequestTimeMs=(bidStartTime-pageStartTime)*1000;
-return Promise.resolve({timing:bidRequestTimeMs});
-}}
-
-
-
-
-
-BidRequestTime=makeComputedArtifact(BidRequestTime);
-
-module.exports=BidRequestTime;
-
-},{"../utils/network-timing":138,"../utils/resource-classification":140,"./ad-lantern-metric":126,"lighthouse/lighthouse-core/computed/computed-artifact":8,"lighthouse/lighthouse-core/computed/metrics/metric":30}],130:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const AdLanternMetric=require('../computed/ad-lantern-metric');
-const BaseNode=require('lighthouse/lighthouse-core/lib/dependency-graph/base-node.js');
-
-const ComputedMetric=require('lighthouse/lighthouse-core/computed/metrics/metric');
-
-const CpuNode=require('lighthouse/lighthouse-core/lib/dependency-graph/cpu-node.js');
-const{getAttributableUrl}=require('../utils/tasks');
-
-const LoadSimulator=require('lighthouse/lighthouse-core/computed/load-simulator');
-const MainThreadTasks=require('lighthouse/lighthouse-core/computed/main-thread-tasks');
-
-const makeComputedArtifact=require('lighthouse/lighthouse-core/computed/computed-artifact');
-
-const NetworkNode=require('lighthouse/lighthouse-core/lib/dependency-graph/network-node.js');
-const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
-const PageDependencyGraph=require('lighthouse/lighthouse-core/computed/page-dependency-graph');
-
-const LONG_TASK_THRESHOLD_MS=50;
-
-
-
-
-
-
-function isLong(task,knownScripts){
-if(task.duration<LONG_TASK_THRESHOLD_MS){
-return false;
-}
-const script=getAttributableUrl(task,knownScripts);
-if(!script){
-return false;
-}
-if(task.parent){
-
-
-const parentScript=getAttributableUrl(task.parent,knownScripts);
-return script!=parentScript;
-}
-return true;
-}
-
-
-class LongTasks extends ComputedMetric{
-
-
-
-
-
-
-static async getSimulationGraph(trace,devtoolsLog,context){
-
-const documentNode=
-
-await PageDependencyGraph.request({trace,devtoolsLog},context);
-return AdLanternMetric.getOptimisticGraph(documentNode);
-}
-
-
-
-
-
-
-
-static async computeSimulatedResult(trace,devtoolsLog,context){
-const graph=await this.getSimulationGraph(trace,devtoolsLog,context);
-const simulator=await LoadSimulator.request(
-{devtoolsLog,settings:context.settings},context);
-const{nodeTimings}=simulator.simulate(graph,{});
-
-const tasks=[];
-for(const[node,timing]of nodeTimings.entries()){
-if(node.type!==BaseNode.TYPES.CPU||
-timing.duration<LONG_TASK_THRESHOLD_MS){
-continue;
-}
-tasks.push({
-event:node.event,
-startTime:timing.startTime,
-endTime:timing.endTime,
-duration:timing.duration,
-selfTime:timing.duration,
-attributableURLs:Array.from(node.getEvaluateScriptURLs()),
-children:[]});
-
-}
-return tasks;
-}
-
-
-
-
-
-
-
-static async computeObservedResult(trace,devtoolsLog,context){
-const tasks=await MainThreadTasks.request(trace,context);
-const networkRecords=await NetworkRecords.request(devtoolsLog,context);
-
-const knownScripts=new Set(networkRecords.
-filter(record=>record.resourceType==='Script').
-map(record=>record.url));
-return tasks.filter(t=>isLong(t,knownScripts));
-}
-
-
-
-
-
-
-static async compute_({trace,devtoolsLog},context){
-return context.settings.throttlingMethod=='simulate'?
-this.computeSimulatedResult(trace,devtoolsLog,context):
-this.computeObservedResult(trace,devtoolsLog,context);
-}}
-
-
-
-
-
-LongTasks=makeComputedArtifact(LongTasks);
-
-module.exports=LongTasks;
-
-},{"../computed/ad-lantern-metric":126,"../utils/tasks":141,"lighthouse/lighthouse-core/computed/computed-artifact":8,"lighthouse/lighthouse-core/computed/load-simulator":10,"lighthouse/lighthouse-core/computed/main-thread-tasks":12,"lighthouse/lighthouse-core/computed/metrics/metric":30,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/computed/page-dependency-graph":35,"lighthouse/lighthouse-core/lib/dependency-graph/base-node.js":57,"lighthouse/lighthouse-core/lib/dependency-graph/cpu-node.js":58,"lighthouse/lighthouse-core/lib/dependency-graph/network-node.js":59}],131:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const AdLanternMetric=require('./ad-lantern-metric');
-
-const ComputedMetric=require('lighthouse/lighthouse-core/computed/metrics/metric');
-
-const makeComputedArtifact=require('lighthouse/lighthouse-core/computed/computed-artifact');
-const{getPageStartTime,getTagEndTime}=require('../utils/network-timing');
-const{isImplTag}=require('../utils/resource-classification');
-const{URL}=require('url');
-
-
-
-
-
-
-class LanternTagLoadTime extends AdLanternMetric{
-
-
-
-
-
-
-static getEstimateFromSimulation(simulationResult,extras){
-const{nodeTimings}=simulationResult;
-const timeInMs=AdLanternMetric.findNetworkTiming(
-nodeTimings,req=>!!req.url&&isImplTag(new URL(req.url))).endTime;
-return{timeInMs,nodeTimings};
-}}
-
-
-
-
-
-LanternTagLoadTime=makeComputedArtifact(LanternTagLoadTime);
-
-
-class TagLoadTime extends ComputedMetric{
-
-
-
-
-
-
-static async computeSimulatedMetric(data,context){
-
-return LanternTagLoadTime.request(data,context);
-}
-
-
-
-
-
-
-
-static async computeObservedMetric(data,context){
-const{networkRecords}=data;
-const pageStartTime=getPageStartTime(networkRecords);
-const tagEndTime=getTagEndTime(networkRecords);
-const tagLoadMs=(tagEndTime-pageStartTime)*1000;
-return Promise.resolve({timing:tagLoadMs});
-}}
-
-
-
-
-
-TagLoadTime=makeComputedArtifact(TagLoadTime);
-
-module.exports=TagLoadTime;
-
-
-},{"../utils/network-timing":138,"../utils/resource-classification":140,"./ad-lantern-metric":126,"lighthouse/lighthouse-core/computed/computed-artifact":8,"lighthouse/lighthouse-core/computed/metrics/metric":30,"url":"url"}],132:[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const UIStrings={
-GROUPS__METRICS:'Metrics',
-GROUPS__ADS_PERFORMANCE:'Ad Speed',
-GROUPS__ADS_BEST_PRACTICES:'Tag Best Practices',
-
-NOT_APPLICABLE__DEFAULT:'Audit not applicable',
-NOT_APPLICABLE__INVALID_TIMING:'Invalid timing task data',
-NOT_APPLICABLE__NO_AD_RELATED_REQ:'No ad-related requests',
-NOT_APPLICABLE__NO_AD_RENDERED:'No ads rendered',
-NOT_APPLICABLE__NO_ADS_VIEWPORT:'No ads in viewport',
-NOT_APPLICABLE__NO_ADS:'No ads requested',
-NOT_APPLICABLE__NO_BIDS:'No bids detected',
-NOT_APPLICABLE__NO_EVENT_MATCHING_REQ:'No event matches network records',
-NOT_APPLICABLE__NO_GPT:'GPT not requested',
-NOT_APPLICABLE__NO_RECORDS:'No successful network records',
-NOT_APPLICABLE__NO_VISIBLE_SLOTS:'No visible slots',
-NOT_APPLICABLE__NO_TAG:'No tag requested',
-NOT_APPLICABLE__NO_TAGS:'No tags requested',
-NOT_APPLICABLE__NO_TASKS:'No tasks to compare',
-NOT_APPLICABLE__NO_VALID_AD_WIDTHS:'No requested ads contain ads of valid width',
-
-ERRORS__AREA_LARGER_THAN_VIEWPORT:'Calculated ad area is larger than viewport',
-ERRORS__VIEWPORT_AREA_ZERO:'Viewport area is zero',
-
-WARNINGS__NO_ADS:'No ads were requested when fetching this page.',
-WARNINGS__NO_AD_RENDERED:'No ads were rendered when rendering this page.',
-WARNINGS__NO_TAG:'The GPT tag was not requested.'};
-
-const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-
-const notApplicableObj=message=>({
-notApplicable:true,
-score:1,
-displayValue:str_(message)});
-
-
-
-
-
-
-const auditNotApplicable={
-Default:notApplicableObj(UIStrings.NOT_APPLICABLE__DEFAULT),
-InvalidTiming:notApplicableObj(UIStrings.NOT_APPLICABLE__INVALID_TIMING),
-NoAdRelatedReq:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_AD_RELATED_REQ),
-NoAdRendered:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_AD_RENDERED),
-NoAdsViewport:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_ADS_VIEWPORT),
-NoAds:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_ADS),
-NoBids:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_BIDS),
-NoEventMatchingReq:notApplicableObj(
-UIStrings.NOT_APPLICABLE__NO_EVENT_MATCHING_REQ),
-NoGpt:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_GPT),
-NoRecords:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_RECORDS),
-NoVisibleSlots:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_VISIBLE_SLOTS),
-NoTag:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_TAG),
-NoTags:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_TAGS),
-NoTasks:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_TASKS),
-NoValidAdWidths:notApplicableObj(
-UIStrings.NOT_APPLICABLE__NO_VALID_AD_WIDTHS)};
-
-
-const runWarning={
-NoAds:str_(UIStrings.WARNINGS__NO_ADS),
-NoAdRendered:str_(UIStrings.WARNINGS__NO_AD_RENDERED),
-NoTag:str_(UIStrings.WARNINGS__NO_TAG)};
-
-
-const auditError={
-AreaLargerThanViewport:str_(UIStrings.ERRORS__AREA_LARGER_THAN_VIEWPORT),
-ViewportAreaZero:str_(UIStrings.ERRORS__VIEWPORT_AREA_ZERO)};
-
-
-const group={
-Metrics:str_(UIStrings.GROUPS__METRICS),
-AdsPerformance:str_(UIStrings.GROUPS__ADS_PERFORMANCE),
-AdsBestPractices:str_(UIStrings.GROUPS__ADS_BEST_PRACTICES)};
-
-
-module.exports={auditNotApplicable,runWarning,auditError,group};
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/messages/common-strings.js");
-},{"lighthouse/lighthouse-core/lib/i18n/i18n":66}],133:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function count(arr,pred){
-let num=0;
-for(const el of arr){
-if(pred(el)){
-num++;
-}
-}
-return num;
-}
-
-
-
-
-
-
-
-
-
-
-function bucket(array,splitter){
-
-const buckets=new Map();
-for(const element of array){
-const result=splitter(element);
-if(result!=null){
-
-
-const bucket=buckets.get(result)||[];
-bucket.push(element);
-buckets.set(result,bucket);
-}
-}
-return buckets;
-}
-
-
-
-
-
-
-
-function flatten(arrs){
-const result=[];
-for(const arr of arrs){
-result.push(...arr);
-}
-return result;
-}
-
-module.exports={
-count,bucket,flatten};
-
-
-},{}],134:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function assert(x){
-if(x==null)throw new Error('Expected not to be null');
-return x;
-}
-
-module.exports={
-assert};
-
-
-},{}],135:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-module.exports=[
-{
-label:'Prebid JS',
-patterns:[
-`^https?://([^.]*.)?prebid[.]org/.*`,
-'^https?://acdn[.]adnxs[.]com/prebid/.*']},
-
-
-{
-label:'33Across',
-patterns:[
-'^https?://ssc[.]33across.com/api/.*']},
-
-
-{
-label:'AppNexus',
-patterns:[
-'^https?://ib[.]adnxs[.]com/.*']},
-
-
-{
-label:'Amazon',
-patterns:[
-'^https?://[a-z-_.]*[.]amazon-adsystem[.]com/.*bid.*']},
-
-
-{
-label:'AdTechus (AOL)',
-patterns:[
-'^https?://([^.]*.)?adserver[.]adtechus[.]com/.*']},
-
-
-{
-label:'Aardvark',
-patterns:[
-'^https?://thor[.]rtk[.]io/.*']},
-
-
-{
-label:'AdBlade',
-patterns:[
-'^https?://rtb[.]adblade[.]com/prebidjs/bid.*']},
-
-
-{
-label:'AdBund',
-patterns:[
-'^https?://us-east-engine[.]adbund[.]xyz/prebid/ad/get.*',
-'^https?://us-west-engine[.]adbund[.]xyz/prebid/ad/get.*']},
-
-
-{
-label:'AdButler',
-patterns:[
-'^https?://servedbyadbutler[.]com/adserve.*']},
-
-
-{
-label:'Adequant',
-patterns:[
-'^https?://rex[.]adequant[.]com/rex/c2s_prebid.*']},
-
-
-{
-label:'AdForm',
-patterns:[
-'^https?://adx[.]adform[.]net/adx.*']},
-
-
-{
-label:'AdMedia',
-patterns:[
-'^https?://b[.]admedia[.]com/banner/prebid/bidder.*']},
-
-
-{
-label:'AdMixer',
-patterns:[
-'^https?://inv-nets[.]admixer[.]net/prebid[.]aspx.*',
-'^https?://inv-nets[.]admixer[.]net/videoprebid[.]aspx.*']},
-
-
-{
-label:'AOL',
-patterns:[
-'^https?://adserver-us[.]adtech[.]advertising[.]com.*',
-'^https?://adserver-eu[.]adtech[.]advertising[.]com.*',
-'^https?://adserver-as[.]adtech[.]advertising[.]com.*',
-'^https?://adserver[.]adtech[.]de/pubapi/.*']},
-
-
-{
-label:'Beachfront',
-patterns:[
-'^https?://reachms[.]bfmio[.]com/bid[.]json?exchange_id=.*']},
-
-
-{
-label:'Bidfluence',
-patterns:[
-'^https?://cdn[.]bidfluence[.]com/forge[.]js.*']},
-
-
-{
-label:'Brightcom',
-patterns:[
-'^https?://hb[.]iselephant[.]com/auc/ortb.*']},
-
-
-{
-label:'C1x',
-patterns:[
-'^https?://ht-integration[.]c1exchange[.]com:9000/ht.*']},
-
-
-{
-label:'CentroBid',
-patterns:[
-'^https?://t[.]brand-server[.]com/hb.*']},
-
-
-{
-label:'Conversant',
-patterns:[
-'^https?://media[.]msg[.]dotomi[.]com/s2s/.*']},
-
-
-{
-label:'Criteo',
-patterns:[
-'^https?://static[.]criteo[.]net/js/ld/publishertag[.]js.*',
-'^https?://([^.]*.)?bidder[.]criteo[.]com/cdb.*',
-'^https?://([^.]*.)?rtax[.]criteo[.]com/delivery/rta.*',
-'^https?://([^.]*.)?rtax[.]eu[.]criteo[.]com/delivery/rta.*']},
-
-
-{
-label:'Districtm',
-patterns:[
-'^https?://prebid[.]districtm[.]ca/lib[.]js.*']},
-
-
-{
-label:'E-Planning',
-patterns:[
-'^https?://ads[.]us[.]e-planning[.]net.*']},
-
-
-{
-label:'Essens',
-patterns:[
-'^https?://bid[.]essrtb[.]com/bid/prebid_call.*']},
-
-
-{
-label:'Facebook',
-patterns:[
-'^https?://an[.]facebook[.]com/v2/placementbid[.]json.*']},
-
-
-{
-label:'FeatureForward',
-patterns:[
-'^https?://prmbdr[.]featureforward[.]com/newbidder/.*']},
-
-
-{
-label:'Fidelity',
-patterns:[
-'^https?://x[.]fidelity-media[.]com.*']},
-
-
-{
-label:'GetIntent',
-patterns:[
-'^https?://px[.]adhigh[.]net/rtb/direct_banner.*',
-'^https?://px[.]adhigh[.]net/rtb/direct_vast.*']},
-
-
-{
-label:'GumGum',
-patterns:[
-'^https?://g2[.]gumgum[.]com/hbid/imp.*']},
-
-
-{
-label:'Hiromedia',
-patterns:[
-'^https?://hb-rtb[.]ktdpublishers[.]com/bid/get.*']},
-
-
-{
-label:'Imonomy',
-patterns:[
-'^https?://b[.]imonomy[.]com/openrtb/hb/.*']},
-
-
-{
-label:'ImproveDigital',
-patterns:[
-'^https?://ad[.]360yield[.]com/hb.*']},
-
-
-{
-label:'IndexExchange',
-patterns:[
-'^https?://as(-sec)?[.]casalemedia[.]com/(cygnus|headertag).*',
-'^https?://js(-sec)?[.]indexww[.]com/ht/.*']},
-
-
-{
-label:'InnerActive',
-patterns:[
-'^https?://ad-tag[.]inner-active[.]mobi/simpleM2M/requestJsonAd.*']},
-
-
-{
-label:'Innity',
-patterns:[
-'^https?://as[.]innity[.]com/synd/.*']},
-
-
-{
-label:'JCM',
-patterns:[
-'^https?://media[.]adfrontiers[.]com/pq.*']},
-
-
-{
-label:'JustPremium',
-patterns:[
-'^https?://pre[.]ads[.]justpremium[.]com/v/.*']},
-
-
-{
-label:'Kargo',
-patterns:[
-'^https?://krk[.]kargo[.]com/api/v1/bid.*']},
-
-
-{
-label:'Komoona',
-patterns:[
-'^https?://bidder[.]komoona[.]com/v1/GetSBids.*']},
-
-
-{
-label:'KruxLink',
-patterns:[
-'^https?://link[.]krxd[.]net/hb.*']},
-
-
-{
-label:'Kumma',
-patterns:[
-'^https?://cdn[.]kumma[.]com/pb_ortb[.]js.*']},
-
-
-{
-label:'Mantis',
-patterns:[
-'^https?://mantodea[.]mantisadnetwork[.]com/website/prebid.*']},
-
-
-{
-label:'MarsMedia',
-patterns:[
-'^https?://bid306[.]rtbsrv[.]com:9306/bidder.*']},
-
-
-{
-label:'Media.net',
-patterns:[
-'^https?://contextual[.]media[.]net/bidexchange.*']},
-
-
-{
-label:'MemeGlobal',
-patterns:[
-'^https?://stinger[.]memeglobal[.]com/api/v1/services/prebid.*']},
-
-
-{
-label:'MobFox',
-patterns:[
-'^https?://my[.]mobfox[.]com/request[.]php.*']},
-
-
-{
-label:'NanoInteractive',
-patterns:[
-'^https?://tmp[.]audiencemanager[.]de/hb.*']},
-
-
-{
-label:'OpenX',
-patterns:[
-'^https?://([^.]*.)?d[.]openx[.]net/w/1[.]0/arj.*',
-'^https?://([^.]*.)?servedbyopenx[.]com/.*']},
-
-
-{
-label:'Piximedia',
-patterns:[
-'^https?://static[.]adserver[.]pm/prebid.*']},
-
-
-{
-label:'Platformio',
-patterns:[
-'^https?://piohbdisp[.]hb[.]adx1[.]com.*']},
-
-
-{
-label:'Pollux',
-patterns:[
-'^https?://adn[.]plxnt[.]com/prebid.*']},
-
-
-{
-label:'PubGears',
-patterns:[
-'^https?://c[.]pubgears[.]com/tags.*']},
-
-
-{
-label:'Pubmatic',
-patterns:[
-'^https?://ads[.]pubmatic[.]com/AdServer/js/gshowad[.]js.*',
-'^https?://([^.]*.)?gads.pubmatic[.]com/.*',
-'^https?://hbopenbid.pubmatic[.]com/.*']},
-
-
-{
-label:'Pulsepoint',
-patterns:[
-'^https?://bid[.]contextweb[.]com/header/tag.*']},
-
-
-{
-label:'Quantcast',
-patterns:[
-'^https?://global[.]qc[.]rtb[.]quantserve[.]com:8080/qchb.*']},
-
-
-{
-label:'Rhythmone',
-patterns:[
-'^https?://tag[.]1rx[.]io/rmp/.*']},
-
-
-{
-label:'Roxot',
-patterns:[
-'^https?://r[.]rxthdr[.]com.*']},
-
-
-{
-label:'Rubicon',
-patterns:[
-'^https?://([^.]*.)?(fastlane|optimized-by|anvil)[.]rubiconproject[.]com/a/api.*',
-'^https?://fastlane-adv[.]rubiconproject[.]com/v1/auction/video.*']},
-
-
-{
-label:'Sekindo',
-patterns:[
-'^https?://hb[.]sekindo[.]com/live/liveView[.]php.*']},
-
-
-{
-label:'ShareThrough',
-patterns:[
-'^https?://btlr[.]sharethrough[.]com/header-bid/.*']},
-
-
-{
-label:'Smart AdServer',
-patterns:[
-'^https?://prg[.]smartadserver[.]com/prebid.*']},
-
-
-{
-label:'Sonobi',
-patterns:[
-'^https?://apex[.]go[.]sonobi[.]com/trinity[.]js.*']},
-
-
-{
-label:'Sovrn',
-patterns:[
-'^https?://ap[.]lijit[.]com/rtb/bid.*']},
-
-
-{
-label:'SpringServe',
-patterns:[
-'^https?://bidder[.]springserve[.]com/display/hbid.*']},
-
-
-{
-label:'StickyAds',
-patterns:[
-'^https?://cdn[.]stickyadstv[.]com/mustang/mustang[.]min[.]js.*',
-'^https?://cdn[.]stickyadstv[.]com/prime-time/.*']},
-
-
-{
-label:'TapSense3',
-patterns:[
-'^https?://ads04[.]tapsense[.]com/ads/headerad.*']},
-
-
-{
-label:'ThoughtLeadr',
-patterns:[
-'^https?://a[.]thoughtleadr[.]com/v4/.*']},
-
-
-{
-label:'TremorBid',
-patterns:[
-'^https?://([^.]*.)?ads[.]tremorhub[.]com/ad/tag.*']},
-
-
-{
-label:'Trion',
-patterns:[
-'^https?://in-appadvertising[.]com/api/bidRequest.*']},
-
-
-{
-label:'TripleLift',
-patterns:[
-'^https?://tlx[.]3lift[.]com/header/auction.*']},
-
-
-{
-label:'TrustX',
-patterns:[
-'^https?://sofia[.]trustx[.]org/hb.*']},
-
-
-{
-label:'UCFunnel',
-patterns:[
-'^https?://agent[.]aralego[.]com/header.*']},
-
-
-{
-label:'Underdog Media',
-patterns:[
-'^https?://udmserve[.]net/udm/img[.]fetch.*']},
-
-
-{
-label:'UnRuly',
-patterns:[
-'^https?://targeting[.]unrulymedia[.]com/prebid.*']},
-
-
-{
-label:'VertaMedia',
-patterns:[
-'^https?://rtb[.]vertamedia[.]com/hb/.*']},
-
-
-{
-label:'Vertoz',
-patterns:[
-'^https?://hb[.]vrtzads[.]com/vzhbidder/bid.*']},
-
-
-{
-label:'WideOrbig',
-patterns:[
-'^https?://([^.]*.)?atemda[.]com/JSAdservingMP[.]ashx.*']},
-
-
-{
-label:'WideSpace',
-patterns:[
-'^https?://engine[.]widespace[.]com/map/engine/hb/.*']},
-
-
-{
-label:'YieldBot',
-patterns:[
-'^https?://cdn[.]yldbt[.]com/js/yieldbot[.]intent[.]js.*']},
-
-
-{
-label:'YieldMo',
-patterns:[
-'^https?://ads[.]yieldmo[.]com/exchange/prebid.*']}];
-
-
-
-
-},{}],136:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function isBoxInViewport(clientRect,viewport){
-const{innerWidth,innerHeight}=viewport;
-const{left,top,right,bottom}=clientRect;
-
-return left<right&&top<bottom&&
-left<innerWidth&&top<innerHeight&&0<right&&0<bottom;
-}
-
-
-
-
-
-
-function boxViewableArea(clientRect,viewport){
-if(!isBoxInViewport(clientRect,viewport))return 0;
-
-const{innerWidth,innerHeight}=viewport;
-const{left,top,right,bottom}=clientRect;
-
-return(Math.min(right,innerWidth)-Math.max(left,0))*(
-Math.min(bottom,innerHeight)-Math.max(top,0));
-}
-
-module.exports={
-isBoxInViewport,
-boxViewableArea};
-
-
-
-},{}],137:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const BaseNode=require('lighthouse/lighthouse-core/lib/dependency-graph/base-node');
-
-const CpuNode=require('lighthouse/lighthouse-core/lib/dependency-graph/cpu-node.js');
-
-const NetworkNode=require('lighthouse/lighthouse-core/lib/dependency-graph/network-node.js');
-const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
-const{assert}=require('./asserts');
-const{getAbbreviatedUrl,trimUrl}=require('../utils/resource-classification');
-const{getNetworkInitiators}=require('lighthouse/lighthouse-core/computed/page-dependency-graph');
-const{getTimingsByRecord}=require('../utils/network-timing');
-const{isAdRequest,getHeaderBidder}=require('./resource-classification');
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function findTargetRequest(root,isTargetRequest){
-
-let firstTarget=null;
-root.traverse(node=>{
-if(node.type===BaseNode.TYPES.CPU||!isTargetRequest(node.record)){
-return;
-}
-if(firstTarget&&firstTarget.startTime<node.startTime){
-return;
-}
-firstTarget=node;
-});
-return firstTarget;
-}
-
-
-
-
-
-
-
-
-function getTransitiveClosure(root,isTargetRequest){
-
-const closure=new Set();
-
-const firstTarget=findTargetRequest(root,isTargetRequest);
-
-
-const requests=[];
-
-const traceEvents=[];
-
-if(firstTarget==null){
-return{requests,traceEvents};
-}
-
-const stack=[firstTarget];
-
-
-while(stack.length){
-const node=stack.pop();
-if(!node||closure.has(node)){
-continue;
-}
-closure.add(node);
-stack.push(...node.getDependencies());
-}
-
-
-const visited=new Set();
-stack.push(...root.getDependents());
-while(stack.length){
-const node=stack.pop();
-if(!node||visited.has(node)){
-continue;
-}
-visited.add(node);
-if(closure.has(node)){
-for(const n of stack){
-closure.add(n);
-}
-}
-stack.push(...node.getDependents());
-}
-
-
-for(const node of closure){
-if(node.type===BaseNode.TYPES.NETWORK){
-if(node.endTime<assert(firstTarget).startTime){
-requests.push(node.record);
-}
-}else if(node.type===BaseNode.TYPES.CPU){
-if(node.event.ts<assert(firstTarget).startTime*1e6){
-traceEvents.push(node.event,...node.childEvents);
-}
-}
-}
-return{requests,traceEvents};
-}
-
-
-
-
-
-
-
-
-function isXhrCritical(xhrReq,networkSummary,criticalRequests){
-const edges=networkSummary.xhrEdges.get(xhrReq.url);
-if(!edges){
-return false;
-}
-for(const{url}of criticalRequests){
-if(edges.has(url)){
-return true;
-}
-}
-return false;
-}
-
-
-
-
-
-
-
-
-
-function addInitiatedRequests(
-scriptReq,parentReq,networkSummary,criticalRequests){
-const initiatedRequests=networkSummary.allRecords.
-filter(r=>r.resourceType!=undefined).
-filter(r=>['Script','XHR'].includes(r.resourceType||'')&&
-r.endTime<parentReq.startTime).
-filter(r=>r.initiatorRequest==scriptReq||
-getNetworkInitiators(r).includes(scriptReq.url));
-
-for(const initiatedReq of initiatedRequests){
-
-const blocking=
-initiatedReq.resourceType=='XHR'&&
-isXhrCritical(initiatedReq,networkSummary,criticalRequests);
-if(blocking){
-linkGraph(networkSummary,initiatedReq,criticalRequests);
-}
-}
-}
-
-
-
-
-
-
-
-
-function getCriticalGraph(networkRecords,traceEvents,targetRequest){
-const summary=buildNetworkSummary(networkRecords,traceEvents);
-const criticalRequests=new Set();
-linkGraph(summary,targetRequest,criticalRequests);
-return criticalRequests;
-}
-
-
-
-
-
-
-
-
-function linkGraph(
-networkSummary,targetRequest,criticalRequests=new Set()){
-if(!targetRequest||criticalRequests.has(targetRequest)){
-return criticalRequests;
-}
-criticalRequests.add(targetRequest);
-const seen=new Set();
-for(let stack=targetRequest.initiator.stack;stack;stack=stack.parent){
-for(const{url}of stack.callFrames){
-if(seen.has(url))continue;
-seen.add(url);
-
-const request=networkSummary.requestsByUrl.get(url);
-if(!request)continue;
-
-linkGraph(networkSummary,request,criticalRequests);
-
-if(request.resourceType=='Script'){
-const scriptUrl=stack.callFrames[0].url;
-const scriptReq=networkSummary.requestsByUrl.get(scriptUrl);
-if(scriptReq){
-addInitiatedRequests(
-scriptReq,
-targetRequest,
-networkSummary,
-criticalRequests);
-}
-}
-}
-}
-
-linkGraph(
-networkSummary,targetRequest.initiatorRequest||null,criticalRequests);
-return criticalRequests;
-}
-
-
-
-
-
-
-function buildNetworkSummary(networkRecords,traceEvents){
-const requestsByUrl=new Map();
-for(const req of networkRecords){
-requestsByUrl.set(req.url,req);
-}
-
-const xhrEvents=traceEvents.
-filter(t=>t.name.startsWith('XHR')).
-filter(t=>!!(t.args.data||{}).url);
-const xhrEdges=new Map();
-for(const e of xhrEvents){
-const data=e.args.data||{};
-const edges=xhrEdges.get(data.url)||new Set();
-for(const{url}of data.stackTrace||[]){
-edges.add(url);
-}
-xhrEdges.set(data.url,edges);
-}
-return{requestsByUrl,xhrEdges,allRecords:networkRecords};
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function areSimilarRequests(r1,r2){
-if(Math.max(r1.startTime,r2.startTime)>Math.min(r1.endTime,r2.endTime)){
-return false;
-}
-if(r1.type&&r2.type&&r1.type!=r2.type){
-return false;
-}
-return r1.abbreviatedUrl==r2.abbreviatedUrl;
-}
-
-
-
-
-
-
-
-function computeSummaries(requests){
-
-
-
-requests.sort((a,b)=>{
-if(a.abbreviatedUrl!=b.abbreviatedUrl){
-return a.abbreviatedUrl<b.abbreviatedUrl?-1:1;
-}
-if(a.type!=b.type){
-return a.type<b.type?-1:1;
-}
-if(a.startTime!=b.startTime){
-return a.startTime<b.startTime?-1:1;
-}
-return a.endTime-b.endTime;
-});
-const result=[];
-for(let i=0;i<requests.length;i++){
-const current=requests[i];
-let next;
-while(i<requests.length){
-next=requests[i+1];
-if(!next||!areSimilarRequests(next,current)){
-break;
-}
-current.url=current.abbreviatedUrl;
-current.endTime=Math.max(current.endTime,next.endTime);
-current.duration=current.endTime-current.startTime;
-i++;
-}
-result.push(current);
-}
-result.sort((a,b)=>a.startTime-b.startTime);
-return result;
-}
-
-
-
-
-
-function computeSelfTimes(requests){
-if(!requests.length){
-return[];
-}
-
-let bottlneckRequest=assert(requests[0]);
-bottlneckRequest.selfTime=bottlneckRequest.duration;
-
-let scanEnd=bottlneckRequest.startTime;
-
-for(const current of requests){
-if(current.endTime<scanEnd||current==bottlneckRequest){
-
-continue;
-}
-const left=Math.max(scanEnd,current.startTime);
-const right=Math.min(bottlneckRequest.endTime,current.endTime);
-if(left<right){
-
-bottlneckRequest.selfTime-=right-left;
-}
-scanEnd=Math.max(scanEnd,right);
-if(current.endTime>bottlneckRequest.endTime){
-current.selfTime=current.endTime-left;
-bottlneckRequest=current;
-}
-}
-}
-
-
-
-
-
-
-
-
-
-
-async function computeAdRequestWaterfall(trace,devtoolsLog,context){
-const networkRecords=await NetworkRecords.request(devtoolsLog,context);
-
-const maybeFirstAdRequest=networkRecords.find(isAdRequest);
-const criticalRequests=new Set();
-if(maybeFirstAdRequest==null){
-return Promise.resolve([]);
-}
-const firstAdRequest=assert(maybeFirstAdRequest);
-const bidRequests=networkRecords.filter(r=>
-!!getHeaderBidder(r.url)&&r.endTime<=firstAdRequest.startTime);
-const summary=buildNetworkSummary(networkRecords,trace.traceEvents);
-for(const req of[firstAdRequest,...bidRequests]){
-linkGraph(summary,req,criticalRequests);
-}
-
-const REQUEST_TYPES=new Set([
-'Script','XHR','Fetch','EventStream','Document',undefined]);
-const waterfall=Array.from(criticalRequests).
-filter(r=>r.endTime<firstAdRequest.startTime).
-filter(r=>REQUEST_TYPES.has(r.resourceType)).
-filter(r=>r.mimeType!='text/css');
-
-
-const timingsByRecord=
-await getTimingsByRecord(trace,devtoolsLog,context);
-const timedWaterfall=waterfall.map(req=>{
-const{startTime,endTime}=timingsByRecord.get(req)||req;
-return{
-startTime,
-endTime,
-duration:endTime-startTime,
-selfTime:0,
-url:trimUrl(req.url),
-abbreviatedUrl:getAbbreviatedUrl(req.url),
-type:req.resourceType,
-record:req};
-
-});
-const result=computeSummaries(timedWaterfall);
-computeSelfTimes(result);
-return result;
-}
-
-module.exports={
-getTransitiveClosure,
-getCriticalGraph,
-computeAdRequestWaterfall};
-
-
-},{"../utils/network-timing":138,"../utils/resource-classification":140,"./asserts":134,"./resource-classification":140,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/computed/page-dependency-graph":35,"lighthouse/lighthouse-core/lib/dependency-graph/base-node":57,"lighthouse/lighthouse-core/lib/dependency-graph/cpu-node.js":58,"lighthouse/lighthouse-core/lib/dependency-graph/network-node.js":59}],138:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const AdLanternMetric=require('../computed/ad-lantern-metric');
-
-const LoadSimulator=require('lighthouse/lighthouse-core/computed/load-simulator');
-const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
-const PageDependencyGraph=require('lighthouse/lighthouse-core/computed/page-dependency-graph');
-const{isAdRequest,isBidRequest,isImplTag,isImpressionPing}=require('./resource-classification');
-const{URL}=require('url');
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function getTagEndTime(networkRecords){
-const tagRecord=networkRecords.find(
-record=>isImplTag(new URL(record.url)));
-return tagRecord?tagRecord.endTime:-1;
-}
-
-
-
-
-
-
-function getAdStartTime(networkRecords){
-const firstAdRecord=networkRecords.find(isAdRequest);
-return firstAdRecord?firstAdRecord.startTime:-1;
-}
-
-
-
-
-
-
-function getBidStartTime(networkRecords){
-const firstBidRecord=networkRecords.find(isBidRequest);
-return firstBidRecord?firstBidRecord.startTime:-1;
-}
-
-
-
-
-
-
-function getImpressionStartTime(networkRecords){
-const firstImpressionRecord=networkRecords.find(
-record=>isImpressionPing(record.url));
-return firstImpressionRecord?firstImpressionRecord.startTime:-1;
-}
-
-
-
-
-
-
-
-function getPageStartTime(networkRecords,defaultValue=-1){
-const firstSuccessRecord=networkRecords.find(
-record=>record.statusCode==200);
-return firstSuccessRecord?firstSuccessRecord.startTime:defaultValue;
-}
-
-
-
-
-
-
-
-function getPageResponseTime(networkRecords,defaultValue=-1){
-const firstSuccessRecord=networkRecords.find(
-record=>record.statusCode==200);
-return firstSuccessRecord?
-firstSuccessRecord.responseReceivedTime:defaultValue;
-}
-
-
-
-
-
-
-
-async function getTimingsByRecord(trace,devtoolsLog,context){
-
-const timingsByRecord=new Map();
-const networkRecords=await NetworkRecords.request(devtoolsLog,context);
-if(context.settings.throttlingMethod=='simulate'){
-
-const documentNode=
-
-await PageDependencyGraph.request({trace,devtoolsLog},context);
-const releventGraph=AdLanternMetric.getOptimisticGraph(documentNode);
-const simulator=await LoadSimulator.request(
-{devtoolsLog,settings:context.settings},context);
-const{nodeTimings}=simulator.simulate(releventGraph,{});
-for(const[{record},timing]of nodeTimings.entries()){
-if(!record)continue;
-timingsByRecord.set(record,timing);
-}
-}else{
-const pageStartTime=getPageStartTime(networkRecords);
-for(const record of networkRecords){
-timingsByRecord.set(record,{
-startTime:(record.startTime-pageStartTime)*1000,
-endTime:(record.endTime-pageStartTime)*1000,
-duration:(record.endTime-record.startTime)*1000});
-
-}
-}
-return timingsByRecord;
-}
-
-
-
-
-
-function getScriptUrl(e){
-if(!e.args.data){
-return undefined;
-}
-if(!['EvaluateScript','FunctionCall'].includes(e.name)){
-return undefined;
-}
-if(e.args.data.url){
-return e.args.data.url;
-}
-if(e.args.data.stackTrace){
-return e.args.data.stackTrace[0].url;
-}
-return undefined;
-}
-
-
-
-
-
-
-
-
-
-
-
-async function getScriptEvaluationTimes(trace,devtoolsLog,context){
-const networkRecords=await NetworkRecords.request(devtoolsLog,context);
-const pageStartTime=getPageStartTime(networkRecords)*1000;
-
-const results=new Map();
-for(const e of trace.traceEvents){
-const script=getScriptUrl(e);
-if(script&&!results.has(script)){
-results.set(script,e.ts/1000-pageStartTime);
-}
-}
-if(context.settings.throttlingMethod!=='simulate'){
-return results;
-}
-
-const timingsByRecord=await getTimingsByRecord(trace,devtoolsLog,context);
-for(const[req,timing]of timingsByRecord.entries()){
-const scriptEvalTime=results.get(req.url);
-if(!scriptEvalTime){
-continue;
-}
-const unsimulatedNetworkTime=req.startTime*1000-pageStartTime;
-const simulatedNetworkTime=timing.endTime;
-
-const cpuFactor=context.settings.throttling.cpuSlowdownMultiplier;
-
-const unsimulatedCpuTime=scriptEvalTime-unsimulatedNetworkTime;
-const simulatedCpuTime=cpuFactor*unsimulatedCpuTime;
-
-results.set(req.url,simulatedNetworkTime+simulatedCpuTime);
-}
-return results;
-}
-
-module.exports={
-getTagEndTime,
-getImpressionStartTime,
-getAdStartTime,
-getBidStartTime,
-getPageStartTime,
-getPageResponseTime,
-getTimingsByRecord,
-getScriptEvaluationTimes};
-
-
-},{"../computed/ad-lantern-metric":126,"./resource-classification":140,"lighthouse/lighthouse-core/computed/load-simulator":10,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/computed/page-dependency-graph":35,"url":"url"}],139:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const CacheHeaders=require('lighthouse/lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl');
-
-const{parse:parseCacheControl}=require('@tusbar/cache-control');
-
-
-
-
-
-
-function getHeader(req,header){
-const lowerHeader=header.toLowerCase();
-return(req.responseHeaders||[]).find(
-h=>h.name.toLowerCase()===lowerHeader);
-}
-
-
-
-
-
-
-function isCacheable(req){
-
-if(!CacheHeaders.isCacheableAsset(req)){
-return false;
-}
-const cacheControlHeader=getHeader(req,'cache-control');
-if(cacheControlHeader){
-try{
-const cacheControl=parseCacheControl(cacheControlHeader.value);
-if(cacheControl.noStore||cacheControl.noCache||
-cacheControl.maxAge===0){
-return false;
-}
-}catch(e){}
-return true;
-}
-
-return!!getHeader(req,'expires')||!!getHeader(req,'last-modified');
-}
-
-module.exports={
-isCacheable};
-
-
-},{"@tusbar/cache-control":91,"lighthouse/lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl":"../audits/byte-efficiency/uses-long-cache-ttl"}],140:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const bidderPatterns=require('./bidder-patterns');
-const{isCacheable}=require('../utils/network');
-const{URL}=require('url');
-
-
-
-
-
-
-
-function toURL(urlOrStr){
-return typeof urlOrStr==='string'?new URL(urlOrStr):urlOrStr;
-}
-
-
-
-
-
-
-function isGoogleAds(url){
-return /(^|\.)(doubleclick.net|google(syndication|tagservices).com)$/.
-test(url.hostname);
-}
-
-
-
-
-
-
-function isAdSenseTag(url){
-url=toURL(url);
-const matchesHost=url.host==='pagead2.googlesyndication.com';
-const matchesPath=
-[
-'/pagead/js/adsbygoogle.js',
-'/pagead/show_ads.js'].
-includes(url.pathname);
-return matchesHost&&matchesPath;
-}
-
-
-
-
-
-
-function isAdSenseImplTag(url){
-url=toURL(url);
-const matchesHost=url.host==='pagead2.googlesyndication.com';
-const matchesPath=
-/(^\/pagead\/js\/.*\/show_ads_impl\.js)/.test(url.pathname);
-return matchesHost&&matchesPath;
-}
-
-
-
-
-
-
-function isAdSense(url){
-return isAdSenseTag(url)||isAdSenseImplTag(url);
-}
-
-
-
-
-
-
-function isAdSenseAdRequest(request){
-if(!request)return false;
-const url=new URL(request.url);
-return(
-url.pathname==='/pagead/ads'&&
-url.host==='googleads.g.doubleclick.net');
-
-}
-
-
-
-
-
-function isAdSenseIframe(iframe){
-return /(^aswift_\d+)/.test(iframe.id);
-}
-
-
-
-
-
-
-function isImpressionPing(url){
-const{host,pathname}=toURL(url);
-return(
-[
-'securepubads.g.doubleclick.net',
-'googleads4.g.doubleclick.net'].
-includes(host)&&
-['/pcs/view','/pagead/adview'].includes(pathname));
-
-}
-
-
-
-
-
-
-function isGptTag(url){
-const{host,pathname}=toURL(url);
-const matchesHost=[
-'www.googletagservices.com',
-'securepubads.g.doubleclick.net'].includes(host);
-const matchesPath=
-['/tag/js/gpt.js','/tag/js/gpt_mobile.js'].includes(pathname);
-return matchesHost&&matchesPath;
-}
-
-
-
-
-
-
-function isGptImplTag(url){
-return(
-/(^\/gpt\/pubads_impl([a-z_]*)((?<!rendering)_)\d+\.js)/.
-test(toURL(url).pathname));
-
-}
-
-
-
-
-
-
-function isGpt(url){
-return isGptTag(url)||isGptImplTag(url);
-}
-
-
-
-
-
-
-function isGptAdRequest(request){
-if(!request)return false;
-const url=new URL(request.url);
-return(
-url.pathname==='/gampad/ads'&&
-url.host==='securepubads.g.doubleclick.net'&&
-request.resourceType==='XHR');
-
-}
-
-
-
-
-
-function isGptIframe(iframe){
-return /(^google_ads_iframe_)/.test(iframe.id);
-}
-
-
-
-
-
-
-function isAdTag(url){
-return isAdSenseTag(url)||isGptTag(url);
-}
-
-
-
-
-
-
-function isAdScript(url){
-return isAdSense(url)||isGpt(url);
-}
-
-
-
-
-
-
-function isAdRequest(request){
-return isAdSenseAdRequest(request)||isGptAdRequest(request);
-}
-
-
-
-
-
-
-function isAdIframe(iframe){
-return isAdSenseIframe(iframe)||isGptIframe(iframe);
-}
-
-
-
-
-
-
-function isImplTag(url){
-return isAdSenseTag(url)||isGptImplTag(url);
-}
-
-
-
-
-
-
-
-function containsAnySubstring(str,substrings){
-return substrings.some(substring=>str.includes(substring));
-}
-
-
-
-
-
-
-function hasImpressionPath(url){
-return url.pathname==='/pcs/view'||
-url.pathname==='/pagead/adview';
-}
-
-
-
-
-
-
-function getHeaderBidder(url){
-for(const def of bidderPatterns){
-for(const pattern of def.patterns){
-if(new RegExp(pattern).test(url)){
-return def.label;
-}
-}
-}
-return undefined;
-}
-
-
-
-
-
-
-
-function isBidRelatedRequest(requestOrUrl){
-return!!getHeaderBidder(
-typeof requestOrUrl=='string'?requestOrUrl:requestOrUrl.url);
-}
-
-
-
-
-
-
-function isPossibleBidRequest(req){
-return(req.resourceSize==null||req.resourceSize>0)&&
-req.resourceType!='Image'&&
-!isCacheable(req);
-}
-
-
-
-
-
-
-function isBidRequest(req){
-return isBidRelatedRequest(req)&&isPossibleBidRequest(req);
-}
-
-
-
-
-
-function isStaticRequest(request){
-
-return['parser','preload','other'].includes(request.initiator.type);
-}
-
-
-
-
-
-
-function trimUrl(url){
-const u=new URL(url);
-const PATH_MAX=60;
-const path=u.pathname.length>PATH_MAX?
-u.pathname.substr(0,PATH_MAX)+'...':u.pathname;
-return u.origin+path;
-}
-
-
-
-
-
-
-
-function getAbbreviatedUrl(url){
-const u=new URL(trimUrl(url));
-const parts=u.pathname.split('/');
-if(parts.length>4){
-u.pathname=[...parts.splice(0,4),'...'].join('/');
-}
-return u.toString();
-}
-
-module.exports={
-isGoogleAds,
-isGptAdRequest,
-isImpressionPing,
-isGpt,
-isAdSense,
-isAdSenseTag,
-isAdSenseImplTag,
-isAdSenseAdRequest,
-isAdSenseIframe,
-isGptTag,
-isGptImplTag,
-isGptIframe,
-isAdTag,
-isAdScript,
-isAdRequest,
-isAdIframe,
-isImplTag,
-containsAnySubstring,
-hasImpressionPath,
-getHeaderBidder,
-isBidRelatedRequest,
-isBidRequest,
-isStaticRequest,
-trimUrl,
-getAbbreviatedUrl};
-
-
-},{"../utils/network":139,"./bidder-patterns":135,"url":"url"}],141:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function getAttributableUrl(longTask,knownScripts=new Set()){
-const scriptUrl=longTask.attributableURLs.find(
-url=>knownScripts.has(url));
-const fallbackUrl=longTask.attributableURLs[0]||
-(longTask.event.args.data||{}).url;
-const attributableUrl=scriptUrl||fallbackUrl;
-
-if(attributableUrl){
-return attributableUrl;
-}
-let maxChildDuration=50;
-let childUrl='';
-for(const child of longTask.children){
-const url=getAttributableUrl(child,knownScripts);
-if(url&&child.duration>maxChildDuration){
-childUrl=url;
-maxChildDuration=child.duration;
-}
-}
-return childUrl;
-}
-
-module.exports={getAttributableUrl};
-
-},{}],142:[function(require,module,exports){
-(function(global){
-
-
-
-
-
-
-
-
-
-
-var LARGE_ARRAY_SIZE=200;
-
-
-var HASH_UNDEFINED='__lodash_hash_undefined__';
-
-
-var COMPARE_PARTIAL_FLAG=1,
-COMPARE_UNORDERED_FLAG=2;
-
-
-var MAX_SAFE_INTEGER=9007199254740991;
-
-
-var argsTag='[object Arguments]',
-arrayTag='[object Array]',
-asyncTag='[object AsyncFunction]',
-boolTag='[object Boolean]',
-dateTag='[object Date]',
-errorTag='[object Error]',
-funcTag='[object Function]',
-genTag='[object GeneratorFunction]',
-mapTag='[object Map]',
-numberTag='[object Number]',
-nullTag='[object Null]',
-objectTag='[object Object]',
-promiseTag='[object Promise]',
-proxyTag='[object Proxy]',
-regexpTag='[object RegExp]',
-setTag='[object Set]',
-stringTag='[object String]',
-symbolTag='[object Symbol]',
-undefinedTag='[object Undefined]',
-weakMapTag='[object WeakMap]';
-
-var arrayBufferTag='[object ArrayBuffer]',
-dataViewTag='[object DataView]',
-float32Tag='[object Float32Array]',
-float64Tag='[object Float64Array]',
-int8Tag='[object Int8Array]',
-int16Tag='[object Int16Array]',
-int32Tag='[object Int32Array]',
-uint8Tag='[object Uint8Array]',
-uint8ClampedTag='[object Uint8ClampedArray]',
-uint16Tag='[object Uint16Array]',
-uint32Tag='[object Uint32Array]';
-
-
-
-
-
-var reRegExpChar=/[\\^$.*+?()[\]{}|]/g;
-
-
-var reIsHostCtor=/^\[object .+?Constructor\]$/;
-
-
-var reIsUint=/^(?:0|[1-9]\d*)$/;
-
-
-var typedArrayTags={};
-typedArrayTags[float32Tag]=typedArrayTags[float64Tag]=
-typedArrayTags[int8Tag]=typedArrayTags[int16Tag]=
-typedArrayTags[int32Tag]=typedArrayTags[uint8Tag]=
-typedArrayTags[uint8ClampedTag]=typedArrayTags[uint16Tag]=
-typedArrayTags[uint32Tag]=true;
-typedArrayTags[argsTag]=typedArrayTags[arrayTag]=
-typedArrayTags[arrayBufferTag]=typedArrayTags[boolTag]=
-typedArrayTags[dataViewTag]=typedArrayTags[dateTag]=
-typedArrayTags[errorTag]=typedArrayTags[funcTag]=
-typedArrayTags[mapTag]=typedArrayTags[numberTag]=
-typedArrayTags[objectTag]=typedArrayTags[regexpTag]=
-typedArrayTags[setTag]=typedArrayTags[stringTag]=
-typedArrayTags[weakMapTag]=false;
-
-
-var freeGlobal=typeof global=='object'&&global&&global.Object===Object&&global;
-
-
-var freeSelf=typeof self=='object'&&self&&self.Object===Object&&self;
-
-
-var root=freeGlobal||freeSelf||Function('return this')();
-
-
-var freeExports=typeof exports=='object'&&exports&&!exports.nodeType&&exports;
-
-
-var freeModule=freeExports&&typeof module=='object'&&module&&!module.nodeType&&module;
-
-
-var moduleExports=freeModule&&freeModule.exports===freeExports;
-
-
-var freeProcess=moduleExports&&freeGlobal.process;
-
-
-var nodeUtil=function(){
-try{
-return freeProcess&&freeProcess.binding&&freeProcess.binding('util');
-}catch(e){}
-}();
-
-
-var nodeIsTypedArray=nodeUtil&&nodeUtil.isTypedArray;
-
-
-
-
-
-
-
-
-
-
-function arrayFilter(array,predicate){
-var index=-1,
-length=array==null?0:array.length,
-resIndex=0,
-result=[];
-
-while(++index<length){
-var value=array[index];
-if(predicate(value,index,array)){
-result[resIndex++]=value;
-}
-}
-return result;
-}
-
-
-
-
-
-
-
-
-
-function arrayPush(array,values){
-var index=-1,
-length=values.length,
-offset=array.length;
-
-while(++index<length){
-array[offset+index]=values[index];
-}
-return array;
-}
-
-
-
-
-
-
-
-
-
-
-
-function arraySome(array,predicate){
-var index=-1,
-length=array==null?0:array.length;
-
-while(++index<length){
-if(predicate(array[index],index,array)){
-return true;
-}
-}
-return false;
-}
-
-
-
-
-
-
-
-
-
-
-function baseTimes(n,iteratee){
-var index=-1,
-result=Array(n);
-
-while(++index<n){
-result[index]=iteratee(index);
-}
-return result;
-}
-
-
-
-
-
-
-
-
-function baseUnary(func){
-return function(value){
-return func(value);
-};
-}
-
-
-
-
-
-
-
-
-
-function cacheHas(cache,key){
-return cache.has(key);
-}
-
-
-
-
-
-
-
-
-
-function getValue(object,key){
-return object==null?undefined:object[key];
-}
-
-
-
-
-
-
-
-
-function mapToArray(map){
-var index=-1,
-result=Array(map.size);
-
-map.forEach(function(value,key){
-result[++index]=[key,value];
-});
-return result;
-}
-
-
-
-
-
-
-
-
-
-function overArg(func,transform){
-return function(arg){
-return func(transform(arg));
-};
-}
-
-
-
-
-
-
-
-
-function setToArray(set){
-var index=-1,
-result=Array(set.size);
-
-set.forEach(function(value){
-result[++index]=value;
-});
-return result;
-}
-
-
-var arrayProto=Array.prototype,
-funcProto=Function.prototype,
-objectProto=Object.prototype;
-
-
-var coreJsData=root['__core-js_shared__'];
-
-
-var funcToString=funcProto.toString;
-
-
-var hasOwnProperty=objectProto.hasOwnProperty;
-
-
-var maskSrcKey=function(){
-var uid=/[^.]+$/.exec(coreJsData&&coreJsData.keys&&coreJsData.keys.IE_PROTO||'');
-return uid?'Symbol(src)_1.'+uid:'';
-}();
-
-
-
-
-
-
-var nativeObjectToString=objectProto.toString;
-
-
-var reIsNative=RegExp('^'+
-funcToString.call(hasOwnProperty).replace(reRegExpChar,'\\$&').
-replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,'$1.*?')+'$');
-
-
-
-var Buffer=moduleExports?root.Buffer:undefined,
-Symbol=root.Symbol,
-Uint8Array=root.Uint8Array,
-propertyIsEnumerable=objectProto.propertyIsEnumerable,
-splice=arrayProto.splice,
-symToStringTag=Symbol?Symbol.toStringTag:undefined;
-
-
-var nativeGetSymbols=Object.getOwnPropertySymbols,
-nativeIsBuffer=Buffer?Buffer.isBuffer:undefined,
-nativeKeys=overArg(Object.keys,Object);
-
-
-var DataView=getNative(root,'DataView'),
-Map=getNative(root,'Map'),
-Promise=getNative(root,'Promise'),
-Set=getNative(root,'Set'),
-WeakMap=getNative(root,'WeakMap'),
-nativeCreate=getNative(Object,'create');
-
-
-var dataViewCtorString=toSource(DataView),
-mapCtorString=toSource(Map),
-promiseCtorString=toSource(Promise),
-setCtorString=toSource(Set),
-weakMapCtorString=toSource(WeakMap);
-
-
-var symbolProto=Symbol?Symbol.prototype:undefined,
-symbolValueOf=symbolProto?symbolProto.valueOf:undefined;
-
-
-
-
-
-
-
-
-function Hash(entries){
-var index=-1,
-length=entries==null?0:entries.length;
-
-this.clear();
-while(++index<length){
-var entry=entries[index];
-this.set(entry[0],entry[1]);
-}
-}
-
-
-
-
-
-
-
-
-function hashClear(){
-this.__data__=nativeCreate?nativeCreate(null):{};
-this.size=0;
-}
-
-
-
-
-
-
-
-
-
-
-
-function hashDelete(key){
-var result=this.has(key)&&delete this.__data__[key];
-this.size-=result?1:0;
-return result;
-}
-
-
-
-
-
-
-
-
-
-
-function hashGet(key){
-var data=this.__data__;
-if(nativeCreate){
-var result=data[key];
-return result===HASH_UNDEFINED?undefined:result;
-}
-return hasOwnProperty.call(data,key)?data[key]:undefined;
-}
-
-
-
-
-
-
-
-
-
-
-function hashHas(key){
-var data=this.__data__;
-return nativeCreate?data[key]!==undefined:hasOwnProperty.call(data,key);
-}
-
-
-
-
-
-
-
-
-
-
-
-function hashSet(key,value){
-var data=this.__data__;
-this.size+=this.has(key)?0:1;
-data[key]=nativeCreate&&value===undefined?HASH_UNDEFINED:value;
-return this;
-}
-
-
-Hash.prototype.clear=hashClear;
-Hash.prototype['delete']=hashDelete;
-Hash.prototype.get=hashGet;
-Hash.prototype.has=hashHas;
-Hash.prototype.set=hashSet;
-
-
-
-
-
-
-
-
-function ListCache(entries){
-var index=-1,
-length=entries==null?0:entries.length;
-
-this.clear();
-while(++index<length){
-var entry=entries[index];
-this.set(entry[0],entry[1]);
-}
-}
-
-
-
-
-
-
-
-
-function listCacheClear(){
-this.__data__=[];
-this.size=0;
-}
-
-
-
-
-
-
-
-
-
-
-function listCacheDelete(key){
-var data=this.__data__,
-index=assocIndexOf(data,key);
-
-if(index<0){
-return false;
-}
-var lastIndex=data.length-1;
-if(index==lastIndex){
-data.pop();
-}else{
-splice.call(data,index,1);
-}
---this.size;
-return true;
-}
-
-
-
-
-
-
-
-
-
-
-function listCacheGet(key){
-var data=this.__data__,
-index=assocIndexOf(data,key);
-
-return index<0?undefined:data[index][1];
-}
-
-
-
-
-
-
-
-
-
-
-function listCacheHas(key){
-return assocIndexOf(this.__data__,key)>-1;
-}
-
-
-
-
-
-
-
-
-
-
-
-function listCacheSet(key,value){
-var data=this.__data__,
-index=assocIndexOf(data,key);
-
-if(index<0){
-++this.size;
-data.push([key,value]);
-}else{
-data[index][1]=value;
-}
-return this;
-}
-
-
-ListCache.prototype.clear=listCacheClear;
-ListCache.prototype['delete']=listCacheDelete;
-ListCache.prototype.get=listCacheGet;
-ListCache.prototype.has=listCacheHas;
-ListCache.prototype.set=listCacheSet;
-
-
-
-
-
-
-
-
-function MapCache(entries){
-var index=-1,
-length=entries==null?0:entries.length;
-
-this.clear();
-while(++index<length){
-var entry=entries[index];
-this.set(entry[0],entry[1]);
-}
-}
-
-
-
-
-
-
-
-
-function mapCacheClear(){
-this.size=0;
-this.__data__={
-'hash':new Hash(),
-'map':new(Map||ListCache)(),
-'string':new Hash()};
-
-}
-
-
-
-
-
-
-
-
-
-
-function mapCacheDelete(key){
-var result=getMapData(this,key)['delete'](key);
-this.size-=result?1:0;
-return result;
-}
-
-
-
-
-
-
-
-
-
-
-function mapCacheGet(key){
-return getMapData(this,key).get(key);
-}
-
-
-
-
-
-
-
-
-
-
-function mapCacheHas(key){
-return getMapData(this,key).has(key);
-}
-
-
-
-
-
-
-
-
-
-
-
-function mapCacheSet(key,value){
-var data=getMapData(this,key),
-size=data.size;
-
-data.set(key,value);
-this.size+=data.size==size?0:1;
-return this;
-}
-
-
-MapCache.prototype.clear=mapCacheClear;
-MapCache.prototype['delete']=mapCacheDelete;
-MapCache.prototype.get=mapCacheGet;
-MapCache.prototype.has=mapCacheHas;
-MapCache.prototype.set=mapCacheSet;
-
-
-
-
-
-
-
-
-
-function SetCache(values){
-var index=-1,
-length=values==null?0:values.length;
-
-this.__data__=new MapCache();
-while(++index<length){
-this.add(values[index]);
-}
-}
-
-
-
-
-
-
-
-
-
-
-
-function setCacheAdd(value){
-this.__data__.set(value,HASH_UNDEFINED);
-return this;
-}
-
-
-
-
-
-
-
-
-
-
-function setCacheHas(value){
-return this.__data__.has(value);
-}
-
-
-SetCache.prototype.add=SetCache.prototype.push=setCacheAdd;
-SetCache.prototype.has=setCacheHas;
-
-
-
-
-
-
-
-
-function Stack(entries){
-var data=this.__data__=new ListCache(entries);
-this.size=data.size;
-}
-
-
-
-
-
-
-
-
-function stackClear(){
-this.__data__=new ListCache();
-this.size=0;
-}
-
-
-
-
-
-
-
-
-
-
-function stackDelete(key){
-var data=this.__data__,
-result=data['delete'](key);
-
-this.size=data.size;
-return result;
-}
-
-
-
-
-
-
-
-
-
-
-function stackGet(key){
-return this.__data__.get(key);
-}
-
-
-
-
-
-
-
-
-
-
-function stackHas(key){
-return this.__data__.has(key);
-}
-
-
-
-
-
-
-
-
-
-
-
-function stackSet(key,value){
-var data=this.__data__;
-if(data instanceof ListCache){
-var pairs=data.__data__;
-if(!Map||pairs.length<LARGE_ARRAY_SIZE-1){
-pairs.push([key,value]);
-this.size=++data.size;
-return this;
-}
-data=this.__data__=new MapCache(pairs);
-}
-data.set(key,value);
-this.size=data.size;
-return this;
-}
-
-
-Stack.prototype.clear=stackClear;
-Stack.prototype['delete']=stackDelete;
-Stack.prototype.get=stackGet;
-Stack.prototype.has=stackHas;
-Stack.prototype.set=stackSet;
-
-
-
-
-
-
-
-
-
-function arrayLikeKeys(value,inherited){
-var isArr=isArray(value),
-isArg=!isArr&&isArguments(value),
-isBuff=!isArr&&!isArg&&isBuffer(value),
-isType=!isArr&&!isArg&&!isBuff&&isTypedArray(value),
-skipIndexes=isArr||isArg||isBuff||isType,
-result=skipIndexes?baseTimes(value.length,String):[],
-length=result.length;
-
-for(var key in value){
-if((inherited||hasOwnProperty.call(value,key))&&
-!(skipIndexes&&(
-
-key=='length'||
-
-isBuff&&(key=='offset'||key=='parent')||
-
-isType&&(key=='buffer'||key=='byteLength'||key=='byteOffset')||
-
-isIndex(key,length))))
-{
-result.push(key);
-}
-}
-return result;
-}
-
-
-
-
-
-
-
-
-
-function assocIndexOf(array,key){
-var length=array.length;
-while(length--){
-if(eq(array[length][0],key)){
-return length;
-}
-}
-return-1;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-function baseGetAllKeys(object,keysFunc,symbolsFunc){
-var result=keysFunc(object);
-return isArray(object)?result:arrayPush(result,symbolsFunc(object));
-}
-
-
-
-
-
-
-
-
-function baseGetTag(value){
-if(value==null){
-return value===undefined?undefinedTag:nullTag;
-}
-return symToStringTag&&symToStringTag in Object(value)?
-getRawTag(value):
-objectToString(value);
-}
-
-
-
-
-
-
-
-
-function baseIsArguments(value){
-return isObjectLike(value)&&baseGetTag(value)==argsTag;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function baseIsEqual(value,other,bitmask,customizer,stack){
-if(value===other){
-return true;
-}
-if(value==null||other==null||!isObjectLike(value)&&!isObjectLike(other)){
-return value!==value&&other!==other;
-}
-return baseIsEqualDeep(value,other,bitmask,customizer,baseIsEqual,stack);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function baseIsEqualDeep(object,other,bitmask,customizer,equalFunc,stack){
-var objIsArr=isArray(object),
-othIsArr=isArray(other),
-objTag=objIsArr?arrayTag:getTag(object),
-othTag=othIsArr?arrayTag:getTag(other);
-
-objTag=objTag==argsTag?objectTag:objTag;
-othTag=othTag==argsTag?objectTag:othTag;
-
-var objIsObj=objTag==objectTag,
-othIsObj=othTag==objectTag,
-isSameTag=objTag==othTag;
-
-if(isSameTag&&isBuffer(object)){
-if(!isBuffer(other)){
-return false;
-}
-objIsArr=true;
-objIsObj=false;
-}
-if(isSameTag&&!objIsObj){
-stack||(stack=new Stack());
-return objIsArr||isTypedArray(object)?
-equalArrays(object,other,bitmask,customizer,equalFunc,stack):
-equalByTag(object,other,objTag,bitmask,customizer,equalFunc,stack);
-}
-if(!(bitmask&COMPARE_PARTIAL_FLAG)){
-var objIsWrapped=objIsObj&&hasOwnProperty.call(object,'__wrapped__'),
-othIsWrapped=othIsObj&&hasOwnProperty.call(other,'__wrapped__');
-
-if(objIsWrapped||othIsWrapped){
-var objUnwrapped=objIsWrapped?object.value():object,
-othUnwrapped=othIsWrapped?other.value():other;
-
-stack||(stack=new Stack());
-return equalFunc(objUnwrapped,othUnwrapped,bitmask,customizer,stack);
-}
-}
-if(!isSameTag){
-return false;
-}
-stack||(stack=new Stack());
-return equalObjects(object,other,bitmask,customizer,equalFunc,stack);
-}
-
-
-
-
-
-
-
-
-
-function baseIsNative(value){
-if(!isObject(value)||isMasked(value)){
-return false;
-}
-var pattern=isFunction(value)?reIsNative:reIsHostCtor;
-return pattern.test(toSource(value));
-}
-
-
-
-
-
-
-
-
-function baseIsTypedArray(value){
-return isObjectLike(value)&&
-isLength(value.length)&&!!typedArrayTags[baseGetTag(value)];
-}
-
-
-
-
-
-
-
-
-function baseKeys(object){
-if(!isPrototype(object)){
-return nativeKeys(object);
-}
-var result=[];
-for(var key in Object(object)){
-if(hasOwnProperty.call(object,key)&&key!='constructor'){
-result.push(key);
-}
-}
-return result;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function equalArrays(array,other,bitmask,customizer,equalFunc,stack){
-var isPartial=bitmask&COMPARE_PARTIAL_FLAG,
-arrLength=array.length,
-othLength=other.length;
-
-if(arrLength!=othLength&&!(isPartial&&othLength>arrLength)){
-return false;
-}
-
-var stacked=stack.get(array);
-if(stacked&&stack.get(other)){
-return stacked==other;
-}
-var index=-1,
-result=true,
-seen=bitmask&COMPARE_UNORDERED_FLAG?new SetCache():undefined;
-
-stack.set(array,other);
-stack.set(other,array);
-
-
-while(++index<arrLength){
-var arrValue=array[index],
-othValue=other[index];
-
-if(customizer){
-var compared=isPartial?
-customizer(othValue,arrValue,index,other,array,stack):
-customizer(arrValue,othValue,index,array,other,stack);
-}
-if(compared!==undefined){
-if(compared){
-continue;
-}
-result=false;
-break;
-}
-
-if(seen){
-if(!arraySome(other,function(othValue,othIndex){
-if(!cacheHas(seen,othIndex)&&(
-arrValue===othValue||equalFunc(arrValue,othValue,bitmask,customizer,stack))){
-return seen.push(othIndex);
-}
-})){
-result=false;
-break;
-}
-}else if(!(
-arrValue===othValue||
-equalFunc(arrValue,othValue,bitmask,customizer,stack)))
-{
-result=false;
-break;
-}
-}
-stack['delete'](array);
-stack['delete'](other);
-return result;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function equalByTag(object,other,tag,bitmask,customizer,equalFunc,stack){
-switch(tag){
-case dataViewTag:
-if(object.byteLength!=other.byteLength||
-object.byteOffset!=other.byteOffset){
-return false;
-}
-object=object.buffer;
-other=other.buffer;
-
-case arrayBufferTag:
-if(object.byteLength!=other.byteLength||
-!equalFunc(new Uint8Array(object),new Uint8Array(other))){
-return false;
-}
-return true;
-
-case boolTag:
-case dateTag:
-case numberTag:
-
-
-return eq(+object,+other);
-
-case errorTag:
-return object.name==other.name&&object.message==other.message;
-
-case regexpTag:
-case stringTag:
-
-
-
-return object==other+'';
-
-case mapTag:
-var convert=mapToArray;
-
-case setTag:
-var isPartial=bitmask&COMPARE_PARTIAL_FLAG;
-convert||(convert=setToArray);
-
-if(object.size!=other.size&&!isPartial){
-return false;
-}
-
-var stacked=stack.get(object);
-if(stacked){
-return stacked==other;
-}
-bitmask|=COMPARE_UNORDERED_FLAG;
-
-
-stack.set(object,other);
-var result=equalArrays(convert(object),convert(other),bitmask,customizer,equalFunc,stack);
-stack['delete'](object);
-return result;
-
-case symbolTag:
-if(symbolValueOf){
-return symbolValueOf.call(object)==symbolValueOf.call(other);
-}}
-
-return false;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function equalObjects(object,other,bitmask,customizer,equalFunc,stack){
-var isPartial=bitmask&COMPARE_PARTIAL_FLAG,
-objProps=getAllKeys(object),
-objLength=objProps.length,
-othProps=getAllKeys(other),
-othLength=othProps.length;
-
-if(objLength!=othLength&&!isPartial){
-return false;
-}
-var index=objLength;
-while(index--){
-var key=objProps[index];
-if(!(isPartial?key in other:hasOwnProperty.call(other,key))){
-return false;
-}
-}
-
-var stacked=stack.get(object);
-if(stacked&&stack.get(other)){
-return stacked==other;
-}
-var result=true;
-stack.set(object,other);
-stack.set(other,object);
-
-var skipCtor=isPartial;
-while(++index<objLength){
-key=objProps[index];
-var objValue=object[key],
-othValue=other[key];
-
-if(customizer){
-var compared=isPartial?
-customizer(othValue,objValue,key,other,object,stack):
-customizer(objValue,othValue,key,object,other,stack);
-}
-
-if(!(compared===undefined?
-objValue===othValue||equalFunc(objValue,othValue,bitmask,customizer,stack):
-compared))
-{
-result=false;
-break;
-}
-skipCtor||(skipCtor=key=='constructor');
-}
-if(result&&!skipCtor){
-var objCtor=object.constructor,
-othCtor=other.constructor;
-
-
-if(objCtor!=othCtor&&
-'constructor'in object&&'constructor'in other&&
-!(typeof objCtor=='function'&&objCtor instanceof objCtor&&
-typeof othCtor=='function'&&othCtor instanceof othCtor)){
-result=false;
-}
-}
-stack['delete'](object);
-stack['delete'](other);
-return result;
-}
-
-
-
-
-
-
-
-
-function getAllKeys(object){
-return baseGetAllKeys(object,keys,getSymbols);
-}
-
-
-
-
-
-
-
-
-
-function getMapData(map,key){
-var data=map.__data__;
-return isKeyable(key)?
-data[typeof key=='string'?'string':'hash']:
-data.map;
-}
-
-
-
-
-
-
-
-
-
-function getNative(object,key){
-var value=getValue(object,key);
-return baseIsNative(value)?value:undefined;
-}
-
-
-
-
-
-
-
-
-function getRawTag(value){
-var isOwn=hasOwnProperty.call(value,symToStringTag),
-tag=value[symToStringTag];
-
-try{
-value[symToStringTag]=undefined;
-var unmasked=true;
-}catch(e){}
-
-var result=nativeObjectToString.call(value);
-if(unmasked){
-if(isOwn){
-value[symToStringTag]=tag;
-}else{
-delete value[symToStringTag];
-}
-}
-return result;
-}
-
-
-
-
-
-
-
-
-var getSymbols=!nativeGetSymbols?stubArray:function(object){
-if(object==null){
-return[];
-}
-object=Object(object);
-return arrayFilter(nativeGetSymbols(object),function(symbol){
-return propertyIsEnumerable.call(object,symbol);
-});
-};
-
-
-
-
-
-
-
-
-var getTag=baseGetTag;
-
-
-if(DataView&&getTag(new DataView(new ArrayBuffer(1)))!=dataViewTag||
-Map&&getTag(new Map())!=mapTag||
-Promise&&getTag(Promise.resolve())!=promiseTag||
-Set&&getTag(new Set())!=setTag||
-WeakMap&&getTag(new WeakMap())!=weakMapTag){
-getTag=function(value){
-var result=baseGetTag(value),
-Ctor=result==objectTag?value.constructor:undefined,
-ctorString=Ctor?toSource(Ctor):'';
-
-if(ctorString){
-switch(ctorString){
-case dataViewCtorString:return dataViewTag;
-case mapCtorString:return mapTag;
-case promiseCtorString:return promiseTag;
-case setCtorString:return setTag;
-case weakMapCtorString:return weakMapTag;}
-
-}
-return result;
-};
-}
-
-
-
-
-
-
-
-
-
-function isIndex(value,length){
-length=length==null?MAX_SAFE_INTEGER:length;
-return!!length&&(
-typeof value=='number'||reIsUint.test(value))&&
-value>-1&&value%1==0&&value<length;
-}
-
-
-
-
-
-
-
-
-function isKeyable(value){
-var type=typeof value;
-return type=='string'||type=='number'||type=='symbol'||type=='boolean'?
-value!=='__proto__':
-value===null;
-}
-
-
-
-
-
-
-
-
-function isMasked(func){
-return!!maskSrcKey&&maskSrcKey in func;
-}
-
-
-
-
-
-
-
-
-function isPrototype(value){
-var Ctor=value&&value.constructor,
-proto=typeof Ctor=='function'&&Ctor.prototype||objectProto;
-
-return value===proto;
-}
-
-
-
-
-
-
-
-
-function objectToString(value){
-return nativeObjectToString.call(value);
-}
-
-
-
-
-
-
-
-
-function toSource(func){
-if(func!=null){
-try{
-return funcToString.call(func);
-}catch(e){}
-try{
-return func+'';
-}catch(e){}
-}
-return'';
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function eq(value,other){
-return value===other||value!==value&&other!==other;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-var isArguments=baseIsArguments(function(){return arguments;}())?baseIsArguments:function(value){
-return isObjectLike(value)&&hasOwnProperty.call(value,'callee')&&
-!propertyIsEnumerable.call(value,'callee');
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-var isArray=Array.isArray;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function isArrayLike(value){
-return value!=null&&isLength(value.length)&&!isFunction(value);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-var isBuffer=nativeIsBuffer||stubFalse;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function isEqual(value,other){
-return baseIsEqual(value,other);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function isFunction(value){
-if(!isObject(value)){
-return false;
-}
-
-
-var tag=baseGetTag(value);
-return tag==funcTag||tag==genTag||tag==asyncTag||tag==proxyTag;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function isLength(value){
-return typeof value=='number'&&
-value>-1&&value%1==0&&value<=MAX_SAFE_INTEGER;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function isObject(value){
-var type=typeof value;
-return value!=null&&(type=='object'||type=='function');
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function isObjectLike(value){
-return value!=null&&typeof value=='object';
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-var isTypedArray=nodeIsTypedArray?baseUnary(nodeIsTypedArray):baseIsTypedArray;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function keys(object){
-return isArrayLike(object)?arrayLikeKeys(object):baseKeys(object);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function stubArray(){
-return[];
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function stubFalse(){
-return false;
-}
-
-module.exports=isEqual;
-
-}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
-},{}],143:[function(require,module,exports){
-
-
-
-module.exports=function lookupClosestLocale(locale,available){
-if(typeof locale==='string'&&available[locale])return locale;
-var locales=[].concat(locale||[]);
-for(var l=0,ll=locales.length;l<ll;++l){
-var current=locales[l].split('-');
-while(current.length){
-var candidate=current.join('-');
-if(available[candidate])return candidate;
-current.pop();
-}
-}
-};
-
-},{}],144:[function(require,module,exports){
-'use strict';
-
-Object.defineProperty(exports,'__esModule',{value:true});
-
-
-var perf=typeof performance!=='undefined'&&performance;
-
-var now=perf&&perf.now?function(){return perf.now();}:function(){return Date.now();};
-
-function throwIfEmpty(name){
-if(!name){
-throw new Error('name must be non-empty');
-}
-}
-
-
-function insertSorted(arr,item){
-var low=0;
-var high=arr.length;
-var mid;
-while(low<high){
-mid=low+high>>>1;
-if(arr[mid].startTime<item.startTime){
-low=mid+1;
-}else{
-high=mid;
-}
-}
-arr.splice(low,0,item);
-}
-
-if(perf&&perf.mark){
-exports.mark=function(name){
-throwIfEmpty(name);
-perf.mark("start "+name);
-};
-exports.stop=function(name){
-throwIfEmpty(name);
-perf.mark("end "+name);
-perf.measure(name,"start "+name,"end "+name);
-var entries=perf.getEntriesByName(name);
-return entries[entries.length-1];
-};
-exports.getEntries=function(){return perf.getEntriesByType('measure');};
-exports.clear=function(){
-perf.clearMarks();
-perf.clearMeasures();
-};
-}else{
-var marks={};
-var entries=[];
-exports.mark=function(name){
-throwIfEmpty(name);
-var startTime=now();
-marks['$'+name]=startTime;
-};
-exports.stop=function(name){
-throwIfEmpty(name);
-var endTime=now();
-var startTime=marks['$'+name];
-if(!startTime){
-throw new Error("no known mark: "+name);
-}
-var entry={
-startTime:startTime,
-name:name,
-duration:endTime-startTime,
-entryType:'measure'};
-
-
-
-
-insertSorted(entries,entry);
-return entry;
-};
-exports.getEntries=function(){return entries;};
-exports.clear=function(){entries=[];};
-}
-
-},{}],145:[function(require,module,exports){
-exports.getRenderingDataFromViewport=function(viewportProperties,uaDeviceWidth,uaDeviceHeight,uaMaxZoom,uaMinZoom){
-
-var vw=uaDeviceWidth/100;
-var vh=uaDeviceHeight/100;
-
-
-
-var maxZoom=null;
-var minZoom=null;
-var zoom=null;
-var minWidth=null;
-var minHeight=null;
-var maxWidth=null;
-var maxHeight=null;
-var width=null,height=null;
-var initialWidth=uaDeviceWidth;
-var initialHeight=uaDeviceHeight;
-var userZoom="zoom";
-
-if(viewportProperties["maximum-scale"]!==undefined){
-maxZoom=translateZoomProperty(viewportProperties["maximum-scale"]);
-}
-if(viewportProperties["minimum-scale"]!==undefined){
-minZoom=translateZoomProperty(viewportProperties["minimum-scale"]);
-}
-if(viewportProperties["initial-scale"]!==undefined){
-zoom=translateZoomProperty(viewportProperties["initial-scale"]);
-}
-
-
-
-
-
-
-
-if(minZoom!==null&&maxZoom===null){
-minZoom=min(uaMaxZoom,translateZoomProperty(viewportProperties["minimum-scale"]));
-}
-
-if(viewportProperties["width"]!==undefined){
-minWidth="extend-to-zoom";
-maxWidth=translateLengthProperty(viewportProperties["width"],vw,vh);
-}
-
-if(viewportProperties["height"]!==undefined){
-minHeight="extend-to-zoom";
-maxHeight=translateLengthProperty(viewportProperties["height"],vw,vh);
-}
-
-
-if(viewportProperties["user-scalable"]!==undefined){
-userZoom=viewportProperties["user-scalable"];
-if(typeof userZoom==="number"){
-if(userZoom>=1||userZoom<=-1){
-userZoom="zoom";
-}else{
-userZoom="fixed";
-}
-}else{
-switch(userZoom){
-case"yes":
-case"device-width":
-case"device-height":
-userZoom="zoom";
-break;
-case"no":
-default:
-userZoom="fixed";
-break;}
-
-}
-}
-
-
-
-if(zoom!==null&&(
-viewportProperties["width"]===undefined||width===undefined)){
-if(viewportProperties["height"]!==undefined){
-
-minWidth=null;
-maxWidth=null;
-}else{
-
-minWidth="extend-to-zoom";
-maxWidth="extend-to-zoom";
-}
-}
-
-
-
-
-
-
-if(minZoom!==null&&maxZoom!==null){
-maxZoom=max(minZoom,maxZoom);
-}
-
-
-if(zoom!==null){
-zoom=clamp(zoom,minZoom,maxZoom);
-}
-
-
-var extendZoom=zoom===null&&maxZoom===null?null:min(zoom,maxZoom);
-var extendWidth,extendHeight;
-if(extendZoom===null){
-if(maxWidth==="extend-to-zoom"){
-maxWidth=null;
-}
-if(maxHeight==="extend-to-zoom"){
-maxHeight=null;
-}
-if(minWidth==="extend-to-zoom"){
-minWidth=maxWidth;
-}
-if(minHeight==="extend-to-zoom"){
-minHeight=maxHeight;
-}
-}else{
-extendWidth=initialWidth/extendZoom;
-extendHeight=initialHeight/extendZoom;
-
-if(maxWidth==="extend-to-zoom"){
-maxWidth=extendWidth;
-}
-if(maxHeight==="extend-to-zoom"){
-maxHeight=extendHeight;
-}
-if(minWidth==="extend-to-zoom"){
-minWidth=max(extendWidth,maxWidth);
-}
-if(minHeight==="extend-to-zoom"){
-minHeight=max(extendHeight,maxHeight);
-}
-}
-
-
-if(minWidth!==null||maxWidth!==null){
-width=max(minWidth,min(maxWidth,initialWidth));
-}
-if(minHeight!==null||maxHeight!==null){
-height=max(minHeight,min(maxHeight,initialHeight));
-}
-
-
-if(width===null){
-if(height===null){
-width=initialWidth;
-}else{
-if(initialHeight!==0){
-width=Math.round(height*(initialWidth/initialHeight));
-}else{
-width=initialWidth;
-}
-}
-}
-if(height===null){
-if(initialWidth!==0){
-height=Math.round(width*(initialHeight/initialWidth));
-}else{
-height=initialHeight;
-}
-}
-
-return{zoom:zoom,width:width,height:height,userZoom:userZoom};
-};
-
-function min(a,b){
-if(a===null)return b;
-if(b===null)return a;
-return Math.min(a,b);
-}
-
-function max(a,b){
-if(a===null)return b;
-if(b===null)return a;
-return Math.max(a,b);
-}
-
-
-function translateLengthProperty(prop,vw,vh){
-
-if(typeof prop==="number"){
-if(prop>=0){
-
-return clamp(prop,1,10000);
-}else{
-return undefined;
-}
-}
-if(prop==="device-width"){
-return 100*vw;
-}
-if(prop==="device-height"){
-return 100*vh;
-}
-return 1;
-}
-
-function translateZoomProperty(prop){
-
-if(typeof prop==="number"){
-if(prop>=0){
-
-return clamp(prop,0.1,10);
-}else{
-return undefined;
-}
-}
-if(prop==="yes"){
-return 1;
-}
-if(prop==="device-width"||prop==="device-height"){
-return 10;
-}
-if(prop==="no"||prop===null){
-return 0.1;
-}
-}
-
-
-function clamp(value,minv,maxv){
-return max(min(value,maxv),minv);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-exports.parseMetaViewPortContent=function(S){
-var parsedContent={
-validProperties:{},
-unknownProperties:{},
-invalidValues:{}};
-
-var i=1;
-while(i<=S.length){
-while(i<=S.length&&RegExp(' |\x0A|\x09|\0d|,|;|=').test(S[i-1])){
-i++;
-}
-if(i<=S.length){
-i=parseProperty(parsedContent,S,i);
-}
-}
-return parsedContent;
-};
-
-var propertyNames=["width","height","initial-scale","minimum-scale","maximum-scale","user-scalable","shrink-to-fit","viewport-fit"];
-
-function parseProperty(parsedContent,S,i){
-var start=i;
-while(i<=S.length&&!RegExp(' |\x0A|\x09|\0d|,|;|=').test(S[i-1])){
-i++;
-}
-if(i>S.length||RegExp(',|;').test(S[i-1])){
-return i;
-}
-var propertyName=S.slice(start-1,i-1);
-while(i<=S.length&&!RegExp(',|;|=').test(S[i-1])){
-i++;
-}
-if(i>S.length||RegExp(',|;').test(S[i-1])){
-return i;
-}
-while(i<=S.length&&RegExp(' |\x0A|\x09|\0d|=').test(S[i-1])){
-i++;
-}
-if(i>S.length||RegExp(',|;').test(S[i-1])){
-return i;
-}
-start=i;
-while(i<=S.length&&!RegExp(' |\x0A|\x09|\0d|,|;|=').test(S[i-1])){
-i++;
-}
-var propertyValue=S.slice(start-1,i-1);
-setProperty(parsedContent,propertyName,propertyValue);
-return i;
-}
-
-function setProperty(parsedContent,name,value){
-if(propertyNames.indexOf(name)>=0){
-var number=parseFloat(value);
-if(!isNaN(number)){
-parsedContent.validProperties[name]=number;
-return;
-}
-var string=value.toLowerCase();
-
-if(string==="yes"||string==="no"||string==="device-width"||string==="device-height"||
-
-
-name.toLowerCase()==='viewport-fit'&&(string==='auto'||string==='cover')){
-
-parsedContent.validProperties[name]=string;
-return;
-}
-
-parsedContent.validProperties[name]=null;
-parsedContent.invalidValues[name]=value;
-}else{
-parsedContent.unknownProperties[name]=value;
-}
-}
-
-exports.expectedValues={
-"width":["device-width","device-height","a positive number"],
-"height":["device-width","device-height","a positive number"],
-"initial-scale":["a positive number"],
-"minimum-scale":["a positive number"],
-"maximum-scale":["a positive number"],
-"user-scalable":["yes","no","0","1"],
-"shrink-to-fit":["yes","no"],
-"viewport-fit":["auto","cover"]};
-
-
-},{}],146:[function(require,module,exports){
-
-
-
-
-var s=1000;
-var m=s*60;
-var h=m*60;
-var d=h*24;
-var y=d*365.25;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-module.exports=function(val,options){
-options=options||{};
-var type=typeof val;
-if(type==='string'&&val.length>0){
-return parse(val);
-}else if(type==='number'&&isNaN(val)===false){
-return options.long?fmtLong(val):fmtShort(val);
-}
-throw new Error(
-'val is not a non-empty string or a valid number. val='+
-JSON.stringify(val));
-
-};
-
-
-
-
-
-
-
-
-
-function parse(str){
-str=String(str);
-if(str.length>100){
-return;
-}
-var match=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(
-str);
-
-if(!match){
-return;
-}
-var n=parseFloat(match[1]);
-var type=(match[2]||'ms').toLowerCase();
-switch(type){
-case'years':
-case'year':
-case'yrs':
-case'yr':
-case'y':
-return n*y;
-case'days':
-case'day':
-case'd':
-return n*d;
-case'hours':
-case'hour':
-case'hrs':
-case'hr':
-case'h':
-return n*h;
-case'minutes':
-case'minute':
-case'mins':
-case'min':
-case'm':
-return n*m;
-case'seconds':
-case'second':
-case'secs':
-case'sec':
-case's':
-return n*s;
-case'milliseconds':
-case'millisecond':
-case'msecs':
-case'msec':
-case'ms':
-return n;
-default:
-return undefined;}
-
-}
-
-
-
-
-
-
-
-
-
-function fmtShort(ms){
-if(ms>=d){
-return Math.round(ms/d)+'d';
-}
-if(ms>=h){
-return Math.round(ms/h)+'h';
-}
-if(ms>=m){
-return Math.round(ms/m)+'m';
-}
-if(ms>=s){
-return Math.round(ms/s)+'s';
-}
-return ms+'ms';
-}
-
-
-
-
-
-
-
-
-
-function fmtLong(ms){
-return plural(ms,d,'day')||
-plural(ms,h,'hour')||
-plural(ms,m,'minute')||
-plural(ms,s,'second')||
-ms+' ms';
-}
-
-
-
-
-
-function plural(ms,n,name){
-if(ms<n){
-return;
-}
-if(ms<n*1.5){
-return Math.floor(ms/n)+' '+name;
-}
-return Math.ceil(ms/n)+' '+name+'s';
-}
-
-},{}],147:[function(require,module,exports){
-'use strict';
-
-
-var TYPED_OK=typeof Uint8Array!=='undefined'&&
-typeof Uint16Array!=='undefined'&&
-typeof Int32Array!=='undefined';
-
-function _has(obj,key){
-return Object.prototype.hasOwnProperty.call(obj,key);
-}
-
-exports.assign=function(obj){
-var sources=Array.prototype.slice.call(arguments,1);
-while(sources.length){
-var source=sources.shift();
-if(!source){continue;}
-
-if(typeof source!=='object'){
-throw new TypeError(source+'must be non-object');
-}
-
-for(var p in source){
-if(_has(source,p)){
-obj[p]=source[p];
-}
-}
-}
-
-return obj;
-};
-
-
-
-exports.shrinkBuf=function(buf,size){
-if(buf.length===size){return buf;}
-if(buf.subarray){return buf.subarray(0,size);}
-buf.length=size;
-return buf;
-};
-
-
-var fnTyped={
-arraySet:function(dest,src,src_offs,len,dest_offs){
-if(src.subarray&&dest.subarray){
-dest.set(src.subarray(src_offs,src_offs+len),dest_offs);
-return;
-}
-
-for(var i=0;i<len;i++){
-dest[dest_offs+i]=src[src_offs+i];
-}
-},
-
-flattenChunks:function(chunks){
-var i,l,len,pos,chunk,result;
-
-
-len=0;
-for(i=0,l=chunks.length;i<l;i++){
-len+=chunks[i].length;
-}
-
-
-result=new Uint8Array(len);
-pos=0;
-for(i=0,l=chunks.length;i<l;i++){
-chunk=chunks[i];
-result.set(chunk,pos);
-pos+=chunk.length;
-}
-
-return result;
-}};
-
-
-var fnUntyped={
-arraySet:function(dest,src,src_offs,len,dest_offs){
-for(var i=0;i<len;i++){
-dest[dest_offs+i]=src[src_offs+i];
-}
-},
-
-flattenChunks:function(chunks){
-return[].concat.apply([],chunks);
-}};
-
-
-
-
-
-exports.setTyped=function(on){
-if(on){
-exports.Buf8=Uint8Array;
-exports.Buf16=Uint16Array;
-exports.Buf32=Int32Array;
-exports.assign(exports,fnTyped);
-}else{
-exports.Buf8=Array;
-exports.Buf16=Array;
-exports.Buf32=Array;
-exports.assign(exports,fnUntyped);
-}
-};
-
-exports.setTyped(TYPED_OK);
-
-},{}],148:[function(require,module,exports){
-'use strict';
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function adler32(adler,buf,len,pos){
-var s1=adler&0xffff|0,
-s2=adler>>>16&0xffff|0,
-n=0;
-
-while(len!==0){
-
-
-
-n=len>2000?2000:len;
-len-=n;
-
-do{
-s1=s1+buf[pos++]|0;
-s2=s2+s1|0;
-}while(--n);
-
-s1%=65521;
-s2%=65521;
-}
-
-return s1|s2<<16|0;
-}
-
-
-module.exports=adler32;
-
-},{}],149:[function(require,module,exports){
-'use strict';
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-module.exports={
-
-
-Z_NO_FLUSH:0,
-Z_PARTIAL_FLUSH:1,
-Z_SYNC_FLUSH:2,
-Z_FULL_FLUSH:3,
-Z_FINISH:4,
-Z_BLOCK:5,
-Z_TREES:6,
-
-
-
-
-Z_OK:0,
-Z_STREAM_END:1,
-Z_NEED_DICT:2,
-Z_ERRNO:-1,
-Z_STREAM_ERROR:-2,
-Z_DATA_ERROR:-3,
-
-Z_BUF_ERROR:-5,
-
-
-
-Z_NO_COMPRESSION:0,
-Z_BEST_SPEED:1,
-Z_BEST_COMPRESSION:9,
-Z_DEFAULT_COMPRESSION:-1,
-
-
-Z_FILTERED:1,
-Z_HUFFMAN_ONLY:2,
-Z_RLE:3,
-Z_FIXED:4,
-Z_DEFAULT_STRATEGY:0,
-
-
-Z_BINARY:0,
-Z_TEXT:1,
-
-Z_UNKNOWN:2,
-
-
-Z_DEFLATED:8};
-
-
-
-},{}],150:[function(require,module,exports){
-'use strict';
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function makeTable(){
-var c,table=[];
-
-for(var n=0;n<256;n++){
-c=n;
-for(var k=0;k<8;k++){
-c=c&1?0xEDB88320^c>>>1:c>>>1;
-}
-table[n]=c;
-}
-
-return table;
-}
-
-
-var crcTable=makeTable();
-
-
-function crc32(crc,buf,len,pos){
-var t=crcTable,
-end=pos+len;
-
-crc^=-1;
-
-for(var i=pos;i<end;i++){
-crc=crc>>>8^t[(crc^buf[i])&0xFF];
-}
-
-return crc^-1;
-}
-
-
-module.exports=crc32;
-
-},{}],151:[function(require,module,exports){
-'use strict';
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-var utils=require('../utils/common');
-var trees=require('./trees');
-var adler32=require('./adler32');
-var crc32=require('./crc32');
-var msg=require('./messages');
-
-
-
-
-
-
-var Z_NO_FLUSH=0;
-var Z_PARTIAL_FLUSH=1;
-
-var Z_FULL_FLUSH=3;
-var Z_FINISH=4;
-var Z_BLOCK=5;
-
-
-
-
-
-
-var Z_OK=0;
-var Z_STREAM_END=1;
-
-
-var Z_STREAM_ERROR=-2;
-var Z_DATA_ERROR=-3;
-
-var Z_BUF_ERROR=-5;
-
-
-
-
-
-
-
-var Z_DEFAULT_COMPRESSION=-1;
-
-
-var Z_FILTERED=1;
-var Z_HUFFMAN_ONLY=2;
-var Z_RLE=3;
-var Z_FIXED=4;
-var Z_DEFAULT_STRATEGY=0;
-
-
-
-
-
-var Z_UNKNOWN=2;
-
-
-
-var Z_DEFLATED=8;
-
-
-
-
-var MAX_MEM_LEVEL=9;
-
-var MAX_WBITS=15;
-
-var DEF_MEM_LEVEL=8;
-
-
-var LENGTH_CODES=29;
-
-var LITERALS=256;
-
-var L_CODES=LITERALS+1+LENGTH_CODES;
-
-var D_CODES=30;
-
-var BL_CODES=19;
-
-var HEAP_SIZE=2*L_CODES+1;
-
-var MAX_BITS=15;
-
-
-var MIN_MATCH=3;
-var MAX_MATCH=258;
-var MIN_LOOKAHEAD=MAX_MATCH+MIN_MATCH+1;
-
-var PRESET_DICT=0x20;
-
-var INIT_STATE=42;
-var EXTRA_STATE=69;
-var NAME_STATE=73;
-var COMMENT_STATE=91;
-var HCRC_STATE=103;
-var BUSY_STATE=113;
-var FINISH_STATE=666;
-
-var BS_NEED_MORE=1;
-var BS_BLOCK_DONE=2;
-var BS_FINISH_STARTED=3;
-var BS_FINISH_DONE=4;
-
-var OS_CODE=0x03;
-
-function err(strm,errorCode){
-strm.msg=msg[errorCode];
-return errorCode;
-}
-
-function rank(f){
-return(f<<1)-(f>4?9:0);
-}
-
-function zero(buf){var len=buf.length;while(--len>=0){buf[len]=0;}}
-
-
-
-
-
-
-
-
-function flush_pending(strm){
-var s=strm.state;
-
-
-var len=s.pending;
-if(len>strm.avail_out){
-len=strm.avail_out;
-}
-if(len===0){return;}
-
-utils.arraySet(strm.output,s.pending_buf,s.pending_out,len,strm.next_out);
-strm.next_out+=len;
-s.pending_out+=len;
-strm.total_out+=len;
-strm.avail_out-=len;
-s.pending-=len;
-if(s.pending===0){
-s.pending_out=0;
-}
-}
-
-
-function flush_block_only(s,last){
-trees._tr_flush_block(s,s.block_start>=0?s.block_start:-1,s.strstart-s.block_start,last);
-s.block_start=s.strstart;
-flush_pending(s.strm);
-}
-
-
-function put_byte(s,b){
-s.pending_buf[s.pending++]=b;
-}
-
-
-
-
-
-
-
-function putShortMSB(s,b){
-
-
-s.pending_buf[s.pending++]=b>>>8&0xff;
-s.pending_buf[s.pending++]=b&0xff;
-}
-
-
-
-
-
-
-
-
-
-function read_buf(strm,buf,start,size){
-var len=strm.avail_in;
-
-if(len>size){len=size;}
-if(len===0){return 0;}
-
-strm.avail_in-=len;
-
-
-utils.arraySet(buf,strm.input,strm.next_in,len,start);
-if(strm.state.wrap===1){
-strm.adler=adler32(strm.adler,buf,len,start);
-}else
-
-if(strm.state.wrap===2){
-strm.adler=crc32(strm.adler,buf,len,start);
-}
-
-strm.next_in+=len;
-strm.total_in+=len;
-
-return len;
-}
-
-
-
-
-
-
-
-
-
-
-
-function longest_match(s,cur_match){
-var chain_length=s.max_chain_length;
-var scan=s.strstart;
-var match;
-var len;
-var best_len=s.prev_length;
-var nice_match=s.nice_match;
-var limit=s.strstart>s.w_size-MIN_LOOKAHEAD?
-s.strstart-(s.w_size-MIN_LOOKAHEAD):0;
-
-var _win=s.window;
-
-var wmask=s.w_mask;
-var prev=s.prev;
-
-
-
-
-
-var strend=s.strstart+MAX_MATCH;
-var scan_end1=_win[scan+best_len-1];
-var scan_end=_win[scan+best_len];
-
-
-
-
-
-
-
-if(s.prev_length>=s.good_match){
-chain_length>>=2;
-}
-
-
-
-if(nice_match>s.lookahead){nice_match=s.lookahead;}
-
-
-
-do{
-
-match=cur_match;
-
-
-
-
-
-
-
-
-
-
-if(_win[match+best_len]!==scan_end||
-_win[match+best_len-1]!==scan_end1||
-_win[match]!==_win[scan]||
-_win[++match]!==_win[scan+1]){
-continue;
-}
-
-
-
-
-
-
-
-scan+=2;
-match++;
-
-
-
-
-
-do{
-
-}while(_win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&
-_win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&
-_win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&
-_win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&
-scan<strend);
-
-
-
-len=MAX_MATCH-(strend-scan);
-scan=strend-MAX_MATCH;
-
-if(len>best_len){
-s.match_start=cur_match;
-best_len=len;
-if(len>=nice_match){
-break;
-}
-scan_end1=_win[scan+best_len-1];
-scan_end=_win[scan+best_len];
-}
-}while((cur_match=prev[cur_match&wmask])>limit&&--chain_length!==0);
-
-if(best_len<=s.lookahead){
-return best_len;
-}
-return s.lookahead;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-function fill_window(s){
-var _w_size=s.w_size;
-var p,n,m,more,str;
-
-
-
-do{
-more=s.window_size-s.lookahead-s.strstart;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-if(s.strstart>=_w_size+(_w_size-MIN_LOOKAHEAD)){
-
-utils.arraySet(s.window,s.window,_w_size,_w_size,0);
-s.match_start-=_w_size;
-s.strstart-=_w_size;
-
-s.block_start-=_w_size;
-
-
-
-
-
-
-
-
-n=s.hash_size;
-p=n;
-do{
-m=s.head[--p];
-s.head[p]=m>=_w_size?m-_w_size:0;
-}while(--n);
-
-n=_w_size;
-p=n;
-do{
-m=s.prev[--p];
-s.prev[p]=m>=_w_size?m-_w_size:0;
-
-
-
-}while(--n);
-
-more+=_w_size;
-}
-if(s.strm.avail_in===0){
-break;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-n=read_buf(s.strm,s.window,s.strstart+s.lookahead,more);
-s.lookahead+=n;
-
-
-if(s.lookahead+s.insert>=MIN_MATCH){
-str=s.strstart-s.insert;
-s.ins_h=s.window[str];
-
-
-s.ins_h=(s.ins_h<<s.hash_shift^s.window[str+1])&s.hash_mask;
-
-
-
-while(s.insert){
-
-s.ins_h=(s.ins_h<<s.hash_shift^s.window[str+MIN_MATCH-1])&s.hash_mask;
-
-s.prev[str&s.w_mask]=s.head[s.ins_h];
-s.head[s.ins_h]=str;
-str++;
-s.insert--;
-if(s.lookahead+s.insert<MIN_MATCH){
-break;
-}
-}
-}
-
-
-
-
-}while(s.lookahead<MIN_LOOKAHEAD&&s.strm.avail_in!==0);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-
-
-
-
-
-
-
-
-function deflate_stored(s,flush){
-
-
-
-var max_block_size=0xffff;
-
-if(max_block_size>s.pending_buf_size-5){
-max_block_size=s.pending_buf_size-5;
-}
-
-
-for(;;){
-
-if(s.lookahead<=1){
-
-
-
-
-
-
-
-
-fill_window(s);
-if(s.lookahead===0&&flush===Z_NO_FLUSH){
-return BS_NEED_MORE;
-}
-
-if(s.lookahead===0){
-break;
-}
-
-}
-
-
-
-s.strstart+=s.lookahead;
-s.lookahead=0;
-
-
-var max_start=s.block_start+max_block_size;
-
-if(s.strstart===0||s.strstart>=max_start){
-
-s.lookahead=s.strstart-max_start;
-s.strstart=max_start;
-
-flush_block_only(s,false);
-if(s.strm.avail_out===0){
-return BS_NEED_MORE;
-}
-
-
-
-}
-
-
-
-if(s.strstart-s.block_start>=s.w_size-MIN_LOOKAHEAD){
-
-flush_block_only(s,false);
-if(s.strm.avail_out===0){
-return BS_NEED_MORE;
-}
-
-}
-}
-
-s.insert=0;
-
-if(flush===Z_FINISH){
-
-flush_block_only(s,true);
-if(s.strm.avail_out===0){
-return BS_FINISH_STARTED;
-}
-
-return BS_FINISH_DONE;
-}
-
-if(s.strstart>s.block_start){
-
-flush_block_only(s,false);
-if(s.strm.avail_out===0){
-return BS_NEED_MORE;
-}
-
-}
-
-return BS_NEED_MORE;
-}
-
-
-
-
-
-
-
-
-function deflate_fast(s,flush){
-var hash_head;
-var bflush;
-
-for(;;){
-
-
-
-
-
-if(s.lookahead<MIN_LOOKAHEAD){
-fill_window(s);
-if(s.lookahead<MIN_LOOKAHEAD&&flush===Z_NO_FLUSH){
-return BS_NEED_MORE;
-}
-if(s.lookahead===0){
-break;
-}
-}
-
-
-
-
-hash_head=0;
-if(s.lookahead>=MIN_MATCH){
-
-s.ins_h=(s.ins_h<<s.hash_shift^s.window[s.strstart+MIN_MATCH-1])&s.hash_mask;
-hash_head=s.prev[s.strstart&s.w_mask]=s.head[s.ins_h];
-s.head[s.ins_h]=s.strstart;
-
-}
-
-
-
-
-if(hash_head!==0&&s.strstart-hash_head<=s.w_size-MIN_LOOKAHEAD){
-
-
-
-
-s.match_length=longest_match(s,hash_head);
-
-}
-if(s.match_length>=MIN_MATCH){
-
-
-
-
-bflush=trees._tr_tally(s,s.strstart-s.match_start,s.match_length-MIN_MATCH);
-
-s.lookahead-=s.match_length;
-
-
-
-
-if(s.match_length<=s.max_lazy_match&&s.lookahead>=MIN_MATCH){
-s.match_length--;
-do{
-s.strstart++;
-
-s.ins_h=(s.ins_h<<s.hash_shift^s.window[s.strstart+MIN_MATCH-1])&s.hash_mask;
-hash_head=s.prev[s.strstart&s.w_mask]=s.head[s.ins_h];
-s.head[s.ins_h]=s.strstart;
-
-
-
-
-}while(--s.match_length!==0);
-s.strstart++;
-}else
-{
-s.strstart+=s.match_length;
-s.match_length=0;
-s.ins_h=s.window[s.strstart];
-
-s.ins_h=(s.ins_h<<s.hash_shift^s.window[s.strstart+1])&s.hash_mask;
-
-
-
-
-
-
-
-}
-}else{
-
-
-
-bflush=trees._tr_tally(s,0,s.window[s.strstart]);
-
-s.lookahead--;
-s.strstart++;
-}
-if(bflush){
-
-flush_block_only(s,false);
-if(s.strm.avail_out===0){
-return BS_NEED_MORE;
-}
-
-}
-}
-s.insert=s.strstart<MIN_MATCH-1?s.strstart:MIN_MATCH-1;
-if(flush===Z_FINISH){
-
-flush_block_only(s,true);
-if(s.strm.avail_out===0){
-return BS_FINISH_STARTED;
-}
-
-return BS_FINISH_DONE;
-}
-if(s.last_lit){
-
-flush_block_only(s,false);
-if(s.strm.avail_out===0){
-return BS_NEED_MORE;
-}
-
-}
-return BS_BLOCK_DONE;
-}
-
-
-
-
-
-
-function deflate_slow(s,flush){
-var hash_head;
-var bflush;
-
-var max_insert;
-
-
-for(;;){
-
-
-
-
-
-if(s.lookahead<MIN_LOOKAHEAD){
-fill_window(s);
-if(s.lookahead<MIN_LOOKAHEAD&&flush===Z_NO_FLUSH){
-return BS_NEED_MORE;
-}
-if(s.lookahead===0){break;}
-}
-
-
-
-
-hash_head=0;
-if(s.lookahead>=MIN_MATCH){
-
-s.ins_h=(s.ins_h<<s.hash_shift^s.window[s.strstart+MIN_MATCH-1])&s.hash_mask;
-hash_head=s.prev[s.strstart&s.w_mask]=s.head[s.ins_h];
-s.head[s.ins_h]=s.strstart;
-
-}
-
-
-
-s.prev_length=s.match_length;
-s.prev_match=s.match_start;
-s.match_length=MIN_MATCH-1;
-
-if(hash_head!==0&&s.prev_length<s.max_lazy_match&&
-s.strstart-hash_head<=s.w_size-MIN_LOOKAHEAD){
-
-
-
-
-s.match_length=longest_match(s,hash_head);
-
-
-if(s.match_length<=5&&(
-s.strategy===Z_FILTERED||s.match_length===MIN_MATCH&&s.strstart-s.match_start>4096)){
-
-
-
-
-s.match_length=MIN_MATCH-1;
-}
-}
-
-
-
-if(s.prev_length>=MIN_MATCH&&s.match_length<=s.prev_length){
-max_insert=s.strstart+s.lookahead-MIN_MATCH;
-
-
-
-
-
-
-bflush=trees._tr_tally(s,s.strstart-1-s.prev_match,s.prev_length-MIN_MATCH);
-
-
-
-
-
-s.lookahead-=s.prev_length-1;
-s.prev_length-=2;
-do{
-if(++s.strstart<=max_insert){
-
-s.ins_h=(s.ins_h<<s.hash_shift^s.window[s.strstart+MIN_MATCH-1])&s.hash_mask;
-hash_head=s.prev[s.strstart&s.w_mask]=s.head[s.ins_h];
-s.head[s.ins_h]=s.strstart;
-
-}
-}while(--s.prev_length!==0);
-s.match_available=0;
-s.match_length=MIN_MATCH-1;
-s.strstart++;
-
-if(bflush){
-
-flush_block_only(s,false);
-if(s.strm.avail_out===0){
-return BS_NEED_MORE;
-}
-
-}
-
-}else if(s.match_available){
-
-
-
-
-
-
-bflush=trees._tr_tally(s,0,s.window[s.strstart-1]);
-
-if(bflush){
-
-flush_block_only(s,false);
-
-}
-s.strstart++;
-s.lookahead--;
-if(s.strm.avail_out===0){
-return BS_NEED_MORE;
-}
-}else{
-
-
-
-s.match_available=1;
-s.strstart++;
-s.lookahead--;
-}
-}
-
-if(s.match_available){
-
-
-bflush=trees._tr_tally(s,0,s.window[s.strstart-1]);
-
-s.match_available=0;
-}
-s.insert=s.strstart<MIN_MATCH-1?s.strstart:MIN_MATCH-1;
-if(flush===Z_FINISH){
-
-flush_block_only(s,true);
-if(s.strm.avail_out===0){
-return BS_FINISH_STARTED;
-}
-
-return BS_FINISH_DONE;
-}
-if(s.last_lit){
-
-flush_block_only(s,false);
-if(s.strm.avail_out===0){
-return BS_NEED_MORE;
-}
-
-}
-
-return BS_BLOCK_DONE;
-}
-
-
-
-
-
-
-
-function deflate_rle(s,flush){
-var bflush;
-var prev;
-var scan,strend;
-
-var _win=s.window;
-
-for(;;){
-
-
-
-
-if(s.lookahead<=MAX_MATCH){
-fill_window(s);
-if(s.lookahead<=MAX_MATCH&&flush===Z_NO_FLUSH){
-return BS_NEED_MORE;
-}
-if(s.lookahead===0){break;}
-}
-
-
-s.match_length=0;
-if(s.lookahead>=MIN_MATCH&&s.strstart>0){
-scan=s.strstart-1;
-prev=_win[scan];
-if(prev===_win[++scan]&&prev===_win[++scan]&&prev===_win[++scan]){
-strend=s.strstart+MAX_MATCH;
-do{
-
-}while(prev===_win[++scan]&&prev===_win[++scan]&&
-prev===_win[++scan]&&prev===_win[++scan]&&
-prev===_win[++scan]&&prev===_win[++scan]&&
-prev===_win[++scan]&&prev===_win[++scan]&&
-scan<strend);
-s.match_length=MAX_MATCH-(strend-scan);
-if(s.match_length>s.lookahead){
-s.match_length=s.lookahead;
-}
-}
-
-}
-
-
-if(s.match_length>=MIN_MATCH){
-
-
-
-bflush=trees._tr_tally(s,1,s.match_length-MIN_MATCH);
-
-s.lookahead-=s.match_length;
-s.strstart+=s.match_length;
-s.match_length=0;
-}else{
-
-
-
-bflush=trees._tr_tally(s,0,s.window[s.strstart]);
-
-s.lookahead--;
-s.strstart++;
-}
-if(bflush){
-
-flush_block_only(s,false);
-if(s.strm.avail_out===0){
-return BS_NEED_MORE;
-}
-
-}
-}
-s.insert=0;
-if(flush===Z_FINISH){
-
-flush_block_only(s,true);
-if(s.strm.avail_out===0){
-return BS_FINISH_STARTED;
-}
-
-return BS_FINISH_DONE;
-}
-if(s.last_lit){
-
-flush_block_only(s,false);
-if(s.strm.avail_out===0){
-return BS_NEED_MORE;
-}
-
-}
-return BS_BLOCK_DONE;
-}
-
-
-
-
-
-function deflate_huff(s,flush){
-var bflush;
-
-for(;;){
-
-if(s.lookahead===0){
-fill_window(s);
-if(s.lookahead===0){
-if(flush===Z_NO_FLUSH){
-return BS_NEED_MORE;
-}
-break;
-}
-}
-
-
-s.match_length=0;
-
-
-bflush=trees._tr_tally(s,0,s.window[s.strstart]);
-s.lookahead--;
-s.strstart++;
-if(bflush){
-
-flush_block_only(s,false);
-if(s.strm.avail_out===0){
-return BS_NEED_MORE;
-}
-
-}
-}
-s.insert=0;
-if(flush===Z_FINISH){
-
-flush_block_only(s,true);
-if(s.strm.avail_out===0){
-return BS_FINISH_STARTED;
-}
-
-return BS_FINISH_DONE;
-}
-if(s.last_lit){
-
-flush_block_only(s,false);
-if(s.strm.avail_out===0){
-return BS_NEED_MORE;
-}
-
-}
-return BS_BLOCK_DONE;
-}
-
-
-
-
-
-
-function Config(good_length,max_lazy,nice_length,max_chain,func){
-this.good_length=good_length;
-this.max_lazy=max_lazy;
-this.nice_length=nice_length;
-this.max_chain=max_chain;
-this.func=func;
-}
-
-var configuration_table;
-
-configuration_table=[
-
-new Config(0,0,0,0,deflate_stored),
-new Config(4,4,8,4,deflate_fast),
-new Config(4,5,16,8,deflate_fast),
-new Config(4,6,32,32,deflate_fast),
-
-new Config(4,4,16,16,deflate_slow),
-new Config(8,16,32,32,deflate_slow),
-new Config(8,16,128,128,deflate_slow),
-new Config(8,32,128,256,deflate_slow),
-new Config(32,128,258,1024,deflate_slow),
-new Config(32,258,258,4096,deflate_slow)];
-
-
-
-
-
-
-function lm_init(s){
-s.window_size=2*s.w_size;
-
-
-zero(s.head);
-
-
-
-s.max_lazy_match=configuration_table[s.level].max_lazy;
-s.good_match=configuration_table[s.level].good_length;
-s.nice_match=configuration_table[s.level].nice_length;
-s.max_chain_length=configuration_table[s.level].max_chain;
-
-s.strstart=0;
-s.block_start=0;
-s.lookahead=0;
-s.insert=0;
-s.match_length=s.prev_length=MIN_MATCH-1;
-s.match_available=0;
-s.ins_h=0;
-}
-
-
-function DeflateState(){
-this.strm=null;
-this.status=0;
-this.pending_buf=null;
-this.pending_buf_size=0;
-this.pending_out=0;
-this.pending=0;
-this.wrap=0;
-this.gzhead=null;
-this.gzindex=0;
-this.method=Z_DEFLATED;
-this.last_flush=-1;
-
-this.w_size=0;
-this.w_bits=0;
-this.w_mask=0;
-
-this.window=null;
-
-
-
-
-
-
-
-this.window_size=0;
-
-
-
-
-this.prev=null;
-
-
-
-
-
-this.head=null;
-
-this.ins_h=0;
-this.hash_size=0;
-this.hash_bits=0;
-this.hash_mask=0;
-
-this.hash_shift=0;
-
-
-
-
-
-
-this.block_start=0;
-
-
-
-
-this.match_length=0;
-this.prev_match=0;
-this.match_available=0;
-this.strstart=0;
-this.match_start=0;
-this.lookahead=0;
-
-this.prev_length=0;
-
-
-
-
-this.max_chain_length=0;
-
-
-
-
-
-this.max_lazy_match=0;
-
-
-
-
-
-
-
-
-
-
-
-this.level=0;
-this.strategy=0;
-
-this.good_match=0;
-
-
-this.nice_match=0;
-
-
-
-
-
-
-
-
-
-
-
-this.dyn_ltree=new utils.Buf16(HEAP_SIZE*2);
-this.dyn_dtree=new utils.Buf16((2*D_CODES+1)*2);
-this.bl_tree=new utils.Buf16((2*BL_CODES+1)*2);
-zero(this.dyn_ltree);
-zero(this.dyn_dtree);
-zero(this.bl_tree);
-
-this.l_desc=null;
-this.d_desc=null;
-this.bl_desc=null;
-
-
-this.bl_count=new utils.Buf16(MAX_BITS+1);
-
-
-
-this.heap=new utils.Buf16(2*L_CODES+1);
-zero(this.heap);
-
-this.heap_len=0;
-this.heap_max=0;
-
-
-
-
-this.depth=new utils.Buf16(2*L_CODES+1);
-zero(this.depth);
-
-
-
-this.l_buf=0;
-
-this.lit_bufsize=0;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-this.last_lit=0;
-
-this.d_buf=0;
-
-
-
-
-
-this.opt_len=0;
-this.static_len=0;
-this.matches=0;
-this.insert=0;
-
-
-this.bi_buf=0;
-
-
-
-this.bi_valid=0;
-
-
-
-
-
-
-
-
-
-
-
-
-}
-
-
-function deflateResetKeep(strm){
-var s;
-
-if(!strm||!strm.state){
-return err(strm,Z_STREAM_ERROR);
-}
-
-strm.total_in=strm.total_out=0;
-strm.data_type=Z_UNKNOWN;
-
-s=strm.state;
-s.pending=0;
-s.pending_out=0;
-
-if(s.wrap<0){
-s.wrap=-s.wrap;
-
-}
-s.status=s.wrap?INIT_STATE:BUSY_STATE;
-strm.adler=s.wrap===2?
-0:
-
-1;
-s.last_flush=Z_NO_FLUSH;
-trees._tr_init(s);
-return Z_OK;
-}
-
-
-function deflateReset(strm){
-var ret=deflateResetKeep(strm);
-if(ret===Z_OK){
-lm_init(strm.state);
-}
-return ret;
-}
-
-
-function deflateSetHeader(strm,head){
-if(!strm||!strm.state){return Z_STREAM_ERROR;}
-if(strm.state.wrap!==2){return Z_STREAM_ERROR;}
-strm.state.gzhead=head;
-return Z_OK;
-}
-
-
-function deflateInit2(strm,level,method,windowBits,memLevel,strategy){
-if(!strm){
-return Z_STREAM_ERROR;
-}
-var wrap=1;
-
-if(level===Z_DEFAULT_COMPRESSION){
-level=6;
-}
-
-if(windowBits<0){
-wrap=0;
-windowBits=-windowBits;
-}else
-
-if(windowBits>15){
-wrap=2;
-windowBits-=16;
-}
-
-
-if(memLevel<1||memLevel>MAX_MEM_LEVEL||method!==Z_DEFLATED||
-windowBits<8||windowBits>15||level<0||level>9||
-strategy<0||strategy>Z_FIXED){
-return err(strm,Z_STREAM_ERROR);
-}
-
-
-if(windowBits===8){
-windowBits=9;
-}
-
-
-var s=new DeflateState();
-
-strm.state=s;
-s.strm=strm;
-
-s.wrap=wrap;
-s.gzhead=null;
-s.w_bits=windowBits;
-s.w_size=1<<s.w_bits;
-s.w_mask=s.w_size-1;
-
-s.hash_bits=memLevel+7;
-s.hash_size=1<<s.hash_bits;
-s.hash_mask=s.hash_size-1;
-s.hash_shift=~~((s.hash_bits+MIN_MATCH-1)/MIN_MATCH);
-
-s.window=new utils.Buf8(s.w_size*2);
-s.head=new utils.Buf16(s.hash_size);
-s.prev=new utils.Buf16(s.w_size);
-
-
-
-
-s.lit_bufsize=1<<memLevel+6;
-
-s.pending_buf_size=s.lit_bufsize*4;
-
-
-
-s.pending_buf=new utils.Buf8(s.pending_buf_size);
-
-
-
-s.d_buf=1*s.lit_bufsize;
-
-
-s.l_buf=(1+2)*s.lit_bufsize;
-
-s.level=level;
-s.strategy=strategy;
-s.method=method;
-
-return deflateReset(strm);
-}
-
-function deflateInit(strm,level){
-return deflateInit2(strm,level,Z_DEFLATED,MAX_WBITS,DEF_MEM_LEVEL,Z_DEFAULT_STRATEGY);
-}
-
-
-function deflate(strm,flush){
-var old_flush,s;
-var beg,val;
-
-if(!strm||!strm.state||
-flush>Z_BLOCK||flush<0){
-return strm?err(strm,Z_STREAM_ERROR):Z_STREAM_ERROR;
-}
-
-s=strm.state;
-
-if(!strm.output||
-!strm.input&&strm.avail_in!==0||
-s.status===FINISH_STATE&&flush!==Z_FINISH){
-return err(strm,strm.avail_out===0?Z_BUF_ERROR:Z_STREAM_ERROR);
-}
-
-s.strm=strm;
-old_flush=s.last_flush;
-s.last_flush=flush;
-
-
-if(s.status===INIT_STATE){
-
-if(s.wrap===2){
-strm.adler=0;
-put_byte(s,31);
-put_byte(s,139);
-put_byte(s,8);
-if(!s.gzhead){
-put_byte(s,0);
-put_byte(s,0);
-put_byte(s,0);
-put_byte(s,0);
-put_byte(s,0);
-put_byte(s,s.level===9?2:
-s.strategy>=Z_HUFFMAN_ONLY||s.level<2?
-4:0);
-put_byte(s,OS_CODE);
-s.status=BUSY_STATE;
-}else
-{
-put_byte(s,(s.gzhead.text?1:0)+(
-s.gzhead.hcrc?2:0)+(
-!s.gzhead.extra?0:4)+(
-!s.gzhead.name?0:8)+(
-!s.gzhead.comment?0:16));
-
-put_byte(s,s.gzhead.time&0xff);
-put_byte(s,s.gzhead.time>>8&0xff);
-put_byte(s,s.gzhead.time>>16&0xff);
-put_byte(s,s.gzhead.time>>24&0xff);
-put_byte(s,s.level===9?2:
-s.strategy>=Z_HUFFMAN_ONLY||s.level<2?
-4:0);
-put_byte(s,s.gzhead.os&0xff);
-if(s.gzhead.extra&&s.gzhead.extra.length){
-put_byte(s,s.gzhead.extra.length&0xff);
-put_byte(s,s.gzhead.extra.length>>8&0xff);
-}
-if(s.gzhead.hcrc){
-strm.adler=crc32(strm.adler,s.pending_buf,s.pending,0);
-}
-s.gzindex=0;
-s.status=EXTRA_STATE;
-}
-}else
-
-{
-var header=Z_DEFLATED+(s.w_bits-8<<4)<<8;
-var level_flags=-1;
-
-if(s.strategy>=Z_HUFFMAN_ONLY||s.level<2){
-level_flags=0;
-}else if(s.level<6){
-level_flags=1;
-}else if(s.level===6){
-level_flags=2;
-}else{
-level_flags=3;
-}
-header|=level_flags<<6;
-if(s.strstart!==0){header|=PRESET_DICT;}
-header+=31-header%31;
-
-s.status=BUSY_STATE;
-putShortMSB(s,header);
-
-
-if(s.strstart!==0){
-putShortMSB(s,strm.adler>>>16);
-putShortMSB(s,strm.adler&0xffff);
-}
-strm.adler=1;
-}
-}
-
-
-if(s.status===EXTRA_STATE){
-if(s.gzhead.extra){
-beg=s.pending;
-
-while(s.gzindex<(s.gzhead.extra.length&0xffff)){
-if(s.pending===s.pending_buf_size){
-if(s.gzhead.hcrc&&s.pending>beg){
-strm.adler=crc32(strm.adler,s.pending_buf,s.pending-beg,beg);
-}
-flush_pending(strm);
-beg=s.pending;
-if(s.pending===s.pending_buf_size){
-break;
-}
-}
-put_byte(s,s.gzhead.extra[s.gzindex]&0xff);
-s.gzindex++;
-}
-if(s.gzhead.hcrc&&s.pending>beg){
-strm.adler=crc32(strm.adler,s.pending_buf,s.pending-beg,beg);
-}
-if(s.gzindex===s.gzhead.extra.length){
-s.gzindex=0;
-s.status=NAME_STATE;
-}
-}else
-{
-s.status=NAME_STATE;
-}
-}
-if(s.status===NAME_STATE){
-if(s.gzhead.name){
-beg=s.pending;
-
-
-do{
-if(s.pending===s.pending_buf_size){
-if(s.gzhead.hcrc&&s.pending>beg){
-strm.adler=crc32(strm.adler,s.pending_buf,s.pending-beg,beg);
-}
-flush_pending(strm);
-beg=s.pending;
-if(s.pending===s.pending_buf_size){
-val=1;
-break;
-}
-}
-
-if(s.gzindex<s.gzhead.name.length){
-val=s.gzhead.name.charCodeAt(s.gzindex++)&0xff;
-}else{
-val=0;
-}
-put_byte(s,val);
-}while(val!==0);
-
-if(s.gzhead.hcrc&&s.pending>beg){
-strm.adler=crc32(strm.adler,s.pending_buf,s.pending-beg,beg);
-}
-if(val===0){
-s.gzindex=0;
-s.status=COMMENT_STATE;
-}
-}else
-{
-s.status=COMMENT_STATE;
-}
-}
-if(s.status===COMMENT_STATE){
-if(s.gzhead.comment){
-beg=s.pending;
-
-
-do{
-if(s.pending===s.pending_buf_size){
-if(s.gzhead.hcrc&&s.pending>beg){
-strm.adler=crc32(strm.adler,s.pending_buf,s.pending-beg,beg);
-}
-flush_pending(strm);
-beg=s.pending;
-if(s.pending===s.pending_buf_size){
-val=1;
-break;
-}
-}
-
-if(s.gzindex<s.gzhead.comment.length){
-val=s.gzhead.comment.charCodeAt(s.gzindex++)&0xff;
-}else{
-val=0;
-}
-put_byte(s,val);
-}while(val!==0);
-
-if(s.gzhead.hcrc&&s.pending>beg){
-strm.adler=crc32(strm.adler,s.pending_buf,s.pending-beg,beg);
-}
-if(val===0){
-s.status=HCRC_STATE;
-}
-}else
-{
-s.status=HCRC_STATE;
-}
-}
-if(s.status===HCRC_STATE){
-if(s.gzhead.hcrc){
-if(s.pending+2>s.pending_buf_size){
-flush_pending(strm);
-}
-if(s.pending+2<=s.pending_buf_size){
-put_byte(s,strm.adler&0xff);
-put_byte(s,strm.adler>>8&0xff);
-strm.adler=0;
-s.status=BUSY_STATE;
-}
-}else
-{
-s.status=BUSY_STATE;
-}
-}
-
-
-
-if(s.pending!==0){
-flush_pending(strm);
-if(strm.avail_out===0){
-
-
-
-
-
-
-s.last_flush=-1;
-return Z_OK;
-}
-
-
-
-
-
-}else if(strm.avail_in===0&&rank(flush)<=rank(old_flush)&&
-flush!==Z_FINISH){
-return err(strm,Z_BUF_ERROR);
-}
-
-
-if(s.status===FINISH_STATE&&strm.avail_in!==0){
-return err(strm,Z_BUF_ERROR);
-}
-
-
-
-if(strm.avail_in!==0||s.lookahead!==0||
-flush!==Z_NO_FLUSH&&s.status!==FINISH_STATE){
-var bstate=s.strategy===Z_HUFFMAN_ONLY?deflate_huff(s,flush):
-s.strategy===Z_RLE?deflate_rle(s,flush):
-configuration_table[s.level].func(s,flush);
-
-if(bstate===BS_FINISH_STARTED||bstate===BS_FINISH_DONE){
-s.status=FINISH_STATE;
-}
-if(bstate===BS_NEED_MORE||bstate===BS_FINISH_STARTED){
-if(strm.avail_out===0){
-s.last_flush=-1;
-
-}
-return Z_OK;
-
-
-
-
-
-
-
-}
-if(bstate===BS_BLOCK_DONE){
-if(flush===Z_PARTIAL_FLUSH){
-trees._tr_align(s);
-}else
-if(flush!==Z_BLOCK){
-
-trees._tr_stored_block(s,0,0,false);
-
-
-
-if(flush===Z_FULL_FLUSH){
-
-zero(s.head);
-
-if(s.lookahead===0){
-s.strstart=0;
-s.block_start=0;
-s.insert=0;
-}
-}
-}
-flush_pending(strm);
-if(strm.avail_out===0){
-s.last_flush=-1;
-return Z_OK;
-}
-}
-}
-
-
-
-if(flush!==Z_FINISH){return Z_OK;}
-if(s.wrap<=0){return Z_STREAM_END;}
-
-
-if(s.wrap===2){
-put_byte(s,strm.adler&0xff);
-put_byte(s,strm.adler>>8&0xff);
-put_byte(s,strm.adler>>16&0xff);
-put_byte(s,strm.adler>>24&0xff);
-put_byte(s,strm.total_in&0xff);
-put_byte(s,strm.total_in>>8&0xff);
-put_byte(s,strm.total_in>>16&0xff);
-put_byte(s,strm.total_in>>24&0xff);
-}else
-
-{
-putShortMSB(s,strm.adler>>>16);
-putShortMSB(s,strm.adler&0xffff);
-}
-
-flush_pending(strm);
-
-
-
-if(s.wrap>0){s.wrap=-s.wrap;}
-
-return s.pending!==0?Z_OK:Z_STREAM_END;
-}
-
-function deflateEnd(strm){
-var status;
-
-if(!strm||!strm.state){
-return Z_STREAM_ERROR;
-}
-
-status=strm.state.status;
-if(status!==INIT_STATE&&
-status!==EXTRA_STATE&&
-status!==NAME_STATE&&
-status!==COMMENT_STATE&&
-status!==HCRC_STATE&&
-status!==BUSY_STATE&&
-status!==FINISH_STATE)
-{
-return err(strm,Z_STREAM_ERROR);
-}
-
-strm.state=null;
-
-return status===BUSY_STATE?err(strm,Z_DATA_ERROR):Z_OK;
-}
-
-
-
-
-
-
-function deflateSetDictionary(strm,dictionary){
-var dictLength=dictionary.length;
-
-var s;
-var str,n;
-var wrap;
-var avail;
-var next;
-var input;
-var tmpDict;
-
-if(!strm||!strm.state){
-return Z_STREAM_ERROR;
-}
-
-s=strm.state;
-wrap=s.wrap;
-
-if(wrap===2||wrap===1&&s.status!==INIT_STATE||s.lookahead){
-return Z_STREAM_ERROR;
-}
-
-
-if(wrap===1){
-
-strm.adler=adler32(strm.adler,dictionary,dictLength,0);
-}
-
-s.wrap=0;
-
-
-if(dictLength>=s.w_size){
-if(wrap===0){
-
-zero(s.head);
-s.strstart=0;
-s.block_start=0;
-s.insert=0;
-}
-
-
-tmpDict=new utils.Buf8(s.w_size);
-utils.arraySet(tmpDict,dictionary,dictLength-s.w_size,s.w_size,0);
-dictionary=tmpDict;
-dictLength=s.w_size;
-}
-
-avail=strm.avail_in;
-next=strm.next_in;
-input=strm.input;
-strm.avail_in=dictLength;
-strm.next_in=0;
-strm.input=dictionary;
-fill_window(s);
-while(s.lookahead>=MIN_MATCH){
-str=s.strstart;
-n=s.lookahead-(MIN_MATCH-1);
-do{
-
-s.ins_h=(s.ins_h<<s.hash_shift^s.window[str+MIN_MATCH-1])&s.hash_mask;
-
-s.prev[str&s.w_mask]=s.head[s.ins_h];
-
-s.head[s.ins_h]=str;
-str++;
-}while(--n);
-s.strstart=str;
-s.lookahead=MIN_MATCH-1;
-fill_window(s);
-}
-s.strstart+=s.lookahead;
-s.block_start=s.strstart;
-s.insert=s.lookahead;
-s.lookahead=0;
-s.match_length=s.prev_length=MIN_MATCH-1;
-s.match_available=0;
-strm.next_in=next;
-strm.input=input;
-strm.avail_in=avail;
-s.wrap=wrap;
-return Z_OK;
-}
-
-
-exports.deflateInit=deflateInit;
-exports.deflateInit2=deflateInit2;
-exports.deflateReset=deflateReset;
-exports.deflateResetKeep=deflateResetKeep;
-exports.deflateSetHeader=deflateSetHeader;
-exports.deflate=deflate;
-exports.deflateEnd=deflateEnd;
-exports.deflateSetDictionary=deflateSetDictionary;
-exports.deflateInfo='pako deflate (from Nodeca project)';
-
-
-
-
-
-
-
-
-
-
-},{"../utils/common":147,"./adler32":148,"./crc32":150,"./messages":152,"./trees":153}],152:[function(require,module,exports){
-'use strict';
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-module.exports={
-2:'need dictionary',
-1:'stream end',
-0:'',
-'-1':'file error',
-'-2':'stream error',
-'-3':'data error',
-'-4':'insufficient memory',
-'-5':'buffer error',
-'-6':'incompatible version'};
-
-
-},{}],153:[function(require,module,exports){
-'use strict';
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-var utils=require('../utils/common');
-
-
-
-
-
-
-
-
-var Z_FIXED=4;
-
-
-
-var Z_BINARY=0;
-var Z_TEXT=1;
-
-var Z_UNKNOWN=2;
-
-
-
-
-function zero(buf){var len=buf.length;while(--len>=0){buf[len]=0;}}
-
-
-
-var STORED_BLOCK=0;
-var STATIC_TREES=1;
-var DYN_TREES=2;
-
-
-var MIN_MATCH=3;
-var MAX_MATCH=258;
-
-
-
-
-
-
-
-var LENGTH_CODES=29;
-
-
-var LITERALS=256;
-
-
-var L_CODES=LITERALS+1+LENGTH_CODES;
-
-
-var D_CODES=30;
-
-
-var BL_CODES=19;
-
-
-var HEAP_SIZE=2*L_CODES+1;
-
-
-var MAX_BITS=15;
-
-
-var Buf_size=16;
-
-
-
-
-
-
-
-var MAX_BL_BITS=7;
-
-
-var END_BLOCK=256;
-
-
-var REP_3_6=16;
-
-
-var REPZ_3_10=17;
-
-
-var REPZ_11_138=18;
-
-
-
-var extra_lbits=
-[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];
-
-var extra_dbits=
-[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];
-
-var extra_blbits=
-[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];
-
-var bl_order=
-[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];
-
-
-
-
-
-
-
-
-
-
-
-
-var DIST_CODE_LEN=512;
-
-
-var static_ltree=new Array((L_CODES+2)*2);
-zero(static_ltree);
-
-
-
-
-
-
-var static_dtree=new Array(D_CODES*2);
-zero(static_dtree);
-
-
-
-
-var _dist_code=new Array(DIST_CODE_LEN);
-zero(_dist_code);
-
-
-
-
-
-var _length_code=new Array(MAX_MATCH-MIN_MATCH+1);
-zero(_length_code);
-
-
-var base_length=new Array(LENGTH_CODES);
-zero(base_length);
-
-
-var base_dist=new Array(D_CODES);
-zero(base_dist);
-
-
-
-function StaticTreeDesc(static_tree,extra_bits,extra_base,elems,max_length){
-
-this.static_tree=static_tree;
-this.extra_bits=extra_bits;
-this.extra_base=extra_base;
-this.elems=elems;
-this.max_length=max_length;
-
-
-this.has_stree=static_tree&&static_tree.length;
-}
-
-
-var static_l_desc;
-var static_d_desc;
-var static_bl_desc;
-
-
-function TreeDesc(dyn_tree,stat_desc){
-this.dyn_tree=dyn_tree;
-this.max_code=0;
-this.stat_desc=stat_desc;
-}
-
-
-
-function d_code(dist){
-return dist<256?_dist_code[dist]:_dist_code[256+(dist>>>7)];
-}
-
-
-
-
-
-
-function put_short(s,w){
-
-
-s.pending_buf[s.pending++]=w&0xff;
-s.pending_buf[s.pending++]=w>>>8&0xff;
-}
-
-
-
-
-
-
-function send_bits(s,value,length){
-if(s.bi_valid>Buf_size-length){
-s.bi_buf|=value<<s.bi_valid&0xffff;
-put_short(s,s.bi_buf);
-s.bi_buf=value>>Buf_size-s.bi_valid;
-s.bi_valid+=length-Buf_size;
-}else{
-s.bi_buf|=value<<s.bi_valid&0xffff;
-s.bi_valid+=length;
-}
-}
-
-
-function send_code(s,c,tree){
-send_bits(s,tree[c*2],tree[c*2+1]);
-}
-
-
-
-
-
-
-
-function bi_reverse(code,len){
-var res=0;
-do{
-res|=code&1;
-code>>>=1;
-res<<=1;
-}while(--len>0);
-return res>>>1;
-}
-
-
-
-
-
-function bi_flush(s){
-if(s.bi_valid===16){
-put_short(s,s.bi_buf);
-s.bi_buf=0;
-s.bi_valid=0;
-
-}else if(s.bi_valid>=8){
-s.pending_buf[s.pending++]=s.bi_buf&0xff;
-s.bi_buf>>=8;
-s.bi_valid-=8;
-}
-}
-
-
-
-
-
-
-
-
-
-
-
-
-function gen_bitlen(s,desc)
-
-
-{
-var tree=desc.dyn_tree;
-var max_code=desc.max_code;
-var stree=desc.stat_desc.static_tree;
-var has_stree=desc.stat_desc.has_stree;
-var extra=desc.stat_desc.extra_bits;
-var base=desc.stat_desc.extra_base;
-var max_length=desc.stat_desc.max_length;
-var h;
-var n,m;
-var bits;
-var xbits;
-var f;
-var overflow=0;
-
-for(bits=0;bits<=MAX_BITS;bits++){
-s.bl_count[bits]=0;
-}
-
-
-
-
-tree[s.heap[s.heap_max]*2+1]=0;
-
-for(h=s.heap_max+1;h<HEAP_SIZE;h++){
-n=s.heap[h];
-bits=tree[tree[n*2+1]*2+1]+1;
-if(bits>max_length){
-bits=max_length;
-overflow++;
-}
-tree[n*2+1]=bits;
-
-
-if(n>max_code){continue;}
-
-s.bl_count[bits]++;
-xbits=0;
-if(n>=base){
-xbits=extra[n-base];
-}
-f=tree[n*2];
-s.opt_len+=f*(bits+xbits);
-if(has_stree){
-s.static_len+=f*(stree[n*2+1]+xbits);
-}
-}
-if(overflow===0){return;}
-
-
-
-
-
-do{
-bits=max_length-1;
-while(s.bl_count[bits]===0){bits--;}
-s.bl_count[bits]--;
-s.bl_count[bits+1]+=2;
-s.bl_count[max_length]--;
-
-
-
-overflow-=2;
-}while(overflow>0);
-
-
-
-
-
-
-for(bits=max_length;bits!==0;bits--){
-n=s.bl_count[bits];
-while(n!==0){
-m=s.heap[--h];
-if(m>max_code){continue;}
-if(tree[m*2+1]!==bits){
-
-s.opt_len+=(bits-tree[m*2+1])*tree[m*2];
-tree[m*2+1]=bits;
-}
-n--;
-}
-}
-}
-
-
-
-
-
-
-
-
-
-
-function gen_codes(tree,max_code,bl_count)
-
-
-
-{
-var next_code=new Array(MAX_BITS+1);
-var code=0;
-var bits;
-var n;
-
-
-
-
-for(bits=1;bits<=MAX_BITS;bits++){
-next_code[bits]=code=code+bl_count[bits-1]<<1;
-}
-
-
-
-
-
-
-
-for(n=0;n<=max_code;n++){
-var len=tree[n*2+1];
-if(len===0){continue;}
-
-tree[n*2]=bi_reverse(next_code[len]++,len);
-
-
-
-}
-}
-
-
-
-
-
-function tr_static_init(){
-var n;
-var bits;
-var length;
-var code;
-var dist;
-var bl_count=new Array(MAX_BITS+1);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-length=0;
-for(code=0;code<LENGTH_CODES-1;code++){
-base_length[code]=length;
-for(n=0;n<1<<extra_lbits[code];n++){
-_length_code[length++]=code;
-}
-}
-
-
-
-
-
-_length_code[length-1]=code;
-
-
-dist=0;
-for(code=0;code<16;code++){
-base_dist[code]=dist;
-for(n=0;n<1<<extra_dbits[code];n++){
-_dist_code[dist++]=code;
-}
-}
-
-dist>>=7;
-for(;code<D_CODES;code++){
-base_dist[code]=dist<<7;
-for(n=0;n<1<<extra_dbits[code]-7;n++){
-_dist_code[256+dist++]=code;
-}
-}
-
-
-
-for(bits=0;bits<=MAX_BITS;bits++){
-bl_count[bits]=0;
-}
-
-n=0;
-while(n<=143){
-static_ltree[n*2+1]=8;
-n++;
-bl_count[8]++;
-}
-while(n<=255){
-static_ltree[n*2+1]=9;
-n++;
-bl_count[9]++;
-}
-while(n<=279){
-static_ltree[n*2+1]=7;
-n++;
-bl_count[7]++;
-}
-while(n<=287){
-static_ltree[n*2+1]=8;
-n++;
-bl_count[8]++;
-}
-
-
-
-
-gen_codes(static_ltree,L_CODES+1,bl_count);
-
-
-for(n=0;n<D_CODES;n++){
-static_dtree[n*2+1]=5;
-static_dtree[n*2]=bi_reverse(n,5);
-}
-
-
-static_l_desc=new StaticTreeDesc(static_ltree,extra_lbits,LITERALS+1,L_CODES,MAX_BITS);
-static_d_desc=new StaticTreeDesc(static_dtree,extra_dbits,0,D_CODES,MAX_BITS);
-static_bl_desc=new StaticTreeDesc(new Array(0),extra_blbits,0,BL_CODES,MAX_BL_BITS);
-
-
-}
-
-
-
-
-
-function init_block(s){
-var n;
-
-
-for(n=0;n<L_CODES;n++){s.dyn_ltree[n*2]=0;}
-for(n=0;n<D_CODES;n++){s.dyn_dtree[n*2]=0;}
-for(n=0;n<BL_CODES;n++){s.bl_tree[n*2]=0;}
-
-s.dyn_ltree[END_BLOCK*2]=1;
-s.opt_len=s.static_len=0;
-s.last_lit=s.matches=0;
-}
-
-
-
-
-
-function bi_windup(s)
-{
-if(s.bi_valid>8){
-put_short(s,s.bi_buf);
-}else if(s.bi_valid>0){
-
-s.pending_buf[s.pending++]=s.bi_buf;
-}
-s.bi_buf=0;
-s.bi_valid=0;
-}
-
-
-
-
-
-function copy_block(s,buf,len,header)
-
-
-
-
-{
-bi_windup(s);
-
-if(header){
-put_short(s,len);
-put_short(s,~len);
-}
-
-
-
-utils.arraySet(s.pending_buf,s.window,buf,len,s.pending);
-s.pending+=len;
-}
-
-
-
-
-
-function smaller(tree,n,m,depth){
-var _n2=n*2;
-var _m2=m*2;
-return tree[_n2]<tree[_m2]||
-tree[_n2]===tree[_m2]&&depth[n]<=depth[m];
-}
-
-
-
-
-
-
-
-function pqdownheap(s,tree,k)
-
-
-
-{
-var v=s.heap[k];
-var j=k<<1;
-while(j<=s.heap_len){
-
-if(j<s.heap_len&&
-smaller(tree,s.heap[j+1],s.heap[j],s.depth)){
-j++;
-}
-
-if(smaller(tree,v,s.heap[j],s.depth)){break;}
-
-
-s.heap[k]=s.heap[j];
-k=j;
-
-
-j<<=1;
-}
-s.heap[k]=v;
-}
-
-
-
-
-
-
-
-
-function compress_block(s,ltree,dtree)
-
-
-
-{
-var dist;
-var lc;
-var lx=0;
-var code;
-var extra;
-
-if(s.last_lit!==0){
-do{
-dist=s.pending_buf[s.d_buf+lx*2]<<8|s.pending_buf[s.d_buf+lx*2+1];
-lc=s.pending_buf[s.l_buf+lx];
-lx++;
-
-if(dist===0){
-send_code(s,lc,ltree);
-
-}else{
-
-code=_length_code[lc];
-send_code(s,code+LITERALS+1,ltree);
-extra=extra_lbits[code];
-if(extra!==0){
-lc-=base_length[code];
-send_bits(s,lc,extra);
-}
-dist--;
-code=d_code(dist);
-
-
-send_code(s,code,dtree);
-extra=extra_dbits[code];
-if(extra!==0){
-dist-=base_dist[code];
-send_bits(s,dist,extra);
-}
-}
-
-
-
-
-
-}while(lx<s.last_lit);
-}
-
-send_code(s,END_BLOCK,ltree);
-}
-
-
-
-
-
-
-
-
-
-
-function build_tree(s,desc)
-
-
-{
-var tree=desc.dyn_tree;
-var stree=desc.stat_desc.static_tree;
-var has_stree=desc.stat_desc.has_stree;
-var elems=desc.stat_desc.elems;
-var n,m;
-var max_code=-1;
-var node;
-
-
-
-
-
-s.heap_len=0;
-s.heap_max=HEAP_SIZE;
-
-for(n=0;n<elems;n++){
-if(tree[n*2]!==0){
-s.heap[++s.heap_len]=max_code=n;
-s.depth[n]=0;
-
-}else{
-tree[n*2+1]=0;
-}
-}
-
-
-
-
-
-
-while(s.heap_len<2){
-node=s.heap[++s.heap_len]=max_code<2?++max_code:0;
-tree[node*2]=1;
-s.depth[node]=0;
-s.opt_len--;
-
-if(has_stree){
-s.static_len-=stree[node*2+1];
-}
-
-}
-desc.max_code=max_code;
-
-
-
-
-for(n=s.heap_len>>1;n>=1;n--){pqdownheap(s,tree,n);}
-
-
-
-
-node=elems;
-do{
-
-
-n=s.heap[1];
-s.heap[1]=s.heap[s.heap_len--];
-pqdownheap(s,tree,1);
-
-
-m=s.heap[1];
-
-s.heap[--s.heap_max]=n;
-s.heap[--s.heap_max]=m;
-
-
-tree[node*2]=tree[n*2]+tree[m*2];
-s.depth[node]=(s.depth[n]>=s.depth[m]?s.depth[n]:s.depth[m])+1;
-tree[n*2+1]=tree[m*2+1]=node;
-
-
-s.heap[1]=node++;
-pqdownheap(s,tree,1);
-
-}while(s.heap_len>=2);
-
-s.heap[--s.heap_max]=s.heap[1];
-
-
-
-
-gen_bitlen(s,desc);
-
-
-gen_codes(tree,max_code,s.bl_count);
-}
-
-
-
-
-
-
-function scan_tree(s,tree,max_code)
-
-
-
-{
-var n;
-var prevlen=-1;
-var curlen;
-
-var nextlen=tree[0*2+1];
-
-var count=0;
-var max_count=7;
-var min_count=4;
-
-if(nextlen===0){
-max_count=138;
-min_count=3;
-}
-tree[(max_code+1)*2+1]=0xffff;
-
-for(n=0;n<=max_code;n++){
-curlen=nextlen;
-nextlen=tree[(n+1)*2+1];
-
-if(++count<max_count&&curlen===nextlen){
-continue;
-
-}else if(count<min_count){
-s.bl_tree[curlen*2]+=count;
-
-}else if(curlen!==0){
-
-if(curlen!==prevlen){s.bl_tree[curlen*2]++;}
-s.bl_tree[REP_3_6*2]++;
-
-}else if(count<=10){
-s.bl_tree[REPZ_3_10*2]++;
-
-}else{
-s.bl_tree[REPZ_11_138*2]++;
-}
-
-count=0;
-prevlen=curlen;
-
-if(nextlen===0){
-max_count=138;
-min_count=3;
-
-}else if(curlen===nextlen){
-max_count=6;
-min_count=3;
-
-}else{
-max_count=7;
-min_count=4;
-}
-}
-}
-
-
-
-
-
-
-function send_tree(s,tree,max_code)
-
-
-
-{
-var n;
-var prevlen=-1;
-var curlen;
-
-var nextlen=tree[0*2+1];
-
-var count=0;
-var max_count=7;
-var min_count=4;
-
-
-if(nextlen===0){
-max_count=138;
-min_count=3;
-}
-
-for(n=0;n<=max_code;n++){
-curlen=nextlen;
-nextlen=tree[(n+1)*2+1];
-
-if(++count<max_count&&curlen===nextlen){
-continue;
-
-}else if(count<min_count){
-do{send_code(s,curlen,s.bl_tree);}while(--count!==0);
-
-}else if(curlen!==0){
-if(curlen!==prevlen){
-send_code(s,curlen,s.bl_tree);
-count--;
-}
-
-send_code(s,REP_3_6,s.bl_tree);
-send_bits(s,count-3,2);
-
-}else if(count<=10){
-send_code(s,REPZ_3_10,s.bl_tree);
-send_bits(s,count-3,3);
-
-}else{
-send_code(s,REPZ_11_138,s.bl_tree);
-send_bits(s,count-11,7);
-}
-
-count=0;
-prevlen=curlen;
-if(nextlen===0){
-max_count=138;
-min_count=3;
-
-}else if(curlen===nextlen){
-max_count=6;
-min_count=3;
-
-}else{
-max_count=7;
-min_count=4;
-}
-}
-}
-
-
-
-
-
-
-function build_bl_tree(s){
-var max_blindex;
-
-
-scan_tree(s,s.dyn_ltree,s.l_desc.max_code);
-scan_tree(s,s.dyn_dtree,s.d_desc.max_code);
-
-
-build_tree(s,s.bl_desc);
-
-
-
-
-
-
-
-
-for(max_blindex=BL_CODES-1;max_blindex>=3;max_blindex--){
-if(s.bl_tree[bl_order[max_blindex]*2+1]!==0){
-break;
-}
-}
-
-s.opt_len+=3*(max_blindex+1)+5+5+4;
-
-
-
-return max_blindex;
-}
-
-
-
-
-
-
-
-function send_all_trees(s,lcodes,dcodes,blcodes)
-
-
-{
-var rank;
-
-
-
-
-
-send_bits(s,lcodes-257,5);
-send_bits(s,dcodes-1,5);
-send_bits(s,blcodes-4,4);
-for(rank=0;rank<blcodes;rank++){
-
-send_bits(s,s.bl_tree[bl_order[rank]*2+1],3);
-}
-
-
-send_tree(s,s.dyn_ltree,lcodes-1);
-
-
-send_tree(s,s.dyn_dtree,dcodes-1);
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function detect_data_type(s){
-
-
-
-
-var black_mask=0xf3ffc07f;
-var n;
-
-
-for(n=0;n<=31;n++,black_mask>>>=1){
-if(black_mask&1&&s.dyn_ltree[n*2]!==0){
-return Z_BINARY;
-}
-}
-
-
-if(s.dyn_ltree[9*2]!==0||s.dyn_ltree[10*2]!==0||
-s.dyn_ltree[13*2]!==0){
-return Z_TEXT;
-}
-for(n=32;n<LITERALS;n++){
-if(s.dyn_ltree[n*2]!==0){
-return Z_TEXT;
-}
-}
-
-
-
-
-return Z_BINARY;
-}
-
-
-var static_init_done=false;
-
-
-
-
-function _tr_init(s)
-{
-
-if(!static_init_done){
-tr_static_init();
-static_init_done=true;
-}
-
-s.l_desc=new TreeDesc(s.dyn_ltree,static_l_desc);
-s.d_desc=new TreeDesc(s.dyn_dtree,static_d_desc);
-s.bl_desc=new TreeDesc(s.bl_tree,static_bl_desc);
-
-s.bi_buf=0;
-s.bi_valid=0;
-
-
-init_block(s);
-}
-
-
-
-
-
-function _tr_stored_block(s,buf,stored_len,last)
-
-
-
-
-{
-send_bits(s,(STORED_BLOCK<<1)+(last?1:0),3);
-copy_block(s,buf,stored_len,true);
-}
-
-
-
-
-
-
-function _tr_align(s){
-send_bits(s,STATIC_TREES<<1,3);
-send_code(s,END_BLOCK,static_ltree);
-bi_flush(s);
-}
-
-
-
-
-
-
-function _tr_flush_block(s,buf,stored_len,last)
-
-
-
-
-{
-var opt_lenb,static_lenb;
-var max_blindex=0;
-
-
-if(s.level>0){
-
-
-if(s.strm.data_type===Z_UNKNOWN){
-s.strm.data_type=detect_data_type(s);
-}
-
-
-build_tree(s,s.l_desc);
-
-
-
-build_tree(s,s.d_desc);
-
-
-
-
-
-
-
-
-
-max_blindex=build_bl_tree(s);
-
-
-opt_lenb=s.opt_len+3+7>>>3;
-static_lenb=s.static_len+3+7>>>3;
-
-
-
-
-
-if(static_lenb<=opt_lenb){opt_lenb=static_lenb;}
-
-}else{
-
-opt_lenb=static_lenb=stored_len+5;
-}
-
-if(stored_len+4<=opt_lenb&&buf!==-1){
-
-
-
-
-
-
-
-
-_tr_stored_block(s,buf,stored_len,last);
-
-}else if(s.strategy===Z_FIXED||static_lenb===opt_lenb){
-
-send_bits(s,(STATIC_TREES<<1)+(last?1:0),3);
-compress_block(s,static_ltree,static_dtree);
-
-}else{
-send_bits(s,(DYN_TREES<<1)+(last?1:0),3);
-send_all_trees(s,s.l_desc.max_code+1,s.d_desc.max_code+1,max_blindex+1);
-compress_block(s,s.dyn_ltree,s.dyn_dtree);
-}
-
-
-
-
-init_block(s);
-
-if(last){
-bi_windup(s);
-}
-
-
-}
-
-
-
-
-
-function _tr_tally(s,dist,lc)
-
-
-
-{
-
-
-s.pending_buf[s.d_buf+s.last_lit*2]=dist>>>8&0xff;
-s.pending_buf[s.d_buf+s.last_lit*2+1]=dist&0xff;
-
-s.pending_buf[s.l_buf+s.last_lit]=lc&0xff;
-s.last_lit++;
-
-if(dist===0){
-
-s.dyn_ltree[lc*2]++;
-}else{
-s.matches++;
-
-dist--;
-
-
-
-
-s.dyn_ltree[(_length_code[lc]+LITERALS+1)*2]++;
-s.dyn_dtree[d_code(dist)*2]++;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-return s.last_lit===s.lit_bufsize-1;
-
-
-
-
-}
-
-exports._tr_init=_tr_init;
-exports._tr_stored_block=_tr_stored_block;
-exports._tr_flush_block=_tr_flush_block;
-exports._tr_tally=_tr_tally;
-exports._tr_align=_tr_align;
-
-},{"../utils/common":147}],154:[function(require,module,exports){
-'use strict';
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function ZStream(){
-
-this.input=null;
-this.next_in=0;
-
-this.avail_in=0;
-
-this.total_in=0;
-
-this.output=null;
-this.next_out=0;
-
-this.avail_out=0;
-
-this.total_out=0;
-
-this.msg='';
-
-this.state=null;
-
-this.data_type=2;
-
-this.adler=0;
-}
-
-module.exports=ZStream;
-
-},{}],155:[function(require,module,exports){
-module.exports=function parseCacheControl(field){
-
-if(typeof field!=='string'){
-return null;
-}
-
-
-
-
-
-
-
-
-
-var regex=/(?:^|(?:\s*\,\s*))([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)(?:\=(?:([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)|(?:\"((?:[^"\\]|\\.)*)\")))?/g;
-
-var header={};
-var err=field.replace(regex,function($0,$1,$2,$3){
-var value=$2||$3;
-header[$1]=value?value.toLowerCase():true;
-return'';
-});
-
-if(header['max-age']){
-try{
-var maxAge=parseInt(header['max-age'],10);
-if(isNaN(maxAge)){
-return null;
-}
-
-header['max-age']=maxAge;
-}
-catch(err){}
-}
-
-return err?null:header;
-};
-
-},{}],156:[function(require,module,exports){
-(function(process){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function normalizeArray(parts,allowAboveRoot){
-
-var up=0;
-for(var i=parts.length-1;i>=0;i--){
-var last=parts[i];
-if(last==='.'){
-parts.splice(i,1);
-}else if(last==='..'){
-parts.splice(i,1);
-up++;
-}else if(up){
-parts.splice(i,1);
-up--;
-}
-}
-
-
-if(allowAboveRoot){
-for(;up--;up){
-parts.unshift('..');
-}
-}
-
-return parts;
-}
-
-
-
-exports.resolve=function(){
-var resolvedPath='',
-resolvedAbsolute=false;
-
-for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){
-var path=i>=0?arguments[i]:process.cwd();
-
-
-if(typeof path!=='string'){
-throw new TypeError('Arguments to path.resolve must be strings');
-}else if(!path){
-continue;
-}
-
-resolvedPath=path+'/'+resolvedPath;
-resolvedAbsolute=path.charAt(0)==='/';
-}
-
-
-
-
-
-resolvedPath=normalizeArray(filter(resolvedPath.split('/'),function(p){
-return!!p;
-}),!resolvedAbsolute).join('/');
-
-return(resolvedAbsolute?'/':'')+resolvedPath||'.';
-};
-
-
-
-exports.normalize=function(path){
-var isAbsolute=exports.isAbsolute(path),
-trailingSlash=substr(path,-1)==='/';
-
-
-path=normalizeArray(filter(path.split('/'),function(p){
-return!!p;
-}),!isAbsolute).join('/');
-
-if(!path&&!isAbsolute){
-path='.';
-}
-if(path&&trailingSlash){
-path+='/';
-}
-
-return(isAbsolute?'/':'')+path;
-};
-
-
-exports.isAbsolute=function(path){
-return path.charAt(0)==='/';
-};
-
-
-exports.join=function(){
-var paths=Array.prototype.slice.call(arguments,0);
-return exports.normalize(filter(paths,function(p,index){
-if(typeof p!=='string'){
-throw new TypeError('Arguments to path.join must be strings');
-}
-return p;
-}).join('/'));
-};
-
-
-
-
-exports.relative=function(from,to){
-from=exports.resolve(from).substr(1);
-to=exports.resolve(to).substr(1);
-
-function trim(arr){
-var start=0;
-for(;start<arr.length;start++){
-if(arr[start]!=='')break;
-}
-
-var end=arr.length-1;
-for(;end>=0;end--){
-if(arr[end]!=='')break;
-}
-
-if(start>end)return[];
-return arr.slice(start,end-start+1);
-}
-
-var fromParts=trim(from.split('/'));
-var toParts=trim(to.split('/'));
-
-var length=Math.min(fromParts.length,toParts.length);
-var samePartsLength=length;
-for(var i=0;i<length;i++){
-if(fromParts[i]!==toParts[i]){
-samePartsLength=i;
-break;
-}
-}
-
-var outputParts=[];
-for(var i=samePartsLength;i<fromParts.length;i++){
-outputParts.push('..');
-}
-
-outputParts=outputParts.concat(toParts.slice(samePartsLength));
-
-return outputParts.join('/');
-};
-
-exports.sep='/';
-exports.delimiter=':';
-
-exports.dirname=function(path){
-if(typeof path!=='string')path=path+'';
-if(path.length===0)return'.';
-var code=path.charCodeAt(0);
-var hasRoot=code===47;
-var end=-1;
-var matchedSlash=true;
-for(var i=path.length-1;i>=1;--i){
-code=path.charCodeAt(i);
-if(code===47){
-if(!matchedSlash){
-end=i;
-break;
-}
-}else{
-
-matchedSlash=false;
-}
-}
-
-if(end===-1)return hasRoot?'/':'.';
-if(hasRoot&&end===1){
-
-
-return'/';
-}
-return path.slice(0,end);
-};
-
-function basename(path){
-if(typeof path!=='string')path=path+'';
-
-var start=0;
-var end=-1;
-var matchedSlash=true;
-var i;
-
-for(i=path.length-1;i>=0;--i){
-if(path.charCodeAt(i)===47){
-
-
-if(!matchedSlash){
-start=i+1;
-break;
-}
-}else if(end===-1){
-
-
-matchedSlash=false;
-end=i+1;
-}
-}
-
-if(end===-1)return'';
-return path.slice(start,end);
-}
-
-
-
-exports.basename=function(path,ext){
-var f=basename(path);
-if(ext&&f.substr(-1*ext.length)===ext){
-f=f.substr(0,f.length-ext.length);
-}
-return f;
-};
-
-exports.extname=function(path){
-if(typeof path!=='string')path=path+'';
-var startDot=-1;
-var startPart=0;
-var end=-1;
-var matchedSlash=true;
-
-
-var preDotState=0;
-for(var i=path.length-1;i>=0;--i){
-var code=path.charCodeAt(i);
-if(code===47){
-
-
-if(!matchedSlash){
-startPart=i+1;
-break;
-}
-continue;
-}
-if(end===-1){
-
-
-matchedSlash=false;
-end=i+1;
-}
-if(code===46){
-
-if(startDot===-1)
-startDot=i;else
-if(preDotState!==1)
-preDotState=1;
-}else if(startDot!==-1){
-
-
-preDotState=-1;
-}
-}
-
-if(startDot===-1||end===-1||
-
-preDotState===0||
-
-preDotState===1&&startDot===end-1&&startDot===startPart+1){
-return'';
-}
-return path.slice(startDot,end);
-};
-
-function filter(xs,f){
-if(xs.filter)return xs.filter(f);
-var res=[];
-for(var i=0;i<xs.length;i++){
-if(f(xs[i],i,xs))res.push(xs[i]);
-}
-return res;
-}
-
-
-var substr='ab'.substr(-1)==='b'?
-function(str,start,len){return str.substr(start,len);}:
-function(str,start,len){
-if(start<0)start=str.length+start;
-return str.substr(start,len);
-};
-
-
-}).call(this,require('_process'));
-},{"_process":158}],157:[function(require,module,exports){
-(function(process){
-'use strict';
-
-if(!process.version||
-process.version.indexOf('v0.')===0||
-process.version.indexOf('v1.')===0&&process.version.indexOf('v1.8.')!==0){
-module.exports={nextTick:nextTick};
-}else{
-module.exports=process;
-}
-
-function nextTick(fn,arg1,arg2,arg3){
-if(typeof fn!=='function'){
-throw new TypeError('"callback" argument must be a function');
-}
-var len=arguments.length;
-var args,i;
-switch(len){
-case 0:
-case 1:
-return process.nextTick(fn);
-case 2:
-return process.nextTick(function afterTickOne(){
-fn.call(null,arg1);
-});
-case 3:
-return process.nextTick(function afterTickTwo(){
-fn.call(null,arg1,arg2);
-});
-case 4:
-return process.nextTick(function afterTickThree(){
-fn.call(null,arg1,arg2,arg3);
-});
-default:
-args=new Array(len-1);
-i=0;
-while(i<args.length){
-args[i++]=arguments[i];
-}
-return process.nextTick(function afterTick(){
-fn.apply(null,args);
-});}
-
-}
-
-
-}).call(this,require('_process'));
-},{"_process":158}],158:[function(require,module,exports){
-
-var process=module.exports={};
-
-
-
-
-
-
-var cachedSetTimeout;
-var cachedClearTimeout;
-
-function defaultSetTimout(){
-throw new Error('setTimeout has not been defined');
-}
-function defaultClearTimeout(){
-throw new Error('clearTimeout has not been defined');
-}
-(function(){
-try{
-if(typeof setTimeout==='function'){
-cachedSetTimeout=setTimeout;
-}else{
-cachedSetTimeout=defaultSetTimout;
-}
-}catch(e){
-cachedSetTimeout=defaultSetTimout;
-}
-try{
-if(typeof clearTimeout==='function'){
-cachedClearTimeout=clearTimeout;
-}else{
-cachedClearTimeout=defaultClearTimeout;
-}
-}catch(e){
-cachedClearTimeout=defaultClearTimeout;
-}
-})();
-function runTimeout(fun){
-if(cachedSetTimeout===setTimeout){
-
-return setTimeout(fun,0);
-}
-
-if((cachedSetTimeout===defaultSetTimout||!cachedSetTimeout)&&setTimeout){
-cachedSetTimeout=setTimeout;
-return setTimeout(fun,0);
-}
-try{
-
-return cachedSetTimeout(fun,0);
-}catch(e){
-try{
-
-return cachedSetTimeout.call(null,fun,0);
-}catch(e){
-
-return cachedSetTimeout.call(this,fun,0);
-}
-}
-
-
-}
-function runClearTimeout(marker){
-if(cachedClearTimeout===clearTimeout){
-
-return clearTimeout(marker);
-}
-
-if((cachedClearTimeout===defaultClearTimeout||!cachedClearTimeout)&&clearTimeout){
-cachedClearTimeout=clearTimeout;
-return clearTimeout(marker);
-}
-try{
-
-return cachedClearTimeout(marker);
-}catch(e){
-try{
-
-return cachedClearTimeout.call(null,marker);
-}catch(e){
-
-
-return cachedClearTimeout.call(this,marker);
-}
-}
-
-
-
-}
-var queue=[];
-var draining=false;
-var currentQueue;
-var queueIndex=-1;
-
-function cleanUpNextTick(){
-if(!draining||!currentQueue){
-return;
-}
-draining=false;
-if(currentQueue.length){
-queue=currentQueue.concat(queue);
-}else{
-queueIndex=-1;
-}
-if(queue.length){
-drainQueue();
-}
-}
-
-function drainQueue(){
-if(draining){
-return;
-}
-var timeout=runTimeout(cleanUpNextTick);
-draining=true;
-
-var len=queue.length;
-while(len){
-currentQueue=queue;
-queue=[];
-while(++queueIndex<len){
-if(currentQueue){
-currentQueue[queueIndex].run();
-}
-}
-queueIndex=-1;
-len=queue.length;
-}
-currentQueue=null;
-draining=false;
-runClearTimeout(timeout);
-}
-
-process.nextTick=function(fun){
-var args=new Array(arguments.length-1);
-if(arguments.length>1){
-for(var i=1;i<arguments.length;i++){
-args[i-1]=arguments[i];
-}
-}
-queue.push(new Item(fun,args));
-if(queue.length===1&&!draining){
-runTimeout(drainQueue);
-}
-};
-
-
-function Item(fun,array){
-this.fun=fun;
-this.array=array;
-}
-Item.prototype.run=function(){
-this.fun.apply(null,this.array);
-};
-process.title='browser';
-process.browser=true;
-process.env={};
-process.argv=[];
-process.version='';
-process.versions={};
-
-function noop(){}
-
-process.on=noop;
-process.addListener=noop;
-process.once=noop;
-process.off=noop;
-process.removeListener=noop;
-process.removeAllListeners=noop;
-process.emit=noop;
-process.prependListener=noop;
-process.prependOnceListener=noop;
-
-process.listeners=function(name){return[];};
-
-process.binding=function(name){
-throw new Error('process.binding is not supported');
-};
-
-process.cwd=function(){return'/';};
-process.chdir=function(dir){
-throw new Error('process.chdir is not supported');
-};
-process.umask=function(){return 0;};
-
-},{}],159:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-
-
-
-function hasOwnProperty(obj,prop){
-return Object.prototype.hasOwnProperty.call(obj,prop);
-}
-
-module.exports=function(qs,sep,eq,options){
-sep=sep||'&';
-eq=eq||'=';
-var obj={};
-
-if(typeof qs!=='string'||qs.length===0){
-return obj;
-}
-
-var regexp=/\+/g;
-qs=qs.split(sep);
-
-var maxKeys=1000;
-if(options&&typeof options.maxKeys==='number'){
-maxKeys=options.maxKeys;
-}
-
-var len=qs.length;
-
-if(maxKeys>0&&len>maxKeys){
-len=maxKeys;
-}
-
-for(var i=0;i<len;++i){
-var x=qs[i].replace(regexp,'%20'),
-idx=x.indexOf(eq),
-kstr,vstr,k,v;
-
-if(idx>=0){
-kstr=x.substr(0,idx);
-vstr=x.substr(idx+1);
-}else{
-kstr=x;
-vstr='';
-}
-
-k=decodeURIComponent(kstr);
-v=decodeURIComponent(vstr);
-
-if(!hasOwnProperty(obj,k)){
-obj[k]=v;
-}else if(isArray(obj[k])){
-obj[k].push(v);
-}else{
-obj[k]=[obj[k],v];
-}
-}
-
-return obj;
-};
-
-var isArray=Array.isArray||function(xs){
-return Object.prototype.toString.call(xs)==='[object Array]';
-};
-
-},{}],160:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-var stringifyPrimitive=function(v){
-switch(typeof v){
-case'string':
-return v;
-
-case'boolean':
-return v?'true':'false';
-
-case'number':
-return isFinite(v)?v:'';
-
-default:
-return'';}
-
-};
-
-module.exports=function(obj,sep,eq,name){
-sep=sep||'&';
-eq=eq||'=';
-if(obj===null){
-obj=undefined;
-}
-
-if(typeof obj==='object'){
-return map(objectKeys(obj),function(k){
-var ks=encodeURIComponent(stringifyPrimitive(k))+eq;
-if(isArray(obj[k])){
-return map(obj[k],function(v){
-return ks+encodeURIComponent(stringifyPrimitive(v));
-}).join(sep);
-}else{
-return ks+encodeURIComponent(stringifyPrimitive(obj[k]));
-}
-}).join(sep);
-
-}
-
-if(!name)return'';
-return encodeURIComponent(stringifyPrimitive(name))+eq+
-encodeURIComponent(stringifyPrimitive(obj));
-};
-
-var isArray=Array.isArray||function(xs){
-return Object.prototype.toString.call(xs)==='[object Array]';
-};
-
-function map(xs,f){
-if(xs.map)return xs.map(f);
-var res=[];
-for(var i=0;i<xs.length;i++){
-res.push(f(xs[i],i));
-}
-return res;
-}
-
-var objectKeys=Object.keys||function(obj){
-var res=[];
-for(var key in obj){
-if(Object.prototype.hasOwnProperty.call(obj,key))res.push(key);
-}
-return res;
-};
-
-},{}],161:[function(require,module,exports){
-'use strict';
-
-exports.decode=exports.parse=require('./decode');
-exports.encode=exports.stringify=require('./encode');
-
-},{"./decode":159,"./encode":160}],162:[function(require,module,exports){
-module.exports=require('./lib/_stream_duplex.js');
-
-},{"./lib/_stream_duplex.js":163}],163:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-
-
-var pna=require('process-nextick-args');
-
-
-
-var objectKeys=Object.keys||function(obj){
-var keys=[];
-for(var key in obj){
-keys.push(key);
-}return keys;
-};
-
-
-module.exports=Duplex;
-
-
-var util=require('core-util-is');
-util.inherits=require('inherits');
-
-
-var Readable=require('./_stream_readable');
-var Writable=require('./_stream_writable');
-
-util.inherits(Duplex,Readable);
-
-{
-
-var keys=objectKeys(Writable.prototype);
-for(var v=0;v<keys.length;v++){
-var method=keys[v];
-if(!Duplex.prototype[method])Duplex.prototype[method]=Writable.prototype[method];
-}
-}
-
-function Duplex(options){
-if(!(this instanceof Duplex))return new Duplex(options);
-
-Readable.call(this,options);
-Writable.call(this,options);
-
-if(options&&options.readable===false)this.readable=false;
-
-if(options&&options.writable===false)this.writable=false;
-
-this.allowHalfOpen=true;
-if(options&&options.allowHalfOpen===false)this.allowHalfOpen=false;
-
-this.once('end',onend);
-}
-
-Object.defineProperty(Duplex.prototype,'writableHighWaterMark',{
-
-
-
-enumerable:false,
-get:function(){
-return this._writableState.highWaterMark;
-}});
-
-
-
-function onend(){
-
-
-if(this.allowHalfOpen||this._writableState.ended)return;
-
-
-
-pna.nextTick(onEndNT,this);
-}
-
-function onEndNT(self){
-self.end();
-}
-
-Object.defineProperty(Duplex.prototype,'destroyed',{
-get:function(){
-if(this._readableState===undefined||this._writableState===undefined){
-return false;
-}
-return this._readableState.destroyed&&this._writableState.destroyed;
-},
-set:function(value){
-
-
-if(this._readableState===undefined||this._writableState===undefined){
-return;
-}
-
-
-
-this._readableState.destroyed=value;
-this._writableState.destroyed=value;
-}});
-
-
-Duplex.prototype._destroy=function(err,cb){
-this.push(null);
-this.end();
-
-pna.nextTick(cb,err);
-};
-},{"./_stream_readable":165,"./_stream_writable":167,"core-util-is":103,"inherits":113,"process-nextick-args":157}],164:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-module.exports=PassThrough;
-
-var Transform=require('./_stream_transform');
-
-
-var util=require('core-util-is');
-util.inherits=require('inherits');
-
-
-util.inherits(PassThrough,Transform);
-
-function PassThrough(options){
-if(!(this instanceof PassThrough))return new PassThrough(options);
-
-Transform.call(this,options);
-}
-
-PassThrough.prototype._transform=function(chunk,encoding,cb){
-cb(null,chunk);
-};
-},{"./_stream_transform":166,"core-util-is":103,"inherits":113}],165:[function(require,module,exports){
-(function(process,global){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-
-
-var pna=require('process-nextick-args');
-
-
-module.exports=Readable;
-
-
-var isArray=require('isarray');
-
-
-
-var Duplex;
-
-
-Readable.ReadableState=ReadableState;
-
-
-var EE=require('events').EventEmitter;
-
-var EElistenerCount=function(emitter,type){
-return emitter.listeners(type).length;
-};
-
-
-
-var Stream=require('./internal/streams/stream');
-
-
-
-
-var Buffer=require('safe-buffer').Buffer;
-var OurUint8Array=global.Uint8Array||function(){};
-function _uint8ArrayToBuffer(chunk){
-return Buffer.from(chunk);
-}
-function _isUint8Array(obj){
-return Buffer.isBuffer(obj)||obj instanceof OurUint8Array;
-}
-
-
-
-
-var util=require('core-util-is');
-util.inherits=require('inherits');
-
-
-
-var debugUtil=require('util');
-var debug=void 0;
-if(debugUtil&&debugUtil.debuglog){
-debug=debugUtil.debuglog('stream');
-}else{
-debug=function(){};
-}
-
-
-var BufferList=require('./internal/streams/BufferList');
-var destroyImpl=require('./internal/streams/destroy');
-var StringDecoder;
-
-util.inherits(Readable,Stream);
-
-var kProxyEvents=['error','close','destroy','pause','resume'];
-
-function prependListener(emitter,event,fn){
-
-
-if(typeof emitter.prependListener==='function')return emitter.prependListener(event,fn);
-
-
-
-
-
-if(!emitter._events||!emitter._events[event])emitter.on(event,fn);else if(isArray(emitter._events[event]))emitter._events[event].unshift(fn);else emitter._events[event]=[fn,emitter._events[event]];
-}
-
-function ReadableState(options,stream){
-Duplex=Duplex||require('./_stream_duplex');
-
-options=options||{};
-
-
-
-
-
-
-var isDuplex=stream instanceof Duplex;
-
-
-
-this.objectMode=!!options.objectMode;
-
-if(isDuplex)this.objectMode=this.objectMode||!!options.readableObjectMode;
-
-
-
-var hwm=options.highWaterMark;
-var readableHwm=options.readableHighWaterMark;
-var defaultHwm=this.objectMode?16:16*1024;
-
-if(hwm||hwm===0)this.highWaterMark=hwm;else if(isDuplex&&(readableHwm||readableHwm===0))this.highWaterMark=readableHwm;else this.highWaterMark=defaultHwm;
-
-
-this.highWaterMark=Math.floor(this.highWaterMark);
-
-
-
-
-this.buffer=new BufferList();
-this.length=0;
-this.pipes=null;
-this.pipesCount=0;
-this.flowing=null;
-this.ended=false;
-this.endEmitted=false;
-this.reading=false;
-
-
-
-
-
-this.sync=true;
-
-
-
-this.needReadable=false;
-this.emittedReadable=false;
-this.readableListening=false;
-this.resumeScheduled=false;
-
-
-this.destroyed=false;
-
-
-
-
-this.defaultEncoding=options.defaultEncoding||'utf8';
-
-
-this.awaitDrain=0;
-
-
-this.readingMore=false;
-
-this.decoder=null;
-this.encoding=null;
-if(options.encoding){
-if(!StringDecoder)StringDecoder=require('string_decoder/').StringDecoder;
-this.decoder=new StringDecoder(options.encoding);
-this.encoding=options.encoding;
-}
-}
-
-function Readable(options){
-Duplex=Duplex||require('./_stream_duplex');
-
-if(!(this instanceof Readable))return new Readable(options);
-
-this._readableState=new ReadableState(options,this);
-
-
-this.readable=true;
-
-if(options){
-if(typeof options.read==='function')this._read=options.read;
-
-if(typeof options.destroy==='function')this._destroy=options.destroy;
-}
-
-Stream.call(this);
-}
-
-Object.defineProperty(Readable.prototype,'destroyed',{
-get:function(){
-if(this._readableState===undefined){
-return false;
-}
-return this._readableState.destroyed;
-},
-set:function(value){
-
-
-if(!this._readableState){
-return;
-}
-
-
-
-this._readableState.destroyed=value;
-}});
-
-
-Readable.prototype.destroy=destroyImpl.destroy;
-Readable.prototype._undestroy=destroyImpl.undestroy;
-Readable.prototype._destroy=function(err,cb){
-this.push(null);
-cb(err);
-};
-
-
-
-
-
-Readable.prototype.push=function(chunk,encoding){
-var state=this._readableState;
-var skipChunkCheck;
-
-if(!state.objectMode){
-if(typeof chunk==='string'){
-encoding=encoding||state.defaultEncoding;
-if(encoding!==state.encoding){
-chunk=Buffer.from(chunk,encoding);
-encoding='';
-}
-skipChunkCheck=true;
-}
-}else{
-skipChunkCheck=true;
-}
-
-return readableAddChunk(this,chunk,encoding,false,skipChunkCheck);
-};
-
-
-Readable.prototype.unshift=function(chunk){
-return readableAddChunk(this,chunk,null,true,false);
-};
-
-function readableAddChunk(stream,chunk,encoding,addToFront,skipChunkCheck){
-var state=stream._readableState;
-if(chunk===null){
-state.reading=false;
-onEofChunk(stream,state);
-}else{
-var er;
-if(!skipChunkCheck)er=chunkInvalid(state,chunk);
-if(er){
-stream.emit('error',er);
-}else if(state.objectMode||chunk&&chunk.length>0){
-if(typeof chunk!=='string'&&!state.objectMode&&Object.getPrototypeOf(chunk)!==Buffer.prototype){
-chunk=_uint8ArrayToBuffer(chunk);
-}
-
-if(addToFront){
-if(state.endEmitted)stream.emit('error',new Error('stream.unshift() after end event'));else addChunk(stream,state,chunk,true);
-}else if(state.ended){
-stream.emit('error',new Error('stream.push() after EOF'));
-}else{
-state.reading=false;
-if(state.decoder&&!encoding){
-chunk=state.decoder.write(chunk);
-if(state.objectMode||chunk.length!==0)addChunk(stream,state,chunk,false);else maybeReadMore(stream,state);
-}else{
-addChunk(stream,state,chunk,false);
-}
-}
-}else if(!addToFront){
-state.reading=false;
-}
-}
-
-return needMoreData(state);
-}
-
-function addChunk(stream,state,chunk,addToFront){
-if(state.flowing&&state.length===0&&!state.sync){
-stream.emit('data',chunk);
-stream.read(0);
-}else{
-
-state.length+=state.objectMode?1:chunk.length;
-if(addToFront)state.buffer.unshift(chunk);else state.buffer.push(chunk);
-
-if(state.needReadable)emitReadable(stream);
-}
-maybeReadMore(stream,state);
-}
-
-function chunkInvalid(state,chunk){
-var er;
-if(!_isUint8Array(chunk)&&typeof chunk!=='string'&&chunk!==undefined&&!state.objectMode){
-er=new TypeError('Invalid non-string/buffer chunk');
-}
-return er;
-}
-
-
-
-
-
-
-
-
-function needMoreData(state){
-return!state.ended&&(state.needReadable||state.length<state.highWaterMark||state.length===0);
-}
-
-Readable.prototype.isPaused=function(){
-return this._readableState.flowing===false;
-};
-
-
-Readable.prototype.setEncoding=function(enc){
-if(!StringDecoder)StringDecoder=require('string_decoder/').StringDecoder;
-this._readableState.decoder=new StringDecoder(enc);
-this._readableState.encoding=enc;
-return this;
-};
-
-
-var MAX_HWM=0x800000;
-function computeNewHighWaterMark(n){
-if(n>=MAX_HWM){
-n=MAX_HWM;
-}else{
-
-
-n--;
-n|=n>>>1;
-n|=n>>>2;
-n|=n>>>4;
-n|=n>>>8;
-n|=n>>>16;
-n++;
-}
-return n;
-}
-
-
-
-function howMuchToRead(n,state){
-if(n<=0||state.length===0&&state.ended)return 0;
-if(state.objectMode)return 1;
-if(n!==n){
-
-if(state.flowing&&state.length)return state.buffer.head.data.length;else return state.length;
-}
-
-if(n>state.highWaterMark)state.highWaterMark=computeNewHighWaterMark(n);
-if(n<=state.length)return n;
-
-if(!state.ended){
-state.needReadable=true;
-return 0;
-}
-return state.length;
-}
-
-
-Readable.prototype.read=function(n){
-debug('read',n);
-n=parseInt(n,10);
-var state=this._readableState;
-var nOrig=n;
-
-if(n!==0)state.emittedReadable=false;
-
-
-
-
-if(n===0&&state.needReadable&&(state.length>=state.highWaterMark||state.ended)){
-debug('read: emitReadable',state.length,state.ended);
-if(state.length===0&&state.ended)endReadable(this);else emitReadable(this);
-return null;
-}
-
-n=howMuchToRead(n,state);
-
-
-if(n===0&&state.ended){
-if(state.length===0)endReadable(this);
-return null;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-var doRead=state.needReadable;
-debug('need readable',doRead);
-
-
-if(state.length===0||state.length-n<state.highWaterMark){
-doRead=true;
-debug('length less than watermark',doRead);
-}
-
-
-
-if(state.ended||state.reading){
-doRead=false;
-debug('reading or ended',doRead);
-}else if(doRead){
-debug('do read');
-state.reading=true;
-state.sync=true;
-
-if(state.length===0)state.needReadable=true;
-
-this._read(state.highWaterMark);
-state.sync=false;
-
-
-if(!state.reading)n=howMuchToRead(nOrig,state);
-}
-
-var ret;
-if(n>0)ret=fromList(n,state);else ret=null;
-
-if(ret===null){
-state.needReadable=true;
-n=0;
-}else{
-state.length-=n;
-}
-
-if(state.length===0){
-
-
-if(!state.ended)state.needReadable=true;
-
-
-if(nOrig!==n&&state.ended)endReadable(this);
-}
-
-if(ret!==null)this.emit('data',ret);
-
-return ret;
-};
-
-function onEofChunk(stream,state){
-if(state.ended)return;
-if(state.decoder){
-var chunk=state.decoder.end();
-if(chunk&&chunk.length){
-state.buffer.push(chunk);
-state.length+=state.objectMode?1:chunk.length;
-}
-}
-state.ended=true;
-
-
-emitReadable(stream);
-}
-
-
-
-
-function emitReadable(stream){
-var state=stream._readableState;
-state.needReadable=false;
-if(!state.emittedReadable){
-debug('emitReadable',state.flowing);
-state.emittedReadable=true;
-if(state.sync)pna.nextTick(emitReadable_,stream);else emitReadable_(stream);
-}
-}
-
-function emitReadable_(stream){
-debug('emit readable');
-stream.emit('readable');
-flow(stream);
-}
-
-
-
-
-
-
-
-function maybeReadMore(stream,state){
-if(!state.readingMore){
-state.readingMore=true;
-pna.nextTick(maybeReadMore_,stream,state);
-}
-}
-
-function maybeReadMore_(stream,state){
-var len=state.length;
-while(!state.reading&&!state.flowing&&!state.ended&&state.length<state.highWaterMark){
-debug('maybeReadMore read 0');
-stream.read(0);
-if(len===state.length)
-
-break;else len=state.length;
-}
-state.readingMore=false;
-}
-
-
-
-
-
-Readable.prototype._read=function(n){
-this.emit('error',new Error('_read() is not implemented'));
-};
-
-Readable.prototype.pipe=function(dest,pipeOpts){
-var src=this;
-var state=this._readableState;
-
-switch(state.pipesCount){
-case 0:
-state.pipes=dest;
-break;
-case 1:
-state.pipes=[state.pipes,dest];
-break;
-default:
-state.pipes.push(dest);
-break;}
-
-state.pipesCount+=1;
-debug('pipe count=%d opts=%j',state.pipesCount,pipeOpts);
-
-var doEnd=(!pipeOpts||pipeOpts.end!==false)&&dest!==process.stdout&&dest!==process.stderr;
-
-var endFn=doEnd?onend:unpipe;
-if(state.endEmitted)pna.nextTick(endFn);else src.once('end',endFn);
-
-dest.on('unpipe',onunpipe);
-function onunpipe(readable,unpipeInfo){
-debug('onunpipe');
-if(readable===src){
-if(unpipeInfo&&unpipeInfo.hasUnpiped===false){
-unpipeInfo.hasUnpiped=true;
-cleanup();
-}
-}
-}
-
-function onend(){
-debug('onend');
-dest.end();
-}
-
-
-
-
-
-var ondrain=pipeOnDrain(src);
-dest.on('drain',ondrain);
-
-var cleanedUp=false;
-function cleanup(){
-debug('cleanup');
-
-dest.removeListener('close',onclose);
-dest.removeListener('finish',onfinish);
-dest.removeListener('drain',ondrain);
-dest.removeListener('error',onerror);
-dest.removeListener('unpipe',onunpipe);
-src.removeListener('end',onend);
-src.removeListener('end',unpipe);
-src.removeListener('data',ondata);
-
-cleanedUp=true;
-
-
-
-
-
-
-if(state.awaitDrain&&(!dest._writableState||dest._writableState.needDrain))ondrain();
-}
-
-
-
-
-
-var increasedAwaitDrain=false;
-src.on('data',ondata);
-function ondata(chunk){
-debug('ondata');
-increasedAwaitDrain=false;
-var ret=dest.write(chunk);
-if(false===ret&&!increasedAwaitDrain){
-
-
-
-
-if((state.pipesCount===1&&state.pipes===dest||state.pipesCount>1&&indexOf(state.pipes,dest)!==-1)&&!cleanedUp){
-debug('false write response, pause',src._readableState.awaitDrain);
-src._readableState.awaitDrain++;
-increasedAwaitDrain=true;
-}
-src.pause();
-}
-}
-
-
-
-function onerror(er){
-debug('onerror',er);
-unpipe();
-dest.removeListener('error',onerror);
-if(EElistenerCount(dest,'error')===0)dest.emit('error',er);
-}
-
-
-prependListener(dest,'error',onerror);
-
-
-function onclose(){
-dest.removeListener('finish',onfinish);
-unpipe();
-}
-dest.once('close',onclose);
-function onfinish(){
-debug('onfinish');
-dest.removeListener('close',onclose);
-unpipe();
-}
-dest.once('finish',onfinish);
-
-function unpipe(){
-debug('unpipe');
-src.unpipe(dest);
-}
-
-
-dest.emit('pipe',src);
-
-
-if(!state.flowing){
-debug('pipe resume');
-src.resume();
-}
-
-return dest;
-};
-
-function pipeOnDrain(src){
-return function(){
-var state=src._readableState;
-debug('pipeOnDrain',state.awaitDrain);
-if(state.awaitDrain)state.awaitDrain--;
-if(state.awaitDrain===0&&EElistenerCount(src,'data')){
-state.flowing=true;
-flow(src);
-}
-};
-}
-
-Readable.prototype.unpipe=function(dest){
-var state=this._readableState;
-var unpipeInfo={hasUnpiped:false};
-
-
-if(state.pipesCount===0)return this;
-
-
-if(state.pipesCount===1){
-
-if(dest&&dest!==state.pipes)return this;
-
-if(!dest)dest=state.pipes;
-
-
-state.pipes=null;
-state.pipesCount=0;
-state.flowing=false;
-if(dest)dest.emit('unpipe',this,unpipeInfo);
-return this;
-}
-
-
-
-if(!dest){
-
-var dests=state.pipes;
-var len=state.pipesCount;
-state.pipes=null;
-state.pipesCount=0;
-state.flowing=false;
-
-for(var i=0;i<len;i++){
-dests[i].emit('unpipe',this,unpipeInfo);
-}return this;
-}
-
-
-var index=indexOf(state.pipes,dest);
-if(index===-1)return this;
-
-state.pipes.splice(index,1);
-state.pipesCount-=1;
-if(state.pipesCount===1)state.pipes=state.pipes[0];
-
-dest.emit('unpipe',this,unpipeInfo);
-
-return this;
-};
-
-
-
-Readable.prototype.on=function(ev,fn){
-var res=Stream.prototype.on.call(this,ev,fn);
-
-if(ev==='data'){
-
-if(this._readableState.flowing!==false)this.resume();
-}else if(ev==='readable'){
-var state=this._readableState;
-if(!state.endEmitted&&!state.readableListening){
-state.readableListening=state.needReadable=true;
-state.emittedReadable=false;
-if(!state.reading){
-pna.nextTick(nReadingNextTick,this);
-}else if(state.length){
-emitReadable(this);
-}
-}
-}
-
-return res;
-};
-Readable.prototype.addListener=Readable.prototype.on;
-
-function nReadingNextTick(self){
-debug('readable nexttick read 0');
-self.read(0);
-}
-
-
-
-Readable.prototype.resume=function(){
-var state=this._readableState;
-if(!state.flowing){
-debug('resume');
-state.flowing=true;
-resume(this,state);
-}
-return this;
-};
-
-function resume(stream,state){
-if(!state.resumeScheduled){
-state.resumeScheduled=true;
-pna.nextTick(resume_,stream,state);
-}
-}
-
-function resume_(stream,state){
-if(!state.reading){
-debug('resume read 0');
-stream.read(0);
-}
-
-state.resumeScheduled=false;
-state.awaitDrain=0;
-stream.emit('resume');
-flow(stream);
-if(state.flowing&&!state.reading)stream.read(0);
-}
-
-Readable.prototype.pause=function(){
-debug('call pause flowing=%j',this._readableState.flowing);
-if(false!==this._readableState.flowing){
-debug('pause');
-this._readableState.flowing=false;
-this.emit('pause');
-}
-return this;
-};
-
-function flow(stream){
-var state=stream._readableState;
-debug('flow',state.flowing);
-while(state.flowing&&stream.read()!==null){}
-}
-
-
-
-
-Readable.prototype.wrap=function(stream){
-var _this=this;
-
-var state=this._readableState;
-var paused=false;
-
-stream.on('end',function(){
-debug('wrapped end');
-if(state.decoder&&!state.ended){
-var chunk=state.decoder.end();
-if(chunk&&chunk.length)_this.push(chunk);
-}
-
-_this.push(null);
-});
-
-stream.on('data',function(chunk){
-debug('wrapped data');
-if(state.decoder)chunk=state.decoder.write(chunk);
-
-
-if(state.objectMode&&(chunk===null||chunk===undefined))return;else if(!state.objectMode&&(!chunk||!chunk.length))return;
-
-var ret=_this.push(chunk);
-if(!ret){
-paused=true;
-stream.pause();
-}
-});
-
-
-
-for(var i in stream){
-if(this[i]===undefined&&typeof stream[i]==='function'){
-this[i]=function(method){
-return function(){
-return stream[method].apply(stream,arguments);
-};
-}(i);
-}
-}
-
-
-for(var n=0;n<kProxyEvents.length;n++){
-stream.on(kProxyEvents[n],this.emit.bind(this,kProxyEvents[n]));
-}
-
-
-
-this._read=function(n){
-debug('wrapped _read',n);
-if(paused){
-paused=false;
-stream.resume();
-}
-};
-
-return this;
-};
-
-Object.defineProperty(Readable.prototype,'readableHighWaterMark',{
-
-
-
-enumerable:false,
-get:function(){
-return this._readableState.highWaterMark;
-}});
-
-
-
-Readable._fromList=fromList;
-
-
-
-
-
-function fromList(n,state){
-
-if(state.length===0)return null;
-
-var ret;
-if(state.objectMode)ret=state.buffer.shift();else if(!n||n>=state.length){
-
-if(state.decoder)ret=state.buffer.join('');else if(state.buffer.length===1)ret=state.buffer.head.data;else ret=state.buffer.concat(state.length);
-state.buffer.clear();
-}else{
-
-ret=fromListPartial(n,state.buffer,state.decoder);
-}
-
-return ret;
-}
-
-
-
-
-function fromListPartial(n,list,hasStrings){
-var ret;
-if(n<list.head.data.length){
-
-ret=list.head.data.slice(0,n);
-list.head.data=list.head.data.slice(n);
-}else if(n===list.head.data.length){
-
-ret=list.shift();
-}else{
-
-ret=hasStrings?copyFromBufferString(n,list):copyFromBuffer(n,list);
-}
-return ret;
-}
-
-
-
-
-
-function copyFromBufferString(n,list){
-var p=list.head;
-var c=1;
-var ret=p.data;
-n-=ret.length;
-while(p=p.next){
-var str=p.data;
-var nb=n>str.length?str.length:n;
-if(nb===str.length)ret+=str;else ret+=str.slice(0,n);
-n-=nb;
-if(n===0){
-if(nb===str.length){
-++c;
-if(p.next)list.head=p.next;else list.head=list.tail=null;
-}else{
-list.head=p;
-p.data=str.slice(nb);
-}
-break;
-}
-++c;
-}
-list.length-=c;
-return ret;
-}
-
-
-
-
-function copyFromBuffer(n,list){
-var ret=Buffer.allocUnsafe(n);
-var p=list.head;
-var c=1;
-p.data.copy(ret);
-n-=p.data.length;
-while(p=p.next){
-var buf=p.data;
-var nb=n>buf.length?buf.length:n;
-buf.copy(ret,ret.length-n,0,nb);
-n-=nb;
-if(n===0){
-if(nb===buf.length){
-++c;
-if(p.next)list.head=p.next;else list.head=list.tail=null;
-}else{
-list.head=p;
-p.data=buf.slice(nb);
-}
-break;
-}
-++c;
-}
-list.length-=c;
-return ret;
-}
-
-function endReadable(stream){
-var state=stream._readableState;
-
-
-
-if(state.length>0)throw new Error('"endReadable()" called on non-empty stream');
-
-if(!state.endEmitted){
-state.ended=true;
-pna.nextTick(endReadableNT,state,stream);
-}
-}
-
-function endReadableNT(state,stream){
-
-if(!state.endEmitted&&state.length===0){
-state.endEmitted=true;
-stream.readable=false;
-stream.emit('end');
-}
-}
-
-function indexOf(xs,x){
-for(var i=0,l=xs.length;i<l;i++){
-if(xs[i]===x)return i;
-}
-return-1;
-}
-}).call(this,require('_process'),typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
-},{"./_stream_duplex":163,"./internal/streams/BufferList":168,"./internal/streams/destroy":169,"./internal/streams/stream":170,"_process":158,"core-util-is":103,"events":108,"inherits":113,"isarray":121,"process-nextick-args":157,"safe-buffer":178,"string_decoder/":171,"util":98}],166:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-module.exports=Transform;
-
-var Duplex=require('./_stream_duplex');
-
-
-var util=require('core-util-is');
-util.inherits=require('inherits');
-
-
-util.inherits(Transform,Duplex);
-
-function afterTransform(er,data){
-var ts=this._transformState;
-ts.transforming=false;
-
-var cb=ts.writecb;
-
-if(!cb){
-return this.emit('error',new Error('write callback called multiple times'));
-}
-
-ts.writechunk=null;
-ts.writecb=null;
-
-if(data!=null)
-this.push(data);
-
-cb(er);
-
-var rs=this._readableState;
-rs.reading=false;
-if(rs.needReadable||rs.length<rs.highWaterMark){
-this._read(rs.highWaterMark);
-}
-}
-
-function Transform(options){
-if(!(this instanceof Transform))return new Transform(options);
-
-Duplex.call(this,options);
-
-this._transformState={
-afterTransform:afterTransform.bind(this),
-needTransform:false,
-transforming:false,
-writecb:null,
-writechunk:null,
-writeencoding:null};
-
-
-
-this._readableState.needReadable=true;
-
-
-
-
-this._readableState.sync=false;
-
-if(options){
-if(typeof options.transform==='function')this._transform=options.transform;
-
-if(typeof options.flush==='function')this._flush=options.flush;
-}
-
-
-this.on('prefinish',prefinish);
-}
-
-function prefinish(){
-var _this=this;
-
-if(typeof this._flush==='function'){
-this._flush(function(er,data){
-done(_this,er,data);
-});
-}else{
-done(this,null,null);
-}
-}
-
-Transform.prototype.push=function(chunk,encoding){
-this._transformState.needTransform=false;
-return Duplex.prototype.push.call(this,chunk,encoding);
-};
-
-
-
-
-
-
-
-
-
-
-
-Transform.prototype._transform=function(chunk,encoding,cb){
-throw new Error('_transform() is not implemented');
-};
-
-Transform.prototype._write=function(chunk,encoding,cb){
-var ts=this._transformState;
-ts.writecb=cb;
-ts.writechunk=chunk;
-ts.writeencoding=encoding;
-if(!ts.transforming){
-var rs=this._readableState;
-if(ts.needTransform||rs.needReadable||rs.length<rs.highWaterMark)this._read(rs.highWaterMark);
-}
-};
-
-
-
-
-Transform.prototype._read=function(n){
-var ts=this._transformState;
-
-if(ts.writechunk!==null&&ts.writecb&&!ts.transforming){
-ts.transforming=true;
-this._transform(ts.writechunk,ts.writeencoding,ts.afterTransform);
-}else{
-
-
-ts.needTransform=true;
-}
-};
-
-Transform.prototype._destroy=function(err,cb){
-var _this2=this;
-
-Duplex.prototype._destroy.call(this,err,function(err2){
-cb(err2);
-_this2.emit('close');
-});
-};
-
-function done(stream,er,data){
-if(er)return stream.emit('error',er);
-
-if(data!=null)
-stream.push(data);
-
-
-
-if(stream._writableState.length)throw new Error('Calling transform done when ws.length != 0');
-
-if(stream._transformState.transforming)throw new Error('Calling transform done when still transforming');
-
-return stream.push(null);
-}
-},{"./_stream_duplex":163,"core-util-is":103,"inherits":113}],167:[function(require,module,exports){
-(function(process,global,setImmediate){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-
-
-var pna=require('process-nextick-args');
-
-
-module.exports=Writable;
-
-
-function WriteReq(chunk,encoding,cb){
-this.chunk=chunk;
-this.encoding=encoding;
-this.callback=cb;
-this.next=null;
-}
-
-
-
-function CorkedRequest(state){
-var _this=this;
-
-this.next=null;
-this.entry=null;
-this.finish=function(){
-onCorkedFinish(_this,state);
-};
-}
-
-
-
-var asyncWrite=!process.browser&&['v0.10','v0.9.'].indexOf(process.version.slice(0,5))>-1?setImmediate:pna.nextTick;
-
-
-
-var Duplex;
-
-
-Writable.WritableState=WritableState;
-
-
-var util=require('core-util-is');
-util.inherits=require('inherits');
-
-
-
-var internalUtil={
-deprecate:require('util-deprecate')};
-
-
-
-
-var Stream=require('./internal/streams/stream');
-
-
-
-
-var Buffer=require('safe-buffer').Buffer;
-var OurUint8Array=global.Uint8Array||function(){};
-function _uint8ArrayToBuffer(chunk){
-return Buffer.from(chunk);
-}
-function _isUint8Array(obj){
-return Buffer.isBuffer(obj)||obj instanceof OurUint8Array;
-}
-
-
-
-var destroyImpl=require('./internal/streams/destroy');
-
-util.inherits(Writable,Stream);
-
-function nop(){}
-
-function WritableState(options,stream){
-Duplex=Duplex||require('./_stream_duplex');
-
-options=options||{};
-
-
-
-
-
-
-var isDuplex=stream instanceof Duplex;
-
-
-
-this.objectMode=!!options.objectMode;
-
-if(isDuplex)this.objectMode=this.objectMode||!!options.writableObjectMode;
-
-
-
-
-var hwm=options.highWaterMark;
-var writableHwm=options.writableHighWaterMark;
-var defaultHwm=this.objectMode?16:16*1024;
-
-if(hwm||hwm===0)this.highWaterMark=hwm;else if(isDuplex&&(writableHwm||writableHwm===0))this.highWaterMark=writableHwm;else this.highWaterMark=defaultHwm;
-
-
-this.highWaterMark=Math.floor(this.highWaterMark);
-
-
-this.finalCalled=false;
-
-
-this.needDrain=false;
-
-this.ending=false;
-
-this.ended=false;
-
-this.finished=false;
-
-
-this.destroyed=false;
-
-
-
-
-var noDecode=options.decodeStrings===false;
-this.decodeStrings=!noDecode;
-
-
-
-
-this.defaultEncoding=options.defaultEncoding||'utf8';
-
-
-
-
-this.length=0;
-
-
-this.writing=false;
-
-
-this.corked=0;
-
-
-
-
-
-this.sync=true;
-
-
-
-
-this.bufferProcessing=false;
-
-
-this.onwrite=function(er){
-onwrite(stream,er);
-};
-
-
-this.writecb=null;
-
-
-this.writelen=0;
-
-this.bufferedRequest=null;
-this.lastBufferedRequest=null;
-
-
-
-this.pendingcb=0;
-
-
-
-this.prefinished=false;
-
-
-this.errorEmitted=false;
-
-
-this.bufferedRequestCount=0;
-
-
-
-this.corkedRequestsFree=new CorkedRequest(this);
-}
-
-WritableState.prototype.getBuffer=function getBuffer(){
-var current=this.bufferedRequest;
-var out=[];
-while(current){
-out.push(current);
-current=current.next;
-}
-return out;
-};
-
-(function(){
-try{
-Object.defineProperty(WritableState.prototype,'buffer',{
-get:internalUtil.deprecate(function(){
-return this.getBuffer();
-},'_writableState.buffer is deprecated. Use _writableState.getBuffer '+'instead.','DEP0003')});
-
-}catch(_){}
-})();
-
-
-
-var realHasInstance;
-if(typeof Symbol==='function'&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]==='function'){
-realHasInstance=Function.prototype[Symbol.hasInstance];
-Object.defineProperty(Writable,Symbol.hasInstance,{
-value:function(object){
-if(realHasInstance.call(this,object))return true;
-if(this!==Writable)return false;
-
-return object&&object._writableState instanceof WritableState;
-}});
-
-}else{
-realHasInstance=function(object){
-return object instanceof this;
-};
-}
-
-function Writable(options){
-Duplex=Duplex||require('./_stream_duplex');
-
-
-
-
-
-
-
-
-if(!realHasInstance.call(Writable,this)&&!(this instanceof Duplex)){
-return new Writable(options);
-}
-
-this._writableState=new WritableState(options,this);
-
-
-this.writable=true;
-
-if(options){
-if(typeof options.write==='function')this._write=options.write;
-
-if(typeof options.writev==='function')this._writev=options.writev;
-
-if(typeof options.destroy==='function')this._destroy=options.destroy;
-
-if(typeof options.final==='function')this._final=options.final;
-}
-
-Stream.call(this);
-}
-
-
-Writable.prototype.pipe=function(){
-this.emit('error',new Error('Cannot pipe, not readable'));
-};
-
-function writeAfterEnd(stream,cb){
-var er=new Error('write after end');
-
-stream.emit('error',er);
-pna.nextTick(cb,er);
-}
-
-
-
-
-function validChunk(stream,state,chunk,cb){
-var valid=true;
-var er=false;
-
-if(chunk===null){
-er=new TypeError('May not write null values to stream');
-}else if(typeof chunk!=='string'&&chunk!==undefined&&!state.objectMode){
-er=new TypeError('Invalid non-string/buffer chunk');
-}
-if(er){
-stream.emit('error',er);
-pna.nextTick(cb,er);
-valid=false;
-}
-return valid;
-}
-
-Writable.prototype.write=function(chunk,encoding,cb){
-var state=this._writableState;
-var ret=false;
-var isBuf=!state.objectMode&&_isUint8Array(chunk);
-
-if(isBuf&&!Buffer.isBuffer(chunk)){
-chunk=_uint8ArrayToBuffer(chunk);
-}
-
-if(typeof encoding==='function'){
-cb=encoding;
-encoding=null;
-}
-
-if(isBuf)encoding='buffer';else if(!encoding)encoding=state.defaultEncoding;
-
-if(typeof cb!=='function')cb=nop;
-
-if(state.ended)writeAfterEnd(this,cb);else if(isBuf||validChunk(this,state,chunk,cb)){
-state.pendingcb++;
-ret=writeOrBuffer(this,state,isBuf,chunk,encoding,cb);
-}
-
-return ret;
-};
-
-Writable.prototype.cork=function(){
-var state=this._writableState;
-
-state.corked++;
-};
-
-Writable.prototype.uncork=function(){
-var state=this._writableState;
-
-if(state.corked){
-state.corked--;
-
-if(!state.writing&&!state.corked&&!state.finished&&!state.bufferProcessing&&state.bufferedRequest)clearBuffer(this,state);
-}
-};
-
-Writable.prototype.setDefaultEncoding=function setDefaultEncoding(encoding){
-
-if(typeof encoding==='string')encoding=encoding.toLowerCase();
-if(!(['hex','utf8','utf-8','ascii','binary','base64','ucs2','ucs-2','utf16le','utf-16le','raw'].indexOf((encoding+'').toLowerCase())>-1))throw new TypeError('Unknown encoding: '+encoding);
-this._writableState.defaultEncoding=encoding;
-return this;
-};
-
-function decodeChunk(state,chunk,encoding){
-if(!state.objectMode&&state.decodeStrings!==false&&typeof chunk==='string'){
-chunk=Buffer.from(chunk,encoding);
-}
-return chunk;
-}
-
-Object.defineProperty(Writable.prototype,'writableHighWaterMark',{
-
-
-
-enumerable:false,
-get:function(){
-return this._writableState.highWaterMark;
-}});
-
-
-
-
-
-function writeOrBuffer(stream,state,isBuf,chunk,encoding,cb){
-if(!isBuf){
-var newChunk=decodeChunk(state,chunk,encoding);
-if(chunk!==newChunk){
-isBuf=true;
-encoding='buffer';
-chunk=newChunk;
-}
-}
-var len=state.objectMode?1:chunk.length;
-
-state.length+=len;
-
-var ret=state.length<state.highWaterMark;
-
-if(!ret)state.needDrain=true;
-
-if(state.writing||state.corked){
-var last=state.lastBufferedRequest;
-state.lastBufferedRequest={
-chunk:chunk,
-encoding:encoding,
-isBuf:isBuf,
-callback:cb,
-next:null};
-
-if(last){
-last.next=state.lastBufferedRequest;
-}else{
-state.bufferedRequest=state.lastBufferedRequest;
-}
-state.bufferedRequestCount+=1;
-}else{
-doWrite(stream,state,false,len,chunk,encoding,cb);
-}
-
-return ret;
-}
-
-function doWrite(stream,state,writev,len,chunk,encoding,cb){
-state.writelen=len;
-state.writecb=cb;
-state.writing=true;
-state.sync=true;
-if(writev)stream._writev(chunk,state.onwrite);else stream._write(chunk,encoding,state.onwrite);
-state.sync=false;
-}
-
-function onwriteError(stream,state,sync,er,cb){
---state.pendingcb;
-
-if(sync){
-
-
-pna.nextTick(cb,er);
-
-
-pna.nextTick(finishMaybe,stream,state);
-stream._writableState.errorEmitted=true;
-stream.emit('error',er);
-}else{
-
-
-cb(er);
-stream._writableState.errorEmitted=true;
-stream.emit('error',er);
-
-
-finishMaybe(stream,state);
-}
-}
-
-function onwriteStateUpdate(state){
-state.writing=false;
-state.writecb=null;
-state.length-=state.writelen;
-state.writelen=0;
-}
-
-function onwrite(stream,er){
-var state=stream._writableState;
-var sync=state.sync;
-var cb=state.writecb;
-
-onwriteStateUpdate(state);
-
-if(er)onwriteError(stream,state,sync,er,cb);else{
-
-var finished=needFinish(state);
-
-if(!finished&&!state.corked&&!state.bufferProcessing&&state.bufferedRequest){
-clearBuffer(stream,state);
-}
-
-if(sync){
-
-asyncWrite(afterWrite,stream,state,finished,cb);
-
-}else{
-afterWrite(stream,state,finished,cb);
-}
-}
-}
-
-function afterWrite(stream,state,finished,cb){
-if(!finished)onwriteDrain(stream,state);
-state.pendingcb--;
-cb();
-finishMaybe(stream,state);
-}
-
-
-
-
-function onwriteDrain(stream,state){
-if(state.length===0&&state.needDrain){
-state.needDrain=false;
-stream.emit('drain');
-}
-}
-
-
-function clearBuffer(stream,state){
-state.bufferProcessing=true;
-var entry=state.bufferedRequest;
-
-if(stream._writev&&entry&&entry.next){
-
-var l=state.bufferedRequestCount;
-var buffer=new Array(l);
-var holder=state.corkedRequestsFree;
-holder.entry=entry;
-
-var count=0;
-var allBuffers=true;
-while(entry){
-buffer[count]=entry;
-if(!entry.isBuf)allBuffers=false;
-entry=entry.next;
-count+=1;
-}
-buffer.allBuffers=allBuffers;
-
-doWrite(stream,state,true,state.length,buffer,'',holder.finish);
-
-
-
-state.pendingcb++;
-state.lastBufferedRequest=null;
-if(holder.next){
-state.corkedRequestsFree=holder.next;
-holder.next=null;
-}else{
-state.corkedRequestsFree=new CorkedRequest(state);
-}
-state.bufferedRequestCount=0;
-}else{
-
-while(entry){
-var chunk=entry.chunk;
-var encoding=entry.encoding;
-var cb=entry.callback;
-var len=state.objectMode?1:chunk.length;
-
-doWrite(stream,state,false,len,chunk,encoding,cb);
-entry=entry.next;
-state.bufferedRequestCount--;
-
-
-
-
-if(state.writing){
-break;
-}
-}
-
-if(entry===null)state.lastBufferedRequest=null;
-}
-
-state.bufferedRequest=entry;
-state.bufferProcessing=false;
-}
-
-Writable.prototype._write=function(chunk,encoding,cb){
-cb(new Error('_write() is not implemented'));
-};
-
-Writable.prototype._writev=null;
-
-Writable.prototype.end=function(chunk,encoding,cb){
-var state=this._writableState;
-
-if(typeof chunk==='function'){
-cb=chunk;
-chunk=null;
-encoding=null;
-}else if(typeof encoding==='function'){
-cb=encoding;
-encoding=null;
-}
-
-if(chunk!==null&&chunk!==undefined)this.write(chunk,encoding);
-
-
-if(state.corked){
-state.corked=1;
-this.uncork();
-}
-
-
-if(!state.ending&&!state.finished)endWritable(this,state,cb);
-};
-
-function needFinish(state){
-return state.ending&&state.length===0&&state.bufferedRequest===null&&!state.finished&&!state.writing;
-}
-function callFinal(stream,state){
-stream._final(function(err){
-state.pendingcb--;
-if(err){
-stream.emit('error',err);
-}
-state.prefinished=true;
-stream.emit('prefinish');
-finishMaybe(stream,state);
-});
-}
-function prefinish(stream,state){
-if(!state.prefinished&&!state.finalCalled){
-if(typeof stream._final==='function'){
-state.pendingcb++;
-state.finalCalled=true;
-pna.nextTick(callFinal,stream,state);
-}else{
-state.prefinished=true;
-stream.emit('prefinish');
-}
-}
-}
-
-function finishMaybe(stream,state){
-var need=needFinish(state);
-if(need){
-prefinish(stream,state);
-if(state.pendingcb===0){
-state.finished=true;
-stream.emit('finish');
-}
-}
-return need;
-}
-
-function endWritable(stream,state,cb){
-state.ending=true;
-finishMaybe(stream,state);
-if(cb){
-if(state.finished)pna.nextTick(cb);else stream.once('finish',cb);
-}
-state.ended=true;
-stream.writable=false;
-}
-
-function onCorkedFinish(corkReq,state,err){
-var entry=corkReq.entry;
-corkReq.entry=null;
-while(entry){
-var cb=entry.callback;
-state.pendingcb--;
-cb(err);
-entry=entry.next;
-}
-if(state.corkedRequestsFree){
-state.corkedRequestsFree.next=corkReq;
-}else{
-state.corkedRequestsFree=corkReq;
-}
-}
-
-Object.defineProperty(Writable.prototype,'destroyed',{
-get:function(){
-if(this._writableState===undefined){
-return false;
-}
-return this._writableState.destroyed;
-},
-set:function(value){
-
-
-if(!this._writableState){
-return;
-}
-
-
-
-this._writableState.destroyed=value;
-}});
-
-
-Writable.prototype.destroy=destroyImpl.destroy;
-Writable.prototype._undestroy=destroyImpl.undestroy;
-Writable.prototype._destroy=function(err,cb){
-this.end();
-cb(err);
-};
-}).call(this,require('_process'),typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{},require("timers").setImmediate);
-},{"./_stream_duplex":163,"./internal/streams/destroy":169,"./internal/streams/stream":170,"_process":158,"core-util-is":103,"inherits":113,"process-nextick-args":157,"safe-buffer":178,"timers":188,"util-deprecate":189}],168:[function(require,module,exports){
-'use strict';
-
-function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}
-
-var Buffer=require('safe-buffer').Buffer;
-var util=require('util');
-
-function copyBuffer(src,target,offset){
-src.copy(target,offset);
-}
-
-module.exports=function(){
-function BufferList(){
-_classCallCheck(this,BufferList);
-
-this.head=null;
-this.tail=null;
-this.length=0;
-}
-
-BufferList.prototype.push=function push(v){
-var entry={data:v,next:null};
-if(this.length>0)this.tail.next=entry;else this.head=entry;
-this.tail=entry;
-++this.length;
-};
-
-BufferList.prototype.unshift=function unshift(v){
-var entry={data:v,next:this.head};
-if(this.length===0)this.tail=entry;
-this.head=entry;
-++this.length;
-};
-
-BufferList.prototype.shift=function shift(){
-if(this.length===0)return;
-var ret=this.head.data;
-if(this.length===1)this.head=this.tail=null;else this.head=this.head.next;
---this.length;
-return ret;
-};
-
-BufferList.prototype.clear=function clear(){
-this.head=this.tail=null;
-this.length=0;
-};
-
-BufferList.prototype.join=function join(s){
-if(this.length===0)return'';
-var p=this.head;
-var ret=''+p.data;
-while(p=p.next){
-ret+=s+p.data;
-}return ret;
-};
-
-BufferList.prototype.concat=function concat(n){
-if(this.length===0)return Buffer.alloc(0);
-if(this.length===1)return this.head.data;
-var ret=Buffer.allocUnsafe(n>>>0);
-var p=this.head;
-var i=0;
-while(p){
-copyBuffer(p.data,ret,i);
-i+=p.data.length;
-p=p.next;
-}
-return ret;
-};
-
-return BufferList;
-}();
-
-if(util&&util.inspect&&util.inspect.custom){
-module.exports.prototype[util.inspect.custom]=function(){
-var obj=util.inspect({length:this.length});
-return this.constructor.name+' '+obj;
-};
-}
-},{"safe-buffer":178,"util":98}],169:[function(require,module,exports){
-'use strict';
-
-
-
-var pna=require('process-nextick-args');
-
-
-
-function destroy(err,cb){
-var _this=this;
-
-var readableDestroyed=this._readableState&&this._readableState.destroyed;
-var writableDestroyed=this._writableState&&this._writableState.destroyed;
-
-if(readableDestroyed||writableDestroyed){
-if(cb){
-cb(err);
-}else if(err&&(!this._writableState||!this._writableState.errorEmitted)){
-pna.nextTick(emitErrorNT,this,err);
-}
-return this;
-}
-
-
-
-
-if(this._readableState){
-this._readableState.destroyed=true;
-}
-
-
-if(this._writableState){
-this._writableState.destroyed=true;
-}
-
-this._destroy(err||null,function(err){
-if(!cb&&err){
-pna.nextTick(emitErrorNT,_this,err);
-if(_this._writableState){
-_this._writableState.errorEmitted=true;
-}
-}else if(cb){
-cb(err);
-}
-});
-
-return this;
-}
-
-function undestroy(){
-if(this._readableState){
-this._readableState.destroyed=false;
-this._readableState.reading=false;
-this._readableState.ended=false;
-this._readableState.endEmitted=false;
-}
-
-if(this._writableState){
-this._writableState.destroyed=false;
-this._writableState.ended=false;
-this._writableState.ending=false;
-this._writableState.finished=false;
-this._writableState.errorEmitted=false;
-}
-}
-
-function emitErrorNT(self,err){
-self.emit('error',err);
-}
-
-module.exports={
-destroy:destroy,
-undestroy:undestroy};
-
-},{"process-nextick-args":157}],170:[function(require,module,exports){
-module.exports=require('events').EventEmitter;
-
-},{"events":108}],171:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-'use strict';
-
-
-
-var Buffer=require('safe-buffer').Buffer;
-
-
-var isEncoding=Buffer.isEncoding||function(encoding){
-encoding=''+encoding;
-switch(encoding&&encoding.toLowerCase()){
-case'hex':case'utf8':case'utf-8':case'ascii':case'binary':case'base64':case'ucs2':case'ucs-2':case'utf16le':case'utf-16le':case'raw':
-return true;
-default:
-return false;}
-
-};
-
-function _normalizeEncoding(enc){
-if(!enc)return'utf8';
-var retried;
-while(true){
-switch(enc){
-case'utf8':
-case'utf-8':
-return'utf8';
-case'ucs2':
-case'ucs-2':
-case'utf16le':
-case'utf-16le':
-return'utf16le';
-case'latin1':
-case'binary':
-return'latin1';
-case'base64':
-case'ascii':
-case'hex':
-return enc;
-default:
-if(retried)return;
-enc=(''+enc).toLowerCase();
-retried=true;}
-
-}
-};
-
-
-
-function normalizeEncoding(enc){
-var nenc=_normalizeEncoding(enc);
-if(typeof nenc!=='string'&&(Buffer.isEncoding===isEncoding||!isEncoding(enc)))throw new Error('Unknown encoding: '+enc);
-return nenc||enc;
-}
-
-
-
-
-exports.StringDecoder=StringDecoder;
-function StringDecoder(encoding){
-this.encoding=normalizeEncoding(encoding);
-var nb;
-switch(this.encoding){
-case'utf16le':
-this.text=utf16Text;
-this.end=utf16End;
-nb=4;
-break;
-case'utf8':
-this.fillLast=utf8FillLast;
-nb=4;
-break;
-case'base64':
-this.text=base64Text;
-this.end=base64End;
-nb=3;
-break;
-default:
-this.write=simpleWrite;
-this.end=simpleEnd;
-return;}
-
-this.lastNeed=0;
-this.lastTotal=0;
-this.lastChar=Buffer.allocUnsafe(nb);
-}
-
-StringDecoder.prototype.write=function(buf){
-if(buf.length===0)return'';
-var r;
-var i;
-if(this.lastNeed){
-r=this.fillLast(buf);
-if(r===undefined)return'';
-i=this.lastNeed;
-this.lastNeed=0;
-}else{
-i=0;
-}
-if(i<buf.length)return r?r+this.text(buf,i):this.text(buf,i);
-return r||'';
-};
-
-StringDecoder.prototype.end=utf8End;
-
-
-StringDecoder.prototype.text=utf8Text;
-
-
-StringDecoder.prototype.fillLast=function(buf){
-if(this.lastNeed<=buf.length){
-buf.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed);
-return this.lastChar.toString(this.encoding,0,this.lastTotal);
-}
-buf.copy(this.lastChar,this.lastTotal-this.lastNeed,0,buf.length);
-this.lastNeed-=buf.length;
-};
-
-
-
-function utf8CheckByte(byte){
-if(byte<=0x7F)return 0;else if(byte>>5===0x06)return 2;else if(byte>>4===0x0E)return 3;else if(byte>>3===0x1E)return 4;
-return byte>>6===0x02?-1:-2;
-}
-
-
-
-
-function utf8CheckIncomplete(self,buf,i){
-var j=buf.length-1;
-if(j<i)return 0;
-var nb=utf8CheckByte(buf[j]);
-if(nb>=0){
-if(nb>0)self.lastNeed=nb-1;
-return nb;
-}
-if(--j<i||nb===-2)return 0;
-nb=utf8CheckByte(buf[j]);
-if(nb>=0){
-if(nb>0)self.lastNeed=nb-2;
-return nb;
-}
-if(--j<i||nb===-2)return 0;
-nb=utf8CheckByte(buf[j]);
-if(nb>=0){
-if(nb>0){
-if(nb===2)nb=0;else self.lastNeed=nb-3;
-}
-return nb;
-}
-return 0;
-}
-
-
-
-
-
-
-
-
-
-function utf8CheckExtraBytes(self,buf,p){
-if((buf[0]&0xC0)!==0x80){
-self.lastNeed=0;
-return'\ufffd';
-}
-if(self.lastNeed>1&&buf.length>1){
-if((buf[1]&0xC0)!==0x80){
-self.lastNeed=1;
-return'\ufffd';
-}
-if(self.lastNeed>2&&buf.length>2){
-if((buf[2]&0xC0)!==0x80){
-self.lastNeed=2;
-return'\ufffd';
-}
-}
-}
-}
-
-
-function utf8FillLast(buf){
-var p=this.lastTotal-this.lastNeed;
-var r=utf8CheckExtraBytes(this,buf,p);
-if(r!==undefined)return r;
-if(this.lastNeed<=buf.length){
-buf.copy(this.lastChar,p,0,this.lastNeed);
-return this.lastChar.toString(this.encoding,0,this.lastTotal);
-}
-buf.copy(this.lastChar,p,0,buf.length);
-this.lastNeed-=buf.length;
-}
-
-
-
-
-function utf8Text(buf,i){
-var total=utf8CheckIncomplete(this,buf,i);
-if(!this.lastNeed)return buf.toString('utf8',i);
-this.lastTotal=total;
-var end=buf.length-(total-this.lastNeed);
-buf.copy(this.lastChar,0,end);
-return buf.toString('utf8',i,end);
-}
-
-
-
-function utf8End(buf){
-var r=buf&&buf.length?this.write(buf):'';
-if(this.lastNeed)return r+'\ufffd';
-return r;
-}
-
-
-
-
-
-function utf16Text(buf,i){
-if((buf.length-i)%2===0){
-var r=buf.toString('utf16le',i);
-if(r){
-var c=r.charCodeAt(r.length-1);
-if(c>=0xD800&&c<=0xDBFF){
-this.lastNeed=2;
-this.lastTotal=4;
-this.lastChar[0]=buf[buf.length-2];
-this.lastChar[1]=buf[buf.length-1];
-return r.slice(0,-1);
-}
-}
-return r;
-}
-this.lastNeed=1;
-this.lastTotal=2;
-this.lastChar[0]=buf[buf.length-1];
-return buf.toString('utf16le',i,buf.length-1);
-}
-
-
-
-function utf16End(buf){
-var r=buf&&buf.length?this.write(buf):'';
-if(this.lastNeed){
-var end=this.lastTotal-this.lastNeed;
-return r+this.lastChar.toString('utf16le',0,end);
-}
-return r;
-}
-
-function base64Text(buf,i){
-var n=(buf.length-i)%3;
-if(n===0)return buf.toString('base64',i);
-this.lastNeed=3-n;
-this.lastTotal=3;
-if(n===1){
-this.lastChar[0]=buf[buf.length-1];
-}else{
-this.lastChar[0]=buf[buf.length-2];
-this.lastChar[1]=buf[buf.length-1];
-}
-return buf.toString('base64',i,buf.length-n);
-}
-
-function base64End(buf){
-var r=buf&&buf.length?this.write(buf):'';
-if(this.lastNeed)return r+this.lastChar.toString('base64',0,3-this.lastNeed);
-return r;
-}
-
-
-function simpleWrite(buf){
-return buf.toString(this.encoding);
-}
-
-function simpleEnd(buf){
-return buf&&buf.length?this.write(buf):'';
-}
-},{"safe-buffer":178}],172:[function(require,module,exports){
-module.exports=require('./readable').PassThrough;
-
-},{"./readable":173}],173:[function(require,module,exports){
-exports=module.exports=require('./lib/_stream_readable.js');
-exports.Stream=exports;
-exports.Readable=exports;
-exports.Writable=require('./lib/_stream_writable.js');
-exports.Duplex=require('./lib/_stream_duplex.js');
-exports.Transform=require('./lib/_stream_transform.js');
-exports.PassThrough=require('./lib/_stream_passthrough.js');
-
-},{"./lib/_stream_duplex.js":163,"./lib/_stream_passthrough.js":164,"./lib/_stream_readable.js":165,"./lib/_stream_transform.js":166,"./lib/_stream_writable.js":167}],174:[function(require,module,exports){
-module.exports=require('./readable').Transform;
-
-},{"./readable":173}],175:[function(require,module,exports){
-module.exports=require('./lib/_stream_writable.js');
-
-},{"./lib/_stream_writable.js":167}],176:[function(require,module,exports){
-var URL=require('url').URL;
-
-
-
-
-
-
-
-
-
-
-
-function trimLine(line){
-if(!line){
-return null;
-}
-
-if(Array.isArray(line)){
-return line.map(trimLine);
-}
-
-return String(line).trim();
-}
-
-
-
-
-
-
-
-
-function removeComments(line){
-var commentStartIndex=line.indexOf('#');
-if(commentStartIndex>-1){
-return line.substr(0,commentStartIndex);
-}
-
-return line;
-}
-
-
-
-
-
-
-
-
-function splitLine(line){
-var idx=String(line).indexOf(':');
-
-if(!line||idx<0){
-return null;
-}
-
-return[line.slice(0,idx),line.slice(idx+1)];
-}
-
-
-
-
-
-
-
-
-
-function formatUserAgent(userAgent){
-var formattedUserAgent=userAgent.toLowerCase();
-
-
-var idx=formattedUserAgent.indexOf('/');
-if(idx>-1){
-formattedUserAgent=formattedUserAgent.substr(0,idx);
-}
-
-return formattedUserAgent.trim();
-}
-
-
-
-
-
-
-
-
-
-function normaliseEncoding(path){
-try{
-return urlEncodeToUpper(encodeURI(path).replace(/%25/g,'%'));
-}catch(e){
-return path;
-}
-}
-
-
-
-
-
-
-
-
-
-
-function urlEncodeToUpper(path){
-return path.replace(/%[0-9a-fA-F]{2}/g,function(match){
-return match.toUpperCase();
-});
-}
-
-
-
-
-
-
-
-
-
-
-
-function parsePattern(pattern){
-var regexSpecialChars=/[\-\[\]\/\{\}\(\)\+\?\.\\\^\$\|]/g;
-var wildCardPattern=/\*/g;
-var endOfLinePattern=/\\\$$/;
-
-pattern=normaliseEncoding(pattern);
-
-if(pattern.indexOf('*')<0&&pattern.indexOf('$')<0){
-return pattern;
-}
-
-pattern=pattern.
-replace(regexSpecialChars,'\\$&').
-replace(wildCardPattern,'(?:.*)').
-replace(endOfLinePattern,'$');
-
-return new RegExp(pattern);
-}
-
-function parseRobots(contents,robots){
-var newlineRegex=/\r\n|\r|\n/;
-var lines=contents.
-split(newlineRegex).
-map(removeComments).
-map(splitLine).
-map(trimLine);
-
-var currentUserAgents=[];
-var isNoneUserAgentState=true;
-for(var i=0;i<lines.length;i++){
-var line=lines[i];
-
-if(!line||!line[0]){
-continue;
-}
-
-switch(line[0].toLowerCase()){
-case'user-agent':
-if(isNoneUserAgentState){
-currentUserAgents.length=0;
-}
-
-if(line[1]){
-currentUserAgents.push(formatUserAgent(line[1]));
-}
-break;
-case'disallow':
-robots.addRule(currentUserAgents,line[1],false,i+1);
-break;
-case'allow':
-robots.addRule(currentUserAgents,line[1],true,i+1);
-break;
-case'crawl-delay':
-robots.setCrawlDelay(currentUserAgents,line[1]);
-break;
-case'sitemap':
-if(line[1]){
-robots.addSitemap(line[1]);
-}
-break;
-case'host':
-if(line[1]){
-robots.setPreferredHost(line[1].toLowerCase());
-}
-break;}
-
-
-isNoneUserAgentState=line[0].toLowerCase()!=='user-agent';
-}
-}
-
-
-
-
-
-
-
-
-
-function findRule(path,rules){
-var matchingRule=null;
-
-for(var i=0;i<rules.length;i++){
-var rule=rules[i];
-
-if(typeof rule.pattern==='string'){
-if(path.indexOf(rule.pattern)!==0){
-continue;
-}
-
-
-if(!matchingRule||rule.pattern.length>matchingRule.pattern.length){
-matchingRule=rule;
-}
-
-
-}else if(rule.pattern.test(path)){
-return rule;
-}
-}
-
-return matchingRule;
-}
-
-
-
-
-
-
-
-
-
-
-function parseUrl(url){
-try{
-return new URL(url);
-}catch(e){
-return null;
-}
-}
-
-
-function Robots(url,contents){
-this._url=parseUrl(url)||{};
-this._url.port=this._url.port||80;
-
-this._rules={};
-this._sitemaps=[];
-this._preferedHost=null;
-
-parseRobots(contents||'',this);
-}
-
-
-
-
-
-
-
-
-
-
-Robots.prototype.addRule=function(userAgents,pattern,allow,lineNumber){
-var rules=this._rules;
-
-userAgents.forEach(function(userAgent){
-rules[userAgent]=rules[userAgent]||[];
-
-if(!pattern){
-return;
-}
-
-rules[userAgent].push({
-pattern:parsePattern(pattern),
-allow:allow,
-lineNumber:lineNumber});
-
-});
-};
-
-
-
-
-
-
-
-Robots.prototype.setCrawlDelay=function(userAgents,delayStr){
-var rules=this._rules;
-var delay=Number(delayStr);
-
-userAgents.forEach(function(userAgent){
-rules[userAgent]=rules[userAgent]||[];
-
-if(isNaN(delay)){
-return;
-}
-
-rules[userAgent].crawlDelay=delay;
-});
-};
-
-
-
-
-
-
-Robots.prototype.addSitemap=function(url){
-this._sitemaps.push(url);
-};
-
-
-
-
-
-
-Robots.prototype.setPreferredHost=function(url){
-this._preferedHost=url;
-};
-
-Robots.prototype._getRule=function(url,ua){
-var parsedUrl=parseUrl(url)||{};
-var userAgent=formatUserAgent(ua||'*');
-
-parsedUrl.port=parsedUrl.port||'80';
-
-
-if(parsedUrl.protocol!==this._url.protocol||
-parsedUrl.hostname!==this._url.hostname||
-parsedUrl.port!==this._url.port){
-return;
-}
-
-var rules=this._rules[userAgent]||this._rules['*']||[];
-var path=urlEncodeToUpper(parsedUrl.pathname+parsedUrl.search);
-var rule=findRule(path,rules);
-
-return rule;
-};
-
-
-
-
-
-
-
-
-
-
-
-Robots.prototype.isAllowed=function(url,ua){
-var rule=this._getRule(url,ua);
-
-if(typeof rule==='undefined'){
-return;
-}
-
-return!rule||rule.allow;
-};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Robots.prototype.getMatchingLineNumber=function(url,ua){
-var rule=this._getRule(url,ua);
-
-return rule?rule.lineNumber:-1;
-};
-
-
-
-
-
-
-
-
-Robots.prototype.isDisallowed=function(url,ua){
-return!this.isAllowed(url,ua);
-};
-
-
-
-
-
-
-
-
-
-Robots.prototype.getCrawlDelay=function(ua){
-var userAgent=formatUserAgent(ua||'*');
-
-return(this._rules[userAgent]||this._rules['*']||{}).crawlDelay;
-};
-
-
-
-
-
-
-Robots.prototype.getPreferredHost=function(){
-return this._preferedHost;
-};
-
-
-
-
-
-
-Robots.prototype.getSitemaps=function(){
-return this._sitemaps.slice(0);
-};
-
-module.exports=Robots;
-
-},{"url":"url"}],177:[function(require,module,exports){
-var Robots=require('./Robots');
-
-module.exports=function(url,contents){
-return new Robots(url,contents);
-};
-},{"./Robots":176}],178:[function(require,module,exports){
-
-var buffer=require('buffer');
-var Buffer=buffer.Buffer;
-
-
-function copyProps(src,dst){
-for(var key in src){
-dst[key]=src[key];
-}
-}
-if(Buffer.from&&Buffer.alloc&&Buffer.allocUnsafe&&Buffer.allocUnsafeSlow){
-module.exports=buffer;
-}else{
-
-copyProps(buffer,exports);
-exports.Buffer=SafeBuffer;
-}
-
-function SafeBuffer(arg,encodingOrOffset,length){
-return Buffer(arg,encodingOrOffset,length);
-}
-
-
-copyProps(Buffer,SafeBuffer);
-
-SafeBuffer.from=function(arg,encodingOrOffset,length){
-if(typeof arg==='number'){
-throw new TypeError('Argument must not be a number');
-}
-return Buffer(arg,encodingOrOffset,length);
-};
-
-SafeBuffer.alloc=function(size,fill,encoding){
-if(typeof size!=='number'){
-throw new TypeError('Argument must be a number');
-}
-var buf=Buffer(size);
-if(fill!==undefined){
-if(typeof encoding==='string'){
-buf.fill(fill,encoding);
-}else{
-buf.fill(fill);
-}
-}else{
-buf.fill(0);
-}
-return buf;
-};
-
-SafeBuffer.allocUnsafe=function(size){
-if(typeof size!=='number'){
-throw new TypeError('Argument must be a number');
-}
-return Buffer(size);
-};
-
-SafeBuffer.allocUnsafeSlow=function(size){
-if(typeof size!=='number'){
-throw new TypeError('Argument must be a number');
-}
-return buffer.SlowBuffer(size);
-};
-
-},{"buffer":102}],179:[function(require,module,exports){
-(function(process){
-exports=module.exports=SemVer;
-
-var debug;
-
-if(typeof process==='object'&&
-process.env&&
-process.env.NODE_DEBUG&&
-/\bsemver\b/i.test(process.env.NODE_DEBUG)){
-debug=function(){
-var args=Array.prototype.slice.call(arguments,0);
-args.unshift('SEMVER');
-console.log.apply(console,args);
-};
-}else{
-debug=function(){};
-}
-
-
-
-exports.SEMVER_SPEC_VERSION='2.0.0';
-
-var MAX_LENGTH=256;
-var MAX_SAFE_INTEGER=Number.MAX_SAFE_INTEGER||
-9007199254740991;
-
-
-var MAX_SAFE_COMPONENT_LENGTH=16;
-
-
-var re=exports.re=[];
-var src=exports.src=[];
-var R=0;
-
-
-
-
-
-
-
-var NUMERICIDENTIFIER=R++;
-src[NUMERICIDENTIFIER]='0|[1-9]\\d*';
-var NUMERICIDENTIFIERLOOSE=R++;
-src[NUMERICIDENTIFIERLOOSE]='[0-9]+';
-
-
-
-
-
-var NONNUMERICIDENTIFIER=R++;
-src[NONNUMERICIDENTIFIER]='\\d*[a-zA-Z-][a-zA-Z0-9-]*';
-
-
-
-
-var MAINVERSION=R++;
-src[MAINVERSION]='('+src[NUMERICIDENTIFIER]+')\\.'+
-'('+src[NUMERICIDENTIFIER]+')\\.'+
-'('+src[NUMERICIDENTIFIER]+')';
-
-var MAINVERSIONLOOSE=R++;
-src[MAINVERSIONLOOSE]='('+src[NUMERICIDENTIFIERLOOSE]+')\\.'+
-'('+src[NUMERICIDENTIFIERLOOSE]+')\\.'+
-'('+src[NUMERICIDENTIFIERLOOSE]+')';
-
-
-
-
-var PRERELEASEIDENTIFIER=R++;
-src[PRERELEASEIDENTIFIER]='(?:'+src[NUMERICIDENTIFIER]+
-'|'+src[NONNUMERICIDENTIFIER]+')';
-
-var PRERELEASEIDENTIFIERLOOSE=R++;
-src[PRERELEASEIDENTIFIERLOOSE]='(?:'+src[NUMERICIDENTIFIERLOOSE]+
-'|'+src[NONNUMERICIDENTIFIER]+')';
-
-
-
-
-
-var PRERELEASE=R++;
-src[PRERELEASE]='(?:-('+src[PRERELEASEIDENTIFIER]+
-'(?:\\.'+src[PRERELEASEIDENTIFIER]+')*))';
-
-var PRERELEASELOOSE=R++;
-src[PRERELEASELOOSE]='(?:-?('+src[PRERELEASEIDENTIFIERLOOSE]+
-'(?:\\.'+src[PRERELEASEIDENTIFIERLOOSE]+')*))';
-
-
-
-
-var BUILDIDENTIFIER=R++;
-src[BUILDIDENTIFIER]='[0-9A-Za-z-]+';
-
-
-
-
-
-var BUILD=R++;
-src[BUILD]='(?:\\+('+src[BUILDIDENTIFIER]+
-'(?:\\.'+src[BUILDIDENTIFIER]+')*))';
-
-
-
-
-
-
-
-
-
-
-var FULL=R++;
-var FULLPLAIN='v?'+src[MAINVERSION]+
-src[PRERELEASE]+'?'+
-src[BUILD]+'?';
-
-src[FULL]='^'+FULLPLAIN+'$';
-
-
-
-
-var LOOSEPLAIN='[v=\\s]*'+src[MAINVERSIONLOOSE]+
-src[PRERELEASELOOSE]+'?'+
-src[BUILD]+'?';
-
-var LOOSE=R++;
-src[LOOSE]='^'+LOOSEPLAIN+'$';
-
-var GTLT=R++;
-src[GTLT]='((?:<|>)?=?)';
-
-
-
-
-var XRANGEIDENTIFIERLOOSE=R++;
-src[XRANGEIDENTIFIERLOOSE]=src[NUMERICIDENTIFIERLOOSE]+'|x|X|\\*';
-var XRANGEIDENTIFIER=R++;
-src[XRANGEIDENTIFIER]=src[NUMERICIDENTIFIER]+'|x|X|\\*';
-
-var XRANGEPLAIN=R++;
-src[XRANGEPLAIN]='[v=\\s]*('+src[XRANGEIDENTIFIER]+')'+
-'(?:\\.('+src[XRANGEIDENTIFIER]+')'+
-'(?:\\.('+src[XRANGEIDENTIFIER]+')'+
-'(?:'+src[PRERELEASE]+')?'+
-src[BUILD]+'?'+
-')?)?';
-
-var XRANGEPLAINLOOSE=R++;
-src[XRANGEPLAINLOOSE]='[v=\\s]*('+src[XRANGEIDENTIFIERLOOSE]+')'+
-'(?:\\.('+src[XRANGEIDENTIFIERLOOSE]+')'+
-'(?:\\.('+src[XRANGEIDENTIFIERLOOSE]+')'+
-'(?:'+src[PRERELEASELOOSE]+')?'+
-src[BUILD]+'?'+
-')?)?';
-
-var XRANGE=R++;
-src[XRANGE]='^'+src[GTLT]+'\\s*'+src[XRANGEPLAIN]+'$';
-var XRANGELOOSE=R++;
-src[XRANGELOOSE]='^'+src[GTLT]+'\\s*'+src[XRANGEPLAINLOOSE]+'$';
-
-
-
-var COERCE=R++;
-src[COERCE]='(?:^|[^\\d])'+
-'(\\d{1,'+MAX_SAFE_COMPONENT_LENGTH+'})'+
-'(?:\\.(\\d{1,'+MAX_SAFE_COMPONENT_LENGTH+'}))?'+
-'(?:\\.(\\d{1,'+MAX_SAFE_COMPONENT_LENGTH+'}))?'+
-'(?:$|[^\\d])';
-
-
-
-var LONETILDE=R++;
-src[LONETILDE]='(?:~>?)';
-
-var TILDETRIM=R++;
-src[TILDETRIM]='(\\s*)'+src[LONETILDE]+'\\s+';
-re[TILDETRIM]=new RegExp(src[TILDETRIM],'g');
-var tildeTrimReplace='$1~';
-
-var TILDE=R++;
-src[TILDE]='^'+src[LONETILDE]+src[XRANGEPLAIN]+'$';
-var TILDELOOSE=R++;
-src[TILDELOOSE]='^'+src[LONETILDE]+src[XRANGEPLAINLOOSE]+'$';
-
-
-
-var LONECARET=R++;
-src[LONECARET]='(?:\\^)';
-
-var CARETTRIM=R++;
-src[CARETTRIM]='(\\s*)'+src[LONECARET]+'\\s+';
-re[CARETTRIM]=new RegExp(src[CARETTRIM],'g');
-var caretTrimReplace='$1^';
-
-var CARET=R++;
-src[CARET]='^'+src[LONECARET]+src[XRANGEPLAIN]+'$';
-var CARETLOOSE=R++;
-src[CARETLOOSE]='^'+src[LONECARET]+src[XRANGEPLAINLOOSE]+'$';
-
-
-var COMPARATORLOOSE=R++;
-src[COMPARATORLOOSE]='^'+src[GTLT]+'\\s*('+LOOSEPLAIN+')$|^$';
-var COMPARATOR=R++;
-src[COMPARATOR]='^'+src[GTLT]+'\\s*('+FULLPLAIN+')$|^$';
-
-
-
-var COMPARATORTRIM=R++;
-src[COMPARATORTRIM]='(\\s*)'+src[GTLT]+
-'\\s*('+LOOSEPLAIN+'|'+src[XRANGEPLAIN]+')';
-
-
-re[COMPARATORTRIM]=new RegExp(src[COMPARATORTRIM],'g');
-var comparatorTrimReplace='$1$2$3';
-
-
-
-
-
-var HYPHENRANGE=R++;
-src[HYPHENRANGE]='^\\s*('+src[XRANGEPLAIN]+')'+
-'\\s+-\\s+'+
-'('+src[XRANGEPLAIN]+')'+
-'\\s*$';
-
-var HYPHENRANGELOOSE=R++;
-src[HYPHENRANGELOOSE]='^\\s*('+src[XRANGEPLAINLOOSE]+')'+
-'\\s+-\\s+'+
-'('+src[XRANGEPLAINLOOSE]+')'+
-'\\s*$';
-
-
-var STAR=R++;
-src[STAR]='(<|>)?=?\\s*\\*';
-
-
-
-for(var i=0;i<R;i++){
-debug(i,src[i]);
-if(!re[i]){
-re[i]=new RegExp(src[i]);
-}
-}
-
-exports.parse=parse;
-function parse(version,options){
-if(!options||typeof options!=='object'){
-options={
-loose:!!options,
-includePrerelease:false};
-
-}
-
-if(version instanceof SemVer){
-return version;
-}
-
-if(typeof version!=='string'){
-return null;
-}
-
-if(version.length>MAX_LENGTH){
-return null;
-}
-
-var r=options.loose?re[LOOSE]:re[FULL];
-if(!r.test(version)){
-return null;
-}
-
-try{
-return new SemVer(version,options);
-}catch(er){
-return null;
-}
-}
-
-exports.valid=valid;
-function valid(version,options){
-var v=parse(version,options);
-return v?v.version:null;
-}
-
-exports.clean=clean;
-function clean(version,options){
-var s=parse(version.trim().replace(/^[=v]+/,''),options);
-return s?s.version:null;
-}
-
-exports.SemVer=SemVer;
-
-function SemVer(version,options){
-if(!options||typeof options!=='object'){
-options={
-loose:!!options,
-includePrerelease:false};
-
-}
-if(version instanceof SemVer){
-if(version.loose===options.loose){
-return version;
-}else{
-version=version.version;
-}
-}else if(typeof version!=='string'){
-throw new TypeError('Invalid Version: '+version);
-}
-
-if(version.length>MAX_LENGTH){
-throw new TypeError('version is longer than '+MAX_LENGTH+' characters');
-}
-
-if(!(this instanceof SemVer)){
-return new SemVer(version,options);
-}
-
-debug('SemVer',version,options);
-this.options=options;
-this.loose=!!options.loose;
-
-var m=version.trim().match(options.loose?re[LOOSE]:re[FULL]);
-
-if(!m){
-throw new TypeError('Invalid Version: '+version);
-}
-
-this.raw=version;
-
-
-this.major=+m[1];
-this.minor=+m[2];
-this.patch=+m[3];
-
-if(this.major>MAX_SAFE_INTEGER||this.major<0){
-throw new TypeError('Invalid major version');
-}
-
-if(this.minor>MAX_SAFE_INTEGER||this.minor<0){
-throw new TypeError('Invalid minor version');
-}
-
-if(this.patch>MAX_SAFE_INTEGER||this.patch<0){
-throw new TypeError('Invalid patch version');
-}
-
-
-if(!m[4]){
-this.prerelease=[];
-}else{
-this.prerelease=m[4].split('.').map(function(id){
-if(/^[0-9]+$/.test(id)){
-var num=+id;
-if(num>=0&&num<MAX_SAFE_INTEGER){
-return num;
-}
-}
-return id;
-});
-}
-
-this.build=m[5]?m[5].split('.'):[];
-this.format();
-}
-
-SemVer.prototype.format=function(){
-this.version=this.major+'.'+this.minor+'.'+this.patch;
-if(this.prerelease.length){
-this.version+='-'+this.prerelease.join('.');
-}
-return this.version;
-};
-
-SemVer.prototype.toString=function(){
-return this.version;
-};
-
-SemVer.prototype.compare=function(other){
-debug('SemVer.compare',this.version,this.options,other);
-if(!(other instanceof SemVer)){
-other=new SemVer(other,this.options);
-}
-
-return this.compareMain(other)||this.comparePre(other);
-};
-
-SemVer.prototype.compareMain=function(other){
-if(!(other instanceof SemVer)){
-other=new SemVer(other,this.options);
-}
-
-return compareIdentifiers(this.major,other.major)||
-compareIdentifiers(this.minor,other.minor)||
-compareIdentifiers(this.patch,other.patch);
-};
-
-SemVer.prototype.comparePre=function(other){
-if(!(other instanceof SemVer)){
-other=new SemVer(other,this.options);
-}
-
-
-if(this.prerelease.length&&!other.prerelease.length){
-return-1;
-}else if(!this.prerelease.length&&other.prerelease.length){
-return 1;
-}else if(!this.prerelease.length&&!other.prerelease.length){
-return 0;
-}
-
-var i=0;
-do{
-var a=this.prerelease[i];
-var b=other.prerelease[i];
-debug('prerelease compare',i,a,b);
-if(a===undefined&&b===undefined){
-return 0;
-}else if(b===undefined){
-return 1;
-}else if(a===undefined){
-return-1;
-}else if(a===b){
-continue;
-}else{
-return compareIdentifiers(a,b);
-}
-}while(++i);
-};
-
-
-
-SemVer.prototype.inc=function(release,identifier){
-switch(release){
-case'premajor':
-this.prerelease.length=0;
-this.patch=0;
-this.minor=0;
-this.major++;
-this.inc('pre',identifier);
-break;
-case'preminor':
-this.prerelease.length=0;
-this.patch=0;
-this.minor++;
-this.inc('pre',identifier);
-break;
-case'prepatch':
-
-
-
-this.prerelease.length=0;
-this.inc('patch',identifier);
-this.inc('pre',identifier);
-break;
-
-
-case'prerelease':
-if(this.prerelease.length===0){
-this.inc('patch',identifier);
-}
-this.inc('pre',identifier);
-break;
-
-case'major':
-
-
-
-
-if(this.minor!==0||
-this.patch!==0||
-this.prerelease.length===0){
-this.major++;
-}
-this.minor=0;
-this.patch=0;
-this.prerelease=[];
-break;
-case'minor':
-
-
-
-
-if(this.patch!==0||this.prerelease.length===0){
-this.minor++;
-}
-this.patch=0;
-this.prerelease=[];
-break;
-case'patch':
-
-
-
-
-if(this.prerelease.length===0){
-this.patch++;
-}
-this.prerelease=[];
-break;
-
-
-case'pre':
-if(this.prerelease.length===0){
-this.prerelease=[0];
-}else{
-var i=this.prerelease.length;
-while(--i>=0){
-if(typeof this.prerelease[i]==='number'){
-this.prerelease[i]++;
-i=-2;
-}
-}
-if(i===-1){
-
-this.prerelease.push(0);
-}
-}
-if(identifier){
-
-
-if(this.prerelease[0]===identifier){
-if(isNaN(this.prerelease[1])){
-this.prerelease=[identifier,0];
-}
-}else{
-this.prerelease=[identifier,0];
-}
-}
-break;
-
-default:
-throw new Error('invalid increment argument: '+release);}
-
-this.format();
-this.raw=this.version;
-return this;
-};
-
-exports.inc=inc;
-function inc(version,release,loose,identifier){
-if(typeof loose==='string'){
-identifier=loose;
-loose=undefined;
-}
-
-try{
-return new SemVer(version,loose).inc(release,identifier).version;
-}catch(er){
-return null;
-}
-}
-
-exports.diff=diff;
-function diff(version1,version2){
-if(eq(version1,version2)){
-return null;
-}else{
-var v1=parse(version1);
-var v2=parse(version2);
-var prefix='';
-if(v1.prerelease.length||v2.prerelease.length){
-prefix='pre';
-var defaultResult='prerelease';
-}
-for(var key in v1){
-if(key==='major'||key==='minor'||key==='patch'){
-if(v1[key]!==v2[key]){
-return prefix+key;
-}
-}
-}
-return defaultResult;
-}
-}
-
-exports.compareIdentifiers=compareIdentifiers;
-
-var numeric=/^[0-9]+$/;
-function compareIdentifiers(a,b){
-var anum=numeric.test(a);
-var bnum=numeric.test(b);
-
-if(anum&&bnum){
-a=+a;
-b=+b;
-}
-
-return a===b?0:
-anum&&!bnum?-1:
-bnum&&!anum?1:
-a<b?-1:
-1;
-}
-
-exports.rcompareIdentifiers=rcompareIdentifiers;
-function rcompareIdentifiers(a,b){
-return compareIdentifiers(b,a);
-}
-
-exports.major=major;
-function major(a,loose){
-return new SemVer(a,loose).major;
-}
-
-exports.minor=minor;
-function minor(a,loose){
-return new SemVer(a,loose).minor;
-}
-
-exports.patch=patch;
-function patch(a,loose){
-return new SemVer(a,loose).patch;
-}
-
-exports.compare=compare;
-function compare(a,b,loose){
-return new SemVer(a,loose).compare(new SemVer(b,loose));
-}
-
-exports.compareLoose=compareLoose;
-function compareLoose(a,b){
-return compare(a,b,true);
-}
-
-exports.rcompare=rcompare;
-function rcompare(a,b,loose){
-return compare(b,a,loose);
-}
-
-exports.sort=sort;
-function sort(list,loose){
-return list.sort(function(a,b){
-return exports.compare(a,b,loose);
-});
-}
-
-exports.rsort=rsort;
-function rsort(list,loose){
-return list.sort(function(a,b){
-return exports.rcompare(a,b,loose);
-});
-}
-
-exports.gt=gt;
-function gt(a,b,loose){
-return compare(a,b,loose)>0;
-}
-
-exports.lt=lt;
-function lt(a,b,loose){
-return compare(a,b,loose)<0;
-}
-
-exports.eq=eq;
-function eq(a,b,loose){
-return compare(a,b,loose)===0;
-}
-
-exports.neq=neq;
-function neq(a,b,loose){
-return compare(a,b,loose)!==0;
-}
-
-exports.gte=gte;
-function gte(a,b,loose){
-return compare(a,b,loose)>=0;
-}
-
-exports.lte=lte;
-function lte(a,b,loose){
-return compare(a,b,loose)<=0;
-}
-
-exports.cmp=cmp;
-function cmp(a,op,b,loose){
-switch(op){
-case'===':
-if(typeof a==='object')
-a=a.version;
-if(typeof b==='object')
-b=b.version;
-return a===b;
-
-case'!==':
-if(typeof a==='object')
-a=a.version;
-if(typeof b==='object')
-b=b.version;
-return a!==b;
-
-case'':
-case'=':
-case'==':
-return eq(a,b,loose);
-
-case'!=':
-return neq(a,b,loose);
-
-case'>':
-return gt(a,b,loose);
-
-case'>=':
-return gte(a,b,loose);
-
-case'<':
-return lt(a,b,loose);
-
-case'<=':
-return lte(a,b,loose);
-
-default:
-throw new TypeError('Invalid operator: '+op);}
-
-}
-
-exports.Comparator=Comparator;
-function Comparator(comp,options){
-if(!options||typeof options!=='object'){
-options={
-loose:!!options,
-includePrerelease:false};
-
-}
-
-if(comp instanceof Comparator){
-if(comp.loose===!!options.loose){
-return comp;
-}else{
-comp=comp.value;
-}
-}
-
-if(!(this instanceof Comparator)){
-return new Comparator(comp,options);
-}
-
-debug('comparator',comp,options);
-this.options=options;
-this.loose=!!options.loose;
-this.parse(comp);
-
-if(this.semver===ANY){
-this.value='';
-}else{
-this.value=this.operator+this.semver.version;
-}
-
-debug('comp',this);
-}
-
-var ANY={};
-Comparator.prototype.parse=function(comp){
-var r=this.options.loose?re[COMPARATORLOOSE]:re[COMPARATOR];
-var m=comp.match(r);
-
-if(!m){
-throw new TypeError('Invalid comparator: '+comp);
-}
-
-this.operator=m[1];
-if(this.operator==='='){
-this.operator='';
-}
-
-
-if(!m[2]){
-this.semver=ANY;
-}else{
-this.semver=new SemVer(m[2],this.options.loose);
-}
-};
-
-Comparator.prototype.toString=function(){
-return this.value;
-};
-
-Comparator.prototype.test=function(version){
-debug('Comparator.test',version,this.options.loose);
-
-if(this.semver===ANY){
-return true;
-}
-
-if(typeof version==='string'){
-version=new SemVer(version,this.options);
-}
-
-return cmp(version,this.operator,this.semver,this.options);
-};
-
-Comparator.prototype.intersects=function(comp,options){
-if(!(comp instanceof Comparator)){
-throw new TypeError('a Comparator is required');
-}
-
-if(!options||typeof options!=='object'){
-options={
-loose:!!options,
-includePrerelease:false};
-
-}
-
-var rangeTmp;
-
-if(this.operator===''){
-rangeTmp=new Range(comp.value,options);
-return satisfies(this.value,rangeTmp,options);
-}else if(comp.operator===''){
-rangeTmp=new Range(this.value,options);
-return satisfies(comp.semver,rangeTmp,options);
-}
-
-var sameDirectionIncreasing=
-(this.operator==='>='||this.operator==='>')&&(
-comp.operator==='>='||comp.operator==='>');
-var sameDirectionDecreasing=
-(this.operator==='<='||this.operator==='<')&&(
-comp.operator==='<='||comp.operator==='<');
-var sameSemVer=this.semver.version===comp.semver.version;
-var differentDirectionsInclusive=
-(this.operator==='>='||this.operator==='<=')&&(
-comp.operator==='>='||comp.operator==='<=');
-var oppositeDirectionsLessThan=
-cmp(this.semver,'<',comp.semver,options)&&
-(this.operator==='>='||this.operator==='>')&&(
-comp.operator==='<='||comp.operator==='<');
-var oppositeDirectionsGreaterThan=
-cmp(this.semver,'>',comp.semver,options)&&
-(this.operator==='<='||this.operator==='<')&&(
-comp.operator==='>='||comp.operator==='>');
-
-return sameDirectionIncreasing||sameDirectionDecreasing||
-sameSemVer&&differentDirectionsInclusive||
-oppositeDirectionsLessThan||oppositeDirectionsGreaterThan;
-};
-
-exports.Range=Range;
-function Range(range,options){
-if(!options||typeof options!=='object'){
-options={
-loose:!!options,
-includePrerelease:false};
-
-}
-
-if(range instanceof Range){
-if(range.loose===!!options.loose&&
-range.includePrerelease===!!options.includePrerelease){
-return range;
-}else{
-return new Range(range.raw,options);
-}
-}
-
-if(range instanceof Comparator){
-return new Range(range.value,options);
-}
-
-if(!(this instanceof Range)){
-return new Range(range,options);
-}
-
-this.options=options;
-this.loose=!!options.loose;
-this.includePrerelease=!!options.includePrerelease;
-
-
-this.raw=range;
-this.set=range.split(/\s*\|\|\s*/).map(function(range){
-return this.parseRange(range.trim());
-},this).filter(function(c){
-
-return c.length;
-});
-
-if(!this.set.length){
-throw new TypeError('Invalid SemVer Range: '+range);
-}
-
-this.format();
-}
-
-Range.prototype.format=function(){
-this.range=this.set.map(function(comps){
-return comps.join(' ').trim();
-}).join('||').trim();
-return this.range;
-};
-
-Range.prototype.toString=function(){
-return this.range;
-};
-
-Range.prototype.parseRange=function(range){
-var loose=this.options.loose;
-range=range.trim();
-
-var hr=loose?re[HYPHENRANGELOOSE]:re[HYPHENRANGE];
-range=range.replace(hr,hyphenReplace);
-debug('hyphen replace',range);
-
-range=range.replace(re[COMPARATORTRIM],comparatorTrimReplace);
-debug('comparator trim',range,re[COMPARATORTRIM]);
-
-
-range=range.replace(re[TILDETRIM],tildeTrimReplace);
-
-
-range=range.replace(re[CARETTRIM],caretTrimReplace);
-
-
-range=range.split(/\s+/).join(' ');
-
-
-
-
-var compRe=loose?re[COMPARATORLOOSE]:re[COMPARATOR];
-var set=range.split(' ').map(function(comp){
-return parseComparator(comp,this.options);
-},this).join(' ').split(/\s+/);
-if(this.options.loose){
-
-set=set.filter(function(comp){
-return!!comp.match(compRe);
-});
-}
-set=set.map(function(comp){
-return new Comparator(comp,this.options);
-},this);
-
-return set;
-};
-
-Range.prototype.intersects=function(range,options){
-if(!(range instanceof Range)){
-throw new TypeError('a Range is required');
-}
-
-return this.set.some(function(thisComparators){
-return thisComparators.every(function(thisComparator){
-return range.set.some(function(rangeComparators){
-return rangeComparators.every(function(rangeComparator){
-return thisComparator.intersects(rangeComparator,options);
-});
-});
-});
-});
-};
-
-
-exports.toComparators=toComparators;
-function toComparators(range,options){
-return new Range(range,options).set.map(function(comp){
-return comp.map(function(c){
-return c.value;
-}).join(' ').trim().split(' ');
-});
-}
-
-
-
-
-function parseComparator(comp,options){
-debug('comp',comp,options);
-comp=replaceCarets(comp,options);
-debug('caret',comp);
-comp=replaceTildes(comp,options);
-debug('tildes',comp);
-comp=replaceXRanges(comp,options);
-debug('xrange',comp);
-comp=replaceStars(comp,options);
-debug('stars',comp);
-return comp;
-}
-
-function isX(id){
-return!id||id.toLowerCase()==='x'||id==='*';
-}
-
-
-
-
-
-
-
-function replaceTildes(comp,options){
-return comp.trim().split(/\s+/).map(function(comp){
-return replaceTilde(comp,options);
-}).join(' ');
-}
-
-function replaceTilde(comp,options){
-var r=options.loose?re[TILDELOOSE]:re[TILDE];
-return comp.replace(r,function(_,M,m,p,pr){
-debug('tilde',comp,_,M,m,p,pr);
-var ret;
-
-if(isX(M)){
-ret='';
-}else if(isX(m)){
-ret='>='+M+'.0.0 <'+(+M+1)+'.0.0';
-}else if(isX(p)){
-
-ret='>='+M+'.'+m+'.0 <'+M+'.'+(+m+1)+'.0';
-}else if(pr){
-debug('replaceTilde pr',pr);
-ret='>='+M+'.'+m+'.'+p+'-'+pr+
-' <'+M+'.'+(+m+1)+'.0';
-}else{
-
-ret='>='+M+'.'+m+'.'+p+
-' <'+M+'.'+(+m+1)+'.0';
-}
-
-debug('tilde return',ret);
-return ret;
-});
-}
-
-
-
-
-
-
-
-function replaceCarets(comp,options){
-return comp.trim().split(/\s+/).map(function(comp){
-return replaceCaret(comp,options);
-}).join(' ');
-}
-
-function replaceCaret(comp,options){
-debug('caret',comp,options);
-var r=options.loose?re[CARETLOOSE]:re[CARET];
-return comp.replace(r,function(_,M,m,p,pr){
-debug('caret',comp,_,M,m,p,pr);
-var ret;
-
-if(isX(M)){
-ret='';
-}else if(isX(m)){
-ret='>='+M+'.0.0 <'+(+M+1)+'.0.0';
-}else if(isX(p)){
-if(M==='0'){
-ret='>='+M+'.'+m+'.0 <'+M+'.'+(+m+1)+'.0';
-}else{
-ret='>='+M+'.'+m+'.0 <'+(+M+1)+'.0.0';
-}
-}else if(pr){
-debug('replaceCaret pr',pr);
-if(M==='0'){
-if(m==='0'){
-ret='>='+M+'.'+m+'.'+p+'-'+pr+
-' <'+M+'.'+m+'.'+(+p+1);
-}else{
-ret='>='+M+'.'+m+'.'+p+'-'+pr+
-' <'+M+'.'+(+m+1)+'.0';
-}
-}else{
-ret='>='+M+'.'+m+'.'+p+'-'+pr+
-' <'+(+M+1)+'.0.0';
-}
-}else{
-debug('no pr');
-if(M==='0'){
-if(m==='0'){
-ret='>='+M+'.'+m+'.'+p+
-' <'+M+'.'+m+'.'+(+p+1);
-}else{
-ret='>='+M+'.'+m+'.'+p+
-' <'+M+'.'+(+m+1)+'.0';
-}
-}else{
-ret='>='+M+'.'+m+'.'+p+
-' <'+(+M+1)+'.0.0';
-}
-}
-
-debug('caret return',ret);
-return ret;
-});
-}
-
-function replaceXRanges(comp,options){
-debug('replaceXRanges',comp,options);
-return comp.split(/\s+/).map(function(comp){
-return replaceXRange(comp,options);
-}).join(' ');
-}
-
-function replaceXRange(comp,options){
-comp=comp.trim();
-var r=options.loose?re[XRANGELOOSE]:re[XRANGE];
-return comp.replace(r,function(ret,gtlt,M,m,p,pr){
-debug('xRange',comp,ret,gtlt,M,m,p,pr);
-var xM=isX(M);
-var xm=xM||isX(m);
-var xp=xm||isX(p);
-var anyX=xp;
-
-if(gtlt==='='&&anyX){
-gtlt='';
-}
-
-if(xM){
-if(gtlt==='>'||gtlt==='<'){
-
-ret='<0.0.0';
-}else{
-
-ret='*';
-}
-}else if(gtlt&&anyX){
-
-
-if(xm){
-m=0;
-}
-p=0;
-
-if(gtlt==='>'){
-
-
-
-gtlt='>=';
-if(xm){
-M=+M+1;
-m=0;
-p=0;
-}else{
-m=+m+1;
-p=0;
-}
-}else if(gtlt==='<='){
-
-
-gtlt='<';
-if(xm){
-M=+M+1;
-}else{
-m=+m+1;
-}
-}
-
-ret=gtlt+M+'.'+m+'.'+p;
-}else if(xm){
-ret='>='+M+'.0.0 <'+(+M+1)+'.0.0';
-}else if(xp){
-ret='>='+M+'.'+m+'.0 <'+M+'.'+(+m+1)+'.0';
-}
-
-debug('xRange return',ret);
-
-return ret;
-});
-}
-
-
-
-function replaceStars(comp,options){
-debug('replaceStars',comp,options);
-
-return comp.trim().replace(re[STAR],'');
-}
-
-
-
-
-
-
-function hyphenReplace($0,
-from,fM,fm,fp,fpr,fb,
-to,tM,tm,tp,tpr,tb){
-if(isX(fM)){
-from='';
-}else if(isX(fm)){
-from='>='+fM+'.0.0';
-}else if(isX(fp)){
-from='>='+fM+'.'+fm+'.0';
-}else{
-from='>='+from;
-}
-
-if(isX(tM)){
-to='';
-}else if(isX(tm)){
-to='<'+(+tM+1)+'.0.0';
-}else if(isX(tp)){
-to='<'+tM+'.'+(+tm+1)+'.0';
-}else if(tpr){
-to='<='+tM+'.'+tm+'.'+tp+'-'+tpr;
-}else{
-to='<='+to;
-}
-
-return(from+' '+to).trim();
-}
-
-
-Range.prototype.test=function(version){
-if(!version){
-return false;
-}
-
-if(typeof version==='string'){
-version=new SemVer(version,this.options);
-}
-
-for(var i=0;i<this.set.length;i++){
-if(testSet(this.set[i],version,this.options)){
-return true;
-}
-}
-return false;
-};
-
-function testSet(set,version,options){
-for(var i=0;i<set.length;i++){
-if(!set[i].test(version)){
-return false;
-}
-}
-
-if(version.prerelease.length&&!options.includePrerelease){
-
-
-
-
-
-for(i=0;i<set.length;i++){
-debug(set[i].semver);
-if(set[i].semver===ANY){
-continue;
-}
-
-if(set[i].semver.prerelease.length>0){
-var allowed=set[i].semver;
-if(allowed.major===version.major&&
-allowed.minor===version.minor&&
-allowed.patch===version.patch){
-return true;
-}
-}
-}
-
-
-return false;
-}
-
-return true;
-}
-
-exports.satisfies=satisfies;
-function satisfies(version,range,options){
-try{
-range=new Range(range,options);
-}catch(er){
-return false;
-}
-return range.test(version);
-}
-
-exports.maxSatisfying=maxSatisfying;
-function maxSatisfying(versions,range,options){
-var max=null;
-var maxSV=null;
-try{
-var rangeObj=new Range(range,options);
-}catch(er){
-return null;
-}
-versions.forEach(function(v){
-if(rangeObj.test(v)){
-
-if(!max||maxSV.compare(v)===-1){
-
-max=v;
-maxSV=new SemVer(max,options);
-}
-}
-});
-return max;
-}
-
-exports.minSatisfying=minSatisfying;
-function minSatisfying(versions,range,options){
-var min=null;
-var minSV=null;
-try{
-var rangeObj=new Range(range,options);
-}catch(er){
-return null;
-}
-versions.forEach(function(v){
-if(rangeObj.test(v)){
-
-if(!min||minSV.compare(v)===1){
-
-min=v;
-minSV=new SemVer(min,options);
-}
-}
-});
-return min;
-}
-
-exports.minVersion=minVersion;
-function minVersion(range,loose){
-range=new Range(range,loose);
-
-var minver=new SemVer('0.0.0');
-if(range.test(minver)){
-return minver;
-}
-
-minver=new SemVer('0.0.0-0');
-if(range.test(minver)){
-return minver;
-}
-
-minver=null;
-for(var i=0;i<range.set.length;++i){
-var comparators=range.set[i];
-
-comparators.forEach(function(comparator){
-
-var compver=new SemVer(comparator.semver.version);
-switch(comparator.operator){
-case'>':
-if(compver.prerelease.length===0){
-compver.patch++;
-}else{
-compver.prerelease.push(0);
-}
-compver.raw=compver.format();
-
-case'':
-case'>=':
-if(!minver||gt(minver,compver)){
-minver=compver;
-}
-break;
-case'<':
-case'<=':
-
-break;
-
-default:
-throw new Error('Unexpected operation: '+comparator.operator);}
-
-});
-}
-
-if(minver&&range.test(minver)){
-return minver;
-}
-
-return null;
-}
-
-exports.validRange=validRange;
-function validRange(range,options){
-try{
-
-
-return new Range(range,options).range||'*';
-}catch(er){
-return null;
-}
-}
-
-
-exports.ltr=ltr;
-function ltr(version,range,options){
-return outside(version,range,'<',options);
-}
-
-
-exports.gtr=gtr;
-function gtr(version,range,options){
-return outside(version,range,'>',options);
-}
-
-exports.outside=outside;
-function outside(version,range,hilo,options){
-version=new SemVer(version,options);
-range=new Range(range,options);
-
-var gtfn,ltefn,ltfn,comp,ecomp;
-switch(hilo){
-case'>':
-gtfn=gt;
-ltefn=lte;
-ltfn=lt;
-comp='>';
-ecomp='>=';
-break;
-case'<':
-gtfn=lt;
-ltefn=gte;
-ltfn=gt;
-comp='<';
-ecomp='<=';
-break;
-default:
-throw new TypeError('Must provide a hilo val of "<" or ">"');}
-
-
-
-if(satisfies(version,range,options)){
-return false;
-}
-
-
-
-
-for(var i=0;i<range.set.length;++i){
-var comparators=range.set[i];
-
-var high=null;
-var low=null;
-
-comparators.forEach(function(comparator){
-if(comparator.semver===ANY){
-comparator=new Comparator('>=0.0.0');
-}
-high=high||comparator;
-low=low||comparator;
-if(gtfn(comparator.semver,high.semver,options)){
-high=comparator;
-}else if(ltfn(comparator.semver,low.semver,options)){
-low=comparator;
-}
-});
-
-
-
-if(high.operator===comp||high.operator===ecomp){
-return false;
-}
-
-
-
-if((!low.operator||low.operator===comp)&&
-ltefn(version,low.semver)){
-return false;
-}else if(low.operator===ecomp&&ltfn(version,low.semver)){
-return false;
-}
-}
-return true;
-}
-
-exports.prerelease=prerelease;
-function prerelease(version,options){
-var parsed=parse(version,options);
-return parsed&&parsed.prerelease.length?parsed.prerelease:null;
-}
-
-exports.intersects=intersects;
-function intersects(r1,r2,options){
-r1=new Range(r1,options);
-r2=new Range(r2,options);
-return r1.intersects(r2);
-}
-
-exports.coerce=coerce;
-function coerce(version){
-if(version instanceof SemVer){
-return version;
-}
-
-if(typeof version!=='string'){
-return null;
-}
-
-var match=version.match(re[COERCE]);
-
-if(match==null){
-return null;
-}
-
-return parse(match[1]+
-'.'+(match[2]||'0')+
-'.'+(match[3]||'0'));
-}
-
-}).call(this,require('_process'));
-},{"_process":158}],180:[function(require,module,exports){
-(function(Buffer){
-'use strict';
-
-const fs=require('fs');
-const jpeg=require('jpeg-js');
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function getPixel(x,y,channel,width,buff){
-return buff[(x+y*width)*4+channel];
-}
-
-
-
-
-
-
-function isWhitePixel(i,j,img){
-return getPixel(i,j,0,img.width,img.data)>=249&&
-getPixel(i,j,1,img.width,img.data)>=249&&
-getPixel(i,j,2,img.width,img.data)>=249;
-}
-
-
-function convertPixelsToHistogram(img){
-const createHistogramArray=function(){
-const ret=[];
-for(let i=0;i<256;i++){
-ret[i]=0;
-}
-return ret;
-};
-
-const width=img.width;
-const height=img.height;
-
-const histograms=[
-createHistogramArray(),
-createHistogramArray(),
-createHistogramArray()];
-
-
-for(let j=0;j<height;j++){
-for(let i=0;i<width;i++){
-
-if(isWhitePixel(i,j,img)){
-continue;
-}
-
-for(let channel=0;channel<histograms.length;channel++){
-const pixelValue=getPixel(i,j,channel,width,img.data);
-histograms[channel][pixelValue]++;
-}
-}
-}
-
-return histograms;
-}
-
-
-function synthesizeWhiteFrame(frames){
-const firstImageData=jpeg.decode(frames[0].getImage());
-const width=firstImageData.width;
-const height=firstImageData.height;
-
-const frameData=Buffer.alloc(width*height*4);
-let i=0;
-while(i<frameData.length){
-frameData[i++]=0xFF;
-frameData[i++]=0xFF;
-frameData[i++]=0xFF;
-frameData[i++]=0xFF;
-}
-
-var jpegImageData=jpeg.encode({
-data:frameData,
-width:width,
-height:height});
-
-return jpegImageData.data;
-}
-
-const screenshotTraceCategory='disabled-by-default-devtools.screenshot';
-
-
-
-
-
-function extractFramesFromTimeline(timeline,opts){
-opts=opts||{};
-
-let trace;
-timeline=typeof timeline==='string'?fs.readFileSync(timeline,'utf-8'):timeline;
-try{
-trace=typeof timeline==='string'?JSON.parse(timeline):timeline;
-}catch(e){
-throw new Error('Speedline: Invalid JSON'+e.message);
-}
-
-let events=trace.traceEvents||trace;
-
-let startTs=Number.MAX_VALUE;
-let endTs=-Number.MAX_VALUE;
-events.forEach(e=>{
-if(e.ts===0){
-return;
-}
-
-startTs=Math.min(startTs,e.ts);
-endTs=Math.max(endTs,e.ts);
-});
-
-startTs=(opts.timeOrigin||startTs)/1000;
-endTs/=1000;
-
-
-let lastFrame=null;
-const rawScreenshots=events.filter(e=>e.cat.includes(screenshotTraceCategory)&&e.ts>=startTs*1000);
-rawScreenshots.sort((a,b)=>a.ts-b.ts);
-
-
-const uniqueFrames=rawScreenshots.map(function(evt){
-const base64img=evt.args&&evt.args.snapshot;
-const timestamp=evt.ts/1000;
-
-if(base64img===lastFrame){
-return null;
-}
-
-lastFrame=base64img;
-const imgBuff=Buffer.from(base64img,'base64');
-return frame(imgBuff,timestamp);
-}).filter(Boolean);
-
-if(uniqueFrames.length===0){
-return Promise.reject(new Error('No screenshots found in trace'));
-}
-
-const fakeWhiteFrame=frame(synthesizeWhiteFrame(uniqueFrames),startTs);
-uniqueFrames.unshift(fakeWhiteFrame);
-
-const data={
-startTs,
-endTs,
-frames:uniqueFrames};
-
-return Promise.resolve(data);
-}
-
-
-
-
-
-
-function frame(imgBuff,ts){
-
-let _histogram=null;
-
-let _progress=null;
-
-let _isProgressInterpolated=null;
-
-let _perceptualProgress=null;
-
-let _isPerceptualProgressInterpolated=null;
-
-let _parsedImage=null;
-
-return{
-getHistogram:function(){
-if(_histogram){
-return _histogram;
-}
-
-const pixels=this.getParsedImage();
-_histogram=convertPixelsToHistogram(pixels);
-return _histogram;
-},
-
-getTimeStamp:function(){
-return ts;
-},
-
-setProgress:function(progress,isInterpolated){
-_progress=progress;
-_isProgressInterpolated=Boolean(isInterpolated);
-},
-
-setPerceptualProgress:function(progress,isInterpolated){
-_perceptualProgress=progress;
-_isPerceptualProgressInterpolated=Boolean(isInterpolated);
-},
-
-getImage:function(){
-return imgBuff;
-},
-
-getParsedImage:function(){
-if(!_parsedImage){
-_parsedImage=jpeg.decode(imgBuff);
-}
-return _parsedImage;
-},
-
-getProgress:function(){
-return _progress;
-},
-
-isProgressInterpolated:function(){
-return _isProgressInterpolated;
-},
-
-getPerceptualProgress:function(){
-return _perceptualProgress;
-},
-
-isPerceptualProgressInterpolated:function(){
-return _isPerceptualProgressInterpolated;
-}};
-
-}
-
-module.exports={
-extractFramesFromTimeline,
-create:frame};
-
-
-}).call(this,require("buffer").Buffer);
-},{"buffer":102,"fs":101,"jpeg-js":122}],181:[function(require,module,exports){
-'use strict';
-
-const frame=require('./frame');
-const speedIndex=require('./speed-index');
-
-
-
-
-
-
-
-
-
-
-
-function calculateValues(frames,data){
-const indexes=speedIndex.calculateSpeedIndexes(frames,data);
-const duration=Math.floor(data.endTs-data.startTs);
-const first=Math.floor(indexes.firstPaintTs-data.startTs);
-const complete=Math.floor(indexes.visuallyCompleteTs-data.startTs);
-
-return{
-beginning:data.startTs,
-end:data.endTs,
-frames,
-first,
-complete,
-duration,
-speedIndex:indexes.speedIndex,
-perceptualSpeedIndex:indexes.perceptualSpeedIndex};
-
-}
-
-
-const Include={
-All:'all',
-pSI:'perceptualSpeedIndex',
-SI:'speedIndex'};
-
-
-
-
-
-
-
-
-
-module.exports=function(timeline,opts){
-const include=opts&&opts.include||Include.All;
-
-if(!Object.keys(Include).some(key=>Include[key]===include)){
-throw new Error(`Unrecognized include option: ${include}`);
-}
-
-return frame.extractFramesFromTimeline(timeline,opts).then(function(data){
-const frames=data.frames;
-
-if(include===Include.All||include===Include.SI){
-speedIndex.calculateVisualProgress(frames,opts);
-}
-
-if(include===Include.All||include===Include.pSI){
-speedIndex.calculatePerceptualProgress(frames,opts);
-}
-
-return calculateValues(frames,data);
-});
-};
-
-},{"./frame":180,"./speed-index":182}],182:[function(require,module,exports){
-'use strict';
-
-const imageSSIM=require('image-ssim');
-
-
-const fastModeAllowableChangeMax=5;
-const fastModeAllowableChangeMedian=3;
-const fastModeAllowableChangeMin=-1;
-
-const fastModeConstant=fastModeAllowableChangeMin;
-const fastModeMultiplier=fastModeAllowableChangeMax-fastModeConstant;
-const fastModeExponentiationCoefficient=Math.log((fastModeAllowableChangeMedian-fastModeConstant)/fastModeMultiplier);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function calculateFastModeAllowableChange(elapsedTime){
-const elapsedTimeInSeconds=elapsedTime/1000;
-const allowableChange=fastModeMultiplier*Math.exp(fastModeExponentiationCoefficient*elapsedTimeInSeconds)+fastModeConstant;
-return allowableChange;
-}
-
-
-
-
-
-
-function calculateFrameProgress(current,initial,target){
-let total=0;
-let match=0;
-
-const currentHist=current.getHistogram();
-const initialHist=initial.getHistogram();
-const targetHist=target.getHistogram();
-
-for(let channel=0;channel<3;channel++){
-for(let pixelVal=0;pixelVal<256;pixelVal++){
-const currentCount=currentHist[channel][pixelVal];
-const initialCount=initialHist[channel][pixelVal];
-const targetCount=targetHist[channel][pixelVal];
-
-const currentDiff=Math.abs(currentCount-initialCount);
-const targetDiff=Math.abs(targetCount-initialCount);
-
-match+=Math.min(currentDiff,targetDiff);
-total+=targetDiff;
-}
-}
-
-let progress;
-if(match===0&&total===0){
-progress=100;
-}else{
-progress=Math.floor(match/total*100);
-}
-return progress;
-}
-
-
-
-
-
-
-
-
-
-function calculateProgressBetweenFrames(frames,lowerBound,upperBound,isFastMode,getProgress,setProgress){
-if(!isFastMode){
-frames.forEach(frame=>setProgress(frame,getProgress(frame),false));
-return;
-}
-
-const lowerFrame=frames[lowerBound];
-const upperFrame=frames[upperBound];
-const elapsedTime=upperFrame.getTimeStamp()-lowerFrame.getTimeStamp();
-
-const lowerProgress=getProgress(lowerFrame);
-const upperProgress=getProgress(upperFrame);
-
-setProgress(lowerFrame,lowerProgress,false);
-setProgress(upperFrame,upperProgress,false);
-
-if(Math.abs(lowerProgress-upperProgress)<calculateFastModeAllowableChange(elapsedTime)){
-for(let i=lowerBound+1;i<upperBound;i++){
-setProgress(frames[i],lowerProgress,true);
-}
-}else if(upperBound-lowerBound>1){
-const midpoint=Math.floor((lowerBound+upperBound)/2);
-calculateProgressBetweenFrames(frames,lowerBound,midpoint,isFastMode,getProgress,setProgress);
-calculateProgressBetweenFrames(frames,midpoint,upperBound,isFastMode,getProgress,setProgress);
-}
-}
-
-
-
-
-
-function calculateVisualProgress(frames,opts){
-const initial=frames[0];
-const target=frames[frames.length-1];
-
-
-function getProgress(frame){
-if(typeof frame.getProgress()==='number'){
-return frame.getProgress();
-}
-
-return calculateFrameProgress(frame,initial,target);
-}
-
-
-
-
-
-
-function setProgress(frame,progress,isInterpolated){
-return frame.setProgress(progress,isInterpolated);
-}
-
-calculateProgressBetweenFrames(
-frames,
-0,
-frames.length-1,
-opts&&opts.fastMode,
-getProgress,
-setProgress);
-
-
-return frames;
-}
-
-
-
-
-
-
-function calculateFrameSimilarity(frame,target){
-const defaultImageConfig={
-
-
-channels:4};
-
-
-const frameData=Object.assign(frame.getParsedImage(),defaultImageConfig);
-const targetData=Object.assign(target.getParsedImage(),defaultImageConfig);
-
-const diff=imageSSIM.compare(frameData,targetData);
-return diff.ssim;
-}
-
-
-
-
-
-function calculatePerceptualProgress(frames,opts){
-const initial=frames[0];
-const target=frames[frames.length-1];
-const initialSimilarity=calculateFrameSimilarity(initial,target);
-
-
-function getProgress(frame){
-if(typeof frame.getPerceptualProgress()==='number'){
-return frame.getPerceptualProgress();
-}
-
-const ssim=calculateFrameSimilarity(frame,target);
-return Math.max(100*(ssim-initialSimilarity)/(1-initialSimilarity),0);
-}
-
-
-
-
-
-
-function setProgress(frame,progress,isInterpolated){
-return frame.setPerceptualProgress(progress,isInterpolated);
-}
-
-calculateProgressBetweenFrames(
-frames,
-0,
-frames.length-1,
-opts&&opts.fastMode,
-getProgress,
-setProgress);
-
-
-return frames;
-}
-
-
-
-
-
-
-function calculateSpeedIndexes(frames,data){
-const hasVisualProgress=typeof frames[0].getProgress()==='number';
-const hasPerceptualProgress=typeof frames[0].getPerceptualProgress()==='number';
-const progressToUse=hasVisualProgress?'getProgress':'getPerceptualProgress';
-const startTs=data.startTs;
-let visuallyCompleteTs;
-
-let firstPaintTs;
-
-
-for(let i=0;i<frames.length&&!firstPaintTs;i++){
-if(frames[i][progressToUse]()>0){
-firstPaintTs=frames[i].getTimeStamp();
-}
-}
-
-
-for(let i=0;i<frames.length&&!visuallyCompleteTs;i++){
-if(frames[i][progressToUse]()>=100){
-visuallyCompleteTs=frames[i].getTimeStamp();
-}
-}
-
-let prevFrameTs=frames[0].getTimeStamp();
-let prevProgress=frames[0].getProgress();
-let prevPerceptualProgress=frames[0].getPerceptualProgress();
-
-
-
-
-let speedIndex=firstPaintTs-startTs;
-
-let perceptualSpeedIndex=firstPaintTs-startTs;
-
-frames.forEach(function(frame){
-
-if(frame.getTimeStamp()>firstPaintTs){
-const elapsed=frame.getTimeStamp()-prevFrameTs;
-speedIndex+=elapsed*(1-prevProgress);
-perceptualSpeedIndex+=elapsed*(1-prevPerceptualProgress);
-}
-
-prevFrameTs=frame.getTimeStamp();
-prevProgress=frame.getProgress()/100;
-prevPerceptualProgress=frame.getPerceptualProgress()/100;
-});
-
-speedIndex=hasVisualProgress?speedIndex:undefined;
-perceptualSpeedIndex=hasPerceptualProgress?perceptualSpeedIndex:undefined;
-
-return{
-firstPaintTs,
-visuallyCompleteTs,
-speedIndex,
-perceptualSpeedIndex};
-
-}
-
-module.exports={
-calculateFastModeAllowableChange,
-calculateFrameSimilarity,
-calculateVisualProgress,
-calculatePerceptualProgress,
-calculateSpeedIndexes};
-
-
-},{"image-ssim":112}],183:[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-module.exports=Stream;
-
-var EE=require('events').EventEmitter;
-var inherits=require('inherits');
-
-inherits(Stream,EE);
-Stream.Readable=require('readable-stream/readable.js');
-Stream.Writable=require('readable-stream/writable.js');
-Stream.Duplex=require('readable-stream/duplex.js');
-Stream.Transform=require('readable-stream/transform.js');
-Stream.PassThrough=require('readable-stream/passthrough.js');
-
-
-Stream.Stream=Stream;
-
-
-
-
-
-
-function Stream(){
-EE.call(this);
-}
-
-Stream.prototype.pipe=function(dest,options){
-var source=this;
-
-function ondata(chunk){
-if(dest.writable){
-if(false===dest.write(chunk)&&source.pause){
-source.pause();
-}
-}
-}
-
-source.on('data',ondata);
-
-function ondrain(){
-if(source.readable&&source.resume){
-source.resume();
-}
-}
-
-dest.on('drain',ondrain);
-
-
-
-if(!dest._isStdio&&(!options||options.end!==false)){
-source.on('end',onend);
-source.on('close',onclose);
-}
-
-var didOnEnd=false;
-function onend(){
-if(didOnEnd)return;
-didOnEnd=true;
-
-dest.end();
-}
-
-
-function onclose(){
-if(didOnEnd)return;
-didOnEnd=true;
-
-if(typeof dest.destroy==='function')dest.destroy();
-}
-
-
-function onerror(er){
-cleanup();
-if(EE.listenerCount(this,'error')===0){
-throw er;
-}
-}
-
-source.on('error',onerror);
-dest.on('error',onerror);
-
-
-function cleanup(){
-source.removeListener('data',ondata);
-dest.removeListener('drain',ondrain);
-
-source.removeListener('end',onend);
-source.removeListener('close',onclose);
-
-source.removeListener('error',onerror);
-dest.removeListener('error',onerror);
-
-source.removeListener('end',cleanup);
-source.removeListener('close',cleanup);
-
-dest.removeListener('close',cleanup);
-}
-
-source.on('end',cleanup);
-source.on('close',cleanup);
-
-dest.on('close',cleanup);
-
-dest.emit('pipe',source);
-
-
-return dest;
-};
-
-},{"events":108,"inherits":113,"readable-stream/duplex.js":162,"readable-stream/passthrough.js":172,"readable-stream/readable.js":173,"readable-stream/transform.js":174,"readable-stream/writable.js":175}],184:[function(require,module,exports){
-module.exports=[{"name":"Google Analytics","company":"Google","homepage":"https://www.google.com/analytics/analytics/","categories":["analytics"],"domains":["*.google-analytics.com","*.urchin.com"],"examples":["www.google-analytics.com","ssl.google-analytics.com"]},{"name":"Facebook","homepage":"https://www.facebook.com","categories":["social"],"domains":["*.atlassbx.com","*.facebook.com","*.fbsbx.com","fbcdn-photos-e-a.akamaihd.net","*.facebook.net","*.fbcdn.net"],"examples":["www.facebook.com","connect.facebook.net","staticxx.facebook.com","static.xx.fbcdn.net","m.facebook.com","an.facebook.com","platform-lookaside.fbsbx.com"]},{"name":"Google CDN","company":"Google","homepage":"https://developers.google.com/speed/libraries/","categories":["cdn"],"domains":["ajax.googleapis.com","commondatastorage.googleapis.com","www.gstatic.com"]},{"name":"Google/Doubleclick Ads","company":"Google","homepage":"https://www.doubleclickbygoogle.com/","categories":["ad"],"domains":["adservice.google.com","adservice.google.com.au","adservice.google.com.sg","adservice.google.com.br","adservice.google.com.ua","adservice.google.co.uk","adservice.google.co.jp","adservice.google.co.in","adservice.google.co.kr","adservice.google.co.id","adservice.google.co.nz","adservice.google.ie","adservice.google.se","adservice.google.de","adservice.google.ca","adservice.google.be","adservice.google.es","adservice.google.ch","adservice.google.fr","adservice.google.nl","*.googleadservices.com","*.googlesyndication.com","*.googletagservices.com","*.2mdn.net","*.doubleclick.net"],"examples":["pagead2.googlesyndication.com","tpc.googlesyndication.com","ade.googlesyndication.com","googleads.g.doubleclick.net","googleads4.g.doubleclick.net","securepubads.g.doubleclick.net","pubads.g.doubleclick.net","static.doubleclick.net","cm.g.doubleclick.net","bid.g.doubleclick.net","s0.2mdn.net","stats.g.doubleclick.net","survey.g.doubleclick.net","fls.doubleclick.net","ad.doubleclick.net","www.googleadservices.com","https://www.googletagservices.com/tag/js/gpt.js"]},{"name":"Google Tag Manager","company":"Google","homepage":"https://marketingplatform.google.com/about/tag-manager/","categories":["tag-manager"],"domains":["*.googletagmanager.com"],"examples":["www.googletagmanager.com"]},{"name":"Other Google APIs/SDKs","company":"Google","homepage":"https://developers.google.com/apis-explorer/#p/","categories":["utility"],"domains":["accounts.google.com","apis.google.com","calendar.google.com","clients2.google.com","cse.google.com","news.google.com","pay.google.com","payments.google.com","play.google.com","smartlock.google.com","www.google.com","www.google.de","www.google.co.jp","www.google.com.au","www.google.co.uk","www.google.ie","www.google.com.sg","www.google.co.in","www.google.com.br","www.google.ca","www.google.co.kr","www.google.co.nz","www.google.co.id","www.google.fr","www.google.be","www.google.com.ua","www.google.nl","www.google.ru","www.google.se","imasdk.googleapis.com","storage.googleapis.com","translate.googleapis.com","lh3.googleusercontent.com","csi.gstatic.com"]},{"name":"YouTube","homepage":"https://youtube.com","categories":["video"],"domains":["*.ggpht.com","*.youtube-nocookie.com","*.youtube.com","*.ytimg.com"],"examples":["www.youtube.com","s.ytimg.com","yt3.ggpht.com","img.youtube.com","fcmatch.youtube.com"]},{"name":"Google Maps","company":"Google","homepage":"https://www.google.com/maps","categories":["utility"],"domains":["maps.google.com","maps-api-ssl.google.com","maps.googleapis.com","mts.googleapis.com","maps.gstatic.com"]},{"name":"Twitter","homepage":"https://twitter.com","categories":["social"],"domains":["*.vine.co","*.twimg.com","*.twitpic.com","platform.twitter.com","syndication.twitter.com"],"examples":["cdn.syndication.twimg.com","abs.twimg.com","pbs.twimg.com"]},{"name":"Yandex Metrica","company":"Yandex","homepage":"https://metrica.yandex.com/about?","categories":["analytics"],"domains":["d31j93rd8oukbv.cloudfront.net","mc.yandex.ru"]},{"name":"jQuery CDN","homepage":"https://code.jquery.com/","categories":["cdn"],"domains":["*.jquery.com"],"examples":["code.jquery.com"]},{"name":"Hotjar","homepage":"https://www.hotjar.com/","categories":["analytics"],"domains":["*.hotjar.com","*.hotjar.io"],"examples":["script.hotjar.com","static.hotjar.com","in.hotjar.com","vc.hotjar.io","vars.hotjar.com"]},{"name":"AddThis","homepage":"http://www.addthis.com/","categories":["social"],"domains":["*.addthis.com","*.addthiscdn.com","*.addthisedge.com"],"examples":["s7.addthis.com","r.dlx.addthis.com","su.addthis.com","x.dlx.addthis.com"]},{"name":"WordPress","company":"Automattic","homepage":"https://wp.com/","categories":["hosting"],"domains":["*.wordpress.com","s0.wp.com","s2.wp.com","*.w.org","c0.wp.com","s1.wp.com","widgets.wp.com"],"examples":["s.w.org"]},{"name":"Cloudflare CDN","homepage":"https://cdnjs.com/","categories":["cdn"],"domains":["amp.cloudflare.com","cdnjs.cloudflare.com"]},{"name":"Shopify","homepage":"https://www.shopify.com/","categories":["hosting"],"domains":["*.shopify.com","*.shopifyapps.com","*.shopifycdn.com"],"examples":["cdn.shopify.com","productreviews.shopifycdn.com"]},{"name":"ZenDesk","homepage":"https://zendesk.com/","categories":["customer-success"],"domains":["*.zdassets.com","*.zendesk.com","*.zopim.com"],"examples":["assets.zendesk.com","static.zdassets.com","v2.zopim.com"]},{"name":"Criteo","homepage":"https://www.criteo.com/","categories":["ad"],"domains":["*.criteo.com","*.emailretargeting.com","*.criteo.net"],"examples":["static.criteo.net","bidder.criteo.com","dis.criteo.com","gum.criteo.com","sslwidget.criteo.com","dis.us.criteo.com"]},{"name":"Pubmatic","homepage":"https://pubmatic.com/","categories":["ad"],"domains":["*.pubmatic.com"],"examples":["image6.pubmatic.com","ads.pubmatic.com","image2.pubmatic.com","simage2.pubmatic.com","image4.pubmatic.com","simage4.pubmatic.com","image5.pubmatic.com","hbopenbid.pubmatic.com"]},{"name":"Tawk.to","homepage":"https://www.tawk.to/","categories":["customer-success"],"domains":["*.tawk.to"],"examples":["embed.tawk.to"]},{"name":"AMP","homepage":"https://amp.dev/","categories":["content"],"domains":["*.ampproject.org"],"examples":["cdn.ampproject.org"]},{"name":"Wix","homepage":"https://www.wix.com/","categories":["hosting"],"domains":["*.parastorage.com","*.wix.com","*.wixstatic.com","*.wixapps.net"],"examples":["static.parastorage.com","static.wixstatic.com","www.wix.com","instagram.codev.wixapps.net"]},{"name":"Squarespace","homepage":"https://www.squarespace.com/","categories":["hosting"],"domains":["*.squarespace.com"],"examples":["static.squarespace.com","static1.squarespace.com"]},{"name":"Amazon Web Services","homepage":"https://aws.amazon.com/s3/","categories":["other"],"domains":["*.amazon.com","*.amazonaws.com","*.amazonwebapps.com","*.amazonwebservices.com","*.elasticbeanstalk.com","*.images-amazon.com","*.amazon.co.uk"],"examples":["s3.amazonaws.com","us-east-1.amazonaws.com","api-cdn.amazon.com","ecx.images-amazon.com","ws.amazon.co.uk"]},{"name":"ShareThis","homepage":"https://www.sharethis.com/","categories":["social"],"domains":["*.sharethis.com"],"examples":["w.sharethis.com","ws.sharethis.com","t.sharethis.com"]},{"name":"Vimeo","homepage":"http://vimeo.com/","categories":["video"],"domains":["*.vimeo.com","*.vimeocdn.com"],"examples":["f.vimeocdn.com","player.vimeo.com","i.vimeocdn.com"]},{"name":"JSDelivr CDN","homepage":"https://www.jsdelivr.com/","categories":["cdn"],"domains":["*.jsdelivr.net"],"examples":["cdn.jsdelivr.net"]},{"name":"Adobe Tag Manager","company":"Adobe","homepage":"https://www.adobe.com/experience-platform/","categories":["tag-manager"],"domains":["*.adobedtm.com","*.demdex.net","*.everesttech.net"],"examples":["assets.adobedtm.com","sync-tm.everesttech.net","cm.everesttech.net"]},{"name":"Jivochat","homepage":"https://www.jivochat.com/","categories":["customer-success"],"domains":["*.jivosite.com"],"examples":["cdn-ca.jivosite.com","code.jivosite.com"]},{"name":"PIXNET","homepage":"https://www.pixnet.net/","categories":["social"],"domains":["*.pixfs.net"],"examples":["front.pixfs.net","falcon-asset.pixfs.net","pixgame-asset.pixfs.net"]},{"name":"Yandex Share","company":"Yandex","homepage":"https://yastatic.net/share2/share.js","categories":["social"],"domains":["*.yastatic.net"]},{"name":"Scorecard Research","homepage":"https://www.scorecardresearch.com/","categories":["ad"],"domains":["*.scorecardresearch.com"],"examples":["sb.scorecardresearch.com","sa.scorecardresearch.com","b.scorecardresearch.com"]},{"name":"Rubicon Project","homepage":"https://rubiconproject.com/","categories":["ad"],"domains":["*.chango.com","*.fimserve.com","*.rubiconproject.com"],"examples":["pixel.rubiconproject.com","fastlane.rubiconproject.com","secure-assets.rubiconproject.com","eus.rubiconproject.com","pixel-us-east.rubiconproject.com","token.rubiconproject.com","ads.rubiconproject.com"]},{"name":"FontAwesome CDN","homepage":"https://fontawesome.com/","categories":["cdn"],"domains":["*.fontawesome.com"],"examples":["use.fontawesome.com"]},{"name":"Cloudflare","homepage":"https://www.cloudflare.com/website-optimization/","categories":["utility"],"domains":["ajax.cloudflare.com"]},{"name":"Blogger","homepage":"http://www.blogger.com/","categories":["hosting"],"domains":["*.blogblog.com","*.blogger.com","*.blogspot.com","images-blogger-opensocial.googleusercontent.com"],"examples":["1.bp.blogspot.com","www.blogger.com"]},{"name":"Salesforce","homepage":"https://www.salesforce.com/products/marketing-cloud/","categories":["analytics"],"domains":["*.krxd.net"],"examples":["cdn.krxd.net","beacon.krxd.net","consumer.krxd.net","usermatch.krxd.net"]},{"name":"Yandex Ads","company":"Yandex","homepage":"https://yandex.com/adv/","categories":["ad"],"domains":["an.yandex.ru"]},{"name":"Tynt","company":"33 Across","categories":["ad"],"domains":["*.tynt.com"]},{"name":"Yandex APIs","company":"Yandex","homepage":"https://yandex.ru/","categories":["utility"],"domains":["api-maps.yandex.ru","money.yandex.ru"]},{"name":"Micropat","categories":["social"],"domains":["*.addtoany.com"]},{"name":"Hubspot","homepage":"https://hubspot.com/","categories":["marketing"],"domains":["*.hs-scripts.com","*.hubspot.com","*.leadin.com","*.hs-analytics.net","*.hscollectedforms.net","*.hscta.net","*.hsforms.net","*.hsleadflows.net","*.hsstatic.net","*.hubspot.net"],"examples":["forms.hubspot.com","js.hsforms.net","js.hs-analytics.net","js.leadin.com"]},{"name":"Sumo","homepage":"https://sumo.com/","categories":["marketing"],"domains":["*.sumo.com","*.sumome.com","sumo.b-cdn.net"],"examples":["sumo.b-cdn.net","load.sumo.com","load.sumome.com"]},{"name":"Beeketing","homepage":"https://beeketing.com/","categories":["marketing"],"domains":["*.beeketing.com"],"examples":["sdk-cdn.beeketing.com","sdk.beeketing.com"]},{"name":"Mailchimp","homepage":"https://mailchimp.com/","categories":["marketing"],"domains":["*.chimpstatic.com","*.list-manage.com","*.mailchimp.com"],"examples":["downloads.mailchimp.com"]},{"name":"Media.net","homepage":"https://www.media.net/","categories":["ad"],"domains":["*.media.net","*.mnet-ad.net"],"examples":["contextual.media.net","cdnwest-xch.media.net","hbx.media.net","cs.media.net","hblg.media.net"]},{"name":"Skimbit","categories":["ad"],"domains":["*.redirectingat.com","*.skimresources.com","*.skimresources.net"]},{"name":"Moat","homepage":"https://moat.com/","categories":["ad"],"domains":["*.moatads.com","*.moatpixel.com"],"examples":["z.moatads.com","px.moatads.com","geo.moatads.com","sejs.moatads.com","mb.moatads.com","v4.moatads.com"]},{"name":"AppNexus","homepage":"https://www.appnexus.com/","categories":["ad"],"domains":["*.adnxs.com","*.ctasnet.com"],"examples":["acdn.adnxs.com","secure.adnxs.com","ib.adnxs.com","sharethrough.adnxs.com","cdn.adnxs.com","vcdn.adnxs.com"]},{"name":"VK","homepage":"https://vk.com/","categories":["social"],"domains":["*.vk.com"]},{"name":"LiveChat","homepage":"https://www.livechatinc.com/","categories":["customer-success"],"domains":["*.livechatinc.com"],"examples":["cdn.livechatinc.com","secure.livechatinc.com"]},{"name":"OneSignal","homepage":"https://onesignal.com/","categories":["utility"],"domains":["*.onesignal.com"],"examples":["cdn.onesignal.com","https://onesignal.com/api/v1/sync/"]},{"name":"WordAds","company":"Automattic","homepage":"https://wordads.co/","categories":["ad"],"domains":["*.pubmine.com"],"examples":["s.pubmine.com"]},{"name":"Integral Ad Science","homepage":"https://integralads.com/uk/","categories":["ad"],"domains":["*.adsafeprotected.com","*.iasds01.com"],"examples":["pixel.adsafeprotected.com","static.adsafeprotected.com","fw.adsafeprotected.com","cdn.adsafeprotected.com","dt.adsafeprotected.com"]},{"name":"Amazon Ads","homepage":"https://ad.amazon.com/","categories":["ad"],"domains":["*.amazon-adsystem.com"],"examples":["s.amazon-adsystem.com","c.amazon-adsystem.com","aax.amazon-adsystem.com","z-na.amazon-adsystem.com","fls-na.amazon-adsystem.com","aax-us-east.amazon-adsystem.com","ir-na.amazon-adsystem.com"]},{"name":"Yahoo!","homepage":"https://www.yahoo.com/","categories":["ad"],"domains":["*.bluelithium.com","*.hostingprod.com","*.lexity.com","*.yahoo.com","*.yahooapis.com","*.yimg.com","*.yimg.jp","*.zenfs.com","*.yahoo.net"],"examples":["ads.yahoo.com","analytics.yahoo.com","geo.yahoo.com","udc.yahoo.com","ganon.yahoo.com","ads.yap.yahoo.com"]},{"name":"Hatena Blog","homepage":"https://hatenablog.com/","categories":["hosting"],"domains":["*.st-hatena.com","*.hatena.ne.jp"],"examples":["cdn.blog.st-hatena.com","cdn.pool.st-hatena.com","cdn7.www.st-hatena.com","s.hatena.ne.jp","b.st-hatena.com"]},{"name":"Pinterest","homepage":"https://pinterest.com/","categories":["social"],"domains":["*.pinimg.com","*.pinterest.com"],"examples":["assets.pinterest.com","ct.pinterest.com","log.pinterest.com"]},{"name":"LinkedIn","homepage":"https://www.linkedin.com/","categories":["social"],"domains":["*.bizographics.com","platform.linkedin.com","*.slideshare.com","*.slidesharecdn.com"]},{"name":"Stripe","homepage":"https://stripe.com","categories":["utility"],"domains":["*.stripe.com","*.stripecdn.com","*.stripe.network"],"examples":["m.stripe.network","js.stripe.com"]},{"name":"Taboola","homepage":"https://www.taboola.com/","categories":["ad"],"domains":["*.taboola.com","*.taboolasyndication.com"],"examples":["cdn.taboola.com","trc.taboola.com","vidstat.taboola.com","images.taboola.com"]},{"name":"Weebly","homepage":"https://www.weebly.com/","categories":["hosting"],"domains":["*.editmysite.com"]},{"name":"Bing Ads","homepage":"https://bingads.microsoft.com","categories":["ad"],"domains":["*.bing.com","*.microsoft.com","*.msn.com","*.s-msft.com","*.s-msn.com","*.msads.net","*.msecnd.net","*.windows.net"],"examples":["bat.bing.com","c.bing.com","bat.r.msn.com","ajax.microsoft.com"]},{"name":"Intercom","homepage":"https://www.intercom.com","categories":["customer-success"],"domains":["*.intercomcdn.com","*.intercom.io"],"examples":["js.intercomcdn.com","api-iam.intercom.io","widget.intercom.io","nexus-websocket-a.intercom.io"]},{"name":"Crazy Egg","homepage":"https://www.crazyegg.com/","categories":["analytics"],"domains":["*.cetrk.com","*.crazyegg.com","*.hellobar.com","dnn506yrbagrg.cloudfront.net"]},{"name":"Amazon Pay","homepage":"https://pay.amazon.com","categories":["utility"],"domains":["payments.amazon.com","*.payments-amazon.com"]},{"name":"Histats","homepage":"http://histats.com/","categories":["analytics"],"domains":["*.histats.com"],"examples":["s10.histats.com"]},{"name":"Adform","categories":["ad"],"domains":["*.adform.net","*.adformdsp.net"]},{"name":"Datacamp","categories":["utility"],"domains":["*.cdn77.org"]},{"name":"Tealium","homepage":"https://tealium.com/","categories":["tag-manager"],"domains":["*.aniview.com","*.delvenetworks.com","*.limelight.com","*.tiqcdn.com","*.llnwd.net","*.tealiumiq.com"],"examples":["tags.tiqcdn.com","tealium.hs.llnwd.net","link.videoplatform.limelight.com","datacloud.tealiumiq.com"]},{"name":"Optimizely","homepage":"https://www.optimizely.com/","categories":["analytics"],"domains":["*.optimizely.com"],"examples":["cdn.optimizely.com","cdn-pci.optimizely.com","logx.optimizely.com","cdn3.optimizely.com"]},{"name":"Yotpo","homepage":"https://www.yotpo.com/","categories":["marketing"],"domains":["*.yotpo.com"]},{"name":"Trust Pilot","categories":["analytics"],"domains":["*.trustpilot.com"]},{"name":"Privy","categories":["ad"],"domains":["*.privy.com","*.privymktg.com"]},{"name":"Baidu Analytics","homepage":"https://tongji.baidu.com/web/welcome/login","categories":["analytics"],"domains":["*.baidu.com"],"examples":["hm.baidu.com"]},{"name":"Wistia","homepage":"https://wistia.com/","categories":["video"],"domains":["*.wistia.com","embedwistia-a.akamaihd.net","*.wistia.net"],"examples":["fast.wistia.com","fast.wistia.net","distillery.wistia.com","pipedream.wistia.com"]},{"name":"iubenda","categories":["utility"],"domains":["*.iubenda.com"],"examples":["www.iubenda.com"]},{"name":"Nielsen NetRatings SiteCensus","company":"The Nielsen Company","homepage":"http://www.nielsen-online.com/intlpage.html","categories":["analytics"],"domains":["*.imrworldwide.com"]},{"name":"BrightTag / Signal","company":"Signal","homepage":"https://www.signal.co","categories":["tag-manager"],"domains":["*.btstatic.com","*.thebrighttag.com"]},{"name":"mPulse","homepage":"https://developer.akamai.com/akamai-mpulse","categories":["analytics"],"domains":["*.akstat.io","*.go-mpulse.net","*.mpulse.net","*.mpstat.us"],"examples":["c.go-mpulse.net","0211c83c.akstat.io"]},{"name":"PayPal","homepage":"https://paypal.com","categories":["utility"],"domains":["*.paypal.com","*.paypalobjects.com"],"examples":["www.paypalobjects.com"]},{"name":"Sentry","homepage":"https://sentry.io/","categories":["utility"],"domains":["*.getsentry.com","*.ravenjs.com","*.sentry-cdn.com"],"examples":["cdn.ravenjs.com","browser.sentry-cdn.com"]},{"name":"Cookiebot","homepage":"https://www.cookiebot.com/","categories":["utility"],"domains":["*.cookiebot.com"],"examples":["consent.cookiebot.com"]},{"name":"Distil Networks","homepage":"https://www.distilnetworks.com/","categories":["utility"],"domains":["*.areyouahuman.com"],"examples":["n-cdn.areyouahuman.com"]},{"name":"Adobe TypeKit","company":"Adobe","homepage":"https://fonts.adobe.com/","categories":["cdn"],"domains":["*.typekit.com","*.typekit.net"],"examples":["use.typekit.net","p.typekit.net"]},{"name":"Kakao","categories":["social"],"domains":["*.daum.net","*.daumcdn.net"]},{"name":"Bold Commerce","categories":["utility"],"domains":["*.shappify-cdn.com","*.shappify.com","*.boldapps.net"]},{"name":"Akamai","homepage":"https://www.akamai.com/","categories":["cdn"],"domains":["23.62.3.183","*.akamaitechnologies.com","*.akamaitechnologies.fr","*.akamai.net","*.akamaiedge.net","*.akamaihd.net","*.akamaized.net","*.edgefcs.net","*.edgekey.net","edgesuite.net","*.srip.net"]},{"name":"Segment","homepage":"https://segment.com/","categories":["analytics"],"domains":["*.segment.com","*.segment.io"],"examples":["cdn.segment.com","api.segment.io"]},{"name":"District M","categories":["ad"],"domains":["*.districtm.io"]},{"name":"Bigcommerce","categories":["marketing"],"domains":["*.bigcommerce.com"]},{"name":"Dealer","homepage":"https://www.dealer.com/","categories":["hosting"],"domains":["*.dealer.com"],"examples":["static.dealer.com"]},{"name":"Klaviyo","categories":["ad"],"domains":["*.klaviyo.com"]},{"name":"Rambler","company":"Rambler & Co","categories":["utility"],"domains":["*.rambler.ru"]},{"name":"Tumblr","homepage":"https://tumblr.com/","categories":["social"],"domains":["*.tumblr.com"],"examples":["assets.tumblr.com","static.tumblr.com"]},{"name":"Snapchat","homepage":"https://www.snapchat.com","categories":["analytics"],"domains":["*.snapchat.com","*.sc-static.net"],"examples":["tr.snapchat.com"]},{"name":"VigLink","categories":["ad"],"domains":["*.viglink.com"]},{"name":"StatCounter","categories":["analytics"],"domains":["*.statcounter.com"]},{"name":"TrustArc","homepage":"https://www.trustarc.com/","categories":["utility"],"domains":["*.trustarc.com"],"examples":["choices.trustarc.com","consent.trustarc.com"]},{"name":"Tidio Live Chat","company":"Tidio","homepage":"https://www.tidiochat.com/en/","categories":["customer-success"],"domains":["*.tidiochat.com"]},{"name":"DoubleVerify","homepage":"https://www.doubleverify.com/","categories":["ad"],"domains":["*.doubleverify.com","*.dvtps.com","*.iqfp1.com"],"examples":["cdn.doubleverify.com","cdn3.doubleverify.com","tps.doubleverify.com","tps712.doubleverify.com","tps714.doubleverify.com","tps706.doubleverify.com","tps700.doubleverify.com","tps707.doubleverify.com","rtb2.doubleverify.com","rtb0.doubleverify.com","rtbcdn.doubleverify.com","tps11020.doubleverify.com","tm.iqfp1.com"]},{"name":"Instagram","homepage":"https://www.instagram.com","categories":["social"],"domains":["*.cdninstagram.com","*.instagram.com"],"examples":["scontent.cdninstagram.com"]},{"name":"OptinMonster","homepage":"https://optinmonster.com/","categories":["marketing"],"domains":["*.opmnstr.com","*.optmnstr.com","*.optmstr.com"],"examples":["a.optmstr.com","api.opmnstr.com","a.optmnstr.com"]},{"name":"Evidon","categories":["analytics"],"domains":["*.evidon.com"]},{"name":"Lucky Orange","homepage":"https://www.luckyorange.com/","categories":["analytics"],"domains":["*.luckyorange.com","d10lpsik1i8c69.cloudfront.net","*.luckyorange.net"]},{"name":"Gemius","categories":["ad"],"domains":["*.gemius.pl"]},{"name":"Olark","homepage":"https://www.olark.com/","categories":["customer-success"],"domains":["*.olark.com"],"examples":["static.olark.com"]},{"name":"CallRail","categories":["analytics"],"domains":["*.callrail.com"]},{"name":"Mixpanel","homepage":"https://mixpanel.com/","categories":["analytics"],"domains":["*.mixpanel.com","*.mxpnl.com"],"examples":["cdn.mxpnl.com"]},{"name":"OpenX","homepage":"https://www.openx.com/","categories":["ad"],"domains":["*.deliverimp.com","*.openxadexchange.com","*.servedbyopenx.com","*.jump-time.net","*.openx.net"],"examples":["uk-ads.openx.net","us-ads.openx.net","33across-d.openx.net","rtb.openx.net","us-u.openx.net","eu-u.openx.net","u.openx.net"]},{"name":"CreateJS CDN","homepage":"http://code.createjs.com/","categories":["cdn"],"domains":["*.createjs.com"],"examples":["code.createjs.com"]},{"name":"Chartbeat","categories":["analytics"],"domains":["*.chartbeat.com","*.chartbeat.net"]},{"name":"Sizmek","homepage":"https://www.sizmek.com/","categories":["ad"],"domains":["*.serving-sys.com","*.peer39.net"],"examples":["secure-ds.serving-sys.com","ds.serving-sys.com","bs.serving-sys.com"]},{"name":"FullStory","categories":["analytics"],"domains":["*.fullstory.com"],"examples":["rs.fullstory.com"]},{"name":"Snowplow","homepage":"https://snowplowanalytics.com/","categories":["analytics"],"domains":["d32hwlnfiv2gyn.cloudfront.net"]},{"name":"Brightcove","homepage":"https://www.brightcove.com/en/","categories":["video"],"domains":["*.brightcove.com","*.brightcove.net","*.zencdn.net"],"examples":["vjs.zencdn.net","players.brightcove.net"]},{"name":"GoDaddy","homepage":"https://www.godaddy.com/","categories":["utility"],"domains":["*.godaddy.com","*.wsimg.com"],"examples":["ocsp.godaddy.com","seal.godaddy.com"]},{"name":"Inspectlet","categories":["analytics"],"domains":["*.inspectlet.com"]},{"name":"Teads","categories":["ad"],"domains":["*.teads.tv"]},{"name":"New Relic","homepage":"https://newrelic.com/","categories":["utility"],"domains":["*.newrelic.com","*.nr-data.net"],"examples":["js-agent.newrelic.com","bam.nr-data.net"]},{"name":"Ensighten","homepage":"https://www.ensighten.com/","categories":["tag-manager"],"domains":["*.ensighten.com"],"examples":["nexus.ensighten.com"]},{"name":"Parking Crew","homepage":"http://parkingcrew.net/","categories":["other"],"domains":["d1lxhc4jvstzrp.cloudfront.net","*.parkingcrew.net"]},{"name":"Azure Web Services","company":"Microsoft","categories":["cdn"],"domains":["*.azurewebsites.net","*.azureedge.net","*.msedge.net"]},{"name":"BlueKai","company":"Oracle","categories":["ad"],"domains":["*.bkrtx.com","*.bluekai.com"]},{"name":"Treasure Data","categories":["analytics"],"domains":["*.treasuredata.com"]},{"name":"Drift","homepage":"https://www.drift.com/","categories":["marketing"],"domains":["*.drift.com","*.driftt.com"],"examples":["js.driftt.com","api.drift.com"]},{"name":"MGID","homepage":"https://www.mgid.com/","categories":["ad"],"domains":["*.mgid.com","*.dt07.net"],"examples":["servicer.mgid.com"]},{"name":"Microsoft Hosted Libs","company":"Microsoft","categories":["cdn"],"domains":["*.aspnetcdn.com"],"examples":["ajax.aspnetcdn.com"]},{"name":"33 Across","homepage":"https://33across.com/","categories":["ad"],"domains":["*.33across.com"],"examples":["sic.33across.com","cdn-sic.33across.com"]},{"name":"Monotype","categories":["cdn"],"domains":["*.fonts.com","*.fonts.net"]},{"name":"DTSCOUT","categories":["ad"],"domains":["*.dtscout.com"]},{"name":"WordPress Site Stats","company":"Automattic","homepage":"https://wp.com/","categories":["analytics"],"domains":["pixel.wp.com","stats.wp.com"]},{"name":"Mapbox","categories":["utility"],"domains":["*.mapbox.com"]},{"name":"MediaVine","homepage":"https://www.mediavine.com/","categories":["ad"],"domains":["*.mediavine.com"],"examples":["scripts.mediavine.com","video.mediavine.com"]},{"name":"Shareaholic","homepage":"https://www.shareaholic.com/","categories":["social"],"domains":["*.shareaholic.com","dsms0mj1bbhn4.cloudfront.net"]},{"name":"Dataxu","categories":["marketing"],"domains":["*.w55c.net"]},{"name":"MailMunch","categories":["ad"],"domains":["*.mailmunch.co"]},{"name":"Cxense","categories":["ad"],"domains":["*.cxense.com","*.cxpublic.com","*.emediate.dk","*.emediate.eu"]},{"name":"Marchex","categories":["analytics"],"domains":["*.voicestar.com","*.marchex.io"]},{"name":"Fastly","categories":["utility"],"domains":["*.fastly.net"]},{"name":"Unpkg","homepage":"https://unpkg.com","categories":["cdn"],"domains":["*.unpkg.com"]},{"name":"LivePerson","categories":["customer-success"],"homepage":"https://www.liveperson.com/","domains":["*.liveperson.com","*.look.io","*.liveperson.net","*.lpsnmedia.net"]},{"name":"SoundCloud","homepage":"https://www.soundcloud.com/","categories":["content"],"domains":["*.sndcdn.com","*.soundcloud.com","*.stratus.sc"],"examples":["widget.sndcdn.com"]},{"name":"VWO","homepage":"https://vwo.com","categories":["analytics"],"domains":["*.visualwebsiteoptimizer.com"],"examples":["dev.visualwebsiteoptimizer.com"]},{"name":"StickyADS.tv","categories":["ad"],"domains":["*.stickyadstv.com"]},{"name":"PushCrew","categories":["ad"],"domains":["*.pushcrew.com"]},{"name":"Embedly","categories":["content"],"domains":["*.embedly.com","*.embed.ly"]},{"name":"CDK Dealer Management","company":"CDK Global","homepage":"https://www.cdkglobal.com/us","categories":["hosting"],"domains":["*.assets-cdk.com"],"examples":["media-cf.assets-cdk.com"]},{"name":"Popads","homepage":"https://www.popads.net/","categories":["ad"],"domains":["*.popads.net"],"examples":["serve.popads.net","c1.popads.net"]},{"name":"FreakOut","categories":["ad"],"domains":["*.fout.jp"]},{"name":"SnapWidget","categories":["content"],"domains":["*.snapwidget.com"]},{"name":"Pure Chat","categories":["customer-success"],"domains":["*.purechat.com"]},{"name":"Outbrain","homepage":"https://www.outbrain.com/","categories":["ad"],"domains":["*.outbrain.com","*.outbrainimg.com","*.visualrevenue.com"]},{"name":"RD Station","homepage":"https://www.rdstation.com/en/","categories":["marketing"],"domains":["d335luupugsy2.cloudfront.net"]},{"name":"LiveJournal","categories":["social"],"domains":["*.livejournal.com","*.livejournal.net"]},{"name":"ContactAtOnce","homepage":"https://www.contactatonce.com/","categories":["customer-success"],"domains":["*.contactatonce.com"],"examples":["tag.contactatonce.com","agentpresence.contactatonce.com"]},{"name":"Ezoic","categories":["analytics"],"domains":["*.ezoic.net"]},{"name":"AB Tasty","categories":["analytics"],"domains":["*.abtasty.com","d1447tq2m68ekg.cloudfront.net"]},{"name":"Quantcast","homepage":"https://www.quantcast.com","categories":["analytics"],"domains":["*.brtstats.com","*.quantcount.com","*.quantserve.com","*.semantictec.com","*.ntv.io"],"examples":["pixel.quantserve.com","secure.quantserve.com","cms.quantserve.com","rules.quantcount.com"]},{"name":"DigiTrust","homepage":"http://www.digitru.st/","categories":["analytics"],"domains":["*.digitru.st"],"examples":["cdn.digitru.st"]},{"name":"LongTail Ad Solutions","categories":["ad"],"domains":["*.jwpcdn.com","*.jwplatform.com","*.jwplayer.com","*.jwpltx.com","*.jwpsrv.com","*.longtailvideo.com"]},{"name":"Parse.ly","categories":["analytics"],"domains":["*.parsely.com","d1z2jf7jlzjs58.cloudfront.net"]},{"name":"Index Exchange","company":"WPP","categories":["ad"],"domains":["*.casalemedia.com","*.indexww.com"]},{"name":"Clicktripz","categories":["content"],"domains":["*.clicktripz.com"],"examples":["static.clicktripz.com","www.clicktripz.com"]},{"name":"Ve","company":"Ve Interactive","categories":["marketing"],"domains":["*.veinteractive.com"]},{"name":"Adloox","categories":["ad"],"domains":["*.adlooxtracking.com"]},{"name":"GumGum","categories":["ad"],"domains":["*.gumgum.com"]},{"name":"Digital ad Consortium","categories":["ad"],"domains":["*.impact-ad.jp"]},{"name":"Amplitude Mobile Analytics","company":"Amplitude","categories":["analytics"],"domains":["*.amplitude.com","d24n15hnbwhuhn.cloudfront.net"]},{"name":"Adobe Business Catalyst","homepage":"https://www.businesscatalyst.com/","categories":["hosting"],"domains":["*.businesscatalyst.com"]},{"name":"LightWidget","categories":["utility"],"domains":["*.lightwidget.com"]},{"name":"Spotify","homepage":"https://www.spotify.com/","categories":["content"],"domains":["*.scdn.co","*.spotify.com"],"examples":["open.spotify.com","open.scdn.co","i.scdn.co"]},{"name":"SmartAdServer","categories":["ad"],"domains":["*.01net.com","*.sascdn.com"],"examples":["securite.01net.com"]},{"name":"Adroll","homepage":"https://www.adroll.com/","categories":["ad"],"domains":["*.adroll.com"],"examples":["d.adroll.com","s.adroll.com"]},{"name":"PureCars","homepage":"https://www.purecars.com/","categories":["marketing"],"domains":["*.purecars.com"],"examples":["cdn.purecars.com"]},{"name":"Keen","company":"Keen","homepage":"https://keen.io/","categories":["analytics"],"domains":["*.keen.io","d26b395fwzu5fz.cloudfront.net"]},{"name":"Infolinks","categories":["ad"],"domains":["*.infolinks.com"]},{"name":"Unbounce","categories":["ad"],"domains":["*.ubembed.com","*.unbounce.com","d2xxq4ijfwetlm.cloudfront.net","d9hhrg4mnvzow.cloudfront.net"]},{"name":"Roxr Software","categories":["analytics"],"domains":["*.getclicky.com"]},{"name":"OpenTable","company":"Priceline Group","categories":["content"],"domains":["*.opentable.com","*.opentable.co.uk","*.toptable.co.uk"],"examples":["www.toptable.co.uk"]},{"name":"uLogin","categories":["other"],"domains":["*.ulogin.ru"]},{"name":"Searchanise","categories":["analytics"],"domains":["*.searchanise.com"],"examples":["www.searchanise.com"]},{"name":"Gigya","categories":["analytics"],"domains":["*.gigya.com"]},{"name":"Net Reviews","categories":["analytics"],"domains":["*.avis-verifies.com"],"examples":["www.avis-verifies.com"]},{"name":"Booking.com","categories":["content"],"domains":["*.bstatic.com"]},{"name":"Disqus","homepage":"http://disqus.com/","categories":["social"],"domains":["*.disqus.com","*.disquscdn.com"],"examples":["c.disquscdn.com"]},{"name":"Tray Commerce","homepage":"https://www.tray.com.br/","categories":["marketing"],"domains":["*.tcdn.com.br"],"examples":["images.tcdn.com.br"]},{"name":"Crowd Control","company":"Lotame","categories":["ad"],"domains":["*.crwdcntrl.net"]},{"name":"Intent Media","homepage":"https://intent.com/","categories":["ad"],"domains":["*.intentmedia.net"]},{"name":"issuu","categories":["content"],"domains":["*.issuu.com","*.isu.pub"]},{"name":"Salesforce Commerce Cloud","homepage":"https://www.salesforce.com/products/commerce-cloud/overview/","categories":["hosting"],"domains":["*.cquotient.com","*.demandware.net","demandware.edgesuite.net"]},{"name":"sovrn","categories":["ad"],"domains":["*.lijit.com"]},{"name":"JuicyAds","categories":["ad"],"domains":["*.juicyads.com"]},{"name":"Sharethrough","categories":["ad"],"domains":["*.sharethrough.com"]},{"name":"Heap","categories":["analytics"],"domains":["*.heapanalytics.com"]},{"name":"LiveTex","categories":["customer-success"],"domains":["*.livetex.ru"]},{"name":"Nosto","categories":["analytics"],"domains":["*.nosto.com"]},{"name":"fluct","categories":["ad"],"domains":["*.adingo.jp"]},{"name":"Smart AdServer","categories":["ad"],"domains":["*.sasqos.com","*.smartadserver.com"]},{"name":"fam","company":"Fing Co Ltd.","homepage":"http://admin.fam-ad.com/report/","categories":["ad"],"domains":["*.fam-ad.com"],"examples":["img.fam-ad.com"]},{"name":"ExoClick","categories":["ad"],"domains":["*.exoclick.com"]},{"name":"BannerFlow","company":"Nordic Factory Solutions","categories":["ad"],"domains":["*.bannerflow.com"]},{"name":"iPerceptions","categories":["customer-success"],"domains":["*.iperceptions.com"]},{"name":"Albacross","homepage":"https://albacross.com/","categories":["marketing"],"domains":["*.albacross.com"],"examples":["serve.albacross.com"]},{"name":"RevJet","homepage":"https://www.revjet.com/","categories":["ad"],"domains":["*.revjet.com"],"examples":["pix.revjet.com","ads.revjet.com"]},{"name":"Trusted Shops","categories":["utility"],"domains":["*.trustedshops.com"]},{"name":"MaxCDN Enterprise","company":"MaxCDN","categories":["utility"],"domains":["*.netdna-cdn.com","*.netdna-ssl.com"]},{"name":"etracker","categories":["analytics"],"domains":["*.etracker.com","*.etracker.de"],"examples":["www.etracker.com"]},{"name":"Yandex CDN","company":"Yandex","homepage":"https://yandex.ru/","categories":["cdn"],"domains":["*.yandex.st"]},{"name":"LKQD","categories":["ad"],"domains":["*.lkqd.net"]},{"name":"Sift Science","categories":["utility"],"domains":["*.siftscience.com"]},{"name":"Help Scout","homepage":"https://www.helpscout.net/","categories":["customer-success"],"domains":["djtflbt20bdde.cloudfront.net","*.helpscout.net"],"examples":["beacon-v2.helpscout.net"]},{"name":"Seznam","categories":["utility"],"domains":["*.imedia.cz"]},{"name":"Vidible","categories":["ad"],"domains":["*.vidible.tv"]},{"name":"Media Math","homepage":"http://www.mediamath.com/","categories":["ad"],"domains":["*.mathads.com","*.mathtag.com"],"examples":["mathid.mathtag.com","sync.mathtag.com","pixel.mathtag.com"]},{"name":"Simplicity Marketing","categories":["ad"],"domains":["*.flashtalking.com"]},{"name":"Mouseflow","categories":["analytics"],"domains":["*.mouseflow.com"]},{"name":"Siteimprove","categories":["utility"],"domains":["*.siteimprove.com","*.siteimproveanalytics.com"]},{"name":"GetSiteControl","company":"GetWebCraft","categories":["utility"],"domains":["*.getsitecontrol.com"]},{"name":"AOL / Oath / Verizon Media","homepage":"https://www.oath.com/","categories":["ad"],"domains":["*.advertising.com","*.aol.com","*.aolcdn.com","*.blogsmithmedia.com","*.oath.com","*.aol.net","*.tacoda.net","*.aol.co.uk"],"examples":["pixel.advertising.com","dtm.advertising.com","tag.sp.advertising.com","service.sp.advertising.com","adtech.advertising.com","adaptv.advertising.com","mighty.aol.net","consent.cmp.oath.com"]},{"name":"Accuweather","categories":["content"],"domains":["*.accuweather.com"]},{"name":"Feefo.com","company":"Feefo","categories":["analytics"],"domains":["*.feefo.com"]},{"name":"Constant Contact","categories":["ad"],"domains":["*.ctctcdn.com"]},{"name":"Rakuten Marketing","company":"Rakuten","categories":["ad"],"domains":["*.rakuten-static.com","*.rmtag.com"]},{"name":"TrafficStars","categories":["ad"],"domains":["*.trafficstars.com","*.tsyndicate.com"]},{"name":"ForeSee","company":"Answers","categories":["analytics"],"domains":["*.4seeresults.com","*.answerscloud.com","*.foresee.com","*.foreseeresults.com"]},{"name":"Swiftype","categories":["utility"],"domains":["*.swiftype.com","*.swiftypecdn.com"]},{"name":"Bazaarvoice","categories":["analytics"],"domains":["*.bazaarvoice.com","*.feedmagnet.com"]},{"name":"SocialShopWave","categories":["social"],"domains":["*.socialshopwave.com"]},{"name":"Bootstrap CDN","homepage":"https://www.bootstrapcdn.com/","categories":["cdn"],"domains":["*.bootstrapcdn.com"],"examples":["maxcdn.bootstrapcdn.com","stackpath.bootstrapcdn.com"]},{"name":"SessionCam","company":"ServiceTick","categories":["analytics"],"domains":["*.sessioncam.com","d2oh4tlt9mrke9.cloudfront.net"]},{"name":"AppDynamics","homepage":"https://www.appdynamics.com/","categories":["utility"],"domains":["*.appdynamics.com","*.eum-appdynamics.com","d3tjaysgumg9lf.cloudfront.net"],"examples":["cdn.appdynamics.com"]},{"name":"Adyoulike","categories":["ad"],"domains":["*.adyoulike.com","*.omnitagjs.com","*.adyoulike.net"]},{"name":"Affirm","categories":["utility"],"domains":["*.affirm.com"]},{"name":"Sortable","categories":["ad"],"domains":["*.deployads.com"]},{"name":"Neodata","categories":["ad"],"domains":["*.neodatagroup.com"]},{"name":"Adnium","categories":["ad"],"domains":["*.adnium.com"]},{"name":"AdScore","homepage":"https://www.adscore.com/","categories":["ad"],"domains":["*.adsco.re"],"examples":["c.adsco.re"]},{"name":"Comm100","categories":["customer-success"],"domains":["*.comm100.com"]},{"name":"Medium","categories":["content"],"domains":["*.medium.com"]},{"name":"Esri ArcGIS","company":"Esri","categories":["utility"],"domains":["*.arcgis.com","*.arcgisonline.com"]},{"name":"iBillboard","categories":["ad"],"domains":["*.ibillboard.com"]},{"name":"Hotmart","homepage":"https://www.hotmart.com/","categories":["content"],"domains":["*.hotmart.com"],"examples":["launchermodule.hotmart.com"]},{"name":"Secomapp","categories":["utility"],"domains":["*.secomapp.com"]},{"name":"AdMatic","categories":["ad"],"domains":["*.admatic.com.tr"]},{"name":"Dailymotion","categories":["content"],"domains":["*.dailymotion.com","*.dmxleo.com","*.dm.gg","*.pxlad.io","*.dmcdn.net","*.sublimevideo.net"],"examples":["ad.pxlad.io","www.dailymotion.com"]},{"name":"Foursixty","categories":["customer-success"],"domains":["*.foursixty.com"]},{"name":"OptiMonk","categories":["ad"],"domains":["*.optimonk.com"]},{"name":"Refersion","categories":["ad"],"domains":["*.refersion.com"]},{"name":"Pardot","categories":["marketing"],"domains":["*.pardot.com"]},{"name":"GitHub","categories":["utility"],"domains":["*.rawgit.com"],"examples":["cdn.rawgit.com"]},{"name":"Alexa","homepage":"https://www.alexa.com/","categories":["analytics"],"domains":["*.alexametrics.com","d31qbv1cthcecs.cloudfront.net"],"examples":["certify.alexametrics.com"]},{"name":"Bugsnag","categories":["utility"],"domains":["*.bugsnag.com","d2wy8f7a9ursnm.cloudfront.net"],"examples":["notify.bugsnag.com"]},{"name":"ResponsiveVoice","categories":["other"],"domains":["*.responsivevoice.org"]},{"name":"ContentSquare","categories":["analytics"],"domains":["d1m6l9dfulcyw7.cloudfront.net","*.content-square.net","*.contentsquare.net"]},{"name":"BounceX","categories":["analytics"],"homepage":"https://www.bouncex.com/","domains":["*.bounceexchange.com","*.bouncex.net"],"examples":["events.bouncex.net"]},{"name":"Tencent","categories":["content"],"domains":["*.qq.com","*.ywxi.net"]},{"name":"TagCommander","categories":["tag-manager"],"domains":["*.commander1.com","*.tagcommander.com"]},{"name":"Between Digital","categories":["ad"],"domains":["*.betweendigital.com"]},{"name":"Tribal Fusion","company":"Exponential Interactive","categories":["ad"],"domains":["*.tribalfusion.com"]},{"name":"iovation","categories":["utility"],"domains":["*.iesnare.com"]},{"name":"Auto Link Maker","company":"Apple","categories":["ad"],"domains":["*.apple.com"],"examples":["autolinkmaker.itunes.apple.com"]},{"name":"SnapEngage","categories":["customer-success"],"domains":["*.snapengage.com"]},{"name":"iAdvize SAS","categories":["customer-success"],"domains":["*.iadvize.com"]},{"name":"Listrak","homepage":"https://www.listrak.com/","categories":["marketing"],"domains":["*.listrak.com","*.listrakbi.com"],"examples":["cdn.listrakbi.com","s1.listrakbi.com"]},{"name":"Branch Metrics","categories":["ad"],"domains":["*.branch.io","*.app.link"]},{"name":"Admixer for Publishers","company":"Admixer","categories":["ad"],"domains":["*.admixer.net"]},{"name":"Tail Target","company":"Tail","categories":["ad"],"domains":["*.tailtarget.com"]},{"name":"Clicktale","categories":["analytics"],"domains":["*.cdngc.net","*.clicktale.net"],"examples":["clicktalecdn.sslcs.cdngc.net"]},{"name":"Maxymiser","categories":["analytics"],"domains":["*.maxymiser.net"]},{"name":"Marketo","homepage":"https://www.marketo.com","categories":["analytics"],"domains":["*.marketo.com","*.mktoresp.com","*.marketo.net"],"examples":["munchkin.marketo.net"]},{"name":"Bizible","categories":["ad"],"domains":["*.bizible.com","*.bizibly.com"]},{"name":"LoyaltyLion","categories":["ad"],"domains":["*.loyaltylion.com","*.loyaltylion.net","dg1f2pfrgjxdq.cloudfront.net"]},{"name":"Convert Insights","categories":["analytics"],"domains":["*.convertexperiments.com"]},{"name":"Opentag","company":"Qubit","categories":["tag-manager"],"domains":["*.qutics.com","d3c3cq33003psk.cloudfront.net"],"examples":["opentag-stats.qutics.com"]},{"name":"Adverline Board","company":"Adverline","categories":["ad"],"domains":["*.adverline.com","*.adnext.fr"]},{"name":"Optanon","homepage":"https://www.cookielaw.org/","categories":["utility"],"domains":["*.onetrust.com","*.cookielaw.org"],"examples":["cdn.cookielaw.org","geolocation.onetrust.com"]},{"name":"Adocean","company":"Gemius","categories":["ad"],"domains":["*.adocean.pl"]},{"name":"Po.st","company":"RadiumOne","categories":["utility"],"domains":["*.po.st"]},{"name":"Yieldmo","categories":["ad"],"domains":["*.yieldmo.com"]},{"name":"Market GID","homepage":"https://www.marketgid.com/","categories":["ad"],"domains":["*.marketgid.com"],"examples":["jsc.marketgid.com"]},{"name":"TRUSTe","categories":["utility"],"domains":["*.truste.com"]},{"name":"One by AOL","company":"AOL","categories":["ad"],"domains":["*.adtechjp.com","*.adtech.de"]},{"name":"Affiliate Window","company":"Digital Window","categories":["ad"],"domains":["*.dwin1.com"]},{"name":"Pagely","categories":["other"],"domains":["*.optnmstr.com"]},{"name":"Perfect Market","categories":["ad"],"domains":["*.perfectmarket.com"]},{"name":"Symantec","categories":["utility"],"domains":["*.norton.com","*.symantec.com","*.symcb.com","*.symcd.com"],"examples":["extended-validation-ssl.websecurity.symantec.com"]},{"name":"piano","categories":["ad"],"domains":["*.npttech.com","*.tinypass.com"],"examples":["www.npttech.com"]},{"name":"Elastic Ad","categories":["ad"],"domains":["*.elasticad.net"]},{"name":"Freshdesk","homepage":"https://freshdesk.com/","categories":["customer-success"],"domains":["d36mpcpuzc4ztk.cloudfront.net"]},{"name":"IPONWEB","categories":["ad"],"domains":["*.company-target.com","*.liadm.com","*.iponweb.net","*.p161.net"],"examples":["pool.udsp.iponweb.net"]},{"name":"Ecwid","categories":["hosting"],"domains":["*.ecwid.com","*.shopsettings.com","d3fi9i0jj23cau.cloudfront.net","d3j0zfs7paavns.cloudfront.net"]},{"name":"Digioh","categories":["ad"],"domains":["*.lightboxcdn.com"]},{"name":"Fort Awesome","categories":["cdn"],"domains":["*.fortawesome.com"]},{"name":"Nend","categories":["ad"],"domains":["*.nend.net"]},{"name":"Bronto Software","categories":["marketing"],"domains":["*.bm23.com","*.bronto.com","*.brontops.com"]},{"name":"TrackJS","categories":["analytics"],"domains":["*.trackjs.com","d2zah9y47r7bi2.cloudfront.net"],"examples":["usage.trackjs.com"]},{"name":"Dynamic Yield","categories":["customer-success"],"domains":["*.dynamicyield.com"]},{"name":"Clerk.io ApS","categories":["analytics"],"domains":["*.clerk.io"]},{"name":"IBM Digital Analytics","company":"IBM","categories":["analytics"],"domains":["*.cmcore.com","coremetrics.com","data.coremetrics.com","data.de.coremetrics.com","libs.de.coremetrics.com","tmscdn.de.coremetrics.com","iocdn.coremetrics.com","libs.coremetrics.com","tmscdn.coremetrics.com","*.s81c.com","*.unica.com","*.coremetrics.eu"],"examples":["data.coremetrics.eu"]},{"name":"Usabilla","homepage":"https://usabilla.com","categories":["analytics"],"domains":["*.usabilla.com","d6tizftlrpuof.cloudfront.net"],"examples":["w.usabilla.com"]},{"name":"Meetrics","categories":["ad"],"domains":["*.de.com","*.meetrics.net","*.mxcdn.net"],"examples":["research.de.com"]},{"name":"Forensiq","categories":["utility"],"domains":["*.fqtag.com"]},{"name":"Revolver Maps","categories":["analytics"],"domains":["*.revolvermaps.com"]},{"name":"Monetate","categories":["analytics"],"domains":["*.monetate.net"]},{"name":"Fraudlogix","categories":["utility"],"domains":["*.yabidos.com"]},{"name":"Mather Economics","categories":["analytics"],"domains":["*.matheranalytics.com"]},{"name":"Blindado","categories":["utility"],"domains":["*.siteblindado.com"]},{"name":"UserReport","categories":["analytics"],"domains":["*.userreport.com"]},{"name":"OwnerIQ","categories":["ad"],"domains":["*.owneriq.net"]},{"name":"CPEx","categories":["content"],"domains":["*.cpex.cz"]},{"name":"eBay","categories":["ad"],"domains":["*.ebay.com","*.ebayimg.com","*.fetchback.com"]},{"name":"Skype","categories":["other"],"domains":["*.skype.com"]},{"name":"DialogTech","categories":["ad"],"domains":["*.dialogtech.com"]},{"name":"WebsiteBuilder.com","homepage":"https://www.websitebuilder.com","categories":["hosting"],"domains":["*.mywebsitebuilder.com"]},{"name":"iZooto","homepage":"https://www.izooto.com","categories":["marketing"],"domains":["*.izooto.com"],"examples":["cdn.izooto.com"]},{"name":"AddEvent","categories":["utility"],"domains":["*.addevent.com"],"examples":["www.addevent.com"]},{"name":"GetResponse","categories":["ad"],"domains":["*.getresponse.com"]},{"name":"Twitch","homepage":"https://twitch.tv/","categories":["video"],"domains":["*.twitch.tv"],"examples":["player.twitch.tv"]},{"name":"Radar","company":"Cedexis","homepage":"https://www.cedexis.com/radar/","categories":["analytics"],"domains":["*.cedexis-test.com","*.cedexis.com","*.cmdolb.com","cedexis.leasewebcdn.com","*.cedexis-radar.net","*.cedexis.net","cedexis-test01.insnw.net","cedexisakamaitest.azureedge.net","cedexispub.cdnetworks.net","cs600.wac.alphacdn.net","cs600.wpc.edgecastdns.net","global2.cmdolb.com","img-cedexis.mncdn.com","a-cedexis.msedge.net","zn3vgszfh.fastestcdn.net"],"examples":["radar.cedexis.com","rpt.cedexis.com","2-01-49cd-0002.cdx.cedexis.net","bench.cedexis-test.com"]},{"name":"Smart Insight Tracking","company":"Emarsys","categories":["analytics"],"domains":["*.scarabresearch.com"]},{"name":"Polar","homepage":"https://polar.me/","categories":["ad"],"domains":["*.polarmobile.ca","*.mediaeverywhere.com","*.mediavoice.com","*.plrsrvcs.com","*.polarcdn-engine.com","*.polarcdn-meraxes.com","*.polarcdn-pentos.com","*.polarcdn-static.com","*.polarcdn-terrax.com","*.polarcdn.com","*.polarmobile.com","*.poweredbypolar.com","*.mediaconductor.me","*.polaracademy.me"]},{"name":"AudienceSearch","company":"Intimate Merger","categories":["ad"],"domains":["*.im-apps.net"]},{"name":"Autopilot","categories":["ad"],"domains":["*.autopilothq.com"]},{"name":"Rackspace","categories":["hosting"],"domains":["*.rackcdn.com","*.rackspacecloud.com","*.raxcdn.com","*.websitetestlink.com"]},{"name":"PowerReviews","categories":["analytics"],"domains":["*.powerreviews.com"]},{"name":"Rocket Fuel","categories":["ad"],"domains":["*.rfihub.com","*.ru4.com","*.rfihub.net","*.ad1x.com"]},{"name":"Okas Concepts","categories":["utility"],"domains":["*.okasconcepts.com"]},{"name":"Madison Logic","categories":["marketing"],"domains":["*.ml314.com"]},{"name":"Celtra","categories":["ad"],"domains":["*.celtra.com"]},{"name":"Snacktools","categories":["ad"],"domains":["*.bannersnack.com"]},{"name":"ClickDesk","categories":["customer-success"],"domains":["*.clickdesk.com","d1gwclp1pmzk26.cloudfront.net"]},{"name":"F@N Communications","homepage":"https://www.fancs.com/","categories":["ad"],"domains":["*.ladsp.com"],"examples":["px.ladsp.com"]},{"name":"Tradelab","categories":["ad"],"domains":["*.tradelab.fr"]},{"name":"CleverDATA","categories":["ad"],"domains":["*.1dmp.io"]},{"name":"Media Management Technologies","categories":["ad"],"domains":["*.speedshiftmedia.com"]},{"name":"Wishpond Technologies","categories":["marketing"],"domains":["*.wishpond.com","*.wishpond.net"]},{"name":"Reviews.co.uk","categories":["analytics"],"domains":["*.reviews.co.uk"]},{"name":"Adobe Scene7","company":"Adobe Systems","categories":["content"],"domains":["wwwimages.adobe.com","*.scene7.com","*.everestads.net","*.everestjs.net"]},{"name":"Permutive","categories":["ad"],"domains":["*.permutive.com","d3alqb8vzo7fun.cloudfront.net"]},{"name":"plista","categories":["ad"],"domains":["*.plista.com"]},{"name":"Kampyle","categories":["analytics"],"domains":["*.kampyle.com"]},{"name":"LinkedIn Ads","categories":["ad"],"domains":["*.licdn.com","ads.linkedin.com","www.linkedin.com"],"examples":["snap.licdn.com"]},{"name":"Survicate","categories":["analytics"],"domains":["*.survicate.com"]},{"name":"Nativo","categories":["ad"],"domains":["*.postrelease.com"]},{"name":"Decibel Insight","categories":["analytics"],"domains":["*.decibelinsight.net"]},{"name":"Github","categories":["utility"],"domains":["*.github.com","*.githubusercontent.com","*.github.io"],"examples":["raw.githubusercontent.com"]},{"name":"WebEngage","categories":["customer-success"],"domains":["*.webengage.co","*.webengage.com","d23nd6ymopvz52.cloudfront.net","d3701cc9l7v9a6.cloudfront.net"]},{"name":"Geniee","categories":["ad"],"domains":["*.href.asia","*.genieessp.jp","*.genieesspv.jp","*.gssprt.jp"],"examples":["cs.gssprt.jp"]},{"name":"The Trade Desk","homepage":"https://www.thetradedesk.com/","categories":["ad"],"domains":["d1eoo1tco6rr5e.cloudfront.net","*.adsrvr.org"],"examples":["js.adsrvr.org","match.adsrvr.org","insight.adsrvr.org","usw-lax.adsrvr.org","data.adsrvr.org","snap.adsrvr.org"]},{"name":"Lytics","categories":["ad"],"domains":["*.lytics.io"]},{"name":"rewardStyle.com","categories":["ad"],"domains":["*.rewardstyle.com"]},{"name":"Kaltura Video Platform","company":"Kaltura","categories":["content"],"domains":["*.kaltura.com"],"examples":["cdnsecakmi.kaltura.com"]},{"name":"WisePops","categories":["utility"],"domains":["*.wisepops.com"]},{"name":"Picreel","categories":["analytics"],"domains":["*.pcrl.co","*.picreel.com"]},{"name":"Riskified","categories":["utility"],"domains":["*.riskified.com"]},{"name":"Supership","homepage":"https://supership.jp/","categories":["ad"],"domains":["*.socdm.com"]},{"name":"Google Plus","company":"Google","categories":["social"],"domains":["plus.google.com"]},{"name":"Yieldify","categories":["ad"],"domains":["*.yieldify.com","*.yieldifylabs.com","d33wq5gej88ld6.cloudfront.net","dwmvwp56lzq5t.cloudfront.net"],"examples":["geo.yieldifylabs.com"]},{"name":"Smarter Click","categories":["ad"],"domains":["*.smct.co","*.smarterclick.co.uk"]},{"name":"Evergage","categories":["analytics"],"domains":["*.evergage.com","*.evgnet.com"],"examples":["cdn.evgnet.com"]},{"name":"SaleCycle","categories":["ad"],"domains":["*.salecycle.com","d16fk4ms6rqz1v.cloudfront.net","d22j4fzzszoii2.cloudfront.net","d30ke5tqu2tkyx.cloudfront.net"]},{"name":"Zanox","categories":["ad"],"domains":["*.zanox.com","*.zanox.ws"]},{"name":"AddShoppers","categories":["social"],"domains":["*.addshoppers.com","d3rr3d0n31t48m.cloudfront.net","*.shop.pe"]},{"name":"Interpublic Group","categories":["ad"],"domains":["*.mbww.com"]},{"name":"Qualaroo","categories":["analytics"],"domains":["*.qualaroo.com"]},{"name":"BoldChat","company":"LogMeIn","categories":["customer-success"],"domains":["*.boldchat.com"]},{"name":"Effective Measure","categories":["ad"],"domains":["*.effectivemeasure.net"]},{"name":"LoopMe","categories":["ad"],"domains":["*.loopme.biz","*.loopme.com","*.vntsm.com","*.loopme.me"]},{"name":"Sooqr Search","company":"Sooqr","categories":["utility"],"domains":["*.sooqr.com"]},{"name":"smartclip","categories":["ad"],"domains":["*.smartclip.net"]},{"name":"Cloudinary","categories":["content"],"domains":["*.cloudinary.com"]},{"name":"Gleam","categories":["marketing"],"domains":["*.gleam.io"]},{"name":"Revcontent","categories":["content"],"domains":["*.revcontent.com"]},{"name":"Browsealoud","homepage":"https://www.texthelp.com/en-gb/products/browsealoud/","categories":["other"],"domains":["*.browsealoud.com","*.texthelp.com"],"examples":["www.browsealoud.com"]},{"name":"Ooyala","categories":["ad"],"domains":["*.ooyala.com"]},{"name":"Intercept Interactive","categories":["ad"],"domains":["*.undertone.com"]},{"name":"Appier","categories":["ad"],"domains":["*.appier.net"]},{"name":"SublimeSkinz","categories":["ad"],"domains":["*.ayads.co"]},{"name":"KISSmetrics","categories":["analytics"],"domains":["*.kissmetrics.com","doug1izaerwt3.cloudfront.net","dsyszv14g9ymi.cloudfront.net"]},{"name":"Pixlee","categories":["social"],"domains":["*.pixlee.com"]},{"name":"NetFlix","categories":["content"],"domains":["*.nflxext.com","*.nflximg.net"]},{"name":"Shopgate","categories":["utility"],"domains":["*.shopgate.com"]},{"name":"Highcharts","categories":["utility"],"domains":["*.highcharts.com"]},{"name":"Audience 360","company":"Datapoint Media","categories":["ad"],"domains":["*.dpmsrv.com"]},{"name":"Bootstrap Chinese network","categories":["cdn"],"domains":["*.bootcss.com"]},{"name":"Sparkflow","company":"Intercept Interactive","categories":["ad"],"domains":["*.sparkflow.net"]},{"name":"Flowplayer","categories":["content"],"domains":["*.flowplayer.org"]},{"name":"Fresh Relevance","categories":["analytics"],"domains":["*.freshrelevance.com","*.cloudfront.ne","d1y9qtn9cuc3xw.cloudfront.net","d81mfvml8p5ml.cloudfront.net","dkpklk99llpj0.cloudfront.net"],"examples":["d1y9qtn9cuc3xw.cloudfront.ne"]},{"name":"WebpageFX","categories":["ad"],"domains":["*.leadmanagerfx.com"]},{"name":"Simpli.fi","categories":["ad"],"domains":["*.simpli.fi"]},{"name":"Omniconvert","categories":["analytics"],"domains":["*.omniconvert.com","d2tgfbvjf3q6hn.cloudfront.net","d3vbj265bmdenw.cloudfront.net"]},{"name":"Adscale","categories":["ad"],"domains":["*.adscale.de"]},{"name":"Covert Pics","categories":["content"],"domains":["*.covet.pics"]},{"name":"Curalate","categories":["marketing"],"domains":["*.curalate.com","d116tqlcqfmz3v.cloudfront.net"]},{"name":"ReadSpeaker","homepage":"https://www.readspeaker.com","categories":["other"],"domains":["*.readspeaker.com"],"examples":["sf1-eu.readspeaker.com"]},{"name":"Stackla PTY","categories":["social"],"domains":["*.stackla.com"]},{"name":"SpotXchange","categories":["ad"],"domains":["*.spotxcdn.com","*.spotxchange.com","*.spotx.tv"]},{"name":"Qubit Deliver","company":"Qubit","categories":["analytics"],"domains":["d1m54pdnjzjnhe.cloudfront.net","d22rutvoghj3db.cloudfront.net","dd6zx4ibq538k.cloudfront.net"]},{"name":"Opta","company":"Perform Group","categories":["content"],"domains":["*.opta.net"]},{"name":"Unruly Media","categories":["ad"],"domains":["*.unrulymedia.com"]},{"name":"Quantum Metric","homepage":"https://www.quantummetric.com/","categories":["analytics"],"domains":["*.quantummetric.com"]},{"name":"Weborama","categories":["ad"],"domains":["*.weborama.com","*.weborama.fr"]},{"name":"Republer","categories":["ad"],"domains":["*.republer.com"],"examples":["sync.republer.com"]},{"name":"Vox Media","homepage":"https://www.voxmedia.com/","categories":["content"],"domains":["*.vox-cdn.com","*.voxmedia.com"],"examples":["cdn.vox-cdn.com"]},{"name":"FoxyCart","categories":["utility"],"domains":["*.foxycart.com"]},{"name":"Adition","homepage":"https://www.adition.com","categories":["ad"],"domains":["*.adition.com"],"examples":["dsp.adfarm1.adition.com"]},{"name":"LiveHelpNow","categories":["customer-success"],"domains":["*.livehelpnow.net"]},{"name":"DemandBase","categories":["marketing"],"domains":["*.demandbase.com"]},{"name":"Concert","homepage":"https://concert.io/","categories":["ad"],"domains":["*.concert.io"],"examples":["cdn.concert.io"]},{"name":"TINT","categories":["content"],"domains":["*.71n7.com","d33w9bm0n1egwm.cloudfront.net","d36hc0p18k1aoc.cloudfront.net","d3l7tj34e9fc43.cloudfront.net"],"examples":["www.71n7.com"]},{"name":"Arbor","company":"LiveRamp","categories":["other"],"domains":["*.pippio.com"]},{"name":"Vidyard","homepage":"https://www.vidyard.com/","categories":["utility"],"domains":["*.vidyard.com"]},{"name":"linkpulse","categories":["analytics"],"domains":["*.lp4.io"]},{"name":"Edge Web Fonts","company":"Adobe Systems","categories":["cdn"],"domains":["*.edgefonts.net"],"examples":["use.edgefonts.net"]},{"name":"ShopiMind","company":"ShopIMind","categories":["ad"],"domains":["*.shopimind.com"]},{"name":"Feedbackify","company":"InsideMetrics","categories":["analytics"],"domains":["*.feedbackify.com"]},{"name":"Sidecar","categories":["other"],"domains":["*.getsidecar.com","d3v27wwd40f0xu.cloudfront.net"]},{"name":"SearchSpring","categories":["utility"],"domains":["*.searchspring.net"]},{"name":"DMD Marketing","homepage":"https://www.dmdconnects.com/","categories":["ad"],"domains":["*.medtargetsystem.com"]},{"name":"C3 Metrics","categories":["analytics"],"domains":["*.c3tag.com"]},{"name":"FirstImpression","categories":["ad"],"domains":["*.firstimpression.io"]},{"name":"GetIntent RTBSuite","company":"GetIntent","categories":["ad"],"domains":["*.adhigh.net"]},{"name":"unpkg","categories":["utility"],"domains":["*.npmcdn.com"]},{"name":"PerimeterX Bot Defender","company":"PerimeterX","categories":["utility"],"domains":["*.perimeterx.net","*.pxi.pub"]},{"name":"JustPremium Ads","company":"JustPremium","categories":["ad"],"domains":["*.justpremium.com"]},{"name":"Talkable","categories":["ad"],"domains":["*.talkable.com","d2jjzw81hqbuqv.cloudfront.net"],"examples":["www.talkable.com"]},{"name":"Steelhouse","categories":["ad"],"domains":["*.steelhousemedia.com"]},{"name":"Adtech (AOL)","categories":["ad"],"domains":["*.adtechus.com"]},{"name":"Technorati","company":"Synacor","categories":["ad"],"domains":["*.technoratimedia.com"]},{"name":"Drip","company":"The Numa Group","categories":["ad"],"domains":["*.getdrip.com"]},{"name":"VoiceFive","categories":["analytics"],"domains":["*.voicefive.com"]},{"name":"Adkontekst","categories":["ad"],"domains":["*.adkontekst.pl"]},{"name":"Cedato","categories":["ad"],"domains":["*.algovid.com","*.vdoserv.com"]},{"name":"TripAdvisor","categories":["content"],"domains":["*.jscache.com","*.tacdn.com","*.tamgrt.com","*.tripadvisor.com","*.viator.com","*.tripadvisor.co.uk"],"examples":["www.jscache.com","www.tamgrt.com"]},{"name":"Typepad","categories":["hosting"],"domains":["*.typepad.com"]},{"name":"Silverpop","company":"IBM","categories":["ad"],"domains":["*.mkt912.com","*.mkt922.com","*.mkt932.com","*.mkt941.com","*.mkt51.net","*.mkt61.net","*.pages01.net","*.pages02.net","*.pages03.net","*.pages04.net","*.pages05.net"]},{"name":"Attentive","homepage":"https://attentivemobile.com/","categories":["ad"],"domains":["*.attn.tv","*.attentivemobile.com"]},{"name":"Salesforce.com","categories":["ad"],"domains":["*.force.com","*.salesforce.com"],"examples":["secure.force.com"]},{"name":"WebSpectator","categories":["ad"],"domains":["*.webspectator.com"]},{"name":"Kaizen Platform","categories":["analytics"],"domains":["*.kaizenplatform.net"],"examples":["cdn.kaizenplatform.net","log-v4.kaizenplatform.net"]},{"name":"Global-e","categories":["hosting"],"domains":["*.global-e.com"]},{"name":"TruConversion","categories":["analytics"],"domains":["*.truconversion.com"]},{"name":"White Ops","categories":["utility"],"domains":["*.acexedge.com","*.tagsrvcs.com"]},{"name":"Accordant Media","categories":["ad"],"domains":["*.a3cloud.net"],"examples":["segment.a3cloud.net"]},{"name":"Keywee","categories":["ad"],"domains":["*.keywee.co"]},{"name":"Hupso Website Analyzer","company":"Hupso","categories":["analytics"],"domains":["*.hupso.com"]},{"name":"ThreatMetrix","categories":["utility"],"domains":["*.online-metrix.net"]},{"name":"eXelate","categories":["ad"],"domains":["*.exelator.com"]},{"name":"Delta Projects AB","categories":["ad"],"domains":["*.de17a.com"]},{"name":"Profitshare","categories":["ad"],"domains":["*.profitshare.ro"]},{"name":"TubeMogul","categories":["ad"],"domains":["*.tubemogul.com"]},{"name":"Ipify","homepage":"https://www.ipify.org","categories":["utility"],"domains":["*.ipify.org"],"examples":["api.ipify.org","geo.ipify.org"]},{"name":"Marketplace Web Service","company":"Amazon","categories":["other"],"domains":["*.ssl-images-amazon.com"]},{"name":"Key CDN","categories":["utility"],"domains":["*.kxcdn.com"]},{"name":"The ADEX","categories":["ad"],"domains":["*.theadex.com"]},{"name":"ZEDO","categories":["ad"],"domains":["*.zedo.com"]},{"name":"Sajari Pty","categories":["utility"],"domains":["*.sajari.com"]},{"name":"The Hut Group","categories":["content"],"domains":["*.thcdn.com"]},{"name":"Signyfyd","categories":["utility"],"domains":["*.signifyd.com"]},{"name":"Apester","categories":["analytics"],"domains":["*.apester.com","*.qmerce.com"]},{"name":"mParticle","homepage":"https://www.mparticle.com/","categories":["utility"],"domains":["*.mparticle.com"],"examples":["jssdks.mparticle.com","identity.mparticle.com"]},{"name":"AdSniper","categories":["ad"],"domains":["*.adsniper.ru","*.sniperlog.ru"]},{"name":"Time","categories":["content"],"domains":["*.timeinc.net"]},{"name":"SurveyMonkey","categories":["analytics"],"domains":["*.surveymonkey.com"]},{"name":"GIPHY","categories":["content"],"domains":["*.giphy.com"]},{"name":"Socialphotos","categories":["social"],"domains":["*.slpht.com"]},{"name":"Livefyre","categories":["content"],"domains":["*.fyre.co","*.livefyre.com"]},{"name":"Civic","categories":["hosting"],"domains":["*.civiccomputing.com"]},{"name":"Auth0","homepage":"https://auth0.com/","categories":["utility"],"domains":["*.auth0.com"],"examples":["cdn.auth0.com"]},{"name":"Flickr","categories":["content"],"domains":["*.flickr.com","*.staticflickr.com"]},{"name":"Reevoo","categories":["analytics"],"domains":["*.reevoo.com"]},{"name":"Sirv","categories":["other"],"domains":["*.sirv.com"]},{"name":"Underdog Media","categories":["ad"],"domains":["*.underdog.media","*.udmserve.net"]},{"name":"Petametrics","categories":["analytics"],"domains":["*.petametrics.com"]},{"name":"Sweet Tooth","categories":["ad"],"domains":["*.sweettooth.io"]},{"name":"Hola Networks","categories":["other"],"domains":["*.h-cdn.com"]},{"name":"Verizon Digital Media CDN","homepage":"https://www.verizondigitalmedia.com/","categories":["cdn"],"domains":["*.edgecastcdn.net","*.edgecastdns.net"]},{"name":"Zarget","categories":["analytics"],"domains":["*.zarget.com"]},{"name":"ResponseTap","categories":["analytics"],"domains":["*.adinsight.com","*.responsetap.com"]},{"name":"ReTargeter","categories":["ad"],"domains":["*.retargeter.com"]},{"name":"Yottaa","categories":["hosting"],"domains":["*.yottaa.com","*.yottaa.net"]},{"name":"Connatix","categories":["ad"],"domains":["*.connatix.com"]},{"name":"Klevu Search","company":"Klevu","categories":["utility"],"domains":["*.klevu.com"]},{"name":"Best Of Media S.A.","categories":["content"],"domains":["*.servebom.com"]},{"name":"AdTrue","company":"FPT AdTrue","categories":["ad"],"domains":["*.adtrue.com"]},{"name":"Customer.io","categories":["ad"],"domains":["*.customer.io"]},{"name":"Advance Magazine Group","categories":["content"],"domains":["*.condenastdigital.com","*.condenet.com","*.condenast.co.uk"]},{"name":"StreamRail","categories":["ad"],"domains":["*.streamrail.com","*.streamrail.net"]},{"name":"Opinion Stage","categories":["analytics"],"domains":["*.opinionstage.com"],"examples":["www.opinionstage.com"]},{"name":"CleverTap","categories":["analytics"],"domains":["d2r1yp2w7bby2u.cloudfront.net"]},{"name":"Fanplayr","categories":["analytics"],"domains":["*.fanplayr.com","d38nbbai6u794i.cloudfront.net"]},{"name":"Calendly","categories":["other"],"domains":["*.calendly.com"]},{"name":"Adobe Test & Target","company":"Adobe Systems","categories":["analytics"],"domains":["*.omtrdc.net"],"examples":["tt.omtrdc.net"]},{"name":"Navegg","categories":["ad"],"domains":["*.navdmp.com"]},{"name":"Sekindo","categories":["content"],"domains":["*.sekindo.com"]},{"name":"Conversio","categories":["ad"],"domains":["*.conversio.com"]},{"name":"CyberSource (Visa)","categories":["utility"],"domains":["*.authorize.net"]},{"name":"Pixalate","categories":["utility"],"domains":["*.adrta.com"]},{"name":"Reviews.io","categories":["analytics"],"domains":["*.reviews.io"]},{"name":"NetAffiliation","company":"Kwanco","categories":["ad"],"domains":["*.metaffiliation.com"]},{"name":"FuelX","categories":["ad"],"domains":["*.fuelx.com"]},{"name":"Touch Commerce","categories":["customer-success"],"domains":["*.inq.com","*.touchcommerce.com"]},{"name":"TripleLift","categories":["ad"],"domains":["*.3lift.com"]},{"name":"Ambassador","categories":["ad"],"domains":["*.getambassador.com"]},{"name":"epoq internet services","categories":["analytics"],"domains":["*.epoq.de"]},{"name":"Woopra","categories":["analytics"],"domains":["*.woopra.com"]},{"name":"Playbuzz","categories":["hosting"],"domains":["*.playbuzz.com"]},{"name":"Exponential Interactive","categories":["ad"],"domains":["*.exponential.com"]},{"name":"JustUno","categories":["ad"],"domains":["*.justuno.com"]},{"name":"Widespace","homepage":"https://www.widespace.com","categories":["ad"],"domains":["*.widespace.com"],"examples":["sync.widespace.com"]},{"name":"VisScore","categories":["analytics"],"domains":["*.visscore.com","d2hkbi3gan6yg6.cloudfront.net"]},{"name":"AWeber","categories":["ad"],"domains":["*.aweber.com"]},{"name":"AvantLink","categories":["ad"],"domains":["*.avmws.com"]},{"name":"Conversant Tag Manager","company":"Conversant","categories":["tag-manager"],"domains":["*.mplxtms.com"]},{"name":"Postcode Anywhere (Holdings)","categories":["utility"],"domains":["*.postcodeanywhere.co.uk"]},{"name":"Conversant","categories":["analytics"],"domains":["*.dotomi.com","*.dtmpub.com","*.emjcd.com","mediaplex.com","*.tqlkg.com","*.fastclick.net"],"examples":["www.tqlkg.com"]},{"name":"FLXone","company":"Teradata","categories":["ad"],"domains":["*.pangolin.blue","*.flx1.com","d2hlpp31teaww3.cloudfront.net"]},{"name":"Infinity Tracking","categories":["analytics"],"domains":["*.infinity-tracking.net"]},{"name":"reEmbed","categories":["other"],"domains":["*.reembed.com"]},{"name":"Kameleoon","categories":["analytics"],"domains":["*.kameleoon.com"]},{"name":"Impact Radius","categories":["ad"],"domains":["*.impactradius-event.com","*.impactradius-go.com","*.7eer.net","d3cxv97fi8q177.cloudfront.net","*.evyy.net","*.ojrq.net"],"examples":["a.impactradius-go.com","microsoft-uk.evyy.net"]},{"name":"Heroku","categories":["other"],"domains":["*.herokuapp.com"]},{"name":"AdsWizz","categories":["ad"],"domains":["*.adswizz.com"]},{"name":"MaxMind","categories":["utility"],"domains":["*.maxmind.com"]},{"name":"Pusher","homepage":"https://pusher.com/","categories":["utility"],"domains":["*.pusher.com","*.pusherapp.com"],"examples":["stats.pusher.com"]},{"name":"Admitad","categories":["ad"],"domains":["*.lenmit.com"]},{"name":"AdsNative","categories":["ad"],"domains":["*.adsnative.com"]},{"name":"Viacom","categories":["content"],"domains":["*.mtvnservices.com"]},{"name":"Cookie-Script.com","categories":["utility"],"domains":["*.cookie-script.com"]},{"name":"MonetizeMore","categories":["ad"],"domains":["*.m2.ai"]},{"name":"Mediahawk","categories":["analytics"],"domains":["*.mediahawk.co.uk"]},{"name":"GoSquared","homepage":"https://www.gosquared.com","categories":["analytics"],"domains":["*.gosquared.com","d1l6p2sc9645hc.cloudfront.net"],"examples":["data.gosquared.com","data2.gosquared.com"]},{"name":"Datonics","categories":["ad"],"domains":["*.pro-market.net"],"examples":["pbid.pro-market.net"]},{"name":"Adobe Marketing Cloud","company":"Adobe Systems","categories":["ad"],"domains":["*.adobetag.com"]},{"name":"News","categories":["social"],"domains":["*.news.com.au","*.newsanalytics.com.au","*.newsapi.com.au","*.newscdn.com.au","*.newsdata.com.au","*.newsdiscover.com.au","*.news-static.com"]},{"name":"Experian Cross-Channel Marketing Platform","company":"Experian","categories":["marketing"],"domains":["*.eccmp.com","*.ccmp.eu"]},{"name":"SkyScanner","categories":["content"],"domains":["*.skyscanner.net"],"examples":["api.skyscanner.net"]},{"name":"Vibrant Media","categories":["ad"],"domains":["*.intellitxt.com","*.picadmedia.com"]},{"name":"Mobify","categories":["utility"],"domains":["*.mobify.com","*.mobify.net"]},{"name":"Bookatable","categories":["content"],"domains":["*.bookatable.com","*.livebookings.com"]},{"name":"SecuredVisit","company":"4Cite Marketing","categories":["ad"],"domains":["*.securedvisit.com"]},{"name":"[24]7","categories":["customer-success"],"domains":["*.247-inc.net","*.247inc.net","d1af033869koo7.cloudfront.net"]},{"name":"Transifex","categories":["utility"],"domains":["*.transifex.com"]},{"name":"Tagboard","categories":["social"],"domains":["*.tagboard.com"]},{"name":"Council ad Network","categories":["ad"],"domains":["*.counciladvertising.net"]},{"name":"WalkMe","categories":["customer-success"],"domains":["*.walkme.com"]},{"name":"Betgenius","company":"Genius Sports","categories":["content"],"domains":["*.connextra.com"]},{"name":"Exactag","categories":["ad"],"domains":["*.exactag.com"]},{"name":"Knight Lab","company":"Northwestern University","categories":["utility"],"domains":["*.knightlab.com"]},{"name":"Reflektion","categories":["analytics"],"domains":["*.reflektion.com","d26opx5dl8t69i.cloudfront.net"]},{"name":"Expedia","categories":["content"],"domains":["*.travel-assets.com","*.trvl-media.com","*.trvl-px.com","*.uciservice.com"],"examples":["www.trvl-px.com","www.uciservice.com"]},{"name":"Performio","categories":["ad"],"domains":["*.performax.cz"],"examples":["ut.performax.cz"]},{"name":"Janrain","categories":["analytics"],"domains":["*.janrain.com","*.janrainbackplane.com","*.rpxnow.com","d3hmp0045zy3cs.cloudfront.net"]},{"name":"Resonance Insights","categories":["analytics"],"domains":["*.res-x.com"]},{"name":"cloudIQ","categories":["analytics"],"domains":["*.cloud-iq.com"]},{"name":"Snack Media","categories":["content"],"domains":["*.snack-media.com"]},{"name":"Ekm Systems","categories":["analytics"],"domains":["*.ekmsecure.com","*.ekmpinpoint.co.uk"],"examples":["globalstats.ekmsecure.com"]},{"name":"Wow Analytics","categories":["analytics"],"domains":["*.wowanalytics.co.uk"]},{"name":"AdvertServe","categories":["ad"],"domains":["*.advertserve.com"]},{"name":"Pingdom RUM","homepage":"https://www.pingdom.com/product/performance-monitoring/","categories":["analytics"],"domains":["*.pingdom.net"],"examples":["rum-static.pingdom.net","rum-collector-2.pingdom.net"]},{"name":"DialogTech SourceTrak","company":"DialogTech","categories":["ad"],"domains":["d31y97ze264gaa.cloudfront.net"]},{"name":"bRealTime","categories":["ad"],"domains":["*.brealtime.com"]},{"name":"Tag Inspector","company":"InfoTrust","categories":["analytics"],"domains":["d22xmn10vbouk4.cloudfront.net"]},{"name":"Zmags","categories":["marketing"],"domains":["*.zmags.com"]},{"name":"LeasdBoxer","company":"LeadBoxer","categories":["ad"],"domains":["*.leadboxer.com"]},{"name":"Friendbuy","categories":["ad"],"domains":["*.friendbuy.com","djnf6e5yyirys.cloudfront.net"]},{"name":"Acceptable Ads","homepage":"https://acceptableads.com/","categories":["ad"],"domains":["*.aaxads.com","*.aaxdetect.com"]},{"name":"Onet","categories":["ad"],"domains":["*.onet.pl"]},{"name":"Netlify","homepage":"https://www.netlify.com/","categories":["utility"],"domains":["*.netlify.com","*.netlifyusercontent.com"],"examples":["cloud.netlifyusercontent.com"]},{"name":"Twitter Online Conversion Tracking","company":"Twitter","categories":["ad"],"domains":["*.ads-twitter.com","analytics.twitter.com"],"examples":["static.ads-twitter.com"]},{"name":"AdRiver","categories":["ad"],"domains":["*.adriver.ru"]},{"name":"Proper Media","categories":["content"],"domains":["*.proper.io"]},{"name":"Storygize","categories":["ad"],"domains":["*.storygize.net"],"examples":["www.storygize.net"]},{"name":"Oracle Recommendations On Demand","company":"Oracle","categories":["analytics"],"domains":["*.atgsvcs.com"]},{"name":"Raygun","categories":["utility"],"domains":["*.raygun.io"]},{"name":"Rakuten LinkShare","company":"Rakuten","categories":["ad"],"domains":["*.linksynergy.com"]},{"name":"BlueCava","categories":["ad"],"domains":["*.bluecava.com"]},{"name":"Hull.js","categories":["utility"],"domains":["*.hull.io","*.hullapp.io"]},{"name":"PERFORM","categories":["content"],"domains":["*.performgroup.com"]},{"name":"Moxie","homepage":"https://www.gomoxie.com/","categories":["utility"],"domains":["*.gomoxie.solutions"]},{"name":"Vee24","categories":["customer-success"],"domains":["*.vee24.com"]},{"name":"Aggregate Knowledge","company":"Neustar","categories":["ad"],"domains":["*.agkn.com"]},{"name":"Cookie Reports","categories":["utility"],"domains":["*.cookiereports.com"]},{"name":"PlayAd Media Group","categories":["ad"],"domains":["*.youplay.se"]},{"name":"Exponea","categories":["analytics"],"domains":["*.exponea.com"]},{"name":"AIR.TV","categories":["ad"],"domains":["*.air.tv"]},{"name":"SlimCut Media Outstream","company":"SlimCut Media","categories":["ad"],"domains":["*.freeskreen.com"]},{"name":"Mopinion","categories":["analytics"],"domains":["*.mopinion.com"]},{"name":"Dynamic Converter","categories":["utility"],"domains":["*.dynamicconverter.com"]},{"name":"Remintrex","company":"SmartUp Venture","categories":["ad"],"domains":["*.remintrex.com"]},{"name":"Attribution","categories":["ad"],"domains":["*.attributionapp.com"]},{"name":"Browser-Update.org","categories":["other"],"domains":["*.browser-update.org"]},{"name":"Sailthru","categories":["analytics"],"domains":["*.sail-horizon.com","*.sail-personalize.com","*.sail-track.com"]},{"name":"AnswerDash","categories":["customer-success"],"domains":["*.answerdash.com"],"examples":["p1.answerdash.com"]},{"name":"Ziff Davis Tech","categories":["ad"],"domains":["*.adziff.com","*.zdbb.net"]},{"name":"Adthink","company":"Adthink Media","categories":["ad"],"domains":["*.adxcore.com","*.dcoengine.com"],"examples":["d.adxcore.com"]},{"name":"Site24x7 Real User Monitoring","company":"Site24x7","categories":["analytics"],"domains":["*.site24x7rum.com"]},{"name":"SpringServer","categories":["ad"],"domains":["*.springserve.com"]},{"name":"Freespee","categories":["customer-success"],"domains":["*.freespee.com"],"examples":["analytics.freespee.com"]},{"name":"VidPulse","categories":["analytics"],"domains":["*.vidpulse.com"]},{"name":"InAuth","categories":["utility"],"homepage":"https://www.inauth.com/","domains":["*.cdn-net.com"],"examples":["uk.cdn-net.com"]},{"name":"MLveda","categories":["utility"],"domains":["*.mlveda.com"],"examples":["www.mlveda.com"]},{"name":"Microad","categories":["ad"],"domains":["*.microad.jp"]},{"name":"ShopRunner","categories":["content"],"domains":["*.shoprunner.com","*.s-9.us"]},{"name":"Reactful","categories":["analytics"],"domains":["*.reactful.com"]},{"name":"Vergic AB","categories":["customer-success"],"domains":["*.psplugin.com"]},{"name":"Alliance for Audited Media","categories":["ad"],"domains":["*.aamsitecertifier.com"]},{"name":"Forter","categories":["utility"],"domains":["*.forter.com"]},{"name":"Swoop","categories":["ad"],"domains":["*.swoop.com"]},{"name":"Gfycat","company":"Gycat","categories":["utility"],"domains":["*.gfycat.com"]},{"name":"Optimove","company":"Mobius Solutions","categories":["analytics"],"domains":["*.optimove.net"]},{"name":"LoginRadius","categories":["social"],"domains":["*.loginradius.com"]},{"name":"Flockler","categories":["ad"],"domains":["*.flockler.com"]},{"name":"Moovweb","categories":["utility"],"domains":["*.moovweb.net"]},{"name":"Cachefly","categories":["utility"],"domains":["*.cachefly.net"]},{"name":"emetriq","homepage":"https://www.emetriq.com/","categories":["ad"],"domains":["*.emetriq.de","*.xplosion.de"]},{"name":"CANDDi","company":"Campaign and Digital Intelligence","categories":["ad"],"domains":["*.canddi.com"]},{"name":"Braintree Payments","company":"Paypal","categories":["utility"],"domains":["*.braintreegateway.com"]},{"name":"Meltwater Group","categories":["customer-success"],"domains":["*.meltwaternews.com"]},{"name":"Video Media Groep","categories":["ad"],"domains":["*.vmg.host","*.inpagevideo.nl"]},{"name":"Polldaddy","company":"Automattic","categories":["analytics"],"domains":["polldaddy.com"]},{"name":"Triblio","categories":["marketing"],"domains":["*.tribl.io"]},{"name":"Wufoo","categories":["utility"],"domains":["*.wufoo.com"]},{"name":"User Replay","categories":["analytics"],"domains":["*.userreplay.net"]},{"name":"Barilliance","categories":["analytics"],"domains":["*.barilliance.net","dn3y71tq7jf07.cloudfront.net"]},{"name":"Boomtrain","categories":["ad"],"domains":["*.boomtrain.com","*.boomtrain.net"]},{"name":"Extole","categories":["ad"],"domains":["*.extole.com","*.extole.io"],"examples":["origin.extole.io"]},{"name":"infogr.am","categories":["utility"],"domains":["*.infogr.am","*.jifo.co"]},{"name":"Catchpoint","homepage":"https://www.catchpoint.com/","categories":["analytics"],"domains":["*.3gl.net"]},{"name":"InSkin Media","categories":["ad"],"domains":["*.inskinad.com","*.inskinmedia.com"]},{"name":"Kargo","categories":["marketing"],"domains":["*.kargo.com"]},{"name":"Byside","homepage":"http://www.byside.com","categories":["analytics"],"domains":["*.byside.com"],"examples":["byce2.byside.com","wce2.byside.com"]},{"name":"CNET Content Solutions","company":"CBS Interactive","categories":["content"],"domains":["*.cnetcontent.com"],"examples":["cdn.cnetcontent.com","ws.cnetcontent.com"]},{"name":"HotelsCombined","categories":["content"],"domains":["*.datahc.com"]},{"name":"Hawk Search","categories":["utility"],"domains":["*.hawksearch.com"]},{"name":"Vergic Engage Platform","company":"Vergic","categories":["customer-success"],"domains":["*.vergic.com"]},{"name":"Vertical Mass","categories":["ad"],"domains":["*.vmweb.net"]},{"name":"ShopStorm","categories":["utility"],"domains":["*.shopstorm.com"]},{"name":"Borderfree","company":"pitney bowes","categories":["utility"],"domains":["*.borderfree.com","*.fiftyone.com"]},{"name":"Fonecall","categories":["analytics"],"domains":["*.web-call-analytics.com"]},{"name":"PebblePost","categories":["ad"],"domains":["*.pbbl.co"]},{"name":"DemandJump","categories":["analytics"],"domains":["*.demandjump.com"]},{"name":"Kiosked","categories":["ad"],"domains":["*.kiosked.com"]},{"name":"Ad6Media","categories":["ad"],"domains":["*.ad6media.fr"]},{"name":"The Publisher Desk","categories":["ad"],"domains":["*.206ads.com","*.publisherdesk.com"]},{"name":"Ghostery Enterprise","company":"Ghostery","categories":["marketing"],"domains":["*.betrad.com"]},{"name":"content.ad","categories":["ad"],"domains":["*.content.ad"]},{"name":"Innovid","categories":["ad"],"homepage":"https://www.innovid.com/","domains":["*.innovid.com"],"examples":["ag.innovid.com","rtr.innovid.com"]},{"name":"RightNow Service Cloud","company":"Oracle","categories":["customer-success"],"domains":["*.rightnowtech.com","*.rnengage.com"]},{"name":"Polyfill service","company":"Polyfill.io","categories":["other"],"domains":["*.polyfill.io"]},{"name":"Prezi","categories":["utility"],"domains":["*.prezi.com"]},{"name":"Sourcepoint","categories":["ad"],"domains":["*.decenthat.com","*.fallingfalcon.com","*.summerhamster.com","d2lv4zbk7v5f93.cloudfront.net","d3qxwzhswv93jk.cloudfront.net"],"examples":["www.decenthat.com","www.fallingfalcon.com","www.summerhamster.com"]},{"name":"PowerFront","categories":["hosting"],"domains":["*.inside-graph.com"]},{"name":"Bidswitch","homepage":"https://www.bidswitch.com/","categories":["ad"],"domains":["*.bidswitch.net"],"examples":["x.bidswitch.net"]},{"name":"Bet365","categories":["ad"],"domains":["*.bet365affiliates.com"]},{"name":"RichRelevance","categories":["analytics"],"domains":["*.richrelevance.com"]},{"name":"Elecard StreamEye","company":"Elecard","categories":["other"],"domains":["*.streameye.net"]},{"name":"NaviStone","categories":["ad"],"domains":["*.murdoog.com"]},{"name":"MailPlus","categories":["ad"],"domains":["*.mailplus.nl"]},{"name":"Cross Pixel Media","categories":["ad"],"domains":["*.crsspxl.com"]},{"name":"TurnTo","homepage":"https://www.turntonetworks.com/","categories":["utility"],"domains":["*.turnto.com"]},{"name":"Connexity","homepage":"http://connexity.com/","categories":["analytics"],"domains":["*.connexity.net"]},{"name":"Iterate","homepage":"https://iteratehq.com/","categories":["analytics"],"domains":["*.iteratehq.com"]},{"name":"OnScroll","categories":["ad"],"domains":["*.onscroll.com"]},{"name":"Web Dissector","company":"Beijing Gridsum Technologies","categories":["analytics"],"domains":["*.gridsumdissector.com","*.webdissector.com"],"examples":["www.webdissector.com"]},{"name":"Bluecore","categories":["analytics"],"domains":["*.bluecore.com"],"examples":["www.bluecore.com"]},{"name":"Flipboard","categories":["social"],"domains":["*.flipboard.com"]},{"name":"UPS i-parcel","company":"UPS","categories":["other"],"domains":["*.i-parcel.com"]},{"name":"TechTarget","categories":["content"],"domains":["*.techtarget.com","*.ttgtmedia.com"]},{"name":"Realytics","categories":["analytics"],"domains":["dcniko1cv0rz.cloudfront.net","*.realytics.net"]},{"name":"Dropbox","categories":["utility"],"domains":["*.dropboxusercontent.com"]},{"name":"StumbleUpon","categories":["content"],"domains":["*.stumble-upon.com","*.stumbleupon.com"]},{"name":"ReCollect","categories":["utility"],"domains":["*.recollect.net"]},{"name":"AdSpruce","categories":["ad"],"domains":["*.adspruce.com"]},{"name":"RebelMouse","categories":["ad"],"domains":["*.rebelmouse.com","*.rbl.ms"],"examples":["www.rebelmouse.com"]},{"name":"Intilery","categories":["customer-success"],"domains":["*.intilery-analytics.com"]},{"name":"Adunity","categories":["ad"],"domains":["*.adunity.com"]},{"name":"UpSellit","categories":["analytics"],"domains":["*.upsellit.com"],"examples":["www.upsellit.com"]},{"name":"AdSupply","categories":["ad"],"domains":["*.doublepimp.com"]},{"name":"Better Business Bureau","categories":["analytics"],"domains":["*.bbb.org"]},{"name":"Spot.IM","categories":["social"],"domains":["*.spot.im"]},{"name":"Improve Digital","categories":["ad"],"domains":["*.360yield.com"]},{"name":"Sociomantic Labs","company":"DunnHumby","categories":["ad"],"domains":["*.sociomantic.com"]},{"name":"MathJax","categories":["utility"],"domains":["*.mathjax.org"]},{"name":"Qualtrics","categories":["analytics"],"domains":["*.qualtrics.com"]},{"name":"ConvertMedia","categories":["ad"],"domains":["*.admailtiser.com","*.basebanner.com","*.cmbestsrv.com","*.vidfuture.com","*.zorosrv.com"],"examples":["www.cmbestsrv.com"]},{"name":"Soundest","categories":["ad"],"domains":["*.soundestlink.com","*.soundest.net"]},{"name":"Xaxis","homepage":"https://www.xaxis.com/","categories":["ad"],"domains":["*.247realmedia.com","*.mookie1.com","*.gmads.net"],"examples":["t.mookie1.com","odr.mookie1.com"]},{"name":"Research Online","company":"Skills Development Scotland","categories":["content"],"domains":["*.org.uk"],"examples":["www.researchonline.org.uk"]},{"name":"DistroScale","categories":["ad"],"domains":["*.jsrdn.com"]},{"name":"StackExchange","categories":["social"],"domains":["*.sstatic.net"]},{"name":"BuySellAds","categories":["ad"],"domains":["*.buysellads.com"]},{"name":"Reklama","categories":["ad"],"domains":["*.o2.pl","*.wp.pl"],"examples":["dot.wp.pl","px.o2.pl","px.wp.pl"]},{"name":"eGain","categories":["analytics"],"domains":["*.analytics-egain.com","*.egain.com"]},{"name":"Sonobi","categories":["ad"],"domains":["*.sonobi.com"]},{"name":"AliveChat","company":"AYU Technology Solutions","categories":["customer-success"],"domains":["*.websitealive.com","*.websitealive7.com"]},{"name":"Zolando","categories":["content"],"domains":["*.ztat.net"]},{"name":"AdCurve","categories":["ad"],"domains":["*.shop2market.com"]},{"name":"Pagefair","categories":["ad"],"domains":["*.pagefair.com","*.pagefair.net"]},{"name":"StackAdapt","categories":["ad"],"domains":["*.stackadapt.com"]},{"name":"United Internet","categories":["hosting"],"domains":["*.uicdn.com"]},{"name":"Nanorep","company":"Nanorep Technologies","categories":["customer-success"],"domains":["*.nanorep.com"]},{"name":"Fastest Forward","categories":["analytics"],"domains":["*.gaug.es"]},{"name":"Ceros","categories":["other"],"domains":["ceros.com","view.ceros.com"]},{"name":"Investis","categories":["utility"],"domains":["*.investis.com"]},{"name":"Channel.me","categories":["customer-success"],"domains":["*.channel.me"]},{"name":"ARM","categories":["analytics"],"domains":["*.tag4arm.com"]},{"name":"Webtrends","categories":["analytics"],"domains":["*.webtrends.com","*.webtrendslive.com","d1q62gfb8siqnm.cloudfront.net"]},{"name":"Scoota","categories":["ad"],"domains":["*.rockabox.co","*.scoota.co","d31i2625d5nv27.cloudfront.net","dyjnzf8evxrp2.cloudfront.net"]},{"name":"TrafficJunky","homepage":"https://www.trafficjunky.com/","categories":["ad"],"domains":["*.contentabc.com","*.trafficjunky.net"],"examples":["ads2.contentabc.com","hw-cdn.contentabc.com","media.trafficjunky.net","ads.trafficjunky.net","hw-cdn.trafficjunky.net"]},{"name":"PrintFriendly","categories":["utility"],"domains":["*.printfriendly.com"]},{"name":"Datawrapper","categories":["utility"],"domains":["*.datawrapper.de","*.dwcdn.net"],"examples":["www.datawrapper.de"]},{"name":"Click4Assistance","categories":["customer-success"],"domains":["*.click4assistance.co.uk"]},{"name":"Glassdoor","categories":["content"],"domains":["*.glassdoor.com"]},{"name":"Highwinds","categories":["utility"],"domains":["*.hwcdn.net"]},{"name":"YoYo","categories":["utility"],"domains":["*.goadservices.com"]},{"name":"Webtrekk","categories":["analytics"],"domains":["*.wbtrk.net","*.webtrekk-asia.net","*.webtrekk.net","*.wt-eu02.net"]},{"name":"Fastly Insights","homepage":"https://insights.fastlylabs.com","categories":["analytics"],"domains":["*.fastly-insights.com"],"examples":["www.fastly-insights.com"]},{"name":"HP Optimost","company":"Hewlett-Packard Development Company","categories":["marketing"],"domains":["*.hp.com","d2uncb19xzxhzx.cloudfront.net"],"examples":["by.marketinghub.hp.com","marketinghub.hp.com"]},{"name":"Eyeota","categories":["ad"],"domains":["*.eyeota.net"]},{"name":"PhotoBucket","categories":["content"],"domains":["*.photobucket.com"]},{"name":"ContextWeb","categories":["ad"],"domains":["*.contextweb.com"]},{"name":"Captify Media","categories":["ad"],"domains":["*.cpx.to"]},{"name":"Intent IQ","categories":["ad"],"domains":["*.intentiq.com"]},{"name":"Vindico","company":"Viant","categories":["ad"],"domains":["*.vindicosuite.com"]},{"name":"Pictela (AOL)","categories":["analytics"],"domains":["*.pictela.net"]},{"name":"PubNation","categories":["ad"],"domains":["*.pubnation.com"]},{"name":"Freshchat","homepage":"https://www.freshworks.com/live-chat-software/","categories":["utility"],"domains":["*.freshchat.com"]},{"name":"Bridgewell DSP","homepage":"https://www.bridgewell.com/","categories":["ad"],"domains":["*.scupio.com"],"examples":["img.scupio.com"]},{"name":"PageSense","homepage":"https://www.zoho.com/pagesense/","categories":["analytics"],"domains":["*.pagesense.io"],"examples":["cdn.pagesense.io"]},{"name":"Wicked Reports","homepage":"https://www.wickedreports.com/","categories":["marketing"],"domains":["*.wickedreports.com"],"examples":["widget.wickedreports.com"]},{"name":"Pendo","homepage":"https://www.pendo.io","categories":["analytics"],"domains":["*.pendo.io"],"examples":["app.pendo.io"]},{"name":"Dynatrace","categories":["analytics"],"domains":["*.ruxit.com","js-cdn.dynatrace.com"]},{"name":"Click Guardian","homepage":"https://www.clickguardian.co.uk/","categories":["advertising"],"domains":["*.clickguardian.app","*.clickguardian.co.uk"],"examples":["v2.clickguardian.app","protection.clickguardian.co.uk"]}];
-},{}],185:[function(require,module,exports){
-module.exports=require("./lib/subsets/httparchive-nostats.js");
-
-},{"./lib/subsets/httparchive-nostats.js":187}],186:[function(require,module,exports){
-const DOMAIN_IN_URL_REGEX=/:\/\/(\S*?)(:\d+)?(\/|$)/;
-const DOMAIN_CHARACTERS=/([a-z0-9.-]+\.[a-z0-9]+|localhost)/i;
-const IP_REGEX=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;
-const ROOT_DOMAIN_REGEX=/[^.]+\.([^.]+|(gov|com|co|ne)\.\w{2})$/i;
-
-function getDomainFromOriginOrURL(originOrURL){
-if(typeof originOrURL!=='string')return null;
-if(originOrURL.length>10000||originOrURL.startsWith('data:'))return null;
-if(DOMAIN_IN_URL_REGEX.test(originOrURL))return originOrURL.match(DOMAIN_IN_URL_REGEX)[1];
-if(DOMAIN_CHARACTERS.test(originOrURL))return originOrURL.match(DOMAIN_CHARACTERS)[0];
-throw new Error(`Unable to find domain in "${originOrURL}"`);
-}
-
-function getRootDomain(originOrURL){
-const domain=getDomainFromOriginOrURL(originOrURL);
-if(!domain)return null;
-if(IP_REGEX.test(domain))return domain;
-const match=domain.match(ROOT_DOMAIN_REGEX);
-return match&&match[0]||domain;
-}
-
-function getEntityInDataset(entityByDomain,entityByRootDomain,originOrURL){
-const domain=getDomainFromOriginOrURL(originOrURL);
-const rootDomain=getRootDomain(domain);
-if(!domain||!rootDomain)return undefined;
-if(entityByDomain.has(domain))return entityByDomain.get(domain);
-if(entityByRootDomain.has(rootDomain))return entityByRootDomain.get(rootDomain);
-return undefined;
-}
-
-function createAPIFromDataset(entities_){
-const entities=JSON.parse(JSON.stringify(entities_));
-const entityByDomain=new Map();
-const entityByRootDomain=new Map();
-
-for(const entity of entities){
-if(!entity.company)entity.company=entity.name;
-entity.totalExecutionTime=Number(entity.totalExecutionTime)||0;
-entity.totalOccurrences=Number(entity.totalOccurrences)||0;
-entity.averageExecutionTime=entity.totalExecutionTime/entity.totalOccurrences;
-
-for(const domain of entity.domains){
-if(entityByDomain.has(domain))throw new Error(`Duplicate domain ${domain}`);
-entityByDomain.set(domain,entity);
-
-const rootDomain=getRootDomain(domain);
-if(domain.startsWith('*.')){
-entityByRootDomain.set(rootDomain,entity);
-}
-}
-}
-
-for(const[rootDomain,entity]of entityByRootDomain.entries()){
-if(!entity)entityByRootDomain.delete(rootDomain);
-}
-
-const getEntity=getEntityInDataset.bind(null,entityByDomain,entityByRootDomain);
-return{getEntity,getRootDomain,entities};
-}
-
-module.exports={createAPIFromDataset};
-
-},{}],187:[function(require,module,exports){
-const{createAPIFromDataset}=require('../create-entity-finder-api.js');
-const entities=require('../../dist/entities-httparchive-nostats.json');
-module.exports=createAPIFromDataset(entities);
-
-},{"../../dist/entities-httparchive-nostats.json":184,"../create-entity-finder-api.js":186}],188:[function(require,module,exports){
-(function(setImmediate,clearImmediate){
-var nextTick=require('process/browser.js').nextTick;
-var apply=Function.prototype.apply;
-var slice=Array.prototype.slice;
-var immediateIds={};
-var nextImmediateId=0;
-
-
-
-exports.setTimeout=function(){
-return new Timeout(apply.call(setTimeout,window,arguments),clearTimeout);
-};
-exports.setInterval=function(){
-return new Timeout(apply.call(setInterval,window,arguments),clearInterval);
-};
-exports.clearTimeout=
-exports.clearInterval=function(timeout){timeout.close();};
-
-function Timeout(id,clearFn){
-this._id=id;
-this._clearFn=clearFn;
-}
-Timeout.prototype.unref=Timeout.prototype.ref=function(){};
-Timeout.prototype.close=function(){
-this._clearFn.call(window,this._id);
-};
-
-
-exports.enroll=function(item,msecs){
-clearTimeout(item._idleTimeoutId);
-item._idleTimeout=msecs;
-};
-
-exports.unenroll=function(item){
-clearTimeout(item._idleTimeoutId);
-item._idleTimeout=-1;
-};
-
-exports._unrefActive=exports.active=function(item){
-clearTimeout(item._idleTimeoutId);
-
-var msecs=item._idleTimeout;
-if(msecs>=0){
-item._idleTimeoutId=setTimeout(function onTimeout(){
-if(item._onTimeout)
-item._onTimeout();
-},msecs);
-}
-};
-
-
-exports.setImmediate=typeof setImmediate==="function"?setImmediate:function(fn){
-var id=nextImmediateId++;
-var args=arguments.length<2?false:slice.call(arguments,1);
-
-immediateIds[id]=true;
-
-nextTick(function onNextTick(){
-if(immediateIds[id]){
-
-
-if(args){
-fn.apply(null,args);
-}else{
-fn.call(null);
-}
-
-exports.clearImmediate(id);
-}
-});
-
-return id;
-};
-
-exports.clearImmediate=typeof clearImmediate==="function"?clearImmediate:function(id){
-delete immediateIds[id];
-};
-}).call(this,require("timers").setImmediate,require("timers").clearImmediate);
-},{"process/browser.js":158,"timers":188}],189:[function(require,module,exports){
-(function(global){
-
-
-
-
-
-module.exports=deprecate;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function deprecate(fn,msg){
-if(config('noDeprecation')){
-return fn;
-}
-
-var warned=false;
-function deprecated(){
-if(!warned){
-if(config('throwDeprecation')){
-throw new Error(msg);
-}else if(config('traceDeprecation')){
-console.trace(msg);
-}else{
-console.warn(msg);
-}
-warned=true;
-}
-return fn.apply(this,arguments);
-}
-
-return deprecated;
-}
-
-
-
-
-
-
-
-
-
-function config(name){
-
-try{
-if(!global.localStorage)return false;
-}catch(_){
-return false;
-}
-var val=global.localStorage[name];
-if(null==val)return false;
-return String(val).toLowerCase()==='true';
-}
-
-}).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
-},{}],190:[function(require,module,exports){
-arguments[4][94][0].apply(exports,arguments);
-},{"dup":94}],191:[function(require,module,exports){
-arguments[4][95][0].apply(exports,arguments);
-},{"./support/isBuffer":190,"_process":158,"dup":95,"inherits":113}],192:[function(require,module,exports){
-module.exports={
-"version":"5.7.0"};
-
-},{}],193:[function(require,module,exports){
-
-
-
-
-
-
-'use strict';
-
-
-const stackPacks=[
-require('./packs/wordpress.js'),
-require('./packs/react.js'),
-require('./packs/angular.js'),
-require('./packs/amp.js'),
-require('./packs/magento.js')];
-
-
-module.exports=stackPacks;
-
-},{"./packs/amp.js":194,"./packs/angular.js":195,"./packs/magento.js":196,"./packs/react.js":197,"./packs/wordpress.js":198}],194:[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-'use strict';
-
-const i18n=require('../../lighthouse-core/lib/i18n/i18n.js');
-
-const ampIcon=`data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"%3E%3Cpath d="M171.887 116.28l-53.696 89.36h-9.728l9.617-58.227-30.2.047a4.852 4.852 0 01-4.855-4.855c0-1.152 1.07-3.102 1.07-3.102l53.52-89.254 9.9.043-9.86 58.317 30.413-.043a4.852 4.852 0 014.855 4.855c0 1.088-.427 2.044-1.033 2.854l.004.004zM128 0C57.306 0 0 57.3 0 128s57.306 128 128 128 128-57.306 128-128S198.7 0 128 0z" fill="%230379c4" fill-rule="evenodd"/%3E%3C/svg%3E`;
-
-const UIStrings={
-
-uses_webp_images:'Consider displaying all your `amp-img` components in WebP formats while specifying an appropriate fallback for other browsers. [Learn more](https://amp.dev/documentation/components/amp-img/#example:-specifying-a-fallback-image).',
-
-offscreen_images:'Ensure that you are you using valid `amp-img` tags for your images which automatically lazy-load outside the first viewport. [Learn more](https://amp.dev/documentation/guides-and-tutorials/develop/media_iframes_3p/?format=websites#images).',
-
-render_blocking_resources:'Use tools such as [AMP Optimizer](https://github.com/ampproject/amp-toolbox/tree/master/packages/optimizer) to [server-side render AMP layouts](https://amp.dev/documentation/guides-and-tutorials/optimize-and-measure/server-side-rendering/).',
-
-unminified_css:'Refer to the [AMP documentation](https://amp.dev/documentation/guides-and-tutorials/develop/style_and_layout/style_pages/) to ensure all your styles are supported.',
-
-efficient_animated_content:'For animated content, use [amp-anim](https://amp.dev/documentation/components/amp-anim/) to minimize CPU usage while the content remains offscreen.',
-
-uses_responsive_images:'The `amp-img` element supports the `srcset` attribute to specify which image assets to use based on the screen size.  [Learn more](https://amp.dev/documentation/guides-and-tutorials/develop/style_and_layout/art_direction/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-module.exports={
-id:'amp',
-iconDataURL:ampIcon,
-title:'AMP',
-descriptions:{
-'uses-webp-images':str_(UIStrings.uses_webp_images),
-'offscreen-images':str_(UIStrings.offscreen_images),
-'render-blocking-resources':str_(UIStrings.render_blocking_resources),
-'unminified-css':str_(UIStrings.unminified_css),
-'efficient-animated-content':str_(UIStrings.efficient_animated_content),
-'uses-responsive-images':str_(UIStrings.uses_responsive_images)}};
-
-
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/stack-packs/packs/amp.js");
-},{"../../lighthouse-core/lib/i18n/i18n.js":66}],195:[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-'use strict';
-
-const i18n=require('../../lighthouse-core/lib/i18n/i18n.js');
-
-const angularIcon=`data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 250 250"%3E%3Cpath fill="%23dd0031" d="M125 30L31.9 63.2l14.2 123.1L125 230l78.9-43.7 14.2-123.1z"/%3E%3Cpath fill="%23c3002f" d="M125 30v22.2-.1V230l78.9-43.7 14.2-123.1L125 30z"/%3E%3Cpath d="M125 52.1L66.8 182.6h21.7l11.7-29.2h49.4l11.7 29.2H183L125 52.1zm17 83.3h-34l17-40.9 17 40.9z" fill="%23fff"/%3E%3C/svg%3E`;
-
-const UIStrings={
-
-total_byte_weight:'Apply [route-level code-splitting](https://web.dev/route-level-code-splitting-in-angular/) to minimize the size of your JavaScript bundles. Also, consider precaching assets with the [Angular service worker](https://web.dev/precaching-with-the-angular-service-worker/).',
-
-unminified_warning:'If you are using Angular CLI, ensure that builds are generated in production mode. [Learn more](https://angular.io/guide/deployment#enable-runtime-production-mode).',
-
-unused_javascript:'If you are using Angular CLI, include source maps into your production build to inspect your bundles. [Learn more](https://angular.io/guide/deployment#inspect-the-bundles).',
-
-uses_responsive_images:'Consider using the `BreakpointObserver` utility in the Component Dev Kit (CDK) to manage image breakpoints. [Learn more](https://material.angular.io/cdk/layout/overview).',
-
-uses_rel_preload:'Preload routes ahead of time to speed up navigation. [Learn more](https://web.dev/route-preloading-in-angular/).',
-
-dom_size:'Consider virtual scrolling with the Component Dev Kit (CDK) if very large lists are being rendered. [Learn more](https://web.dev/virtualize-lists-with-angular-cdk/).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-module.exports={
-id:'angular',
-iconDataURL:angularIcon,
-title:'Angular',
-descriptions:{
-'total-byte-weight':str_(UIStrings.total_byte_weight),
-'unminified-css':str_(UIStrings.unminified_warning),
-'unminified-javascript':str_(UIStrings.unminified_warning),
-'unused-javascript':str_(UIStrings.unused_javascript),
-'uses-responsive-images':str_(UIStrings.uses_responsive_images),
-'uses-rel-preload':str_(UIStrings.uses_rel_preload),
-'dom-size':str_(UIStrings.dom_size)}};
-
-
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/stack-packs/packs/angular.js");
-},{"../../lighthouse-core/lib/i18n/i18n.js":66}],196:[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-'use strict';
-
-const i18n=require('../../lighthouse-core/lib/i18n/i18n.js');
-
-const magentoIcon=`data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23f26322" viewBox="0 0 1000 1000"%3E%3Cpath d="M916.9 267.4v465.3l-111.3 67.4V331.4l-1.5-.9-303.9-189-304.6 189.2-1.2.8V799L83.1 732.6V267.4l.7-.4L500.3 10l416 257 .6.4zM560.7 468.5v383.3L500.3 890l-61-38.2V306.7l-136 84.3v476.6l197 122.5 196.4-122.5V391l-136-84.3v161.8z"/%3E%3C/svg%3E`;
-
-const UIStrings={
-
-uses_webp_images:'Consider searching the [Magento Marketplace](https://marketplace.magento.com/catalogsearch/result/?q=webp) for a variety of third-party extensions to leverage newer image formats.',
-
-offscreen_images:'Consider modifying your product and catalog templates to make use of the web platform\'s [lazy loading](https://web.dev/native-lazy-loading) feature.',
-
-disable_bundling:'Disable Magento\'s built-in [JavaScript bundling and minification](https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/themes/js-bundling.html), and consider using [baler](https://github.com/magento/baler/) instead.',
-
-unminified_css:'Enable the "Minify CSS Files" option in your store\'s Developer settings. [Learn more](https://devdocs.magento.com/guides/v2.3/performance-best-practices/configuration.html?itm_source=devdocs&itm_medium=search_page&itm_campaign=federated_search&itm_term=minify%20css%20files).',
-
-unminified_javascript:'Use [Terser](https://www.npmjs.com/package/terser) to minify all JavaScript assets outfrom from static content deployment, and disable the built-in minification feature.',
-
-unused_javascript:'Disable Magento\'s built-in [JavaScript bundling](https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/themes/js-bundling.html).',
-
-uses_optimized_images:'Consider searching the [Magento Marketplace](https://marketplace.magento.com/catalogsearch/result/?q=optimize%20image) for a variety of third party extensions to optimize images.',
-
-time_to_first_byte:'Use Magento\'s [Varnish integration](https://devdocs.magento.com/guides/v2.3/config-guide/varnish/config-varnish.html).',
-
-uses_rel_preconnect:'Preconnect or dns-prefetch resource hints can be added by [modifying a themes\'s layout](https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/layouts/xml-manage.html).',
-
-uses_rel_preload:'`<link rel=preload>` tags can be added by [modifying a themes\'s layout](https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/layouts/xml-manage.html).',
-
-critical_request_chains:'If you are not bundling your JavaScript assets, consider using [baler](https://github.com/magento/baler).',
-
-font_display:'Specify `@font-display` when [defining custom fonts](https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/css-topics/using-fonts.html).'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-module.exports={
-id:'magento',
-iconDataURL:magentoIcon,
-title:'Magento',
-descriptions:{
-'uses-webp-images':str_(UIStrings.uses_webp_images),
-'offscreen-images':str_(UIStrings.offscreen_images),
-'total-byte-weight':str_(UIStrings.disable_bundling),
-'render-blocking-resources':str_(UIStrings.disable_bundling),
-'unminified-css':str_(UIStrings.unminified_css),
-'unminified-javascript':str_(UIStrings.unminified_javascript),
-'unused-javascript':str_(UIStrings.unused_javascript),
-'uses-optimized-images':str_(UIStrings.uses_optimized_images),
-'time-to-first-byte':str_(UIStrings.time_to_first_byte),
-'uses-rel-preconnect':str_(UIStrings.uses_rel_preconnect),
-'uses-rel-preload':str_(UIStrings.uses_rel_preload),
-'critical-request-chains':str_(UIStrings.critical_request_chains),
-'font-display':str_(UIStrings.font_display)}};
-
-
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/stack-packs/packs/magento.js");
-},{"../../lighthouse-core/lib/i18n/i18n.js":66}],197:[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-'use strict';
-
-const i18n=require('../../lighthouse-core/lib/i18n/i18n.js');
-
-const reactIcon=`data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"%3E %3Cg fill="%2361DAFB"%3E%3Cpath d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/%3E %3Ccircle cx="420.9" cy="296.5" r="45.7"/%3E %3Cpath d="M520.5 78.1z"/%3E%3C/g%3E%3C/svg%3E`;
-
-const UIStrings={
-
-unminified_css:'If your build system minifies your CSS files automatically, ensure that you are deploying the production build of your application. You can check this with the React Developer Tools extension. [Learn more](https://reactjs.org/docs/optimizing-performance.html#use-the-production-build).',
-
-unminified_javascript:'If your build system minifies your JS files automatically, ensure that you are deploying the production build of your application. You can check this with the React Developer Tools extension. [Learn more](https://reactjs.org/docs/optimizing-performance.html#use-the-production-build).',
-
-unused_javascript:'If you are not server-side rendering, [split your JavaScript bundles](https://web.dev/code-splitting-suspense/) with `React.lazy()`. Otherwise, code-split using a third-party library such as [loadable-components](https://www.smooth-code.com/open-source/loadable-components/docs/getting-started/).',
-
-time_to_first_byte:'If you are server-side rendering any React components, consider using `renderToNodeStream()` or `renderToStaticNodeStream()` to allow the client to receive and hydrate different parts of the markup instead of all at once. [Learn more](https://reactjs.org/docs/react-dom-server.html#rendertonodestream).',
-
-redirects:'If you are using React Router, minimize usage of the `<Redirect>` component for [route navigations](https://reacttraining.com/react-router/web/api/Redirect).',
-
-user_timings:'Use the React DevTools Profiler, which makes use of the Profiler API, to measure the rendering performance of your components. [Learn more.](https://reactjs.org/blog/2018/09/10/introducing-the-react-profiler.html)',
-
-dom_size:'Consider using a “windowing” library like `react-window` to minimize the number of DOM nodes created if you are rendering many repeated elements on the page. [Learn more](https://web.dev/virtualize-long-lists-react-window/). Also, minimize unecessary re-renders using [shouldComponentUpdate](https://reactjs.org/docs/optimizing-performance.html#shouldcomponentupdate-in-action), [PureComponent](https://reactjs.org/docs/react-api.html#reactpurecomponent), or [React.memo](https://reactjs.org/docs/react-api.html#reactmemo) and [skip effects](https://reactjs.org/docs/hooks-effect.html#tip-optimizing-performance-by-skipping-effects) only until certain dependencies have changed if you are using the Effect hook to improve runtime performance.'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-module.exports={
-id:'react',
-iconDataURL:reactIcon,
-title:'React',
-descriptions:{
-'unminified-css':str_(UIStrings.unminified_css),
-'unminified-javascript':str_(UIStrings.unminified_javascript),
-'unused-javascript':str_(UIStrings.unused_javascript),
-'time-to-first-byte':str_(UIStrings.time_to_first_byte),
-'redirects':str_(UIStrings.redirects),
-'user-timings':str_(UIStrings.user_timings),
-'dom-size':str_(UIStrings.dom_size)}};
-
-
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/stack-packs/packs/react.js");
-},{"../../lighthouse-core/lib/i18n/i18n.js":66}],198:[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-'use strict';
-
-const i18n=require('../../lighthouse-core/lib/i18n/i18n.js');
-
-const wordpressIcon=`data:image/svg+xml,%3Csvg viewBox='0 0 122.5 122.5' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%232f3439'%3E%3Cpath d='M8.7 61.3c0 20.8 12.1 38.7 29.6 47.3l-25-68.7c-3 6.5-4.6 13.7-4.6 21.4zM96.7 58.6c0-6.5-2.3-11-4.3-14.5-2.7-4.3-5.2-8-5.2-12.3 0-4.8 3.7-9.3 8.9-9.3h.7a52.4 52.4 0 0 0-79.4 9.9h3.3c5.5 0 14-.6 14-.6 2.9-.2 3.2 4 .4 4.3 0 0-2.9.4-6 .5l19.1 57L59.7 59l-8.2-22.5c-2.8-.1-5.5-.5-5.5-.5-2.8-.1-2.5-4.5.3-4.3 0 0 8.7.7 13.9.7 5.5 0 14-.7 14-.7 2.8-.2 3.2 4 .3 4.3 0 0-2.8.4-6 .5l19 56.5 5.2-17.5c2.3-7.3 4-12.5 4-17z'/%3E%3Cpath d='M62.2 65.9l-15.8 45.8a52.6 52.6 0 0 0 32.3-.9l-.4-.7zM107.4 36a49.6 49.6 0 0 1-3.6 24.2l-16.1 46.5A52.5 52.5 0 0 0 107.4 36z'/%3E%3Cpath d='M61.3 0a61.3 61.3 0 1 0 .1 122.7A61.3 61.3 0 0 0 61.3 0zm0 119.7a58.5 58.5 0 1 1 .1-117 58.5 58.5 0 0 1-.1 117z'/%3E%3C/g%3E%3C/svg%3E`;
-
-const UIStrings={
-
-unused_css_rules:'Consider reducing, or switching, the number of [WordPress plugins](https://wordpress.org/plugins/) loading unused CSS in your page. To identify plugins that are adding extraneous CSS, try running [code coverage](https://developers.google.com/web/updates/2017/04/devtools-release-notes#coverage) in Chrome DevTools. You can identify the theme/plugin responsible from the URL of the stylesheet. Look out for plugins that have many stylesheets in the list which have a lot of red in code coverage. A plugin should only enqueue a stylesheet if it is actually used on the page.',
-
-uses_webp_images:'Consider using a [plugin](https://wordpress.org/plugins/search/convert+webp/) or service that will automatically convert your uploaded images to the optimal formats.',
-
-offscreen_images:'Install a [lazy-load WordPress plugin](https://wordpress.org/plugins/search/lazy+load/) that provides the ability to defer any offscreen images, or switch to a theme that provides that functionality. Also consider using [the AMP plugin](https://wordpress.org/plugins/amp/).',
-
-total_byte_weight:'Consider showing excerpts in your post lists (e.g. via the more tag), reducing the number of posts shown on a given page, breaking your long posts into multiple pages, or using a plugin to lazy-load comments.',
-
-render_blocking_resources:'There are a number of WordPress plugins that can help you [inline critical assets](https://wordpress.org/plugins/search/critical+css/) or [defer less important resources](https://wordpress.org/plugins/search/defer+css+javascript/). Beware that optimizations provided by these plugins may break features of your theme or plugins, so you will likely need to make code changes.',
-
-unminified_css:'A number of [WordPress plugins](https://wordpress.org/plugins/search/minify+css/) can speed up your site by concatenating, minifying, and compressing your styles. You may also want to use a build process to do this minification up-front if possible.',
-
-unminified_javascript:'A number of [WordPress plugins](https://wordpress.org/plugins/search/minify+javascript/) can speed up your site by concatenating, minifying, and compressing your scripts. You may also want to use a build process to do this minification up front if possible.',
-
-efficient_animated_content:'Consider uploading your GIF to a service which will make it available to embed as an HTML5 video.',
-
-unused_javascript:'Consider reducing, or switching, the number of [WordPress plugins](https://wordpress.org/plugins/) loading unused JavaScript in your page. To identify plugins that are adding extraneous JS, try running [code coverage](https://developers.google.com/web/updates/2017/04/devtools-release-notes#coverage) in Chrome DevTools. You can identify the theme/plugin responsible from the URL of the script. Look out for plugins that have many scripts in the list which have a lot of red in code coverage. A plugin should only enqueue a script if it is actually used on the page.',
-
-uses_long_cache_ttl:'Read about [Browser Caching in WordPress](https://codex.wordpress.org/WordPress_Optimization#Browser_Caching).',
-
-uses_optimized_images:'Consider using an [image optimization WordPress plugin](https://wordpress.org/plugins/search/optimize+images/) that compresses your images while retaining quality.',
-
-uses_text_compression:'You can enable text compression in your web server configuration.',
-
-uses_responsive_images:'Upload images directly through the [media library](https://codex.wordpress.org/Media_Library_Screen) to ensure that the required image sizes are available, and then insert them from the media library or use the image widget to ensure the optimal image sizes are used (including those for the responsive breakpoints). Avoid using `Full Size` images unless the dimensions are adequate for their usage. [Learn More](https://codex.wordpress.org/Inserting_Images_into_Posts_and_Pages#Image_Size).',
-
-time_to_first_byte:'Themes, plugins, and server specifications all contribute to server response time. Consider finding a more optimized theme, carefully selecting an optimization plugin, and/or upgrading your server.'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-module.exports={
-id:'wordpress',
-iconDataURL:wordpressIcon,
-title:'WordPress',
-descriptions:{
-'unused-css-rules':str_(UIStrings.unused_css_rules),
-'uses-webp-images':str_(UIStrings.uses_webp_images),
-'offscreen-images':str_(UIStrings.offscreen_images),
-'total-byte-weight':str_(UIStrings.total_byte_weight),
-'render-blocking-resources':str_(UIStrings.render_blocking_resources),
-'unminified-css':str_(UIStrings.unminified_css),
-'unminified-javascript':str_(UIStrings.unminified_javascript),
-'efficient-animated-content':str_(UIStrings.efficient_animated_content),
-'unused-javascript':str_(UIStrings.unused_javascript),
-'uses-long-cache-ttl':str_(UIStrings.uses_long_cache_ttl),
-'uses-optimized-images':str_(UIStrings.uses_optimized_images),
-'uses-text-compression':str_(UIStrings.uses_text_compression),
-'uses-responsive-images':str_(UIStrings.uses_responsive_images),
-'time-to-first-byte':str_(UIStrings.time_to_first_byte)}};
-
-
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/stack-packs/packs/wordpress.js");
-},{"../../lighthouse-core/lib/i18n/i18n.js":66}],199:[function(require,module,exports){
-module.exports={
-"npm":{
-"angular":[
-{"id":"SNYK-JS-ANGULAR-471885","severity":"medium","semver":{"vulnerable":["<1.6.3"]}},
-{"id":"SNYK-JS-ANGULAR-471882","severity":"medium","semver":{"vulnerable":["<1.6.5"]}},
-{"id":"SNYK-JS-ANGULAR-471879","severity":"medium","semver":{"vulnerable":["<1.6.0-rc.0"]}},
-{"id":"npm:angular:20180202","severity":"medium","semver":{"vulnerable":["<1.6.9"]}},
-{"id":"npm:angular:20171018","severity":"medium","semver":{"vulnerable":["<1.6.7"]}},
-{"id":"npm:angular:20160527","severity":"medium","semver":{"vulnerable":[">=1.0.0 <1.2.30"]}},
-{"id":"npm:angular:20160122","severity":"medium","semver":{"vulnerable":[">=1.3.0 <1.5.0-rc.2"]}},
-{"id":"npm:angular:20140608","severity":"low","semver":{"vulnerable":["<1.3.0"]}},
-{"id":"npm:angular:20131113","severity":"high","semver":{"vulnerable":["<1.2.2"]}},
-{"id":"npm:angular:20140908","severity":"medium","semver":{"vulnerable":["<1.3.0-rc.4"]}},
-{"id":"npm:angular:20161101","severity":"medium","semver":{"vulnerable":[">=1.5.0 <1.5.9"]}},
-{"id":"npm:angular:20150909","severity":"high","semver":{"vulnerable":["<1.5.0-beta.2"]}},
-{"id":"npm:angular:20151205","severity":"medium","semver":{"vulnerable":["<1.5.0-rc.0"]}},
-{"id":"npm:angular:20151130","severity":"medium","semver":{"vulnerable":["<1.4.10"]}},
-{"id":"npm:angular:20130622","severity":"medium","semver":{"vulnerable":[">=1.0.0 <1.2.0"]}},
-{"id":"npm:angular:20150807-1","severity":"medium","semver":{"vulnerable":[">=1.3.1 <1.5.0-beta.0"]}},
-{"id":"npm:angular:20150807","severity":"high","semver":{"vulnerable":[">=1.0.0 <1.5.0-beta.0"]}},
-{"id":"npm:angular:20150315","severity":"medium","semver":{"vulnerable":["<1.6.1"]}},
-{"id":"npm:angular:20150310","severity":"high","semver":{"vulnerable":["<1.5.0-beta.2"]}},
-{"id":"npm:angular:20141104","severity":"medium","semver":{"vulnerable":["<1.3.2"]}},
-{"id":"npm:angular:20130621","severity":"medium","semver":{"vulnerable":["<1.2.0"]}},
-{"id":"npm:angular:20140909","severity":"high","semver":{"vulnerable":[">=1.2.19 <1.2.24"]}},
-{"id":"npm:angular:20130625","severity":"high","semver":{"vulnerable":["<1.1.5"]}}],
-
-"backbone":[
-{"id":"npm:backbone:20160523","severity":"medium","semver":{"vulnerable":["<= 0.3.3"]}},
-{"id":"npm:backbone:20110701","severity":"medium","semver":{"vulnerable":["<0.5.0"]}}],
-
-"bootstrap":[
-{"id":"SNYK-JS-BOOTSTRAP-173700","severity":"medium","semver":{"vulnerable":["<3.4.1",">=4.0.0 <4.3.1"]}},
-{"id":"SNYK-JS-BOOTSTRAP-73560","severity":"medium","semver":{"vulnerable":[">=4.0.0 <4.1.2"]}},
-{"id":"SNYK-JS-BOOTSTRAP-72890","severity":"medium","semver":{"vulnerable":["<3.4.0"]}},
-{"id":"SNYK-JS-BOOTSTRAP-72889","severity":"medium","semver":{"vulnerable":["<3.4.0"]}},
-{"id":"npm:bootstrap:20180529","severity":"medium","semver":{"vulnerable":["<3.4.0",">=4.0.0 <4.1.2"]}},
-{"id":"npm:bootstrap:20160627","severity":"medium","semver":{"vulnerable":["<3.4.0",">=4.0.0-alpha <4.0.0-beta.2"]}},
-{"id":"npm:bootstrap:20120510","severity":"medium","semver":{"vulnerable":["<2.1.0"]}}],
-
-"dojo":[
-{"id":"SNYK-JS-DOJO-174934","severity":"medium","semver":{"vulnerable":[">=1.0.0 <1.0.3",">=1.1.0 <1.1.2",">=1.2.0 <1.2.4",">=1.3.0 <1.3.3",">=1.4.0 <1.4.2"]}},
-{"id":"SNYK-JS-DOJO-174933","severity":"medium","semver":{"vulnerable":["<1.2.0"]}},
-{"id":"SNYK-JS-DOJO-72305","severity":"medium","semver":{"vulnerable":["<1.14"]}},
-{"id":"npm:dojo:20180818","severity":"medium","semver":{"vulnerable":["<1.10.10 || >=1.11.0 <1.11.6 || >=1.12.0 <1.12.4 || >=1.13.0 <1.13.1"]}},
-{"id":"npm:dojo:20160523","severity":"medium","semver":{"vulnerable":["<1.1.0"]}},
-{"id":"npm:dojo:20100614-6","severity":"medium","semver":{"vulnerable":["<1.4.2"]}},
-{"id":"npm:dojo:20100614","severity":"high","semver":{"vulnerable":[">=0.4 <0.4.4 || >=1.0 <1.0.3 || >=1.1 <1.1.2 || >=1.2 <1.2.4 || >=1.3 <1.3.3 || >=1.4 <1.4.2"]}},
-{"id":"npm:dojo:20090409","severity":"medium","semver":{"vulnerable":["<1.1"]}}],
-
-"foundation-sites":[
-{"id":"npm:foundation-sites:20170802","severity":"medium","semver":{"vulnerable":["<6.0.0"]}},
-{"id":"npm:foundation-sites:20150619","severity":"medium","semver":{"vulnerable":["<5.5.3"]}},
-{"id":"npm:foundation-sites:20120717","severity":"medium","semver":{"vulnerable":["<3.0.6 >=3.0.0"]}}],
-
-"google-closure-library":[
-{"id":"SNYK-JS-GOOGLECLOSURELIBRARY-174519","severity":"medium","semver":{"vulnerable":[">=20190121.0.0 <20190301.0.0"]}}],
-
-"handlebars":[
-{"id":"SNYK-JS-HANDLEBARS-469063","severity":"high","semver":{"vulnerable":["<4.3.0"]}},
-{"id":"SNYK-JS-HANDLEBARS-174183","severity":"high","semver":{"vulnerable":["<3.0.7",">=4.1.0 <4.1.2","<4.0.14"]}},
-{"id":"SNYK-JS-HANDLEBARS-173692","severity":"high","semver":{"vulnerable":["<4.0.13"]}},
-{"id":"npm:handlebars:20151207","severity":"medium","semver":{"vulnerable":["<4.0.0"]}},
-{"id":"npm:handlebars:20110425","severity":"medium","semver":{"vulnerable":["<=1.0.0-beta.3"]}}],
-
-"highcharts":[
-{"id":"npm:highcharts:20180225","severity":"high","semver":{"vulnerable":["<6.1.0"]}}],
-
-"jquery":[
-{"id":"SNYK-JS-JQUERY-174006","severity":"medium","semver":{"vulnerable":["<3.4.0"]}},
-{"id":"npm:jquery:20160529","severity":"low","semver":{"vulnerable":[">=3.0.0-rc1 <3.0.0"]}},
-{"id":"npm:jquery:20150627","severity":"medium","semver":{"vulnerable":["<1.12.2",">=1.12.3 <2.2.2",">=2.2.3 <3.0.0"]}},
-{"id":"npm:jquery:20140902","severity":"medium","semver":{"vulnerable":[">=1.4.2 <1.6.2"]}},
-{"id":"npm:jquery:20120206","severity":"medium","semver":{"vulnerable":[">=1.7.1 <1.9.0"]}},
-{"id":"npm:jquery:20110606","severity":"medium","semver":{"vulnerable":["<1.6.3"]}}],
-
-"jquery-mobile":[
-{"id":"SNYK-JS-JQUERYMOBILE-174599","severity":"medium","semver":{"vulnerable":["<=1.5.0-alpha.1"]}},
-{"id":"npm:jquery-mobile:20120802","severity":"medium","semver":{"vulnerable":["<1.2.0"]}}],
-
-"jquery-ui":[
-{"id":"npm:jquery-ui:20121127","severity":"medium","semver":{"vulnerable":["<1.10.0"]}},
-{"id":"npm:jquery-ui:20100903","severity":"medium","semver":{"vulnerable":["<1.10.0"]}},
-{"id":"npm:jquery-ui:20160721","severity":"high","semver":{"vulnerable":["<1.12.0"]}}],
-
-"knockout":[
-{"id":"npm:knockout:20180213","severity":"medium","semver":{"vulnerable":["<3.5.0-beta"]}},
-{"id":"npm:knockout:20130701","severity":"medium","semver":{"vulnerable":["<3.0.0 >=2.1.0-pre"]}}],
-
-"lodash":[
-{"id":"SNYK-JS-LODASH-450202","severity":"high","semver":{"vulnerable":["<4.17.12"]}},
-{"id":"SNYK-JS-LODASH-73639","severity":"medium","semver":{"vulnerable":["<4.17.11"]}},
-{"id":"SNYK-JS-LODASH-73638","severity":"high","semver":{"vulnerable":["<4.17.11"]}},
-{"id":"npm:lodash:20180130","severity":"medium","semver":{"vulnerable":["<4.17.5"]}}],
-
-"moment":[
-{"id":"npm:moment:20170905","severity":"low","semver":{"vulnerable":["<2.19.3"]}},
-{"id":"npm:moment:20161019","severity":"medium","semver":{"vulnerable":["<2.15.2"]}},
-{"id":"npm:moment:20160126","severity":"medium","semver":{"vulnerable":["<2.11.2"]}}],
-
-"mustache":[
-{"id":"npm:mustache:20151207","severity":"medium","semver":{"vulnerable":["<2.2.1"]}},
-{"id":"npm:mustache:20110814","severity":"medium","semver":{"vulnerable":["< 0.3.1"]}}],
-
-"react":[
-{"id":"npm:react:20150318","severity":"high","semver":{"vulnerable":["<0.14.0"]}},
-{"id":"npm:react:20131217","severity":"medium","semver":{"vulnerable":[">=0.5.0 <0.5.2 || >=0.4.0 <0.4.2"]}}],
-
-"riot":[
-{"id":"npm:riot:20131114","severity":"medium","semver":{"vulnerable":["<0.9.6"]}}],
-
-"socket.io":[
-{"id":"npm:socket.io:20120417","severity":"medium","semver":{"vulnerable":["<0.9.6"]}},
-{"id":"npm:socket.io:20120323","severity":"medium","semver":{"vulnerable":["<0.9.7"]}}],
-
-"vue":[
-{"id":"npm:vue:20170829","severity":"medium","semver":{"vulnerable":["<2.4.3"]}},
-{"id":"npm:vue:20170401","severity":"medium","semver":{"vulnerable":["<2.3.0-beta.1"]}},
-{"id":"npm:vue:20180802","severity":"medium","semver":{"vulnerable":["<2.5.17"]}},
-{"id":"npm:vue:20180222","severity":"low","semver":{"vulnerable":["<2.5.14"]}}],
-
-"yui":[
-{"id":"npm:yui:20130604","severity":"medium","semver":{"vulnerable":[">=3.0.0 <3.10.1 || =3.10.2"]}},
-{"id":"npm:yui:20130515","severity":"medium","semver":{"vulnerable":["<3.10.0 >=3.0.0"]}},
-{"id":"npm:yui:20121030","severity":"medium","semver":{"vulnerable":["<3.0.0 >=2.4.0"]}},
-{"id":"npm:yui:20120428","severity":"medium","semver":{"vulnerable":["<3.5.1 >=3.5.0-PR1"]}},
-{"id":"npm:yui:20101025","severity":"medium","semver":{"vulnerable":["<2.8.2 >=2.4.0"]}}]}};
-
-
-
-},{}],"lighthouse-plugin-publisher-ads/audits/ad-blocking-tasks":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-const AdRequestTime=require('../computed/ad-request-time');
-const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
-const LongTasks=require('../computed/long-tasks');
-const{auditNotApplicable}=require('../messages/common-strings');
-const{Audit}=require('lighthouse');
-const{getAttributableUrl}=require('../utils/tasks');
-const{isAdScript}=require('../utils/resource-classification');
-const{URL}=require('url');
-
-const UIStrings={
-
-title:'No long tasks blocking ad-related network requests',
-failureTitle:'Avoid long tasks that block ad-related network requests',
-description:'Tasks blocking the main thread can delay ad requests and cause '+
-'a poor user experience. Consider removing long blocking tasks or moving '+
-'them off of the main thread. These tasks can be especially detrimental to '+
-'performance on less powerful devices. [Learn more]('+
-'https://developers.google.com/publisher-ads-audits/reference/audits/ad-blocking-tasks'+
-').',
-failureDisplayValue:'{timeInMs, number, seconds} s blocked',
-columnScript:'Attributable URL',
-columnStartTime:'Start',
-columnDuration:'Duration'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-
-
-
-
-
-
-
-
-const LONG_TASK_DUR_MS=100;
-
-
-
-
-
-const HEADINGS=[
-{
-key:'script',
-itemType:'url',
-text:str_(UIStrings.columnScript)},
-
-{
-key:'startTime',
-itemType:'ms',
-text:str_(UIStrings.columnStartTime),
-granularity:1},
-
-{
-key:'duration',
-itemType:'ms',
-text:str_(UIStrings.columnDuration),
-granularity:1}];
-
-
-
-
-class AdBlockingTasks extends Audit{
-
-
-
-
-static get meta(){
-return{
-id:'ad-blocking-tasks',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['traces','devtoolsLogs']};
-
-}
-
-
-
-
-
-
-
-static async audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const metricData={trace,devtoolsLog,settings:context.settings};
-let longTasks=[];
-try{
-longTasks=await LongTasks.request(metricData,context);
-}catch(e){
-return auditNotApplicable.InvalidTiming;
-}
-
-if(!longTasks.length){
-return auditNotApplicable.NoTasks;
-}
-
-const{timing:endTime}=
-await AdRequestTime.request(metricData,context);
-
-if(!(endTime>0)){
-return auditNotApplicable.NoAdRelatedReq;
-}
-
-let blocking=[];
-for(const longTask of longTasks){
-if(longTask.startTime>endTime||
-longTask.duration<LONG_TASK_DUR_MS){
-continue;
-}
-const scriptUrl=getAttributableUrl(longTask);
-if(scriptUrl&&isAdScript(new URL(scriptUrl))){
-continue;
-}
-
-const url=scriptUrl&&new URL(scriptUrl);
-const displayUrl=url&&url.origin+url.pathname;
-
-blocking.push({
-
-script:displayUrl,
-startTime:longTask.startTime,
-endTime:longTask.endTime,
-duration:longTask.duration,
-isTopLevel:!longTask.parent});
-
-}
-
-const taskLimit=10;
-if(blocking.length>taskLimit){
-
-
-
-blocking=blocking.filter(b=>b.script&&b.isTopLevel).
-
-sort((a,b)=>b.duration-a.duration).
-splice(0,taskLimit).
-sort((a,b)=>a.startTime-b.startTime);
-}
-
-const blockedTime=blocking.reduce(
-(sum,t)=>t.isTopLevel?sum+t.duration:sum,0);
-const failed=blocking.length>0;
-return{
-score:failed?0:1,
-displayValue:failed?
-str_(UIStrings.failureDisplayValue,{timeInMs:blockedTime}):
-'',
-details:AdBlockingTasks.makeTableDetails(HEADINGS,blocking)};
-
-}}
-
-
-module.exports=AdBlockingTasks;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/ad-blocking-tasks.js");
-},{"../computed/ad-request-time":128,"../computed/long-tasks":130,"../messages/common-strings":132,"../utils/resource-classification":140,"../utils/tasks":141,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66,"url":"url"}],"lighthouse-plugin-publisher-ads/audits/ad-render-blocking-resources":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
-const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
-
-const{auditNotApplicable}=require('../messages/common-strings');
-const{Audit}=require('lighthouse');
-const{getTimingsByRecord}=require('../utils/network-timing');
-const{isAdTag}=require('../utils/resource-classification');
-const{URL}=require('url');
-
-const UIStrings={
-title:'Minimal render-blocking resources found',
-failureTitle:'Avoid render-blocking resources',
-description:'Render-blocking resources slow down tag load times. Consider '+
-'loading critical JS/CSS inline or loading scripts asynchronously or '+
-'loading the tag earlier in the head. [Learn more]('+
-'https://developers.google.com/web/tools/lighthouse/audits/blocking-resources'+
-').',
-failureDisplayValue:'Up to {timeInMs, number, seconds} s tag load time '+
-'improvement',
-columnUrl:'Resource',
-columnStartTime:'Start',
-columnDuration:'Duration'};
-
-
-
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-const HEADINGS=[
-{
-key:'url',
-itemType:'url',
-text:str_(UIStrings.columnUrl)},
-
-{
-key:'startTime',
-itemType:'ms',
-text:str_(UIStrings.columnStartTime),
-granularity:1},
-
-{
-key:'duration',
-itemType:'ms',
-text:str_(UIStrings.columnDuration),
-granularity:1}];
-
-
-
-
-class AdRenderBlockingResources extends Audit{
-
-
-
-
-static get meta(){
-return{
-id:'ad-render-blocking-resources',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-scoreDisplayMode:'binary',
-description:str_(UIStrings.description),
-requiredArtifacts:
-['LinkElements','ScriptElements','devtoolsLogs','traces']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const networkRecords=await NetworkRecords.request(devtoolsLog,context);
-const tag=networkRecords.find(req=>isAdTag(new URL(req.url)));
-if(!tag){
-return auditNotApplicable.NoTag;
-}
-
-
-const timingsByRecord=
-await getTimingsByRecord(trace,devtoolsLog,context);
-
-
-
-
-const blockingElementUrls=new Set();
-for(const link of artifacts.LinkElements){
-
-
-if(link.href&&link.rel=='stylesheet'){
-
-blockingElementUrls.add(link.href);
-}
-}
-for(const script of artifacts.ScriptElements){
-if(script.src&&!script.defer&&!script.async){
-blockingElementUrls.add(script.src);
-}
-}
-
-const blockingNetworkRecords=networkRecords.
-
-
-filter(r=>r.endTime<tag.startTime).
-filter(r=>r!=tag.initiatorRequest).
-
-
-
-filter(r=>r.initiator.type='parser').
-filter(r=>blockingElementUrls.has(r.url));
-
-const tableView=blockingNetworkRecords.
-map(r=>Object.assign({url:r.url},timingsByRecord.get(r)));
-
-tableView.sort((a,b)=>a.endTime-b.endTime);
-
-
-const endTimes=tableView.map(r=>r.endTime);
-const opportunity=Math.max(...endTimes)-Math.min(...endTimes);
-let displayValue='';
-if(tableView.length>0&&opportunity>0){
-displayValue=str_(
-UIStrings.failureDisplayValue,{timeInMs:opportunity});
-}
-
-const failed=tableView.length>0;
-return{
-score:failed?0:1,
-numericValue:tableView.length,
-displayValue,
-details:AdRenderBlockingResources.makeTableDetails(HEADINGS,tableView)};
-
-}}
-
-
-module.exports=AdRenderBlockingResources;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/ad-render-blocking-resources.js");
-},{"../messages/common-strings":132,"../utils/network-timing":138,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/lib/i18n/i18n":66,"url":"url"}],"lighthouse-plugin-publisher-ads/audits/ad-request-critical-path":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
-const{auditNotApplicable}=require('../messages/common-strings');
-const{Audit}=require('lighthouse');
-const{computeAdRequestWaterfall}=require('../utils/graph');
-
-
-
-
-const UIStrings={
-title:'Ad request waterfall',
-failureTitle:'Reduce critical path for ad loading',
-description:'Consider reducing the number of resources, loading multiple '+
-'resources simultaneously, or loading resources earlier to improve ad '+
-'speed. Requests that block ad loading can be found below. [Learn more]('+
-'https://developers.google.com/publisher-ads-audits/reference/audits/ad-request-critical-path'+
-').',
-displayValue:'{serialResources, plural, =1 {1 serial resource} other {# serial resources}}',
-columnUrl:'Request',
-columnType:'Type',
-columnStartTime:'Start',
-columnEndTime:'End'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-const HEADINGS=[
-{
-key:'url',
-itemType:'url',
-text:str_(UIStrings.columnUrl)},
-
-{
-key:'type',
-itemType:'text',
-text:str_(UIStrings.columnType)},
-
-{
-key:'startTime',
-itemType:'ms',
-text:str_(UIStrings.columnStartTime),
-granularity:1},
-
-{
-key:'endTime',
-itemType:'ms',
-text:str_(UIStrings.columnEndTime),
-granularity:1}];
-
-
-
-
-
-
-
-
-function computeDepth(requests){
-let prevEnd=0;
-let hops=0;
-for(const{startTime,endTime}of requests){
-if(startTime>prevEnd){
-++hops;
-prevEnd=endTime;
-}else{
-prevEnd=Math.min(prevEnd,endTime);
-}
-}
-return hops;
-}
-
-
-
-
-
-class AdRequestCriticalPath extends Audit{
-
-
-
-
-static get meta(){
-return{
-id:'ad-request-critical-path',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-scoreDisplayMode:'informative',
-requiredArtifacts:['devtoolsLogs','traces']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-
-const tableView=
-(await computeAdRequestWaterfall(trace,devtoolsLog,context)).
-filter(r=>r.startTime>0);
-if(!tableView.length){
-return auditNotApplicable.NoAds;
-}
-const depth=computeDepth(tableView);
-const failed=depth>3;
-
-for(const row of tableView){
-delete row.record;
-}
-
-return{
-numericValue:depth,
-score:failed?0:1,
-displayValue:str_(UIStrings.displayValue,
-{
-serialResources:depth}),
-
-details:AdRequestCriticalPath.makeTableDetails(HEADINGS,tableView)};
-
-}}
-
-
-module.exports=AdRequestCriticalPath;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/ad-request-critical-path.js");
-},{"../messages/common-strings":132,"../utils/graph":137,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/ad-request-from-page-start":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const ComputedAdRequestTime=require('../computed/ad-request-time');
-const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
-const{auditNotApplicable,runWarning}=require('../messages/common-strings');
-const{Audit}=require('lighthouse');
-
-const UIStrings={
-title:'First ad request time',
-failureTitle:'Reduce time to send the first ad request',
-description:'This metric measures the elapsed time from the start of page '+
-'load until the first ad request is made. Delayed ad requests will '+
-'decrease impressions and viewability, and have a negative impact on ad '+
-'revenue. [Learn more]('+
-'https://developers.google.com/publisher-ads-audits/reference/audits/metrics'+
-').',
-displayValue:'{timeInMs, number, seconds} s'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-const PODR=1500;
-const MEDIAN=3500;
-
-
-
-
-class AdRequestFromPageStart extends Audit{
-
-
-
-
-static get meta(){
-return{
-id:'ad-request-from-page-start',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-
-scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['devtoolsLogs','traces']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const metricData={trace,devtoolsLog,settings:context.settings};
-
-const{timing}=await ComputedAdRequestTime.request(metricData,context);
-if(!(timing>0)){
-context.LighthouseRunWarnings.push(runWarning.NoAds);
-return auditNotApplicable.NoAds;
-}
-
-let normalScore=Audit.computeLogNormalScore(timing,PODR,MEDIAN);
-
-
-if(normalScore>=.9){
-normalScore=1;
-}
-
-return{
-numericValue:timing*1e-3,
-score:normalScore,
-displayValue:str_(UIStrings.displayValue,{timeInMs:timing})};
-
-}}
-
-
-module.exports=AdRequestFromPageStart;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/ad-request-from-page-start.js");
-},{"../computed/ad-request-time":128,"../messages/common-strings":132,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/ad-top-of-viewport":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
-const{auditNotApplicable}=require('../messages/common-strings');
-const{Audit}=require('lighthouse');
-const{isAdIframe}=require('../utils/resource-classification');
-
-const UIStrings={
-title:'No ad found at the very top of the viewport',
-failureTitle:'Move the top ad further down the page',
-description:'Over 10% of ads are never viewed because users scroll past '+
-'them before they become viewable. By moving ad slots away from the very '+
-'top of the viewport, users are more likely to see ads before scrolling '+
-'away. [Learn more]('+
-'https://developers.google.com/publisher-ads-audits/reference/audits/ad-top-of-viewport'+
-').',
-failureDisplayValue:'A scroll of {valueInPx, number} px would hide half of your topmost ad',
-columnSlot:'Top Slot ID'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-const SCROLL_PX_THRESHOLD=100;
-
-
-
-
-
-const HEADINGS=[
-{key:'slot',itemType:'text',text:str_(UIStrings.columnSlot)}];
-
-
-
-
-class AdTopOfViewport extends Audit{
-
-
-
-
-static get meta(){
-return{
-id:'ad-top-of-viewport',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['ViewportDimensions','IFrameElements']};
-
-}
-
-
-
-
-
-
-static audit(artifacts){
-const viewport=artifacts.ViewportDimensions;
-const slots=artifacts.IFrameElements.filter(isAdIframe).
-filter(slot=>
-slot.clientRect.width*slot.clientRect.height>1&&
-!slot.isPositionFixed).
-map(slot=>({
-midpoint:slot.clientRect.top+slot.clientRect.height/2,
-id:slot.id}));
-
-
-if(!slots.length){
-return auditNotApplicable.NoVisibleSlots;
-}
-
-const topSlot=slots.reduce((a,b)=>a.midpoint<b.midpoint?a:b);
-
-const inViewport=topSlot.midpoint<viewport.innerHeight;
-
-if(!inViewport){
-return auditNotApplicable.NoAdsViewport;
-}
-
-const score=inViewport&&topSlot.midpoint<SCROLL_PX_THRESHOLD?0:1;
-
-return{
-score,
-numericValue:topSlot.midpoint,
-
-displayValue:score?'':
-str_(UIStrings.failureDisplayValue,{valueInPx:topSlot.midpoint}),
-details:AdTopOfViewport.makeTableDetails(
-HEADINGS,
-score?[]:[{slot:topSlot.id}])};
-
-
-}}
-
-
-module.exports=AdTopOfViewport;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/ad-top-of-viewport.js");
-},{"../messages/common-strings":132,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/ads-in-viewport":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const{auditNotApplicable}=require('../messages/common-strings');
-const{Audit}=require('lighthouse');
-
-const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
-const{isAdIframe}=require('../utils/resource-classification');
-const{isBoxInViewport}=require('../utils/geometry');
-
-const UIStrings={
-title:'Few or no ads loaded outside viewport',
-failureTitle:'Avoid loading ads until they are nearly on-screen',
-description:'Too many ads loaded outside the viewport lowers viewability '+
-'rates and impacts user experience. Consider loading ads below the fold '+
-'lazily as the user scrolls down. Consider using GPT\'s [Lazy Loading API]('+
-'https://developers.google.com/doubleclick-gpt/reference#googletag.PubAdsService_enableLazyLoad'+
-'). [Learn more]('+
-'https://developers.google.com/publisher-ads-audits/reference/audits/ads-in-viewport'+
-').',
-failureDisplayValue:'{hiddenAds, plural, =1 {1 ad} '+
-'other {# ads}} out of view',
-columnSlot:'Slots Outside Viewport'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-const HEADINGS=[
-{key:'slot',itemType:'text',text:str_(UIStrings.columnSlot)}];
-
-
-
-class AdsInViewport extends Audit{
-
-
-
-
-static get meta(){
-return{
-id:'ads-in-viewport',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['ViewportDimensions','IFrameElements']};
-
-}
-
-
-
-
-
-static audit(artifacts){
-const viewport=artifacts.ViewportDimensions;
-const slots=artifacts.IFrameElements.
-filter(iframe=>isAdIframe(iframe)&&
-iframe.clientRect.height*iframe.clientRect.width>1);
-
-if(!slots.length){
-return auditNotApplicable.NoVisibleSlots;
-}
-
-
-const nonvisible=slots.
-filter(slot=>!isBoxInViewport(slot.clientRect,viewport)).
-map(slot=>({slot:slot.id})).
-sort((a,b)=>a.slot.localeCompare(b.slot));
-
-const visibleCount=slots.length-nonvisible.length;
-
-return{
-numericValue:visibleCount/slots.length,
-score:nonvisible.length>3?0:1,
-displayValue:nonvisible.length?
-str_(UIStrings.failureDisplayValue,{hiddenAds:nonvisible.length}):
-'',
-details:AdsInViewport.makeTableDetails(HEADINGS,nonvisible)};
-
-}}
-
-
-module.exports=AdsInViewport;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/ads-in-viewport.js");
-},{"../messages/common-strings":132,"../utils/geometry":136,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/async-ad-tags":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const array=require('../utils/array.js');
-const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
-
-const MainResource=require('lighthouse/lighthouse-core/computed/main-resource');
-const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
-const{auditNotApplicable}=require('../messages/common-strings');
-const{Audit}=require('lighthouse');
-const{isAdTag,isStaticRequest}=require('../utils/resource-classification');
-const{URL}=require('url');
-
-const UIStrings={
-title:'Ad tag is loaded asynchronously',
-failureTitle:'Load ad tag asynchronously',
-description:'Loading the ad tag synchronously blocks content rendering '+
-'until the tag is fetched and loaded. Consider using the `async` attribute '+
-'to load gpt.js and/or adsbygoogle.js asynchronously. [Learn more]('+
-'https://developers.google.com/publisher-ads-audits/reference/audits/async-ad-tags'+
-').'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-function isAsync(tagReq){
-
-
-
-
-return tagReq.priority=='Low'||isStaticRequest(tagReq);
-}
-
-
-class AsyncAdTags extends Audit{
-
-
-
-
-static get meta(){
-return{
-id:'async-ad-tags',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['devtoolsLogs','URL']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const networkRecords=await NetworkRecords.request(devtoolsLog,context);
-const mainResource=
-await MainResource.request({URL:artifacts.URL,devtoolsLog},context);
-const tagReqs=networkRecords.
-filter(req=>isAdTag(new URL(req.url))).
-filter(req=>req.frameId===mainResource.frameId);
-
-if(!tagReqs.length){
-return auditNotApplicable.NoTag;
-}
-
-const numAsync=array.count(tagReqs,isAsync);
-const numTags=tagReqs.length;
-return{
-score:Number(numAsync===numTags)};
-
-}}
-
-
-module.exports=AsyncAdTags;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/async-ad-tags.js");
-},{"../messages/common-strings":132,"../utils/array.js":133,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/computed/main-resource":11,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/lib/i18n/i18n":66,"url":"url"}],"lighthouse-plugin-publisher-ads/audits/bid-request-from-page-start":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const ComputedBidRequestTime=require('../computed/bid-request-time');
-const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
-const{auditNotApplicable}=require('../messages/common-strings');
-const{Audit}=require('lighthouse');
-
-const UIStrings={
-title:'First bid request time',
-failureTitle:'Reduce time to send the first bid request',
-description:'This metric measures the elapsed time from the start of page '+
-'load until the first bid request is made. Delayed bid requests will '+
-'decrease impressions and viewability, and have a negative impact on ad '+
-'revenue. [Learn more]('+
-'https://developers.google.com/publisher-ads-audits/reference/audits/metrics'+
-').',
-displayValue:'{timeInMs, number, seconds} s'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-const PODR=1500;
-const MEDIAN=3500;
-
-
-
-
-class BidRequestFromPageStart extends Audit{
-
-
-
-
-static get meta(){
-return{
-id:'bid-request-from-page-start',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-
-scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['devtoolsLogs','traces']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const metricData={trace,devtoolsLog,settings:context.settings};
-
-const{timing}=await ComputedBidRequestTime.request(metricData,context);
-if(!(timing>0)){
-return auditNotApplicable.NoBids;
-}
-
-let normalScore=Audit.computeLogNormalScore(timing,PODR,MEDIAN);
-
-
-if(normalScore>=.9){
-normalScore=1;
-}
-
-return{
-numericValue:timing*1e-3,
-score:normalScore,
-displayValue:str_(UIStrings.displayValue,{timeInMs:timing})};
-
-}}
-
-
-module.exports=BidRequestFromPageStart;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/bid-request-from-page-start.js");
-},{"../computed/bid-request-time":129,"../messages/common-strings":132,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/blocking-load-events":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
-const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
-
-const TraceOfTab=require('lighthouse/lighthouse-core/computed/trace-of-tab');
-const{auditNotApplicable}=require('../messages/common-strings');
-const{Audit}=require('lighthouse');
-const{computeAdRequestWaterfall}=require('../utils/graph');
-const{getTimingsByRecord}=require('../utils/network-timing');
-
-
-
-
-const UIStrings={
-title:'Ads not blocked by load events',
-failureTitle:'Avoid waiting on load events',
-description:'Waiting on load events increases ad latency. '+
-'To speed up ads, eliminate the following load event handlers.',
-displayValue:'{timeInMs, number, seconds} s blocked',
-columnEvent:'Event Name',
-columnTime:'Event Time',
-columnScript:'Script',
-columnBlockedUrl:'Blocked URL',
-columnFunctionName:'Function'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-const HEADINGS=[
-{key:'eventName',itemType:'text',text:str_(UIStrings.columnEvent)},
-{key:'time',itemType:'ms',text:str_(UIStrings.columnTime),granularity:1},
-{key:'url',itemType:'url',text:str_(UIStrings.columnScript)},
-{key:'functionName',itemType:'text',text:str_(UIStrings.columnFunctionName)}];
-
-
-
-
-
-
-
-
-function findOriginalCallFrame(request){
-const{record}=request;
-let stack=record&&record.initiator&&record.initiator.stack;
-if(!stack){
-return undefined;
-}
-while(stack.parent){
-stack=stack.parent;
-}
-return stack.callFrames[stack.callFrames.length-1];
-}
-
-
-
-
-
-function findTraceEventOfCallFrame(callFrame,traceEvents){
-return traceEvents.find(e=>e.name=='FunctionCall'&&
-e.args.data&&
-
-e.args.data.functionName==callFrame.functionName&&
-
-e.args.data.scriptId==callFrame.scriptId&&
-
-e.args.data.url==callFrame.url&&
-
-
-Math.abs(e.args.data.lineNumber==callFrame.lineNumber)<2&&
-
-Math.abs(e.args.data.columnNumber==callFrame.columnNumber)<2);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function findEventIntervals(eventName,traceEvents){
-let openInterval={};
-const intervals=[];
-for(const e of traceEvents){
-if(e.name==`${eventName}EventStart`){
-openInterval={start:e.ts,end:Infinity,eventName};
-}else if(e.name==`${eventName}EventEnd`){
-openInterval.end=e.ts;
-intervals.push(openInterval);
-}
-}
-return intervals;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-function quantifyBlockedTime(blockingEvent,networkRecords,timingsByRecord){
-const eventScript=networkRecords.find(
-r=>r.url==blockingEvent.url);
-const blockedRequest=networkRecords.find(
-r=>r.url==blockingEvent.blockedUrl);
-if(!eventScript||!blockedRequest){
-return 0;
-}
-const scriptLoadTime=timingsByRecord.get(eventScript);
-const blockedRequestLoadTime=timingsByRecord.get(blockedRequest);
-if(!scriptLoadTime||!blockedRequestLoadTime){
-return 0;
-}
-return blockedRequestLoadTime.startTime-scriptLoadTime.endTime;
-}
-
-
-
-
-
-class BlockingLoadEvents extends Audit{
-
-
-
-
-static get meta(){
-return{
-id:'blocking-load-events',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['devtoolsLogs','traces']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const networkRecords=await NetworkRecords.request(devtoolsLog,context);
-const{timings,processEvents}=await TraceOfTab.request(trace,context);
-
-const timingsByRecord=
-await getTimingsByRecord(trace,devtoolsLog,context);
-
-const criticalRequests=
-(await computeAdRequestWaterfall(trace,devtoolsLog,context)).
-
-sort((a,b)=>a.startTime-b.startTime);
-
-if(!criticalRequests.length){
-return auditNotApplicable.NoAdRelatedReq;
-}
-
-const eventTimes=[
-...findEventIntervals('domContentLoaded',processEvents),
-...findEventIntervals('load',processEvents)];
-
-const blockingEvents=[];
-const seen=new Set();
-for(const r of criticalRequests){
-const callFrame=findOriginalCallFrame(r);
-if(!callFrame){
-
-
-continue;
-}
-const json=JSON.stringify(callFrame);
-if(seen.has(json)){
-
-continue;
-}
-seen.add(json);
-const traceEvent=findTraceEventOfCallFrame(callFrame,processEvents);
-if(!traceEvent){
-continue;
-}
-const interval=eventTimes.find(interval=>
-interval.start<=traceEvent.ts&&traceEvent.ts<=interval.end);
-if(interval){
-
-const blockingEvent=Object.assign({
-eventName:interval.eventName,
-blockedUrl:r.url,
-time:timings[interval.eventName],
-blockedTime:Infinity},
-callFrame);
-blockingEvent.blockedTime=quantifyBlockedTime(
-blockingEvent,networkRecords,timingsByRecord);
-blockingEvents.push(blockingEvent);
-}
-}
-
-const failed=blockingEvents.length>0;
-let blockedTime=0;
-if(failed){
-blockedTime=Math.min(...blockingEvents.map(e=>e.blockedTime));
-}
-return{
-numericValue:blockingEvents.length,
-score:failed?0:1,
-displayValue:failed&&blockedTime?
-str_(UIStrings.displayValue,{timeInMs:blockedTime}):
-'',
-details:BlockingLoadEvents.makeTableDetails(HEADINGS,blockingEvents)};
-
-}}
-
-
-module.exports=BlockingLoadEvents;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/blocking-load-events.js");
-},{"../messages/common-strings":132,"../utils/graph":137,"../utils/network-timing":138,"lighthouse":54,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/computed/trace-of-tab":39,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/bottleneck-requests":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
-const{auditNotApplicable}=require('../messages/common-strings');
-const{Audit}=require('lighthouse');
-const{computeAdRequestWaterfall}=require('../utils/graph');
-
-
-
-
-const UIStrings={
-title:'No bottleneck requests found',
-failureTitle:'Avoid bottleneck requests',
-description:'Speed up, load earlier, parallelize, or eliminate the '+
-'following requests and their dependencies in order to speed up ad '+
-'loading.',
-displayValue:'{blockedTime, number, seconds} s spent blocked on requests',
-columnUrl:'Blocking Request',
-columnInitiatorUrl:'Initiator Request',
-columnStartTime:'Start',
-columnSelfTime:'Exclusive Time',
-columnDuration:'Total Time'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-
-const HEADINGS=[
-{
-key:'url',
-itemType:'url',
-text:str_(UIStrings.columnUrl)},
-
-{
-key:'selfTime',
-itemType:'ms',
-text:str_(UIStrings.columnSelfTime),
-granularity:1},
-
-{
-key:'duration',
-itemType:'ms',
-text:str_(UIStrings.columnDuration),
-granularity:1}];
-
-
-
-
-
-
-
-class BottleneckRequests extends Audit{
-
-
-
-
-static get meta(){
-return{
-id:'bottleneck-requests',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['devtoolsLogs','traces']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-
-const waterfall=
-(await computeAdRequestWaterfall(trace,devtoolsLog,context)).
-filter(r=>r.startTime>0);
-if(!waterfall.length){
-return auditNotApplicable.NoAdRelatedReq;
-}
-const CRITICAL_SELF_TIME_MS=250;
-const CRITICAL_DURATION_MS=1000;
-
-const isBottleneck=r=>
-r.selfTime>CRITICAL_SELF_TIME_MS||r.duration>CRITICAL_DURATION_MS;
-
-
-const cost=r=>r.selfTime*3+r.duration;
-const criticalRequests=waterfall.
-filter(isBottleneck).
-sort((a,b)=>cost(b)-cost(a)).
-
-slice(0,5);
-const blockedTime=
-
-criticalRequests.reduce((sum,r)=>sum+r.selfTime,0)/1000;
-const failed=blockedTime*1e3>CRITICAL_SELF_TIME_MS*4;
-
-for(const row of criticalRequests){
-delete row.record;
-}
-return{
-numericValue:criticalRequests.length,
-score:failed?0:1,
-displayValue:failed?str_(UIStrings.displayValue,{blockedTime}):'',
-details:
-BottleneckRequests.makeTableDetails(HEADINGS,criticalRequests)};
-
-}}
-
-
-module.exports=BottleneckRequests;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/bottleneck-requests.js");
-},{"../messages/common-strings":132,"../utils/graph":137,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/duplicate-tags":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
-const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
-const{auditNotApplicable}=require('../messages/common-strings');
-const{Audit}=require('lighthouse');
-const{containsAnySubstring}=require('../utils/resource-classification');
-const{URL}=require('url');
-
-const UIStrings={
-title:'No duplicate tags found in any frame',
-failureTitle:'Load tags only once per frame',
-description:'Loading a tag more than once in the same frame is redundant '+
-'and adds overhead without benefit. [Learn more]('+
-'https://developers.google.com/publisher-ads-audits/reference/audits/duplicate-tags'+
-').',
-failureDisplayValue:'{duplicateTags, plural, =1 {1 duplicate tag} other {# duplicate tags}}',
-columnScript:'Script',
-columnNumReqs:'Duplicate Requests',
-columnFrameId:'Frame ID'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-const tags=[
-'googletagservices.com/tag/js/gpt.js',
-'securepubads.g.doubleclick.net/tag/js/gpt.js',
-'pagead2.googlesyndication.com/pagead/js/adsbygoogle.js',
-'imasdk.googleapis.com/js/sdkloader/ima3.js',
-'google-analytics.com/analytics.js'];
-
-
-
-
-
-
-const HEADINGS=[
-{key:'script',itemType:'url',text:str_(UIStrings.columnScript)},
-{key:'numReqs',itemType:'text',text:str_(UIStrings.columnNumReqs)},
-{key:'frameId',itemType:'text',text:str_(UIStrings.columnFrameId)}];
-
-
-
-
-
-class DuplicateTags extends Audit{
-
-
-
-
-static get meta(){
-return{
-id:'duplicate-tags',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['devtoolsLogs']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const devtoolsLogs=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const networkRecords=await NetworkRecords.request(devtoolsLogs,context);
-const tagReqs=networkRecords.
-filter(record=>containsAnySubstring(record.url,tags));
-
-if(!tagReqs.length){
-return auditNotApplicable.NoTags;
-}
-
-const tagsByFrame={};
-tagReqs.forEach(record=>{
-const frameId=record.frameId||'';
-
-const script=new URL(record.url).pathname;
-if(!tagsByFrame[frameId]){
-tagsByFrame[frameId]={};
-}
-tagsByFrame[frameId][script]=
-tagsByFrame[frameId][script]?tagsByFrame[frameId][script]+1:1;
-});
-
-
-const dups=[];
-for(const frameId of Object.keys(tagsByFrame)){
-for(const script of Object.keys(tagsByFrame[frameId])){
-const numReqs=tagsByFrame[frameId][script];
-if(numReqs>1){
-dups.push({script,numReqs,frameId});
-}
-}
-}
-
-return{
-numericValue:dups.length,
-score:dups.length?0:1,
-details:DuplicateTags.makeTableDetails(HEADINGS,dups),
-displayValue:dups.length?
-str_(UIStrings.failureDisplayValue,{duplicateTags:dups.length}):
-''};
-
-}}
-
-
-module.exports=DuplicateTags;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/duplicate-tags.js");
-},{"../messages/common-strings":132,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/lib/i18n/i18n":66,"url":"url"}],"lighthouse-plugin-publisher-ads/audits/first-ad-render":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const ComputedAdRenderTime=require('../computed/ad-render-time');
-const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
-const{auditNotApplicable,runWarning}=require('../messages/common-strings');
-const{Audit}=require('lighthouse');
-
-const UIStrings={
-title:'Latency of first ad render',
-failureTitle:'Reduce time to render first ad',
-description:'This metric measures the time for the first ad iframe to '+
-'render from page navigation. [Learn more]('+
-'https://developers.google.com/publisher-ads-audits/reference/audits/metrics'+
-').',
-displayValue:'{timeInMs, number, seconds} s'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-const PODR=2700;
-const MEDIAN=3700;
-
-
-
-
-class FirstAdRender extends Audit{
-
-
-
-
-static get meta(){
-
-return{
-id:'first-ad-render',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-
-scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-
-requiredArtifacts:['devtoolsLogs','traces']};
-
-}
-
-
-
-
-
-static async audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const metricData={
-devtoolsLog,
-trace,
-settings:context.settings};
-
-const{timing}=await ComputedAdRenderTime.request(metricData,context);
-
-if(!(timing>0)){
-context.LighthouseRunWarnings.push(runWarning.NoAdRendered);
-return auditNotApplicable.NoAdRendered;
-}
-
-let normalScore=
-Audit.computeLogNormalScore(timing,PODR,MEDIAN);
-if(normalScore>=0.9)normalScore=1;
-
-return{
-numericValue:timing*1e-3,
-score:normalScore,
-displayValue:
-str_(UIStrings.displayValue,{timeInMs:timing})};
-
-}}
-
-module.exports=FirstAdRender;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/first-ad-render.js");
-},{"../computed/ad-render-time":127,"../messages/common-strings":132,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/full-width-slots":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
-const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
-const{auditNotApplicable}=require('../messages/common-strings');
-const{Audit}=require('lighthouse');
-const{isAdRequest}=require('../utils/resource-classification');
-const{URL}=require('url');
-
-const UIStrings={
-title:'Ad slots effectively use horizontal space',
-failureTitle:'Increase the width of ad slots',
-description:'Ad slots that utilize most of the page width generally '+
-'experience increased click-through rate over smaller ad sizes. We '+
-'recommend leaving no more than 25% of the viewport width unutilized on '+
-'mobile devices.',
-failureDisplayValue:'{percentUnused, number, percent} of viewport width '+
-'is underutilized'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-class FullWidthSlots extends Audit{
-
-
-
-
-static get meta(){
-return{
-id:'full-width-slots',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['ViewportDimensions','devtoolsLogs']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const devtoolsLogs=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const networkRecords=await NetworkRecords.request(devtoolsLogs,context);
-const viewport=artifacts.ViewportDimensions;
-const vpWidth=viewport.innerWidth;
-
-
-const adRequestUrls=networkRecords.
-filter(isAdRequest).
-map(record=>new URL(record.url));
-
-if(!adRequestUrls.length){
-return auditNotApplicable.NoAds;
-}
-
-const sizeArrs=adRequestUrls.map(url=>
-url.searchParams.get('prev_iu_szs')||url.searchParams.get('sz'));
-
-
-
-const sizes=sizeArrs.join('|').split(/[|,]/);
-
-const widths=sizes.map(size=>parseInt(size.split('x')[0])).
-filter(w=>w<=vpWidth&&w>1);
-
-if(!widths.length){
-return auditNotApplicable.NoValidAdWidths;
-}
-
-const maxWidth=Math.max(...widths);
-
-const pctUnoccupied=1-maxWidth/vpWidth;
-
-const score=pctUnoccupied>.25?0:1;
-
-
-return{
-score,
-numericValue:pctUnoccupied,
-
-displayValue:score?
-'':
-str_(UIStrings.failureDisplayValue,{percentUnused:pctUnoccupied})};
-
-}}
-
-
-module.exports=FullWidthSlots;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/full-width-slots.js");
-},{"../messages/common-strings":132,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/lib/i18n/i18n":66,"url":"url"}],"lighthouse-plugin-publisher-ads/audits/gpt-bids-parallel":[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
-const{assert}=require('../utils/asserts');
-const{auditNotApplicable}=require('../messages/common-strings');
-const{Audit}=require('lighthouse');
-const{getCriticalGraph}=require('../utils/graph');
-const{getTimingsByRecord}=require('../utils/network-timing');
-const{isGptImplTag,isBidRequest,getAbbreviatedUrl,getHeaderBidder}=require('../utils/resource-classification');
-
-
-
-
-const id='gpt-bids-parallel';
-const UIStrings={
-title:'GPT and bids loaded in parallel',
-failureTitle:'Load GPT and bids in parallel',
-description:'To optimize ad loading, bid requests should not wait on GPT to load. This issue can often be fixed by making sure that bid requests do not wait on `googletag.pubadsReady` or `googletag.cmd.push`.',
-columnBidder:'Bidder',
-columnUrl:'URL',
-columnStartTime:'Start',
-columnDuration:'Duration'};
-
-
-
-
-
-
-const HEADINGS=[
-{key:'bidder',itemType:'text',text:UIStrings.columnBidder},
-{key:'url',itemType:'url',text:UIStrings.columnUrl},
-{key:'startTime',itemType:'ms',text:UIStrings.columnStartTime},
-{key:'duration',itemType:'ms',text:UIStrings.columnDuration}];
-
-
-
-
-
-class GptBidsInParallel extends Audit{
-
-
-
-
-static get meta(){
-return{
-id,
-title:UIStrings.title,
-failureTitle:UIStrings.failureTitle,
-description:UIStrings.description,
-requiredArtifacts:['devtoolsLogs','traces']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const network=await NetworkRecords.request(devtoolsLog,context);
-
-const pubadsImpl=network.find(r=>isGptImplTag(r.url));
-if(!pubadsImpl){
-return auditNotApplicable.NoGpt;
-}
-
-const bids=network.filter(isBidRequest).
-filter(b=>b.frameId==pubadsImpl.frameId);
-if(!bids.length){
-return auditNotApplicable.NoBids;
-}
-
-
-const timingsByRecord=await getTimingsByRecord(
-trace,devtoolsLog,context);
-const tableView=[];
-const seen=new Set();
-for(const bid of bids){
-if(getCriticalGraph(network,trace.traceEvents,bid).has(pubadsImpl)){
-const{startTime,endTime}=timingsByRecord.get(bid)||bid;
-const bidder=assert(getHeaderBidder(bid.url));
-if(seen.has(bidder)){
-
-
-continue;
-}
-seen.add(bidder);
-tableView.push({
-bidder,
-url:getAbbreviatedUrl(bid.url),
-startTime,
-duration:endTime-startTime});
-
-}
-}
-const failed=tableView.length>0;
-return{
-numericValue:tableView.length,
-score:failed?0:1,
-details:failed?
-GptBidsInParallel.makeTableDetails(HEADINGS,tableView):undefined};
-
-}}
-
-
-module.exports=GptBidsInParallel;
-module.exports.UIStrings=UIStrings;
-
-},{"../messages/common-strings":132,"../utils/asserts":134,"../utils/graph":137,"../utils/network-timing":138,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/computed/network-records":34}],"lighthouse-plugin-publisher-ads/audits/loads-ad-tag-over-https":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
-const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
-const{auditNotApplicable}=require('../messages/common-strings');
-const{Audit}=require('lighthouse');
-const{isAdTag}=require('../utils/resource-classification');
-const{URL}=require('url');
-
-const UIStrings={
-title:'Ad tag is loaded over HTTPS',
-failureTitle:'Load ad tag over HTTPS',
-description:'For privacy and security, always load GPT/AdSense over '+
-'HTTPS. Insecure pages should explicitly request the ad script securely. '+
-'GPT Example: `<script async '+
-'src=\"https://securepubads.g.doubleclick.net/tag/js/gpt.js\">` '+
-'AdSense Example: `<script async '+
-'src=\"https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\">`'+
-'. [Learn more]('+
-'https://developers.google.com/publisher-ads-audits/reference/audits/loads-ad-tag-over-https'+
-').'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-
-
-class LoadsAdTagOverHttps extends Audit{
-
-
-
-
-static get meta(){
-return{
-id:'loads-ad-tag-over-https',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['devtoolsLogs']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const devtoolsLogs=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const networkRecords=await NetworkRecords.request(devtoolsLogs,context);
-
-const pageReq=networkRecords.find(record=>record.statusCode==200);
-if(!pageReq){
-return auditNotApplicable.NoRecords;
-}
-
-const adRequests=networkRecords.
-filter(record=>isAdTag(new URL(record.url)));
-
-const secureAdRequests=adRequests.filter(request=>request.isSecure);
-
-
-const details={
-type:'debugdata',
-numAdTagHttpReqs:adRequests.length-secureAdRequests.length,
-numAdTagHttpsReqs:secureAdRequests.length};
-
-
-if(!adRequests.length){
-const returnVal=auditNotApplicable.NoTag;
-returnVal.details=details;
-return returnVal;
-}
-
-
-
-return{
-numericValue:details.numAdTagHttpReqs,
-score:details.numAdTagHttpReqs?0:1,
-details};
-
-}}
-
-
-module.exports=LoadsAdTagOverHttps;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/loads-ad-tag-over-https.js");
-},{"../messages/common-strings":132,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/lib/i18n/i18n":66,"url":"url"}],"lighthouse-plugin-publisher-ads/audits/loads-gpt-from-sgdn":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
-const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
-const{auditNotApplicable}=require('../messages/common-strings');
-const{Audit}=require('lighthouse');
-const{isGptTag}=require('../utils/resource-classification');
-const{URL}=require('url');
-
-const UIStrings={
-title:'GPT tag is loaded from recommended host',
-failureTitle:'Load GPT from recommended host',
-description:'Load GPT from \'securepubads.g.doubleclick.net\' to reduce '+
-'GPT load time. By loading GPT from the same host as ad requests, browsers '+
-'can avoid an additional DNS lookup and HTTP connection. Example:`'+
-'<script async src=\"https://securepubads.g.doubleclick.net/tag/js/gpt.js\">'+
-'`. [Learn more]('+
-'https://developers.google.com/publisher-ads-audits/reference/audits/loads-gpt-from-sgdn'+
-').'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-class LoadsGptFromSgdn extends Audit{
-
-
-
-
-static get meta(){
-return{
-id:'loads-gpt-from-sgdn',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['devtoolsLogs']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const networkRecords=await NetworkRecords.request(devtoolsLog,context);
-const gptUrl=networkRecords.map(r=>new URL(r.url)).find(isGptTag);
-if(!gptUrl){
-return auditNotApplicable.NoGpt;
-}
-return{
-score:Number(gptUrl.host==='securepubads.g.doubleclick.net')};
-
-}}
-
-
-module.exports=LoadsGptFromSgdn;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/loads-gpt-from-sgdn.js");
-},{"../messages/common-strings":132,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/lib/i18n/i18n":66,"url":"url"}],"lighthouse-plugin-publisher-ads/audits/script-injected-tags":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const array=require('../utils/array.js');
-const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
-const PageDependencyGraph=require('lighthouse/lighthouse-core/computed/page-dependency-graph');
-const{auditNotApplicable}=require('../messages/common-strings');
-const{Audit}=require('lighthouse');
-const{computeAdRequestWaterfall}=require('../utils/graph');
-const{getScriptEvaluationTimes}=require('../utils/network-timing');
-
-
-
-
-
-
-const MINIMUM_LOAD_TIME_MS=400;
-
-const UIStrings={
-title:'Ad scripts are loaded statically',
-failureTitle:'Load ad scripts statically',
-description:'Load the following scripts directly with '+
-'`<script async src=...>` instead of injecting scripts with JavaScript. '+
-'Doing so allows the browser to preload scripts sooner. [Learn more]('+
-'https://developers.google.com/publisher-ads-audits/reference/audits/script-injected-tags'+
-').',
-failureDisplayValue:'Load {tags, plural, =1 {1 script} other {# scripts}} statically',
-columnUrl:'Script',
-columnLoadTime:'Load Time'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-
-
-
-const HEADINGS=[
-{
-key:'url',
-itemType:'url',
-text:str_(UIStrings.columnUrl)},
-
-{
-key:'loadTime',
-itemType:'ms',
-granularity:1,
-text:str_(UIStrings.columnLoadTime)}];
-
-
-
-const STATICALLY_LOADABLE_TAGS=[
-/amazon-adsystem\.com\/aax2\/apstag.js/,
-/js-sec\.indexww\.com\/ht\/p\/.*\.js/,
-/pubads\.g\.doubleclick\.net\/tag\/js\/gpt\.js/,
-/static\.criteo\.net\/js\/.*\/publishertag\.js/,
-/www\.googletagservices\.com\/tag\/js\/gpt\.js/,
-/pagead2\.googlesyndication\.com\/pagead\/js\/adsbygoogle\.js/];
-
-
-
-
-
-
-
-
-
-
-function initiatedByInlineScript(record){
-if(record.initiator.type!=='script'){
-
-return false;
-}
-const initiators=PageDependencyGraph.getNetworkInitiators(record);
-if(initiators.length!==1||initiators[0]!==record.documentURL){
-
-return false;
-}
-return true;
-}
-
-
-
-
-
-
-
-async function findStaticallyLoadableTags(artifacts,context){
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-
-const tagReqs=[];
-
-
-
-const criticalRequests=
-await computeAdRequestWaterfall(trace,devtoolsLog,context);
-for(const{record}of criticalRequests){
-if(record.resourceType!=='Script'){
-
-continue;
-}
-if(initiatedByInlineScript(record)||
-STATICALLY_LOADABLE_TAGS.find(t=>record.url.match(t))){
-tagReqs.push(record);
-}
-}
-return tagReqs;
-}
-
-
-class StaticAdTags extends Audit{
-
-
-
-
-static get meta(){
-return{
-id:'script-injected-tags',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['devtoolsLogs','traces']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const tagReqs=await findStaticallyLoadableTags(artifacts,context);
-if(!tagReqs.length){
-return auditNotApplicable.NoTag;
-}
-
-const seenUrls=new Set();
-const tableView=[];
-
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const scriptTimes=
-await getScriptEvaluationTimes(trace,devtoolsLog,context);
-for(const tag of tagReqs){
-if(seenUrls.has(tag.url))continue;
-seenUrls.add(tag.url);
-const relatedTags=tagReqs.filter(t=>t.url===tag.url);
-
-const numStatic=array.count(
-relatedTags,t=>t.initiator.type==='parser'&&!t.isLinkPreload);
-if(numStatic===0){
-const loadTime=scriptTimes.get(tag.url)||0;
-if(loadTime<MINIMUM_LOAD_TIME_MS){
-continue;
-}
-tableView.push({
-url:tag.url,
-loadTime});
-
-}
-}
-tableView.sort((a,b)=>a.loadTime-b.loadTime);
-
-const failed=tableView.length>0;
-return{
-displayValue:failed?
-str_(UIStrings.failureDisplayValue,{tags:tableView.length}):'',
-score:Number(!failed),
-numericValue:tableView.length,
-details:StaticAdTags.makeTableDetails(HEADINGS,tableView)};
-
-}}
-
-
-module.exports=StaticAdTags;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/script-injected-tags.js");
-},{"../messages/common-strings":132,"../utils/array.js":133,"../utils/graph":137,"../utils/network-timing":138,"lighthouse":54,"lighthouse/lighthouse-core/computed/page-dependency-graph":35,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/serial-header-bidding":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const ComputedAdRequestTime=require('../computed/ad-request-time');
-const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
-const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
-const{auditNotApplicable}=require('../messages/common-strings');
-const{Audit}=require('lighthouse');
-const{bucket}=require('../utils/array');
-const{getTimingsByRecord}=require('../utils/network-timing');
-const{isCacheable}=require('../utils/network');
-const{isGoogleAds,getHeaderBidder,getAbbreviatedUrl}=require('../utils/resource-classification');
-const{URL}=require('url');
-
-
-
-
-const UIStrings={
-title:'Header bidding is parallelized',
-failureTitle:'Parallelize bid requests',
-description:'Send header bidding requests simultaneously, rather than '+
-'serially, to retrieve bids more quickly. [Learn more]('+
-'https://developers.google.com/publisher-ads-audits/reference/audits/serial-header-bidding'+
-').',
-columnBidder:'Bidder',
-columnUrl:'URL',
-columnStartTime:'Start',
-columnDuration:'Duration'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-const MIN_BID_DURATION=.05;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const HEADINGS=[
-{key:'bidder',itemType:'text',text:str_(UIStrings.columnBidder)},
-{key:'url',itemType:'url',text:str_(UIStrings.columnUrl)},
-{key:'startTime',itemType:'ms',text:str_(UIStrings.columnStartTime)},
-{key:'duration',itemType:'ms',text:str_(UIStrings.columnDuration)}];
-
-
-
-
-
-
-
-const RequestType={
-AD:'ad',
-BID:'bid',
-UNKNOWN:'unknown'};
-
-
-
-
-
-
-
-
-
-function constructRecords(records,recordType,timings){
-
-const results=[];
-for(const record of records){
-const timing=timings.get(record);
-if(!timing)continue;
-results.push(Object.assign({},timing,{
-url:getAbbreviatedUrl(record.url),
-type:recordType}));
-
-}
-return results;
-}
-
-
-
-
-
-
-function checkRecordType(record){
-if(isGoogleAds(new URL(record.url))){
-return RequestType.AD;
-}else if(getHeaderBidder(record.url)){
-return RequestType.BID;
-}else{
-return RequestType.UNKNOWN;
-}
-}
-
-
-
-
-
-
-
-function isPossibleBid(rec){
-return(rec.resourceSize==null||rec.resourceSize>0)&&
-rec.resourceType!='Image'&&
-rec.endTime-rec.startTime>=MIN_BID_DURATION&&
-!isCacheable(rec);
-}
-
-
-
-
-
-
-function clearQueryString(url){
-const u=new URL(url);
-delete u.search;
-return u.toString();
-}
-
-
-
-
-
-class SerialHeaderBidding extends Audit{
-
-
-
-
-static get meta(){
-return{
-id:'serial-header-bidding',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['devtoolsLogs','traces']};
-
-}
-
-
-
-
-
-
-static async audit(artifacts,context){
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const unfilteredNetworkRecords=
-await NetworkRecords.request(devtoolsLog,context);
-if(!unfilteredNetworkRecords.length){
-return auditNotApplicable.NoRecords;
-}
-
-const mainFrameId=unfilteredNetworkRecords[0].frameId;
-
-
-
-const networkRecords=unfilteredNetworkRecords.
-filter(isPossibleBid).
-filter(r=>r.frameId==mainFrameId);
-
-
-
-
-
-
-
-const recordsByType=bucket(networkRecords,checkRecordType);
-
-if(!recordsByType.has(RequestType.BID)){
-return auditNotApplicable.NoBids;
-}
-
-const metricData={trace,devtoolsLog,settings:context.settings};
-const{timing:adRequestTime}=
-await ComputedAdRequestTime.request(metricData,context);
-
-
-const timingsByRecord=await getTimingsByRecord(
-trace,devtoolsLog,context);
-
-const headerBiddingRecords=constructRecords(
-recordsByType.get(RequestType.BID)||[],RequestType.BID,
-timingsByRecord);
-
-let serialBids=[];
-let previousBid;
-
-
-for(const record of headerBiddingRecords){
-
-
-if(adRequestTime>0&&record.endTime>adRequestTime){
-continue;
-}
-record.bidder=getHeaderBidder(record.url);
-record.url=clearQueryString(record.url);
-
-if(previousBid&&record.startTime>=previousBid.endTime){
-serialBids.push(previousBid);
-serialBids.push(record);
-}
-
-if(!previousBid||record.endTime<previousBid.endTime||
-
-record.startTime>=previousBid.endTime){
-previousBid=record;
-}
-}
-
-
-serialBids=Array.from(new Set(serialBids));
-
-
-const hasSerialHeaderBidding=serialBids.length>1;
-return{
-numericValue:Number(hasSerialHeaderBidding),
-score:hasSerialHeaderBidding?0:1,
-details:hasSerialHeaderBidding?
-SerialHeaderBidding.makeTableDetails(HEADINGS,serialBids):undefined};
-
-}}
-
-
-module.exports=SerialHeaderBidding;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/serial-header-bidding.js");
-},{"../computed/ad-request-time":128,"../messages/common-strings":132,"../utils/array":133,"../utils/network":139,"../utils/network-timing":138,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/lib/i18n/i18n":66,"url":"url"}],"lighthouse-plugin-publisher-ads/audits/tag-load-time":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const ComputedTagLoadTime=require('../computed/tag-load-time');
-const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
-const{auditNotApplicable,runWarning}=require('../messages/common-strings');
-const{Audit}=require('lighthouse');
-
-const UIStrings={
-title:'Tag load time',
-failureTitle:'Reduce tag load time',
-description:'This metric measures the time for the ad tag\'s '+
-'implementation script (pubads_impl.js for GPT; adsbygoogle.js for '+
-'AdSense) to load after the page loads. [Learn more]('+
-'https://developers.google.com/publisher-ads-audits/reference/audits/metrics'+
-').',
-displayValue:'{timeInMs, number, seconds} s'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-const PODR=1000;
-const MEDIAN=2000;
-
-
-
-
-class TagLoadTime extends Audit{
-
-
-
-
-static get meta(){
-return{
-id:'tag-load-time',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-
-scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
-requiredArtifacts:['devtoolsLogs','traces']};
-
-}
-
-
-
-
-
-static async audit(artifacts,context){
-const trace=artifacts.traces[Audit.DEFAULT_PASS];
-const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
-const metricData={trace,devtoolsLog,settings:context.settings};
-
-const{timing}=await ComputedTagLoadTime.request(metricData,context);
-if(!(timing>0)){
-context.LighthouseRunWarnings.push(runWarning.NoTag);
-return auditNotApplicable.NoTag;
-}
-
-
-
-let normalScore=Audit.computeLogNormalScore(timing,PODR,MEDIAN);
-
-
-if(normalScore>=.9){
-normalScore=1;
-}
-
-return{
-numericValue:timing*1e-3,
-score:normalScore,
-displayValue:str_(UIStrings.displayValue,{timeInMs:timing})};
-
-}}
-
-module.exports=TagLoadTime;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/tag-load-time.js");
-},{"../computed/tag-load-time":131,"../messages/common-strings":132,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/viewport-ad-density":[function(require,module,exports){
-(function(__filename){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
-const{auditNotApplicable,auditError}=require('../messages/common-strings');
-const{Audit}=require('lighthouse');
-const{boxViewableArea}=require('../utils/geometry');
-const{isAdIframe}=require('../utils/resource-classification');
-
-const UIStrings={
-title:'Ad density in initial viewport is within recommended range',
-failureTitle:'Reduce ad density in initial viewport',
-description:'The ads-to-content ratio inside the viewport can have an '+
-'impact on user experience and ultimately user retention. The Better Ads '+
-'Standard [recommends having an ad density below 30%]'+
-'(https://www.betterads.org/mobile-ad-density-higher-than-30/). '+
-'[Learn more]('+
-'https://developers.google.com/publisher-ads-audits/reference/audits/viewport-ad-density'+
-').',
-displayValue:'{adDensity, number, percent} covered by ads'};
-
-
-const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
-
-
-class ViewportAdDensity extends Audit{
-
-
-
-
-static get meta(){
-return{
-id:'viewport-ad-density',
-title:str_(UIStrings.title),
-failureTitle:str_(UIStrings.failureTitle),
-description:str_(UIStrings.description),
-requiredArtifacts:['ViewportDimensions','IFrameElements']};
-
-}
-
-
-
-
-
-
-static audit(artifacts){
-const viewport=artifacts.ViewportDimensions;
-const slots=artifacts.IFrameElements.filter(
-slot=>isAdIframe(slot)&&
-slot.clientRect.width*slot.clientRect.height>1);
-
-if(!slots.length){
-return auditNotApplicable.NoVisibleSlots;
-}
-
-const adArea=slots.reduce((sum,slot)=>
-sum+boxViewableArea(slot.clientRect,viewport),0);
-
-const viewArea=viewport.innerWidth*viewport.innerHeight;
-
-if(viewArea<=0){
-throw new Error(auditError.ViewportAreaZero);
-}
-if(adArea>viewArea){
-throw new Error(auditError.AreaLargerThanViewport);
-}
-const adDensity=adArea/viewArea;
-const score=adDensity>0.3?0:1;
-return{
-score,
-numericValue:adArea/viewArea,
-displayValue:str_(UIStrings.displayValue,{adDensity})};
-
-}}
-
-
-module.exports=ViewportAdDensity;
-module.exports.UIStrings=UIStrings;
-
-}).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/viewport-ad-density.js");
-},{"../messages/common-strings":132,"../utils/geometry":136,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads":[function(require,module,exports){
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-const{group}=require('./messages/common-strings');
-
-const PLUGIN_PATH='lighthouse-plugin-publisher-ads';
-
-
-module.exports={
-audits:[
-{path:`${PLUGIN_PATH}/audits/ad-blocking-tasks`},
-{path:`${PLUGIN_PATH}/audits/ad-render-blocking-resources`},
-{path:`${PLUGIN_PATH}/audits/ad-request-critical-path`},
-{path:`${PLUGIN_PATH}/audits/bid-request-from-page-start`},
-{path:`${PLUGIN_PATH}/audits/ad-request-from-page-start`},
-{path:`${PLUGIN_PATH}/audits/ad-top-of-viewport`},
-{path:`${PLUGIN_PATH}/audits/ads-in-viewport`},
-{path:`${PLUGIN_PATH}/audits/async-ad-tags`},
-{path:`${PLUGIN_PATH}/audits/blocking-load-events`},
-{path:`${PLUGIN_PATH}/audits/bottleneck-requests`},
-{path:`${PLUGIN_PATH}/audits/duplicate-tags`},
-{path:`${PLUGIN_PATH}/audits/first-ad-render`},
-{path:`${PLUGIN_PATH}/audits/full-width-slots`},
-{path:`${PLUGIN_PATH}/audits/gpt-bids-parallel`},
-{path:`${PLUGIN_PATH}/audits/loads-gpt-from-sgdn`},
-{path:`${PLUGIN_PATH}/audits/loads-ad-tag-over-https`},
-{path:`${PLUGIN_PATH}/audits/script-injected-tags`},
-{path:`${PLUGIN_PATH}/audits/serial-header-bidding`},
-{path:`${PLUGIN_PATH}/audits/tag-load-time`},
-{path:`${PLUGIN_PATH}/audits/viewport-ad-density`}],
-
-groups:{
-'metrics':{
-title:group.Metrics},
-
-'ads-performance':{
-title:group.AdsPerformance},
-
-'ads-best-practices':{
-title:group.AdsBestPractices}},
-
-
-category:{
-title:'Publisher Ads [Beta]',
-auditRefs:[
-
-{id:'tag-load-time',weight:4,group:'metrics'},
-{id:'ad-request-from-page-start',weight:4,group:'metrics'},
-{id:'bid-request-from-page-start',weight:8,group:'metrics'},
-{id:'first-ad-render',weight:8,group:'metrics'},
-
-{id:'gpt-bids-parallel',weight:1,group:'ads-performance'},
-{id:'serial-header-bidding',weight:1,group:'ads-performance'},
-{id:'bottleneck-requests',weight:1,group:'ads-performance'},
-{id:'script-injected-tags',weight:1,group:'ads-performance'},
-{id:'blocking-load-events',weight:1,group:'ads-performance'},
-{id:'ad-render-blocking-resources',weight:1,group:'ads-performance'},
-{id:'ad-blocking-tasks',weight:1,group:'ads-performance'},
-{id:'ad-request-critical-path',weight:1,group:'ads-performance'},
-
-{id:'ads-in-viewport',weight:4,group:'ads-best-practices'},
-{id:'async-ad-tags',weight:2,group:'ads-best-practices'},
-{id:'loads-ad-tag-over-https',weight:1,group:'ads-best-practices'},
-{id:'loads-gpt-from-sgdn',weight:1,group:'ads-best-practices'},
-{id:'viewport-ad-density',weight:1,group:'ads-best-practices'},
-{id:'ad-top-of-viewport',weight:2,group:'ads-best-practices'},
-{id:'duplicate-tags',weight:1,group:'ads-best-practices'}]}};
-
-
-
-
-},{"./messages/common-strings":132}],"url":[function(require,module,exports){
-
-
-
-
-
-'use strict';
-
-
-
-
-
-
-
-const Util=require('../report/html/renderer/util.js');
-
-const allowedProtocols=[
-'https:','http:','chrome:','chrome-extension:'];
-
-
-
-
-
-
-
-
-
-function rewriteChromeInternalUrl(url){
-if(!url||!url.startsWith('chrome://'))return url;
-
-
-if(url.endsWith('/'))url=url.replace(/\/$/,'');
-return url.replace(/^chrome:\/\/chrome\//,'chrome://');
-}
-
-
-class URLShim extends URL{
-
-
-
-
-static isValid(url){
-try{
-new URL(url);
-return true;
-}catch(e){
-return false;
-}
-}
-
-
-
-
-
-
-static hostsMatch(urlA,urlB){
-try{
-return new URL(urlA).host===new URL(urlB).host;
-}catch(e){
-return false;
-}
-}
-
-
-
-
-
-
-static originsMatch(urlA,urlB){
-try{
-return new URL(urlA).origin===new URL(urlB).origin;
-}catch(e){
-return false;
-}
-}
-
-
-
-
-
-static getOrigin(url){
-try{
-const urlInfo=new URL(url);
-
-
-return urlInfo.host&&urlInfo.origin||null;
-}catch(e){
-return null;
-}
-}
-
-
-
-
-
-
-
-static rootDomainsMatch(urlA,urlB){
-let urlAInfo;
-let urlBInfo;
-try{
-urlAInfo=Util.createOrReturnURL(urlA);
-urlBInfo=Util.createOrReturnURL(urlB);
-}catch(err){
-return false;
-}
-
-if(!urlAInfo.hostname||!urlBInfo.hostname){
-return false;
-}
-
-
-const urlARootDomain=Util.getRootDomain(urlAInfo);
-const urlBRootDomain=Util.getRootDomain(urlBInfo);
-
-return urlARootDomain===urlBRootDomain;
-}
-
-
-
-
-
-
-static getURLDisplayName(url,options){
-return Util.getURLDisplayName(new URL(url),options);
-}
-
-
-
-
-
-
-static elideDataURI(url){
-try{
-const parsed=new URL(url);
-return parsed.protocol==='data:'?url.slice(0,100):url;
-}catch(e){
-return url;
-}
-}
-
-
-
-
-
-
-
-static equalWithExcludedFragments(url1,url2){
-[url1,url2]=[url1,url2].map(rewriteChromeInternalUrl);
-try{
-const urla=new URL(url1);
-urla.hash='';
-
-const urlb=new URL(url2);
-urlb.hash='';
-
-return urla.href===urlb.href;
-}catch(e){
-return false;
-}
-}
-
-
-
-
-
-
-static isProtocolAllowed(url){
-try{
-const parsed=new URL(url);
-return allowedProtocols.includes(parsed.protocol);
-}catch(e){
-return false;
-}
-}}
-
-
-URLShim.URL=URL;
-
-URLShim.NON_NETWORK_PROTOCOLS=['blob','data','intent'];
-
-URLShim.INVALID_URL_DEBUG_STRING=
-'Lighthouse was unable to determine the URL of some script executions. '+
-'It\'s possible a Chrome extension or other eval\'d code is the source.';
-
-module.exports=URLShim;
-
-},{"../report/html/renderer/util.js":87}]},{},[1]);
\ No newline at end of file
diff --git a/front_end/common/Settings.js b/front_end/common/Settings.js
index 72097a3..1d3836c 100644
--- a/front_end/common/Settings.js
+++ b/front_end/common/Settings.js
@@ -892,6 +892,40 @@
     }
   }
 
+  _updateVersionFrom28To29() {
+    /**
+     * @param {string} settingName
+     * @param {string} from
+     * @param {string} to
+     */
+    function renameKeyInObjectSetting(settingName, from, to) {
+      const setting = self.Common.settings.createSetting(settingName, {});
+      const value = setting.get();
+      if (from in value) {
+        value[to] = value[from];
+        delete value[from];
+        setting.set(value);
+      }
+    }
+
+    /**
+     * @param {string} settingName
+     * @param {string} from
+     * @param {string} to
+     */
+    function renameInStringSetting(settingName, from, to) {
+      const setting = self.Common.settings.createSetting(settingName, '');
+      const value = setting.get();
+      if (value === from) {
+        setting.set(to);
+      }
+    }
+
+    renameKeyInObjectSetting('panel-tabOrder', 'audits', 'lighthouse');
+    renameKeyInObjectSetting('panel-closeableTabs', 'audits', 'lighthouse');
+    renameInStringSetting('panel-selectedTab', 'audits', 'lighthouse');
+  }
+
   _migrateSettingsFromLocalStorage() {
     // This step migrates all the settings except for the ones below into the browser profile.
     const localSettings = new Set([
diff --git a/front_end/console_counters/WarningErrorCounter.js b/front_end/console_counters/WarningErrorCounter.js
index dcbd57c..1ee8ae6 100644
--- a/front_end/console_counters/WarningErrorCounter.js
+++ b/front_end/console_counters/WarningErrorCounter.js
@@ -25,7 +25,7 @@
 
     this._violationCounter = createElement('div');
     this._violationCounter.addEventListener('click', () => {
-      self.UI.viewManager.showView('audits');
+      self.UI.viewManager.showView('lighthouse');
     });
     const violationShadowRoot =
         UI.Utils.createShadowRootWithCoreStyles(this._violationCounter, 'console_counters/errorWarningCounter.css');
diff --git a/front_end/devtools_app.json b/front_end/devtools_app.json
index 521e12c..f53fe32 100644
--- a/front_end/devtools_app.json
+++ b/front_end/devtools_app.json
@@ -6,7 +6,7 @@
 
     { "name": "accessibility" },
     { "name": "animation" },
-    { "name": "audits" },
+    { "name": "lighthouse" },
     { "name": "browser_debugger" },
     { "name": "css_overview" },
     { "name": "cookie_table" },
diff --git a/front_end/externs.js b/front_end/externs.js
index 93a5f79..2c86b44 100644
--- a/front_end/externs.js
+++ b/front_end/externs.js
@@ -1171,22 +1171,15 @@
  */
 DetailsRenderer.OpportunitySummary;
 
-const Lighthouse = {};
-
-Lighthouse.ReportGenerator = {};
-
-/**
- * @param {!ReportRenderer.ReportJSON} lhr
- * @return {string}
- */
-Lighthouse.ReportGenerator.generateReportHtml;
-
-/**
- * @param {string} source
- * @param {Array<{search: string, replacement: string}>} replacements
- * @return {string}
- */
-Lighthouse.ReportGenerator.replaceStrings;
+const LighthouseReportGenerator = class {
+  /**
+   * @param {!ReportRenderer.ReportJSON} lhr
+   * @return {string}
+   */
+  generateReportHtml(lhr) {
+    return '';
+  }
+};
 
 /** @interface */
 class InspectorFrontendHostAPI {
diff --git a/front_end/host/UserMetrics.js b/front_end/host/UserMetrics.js
index bb6736b..361f182 100644
--- a/front_end/host/UserMetrics.js
+++ b/front_end/host/UserMetrics.js
@@ -140,10 +140,10 @@
   ChangeInspectedNodeInElementsPanel: 26,
   StyleRuleCopied: 27,
   CoverageStarted: 28,
-  AuditsStarted: 29,
-  AuditsFinished: 30,
+  LighthouseStarted: 29,
+  LighthouseFinished: 30,
   ShowedThirdPartyBadges: 31,
-  AuditsViewTrace: 32,
+  LighthouseViewTrace: 32,
   FilmStripStartedRecording: 33,
   CoverageReportFiltered: 34,
   CoverageStartedPerBlock: 35,
@@ -168,7 +168,7 @@
   'drawer-sources.search': 15,
   security: 16,
   js_profiler: 17,
-  audits: 18,
+  lighthouse: 18,
   'drawer-coverage': 19,
   'drawer-protocol-monitor': 20,
   'drawer-remote-devices': 21,
diff --git a/front_end/integration_test_runner.json b/front_end/integration_test_runner.json
index 0bdde12..e5fbd4a 100644
--- a/front_end/integration_test_runner.json
+++ b/front_end/integration_test_runner.json
@@ -6,7 +6,7 @@
 
     { "name": "accessibility_test_runner" },
     { "name": "application_test_runner" },
-    { "name": "audits_test_runner" },
+    { "name": "lighthouse_test_runner" },
     { "name": "axe_core_test_runner"},
     { "name": "bindings_test_runner" },
     { "name": "console_test_runner" },
diff --git a/front_end/langpacks/devtools_ui_strings.grd b/front_end/langpacks/devtools_ui_strings.grd
index e0e5abb..a6ca627 100644
--- a/front_end/langpacks/devtools_ui_strings.grd
+++ b/front_end/langpacks/devtools_ui_strings.grd
@@ -13,7 +13,7 @@
     <messages fallback_to_english="true">
       <part file="../accessibility/accessibility_strings.grdp" />
       <part file="../animation/animation_strings.grdp" />
-      <part file="../audits/audits_strings.grdp" />
+      <part file="../lighthouse/lighthouse_strings.grdp" />
       <part file="../bindings/bindings_strings.grdp" />
       <part file="../browser_debugger/browser_debugger_strings.grdp" />
       <part file="../browser_sdk/browser_sdk_strings.grdp" />
diff --git a/front_end/audits/AuditsController.js b/front_end/lighthouse/LighthouseController.js
similarity index 87%
rename from front_end/audits/AuditsController.js
rename to front_end/lighthouse/LighthouseController.js
index ec8992e..c951078 100644
--- a/front_end/audits/AuditsController.js
+++ b/front_end/lighthouse/LighthouseController.js
@@ -6,7 +6,7 @@
  * @implements {SDK.SDKModelObserver<!SDK.ServiceWorkerManager>}
  * @unrestricted
  */
-export class AuditController extends Common.Object {
+export class LighthouseController extends Common.Object {
   constructor(protocolService) {
     super();
 
@@ -129,7 +129,7 @@
       const result = await executionContext.evaluate(
           {
             expression: 'window.location.href',
-            objectGroup: 'audits',
+            objectGroup: 'lighthouse',
             includeCommandLineAPI: false,
             silent: false,
             returnByValue: true,
@@ -204,41 +204,41 @@
   }
 }
 
-/** @type {!Array.<!Audits.Preset>} */
+/** @type {!Array.<!Lighthouse.Preset>} */
 export const Presets = [
   // configID maps to Lighthouse's Object.keys(config.categories)[0] value
   {
-    setting: self.Common.settings.createSetting('audits.cat_perf', true),
+    setting: self.Common.settings.createSetting('lighthouse.cat_perf', true),
     configID: 'performance',
     title: ls`Performance`,
     description: ls`How long does this app take to show content and become usable`
   },
   {
-    setting: self.Common.settings.createSetting('audits.cat_pwa', true),
+    setting: self.Common.settings.createSetting('lighthouse.cat_pwa', true),
     configID: 'pwa',
     title: ls`Progressive Web App`,
     description: ls`Does this page meet the standard of a Progressive Web App`
   },
   {
-    setting: self.Common.settings.createSetting('audits.cat_best_practices', true),
+    setting: self.Common.settings.createSetting('lighthouse.cat_best_practices', true),
     configID: 'best-practices',
     title: ls`Best practices`,
     description: ls`Does this page follow best practices for modern web development`
   },
   {
-    setting: self.Common.settings.createSetting('audits.cat_a11y', true),
+    setting: self.Common.settings.createSetting('lighthouse.cat_a11y', true),
     configID: 'accessibility',
     title: ls`Accessibility`,
     description: ls`Is this page usable by people with disabilities or impairments`
   },
   {
-    setting: self.Common.settings.createSetting('audits.cat_seo', true),
+    setting: self.Common.settings.createSetting('lighthouse.cat_seo', true),
     configID: 'seo',
     title: ls`SEO`,
     description: ls`Is this page optimized for search engine results ranking`
   },
   {
-    setting: self.Common.settings.createSetting('audits.cat_pubads', false),
+    setting: self.Common.settings.createSetting('lighthouse.cat_pubads', false),
     plugin: true,
     configID: 'lighthouse-plugin-publisher-ads',
     title: ls`Publisher Ads`,
@@ -246,10 +246,10 @@
   },
 ];
 
-/** @type {!Array.<!Audits.RuntimeSetting>} */
+/** @type {!Array.<!Lighthouse.RuntimeSetting>} */
 export const RuntimeSettings = [
   {
-    setting: self.Common.settings.createSetting('audits.device_type', 'mobile'),
+    setting: self.Common.settings.createSetting('lighthouse.device_type', 'mobile'),
     description: ls`Apply mobile emulation during auditing`,
     setFlags: (flags, value) => {
       // See Audits.AuditsPanel._setupEmulationAndProtocolConnection()
@@ -262,17 +262,17 @@
   },
   {
     // This setting is disabled, but we keep it around to show in the UI.
-    setting: self.Common.settings.createSetting('audits.throttling', true),
+    setting: self.Common.settings.createSetting('lighthouse.throttling', true),
     title: ls`Simulated throttling`,
     // We will disable this when we have a Lantern trace viewer within DevTools.
     learnMore:
-        'https://github.com/GoogleChrome/lighthouse/blob/master/docs/throttling.md#devtools-audits-panel-throttling',
+        'https://github.com/GoogleChrome/lighthouse/blob/master/docs/throttling.md#devtools-lighthouse-panel-throttling',
     setFlags: (flags, value) => {
       flags.throttlingMethod = value ? 'simulate' : 'devtools';
     },
   },
   {
-    setting: self.Common.settings.createSetting('audits.clear_storage', true),
+    setting: self.Common.settings.createSetting('lighthouse.clear_storage', true),
     title: ls`Clear storage`,
     description: ls`Reset storage (localStorage, IndexedDB, etc) before auditing. (Good for performance & PWA testing)`,
     setFlags: (flags, value) => {
@@ -284,6 +284,6 @@
 export const Events = {
   PageAuditabilityChanged: Symbol('PageAuditabilityChanged'),
   AuditProgressChanged: Symbol('AuditProgressChanged'),
-  RequestAuditStart: Symbol('RequestAuditStart'),
-  RequestAuditCancel: Symbol('RequestAuditCancel'),
+  RequestLighthouseStart: Symbol('RequestLighthouseStart'),
+  RequestLighthouseCancel: Symbol('RequestLighthouseCancel'),
 };
diff --git a/front_end/audits/AuditsPanel.js b/front_end/lighthouse/LighthousePanel.js
similarity index 84%
rename from front_end/audits/AuditsPanel.js
rename to front_end/lighthouse/LighthousePanel.js
index 6bfd68c..8165055 100644
--- a/front_end/audits/AuditsPanel.js
+++ b/front_end/lighthouse/LighthousePanel.js
@@ -4,24 +4,24 @@
 
 import * as Common from '../common/common.js';  // eslint-disable-line no-unused-vars
 
-import {AuditController, Events} from './AuditsController.js';
-import {ProtocolService} from './AuditsProtocolService.js';
-import {AuditsReportRenderer, AuditsReportUIFeatures} from './AuditsReportRenderer.js';
-import {Item, ReportSelector} from './AuditsReportSelector.js';
-import {StartView} from './AuditsStartView.js';
-import {StatusView} from './AuditsStatusView.js';
+import {Events, LighthouseController} from './LighthouseController.js';
+import {ProtocolService} from './LighthouseProtocolService.js';
+import {LighthouseReportRenderer, LighthouseReportUIFeatures} from './LighthouseReportRenderer.js';
+import {Item, ReportSelector} from './LighthouseReportSelector.js';
+import {StartView} from './LighthouseStartView.js';
+import {StatusView} from './LighthouseStatusView.js';
 
 /**
  * @unrestricted
  */
-export class AuditsPanel extends UI.Panel {
+export class LighthousePanel extends UI.Panel {
   constructor() {
-    super('audits');
-    this.registerRequiredCSS('audits/lighthouse/report.css');
-    this.registerRequiredCSS('audits/auditsPanel.css');
+    super('lighthouse');
+    this.registerRequiredCSS('lighthouse/lighthouse/report.css');
+    this.registerRequiredCSS('lighthouse/lighthousePanel.css');
 
     this._protocolService = new ProtocolService();
-    this._controller = new AuditController(this._protocolService);
+    this._controller = new LighthouseController(this._protocolService);
     this._startView = new StartView(this._controller);
     this._statusView = new StatusView(this._controller);
 
@@ -29,16 +29,16 @@
     this._cachedRenderedReports = new Map();
 
     this._dropTarget = new UI.DropTarget(
-        this.contentElement, [UI.DropTarget.Type.File], Common.UIString.UIString('Drop audit file here'),
+        this.contentElement, [UI.DropTarget.Type.File], Common.UIString.UIString('Drop Lighthouse JSON here'),
         this._handleDrop.bind(this));
 
     this._controller.addEventListener(Events.PageAuditabilityChanged, this._refreshStartAuditUI.bind(this));
     this._controller.addEventListener(Events.AuditProgressChanged, this._refreshStatusUI.bind(this));
-    this._controller.addEventListener(Events.RequestAuditStart, this._startAudit.bind(this));
-    this._controller.addEventListener(Events.RequestAuditCancel, this._cancelAudit.bind(this));
+    this._controller.addEventListener(Events.RequestLighthouseStart, this._startLighthouse.bind(this));
+    this._controller.addEventListener(Events.RequestLighthouseCancel, this._cancelLighthouse.bind(this));
 
     this._renderToolbar();
-    this._auditResultsElement = this.contentElement.createChild('div', 'audits-results-container');
+    this._auditResultsElement = this.contentElement.createChild('div', 'lighthouse-results-container');
     this._renderStartView();
 
     this._controller.recomputePageAuditability();
@@ -76,9 +76,9 @@
   }
 
   _renderToolbar() {
-    const auditsToolbarContainer = this.element.createChild('div', 'audits-toolbar-container');
+    const lighthouseToolbarContainer = this.element.createChild('div', 'lighthouse-toolbar-container');
 
-    const toolbar = new UI.Toolbar('', auditsToolbarContainer);
+    const toolbar = new UI.Toolbar('', lighthouseToolbarContainer);
 
     this._newButton = new UI.ToolbarButton(Common.UIString.UIString('Perform an audit\u2026'), 'largeicon-add');
     toolbar.appendToolbarItem(this._newButton);
@@ -95,14 +95,14 @@
 
     this._settingsPane = new UI.HBox();
     this._settingsPane.show(this.contentElement);
-    this._settingsPane.element.classList.add('audits-settings-pane');
+    this._settingsPane.element.classList.add('lighthouse-settings-pane');
     this._settingsPane.element.appendChild(this._startView.settingsToolbar().element);
-    this._showSettingsPaneSetting = self.Common.settings.createSetting('auditsShowSettingsToolbar', false);
+    this._showSettingsPaneSetting = self.Common.settings.createSetting('lighthouseShowSettingsToolbar', false);
 
-    this._rightToolbar = new UI.Toolbar('', auditsToolbarContainer);
+    this._rightToolbar = new UI.Toolbar('', lighthouseToolbarContainer);
     this._rightToolbar.appendSeparator();
     this._rightToolbar.appendToolbarItem(
-        new UI.ToolbarSettingToggle(this._showSettingsPaneSetting, 'largeicon-settings-gear', ls`Audits settings`));
+        new UI.ToolbarSettingToggle(this._showSettingsPaneSetting, 'largeicon-settings-gear', ls`Lighthouse settings`));
     this._showSettingsPaneSetting.addChangeListener(this._updateSettingsPaneVisibility.bind(this));
     this._updateSettingsPaneVisibility();
 
@@ -126,7 +126,7 @@
     this._auditResultsElement.removeChildren();
     this._statusView.hide();
 
-    this._reportSelector.selectNewAudit();
+    this._reportSelector.selectNewReport();
     this.contentElement.classList.toggle('in-progress', false);
 
     this._startView.show(this.contentElement);
@@ -184,9 +184,9 @@
     const reportContainer = this._auditResultsElement.createChild('div', 'lh-vars lh-root lh-devtools');
 
     const dom = new DOM(/** @type {!Document} */ (this._auditResultsElement.ownerDocument));
-    const renderer = new AuditsReportRenderer(dom);
+    const renderer = new LighthouseReportRenderer(dom);
 
-    const templatesHTML = Root.Runtime.cachedResources['audits/lighthouse/templates.html'];
+    const templatesHTML = Root.Runtime.cachedResources['lighthouse/lighthouse/templates.html'];
     const templatesDOM = new DOMParser().parseFromString(templatesHTML, 'text/html');
     if (!templatesDOM) {
       return;
@@ -194,17 +194,17 @@
 
     renderer.setTemplateContext(templatesDOM);
     const el = renderer.renderReport(lighthouseResult, reportContainer);
-    AuditsReportRenderer.addViewTraceButton(el, artifacts);
+    LighthouseReportRenderer.addViewTraceButton(el, artifacts);
     // Linkifying requires the target be loaded. Do not block the report
     // from rendering, as this is just an embellishment and the main target
     // could take awhile to load.
     this._waitForMainTargetLoad().then(() => {
-      AuditsReportRenderer.linkifyNodeDetails(el);
-      AuditsReportRenderer.linkifySourceLocationDetails(el);
+      LighthouseReportRenderer.linkifyNodeDetails(el);
+      LighthouseReportRenderer.linkifySourceLocationDetails(el);
     });
-    AuditsReportRenderer.handleDarkMode(el);
+    LighthouseReportRenderer.handleDarkMode(el);
 
-    const features = new AuditsReportUIFeatures(dom);
+    const features = new LighthouseReportUIFeatures(dom);
     features.setBeforePrint(this._beforePrint.bind(this));
     features.setAfterPrint(this._afterPrint.bind(this));
     features.setTemplateContext(templatesDOM);
@@ -271,8 +271,8 @@
   /**
    * @param {!Common.EventTarget.EventTargetEvent} event
    */
-  async _startAudit(event) {
-    Host.userMetrics.actionTaken(Host.UserMetrics.Action.AuditsStarted);
+  async _startLighthouse(event) {
+    Host.userMetrics.actionTaken(Host.UserMetrics.Action.LighthouseStarted);
 
     try {
       const inspectedURL = await this._controller.getInspectedURL({force: true});
@@ -295,7 +295,7 @@
         throw new Error('Auditing failed to produce a result');
       }
 
-      Host.userMetrics.actionTaken(Host.UserMetrics.Action.AuditsFinished);
+      Host.userMetrics.actionTaken(Host.UserMetrics.Action.LighthouseFinished);
 
       await this._resetEmulationAndProtocolConnection();
       this._buildReportUI(lighthouseResponse.lhr, lighthouseResponse.artifacts);
@@ -313,7 +313,7 @@
     }
   }
 
-  async _cancelAudit() {
+  async _cancelLighthouse() {
     this._statusView.updateStatus(ls`Cancelling`);
     await this._resetEmulationAndProtocolConnection();
     this._renderStartView();
diff --git a/front_end/audits/AuditsProtocolService.js b/front_end/lighthouse/LighthouseProtocolService.js
similarity index 83%
rename from front_end/audits/AuditsProtocolService.js
rename to front_end/lighthouse/LighthouseProtocolService.js
index 14d8f96..4290ede 100644
--- a/front_end/audits/AuditsProtocolService.js
+++ b/front_end/lighthouse/LighthouseProtocolService.js
@@ -61,14 +61,15 @@
   }
 
   _initWorker() {
-    this._backendPromise = Services.serviceManager.createAppService('audits_worker', 'AuditsService').then(backend => {
-      if (this._backend) {
-        return;
-      }
-      this._backend = backend;
-      this._backend.on('statusUpdate', result => this._status(result.message));
-      this._backend.on('sendProtocolMessage', result => this._sendProtocolMessage(result.message));
-    });
+    this._backendPromise =
+        Services.serviceManager.createAppService('lighthouse_worker', 'LighthouseService').then(backend => {
+          if (this._backend) {
+            return;
+          }
+          this._backend = backend;
+          this._backend.on('statusUpdate', result => this._status(result.message));
+          this._backend.on('sendProtocolMessage', result => this._sendProtocolMessage(result.message));
+        });
   }
 
   /**
diff --git a/front_end/audits/AuditsReportRenderer.js b/front_end/lighthouse/LighthouseReportRenderer.js
similarity index 92%
rename from front_end/audits/AuditsReportRenderer.js
rename to front_end/lighthouse/LighthouseReportRenderer.js
index a6f77af..c31dd2b 100644
--- a/front_end/audits/AuditsReportRenderer.js
+++ b/front_end/lighthouse/LighthouseReportRenderer.js
@@ -7,7 +7,7 @@
 /**
  * @override
  */
-export class AuditsReportRenderer extends ReportRenderer {
+export class LighthouseReportRenderer extends ReportRenderer {
   /**
    * @param {!Element} el Parent element to render the report into.
    * @param {!ReportRenderer.RunnerResultArtifacts=} artifacts
@@ -29,7 +29,7 @@
     container.insertBefore(timelineButton, columnsEl.nextSibling);
 
     async function onViewTraceClick() {
-      Host.userMetrics.actionTaken(Host.UserMetrics.Action.AuditsViewTrace);
+      Host.userMetrics.actionTaken(Host.UserMetrics.Action.LighthouseViewTrace);
       await self.UI.inspectorView.showPanel('timeline');
       Timeline.TimelinePanel.instance().loadFromEvents(defaultPassTrace.traceEvents);
     }
@@ -100,7 +100,7 @@
 /**
  * @override
  */
-export class AuditsReportUIFeatures extends ReportUIFeatures {
+export class LighthouseReportUIFeatures extends ReportUIFeatures {
   /**
    * @param {!DOM} dom
    */
@@ -153,11 +153,11 @@
     const clonedReport = document.querySelector('.lh-root').cloneNode(true /* deep */);
     const printWindow = window.open('', '_blank', 'channelmode=1,status=1,resizable=1');
     const style = printWindow.document.createElement('style');
-    style.textContent = Root.Runtime.cachedResources['audits/lighthouse/report.css'];
+    style.textContent = Root.Runtime.cachedResources['lighthouse/lighthouse/report.css'];
     printWindow.document.head.appendChild(style);
     printWindow.document.body.replaceWith(clonedReport);
     // Linkified nodes are shadow elements, which aren't exposed via `cloneNode`.
-    await AuditsReportRenderer.linkifyNodeDetails(clonedReport);
+    await LighthouseReportRenderer.linkifyNodeDetails(clonedReport);
 
     if (this._beforePrint) {
       this._beforePrint();
diff --git a/front_end/audits/AuditsReportSelector.js b/front_end/lighthouse/LighthouseReportSelector.js
similarity index 80%
rename from front_end/audits/AuditsReportSelector.js
rename to front_end/lighthouse/LighthouseReportSelector.js
index 0eddc83..0639fde 100644
--- a/front_end/audits/AuditsReportSelector.js
+++ b/front_end/lighthouse/LighthouseReportSelector.js
@@ -3,10 +3,10 @@
 // found in the LICENSE file.
 
 export class ReportSelector {
-  constructor(renderNewAuditView) {
-    this._renderNewAuditView = renderNewAuditView;
-    this._newAuditItem = createElement('option');
-    this._comboBox = new UI.ToolbarComboBox(this._handleChange.bind(this), ls`Reports`, 'audits-report');
+  constructor(renderNewLighthouseView) {
+    this._renderNewLighthouseView = renderNewLighthouseView;
+    this._newLighthouseItem = createElement('option');
+    this._comboBox = new UI.ToolbarComboBox(this._handleChange.bind(this), ls`Reports`, 'lighthouse-report');
     this._comboBox.setMaxWidth(180);
     this._comboBox.setMinWidth(140);
     this._itemByOptionElement = new Map();
@@ -17,10 +17,10 @@
     this._comboBox.selectElement().removeChildren();
 
     this._comboBox.setEnabled(false);
-    this._newAuditItem = createElement('option');
-    this._newAuditItem.label = Common.UIString('(new audit)');
-    this._comboBox.selectElement().appendChild(this._newAuditItem);
-    this._comboBox.select(this._newAuditItem);
+    this._newLighthouseItem = createElement('option');
+    this._newLighthouseItem.label = Common.UIString('(new report)');
+    this._comboBox.selectElement().appendChild(this._newLighthouseItem);
+    this._comboBox.select(this._newLighthouseItem);
   }
 
   /**
@@ -31,7 +31,7 @@
     if (item) {
       item.select();
     } else {
-      this._renderNewAuditView();
+      this._renderNewLighthouseView();
     }
   }
 
@@ -80,7 +80,7 @@
 
   clearAll() {
     for (const elem of this._comboBox.options()) {
-      if (elem === this._newAuditItem) {
+      if (elem === this._newLighthouseItem) {
         continue;
       }
 
@@ -91,8 +91,8 @@
     this._setEmptyState();
   }
 
-  selectNewAudit() {
-    this._comboBox.select(this._newAuditItem);
+  selectNewReport() {
+    this._comboBox.select(this._newLighthouseItem);
   }
 }
 
diff --git a/front_end/audits/AuditsStartView.js b/front_end/lighthouse/LighthouseStartView.js
similarity index 72%
rename from front_end/audits/AuditsStartView.js
rename to front_end/lighthouse/LighthouseStartView.js
index 0137ba2..7e6d6b2 100644
--- a/front_end/audits/AuditsStartView.js
+++ b/front_end/lighthouse/LighthouseStartView.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {AuditController, Events, Presets, RuntimeSettings} from './AuditsController.js';  // eslint-disable-line no-unused-vars
+import {Events, LighthouseController, Presets, RuntimeSettings} from './LighthouseController.js';  // eslint-disable-line no-unused-vars
 import {RadioSetting} from './RadioSetting.js';
 
 /**
@@ -10,11 +10,11 @@
  */
 export class StartView extends UI.Widget {
   /**
-   * @param {!AuditController} controller
+   * @param {!LighthouseController} controller
    */
   constructor(controller) {
     super();
-    this.registerRequiredCSS('audits/auditsStartView.css');
+    this.registerRequiredCSS('lighthouse/lighthouseStartView.css');
     this._controller = controller;
     this._settingsToolbar = new UI.Toolbar('');
     this._render();
@@ -57,7 +57,7 @@
     const control = new UI.ToolbarSettingCheckbox(runtimeSetting.setting, runtimeSetting.description);
     toolbar.appendToolbarItem(control);
     if (runtimeSetting.learnMore) {
-      const link = UI.XLink.create(runtimeSetting.learnMore, ls`Learn more`, 'audits-learn-more');
+      const link = UI.XLink.create(runtimeSetting.learnMore, ls`Learn more`, 'lighthouse-learn-more');
       link.style.padding = '5px';
       control.element.appendChild(link);
     }
@@ -69,7 +69,7 @@
   _populateFormControls(fragment) {
     // Populate the device type
     const deviceTypeFormElements = fragment.$('device-type-form-elements');
-    this._populateRuntimeSettingAsRadio('audits.device_type', ls`Device`, deviceTypeFormElements);
+    this._populateRuntimeSettingAsRadio('lighthouse.device_type', ls`Device`, deviceTypeFormElements);
 
     // Populate the categories
     const categoryFormElements = fragment.$('categories-form-elements');
@@ -78,7 +78,7 @@
       const formElements = preset.plugin ? pluginFormElements : categoryFormElements;
       preset.setting.setTitle(preset.title);
       const checkbox = new UI.ToolbarSettingCheckbox(preset.setting);
-      const row = formElements.createChild('div', 'vbox audits-launcher-row');
+      const row = formElements.createChild('div', 'vbox lighthouse-launcher-row');
       row.title = preset.description;
       row.appendChild(checkbox.element);
     }
@@ -89,13 +89,13 @@
   }
 
   _render() {
-    this._populateRuntimeSettingAsToolbarCheckbox('audits.clear_storage', this._settingsToolbar);
-    this._populateRuntimeSettingAsToolbarCheckbox('audits.throttling', this._settingsToolbar);
+    this._populateRuntimeSettingAsToolbarCheckbox('lighthouse.clear_storage', this._settingsToolbar);
+    this._populateRuntimeSettingAsToolbarCheckbox('lighthouse.throttling', this._settingsToolbar);
 
     this._startButton = UI.createTextButton(
         ls`Generate report`,
         () => this._controller.dispatchEventToListeners(
-            Events.RequestAuditStart,
+            Events.RequestLighthouseStart,
             /* keyboardInitiated */ UI.elementIsFocusedByKeyboard(this._startButton)),
         /* className */ '', /* primary */ true);
     this.setDefaultFocusedElement(this._startButton);
@@ -104,38 +104,38 @@
     `Identify and fix common problems that affect your site's performance, accessibility, and user experience.`;  // crbug.com/972969
 
     const fragment = UI.Fragment.build`
-      <div class="vbox audits-start-view">
+      <div class="vbox lighthouse-start-view">
         <header>
-          <div class="audits-logo"></div>
-          <div class="audits-start-button-container hbox">
+          <div class="lighthouse-logo"></div>
+          <div class="lighthouse-start-button-container hbox">
             ${this._startButton}
             </div>
-          <div $="help-text" class="audits-help-text hidden"></div>
-          <div class="audits-start-view-text">
+          <div $="help-text" class="lighthouse-help-text hidden"></div>
+          <div class="lighthouse-start-view-text">
             <span>${auditsDescription}</span>
             ${UI.XLink.create('https://developers.google.com/web/tools/lighthouse/', ls`Learn more`)}
           </div>
         </header>
         <form>
-          <div class="audits-form-categories">
-            <div class="audits-form-section">
-              <div class="audits-form-section-label">
+          <div class="lighthouse-form-categories">
+            <div class="lighthouse-form-section">
+              <div class="lighthouse-form-section-label">
                 ${ls`Categories`}
               </div>
-              <div class="audits-form-elements" $="categories-form-elements"></div>
+              <div class="lighthouse-form-elements" $="categories-form-elements"></div>
             </div>
-            <div class="audits-form-section">
-              <div class="audits-form-section-label">
-                <div class="audits-icon-label">${ls`Community Plugins (beta)`}</div>
+            <div class="lighthouse-form-section">
+              <div class="lighthouse-form-section-label">
+                <div class="lighthouse-icon-label">${ls`Community Plugins (beta)`}</div>
               </div>
-              <div class="audits-form-elements" $="plugins-form-elements"></div>
+              <div class="lighthouse-form-elements" $="plugins-form-elements"></div>
             </div>
           </div>
-          <div class="audits-form-section">
-            <div class="audits-form-section-label">
+          <div class="lighthouse-form-section">
+            <div class="lighthouse-form-section-label">
               ${ls`Device`}
             </div>
-            <div class="audits-form-elements" $="device-type-form-elements"></div>
+            <div class="lighthouse-form-elements" $="device-type-form-elements"></div>
           </div>
         </form>
       </div>
@@ -152,7 +152,7 @@
    */
   onResize() {
     const useNarrowLayout = this.contentElement.offsetWidth < 560;
-    const startViewEl = this.contentElement.querySelector('.audits-start-view');
+    const startViewEl = this.contentElement.querySelector('.lighthouse-start-view');
     startViewEl.classList.toggle('hbox', !useNarrowLayout);
     startViewEl.classList.toggle('vbox', useNarrowLayout);
   }
diff --git a/front_end/audits/AuditsStatusView.js b/front_end/lighthouse/LighthouseStatusView.js
similarity index 91%
rename from front_end/audits/AuditsStatusView.js
rename to front_end/lighthouse/LighthouseStatusView.js
index 6a6afe3..5014898 100644
--- a/front_end/audits/AuditsStatusView.js
+++ b/front_end/lighthouse/LighthouseStatusView.js
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {AuditController, Events, RuntimeSettings} from './AuditsController.js';  // eslint-disable-line no-unused-vars
+import {Events, LighthouseController, RuntimeSettings} from './LighthouseController.js';  // eslint-disable-line no-unused-vars
 
 export class StatusView {
   /**
-   * @param {!AuditController} controller
+   * @param {!LighthouseController} controller
    */
   constructor(controller) {
     this._controller = controller;
@@ -33,24 +33,25 @@
   }
 
   _render() {
-    const dialogRoot = UI.createShadowRootWithCoreStyles(this._dialog.contentElement, 'audits/auditsDialog.css');
-    const auditsViewElement = dialogRoot.createChild('div', 'audits-view vbox');
+    const dialogRoot =
+        UI.createShadowRootWithCoreStyles(this._dialog.contentElement, 'lighthouse/lighthouseDialog.css');
+    const lighthouseViewElement = dialogRoot.createChild('div', 'lighthouse-view vbox');
 
     const cancelButton = UI.createTextButton(ls`Cancel`, this._cancel.bind(this));
     const fragment = UI.Fragment.build`
-      <div class="audits-view vbox">
+      <div class="lighthouse-view vbox">
         <h2 $="status-header">Auditing your web page\u2026</h2>
-        <div class="audits-status vbox" $="status-view">
-          <div class="audits-progress-wrapper" $="progress-wrapper">
-            <div class="audits-progress-bar" $="progress-bar"></div>
+        <div class="lighthouse-status vbox" $="status-view">
+          <div class="lighthouse-progress-wrapper" $="progress-wrapper">
+            <div class="lighthouse-progress-bar" $="progress-bar"></div>
           </div>
-          <div class="audits-status-text" $="status-text"></div>
+          <div class="lighthouse-status-text" $="status-text"></div>
         </div>
         ${cancelButton}
       </div>
     `;
 
-    auditsViewElement.appendChild(fragment.element());
+    lighthouseViewElement.appendChild(fragment.element());
 
     this._statusView = fragment.$('status-view');
     this._statusHeader = fragment.$('status-header');
@@ -144,7 +145,7 @@
   }
 
   _cancel() {
-    this._controller.dispatchEventToListeners(Events.RequestAuditCancel);
+    this._controller.dispatchEventToListeners(Events.RequestLighthouseCancel);
   }
 
   /**
@@ -156,8 +157,8 @@
       return phase.message;
     }
 
-    const deviceType = RuntimeSettings.find(item => item.setting.name === 'audits.device_type').setting.get();
-    const throttling = RuntimeSettings.find(item => item.setting.name === 'audits.throttling').setting.get();
+    const deviceType = RuntimeSettings.find(item => item.setting.name === 'lighthouse.device_type').setting.get();
+    const throttling = RuntimeSettings.find(item => item.setting.name === 'lighthouse.throttling').setting.get();
     const match = LoadingMessages.find(item => {
       return item.deviceType === deviceType && item.throttling === throttling;
     });
@@ -178,7 +179,7 @@
       return;
     }
 
-    this._progressBar.className = 'audits-progress-bar';
+    this._progressBar.className = 'lighthouse-progress-bar';
   }
 
   _scheduleFastFactCheck() {
diff --git a/front_end/lighthouse/OWNERS b/front_end/lighthouse/OWNERS
new file mode 100644
index 0000000..adbdad6
--- /dev/null
+++ b/front_end/lighthouse/OWNERS
@@ -0,0 +1 @@
+file://LIGHTHOUSE_OWNERS
diff --git a/front_end/audits/RadioSetting.js b/front_end/lighthouse/RadioSetting.js
similarity index 100%
rename from front_end/audits/RadioSetting.js
rename to front_end/lighthouse/RadioSetting.js
diff --git a/front_end/lighthouse/lighthouse-legacy.js b/front_end/lighthouse/lighthouse-legacy.js
new file mode 100644
index 0000000..772c44a
--- /dev/null
+++ b/front_end/lighthouse/lighthouse-legacy.js
@@ -0,0 +1,32 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import * as LighthouseModule from './lighthouse.js';
+
+self.Lighthouse = self.Lighthouse || {};
+Lighthouse = Lighthouse || {};
+
+/** @type {!LighthouseReportGenerator} */
+Lighthouse.ReportGenerator;
+
+/**
+ * @constructor
+ */
+Lighthouse.LighthousePanel = LighthouseModule.LighthousePanel.LighthousePanel;
+
+/**
+ * @constructor
+ */
+Lighthouse.ReportSelector = LighthouseModule.LighthouseReportSelector.ReportSelector;
+
+/**
+* @constructor
+*/
+Lighthouse.StatusView = LighthouseModule.LighthouseStatusView.StatusView;
+
+/** @typedef {{setting: !Common.Setting, configID: string, title: string, description: string}} */
+Lighthouse.Preset;
+
+/** @typedef {{setting: !Common.Setting, description: string, setFlags: function(!Object, string), options: (!Array|undefined), title: (string|undefined)}} */
+Lighthouse.RuntimeSetting;
diff --git a/front_end/lighthouse/lighthouse.js b/front_end/lighthouse/lighthouse.js
new file mode 100644
index 0000000..06c0afb
--- /dev/null
+++ b/front_end/lighthouse/lighthouse.js
@@ -0,0 +1,26 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import './lighthouse/report.js';
+import './lighthouse/report-generator.js';
+
+import * as LighthouseController from './LighthouseController.js';
+import * as LighthousePanel from './LighthousePanel.js';
+import * as LighthouseProtocolService from './LighthouseProtocolService.js';
+import * as LighthouseReportRenderer from './LighthouseReportRenderer.js';
+import * as LighthouseReportSelector from './LighthouseReportSelector.js';
+import * as LighthouseStartView from './LighthouseStartView.js';
+import * as LighthouseStatusView from './LighthouseStatusView.js';
+import * as RadioSetting from './RadioSetting.js';
+
+export {
+  LighthouseController,
+  LighthousePanel,
+  LighthouseProtocolService,
+  LighthouseReportRenderer,
+  LighthouseReportSelector,
+  LighthouseStartView,
+  LighthouseStatusView,
+  RadioSetting,
+};
diff --git a/front_end/audits/lighthouse/LICENSE b/front_end/lighthouse/lighthouse/LICENSE
similarity index 100%
rename from front_end/audits/lighthouse/LICENSE
rename to front_end/lighthouse/lighthouse/LICENSE
diff --git a/front_end/audits/lighthouse/README.chromium b/front_end/lighthouse/lighthouse/README.chromium
similarity index 100%
rename from front_end/audits/lighthouse/README.chromium
rename to front_end/lighthouse/lighthouse/README.chromium
diff --git a/front_end/audits/lighthouse/report-generator.js b/front_end/lighthouse/lighthouse/report-generator.js
similarity index 96%
rename from front_end/audits/lighthouse/report-generator.js
rename to front_end/lighthouse/lighthouse/report-generator.js
index 289d239..2a35653 100644
--- a/front_end/audits/lighthouse/report-generator.js
+++ b/front_end/lighthouse/lighthouse/report-generator.js
@@ -23,16 +23,16 @@
 // is going to be OK.
 module.exports = {
   get REPORT_CSS() {
-    return cachedResources['audits/lighthouse/report.css'];
+    return cachedResources['lighthouse/lighthouse/report.css'];
   },
   get REPORT_JAVASCRIPT() {
-    return cachedResources['audits/lighthouse/report.js'];
+    return cachedResources['lighthouse/lighthouse/report.js'];
   },
   get REPORT_TEMPLATE() {
-    return cachedResources['audits/lighthouse/template.html'];
+    return cachedResources['lighthouse/lighthouse/template.html'];
   },
   get REPORT_TEMPLATES() {
-    return cachedResources['audits/lighthouse/templates.html'];
+    return cachedResources['lighthouse/lighthouse/templates.html'];
   },
 };
 
diff --git a/front_end/audits/lighthouse/report.css b/front_end/lighthouse/lighthouse/report.css
similarity index 100%
rename from front_end/audits/lighthouse/report.css
rename to front_end/lighthouse/lighthouse/report.css
diff --git a/front_end/audits/lighthouse/report.js b/front_end/lighthouse/lighthouse/report.js
similarity index 100%
rename from front_end/audits/lighthouse/report.js
rename to front_end/lighthouse/lighthouse/report.js
diff --git a/front_end/audits/lighthouse/template.html b/front_end/lighthouse/lighthouse/template.html
similarity index 100%
rename from front_end/audits/lighthouse/template.html
rename to front_end/lighthouse/lighthouse/template.html
diff --git a/front_end/audits/lighthouse/templates.html b/front_end/lighthouse/lighthouse/templates.html
similarity index 100%
rename from front_end/audits/lighthouse/templates.html
rename to front_end/lighthouse/lighthouse/templates.html
diff --git a/front_end/audits/auditsDialog.css b/front_end/lighthouse/lighthouseDialog.css
similarity index 85%
rename from front_end/audits/auditsDialog.css
rename to front_end/lighthouse/lighthouseDialog.css
index f768380..3071eb1 100644
--- a/front_end/audits/auditsDialog.css
+++ b/front_end/lighthouse/lighthouseDialog.css
@@ -4,7 +4,7 @@
  * found in the LICENSE file.
  */
 
-.audits-view {
+.lighthouse-view {
     --view-horizontal-margin: 20px;
     margin: 7px var(--view-horizontal-margin);
     flex: auto;
@@ -13,7 +13,7 @@
     max-width: 500px;
 }
 
-.audits-view h2 {
+.lighthouse-view h2 {
     color: #666;
     font-weight: bold;
     font-size: 14px;
@@ -22,20 +22,20 @@
     text-align: left;
 }
 
-.audits-view button {
+.lighthouse-view button {
     z-index: 10;
     margin-left: auto;
     margin-right: 0px;
 }
 
-.audits-status {
+.lighthouse-status {
     width: 100%;
     flex: auto;
     align-items: center;
     color: #666;
 }
 
-.audits-status-text {
+.lighthouse-status-text {
     text-align: center;
     min-height: 50px;
     margin-bottom: 10px;
@@ -45,14 +45,14 @@
     max-width: 100%;
 }
 
-.audits-status-text code {
+.lighthouse-status-text code {
     user-select: text;
     text-align: left;
     white-space: pre-wrap;
     overflow: auto;
 }
 
-.audits-progress-wrapper {
+.lighthouse-progress-wrapper {
     width: calc(100% + 2 * var(--view-horizontal-margin));
     height: 2px;
     background-color: #E1F5FE;
@@ -60,7 +60,7 @@
     margin: 10px;
 }
 
-.audits-progress-bar {
+.lighthouse-progress-bar {
     width: 0%;
     height: 100%;
     background: #039BE5;
@@ -75,12 +75,12 @@
     --progress-bar-auditing-percent: 95%;
 }
 
-.audits-progress-bar.errored {
+.lighthouse-progress-bar.errored {
     width: 100%;
     background: #E50303;
 }
 
-.audits-progress-bar.loading {
+.lighthouse-progress-bar.loading {
     animation-duration: var(--progress-bar-loading-duration);
     animation-name: progressBarLoading;
 }
@@ -90,7 +90,7 @@
   100% { width: var(--progress-bar-gathering-percent); }
 }
 
-.audits-progress-bar.gathering {
+.lighthouse-progress-bar.gathering {
     animation-duration: var(--progress-bar-gathering-duration);
     animation-name: progressBarGathering;
 }
@@ -100,7 +100,7 @@
   100% { width: var(--progress-bar-auditing-percent); }
 }
 
-.audits-progress-bar.auditing {
+.lighthouse-progress-bar.auditing {
     animation-duration: var(--progress-bar-auditing-duration);
     animation-name: progressBarAuditing;
 }
@@ -110,7 +110,7 @@
   100% { width: 99%; }
 }
 
-.audits-report-error {
+.lighthouse-report-error {
     display: block;
     margin-top: 5px;
 }
diff --git a/front_end/audits/auditsPanel.css b/front_end/lighthouse/lighthousePanel.css
similarity index 80%
rename from front_end/audits/auditsPanel.css
rename to front_end/lighthouse/lighthousePanel.css
index ac4bb85..e3e46d2 100644
--- a/front_end/audits/auditsPanel.css
+++ b/front_end/lighthouse/lighthousePanel.css
@@ -22,7 +22,7 @@
   margin: 10px;
 }
 
-.audits-results-container {
+.lighthouse-results-container {
     position: relative;
 }
 
@@ -32,19 +32,19 @@
   display: none !important;
 }
 
-.audits-settings-pane {
+.lighthouse-settings-pane {
   flex: none;
 }
 
-.audits-settings-pane .toolbar {
+.lighthouse-settings-pane .toolbar {
   flex: 1 1;
 }
 
-.audits-toolbar-container {
+.lighthouse-toolbar-container {
   display: flex;
   flex: none;
 }
 
-.audits-toolbar-container > :first-child {
+.lighthouse-toolbar-container > :first-child {
   flex: 1 1 auto;
 }
diff --git a/front_end/audits/auditsStartView.css b/front_end/lighthouse/lighthouseStartView.css
similarity index 62%
rename from front_end/audits/auditsStartView.css
rename to front_end/lighthouse/lighthouseStartView.css
index 6f93d2c..0ec0c98 100644
--- a/front_end/audits/auditsStartView.css
+++ b/front_end/lighthouse/lighthouseStartView.css
@@ -4,7 +4,7 @@
  * found in the LICENSE file.
  */
 
-.audits-start-view {
+.lighthouse-start-view {
   font-family: Roboto, sans-serif;
   font-size: var(--font-size);
   line-height: 18px;
@@ -17,99 +17,99 @@
   --report-font-family: Roboto, Helvetica, Arial, sans-serif;
 }
 
-.audits-start-view header {
+.lighthouse-start-view header {
   flex: 2 1;
   padding: 16px;
   display: grid;
   justify-items: center;
 }
 
-.audits-logo {
+.lighthouse-logo {
     width: 75px;
     height: 75px;
     flex-shrink: 0;
     background-repeat: no-repeat;
     background-size: contain;
-    background-image: url(Images/audits_logo.svg);
+    background-image: url(Images/lighthouse_logo.svg);
 }
 
-.audits-start-view-text {
+.lighthouse-start-view-text {
   margin: 0 40px;
   text-align: center;
 }
 
-.audits-start-view form {
+.lighthouse-start-view form {
   display: contents;
 }
 
-.audits-form-section {
+.lighthouse-form-section {
   padding: 8px;
   flex: 1 1;
 }
 
-.audits-start-view.vbox .audits-form-categories {
+.lighthouse-start-view.vbox .lighthouse-form-categories {
   border-top: 1px solid #ebebeb;
   border-bottom: 1px solid #ebebeb;
 }
 
-.audits-form-section-label {
+.lighthouse-form-section-label {
   margin: 7px 0 7px;
   font-weight: 500;
 }
 
-.audits-form-section input {
+.lighthouse-form-section input {
   margin-top: 0;
   margin-bottom: 0;
   margin-left: 0;
 }
 
-.audits-form-section-label i span {
+.lighthouse-form-section-label i span {
   position: relative;
   top: -2px;
 }
 
-.audits-form-section-label span.largeicon-checkmark {
+.lighthouse-form-section-label span.largeicon-checkmark {
   top: -4px;
 }
 
-.audits-radio {
+.lighthouse-radio {
   display: flex;
   align-items: center;
 }
 
-.audits-start-button-container {
+.lighthouse-start-button-container {
   align-items: center;
 }
 
-.audits-start-button-container button {
+.lighthouse-start-button-container button {
   margin: 8px auto;
   font-family: var(--report-font-family);
   font-weight: 500;
   font-size: var(--font-size);
 }
-.audits-start-button-container button:disabled {
+.lighthouse-start-button-container button:disabled {
   cursor: not-allowed;
 }
 
-.audits-start-view .toolbar-dropdown-arrow {
+.lighthouse-start-view .toolbar-dropdown-arrow {
   display: none;
 }
 
-.audits-launcher-row,
-.audits-radio {
+.lighthouse-launcher-row,
+.lighthouse-radio {
   margin-bottom: 6px;
 }
 
-.audits-launcher-row:last-of-type,
-.audits-radio:last-of-type {
+.lighthouse-launcher-row:last-of-type,
+.lighthouse-radio:last-of-type {
   margin-bottom: 0;
 }
 
-.audits-launcher-row .dimmed {
+.lighthouse-launcher-row .dimmed {
   padding-left: 22px;
 }
 
-.audits-help-text {
+.lighthouse-help-text {
   text-align: center;
   color: red;
   font-weight: bold;
diff --git a/front_end/audits/audits_strings.grdp b/front_end/lighthouse/lighthouse_strings.grdp
similarity index 78%
rename from front_end/audits/audits_strings.grdp
rename to front_end/lighthouse/lighthouse_strings.grdp
index 359b8b1..28c66a2 100644
--- a/front_end/audits/audits_strings.grdp
+++ b/front_end/lighthouse/lighthouse_strings.grdp
@@ -1,177 +1,177 @@
 <?xml version="1.0" encoding="utf-8"?>
 <grit-part>
-  <message name="IDS_DEVTOOLS_026d213afe4c17e37ac8306b77e9f870" desc="Text in Audits Status View">
+  <message name="IDS_DEVTOOLS_026d213afe4c17e37ac8306b77e9f870" desc="Text in Lighthouse Status View">
     Auditing your web page
   </message>
-  <message name="IDS_DEVTOOLS_0503ffa75a95f35877fe7420d061b6a9" desc="Text in Audits Controller">
+  <message name="IDS_DEVTOOLS_0503ffa75a95f35877fe7420d061b6a9" desc="Text in Lighthouse Controller">
     Progressive Web App
   </message>
-  <message name="IDS_DEVTOOLS_0f39dfdd740bf99080ca83e56e2cfb4c" desc="Text in Audits Status View">
+  <message name="IDS_DEVTOOLS_0f39dfdd740bf99080ca83e56e2cfb4c" desc="Text in Lighthouse Status View">
     💡 <ph name="THIS__FASTFACTSQUEUED_FASTFACTINDEX_">$1s<ex>75% of global mobile users in 2016 were on 2G or 3G [Source: GSMA Mobile]</ex></ph>
   </message>
-  <message name="IDS_DEVTOOLS_1076f1bac69647c846ac3b822b133518" desc="Fast fact in the pop-up dialog when lighthouse is running in the Audits panel">
+  <message name="IDS_DEVTOOLS_1076f1bac69647c846ac3b822b133518" desc="Fast fact in the pop-up dialog when lighthouse is running in the Lighthouse panel">
     The average user device costs less than 200 USD. [Source: <ph name="LOCKED_1">International Data Corporation</ph>]
   </message>
-  <message name="IDS_DEVTOOLS_161bf73e31de6b8e3d856815473cbe1c" desc="Text of the timeline button in Audits Report Renderer">
+  <message name="IDS_DEVTOOLS_161bf73e31de6b8e3d856815473cbe1c" desc="Text of the timeline button in Lighthouse Report Renderer">
     View Trace
   </message>
-  <message name="IDS_DEVTOOLS_169ece87d3c6b79c2c8d69892927857c" desc="Fast fact in the pop-up dialog when lighthouse is running in the Audits panel">
+  <message name="IDS_DEVTOOLS_169ece87d3c6b79c2c8d69892927857c" desc="Fast fact in the pop-up dialog when lighthouse is running in the Lighthouse panel">
     19 seconds is the average time a mobile web page takes to load on a 3G connection [Source: <ph name="LOCKED_1">Google DoubleClick blog</ph>]
   </message>
-  <message name="IDS_DEVTOOLS_17de62900ceac9101c8814b4c4874328" desc="Text in Audits Controller">
+  <message name="IDS_DEVTOOLS_17de62900ceac9101c8814b4c4874328" desc="Text in Lighthouse Controller">
     Apply mobile emulation during auditing
   </message>
-  <message name="IDS_DEVTOOLS_2046d43f4cc1f59c06f764da2ca2355a" desc="Status text in the Audits panel">
+  <message name="IDS_DEVTOOLS_1b6afe2c9d75a77ce44cca9a356bf3ef" desc="Text that appears when user drag and drop something (for example, a file) in Lighthouse Panel">
+    Drop Lighthouse JSON here
+  </message>
+  <message name="IDS_DEVTOOLS_2046d43f4cc1f59c06f764da2ca2355a" desc="Status text in the Lighthouse panel">
     The print popup window is open. Please close it to continue.
   </message>
-  <message name="IDS_DEVTOOLS_24e8ca2483129261096ba8ba0fbcd247" desc="Fast fact in the pop-up dialog when lighthouse is running in the Audits panel">
+  <message name="IDS_DEVTOOLS_24e8ca2483129261096ba8ba0fbcd247" desc="Fast fact in the pop-up dialog when lighthouse is running in the Lighthouse panel">
     70% of mobile pages take nearly 7 seconds for the visual content above the fold to display on the screen. [Source: <ph name="LOCKED_1">Think with Google</ph>]
   </message>
-  <message name="IDS_DEVTOOLS_2a96c07a6c11ca7add2b1ffde86efe25" desc="Text in Audits Controller">
+  <message name="IDS_DEVTOOLS_2a96c07a6c11ca7add2b1ffde86efe25" desc="Text in Lighthouse Controller">
     Can only audit HTTP/HTTPS pages and <ph name="LOCKED_1">Chrome</ph> extensions. Navigate to a different page to start an audit.
   </message>
-  <message name="IDS_DEVTOOLS_39680b3025b1f8d881f9d983623bf071" desc="Text in Audits Status View">
+  <message name="IDS_DEVTOOLS_39680b3025b1f8d881f9d983623bf071" desc="Text in Lighthouse Status View">
     <ph name="LOCKED_1">Lighthouse</ph> is loading your page
   </message>
-  <message name="IDS_DEVTOOLS_3b7e043f46813f1d8ffbd462eb77fb6c" desc="Text in Audits Controller">
+  <message name="IDS_DEVTOOLS_3b7e043f46813f1d8ffbd462eb77fb6c" desc="Text in Lighthouse Controller">
     How long does this app take to show content and become usable
   </message>
-  <message name="IDS_DEVTOOLS_43a6eb8709bea6ad1b8e128bf174d80e" desc="Help text in Audits Controller">
+  <message name="IDS_DEVTOOLS_43a6eb8709bea6ad1b8e128bf174d80e" desc="Help text in Lighthouse Controller">
     Is this page optimized for ad speed and quality
   </message>
-  <message name="IDS_DEVTOOLS_47e2dbd37d8d524f5c4105a96db27b59" desc="Fast fact in the pop-up dialog when lighthouse is running in the Audits panel">
+  <message name="IDS_DEVTOOLS_47e2dbd37d8d524f5c4105a96db27b59" desc="Fast fact in the pop-up dialog when lighthouse is running in the Lighthouse panel">
     75% of global mobile users in 2016 were on 2G or 3G [Source: <ph name="LOCKED_1">GSMA Mobile</ph>]
   </message>
-  <message name="IDS_DEVTOOLS_4ab5093468559edd5940ac59f1c6ac02" desc="Text in Audits Status View">
+  <message name="IDS_DEVTOOLS_4ab5093468559edd5940ac59f1c6ac02" desc="Text in Lighthouse Status View">
     Try to navigate to the URL in a fresh <ph name="LOCKED_1">Chrome</ph> profile without any other tabs or extensions open and try again.
   </message>
-  <message name="IDS_DEVTOOLS_55f562701dc2cc775f9adc0478644b2a" desc="Tooltip text that appears when hovering over the largeicon add button in the Audits Panel">
+  <message name="IDS_DEVTOOLS_55f562701dc2cc775f9adc0478644b2a" desc="Tooltip text that appears when hovering over the largeicon add button in the Lighthouse Panel">
     Perform an audit…
   </message>
-  <message name="IDS_DEVTOOLS_56395991012586c2067aa7bcb5905b50" desc="Text in Audits Panel">
+  <message name="IDS_DEVTOOLS_56395991012586c2067aa7bcb5905b50" desc="Text in Lighthouse Panel">
     Cancelling
   </message>
-  <message name="IDS_DEVTOOLS_56846b99d193dbbd252ddca10d29aff4" desc="Text when lighthouse is loading the page in the Audits panel">
+  <message name="IDS_DEVTOOLS_56846b99d193dbbd252ddca10d29aff4" desc="Text when lighthouse is loading the page in the Lighthouse panel">
     <ph name="LOCKED_1">Lighthouse</ph> is loading your page with throttling to measure performance on a mobile device on 3G.
   </message>
-  <message name="IDS_DEVTOOLS_5a73519018eaaacb7882caf8f0971ac1" desc="Fast fact in the pop-up dialog when lighthouse is running in the Audits panel">
+  <message name="IDS_DEVTOOLS_5a73519018eaaacb7882caf8f0971ac1" desc="Fast fact in the pop-up dialog when lighthouse is running in the Lighthouse panel">
     1MB takes a minimum of 5 seconds to download on a typical 3G connection [Source: <ph name="LOCKED_1">WebPageTest</ph> and <ph name="LOCKED_2">DevTools</ph> 3G definition].
   </message>
-  <message name="IDS_DEVTOOLS_5d800f971c3d02bf5accd5f205e31f2a" desc="Text for option to enable simulated throttling in Audits Panel">
+  <message name="IDS_DEVTOOLS_5d800f971c3d02bf5accd5f205e31f2a" desc="Text for option to enable simulated throttling in Lighthouse Panel">
     Simulated throttling
   </message>
-  <message name="IDS_DEVTOOLS_5f0c08bc61549e7455c9e8b46bfe9aa9" desc="Fast fact in the pop-up dialog when lighthouse is running in the Audits panel">
+  <message name="IDS_DEVTOOLS_5f0c08bc61549e7455c9e8b46bfe9aa9" desc="Fast fact in the pop-up dialog when lighthouse is running in the Lighthouse panel">
     70% of mobile pages weigh over 1MB, 36% over 2MB, and 12% over 4MB. [Source: <ph name="LOCKED_1">Think with Google</ph>]
   </message>
-  <message name="IDS_DEVTOOLS_64a64ca70e7a909a5a96c07082070bfc" desc="Text of a DOM element in Audits Status View">
+  <message name="IDS_DEVTOOLS_64a64ca70e7a909a5a96c07082070bfc" desc="Text of a DOM element in Lighthouse Status View">
     Ah, sorry! We ran into an error.
   </message>
-  <message name="IDS_DEVTOOLS_64d266bad80369458003a71a9e04dd50" desc="Text in Audits Status View">
+  <message name="IDS_DEVTOOLS_64d266bad80369458003a71a9e04dd50" desc="Text in Lighthouse Status View">
     Cancelling…
   </message>
-  <message name="IDS_DEVTOOLS_6556b7f666de143f5a9826e048d5dcd8" desc="Text in Audits Controller">
+  <message name="IDS_DEVTOOLS_6556b7f666de143f5a9826e048d5dcd8" desc="Text in Lighthouse Controller">
     Is this page usable by people with disabilities or impairments
   </message>
-  <message name="IDS_DEVTOOLS_6565973a762b83f476e9a76a0015b539" desc="Help text in Audits Controller">
+  <message name="IDS_DEVTOOLS_6565973a762b83f476e9a76a0015b539" desc="Help text in Lighthouse Controller">
     At least one category must be selected.
   </message>
-  <message name="IDS_DEVTOOLS_67aa731132e0e7bbabb1b3d3c363e7d6" desc="Help text in Audits Controller">
+  <message name="IDS_DEVTOOLS_67aa731132e0e7bbabb1b3d3c363e7d6" desc="Help text in Lighthouse Controller">
     Multiple tabs are being controlled by the same service worker. Close your other tabs on the same origin to audit this page.
   </message>
-  <message name="IDS_DEVTOOLS_6e394d18cb68d551f58fa35f4dfc70bb" desc="Fast fact in the pop-up dialog when lighthouse is running in the Audits panel">
+  <message name="IDS_DEVTOOLS_6e394d18cb68d551f58fa35f4dfc70bb" desc="Fast fact in the pop-up dialog when lighthouse is running in the Lighthouse panel">
     As page load time increases from one second to seven seconds, the probability of a mobile site visitor bouncing increases 113%. [Source: <ph name="LOCKED_1">Think with Google</ph>]
   </message>
-  <message name="IDS_DEVTOOLS_6e95267358acef2bcb448acc98374e79" desc="Tooltip text that appears when hovering over the largeicon settings gear in show settings pane setting in start view of the audits panel">
-    Audits settings
+  <message name="IDS_DEVTOOLS_d7d305befb5ff987deb149b9f4e197d6" desc="Tooltip text that appears when hovering over the largeicon settings gear in show settings pane setting in start view of the audits panel">
+    Lighthouse settings
   </message>
-  <message name="IDS_DEVTOOLS_6f4495ebc9e34bfc4a7748c568ddd6f0" desc="Text in Audits Status View">
+  <message name="IDS_DEVTOOLS_6f4495ebc9e34bfc4a7748c568ddd6f0" desc="Text in Lighthouse Status View">
     Community Plugins (beta)
   </message>
-  <message name="IDS_DEVTOOLS_72c4a2e545d220fd8c9ead876a59a89d" desc="Text in Audits Controller">
+  <message name="IDS_DEVTOOLS_72c4a2e545d220fd8c9ead876a59a89d" desc="Text in Lighthouse Controller">
     Is this page optimized for search engine results ranking
   </message>
-  <message name="IDS_DEVTOOLS_73351c316c7866b1c5730af9c82b5ab3" desc="Text when lighthouse is loading the page in the Audits panel">
+  <message name="IDS_DEVTOOLS_73351c316c7866b1c5730af9c82b5ab3" desc="Text when lighthouse is loading the page in the Lighthouse panel">
     <ph name="LOCKED_1">Lighthouse</ph> is loading your page with throttling to measure performance on a slow desktop on 3G.
   </message>
-  <message name="IDS_DEVTOOLS_7387b82b5b5cbc317147961ff45142c5" desc="Fast fact in the pop-up dialog when lighthouse is running in the Audits panel">
+  <message name="IDS_DEVTOOLS_7387b82b5b5cbc317147961ff45142c5" desc="Fast fact in the pop-up dialog when lighthouse is running in the Lighthouse panel">
     Walmart saw a 1% increase in revenue for every 100ms improvement in page load [Source: <ph name="LOCKED_1">WPO Stats</ph>]
   </message>
-  <message name="IDS_DEVTOOLS_77d52e376f0c781e4f0d908f6d0b7ff2" desc="Fast fact in the pop-up dialog when lighthouse is running in the Audits panel">
+  <message name="IDS_DEVTOOLS_77d52e376f0c781e4f0d908f6d0b7ff2" desc="Fast fact in the pop-up dialog when lighthouse is running in the Lighthouse panel">
     <ph name="LOCKED_1">Lighthouse</ph> only simulates mobile performance; to measure performance on a real device, try WebPageTest.org [Source: <ph name="LOCKED_2">Lighthouse</ph> team]
   </message>
-  <message name="IDS_DEVTOOLS_78b8123c78d60b80d6a09618ad56c2cb" desc="Fast fact in the pop-up dialog when lighthouse is running in the Audits panel">
+  <message name="IDS_DEVTOOLS_78b8123c78d60b80d6a09618ad56c2cb" desc="Fast fact in the pop-up dialog when lighthouse is running in the Lighthouse panel">
     Rebuilding Pinterest pages for performance increased conversion rates by 15% [Source: <ph name="LOCKED_1">WPO Stats</ph>]
   </message>
-  <message name="IDS_DEVTOOLS_7bd1e4f7363173e2c8329551ca4d38cc" desc="New audit item label in Audits Report Selector">
-    (new audit)
+  <message name="IDS_DEVTOOLS_85856bb9b2517851d533ea44be65efc2" desc="New report item label in Lighthouse Report Selector">
+    (new report)
   </message>
-  <message name="IDS_DEVTOOLS_88450f419690173d62fb0a30fb29a951" desc="Text in Audits Status View">
+  <message name="IDS_DEVTOOLS_88450f419690173d62fb0a30fb29a951" desc="Text in Lighthouse Status View">
     Auditing <ph name="PAGEHOST">$1s<ex>github.com</ex></ph>
   </message>
-  <message name="IDS_DEVTOOLS_8eb7115e5b4ba55f56931ec24c789f9e" desc="Text in Audits Status View">
+  <message name="IDS_DEVTOOLS_8eb7115e5b4ba55f56931ec24c789f9e" desc="Text in Lighthouse Status View">
     <ph name="LOCKED_1">Lighthouse</ph> is warming up…
   </message>
-  <message name="IDS_DEVTOOLS_8fe967af0fb77d0261a6ead91bcd607f" desc="Text in Audits Controller">
+  <message name="IDS_DEVTOOLS_8fe967af0fb77d0261a6ead91bcd607f" desc="Text in Lighthouse Controller">
     Reset storage (localStorage, IndexedDB, etc) before auditing. (Good for performance &amp; PWA testing)
   </message>
-  <message name="IDS_DEVTOOLS_9103edac10b1749db57ca27386ff29dc" desc="Text when lighthouse is loading the page in the Audits panel">
+  <message name="IDS_DEVTOOLS_9103edac10b1749db57ca27386ff29dc" desc="Text when lighthouse is loading the page in the Lighthouse panel">
     <ph name="LOCKED_1">Lighthouse</ph> is loading your page.
   </message>
-  <message name="IDS_DEVTOOLS_a3456af9cc3d7cf0c2e288f889f050b7" desc="Fast fact in the pop-up dialog when lighthouse is running in the Audits panel">
+  <message name="IDS_DEVTOOLS_a3456af9cc3d7cf0c2e288f889f050b7" desc="Fast fact in the pop-up dialog when lighthouse is running in the Lighthouse panel">
     If a site takes &gt;1 second to become interactive, users lose attention, and their perception of completing the page task is broken [Source: <ph name="LOCKED_1">Google Developers Blog</ph>]
   </message>
-  <message name="IDS_DEVTOOLS_a99169b94755be554b65f8dcc2c2b842" desc="Text in the pop-up dialog when lighthouse is gathering information in the Audits panel">
+  <message name="IDS_DEVTOOLS_a99169b94755be554b65f8dcc2c2b842" desc="Text in the pop-up dialog when lighthouse is gathering information in the Lighthouse panel">
     <ph name="LOCKED_1">Lighthouse</ph> is gathering information about the page to compute your score.
   </message>
-  <message name="IDS_DEVTOOLS_abef61c6093b932176b80c40ce8a4023" desc="Text in Audits Controller">
+  <message name="IDS_DEVTOOLS_abef61c6093b932176b80c40ce8a4023" desc="Text in Lighthouse Controller">
     Publisher Ads
   </message>
-  <message name="IDS_DEVTOOLS_af1b98adf7f686b84cd0b443e022b7a0" desc="Title in the Audits Start View for list of categories to run during audit">
+  <message name="IDS_DEVTOOLS_af1b98adf7f686b84cd0b443e022b7a0" desc="Title in the Lighthouse Start View for list of categories to run during audit">
     Categories
   </message>
-  <message name="IDS_DEVTOOLS_b002a564ceda05dbdf012a48a145d0d3" desc="Status header in the Audits panel">
+  <message name="IDS_DEVTOOLS_b002a564ceda05dbdf012a48a145d0d3" desc="Status header in the Lighthouse panel">
     Printing
   </message>
-  <message name="IDS_DEVTOOLS_b06c94565d768dd75535120f2f8482a7" desc="Text in Audits Start View labeling audit configuraion control group">
-    Audits
+  <message name="IDS_DEVTOOLS_bcb3798d312ed46335afe6b1c0ebd398" desc="Text in Lighthouse Start View labeling audit configuraion control group">
+    Lighthouse
   </message>
-  <message name="IDS_DEVTOOLS_b1b01acb63f79615b05f6d816705d7d3" desc="Text in Audits Controller">
+  <message name="IDS_DEVTOOLS_b1b01acb63f79615b05f6d816705d7d3" desc="Text in Lighthouse Controller">
     Does this page meet the standard of a Progressive Web App
   </message>
-  <message name="IDS_DEVTOOLS_b29bb7427a05d89f1dae6ab5459e2d5c" desc="Fast fact in the pop-up dialog when lighthouse is running in the Audits panel">
+  <message name="IDS_DEVTOOLS_b29bb7427a05d89f1dae6ab5459e2d5c" desc="Fast fact in the pop-up dialog when lighthouse is running in the Lighthouse panel">
     By reducing the response size of JSON needed for displaying comments, Instagram saw increased impressions [Source: <ph name="LOCKED_1">WPO Stats</ph>]
   </message>
-  <message name="IDS_DEVTOOLS_b40b80f075ebae0e3a75c6896abdc949" desc="Text of audits start button in Audits Start View">
+  <message name="IDS_DEVTOOLS_b40b80f075ebae0e3a75c6896abdc949" desc="Text of audits start button in Lighthouse Start View">
     Generate report
   </message>
-  <message name="IDS_DEVTOOLS_bcf2457dd80557dd7ebdc1504b6149e6" desc="Text in Audits Controller">
+  <message name="IDS_DEVTOOLS_bcf2457dd80557dd7ebdc1504b6149e6" desc="Text in Lighthouse Controller">
     Does this page follow best practices for modern web development
   </message>
-  <message name="IDS_DEVTOOLS_c2ffe02d76c4f089648f1647b43e4ee5" desc="Text in Audits Controller">
+  <message name="IDS_DEVTOOLS_c2ffe02d76c4f089648f1647b43e4ee5" desc="Text in Lighthouse Controller">
     Best practices
   </message>
   <message name="IDS_DEVTOOLS_c91c7b93c28cd18741b71f727ee81ee3" desc="Title of combo box in audits report selector">
     Reports
   </message>
-  <message name="IDS_DEVTOOLS_d2f618fd63c7c2028cd527f60e761bc6" desc="Text when lighthouse is loading the page in the Audits panel">
+  <message name="IDS_DEVTOOLS_d2f618fd63c7c2028cd527f60e761bc6" desc="Text when lighthouse is loading the page in the Lighthouse panel">
     <ph name="LOCKED_1">Lighthouse</ph> is loading your page with mobile emulation.
   </message>
-  <message name="IDS_DEVTOOLS_d88946b678e4c2f251d4e292e8142291" desc="Text in Audits Controller">
+  <message name="IDS_DEVTOOLS_d88946b678e4c2f251d4e292e8142291" desc="Text in Lighthouse Controller">
     SEO
   </message>
-  <message name="IDS_DEVTOOLS_deeacee140c7d3a451440dd0e206e256" desc="Text in Audits Start View">
+  <message name="IDS_DEVTOOLS_deeacee140c7d3a451440dd0e206e256" desc="Text in Lighthouse Start View">
     Identify and fix common problems that affect your site&apos;s performance, accessibility, and user experience.
   </message>
-  <message name="IDS_DEVTOOLS_e339ef3bcd3e92466fa83dc21e690a5b" desc="Fast fact in the pop-up dialog when lighthouse is running in the Audits panel">
+  <message name="IDS_DEVTOOLS_e339ef3bcd3e92466fa83dc21e690a5b" desc="Fast fact in the pop-up dialog when lighthouse is running in the Lighthouse panel">
     As the number of elements on a page increases from 400 to 6,000, the probability of conversion drops 95%. [Source: <ph name="LOCKED_1">Think with Google</ph>]
   </message>
-  <message name="IDS_DEVTOOLS_e499f5109f685235e6280179fe22beec" desc="Text that appears when user drag and drop something (for example, a file) in Audits Panel">
-    Drop audit file here
-  </message>
-  <message name="IDS_DEVTOOLS_ea60ba1496b05c6a5816fb75d0665c8d" desc="Text of a DOM element in Audits Status View">
+  <message name="IDS_DEVTOOLS_ea60ba1496b05c6a5816fb75d0665c8d" desc="Text of a DOM element in Lighthouse Status View">
     If this issue is reproducible, please report it at the <ph name="LOCKED_1">Lighthouse</ph> <ph name="LOCKED_2">GitHub</ph> repo.
   </message>
-  <message name="IDS_DEVTOOLS_f3ddea8173e7a06f7a6a5dadc234fd3d" desc="Text in the pop-up dialog when lighthouse is auditing in the Audits panel">
+  <message name="IDS_DEVTOOLS_f3ddea8173e7a06f7a6a5dadc234fd3d" desc="Text in the pop-up dialog when lighthouse is auditing in the Lighthouse panel">
     Almost there! <ph name="LOCKED_1">Lighthouse</ph> is now generating your report.
   </message>
   <message name="IDS_DEVTOOLS_fad0ce221c826eede253cb0956ca0700" desc="A search term referring to the linting application named Lighthouse that can be entered in the command menu">
diff --git a/front_end/lighthouse/module.json b/front_end/lighthouse/module.json
new file mode 100644
index 0000000..8805003
--- /dev/null
+++ b/front_end/lighthouse/module.json
@@ -0,0 +1,50 @@
+{
+    "extensions": [
+        {
+            "type": "view",
+            "location": "panel",
+            "id": "lighthouse",
+            "title": "Lighthouse",
+            "order": 90,
+            "className": "Lighthouse.LighthousePanel",
+            "tags": "lighthouse, pwa"
+        }
+    ],
+    "dependencies": [
+        "components",
+        "emulation",
+        "timeline",
+        "inspector_main",
+        "sdk",
+        "services",
+        "ui"
+    ],
+    "scripts": [],
+    "modules": [
+        "lighthouse.js",
+        "lighthouse-legacy.js",
+        "lighthouse/report.js",
+        "lighthouse/report-generator.js",
+        "RadioSetting.js",
+        "LighthousePanel.js",
+        "LighthouseController.js",
+        "LighthouseReportSelector.js",
+        "LighthouseReportRenderer.js",
+        "LighthouseStartView.js",
+        "LighthouseStatusView.js",
+        "LighthouseProtocolService.js"
+    ],
+    "resources": [
+        "lighthouseDialog.css",
+        "lighthousePanel.css",
+        "lighthouseStartView.css",
+        "lighthouse/template.html",
+        "lighthouse/templates.html",
+        "lighthouse/report.css",
+        "lighthouse/report.js"
+    ],
+    "skip_compilation": [
+      "lighthouse/report.js",
+      "lighthouse/report-generator.js"
+  ]
+}
diff --git a/front_end/lighthouse_test_runner/LighthouseTestRunner.js b/front_end/lighthouse_test_runner/LighthouseTestRunner.js
new file mode 100644
index 0000000..d384a39
--- /dev/null
+++ b/front_end/lighthouse_test_runner/LighthouseTestRunner.js
@@ -0,0 +1,136 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/**
+ * @fileoverview using private properties isn't a Closure violation in tests.
+ * @suppress {accessControls}
+ */
+
+/**
+ * @return {!Lighthouse.LighthousePanel}
+ */
+LighthouseTestRunner._panel = function() {
+  return /** @type {!Object} **/ (UI.panels).lighthouse;
+};
+
+/**
+ * @return {?Element}
+ */
+LighthouseTestRunner.getContainerElement = function() {
+  return LighthouseTestRunner._panel().contentElement;
+};
+
+/**
+ * @return {?Element}
+ */
+LighthouseTestRunner.getResultsElement = function() {
+  return LighthouseTestRunner._panel()._auditResultsElement;
+};
+
+/**
+ * @return {?Element}
+ */
+LighthouseTestRunner.getDialogElement = function() {
+  return LighthouseTestRunner._panel()._statusView._dialog.contentElement.shadowRoot.querySelector('.lighthouse-view');
+};
+
+/**
+ * @return {?Element}
+ */
+LighthouseTestRunner.getSettingsElement = function() {
+  return LighthouseTestRunner._panel()._settingsPane.element;
+};
+
+/**
+ * @return {?Element}
+ */
+LighthouseTestRunner.getRunButton = function() {
+  const dialog = LighthouseTestRunner.getContainerElement();
+  return dialog && dialog.querySelectorAll('button')[0];
+};
+
+/**
+ * @return {?Element}
+ */
+LighthouseTestRunner.getCancelButton = function() {
+  const dialog = LighthouseTestRunner.getDialogElement();
+  return dialog && dialog.querySelectorAll('button')[0];
+};
+
+LighthouseTestRunner.openStartAudit = function() {
+  LighthouseTestRunner._panel()._renderStartView();
+};
+
+/**
+ * @param {function(string)} onMessage
+ */
+LighthouseTestRunner.addStatusListener = function(onMessage) {
+  TestRunner.addSniffer(Lighthouse.StatusView.prototype, 'updateStatus', onMessage, true);
+};
+
+/**
+ * @return {!Promise<!Object>}
+ */
+LighthouseTestRunner.waitForResults = function() {
+  return new Promise(resolve => {
+    TestRunner.addSniffer(
+        Lighthouse.LighthousePanel.prototype, '_buildReportUI', (lhr, artifacts) => resolve({lhr, artifacts}));
+  });
+};
+
+LighthouseTestRunner.forcePageAuditabilityCheck = function() {
+  LighthouseTestRunner._panel()._controller.recomputePageAuditability();
+};
+
+/**
+ * @param {?Element} checkboxContainer
+ * @return {string}
+ */
+LighthouseTestRunner._checkboxStateLabel = function(checkboxContainer) {
+  if (!checkboxContainer) {
+    return 'missing';
+  }
+
+  const label = checkboxContainer.textElement.textContent;
+  const checkedLabel = checkboxContainer.checkboxElement.checked ? 'x' : ' ';
+  return `[${checkedLabel}] ${label}`;
+};
+
+/**
+ * @param {?Element} button
+ * @return {string}
+ */
+LighthouseTestRunner._buttonStateLabel = function(button) {
+  if (!button) {
+    return 'missing';
+  }
+
+  const enabledLabel = button.disabled ? 'disabled' : 'enabled';
+  const hiddenLabel = window.getComputedStyle(button).getPropertyValue('visibility');
+  return `${button.textContent}: ${enabledLabel} ${hiddenLabel}`;
+};
+
+LighthouseTestRunner.dumpStartAuditState = function() {
+  TestRunner.addResult('\n========== Lighthouse Start Audit State ==========');
+
+  const containerElement = LighthouseTestRunner.getContainerElement();
+  const checkboxes = [...containerElement.querySelectorAll('.checkbox')];
+
+  const toolbarShadowRoot =
+      LighthouseTestRunner.getSettingsElement().querySelector('.lighthouse-settings-pane > div').shadowRoot;
+  for (const checkbox of toolbarShadowRoot.querySelectorAll('.checkbox')) {
+    checkboxes.push(checkbox);
+  }
+
+  checkboxes.forEach(element => {
+    TestRunner.addResult(LighthouseTestRunner._checkboxStateLabel(element));
+  });
+
+  const helpText = containerElement.querySelector('.lighthouse-help-text');
+  if (!helpText.classList.contains('hidden')) {
+    TestRunner.addResult(`Help text: ${helpText.textContent}`);
+  }
+
+  TestRunner.addResult(LighthouseTestRunner._buttonStateLabel(LighthouseTestRunner.getRunButton()));
+};
diff --git a/front_end/lighthouse_test_runner/OWNERS b/front_end/lighthouse_test_runner/OWNERS
new file mode 100644
index 0000000..adbdad6
--- /dev/null
+++ b/front_end/lighthouse_test_runner/OWNERS
@@ -0,0 +1 @@
+file://LIGHTHOUSE_OWNERS
diff --git a/front_end/lighthouse_test_runner/module.json b/front_end/lighthouse_test_runner/module.json
new file mode 100644
index 0000000..7d7c584
--- /dev/null
+++ b/front_end/lighthouse_test_runner/module.json
@@ -0,0 +1,9 @@
+{
+  "dependencies": [
+    "test_runner",
+    "lighthouse"
+  ],
+  "scripts": [
+    "LighthouseTestRunner.js"
+  ]
+}
\ No newline at end of file
diff --git a/front_end/audits_worker.js b/front_end/lighthouse_worker.js
similarity index 85%
rename from front_end/audits_worker.js
rename to front_end/lighthouse_worker.js
index c97fda6..e8dbbd6 100644
--- a/front_end/audits_worker.js
+++ b/front_end/lighthouse_worker.js
@@ -6,4 +6,4 @@
 
 import './worker_service/ServiceDispatcher.js';
 
-Root.Runtime.startWorker('audits_worker');
+Root.Runtime.startWorker('lighthouse_worker');
diff --git a/front_end/audits_worker.json b/front_end/lighthouse_worker.json
similarity index 64%
rename from front_end/audits_worker.json
rename to front_end/lighthouse_worker.json
index 443596a..16cb591 100644
--- a/front_end/audits_worker.json
+++ b/front_end/lighthouse_worker.json
@@ -2,6 +2,6 @@
     "worker": true,
     "modules": [
         { "name": "worker_service", "type": "autostart" },
-        { "name": "audits_worker", "type": "remote" }
+        { "name": "lighthouse_worker", "type": "remote" }
     ]
 }
diff --git a/front_end/audits_worker/AuditsService.js b/front_end/lighthouse_worker/LighthouseService.js
similarity index 95%
rename from front_end/audits_worker/AuditsService.js
rename to front_end/lighthouse_worker/LighthouseService.js
index 1520137..83a21cc 100644
--- a/front_end/audits_worker/AuditsService.js
+++ b/front_end/lighthouse_worker/LighthouseService.js
@@ -29,7 +29,7 @@
  * @implements {Service}
  * @unrestricted
  */
-class AuditsService {  // eslint-disable-line
+class LighthouseService {  // eslint-disable-line
   /**
    * @override
    * @param {function(string)}
@@ -132,4 +132,4 @@
 global.document.documentElement.style = {
   WebkitAppearance: 'WebkitAppearance'
 };
-global.AuditsService = AuditsService;
+global.LighthouseService = LighthouseService;
diff --git a/front_end/lighthouse_worker/OWNERS b/front_end/lighthouse_worker/OWNERS
new file mode 100644
index 0000000..adbdad6
--- /dev/null
+++ b/front_end/lighthouse_worker/OWNERS
@@ -0,0 +1 @@
+file://LIGHTHOUSE_OWNERS
diff --git a/front_end/audits_worker/lighthouse/LICENSE b/front_end/lighthouse_worker/lighthouse/LICENSE
similarity index 100%
rename from front_end/audits_worker/lighthouse/LICENSE
rename to front_end/lighthouse_worker/lighthouse/LICENSE
diff --git a/front_end/audits_worker/lighthouse/README.chromium b/front_end/lighthouse_worker/lighthouse/README.chromium
similarity index 83%
rename from front_end/audits_worker/lighthouse/README.chromium
rename to front_end/lighthouse_worker/lighthouse/README.chromium
index accd67d..b3ab053 100644
--- a/front_end/audits_worker/lighthouse/README.chromium
+++ b/front_end/lighthouse_worker/lighthouse/README.chromium
@@ -6,7 +6,7 @@
 
 This directory contains Chromium's version of lighthouse with tests, demo and sources removed.
 
-The locales/ folder is not bundled with audits_worker_module.js. Instead, the files are hosted separately
+The locales/ folder is not bundled with lighthouse_worker_module.js. Instead, the files are hosted separately
 on the remote server. The appropriate locale file will be fetched and its content registered with lighthouse
 before running audits.
 More info on the lighthouse localization process: https://docs.google.com/document/d/1jnt3BqKB-4q3AE94UWFA0Gqspx8Sd_jivlB7gQMlmfk/edit
\ No newline at end of file
diff --git a/front_end/lighthouse_worker/lighthouse/lighthouse-dt-bundle.js b/front_end/lighthouse_worker/lighthouse/lighthouse-dt-bundle.js
new file mode 100644
index 0000000..f4e0a9d
--- /dev/null
+++ b/front_end/lighthouse_worker/lighthouse/lighthouse-dt-bundle.js
@@ -0,0 +1,71336 @@
+// lighthouse, browserified. 5.7.0 (005c2e6f48e7cc4bfefaa4b0551122edbe04a993)
+require=function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a;}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r);},p,p.exports,r,e,n,t);}return n[i].exports;}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o;}return r;}()({"../audits/accessibility/accesskeys":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'`[accesskey]` values are unique',
+    
+    failureTitle:'`[accesskey]` values are not unique',
+    
+    description:'Access keys let users quickly focus a part of the page. For proper '+
+    'navigation, each access key must be unique. '+
+    '[Learn more](https://web.dev/accesskeys/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class Accesskeys extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'accesskeys',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=Accesskeys;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/accesskeys.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-allowed-attr":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'`[aria-*]` attributes match their roles',
+    
+    failureTitle:'`[aria-*]` attributes do not match their roles',
+    
+    description:'Each ARIA `role` supports a specific subset of `aria-*` attributes. '+
+    'Mismatching these invalidates the `aria-*` attributes. [Learn '+
+    'more](https://web.dev/aria-allowed-attr/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class ARIAAllowedAttr extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'aria-allowed-attr',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=ARIAAllowedAttr;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/aria-allowed-attr.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-required-attr":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'`[role]`s have all required `[aria-*]` attributes',
+    
+    failureTitle:'`[role]`s do not have all required `[aria-*]` attributes',
+    
+    description:'Some ARIA roles have required attributes that describe the state '+
+    'of the element to screen readers. [Learn more](https://web.dev/aria-required-attr/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class ARIARequiredAttr extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'aria-required-attr',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=ARIARequiredAttr;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/aria-required-attr.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-required-children":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Elements with an ARIA `[role]` that require children to contain a specific '+
+    '`[role]` have all required children.',
+    
+    failureTitle:'Elements with an ARIA `[role]` that require children to contain a specific '+
+    '`[role]` are missing some or all of those required children.',
+    
+    description:'Some ARIA parent roles must contain specific child roles to perform '+
+    'their intended accessibility functions. '+
+    '[Learn more](https://web.dev/aria-required-children/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class AriaRequiredChildren extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'aria-required-children',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=AriaRequiredChildren;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/aria-required-children.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-required-parent":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'`[role]`s are contained by their required parent element',
+    
+    failureTitle:'`[role]`s are not contained by their required parent element',
+    
+    description:'Some ARIA child roles must be contained by specific parent roles to '+
+    'properly perform their intended accessibility functions. '+
+    '[Learn more](https://web.dev/aria-required-parent/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class AriaRequiredParent extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'aria-required-parent',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=AriaRequiredParent;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/aria-required-parent.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-roles":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'`[role]` values are valid',
+    
+    failureTitle:'`[role]` values are not valid',
+    
+    description:'ARIA roles must have valid values in order to perform their '+
+    'intended accessibility functions. '+
+    '[Learn more](https://web.dev/aria-roles/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class AriaRoles extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'aria-roles',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=AriaRoles;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/aria-roles.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-valid-attr-value":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'`[aria-*]` attributes have valid values',
+    
+    failureTitle:'`[aria-*]` attributes do not have valid values',
+    
+    description:'Assistive technologies, like screen readers, can\'t interpret ARIA '+
+    'attributes with invalid values. [Learn '+
+    'more](https://web.dev/aria-valid-attr-value/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class ARIAValidAttr extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'aria-valid-attr-value',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=ARIAValidAttr;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/aria-valid-attr-value.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/aria-valid-attr":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'`[aria-*]` attributes are valid and not misspelled',
+    
+    failureTitle:'`[aria-*]` attributes are not valid or misspelled',
+    
+    description:'Assistive technologies, like screen readers, can\'t interpret ARIA '+
+    'attributes with invalid names. [Learn '+
+    'more](https://web.dev/aria-valid-attr/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class ARIAValidAttr extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'aria-valid-attr',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=ARIAValidAttr;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/aria-valid-attr.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/audio-caption":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'`<audio>` elements contain a `<track>` element with `[kind="captions"]`',
+    
+    failureTitle:'`<audio>` elements are missing a `<track>` element with '+
+    '`[kind="captions"]`.',
+    
+    description:'Captions make audio elements usable for deaf or hearing-impaired users, '+
+    'providing critical information such as who is talking, what they\'re saying, '+
+    'and other non-speech information. '+
+    '[Learn more](https://web.dev/audio-caption/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class AudioCaption extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'audio-caption',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=AudioCaption;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/audio-caption.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/button-name":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Buttons have an accessible name',
+    
+    failureTitle:'Buttons do not have an accessible name',
+    
+    description:'When a button doesn\'t have an accessible name, screen readers announce it '+
+    'as "button", making it unusable for users who rely on screen readers. '+
+    '[Learn more](https://web.dev/button-name/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class ButtonName extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'button-name',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=ButtonName;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/button-name.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/bypass":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'The page contains a heading, skip link, or landmark region',
+    
+    failureTitle:'The page does not contain a heading, skip link, or landmark region',
+    
+    description:'Adding ways to bypass repetitive content lets keyboard users navigate the '+
+    'page more efficiently. '+
+    '[Learn more](https://web.dev/bypass/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class Bypass extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'bypass',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=Bypass;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/bypass.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/color-contrast":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Background and foreground colors have a sufficient contrast ratio',
+    
+    failureTitle:'Background and foreground colors do not have a '+
+    'sufficient contrast ratio.',
+    
+    description:'Low-contrast text is difficult or impossible for many users to read. '+
+    '[Learn more](https://web.dev/color-contrast/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class ColorContrast extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'color-contrast',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=ColorContrast;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/color-contrast.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/definition-list":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'`<dl>`\'s contain only properly-ordered `<dt>` and `<dd>` groups, `<script>` '+
+    'or `<template>` elements.',
+    
+    failureTitle:'`<dl>`\'s do not contain only properly-ordered `<dt>` and `<dd>` '+
+    'groups, `<script>` or `<template>` elements.',
+    
+    description:'When definition lists are not properly marked up, screen readers may produce '+
+    'confusing or inaccurate output. '+
+    '[Learn more](https://web.dev/definition-list/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class DefinitionList extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'definition-list',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=DefinitionList;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/definition-list.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/dlitem":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Definition list items are wrapped in `<dl>` elements',
+    
+    failureTitle:'Definition list items are not wrapped in `<dl>` elements',
+    
+    description:'Definition list items (`<dt>` and `<dd>`) must be wrapped in a '+
+    'parent `<dl>` element to ensure that screen readers can properly announce them. '+
+    '[Learn more](https://web.dev/dlitem/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class DLItem extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'dlitem',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=DLItem;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/dlitem.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/document-title":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Document has a `<title>` element',
+    
+    failureTitle:'Document doesn\'t have a `<title>` element',
+    
+    description:'The title gives screen reader users an overview of the page, and search '+
+    'engine users rely on it heavily to determine if a page is relevant to their search. '+
+    '[Learn more](https://web.dev/document-title/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class DocumentTitle extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'document-title',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=DocumentTitle;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/document-title.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/duplicate-id":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'`[id]` attributes on the page are unique',
+    
+    failureTitle:'`[id]` attributes on the page are not unique',
+    
+    description:'The value of an id attribute must be unique to prevent '+
+    'other instances from being overlooked by assistive technologies. '+
+    '[Learn more](https://web.dev/duplicate-id/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class DuplicateId extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'duplicate-id',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=DuplicateId;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/duplicate-id.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/frame-title":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'`<frame>` or `<iframe>` elements have a title',
+    
+    failureTitle:'`<frame>` or `<iframe>` elements do not have a title',
+    
+    description:'Screen reader users rely on frame titles to describe the contents of frames. '+
+    '[Learn more](https://web.dev/frame-title/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class FrameTitle extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'frame-title',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=FrameTitle;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/frame-title.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/html-has-lang":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'`<html>` element has a `[lang]` attribute',
+    
+    failureTitle:'`<html>` element does not have a `[lang]` attribute',
+    
+    description:'If a page doesn\'t specify a lang attribute, a screen reader assumes '+
+    'that the page is in the default language that the user chose when setting up the '+
+    'screen reader. If the page isn\'t actually in the default language, then the screen '+
+    'reader might not announce the page\'s text correctly. '+
+    '[Learn more](https://web.dev/html-has-lang/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class HTMLHasLang extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'html-has-lang',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=HTMLHasLang;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/html-has-lang.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/html-lang-valid":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'`<html>` element has a valid value for its `[lang]` attribute',
+    
+    failureTitle:'`<html>` element does not have a valid value for '+
+    'its `[lang]` attribute.',
+    
+    description:'Specifying a valid [BCP 47 language](https://www.w3.org/International/questions/qa-choosing-language-tags#question) '+
+    'helps screen readers announce text properly. '+
+    '[Learn more](https://web.dev/html-lang-valid/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class HTMLLangValid extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'html-lang-valid',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=HTMLLangValid;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/html-lang-valid.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/image-alt":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Image elements have `[alt]` attributes',
+    
+    failureTitle:'Image elements do not have `[alt]` attributes',
+    
+    description:'Informative elements should aim for short, descriptive alternate text. '+
+    'Decorative elements can be ignored with an empty alt attribute. '+
+    '[Learn more](https://web.dev/image-alt/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class ImageAlt extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'image-alt',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=ImageAlt;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/image-alt.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/input-image-alt":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'`<input type="image">` elements have `[alt]` text',
+    
+    failureTitle:'`<input type="image">` elements do not have `[alt]` text',
+    
+    description:'When an image is being used as an `<input>` button, providing alternative '+
+    'text can help screen reader users understand the purpose of the button. '+
+    '[Learn more](https://web.dev/input-image-alt/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class InputImageAlt extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'input-image-alt',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=InputImageAlt;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/input-image-alt.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/label":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Form elements have associated labels',
+    
+    failureTitle:'Form elements do not have associated labels',
+    
+    description:'Labels ensure that form controls are announced properly by assistive '+
+    'technologies, like screen readers. [Learn '+
+    'more](https://web.dev/label/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class Label extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'label',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=Label;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/label.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/layout-table":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Presentational `<table>` elements avoid using `<th>`, `<caption>` or the '+
+    '`[summary]` attribute.',
+    
+    failureTitle:'Presentational `<table>` elements do not avoid using `<th>`, '+
+    '`<caption>` or the `[summary]` attribute.',
+    
+    description:'A table being used for layout purposes should not include data elements, '+
+    'such as the th or caption elements or the summary attribute, because this can '+
+    'create a confusing experience for screen reader users. '+
+    '[Learn more](https://web.dev/layout-table/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class LayoutTable extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'layout-table',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=LayoutTable;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/layout-table.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/link-name":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Links have a discernible name',
+    
+    failureTitle:'Links do not have a discernible name',
+    
+    description:'Link text (and alternate text for images, when used as links) that is '+
+    'discernible, unique, and focusable improves the navigation experience for '+
+    'screen reader users. '+
+    '[Learn more](https://web.dev/link-name/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class LinkName extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'link-name',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=LinkName;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/link-name.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/listitem":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'List items (`<li>`) are contained within `<ul>` or `<ol>` parent elements',
+    
+    failureTitle:'List items (`<li>`) are not contained within `<ul>` '+
+    'or `<ol>` parent elements.',
+    
+    description:'Screen readers require list items (`<li>`) to be contained within a '+
+    'parent `<ul>` or `<ol>` to be announced properly. '+
+    '[Learn more](https://web.dev/listitem/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class ListItem extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'listitem',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=ListItem;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/listitem.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/list":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Lists contain only `<li>` elements and script supporting elements '+
+    '(`<script>` and `<template>`).',
+    
+    failureTitle:'Lists do not contain only `<li>` elements and script '+
+    'supporting elements (`<script>` and `<template>`).',
+    
+    description:'Screen readers have a specific way of announcing lists. Ensuring proper list '+
+    'structure aids screen reader output. '+
+    '[Learn more](https://web.dev/list/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class List extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'list',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=List;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/list.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/manual/custom-controls-labels":[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ManualAudit=require('../../manual/manual-audit.js');
+    
+    
+    
+    
+    
+    class CustomControlsLabels extends ManualAudit{
+    
+    
+    
+    static get meta(){
+    return Object.assign({
+    id:'custom-controls-labels',
+    description:'Custom interactive controls have associated labels, provided by aria-label or aria-labelledby. [Learn more](https://web.dev/custom-controls-labels/).',
+    title:'Custom controls have associated labels'},
+    super.partialMeta);
+    }}
+    
+    
+    module.exports=CustomControlsLabels;
+    
+    },{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/custom-controls-roles":[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ManualAudit=require('../../manual/manual-audit.js');
+    
+    
+    
+    
+    
+    class CustomControlsRoles extends ManualAudit{
+    
+    
+    
+    static get meta(){
+    return Object.assign({
+    id:'custom-controls-roles',
+    description:'Custom interactive controls have appropriate ARIA roles. [Learn more](https://web.dev/custom-control-roles/).',
+    title:'Custom controls have ARIA roles'},
+    super.partialMeta);
+    }}
+    
+    
+    module.exports=CustomControlsRoles;
+    
+    },{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/focus-traps":[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ManualAudit=require('../../manual/manual-audit.js');
+    
+    
+    
+    
+    
+    class FocusTraps extends ManualAudit{
+    
+    
+    
+    static get meta(){
+    return Object.assign({
+    id:'focus-traps',
+    description:'A user can tab into and out of any control or region without accidentally trapping their focus. [Learn more](https://web.dev/focus-traps/).',
+    title:'User focus is not accidentally trapped in a region'},
+    super.partialMeta);
+    }}
+    
+    
+    module.exports=FocusTraps;
+    
+    },{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/focusable-controls":[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ManualAudit=require('../../manual/manual-audit.js');
+    
+    
+    
+    
+    
+    class FocusableControls extends ManualAudit{
+    
+    
+    
+    static get meta(){
+    return Object.assign({
+    id:'focusable-controls',
+    description:'Custom interactive controls are keyboard focusable and display a focus indicator. [Learn more](https://web.dev/focusable-controls/).',
+    title:'Interactive controls are keyboard focusable'},
+    super.partialMeta);
+    }}
+    
+    
+    module.exports=FocusableControls;
+    
+    },{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/heading-levels":[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ManualAudit=require('../../manual/manual-audit.js');
+    
+    
+    
+    
+    
+    class HeadingLevels extends ManualAudit{
+    
+    
+    
+    static get meta(){
+    return Object.assign({
+    id:'heading-levels',
+    description:'Headings are used to create an outline for the page and heading levels are not skipped. [Learn more](https://web.dev/heading-levels/).',
+    title:'Headings don\'t skip levels'},
+    super.partialMeta);
+    }}
+    
+    
+    module.exports=HeadingLevels;
+    
+    },{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/interactive-element-affordance":[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ManualAudit=require('../../manual/manual-audit.js');
+    
+    
+    
+    
+    
+    class InteractiveElementAffordance extends ManualAudit{
+    
+    
+    
+    static get meta(){
+    return Object.assign({
+    id:'interactive-element-affordance',
+    description:'Interactive elements, such as links and buttons, should indicate their state and be distinguishable from non-interactive elements. [Learn more](https://web.dev/interactive-element-affordance/).',
+    title:'Interactive elements indicate their purpose and state'},
+    super.partialMeta);
+    }}
+    
+    
+    module.exports=InteractiveElementAffordance;
+    
+    },{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/logical-tab-order":[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ManualAudit=require('../../manual/manual-audit.js');
+    
+    
+    
+    
+    
+    class LogicalTabOrder extends ManualAudit{
+    
+    
+    
+    static get meta(){
+    return Object.assign({
+    id:'logical-tab-order',
+    description:'Tabbing through the page follows the visual layout. Users cannot focus elements that are offscreen. [Learn more](https://web.dev/logical-tab-order/).',
+    title:'The page has a logical tab order'},
+    super.partialMeta);
+    }}
+    
+    
+    module.exports=LogicalTabOrder;
+    
+    },{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/managed-focus":[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ManualAudit=require('../../manual/manual-audit.js');
+    
+    
+    
+    
+    
+    class ManagedFocus extends ManualAudit{
+    
+    
+    
+    static get meta(){
+    return Object.assign({
+    id:'managed-focus',
+    description:'If new content, such as a dialog, is added to the page, the user\'s focus is directed to it. [Learn more](https://web.dev/managed-focus/).',
+    title:'The user\'s focus is directed to new content added to the page'},
+    super.partialMeta);
+    }}
+    
+    
+    module.exports=ManagedFocus;
+    
+    },{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/offscreen-content-hidden":[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ManualAudit=require('../../manual/manual-audit.js');
+    
+    
+    
+    
+    
+    
+    class OffscreenContentHidden extends ManualAudit{
+    
+    
+    
+    static get meta(){
+    return Object.assign({
+    id:'offscreen-content-hidden',
+    description:'Offscreen content is hidden with display: none or aria-hidden=true. [Learn more](https://web.dev/offscreen-content-hidden/).',
+    title:'Offscreen content is hidden from assistive technology'},
+    super.partialMeta);
+    }}
+    
+    
+    module.exports=OffscreenContentHidden;
+    
+    },{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/use-landmarks":[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ManualAudit=require('../../manual/manual-audit.js');
+    
+    
+    
+    
+    
+    class UseLandmarks extends ManualAudit{
+    
+    
+    
+    static get meta(){
+    return Object.assign({
+    id:'use-landmarks',
+    description:'Landmark elements (<main>, <nav>, etc.) are used to improve the keyboard navigation of the page for assistive technology. [Learn more](https://web.dev/use-landmarks/).',
+    title:'HTML5 landmark elements are used to improve navigation'},
+    super.partialMeta);
+    }}
+    
+    
+    module.exports=UseLandmarks;
+    
+    },{"../../manual/manual-audit.js":5}],"../audits/accessibility/manual/visual-order-follows-dom":[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ManualAudit=require('../../manual/manual-audit.js');
+    
+    
+    
+    
+    
+    class VisualOrderFollowsDOM extends ManualAudit{
+    
+    
+    
+    static get meta(){
+    return Object.assign({
+    id:'visual-order-follows-dom',
+    description:'DOM order matches the visual order, improving navigation for assistive technology. [Learn more](https://web.dev/visual-order-follows-dom/).',
+    title:'Visual order on the page follows DOM order'},
+    super.partialMeta);
+    }}
+    
+    
+    module.exports=VisualOrderFollowsDOM;
+    
+    },{"../../manual/manual-audit.js":5}],"../audits/accessibility/meta-refresh":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'The document does not use `<meta http-equiv="refresh">`',
+    
+    failureTitle:'The document uses `<meta http-equiv="refresh">`',
+    
+    description:'Users do not expect a page to refresh automatically, and doing so will move '+
+    'focus back to the top of the page. This may create a frustrating or '+
+    'confusing experience. '+
+    '[Learn more](https://web.dev/meta-refresh/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class MetaRefresh extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'meta-refresh',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=MetaRefresh;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/meta-refresh.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/meta-viewport":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'`[user-scalable="no"]` is not used in the `<meta name="viewport">` '+
+    'element and the `[maximum-scale]` attribute is not less than 5.',
+    
+    failureTitle:'`[user-scalable="no"]` is used in the `<meta name="viewport">` '+
+    'element or the `[maximum-scale]` attribute is less than 5.',
+    
+    description:'Disabling zooming is problematic for users with low vision who rely on '+
+    'screen magnification to properly see the contents of a web page. '+
+    '[Learn more](https://web.dev/meta-viewport/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class MetaViewport extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'meta-viewport',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=MetaViewport;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/meta-viewport.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/object-alt":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'`<object>` elements have `[alt]` text',
+    
+    failureTitle:'`<object>` elements do not have `[alt]` text',
+    
+    description:'Screen readers cannot translate non-text content. Adding alt text to '+
+    '`<object>` elements helps screen readers convey meaning to users. '+
+    '[Learn more](https://web.dev/object-alt/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class ObjectAlt extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'object-alt',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=ObjectAlt;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/object-alt.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/tabindex":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'No element has a `[tabindex]` value greater than 0',
+    
+    failureTitle:'Some elements have a `[tabindex]` value greater than 0',
+    
+    description:'A value greater than 0 implies an explicit navigation ordering. '+
+    'Although technically valid, this often creates frustrating experiences '+
+    'for users who rely on assistive technologies. [Learn more](https://web.dev/tabindex/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class TabIndex extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'tabindex',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=TabIndex;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/tabindex.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/td-headers-attr":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Cells in a `<table>` element that use the `[headers]` attribute refer '+
+    'to table cells within the same table.',
+    
+    failureTitle:'Cells in a `<table>` element that use the `[headers]` attribute refer '+
+    'to an element `id` not found within the same table.',
+    
+    description:'Screen readers have features to make navigating tables easier. Ensuring '+
+    '`<td>` cells using the `[headers]` attribute only refer to other cells in the same '+
+    'table may improve the experience for screen reader users. '+
+    '[Learn more](https://web.dev/td-headers-attr/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class TDHeadersAttr extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'td-headers-attr',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=TDHeadersAttr;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/td-headers-attr.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/th-has-data-cells":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'`<th>` elements and elements with `[role="columnheader"/"rowheader"]` have '+
+    'data cells they describe.',
+    
+    failureTitle:'`<th>` elements and elements with '+
+    '`[role="columnheader"/"rowheader"]` do not have data cells they describe.',
+    
+    description:'Screen readers have features to make navigating tables easier. Ensuring '+
+    'table headers always refer to some set of cells may improve the experience for screen '+
+    'reader users. '+
+    '[Learn more](https://web.dev/th-has-data-cells/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class THHasDataCells extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'th-has-data-cells',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=THHasDataCells;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/th-has-data-cells.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/valid-lang":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'`[lang]` attributes have a valid value',
+    
+    failureTitle:'`[lang]` attributes do not have a valid value',
+    
+    description:'Specifying a valid [BCP 47 language](https://www.w3.org/International/questions/qa-choosing-language-tags#question) '+
+    'on elements helps ensure that text is pronounced correctly by a screen reader. '+
+    '[Learn more](https://web.dev/valid-lang/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class ValidLang extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'valid-lang',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=ValidLang;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/valid-lang.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/video-caption":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'`<video>` elements contain a `<track>` element with `[kind="captions"]`',
+    
+    failureTitle:'`<video>` elements do not contain a `<track>` element '+
+    'with `[kind="captions"]`.',
+    
+    description:'When a video provides a caption it is easier for deaf and hearing impaired '+
+    'users to access its information. '+
+    '[Learn more](https://web.dev/video-caption/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class VideoCaption extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'video-caption',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=VideoCaption;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/video-caption.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/accessibility/video-description":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const AxeAudit=require('./axe-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'`<video>` elements contain a `<track>` element with `[kind="description"]`',
+    
+    failureTitle:'`<video>` elements do not contain a `<track>` element with '+
+    '`[kind="description"]`.',
+    
+    description:'Audio descriptions provide relevant information for videos that dialogue '+
+    'cannot, such as facial expressions and scenes. '+
+    '[Learn more](https://web.dev/video-description/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class VideoDescription extends AxeAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'video-description',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Accessibility']};
+    
+    }}
+    
+    
+    module.exports=VideoDescription;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/video-description.js");
+    },{"../../lib/i18n/i18n.js":66,"./axe-audit.js":2}],"../audits/apple-touch-icon":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    
+    
+    
+    
+    
+    const UIStrings={
+    
+    title:'Provides a valid `apple-touch-icon`',
+    
+    failureTitle:'Does not provide a valid `apple-touch-icon`',
+    
+    description:'For ideal appearance on iOS when users add a progressive web app to the home '+
+    'screen, define an `apple-touch-icon`. It must point to a non-transparent 192px (or 180px) '+
+    'square PNG. [Learn More](https://web.dev/apple-touch-icon/).',
+    
+    precomposedWarning:'`apple-touch-icon-precomposed` is out of date; '+
+    '`apple-touch-icon` is preferred.'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class AppleTouchIcon extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'apple-touch-icon',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['LinkElements']};
+    
+    }
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    const appleTouchIcons=artifacts.LinkElements.
+    filter(el=>el.rel==='apple-touch-icon'||el.rel==='apple-touch-icon-precomposed').
+    filter(el=>!!el.href);
+    
+    
+    const passed=appleTouchIcons.length!==0;
+    
+    const warnings=[];
+    if(appleTouchIcons.filter(el=>el.rel==='apple-touch-icon-precomposed').length!==0&&
+    appleTouchIcons.filter(el=>el.rel==='apple-touch-icon').length===0){
+    warnings.push(str_(UIStrings.precomposedWarning));
+    }
+    
+    return{
+    score:passed?1:0,
+    warnings};
+    
+    }}
+    
+    
+    module.exports=AppleTouchIcon;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/apple-touch-icon.js");
+    },{"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/bootup-time":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const NetworkRequest=require('../lib/network-request.js');
+    const{taskGroups}=require('../lib/tracehouse/task-groups.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    const NetworkRecords=require('../computed/network-records.js');
+    const MainThreadTasks=require('../computed/main-thread-tasks.js');
+    
+    const UIStrings={
+    
+    title:'JavaScript execution time',
+    
+    failureTitle:'Reduce JavaScript execution time',
+    
+    description:'Consider reducing the time spent parsing, compiling, and executing JS. '+
+    'You may find delivering smaller JS payloads helps with this. [Learn '+
+    'more](https://web.dev/bootup-time).',
+    
+    columnTotal:'Total CPU Time',
+    
+    columnScriptEval:'Script Evaluation',
+    
+    columnScriptParse:'Script Parse',
+    
+    chromeExtensionsWarning:'Chrome extensions negatively affected this page\'s load performance. '+
+    'Try auditing the page in incognito mode or from a Chrome profile without extensions.'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class BootupTime extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'bootup-time',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['traces','devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    static get defaultOptions(){
+    return{
+    
+    
+    scorePODR:600,
+    scoreMedian:3500,
+    thresholdInMs:50};
+    
+    }
+    
+    
+    
+    
+    static getJavaScriptURLs(records){
+    
+    const urls=new Set();
+    for(const record of records){
+    if(record.resourceType===NetworkRequest.TYPES.Script){
+    urls.add(record.url);
+    }
+    }
+    
+    return urls;
+    }
+    
+    
+    
+    
+    
+    
+    static getAttributableURLForTask(task,jsURLs){
+    const jsURL=task.attributableURLs.find(url=>jsURLs.has(url));
+    const fallbackURL=task.attributableURLs[0];
+    let attributableURL=jsURL||fallbackURL;
+    
+    if(!attributableURL||attributableURL==='about:blank')attributableURL='Other';
+    return attributableURL;
+    }
+    
+    
+    
+    
+    
+    
+    static getExecutionTimingsByURL(tasks,jsURLs){
+    
+    const result=new Map();
+    
+    for(const task of tasks){
+    const attributableURL=BootupTime.getAttributableURLForTask(task,jsURLs);
+    const timingByGroupId=result.get(attributableURL)||{};
+    const originalTime=timingByGroupId[task.group.id]||0;
+    timingByGroupId[task.group.id]=originalTime+task.selfTime;
+    result.set(attributableURL,timingByGroupId);
+    }
+    
+    return result;
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const settings=context.settings||{};
+    const trace=artifacts.traces[BootupTime.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[BootupTime.DEFAULT_PASS];
+    const networkRecords=await NetworkRecords.request(devtoolsLog,context);
+    const tasks=await MainThreadTasks.request(trace,context);
+    const multiplier=settings.throttlingMethod==='simulate'?
+    settings.throttling.cpuSlowdownMultiplier:1;
+    
+    const jsURLs=BootupTime.getJavaScriptURLs(networkRecords);
+    const executionTimings=BootupTime.getExecutionTimingsByURL(tasks,jsURLs);
+    
+    let hadExcessiveChromeExtension=false;
+    let totalBootupTime=0;
+    const results=Array.from(executionTimings).
+    map(([url,timingByGroupId])=>{
+    
+    let totalExecutionTimeForURL=0;
+    for(const[groupId,timespanMs]of Object.entries(timingByGroupId)){
+    timingByGroupId[groupId]=timespanMs*multiplier;
+    totalExecutionTimeForURL+=timespanMs*multiplier;
+    }
+    
+    const scriptingTotal=timingByGroupId[taskGroups.scriptEvaluation.id]||0;
+    const parseCompileTotal=timingByGroupId[taskGroups.scriptParseCompile.id]||0;
+    
+    
+    if(totalExecutionTimeForURL>=context.options.thresholdInMs){
+    totalBootupTime+=scriptingTotal+parseCompileTotal;
+    }
+    
+    hadExcessiveChromeExtension=hadExcessiveChromeExtension||
+    url.startsWith('chrome-extension:')&&scriptingTotal>100;
+    
+    return{
+    url:url,
+    total:totalExecutionTimeForURL,
+    
+    scripting:scriptingTotal,
+    scriptParseCompile:parseCompileTotal};
+    
+    }).
+    filter(result=>result.total>=context.options.thresholdInMs).
+    sort((a,b)=>b.total-a.total);
+    
+    
+    
+    if(hadExcessiveChromeExtension){
+    context.LighthouseRunWarnings.push(str_(UIStrings.chromeExtensionsWarning));
+    }
+    
+    const summary={wastedMs:totalBootupTime};
+    
+    
+    const headings=[
+    {key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
+    {key:'total',granularity:1,itemType:'ms',text:str_(UIStrings.columnTotal)},
+    {key:'scripting',granularity:1,itemType:'ms',text:str_(UIStrings.columnScriptEval)},
+    {key:'scriptParseCompile',granularity:1,itemType:'ms',
+    text:str_(UIStrings.columnScriptParse)}];
+    
+    
+    const details=BootupTime.makeTableDetails(headings,results,summary);
+    
+    const score=Audit.computeLogNormalScore(
+    totalBootupTime,
+    context.options.scorePODR,
+    context.options.scoreMedian);
+    
+    
+    return{
+    score,
+    numericValue:totalBootupTime,
+    displayValue:totalBootupTime>0?
+    str_(i18n.UIStrings.seconds,{timeInMs:totalBootupTime}):'',
+    details};
+    
+    }}
+    
+    
+    module.exports=BootupTime;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/bootup-time.js");
+    },{"../computed/main-thread-tasks.js":12,"../computed/network-records.js":34,"../lib/i18n/i18n.js":66,"../lib/network-request.js":75,"../lib/tracehouse/task-groups.js":84,"./audit.js":3}],"../audits/byte-efficiency/efficient-animated-content":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const NetworkRequest=require('../../lib/network-request.js');
+    const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Use video formats for animated content',
+    
+    description:'Large GIFs are inefficient for delivering animated content. Consider using '+
+    'MPEG4/WebM videos for animations and PNG/WebP for static images instead of GIF to save '+
+    'network bytes. [Learn more](https://web.dev/efficient-animated-content)'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    const GIF_BYTE_THRESHOLD=100*1024;
+    
+    class EfficientAnimatedContent extends ByteEfficiencyAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'efficient-animated-content',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['devtoolsLogs','traces']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    static getPercentSavings(bytes){
+    return Math.round(29.1*Math.log10(bytes)-100.7)/100;
+    }
+    
+    
+    
+    
+    
+    
+    static audit_(artifacts,networkRecords){
+    const unoptimizedContent=networkRecords.filter(
+    record=>record.mimeType==='image/gif'&&
+    record.resourceType===NetworkRequest.TYPES.Image&&
+    (record.resourceSize||0)>GIF_BYTE_THRESHOLD);
+    
+    
+    
+    const items=unoptimizedContent.map(record=>{
+    const resourceSize=record.resourceSize||0;
+    return{
+    url:record.url,
+    totalBytes:resourceSize,
+    wastedBytes:Math.round(resourceSize*
+    EfficientAnimatedContent.getPercentSavings(resourceSize))};
+    
+    });
+    
+    
+    const headings=[
+    {key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+    {key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
+    {key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
+    
+    
+    return{
+    items,
+    headings};
+    
+    }}
+    
+    
+    module.exports=EfficientAnimatedContent;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/byte-efficiency/efficient-animated-content.js");
+    },{"../../lib/i18n/i18n.js":66,"../../lib/network-request.js":75,"./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/offscreen-images":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
+    const Sentry=require('../../lib/sentry.js');
+    const URL=require('../../lib/url-shim.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    const Interactive=require('../../computed/metrics/interactive.js');
+    const TraceOfTab=require('../../computed/trace-of-tab.js');
+    
+    const UIStrings={
+    
+    title:'Defer offscreen images',
+    
+    description:
+    'Consider lazy-loading offscreen and hidden images after all critical resources have '+
+    'finished loading to lower time to interactive. '+
+    '[Learn more](https://web.dev/offscreen-images).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    const ALLOWABLE_OFFSCREEN_X=100;
+    const ALLOWABLE_OFFSCREEN_Y=200;
+    
+    const IGNORE_THRESHOLD_IN_BYTES=2048;
+    const IGNORE_THRESHOLD_IN_PERCENT=75;
+    const IGNORE_THRESHOLD_IN_MS=50;
+    
+    
+    
+    class OffscreenImages extends ByteEfficiencyAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'offscreen-images',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['ImageElements','ViewportDimensions','devtoolsLogs','traces']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static computeVisiblePixels(imageRect,viewportDimensions){
+    const innerWidth=viewportDimensions.innerWidth;
+    const innerHeight=viewportDimensions.innerHeight;
+    
+    const top=Math.max(imageRect.top,-1*ALLOWABLE_OFFSCREEN_Y);
+    const right=Math.min(imageRect.right,innerWidth+ALLOWABLE_OFFSCREEN_X);
+    const bottom=Math.min(imageRect.bottom,innerHeight+ALLOWABLE_OFFSCREEN_Y);
+    const left=Math.max(imageRect.left,-1*ALLOWABLE_OFFSCREEN_X);
+    
+    return Math.max(right-left,0)*Math.max(bottom-top,0);
+    }
+    
+    
+    
+    
+    
+    
+    
+    static computeWaste(image,viewportDimensions,networkRecords){
+    const networkRecord=networkRecords.find(record=>record.url===image.src);
+    if(!image.resourceSize||!networkRecord){
+    return null;
+    }
+    
+    const url=URL.elideDataURI(image.src);
+    const totalPixels=image.displayedWidth*image.displayedHeight;
+    const visiblePixels=this.computeVisiblePixels(image.clientRect,viewportDimensions);
+    
+    const wastedRatio=totalPixels===0?1:1-visiblePixels/totalPixels;
+    const totalBytes=image.resourceSize;
+    const wastedBytes=Math.round(totalBytes*wastedRatio);
+    
+    if(!Number.isFinite(wastedRatio)){
+    return new Error(`Invalid image sizing information ${url}`);
+    }
+    
+    return{
+    url,
+    requestStartTime:networkRecord.startTime,
+    totalBytes,
+    wastedBytes,
+    wastedPercent:100*wastedRatio};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    static filterLanternResults(images,lanternMetricData){
+    const nodeTimings=lanternMetricData.pessimisticEstimate.nodeTimings;
+    
+    
+    let lastLongTaskStartTime=0;
+    
+    
+    const startTimesByURL=new Map();
+    for(const[node,timing]of nodeTimings){
+    if(node.type==='cpu'&&timing.duration>=50){
+    lastLongTaskStartTime=Math.max(lastLongTaskStartTime,timing.startTime);
+    }else if(node.type==='network'){
+    const networkNode=node;
+    startTimesByURL.set(networkNode.record.url,timing.startTime);
+    }
+    }
+    
+    return images.filter(image=>{
+    
+    if(image.wastedBytes<IGNORE_THRESHOLD_IN_BYTES)return false;
+    if(image.wastedPercent<IGNORE_THRESHOLD_IN_PERCENT)return false;
+    
+    const imageRequestStartTime=startTimesByURL.get(image.url)||0;
+    return imageRequestStartTime<lastLongTaskStartTime-IGNORE_THRESHOLD_IN_MS;
+    });
+    }
+    
+    
+    
+    
+    
+    
+    
+    static filterObservedResults(images,interactiveTimestamp){
+    return images.filter(image=>{
+    if(image.wastedBytes<IGNORE_THRESHOLD_IN_BYTES)return false;
+    if(image.wastedPercent<IGNORE_THRESHOLD_IN_PERCENT)return false;
+    return image.requestStartTime<interactiveTimestamp/1e6-IGNORE_THRESHOLD_IN_MS/1000;
+    });
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static computeWasteWithTTIGraph(results,graph,simulator){
+    return super.computeWasteWithTTIGraph(results,graph,simulator,
+    {includeLoad:false});
+    }
+    
+    
+    
+    
+    
+    
+    
+    static async audit_(artifacts,networkRecords,context){
+    const images=artifacts.ImageElements;
+    const viewportDimensions=artifacts.ViewportDimensions;
+    const trace=artifacts.traces[ByteEfficiencyAudit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[ByteEfficiencyAudit.DEFAULT_PASS];
+    
+    
+    const warnings=[];
+    const resultsMap=images.reduce((results,image)=>{
+    const processed=OffscreenImages.computeWaste(image,viewportDimensions,networkRecords);
+    if(processed===null){
+    return results;
+    }
+    
+    if(processed instanceof Error){
+    warnings.push(processed.message);
+    Sentry.captureException(processed,{tags:{audit:this.meta.id},level:'warning'});
+    return results;
+    }
+    
+    
+    const existing=results.get(processed.url);
+    if(!existing||existing.wastedBytes>processed.wastedBytes){
+    results.set(processed.url,processed);
+    }
+    
+    return results;
+    },new Map());
+    
+    const settings=context.settings;
+    
+    let items;
+    const unfilteredResults=Array.from(resultsMap.values());
+    
+    try{
+    const interactive=await Interactive.request({trace,devtoolsLog,settings},context);
+    
+    
+    const lanternInteractive=interactive;
+    
+    items=context.settings.throttlingMethod==='simulate'?
+    OffscreenImages.filterLanternResults(unfilteredResults,lanternInteractive):
+    
+    OffscreenImages.filterObservedResults(unfilteredResults,interactive.timestamp);
+    }catch(err){
+    
+    if(context.settings.throttlingMethod==='simulate'){
+    throw err;
+    }
+    
+    items=OffscreenImages.filterObservedResults(unfilteredResults,(
+    await TraceOfTab.request(trace,context).then(tot=>tot.timestamps.traceEnd)));
+    }
+    
+    
+    const headings=[
+    {key:'url',valueType:'thumbnail',label:''},
+    {key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+    {key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
+    {key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
+    
+    
+    return{
+    warnings,
+    items,
+    headings};
+    
+    }}
+    
+    
+    module.exports=OffscreenImages;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/byte-efficiency/offscreen-images.js");
+    },{"../../computed/metrics/interactive.js":18,"../../computed/trace-of-tab.js":39,"../../lib/i18n/i18n.js":66,"../../lib/sentry.js":78,"../../lib/url-shim.js":"url","./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/render-blocking-resources":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('../audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    const BaseNode=require('../../lib/dependency-graph/base-node.js');
+    const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
+    const UnusedCSS=require('./unused-css-rules.js');
+    const NetworkRequest=require('../../lib/network-request.js');
+    const TraceOfTab=require('../../computed/trace-of-tab.js');
+    const LoadSimulator=require('../../computed/load-simulator.js');
+    const FirstContentfulPaint=require('../../computed/metrics/first-contentful-paint.js');
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const MINIMUM_WASTED_MS=50;
+    
+    const UIStrings={
+    
+    title:'Eliminate render-blocking resources',
+    
+    description:'Resources are blocking the first paint of your page. Consider '+
+    'delivering critical JS/CSS inline and deferring all non-critical '+
+    'JS/styles. [Learn more](https://web.dev/render-blocking-resources).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    
+    function getNodesAndTimingByUrl(nodeTimings){
+    
+    const urlMap={};
+    const nodes=Array.from(nodeTimings.keys());
+    nodes.forEach(node=>{
+    if(node.type!=='network')return;
+    const nodeTiming=nodeTimings.get(node);
+    if(!nodeTiming)return;
+    
+    urlMap[node.record.url]={node,nodeTiming};
+    });
+    
+    return urlMap;
+    }
+    
+    class RenderBlockingResources extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'render-blocking-resources',
+    title:str_(UIStrings.title),
+    scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
+    description:str_(UIStrings.description),
+    
+    
+    requiredArtifacts:['URL','TagsBlockingFirstPaint','traces','devtoolsLogs','CSSUsage']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async computeResults(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const simulatorData={devtoolsLog,settings:context.settings};
+    const traceOfTab=await TraceOfTab.request(trace,context);
+    const simulator=await LoadSimulator.request(simulatorData,context);
+    const wastedCssBytes=await RenderBlockingResources.computeWastedCSSBytes(artifacts,context);
+    
+    const metricSettings={throttlingMethod:'simulate'};
+    const metricComputationData={trace,devtoolsLog,simulator,settings:metricSettings};
+    
+    const fcpSimulation=await FirstContentfulPaint.request(metricComputationData,context);
+    const fcpTsInMs=traceOfTab.timestamps.firstContentfulPaint/1000;
+    
+    const nodesByUrl=getNodesAndTimingByUrl(fcpSimulation.optimisticEstimate.nodeTimings);
+    
+    const results=[];
+    const deferredNodeIds=new Set();
+    for(const resource of artifacts.TagsBlockingFirstPaint){
+    
+    if(resource.endTime*1000>fcpTsInMs)continue;
+    
+    if(!nodesByUrl[resource.tag.url])continue;
+    
+    const{node,nodeTiming}=nodesByUrl[resource.tag.url];
+    
+    
+    node.traverse(node=>deferredNodeIds.add(node.id));
+    
+    
+    const wastedMs=Math.round(nodeTiming.duration);
+    if(wastedMs<MINIMUM_WASTED_MS)continue;
+    
+    results.push({
+    url:resource.tag.url,
+    totalBytes:resource.transferSize,
+    wastedMs});
+    
+    }
+    
+    if(!results.length){
+    return{results,wastedMs:0};
+    }
+    
+    const wastedMs=RenderBlockingResources.estimateSavingsWithGraphs(
+    simulator,
+    fcpSimulation.optimisticGraph,
+    deferredNodeIds,
+    wastedCssBytes);
+    
+    
+    return{results,wastedMs};
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static estimateSavingsWithGraphs(simulator,fcpGraph,deferredIds,wastedCssBytesByUrl){
+    const originalEstimate=simulator.simulate(fcpGraph).timeInMs;
+    
+    let totalChildNetworkBytes=0;
+    const minimalFCPGraph=fcpGraph.cloneWithRelationships(node=>{
+    
+    const canDeferRequest=deferredIds.has(node.id);
+    if(node.type!==BaseNode.TYPES.NETWORK)return!canDeferRequest;
+    
+    const isStylesheet=
+    node.record.resourceType===NetworkRequest.TYPES.Stylesheet;
+    if(canDeferRequest&&isStylesheet){
+    
+    const wastedBytes=wastedCssBytesByUrl.get(node.record.url)||0;
+    totalChildNetworkBytes+=(node.record.transferSize||0)-wastedBytes;
+    }
+    return!canDeferRequest;
+    });
+    
+    
+    const originalTransferSize=minimalFCPGraph.record.transferSize;
+    const safeTransferSize=originalTransferSize||0;
+    minimalFCPGraph.record.transferSize=safeTransferSize+totalChildNetworkBytes;
+    const estimateAfterInline=simulator.simulate(minimalFCPGraph).timeInMs;
+    minimalFCPGraph.record.transferSize=originalTransferSize;
+    return Math.round(Math.max(originalEstimate-estimateAfterInline,0));
+    }
+    
+    
+    
+    
+    
+    
+    static async computeWastedCSSBytes(artifacts,context){
+    const wastedBytesByUrl=new Map();
+    try{
+    const results=await UnusedCSS.audit(artifacts,context);
+    if(results.details&&results.details.type==='opportunity'){
+    for(const item of results.details.items){
+    wastedBytesByUrl.set(item.url,item.wastedBytes);
+    }
+    }
+    }catch(_){}
+    
+    return wastedBytesByUrl;
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const{results,wastedMs}=await RenderBlockingResources.computeResults(artifacts,context);
+    
+    let displayValue='';
+    if(results.length>0){
+    displayValue=str_(i18n.UIStrings.displayValueMsSavings,{wastedMs});
+    }
+    
+    
+    const headings=[
+    {key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+    {key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
+    {key:'wastedMs',valueType:'timespanMs',label:str_(i18n.UIStrings.columnWastedMs)}];
+    
+    
+    const details=Audit.makeOpportunityDetails(headings,results,wastedMs);
+    
+    return{
+    displayValue,
+    score:ByteEfficiencyAudit.scoreForWastedMs(wastedMs),
+    numericValue:wastedMs,
+    details};
+    
+    }}
+    
+    
+    module.exports=RenderBlockingResources;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/byte-efficiency/render-blocking-resources.js");
+    },{"../../computed/load-simulator.js":10,"../../computed/metrics/first-contentful-paint.js":15,"../../computed/trace-of-tab.js":39,"../../lib/dependency-graph/base-node.js":57,"../../lib/i18n/i18n.js":66,"../../lib/network-request.js":75,"../audit.js":3,"./byte-efficiency-audit.js":4,"./unused-css-rules.js":"../audits/byte-efficiency/unused-css-rules"}],"../audits/byte-efficiency/total-byte-weight":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    const NetworkRecords=require('../../computed/network-records.js');
+    
+    const UIStrings={
+    
+    title:'Avoids enormous network payloads',
+    
+    failureTitle:'Avoid enormous network payloads',
+    
+    description:
+    'Large network payloads cost users real money and are highly correlated with '+
+    'long load times. [Learn '+
+    'more](https://web.dev/total-byte-weight).',
+    
+    displayValue:'Total size was {totalBytes, number, bytes}\xa0KB'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class TotalByteWeight extends ByteEfficiencyAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'total-byte-weight',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['devtoolsLogs','traces']};
+    
+    }
+    
+    
+    
+    
+    static get defaultOptions(){
+    return{
+    
+    
+    scorePODR:2500*1024,
+    scoreMedian:4000*1024};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const devtoolsLog=artifacts.devtoolsLogs[ByteEfficiencyAudit.DEFAULT_PASS];
+    const records=await NetworkRecords.request(devtoolsLog,context);
+    
+    let totalBytes=0;
+    
+    let results=[];
+    records.forEach(record=>{
+    
+    
+    if(record.parsedURL.scheme==='data'||!record.finished)return;
+    
+    const result={
+    url:record.url,
+    totalBytes:record.transferSize};
+    
+    
+    totalBytes+=result.totalBytes;
+    results.push(result);
+    });
+    const totalCompletedRequests=results.length;
+    results=results.sort((itemA,itemB)=>{
+    return itemB.totalBytes-itemA.totalBytes||
+    itemA.url.localeCompare(itemB.url);
+    }).slice(0,10);
+    
+    const score=ByteEfficiencyAudit.computeLogNormalScore(
+    totalBytes,
+    context.options.scorePODR,
+    context.options.scoreMedian);
+    
+    
+    
+    const headings=[
+    {key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
+    {key:'totalBytes',itemType:'bytes',text:str_(i18n.UIStrings.columnSize)}];
+    
+    
+    const tableDetails=ByteEfficiencyAudit.makeTableDetails(headings,results);
+    
+    return{
+    score,
+    numericValue:totalBytes,
+    displayValue:str_(UIStrings.displayValue,{totalBytes}),
+    extendedInfo:{
+    value:{
+    results,
+    totalCompletedRequests}},
+    
+    
+    details:tableDetails};
+    
+    }}
+    
+    
+    module.exports=TotalByteWeight;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/byte-efficiency/total-byte-weight.js");
+    },{"../../computed/network-records.js":34,"../../lib/i18n/i18n.js":66,"./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/unminified-css":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
+    const UnusedCSSRules=require('./unused-css-rules.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    const computeTokenLength=require('../../lib/minification-estimator.js').computeCSSTokenLength;
+    
+    const UIStrings={
+    
+    title:'Minify CSS',
+    
+    description:'Minifying CSS files can reduce network payload sizes. '+
+    '[Learn more](https://web.dev/unminified-css).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    const IGNORE_THRESHOLD_IN_PERCENT=5;
+    const IGNORE_THRESHOLD_IN_BYTES=2048;
+    
+    
+    
+    
+    class UnminifiedCSS extends ByteEfficiencyAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'unminified-css',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['CSSUsage','devtoolsLogs','traces','URL']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    static computeTokenLength(content){
+    return computeTokenLength(content);
+    }
+    
+    
+    
+    
+    
+    
+    
+    static computeWaste(stylesheet,networkRecord,pageUrl){
+    const content=stylesheet.content;
+    const totalTokenLength=UnminifiedCSS.computeTokenLength(content);
+    
+    let url=stylesheet.header.sourceURL;
+    if(!url||url===pageUrl){
+    const contentPreview=UnusedCSSRules.determineContentPreview(stylesheet.content);
+    url=contentPreview;
+    }
+    
+    const totalBytes=ByteEfficiencyAudit.estimateTransferSize(networkRecord,content.length,
+    'Stylesheet');
+    const wastedRatio=1-totalTokenLength/content.length;
+    const wastedBytes=Math.round(totalBytes*wastedRatio);
+    
+    return{
+    url,
+    totalBytes,
+    wastedBytes,
+    wastedPercent:100*wastedRatio};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static audit_(artifacts,networkRecords){
+    const pageUrl=artifacts.URL.finalUrl;
+    const items=[];
+    for(const stylesheet of artifacts.CSSUsage.stylesheets){
+    const networkRecord=networkRecords.
+    find(record=>record.url===stylesheet.header.sourceURL);
+    if(!stylesheet.content)continue;
+    
+    const result=UnminifiedCSS.computeWaste(stylesheet,networkRecord,pageUrl);
+    
+    
+    
+    if(result.wastedPercent<IGNORE_THRESHOLD_IN_PERCENT||
+    result.wastedBytes<IGNORE_THRESHOLD_IN_BYTES||
+    !Number.isFinite(result.wastedBytes))continue;
+    items.push(result);
+    }
+    
+    
+    const headings=[
+    {key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+    {key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
+    {key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
+    
+    
+    return{items,headings};
+    }}
+    
+    
+    module.exports=UnminifiedCSS;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/byte-efficiency/unminified-css.js");
+    },{"../../lib/i18n/i18n.js":66,"../../lib/minification-estimator.js":73,"./byte-efficiency-audit.js":4,"./unused-css-rules.js":"../audits/byte-efficiency/unused-css-rules"}],"../audits/byte-efficiency/unminified-javascript":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    const computeTokenLength=require('../../lib/minification-estimator.js').computeJSTokenLength;
+    
+    const UIStrings={
+    
+    title:'Minify JavaScript',
+    
+    description:'Minifying JavaScript files can reduce payload sizes and script parse time. '+
+    '[Learn more](https://web.dev/unminified-javascript).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    const IGNORE_THRESHOLD_IN_PERCENT=10;
+    const IGNORE_THRESHOLD_IN_BYTES=2048;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    class UnminifiedJavaScript extends ByteEfficiencyAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'unminified-javascript',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['ScriptElements','devtoolsLogs','traces']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    static computeWaste(scriptContent,displayUrl,networkRecord){
+    const contentLength=scriptContent.length;
+    const totalTokenLength=computeTokenLength(scriptContent);
+    
+    const totalBytes=ByteEfficiencyAudit.estimateTransferSize(networkRecord,contentLength,
+    'Script');
+    const wastedRatio=1-totalTokenLength/contentLength;
+    const wastedBytes=Math.round(totalBytes*wastedRatio);
+    
+    return{
+    url:displayUrl,
+    totalBytes,
+    wastedBytes,
+    wastedPercent:100*wastedRatio};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static audit_(artifacts,networkRecords){
+    
+    const items=[];
+    const warnings=[];
+    for(const{requestId,src,content}of artifacts.ScriptElements){
+    if(!content)continue;
+    
+    const networkRecord=networkRecords.find(record=>record.requestId===requestId);
+    const displayUrl=!src||!networkRecord?
+    `inline: ${content.substr(0,40)}...`:
+    networkRecord.url;
+    try{
+    const result=UnminifiedJavaScript.computeWaste(content,displayUrl,networkRecord);
+    
+    
+    if(result.wastedPercent<IGNORE_THRESHOLD_IN_PERCENT||
+    result.wastedBytes<IGNORE_THRESHOLD_IN_BYTES||
+    !Number.isFinite(result.wastedBytes))continue;
+    items.push(result);
+    }catch(err){
+    const url=networkRecord?networkRecord.url:'?';
+    warnings.push(`Unable to process script ${url}: ${err.message}`);
+    }
+    }
+    
+    
+    const headings=[
+    {key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+    {key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
+    {key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
+    
+    
+    return{
+    items,
+    warnings,
+    headings};
+    
+    }}
+    
+    
+    module.exports=UnminifiedJavaScript;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/byte-efficiency/unminified-javascript.js");
+    },{"../../lib/i18n/i18n.js":66,"../../lib/minification-estimator.js":73,"./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/unused-css-rules":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Remove unused CSS',
+    
+    description:'Remove dead rules from stylesheets and defer the loading of CSS not used for '+
+    'above-the-fold content to reduce unnecessary bytes consumed by network activity. '+
+    '[Learn more](https://web.dev/unused-css-rules).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    const IGNORE_THRESHOLD_IN_BYTES=10*1024;
+    const PREVIEW_LENGTH=100;
+    
+    
+    
+    class UnusedCSSRules extends ByteEfficiencyAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'unused-css-rules',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['CSSUsage','URL','devtoolsLogs','traces']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static indexStylesheetsById(styles,networkRecords){
+    const indexedNetworkRecords=networkRecords.
+    
+    
+    
+    filter(record=>record.resourceSize>0).
+    reduce((indexed,record)=>{
+    indexed[record.url]=record;
+    return indexed;
+    },{});
+    
+    return styles.reduce((indexed,stylesheet)=>{
+    indexed[stylesheet.header.styleSheetId]=Object.assign({
+    usedRules:[],
+    networkRecord:indexedNetworkRecords[stylesheet.header.sourceURL]},
+    stylesheet);
+    return indexed;
+    },{});
+    }
+    
+    
+    
+    
+    
+    
+    static indexUsedRules(rules,indexedStylesheets){
+    rules.forEach(rule=>{
+    const stylesheetInfo=indexedStylesheets[rule.styleSheetId];
+    
+    if(!stylesheetInfo){
+    return;
+    }
+    
+    if(rule.used){
+    stylesheetInfo.usedRules.push(rule);
+    }
+    });
+    }
+    
+    
+    
+    
+    
+    static computeUsage(stylesheetInfo){
+    let usedUncompressedBytes=0;
+    const totalUncompressedBytes=stylesheetInfo.content.length;
+    
+    for(const usedRule of stylesheetInfo.usedRules){
+    usedUncompressedBytes+=usedRule.endOffset-usedRule.startOffset;
+    }
+    
+    const totalTransferredBytes=ByteEfficiencyAudit.estimateTransferSize(
+    stylesheetInfo.networkRecord,totalUncompressedBytes,'Stylesheet');
+    const percentUnused=(totalUncompressedBytes-usedUncompressedBytes)/totalUncompressedBytes;
+    const wastedBytes=Math.round(percentUnused*totalTransferredBytes);
+    
+    return{
+    wastedBytes,
+    wastedPercent:percentUnused*100,
+    totalBytes:totalTransferredBytes};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static determineContentPreview(content){
+    let preview=(content||'').
+    slice(0,PREVIEW_LENGTH*5).
+    replace(/( {2,}|\t)+/g,'  ').
+    replace(/\n\s+}/g,'\n}').
+    trim();
+    
+    if(preview.length>PREVIEW_LENGTH){
+    const firstRuleStart=preview.indexOf('{');
+    const firstRuleEnd=preview.indexOf('}');
+    
+    if(firstRuleStart===-1||firstRuleEnd===-1||
+    firstRuleStart>firstRuleEnd||
+    firstRuleStart>PREVIEW_LENGTH){
+    
+    preview=preview.slice(0,PREVIEW_LENGTH)+'...';
+    }else if(firstRuleEnd<PREVIEW_LENGTH){
+    
+    preview=preview.slice(0,firstRuleEnd+1)+' ...';
+    }else{
+    
+    const lastSemicolonIndex=preview.slice(0,PREVIEW_LENGTH).lastIndexOf(';');
+    preview=lastSemicolonIndex<firstRuleStart?
+    preview.slice(0,PREVIEW_LENGTH)+'... } ...':
+    preview.slice(0,lastSemicolonIndex+1)+' ... } ...';
+    }
+    }
+    
+    return preview;
+    }
+    
+    
+    
+    
+    
+    
+    static mapSheetToResult(stylesheetInfo,pageUrl){
+    let url=stylesheetInfo.header.sourceURL;
+    if(!url||url===pageUrl){
+    const contentPreview=UnusedCSSRules.determineContentPreview(stylesheetInfo.content);
+    url=contentPreview;
+    }
+    
+    const usage=UnusedCSSRules.computeUsage(stylesheetInfo);
+    return{url,...usage};
+    }
+    
+    
+    
+    
+    
+    
+    static audit_(artifacts,networkRecords){
+    const styles=artifacts.CSSUsage.stylesheets;
+    const usage=artifacts.CSSUsage.rules;
+    const pageUrl=artifacts.URL.finalUrl;
+    
+    return Promise.resolve(networkRecords).then(networkRecords=>{
+    const indexedSheets=UnusedCSSRules.indexStylesheetsById(styles,networkRecords);
+    UnusedCSSRules.indexUsedRules(usage,indexedSheets);
+    
+    const items=Object.keys(indexedSheets).
+    map(sheetId=>UnusedCSSRules.mapSheetToResult(indexedSheets[sheetId],pageUrl)).
+    filter(sheet=>sheet&&sheet.wastedBytes>IGNORE_THRESHOLD_IN_BYTES);
+    
+    
+    const headings=[
+    {key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+    {key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
+    {key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
+    
+    
+    return{
+    items,
+    headings};
+    
+    });
+    }}
+    
+    
+    module.exports=UnusedCSSRules;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/byte-efficiency/unused-css-rules.js");
+    },{"../../lib/i18n/i18n.js":66,"./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/unused-javascript":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Remove unused JavaScript',
+    
+    description:'Remove unused JavaScript to reduce bytes consumed by network activity.'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    const IGNORE_THRESHOLD_IN_BYTES=2048;
+    
+    class UnusedJavaScript extends ByteEfficiencyAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'unused-javascript',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['JsUsage','devtoolsLogs','traces']};
+    
+    }
+    
+    
+    
+    
+    
+    static computeWaste(script){
+    let maximumEndOffset=0;
+    for(const func of script.functions){
+    for(const range of func.ranges){
+    maximumEndOffset=Math.max(maximumEndOffset,range.endOffset);
+    }
+    }
+    
+    
+    
+    const unusedByIndex=new Uint8Array(maximumEndOffset);
+    for(const func of script.functions){
+    for(const range of func.ranges){
+    if(range.count===0){
+    for(let i=range.startOffset;i<range.endOffset;i++){
+    unusedByIndex[i]=1;
+    }
+    }
+    }
+    }
+    
+    let unused=0;
+    for(const x of unusedByIndex){
+    unused+=x;
+    }
+    
+    return{
+    unusedLength:unused,
+    contentLength:maximumEndOffset};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static mergeWaste(wasteData,networkRecord){
+    let unusedLength=0;
+    let contentLength=0;
+    for(const usage of wasteData){
+    unusedLength+=usage.unusedLength;
+    contentLength+=usage.contentLength;
+    }
+    
+    const totalBytes=ByteEfficiencyAudit.estimateTransferSize(networkRecord,contentLength,
+    'Script');
+    const wastedRatio=unusedLength/contentLength||0;
+    const wastedBytes=Math.round(totalBytes*wastedRatio);
+    
+    return{
+    url:networkRecord.url,
+    totalBytes,
+    wastedBytes,
+    wastedPercent:100*wastedRatio};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static audit_(artifacts,networkRecords){
+    
+    const scriptsByUrl=new Map();
+    for(const script of artifacts.JsUsage){
+    const scripts=scriptsByUrl.get(script.url)||[];
+    scripts.push(script);
+    scriptsByUrl.set(script.url,scripts);
+    }
+    
+    const items=[];
+    for(const[url,scripts]of scriptsByUrl.entries()){
+    const networkRecord=networkRecords.find(record=>record.url===url);
+    if(!networkRecord)continue;
+    const wasteData=scripts.map(UnusedJavaScript.computeWaste);
+    const item=UnusedJavaScript.mergeWaste(wasteData,networkRecord);
+    if(item.wastedBytes<=IGNORE_THRESHOLD_IN_BYTES)continue;
+    items.push(item);
+    }
+    
+    return{
+    items,
+    headings:[
+    {key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+    {key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
+    {key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}]};
+    
+    
+    }}
+    
+    
+    module.exports=UnusedJavaScript;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/byte-efficiency/unused-javascript.js");
+    },{"../../lib/i18n/i18n.js":66,"./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/uses-long-cache-ttl":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const assert=require('assert');
+    const parseCacheControl=require('parse-cache-control');
+    const Audit=require('../audit.js');
+    const NetworkRequest=require('../../lib/network-request.js');
+    const URL=require('../../lib/url-shim.js');
+    const linearInterpolation=require('../../lib/statistics.js').linearInterpolation;
+    const i18n=require('../../lib/i18n/i18n.js');
+    const NetworkRecords=require('../../computed/network-records.js');
+    
+    const UIStrings={
+    
+    title:'Uses efficient cache policy on static assets',
+    
+    failureTitle:'Serve static assets with an efficient cache policy',
+    
+    description:
+    'A long cache lifetime can speed up repeat visits to your page. '+
+    '[Learn more](https://web.dev/uses-long-cache-ttl).',
+    
+    displayValue:`{itemCount, plural,
+        =1 {1 resource found}
+        other {# resources found}
+        }`};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    const IGNORE_THRESHOLD_IN_PERCENT=0.925;
+    
+    class CacheHeaders extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'uses-long-cache-ttl',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['devtoolsLogs','traces']};
+    
+    }
+    
+    
+    
+    
+    static get defaultOptions(){
+    return{
+    
+    
+    
+    scorePODR:4*1024,
+    scoreMedian:128*1024};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    static getCacheHitProbability(maxAgeInSeconds){
+    
+    
+    
+    
+    
+    const RESOURCE_AGE_IN_HOURS_DECILES=[0,0.2,1,3,8,12,24,48,72,168,8760,Infinity];
+    assert.ok(RESOURCE_AGE_IN_HOURS_DECILES.length===12,'deciles 0-10 and 1 for overflow');
+    
+    const maxAgeInHours=maxAgeInSeconds/3600;
+    const upperDecileIndex=RESOURCE_AGE_IN_HOURS_DECILES.findIndex(
+    decile=>decile>=maxAgeInHours);
+    
+    
+    
+    if(upperDecileIndex===RESOURCE_AGE_IN_HOURS_DECILES.length-1)return 1;
+    if(upperDecileIndex===0)return 0;
+    
+    
+    const upperDecileValue=RESOURCE_AGE_IN_HOURS_DECILES[upperDecileIndex];
+    const lowerDecileValue=RESOURCE_AGE_IN_HOURS_DECILES[upperDecileIndex-1];
+    const upperDecile=upperDecileIndex/10;
+    const lowerDecile=(upperDecileIndex-1)/10;
+    
+    
+    return linearInterpolation(
+    lowerDecileValue,
+    lowerDecile,
+    upperDecileValue,
+    upperDecile,
+    maxAgeInHours);
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    static computeCacheLifetimeInSeconds(headers,cacheControl){
+    if(cacheControl&&cacheControl['max-age']!==undefined){
+    return cacheControl['max-age'];
+    }
+    
+    const expiresHeaders=headers.get('expires');
+    if(expiresHeaders){
+    const expires=new Date(expiresHeaders).getTime();
+    
+    if(!expires)return 0;
+    return Math.ceil((expires-Date.now())/1000);
+    }
+    
+    return null;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static isCacheableAsset(record){
+    const CACHEABLE_STATUS_CODES=new Set([200,203,206]);
+    
+    
+    const STATIC_RESOURCE_TYPES=new Set([
+    NetworkRequest.TYPES.Font,
+    NetworkRequest.TYPES.Image,
+    NetworkRequest.TYPES.Media,
+    NetworkRequest.TYPES.Script,
+    NetworkRequest.TYPES.Stylesheet]);
+    
+    
+    
+    if(URL.NON_NETWORK_PROTOCOLS.includes(record.protocol))return false;
+    
+    return(
+    CACHEABLE_STATUS_CODES.has(record.statusCode)&&
+    STATIC_RESOURCE_TYPES.has(record.resourceType||'Other'));
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    static shouldSkipRecord(headers,cacheControl){
+    
+    if(!cacheControl&&(headers.get('pragma')||'').includes('no-cache')){
+    return true;
+    }
+    
+    
+    if(cacheControl&&(
+    
+    cacheControl['must-revalidate']||
+    cacheControl['no-cache']||
+    cacheControl['no-store']||
+    cacheControl['private'])){
+    return true;
+    }
+    
+    return false;
+    }
+    
+    
+    
+    
+    
+    
+    static audit(artifacts,context){
+    const devtoolsLogs=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    return NetworkRecords.request(devtoolsLogs,context).then(records=>{
+    const results=[];
+    let queryStringCount=0;
+    let totalWastedBytes=0;
+    
+    for(const record of records){
+    if(!CacheHeaders.isCacheableAsset(record))continue;
+    
+    
+    const headers=new Map();
+    for(const header of record.responseHeaders||[]){
+    if(headers.has(header.name.toLowerCase())){
+    const previousHeaderValue=headers.get(header.name.toLowerCase());
+    headers.set(header.name.toLowerCase(),
+    `${previousHeaderValue}, ${header.value}`);
+    }else{
+    headers.set(header.name.toLowerCase(),header.value);
+    }
+    }
+    
+    const cacheControl=parseCacheControl(headers.get('cache-control'));
+    if(this.shouldSkipRecord(headers,cacheControl)){
+    continue;
+    }
+    
+    
+    let cacheLifetimeInSeconds=CacheHeaders.computeCacheLifetimeInSeconds(
+    headers,cacheControl);
+    if(cacheLifetimeInSeconds!==null&&(
+    !Number.isFinite(cacheLifetimeInSeconds)||cacheLifetimeInSeconds<=0)){
+    continue;
+    }
+    cacheLifetimeInSeconds=cacheLifetimeInSeconds||0;
+    
+    
+    const cacheHitProbability=CacheHeaders.getCacheHitProbability(cacheLifetimeInSeconds);
+    if(cacheHitProbability>IGNORE_THRESHOLD_IN_PERCENT)continue;
+    
+    const url=URL.elideDataURI(record.url);
+    const totalBytes=record.transferSize||0;
+    const wastedBytes=(1-cacheHitProbability)*totalBytes;
+    
+    totalWastedBytes+=wastedBytes;
+    if(url.includes('?'))queryStringCount++;
+    
+    
+    
+    let debugData;
+    if(cacheControl){
+    debugData={
+    type:'debugdata',
+    ...cacheControl};
+    
+    }
+    
+    results.push({
+    url,
+    debugData,
+    cacheLifetimeMs:cacheLifetimeInSeconds*1000,
+    cacheHitProbability,
+    totalBytes,
+    wastedBytes});
+    
+    }
+    
+    results.sort((a,b)=>{
+    return a.cacheLifetimeMs-b.cacheLifetimeMs||
+    b.totalBytes-a.totalBytes||
+    a.url.localeCompare(b.url);
+    });
+    
+    const score=Audit.computeLogNormalScore(
+    totalWastedBytes,
+    context.options.scorePODR,
+    context.options.scoreMedian);
+    
+    
+    
+    const headings=[
+    {key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
+    
+    {key:'cacheLifetimeMs',itemType:'ms',text:str_(i18n.UIStrings.columnCacheTTL),
+    displayUnit:'duration'},
+    {key:'totalBytes',itemType:'bytes',text:str_(i18n.UIStrings.columnSize),
+    displayUnit:'kb',granularity:1}];
+    
+    
+    const summary={wastedBytes:totalWastedBytes};
+    const details=Audit.makeTableDetails(headings,results,summary);
+    
+    return{
+    score,
+    numericValue:totalWastedBytes,
+    displayValue:str_(UIStrings.displayValue,{itemCount:results.length}),
+    extendedInfo:{
+    value:{
+    results,
+    queryStringCount}},
+    
+    
+    details};
+    
+    });
+    }}
+    
+    
+    module.exports=CacheHeaders;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl.js");
+    },{"../../computed/network-records.js":34,"../../lib/i18n/i18n.js":66,"../../lib/network-request.js":75,"../../lib/statistics.js":81,"../../lib/url-shim.js":"url","../audit.js":3,"assert":92,"parse-cache-control":155}],"../audits/byte-efficiency/uses-optimized-images":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
+    const URL=require('../../lib/url-shim.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Efficiently encode images',
+    
+    description:'Optimized images load faster and consume less cellular data. '+
+    '[Learn more](https://web.dev/uses-optimized-images).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    const IGNORE_THRESHOLD_IN_BYTES=4096;
+    
+    class UsesOptimizedImages extends ByteEfficiencyAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'uses-optimized-images',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['OptimizedImages','ImageElements','devtoolsLogs','traces','URL']};
+    
+    }
+    
+    
+    
+    
+    
+    static computeSavings(image){
+    const bytes=image.originalSize-image.jpegSize;
+    const percent=100*bytes/image.originalSize;
+    return{bytes,percent};
+    }
+    
+    
+    
+    
+    
+    static estimateJPEGSizeFromDimensions(imageElement){
+    const totalPixels=imageElement.naturalWidth*imageElement.naturalHeight;
+    
+    
+    
+    
+    const expectedBytesPerPixel=2*1/8;
+    return Math.round(totalPixels*expectedBytesPerPixel);
+    }
+    
+    
+    
+    
+    
+    static audit_(artifacts){
+    const pageURL=artifacts.URL.finalUrl;
+    const images=artifacts.OptimizedImages;
+    const imageElements=artifacts.ImageElements;
+    
+    const imageElementsByURL=new Map();
+    imageElements.forEach(img=>imageElementsByURL.set(img.src,img));
+    
+    
+    const items=[];
+    const warnings=[];
+    for(const image of images){
+    if(image.failed){
+    warnings.push(`Unable to decode ${URL.getURLDisplayName(image.url)}`);
+    continue;
+    }else if(/(jpeg|bmp)/.test(image.mimeType)===false){
+    continue;
+    }
+    
+    let jpegSize=image.jpegSize;
+    let fromProtocol=true;
+    
+    if(typeof jpegSize==='undefined'){
+    const imageElement=imageElementsByURL.get(image.url);
+    if(!imageElement){
+    warnings.push(`Unable to locate resource ${URL.getURLDisplayName(image.url)}`);
+    continue;
+    }
+    
+    jpegSize=UsesOptimizedImages.estimateJPEGSizeFromDimensions(imageElement);
+    fromProtocol=false;
+    }
+    
+    if(image.originalSize<jpegSize+IGNORE_THRESHOLD_IN_BYTES)continue;
+    
+    const url=URL.elideDataURI(image.url);
+    const isCrossOrigin=!URL.originsMatch(pageURL,image.url);
+    const jpegSavings=UsesOptimizedImages.computeSavings({...image,jpegSize});
+    
+    items.push({
+    url,
+    fromProtocol,
+    isCrossOrigin,
+    totalBytes:image.originalSize,
+    wastedBytes:jpegSavings.bytes});
+    
+    }
+    
+    
+    const headings=[
+    {key:'url',valueType:'thumbnail',label:''},
+    {key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+    {key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
+    {key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
+    
+    
+    return{
+    warnings,
+    items,
+    headings};
+    
+    }}
+    
+    
+    module.exports=UsesOptimizedImages;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/byte-efficiency/uses-optimized-images.js");
+    },{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/uses-responsive-images":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
+    const Sentry=require('../../lib/sentry.js');
+    const URL=require('../../lib/url-shim.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Properly size images',
+    
+    description:
+    'Serve images that are appropriately-sized to save cellular data '+
+    'and improve load time. '+
+    '[Learn more](https://web.dev/uses-responsive-images).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    const IGNORE_THRESHOLD_IN_BYTES=2048;
+    
+    class UsesResponsiveImages extends ByteEfficiencyAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'uses-responsive-images',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['ImageElements','ViewportDimensions','devtoolsLogs','traces']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static computeWaste(image,DPR){
+    
+    if(!image.resourceSize){
+    return null;
+    }
+    
+    const url=URL.elideDataURI(image.src);
+    const actualPixels=image.naturalWidth*image.naturalHeight;
+    const usedPixels=image.displayedWidth*image.displayedHeight*Math.pow(DPR,2);
+    const wastedRatio=1-usedPixels/actualPixels;
+    const totalBytes=image.resourceSize;
+    const wastedBytes=Math.round(totalBytes*wastedRatio);
+    
+    
+    
+    if(!usedPixels){
+    return null;
+    }
+    
+    if(!Number.isFinite(wastedRatio)){
+    return new Error(`Invalid image sizing information ${url}`);
+    }
+    
+    return{
+    url,
+    totalBytes,
+    wastedBytes,
+    wastedPercent:100*wastedRatio};
+    
+    }
+    
+    
+    
+    
+    
+    static audit_(artifacts){
+    const images=artifacts.ImageElements;
+    const DPR=artifacts.ViewportDimensions.devicePixelRatio;
+    
+    
+    const warnings=[];
+    
+    const resultsMap=new Map();
+    for(const image of images){
+    
+    
+    
+    
+    if(!image.resourceSize||image.mimeType==='image/svg+xml'||image.isCss){
+    continue;
+    }
+    
+    const processed=UsesResponsiveImages.computeWaste(image,DPR);
+    if(!processed)continue;
+    
+    if(processed instanceof Error){
+    warnings.push(processed.message);
+    Sentry.captureException(processed,{tags:{audit:this.meta.id},level:'warning'});
+    continue;
+    }
+    
+    
+    const existing=resultsMap.get(processed.url);
+    if(!existing||existing.wastedBytes>processed.wastedBytes){
+    resultsMap.set(processed.url,processed);
+    }
+    }
+    
+    const items=Array.from(resultsMap.values()).
+    filter(item=>item.wastedBytes>IGNORE_THRESHOLD_IN_BYTES);
+    
+    
+    const headings=[
+    {key:'url',valueType:'thumbnail',label:''},
+    {key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+    {key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
+    {key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
+    
+    
+    return{
+    warnings,
+    items,
+    headings};
+    
+    }}
+    
+    
+    module.exports=UsesResponsiveImages;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/byte-efficiency/uses-responsive-images.js");
+    },{"../../lib/i18n/i18n.js":66,"../../lib/sentry.js":78,"../../lib/url-shim.js":"url","./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/uses-text-compression":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
+    const URL=require('../../lib/url-shim.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Enable text compression',
+    
+    description:'Text-based resources should be served with compression (gzip, deflate or'+
+    ' brotli) to minimize total network bytes.'+
+    ' [Learn more](https://web.dev/uses-text-compression).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    const IGNORE_THRESHOLD_IN_BYTES=1400;
+    const IGNORE_THRESHOLD_IN_PERCENT=0.1;
+    
+    class ResponsesAreCompressed extends ByteEfficiencyAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'uses-text-compression',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['ResponseCompression','devtoolsLogs','traces']};
+    
+    }
+    
+    
+    
+    
+    
+    static audit_(artifacts){
+    const uncompressedResponses=artifacts.ResponseCompression;
+    
+    
+    const items=[];
+    uncompressedResponses.forEach(record=>{
+    
+    if(!record.gzipSize||record.gzipSize<0)return;
+    
+    const originalSize=record.resourceSize;
+    const gzipSize=record.gzipSize;
+    const gzipSavings=originalSize-gzipSize;
+    
+    
+    
+    if(1-gzipSize/originalSize<IGNORE_THRESHOLD_IN_PERCENT||
+    gzipSavings<IGNORE_THRESHOLD_IN_BYTES||
+    record.transferSize<gzipSize)
+    {
+    return;
+    }
+    
+    
+    const url=URL.elideDataURI(record.url);
+    const isDuplicate=items.find(item=>item.url===url&&
+    item.totalBytes===record.resourceSize);
+    if(isDuplicate){
+    return;
+    }
+    
+    items.push({
+    url,
+    totalBytes:originalSize,
+    wastedBytes:gzipSavings});
+    
+    });
+    
+    
+    const headings=[
+    {key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+    {key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
+    {key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
+    
+    
+    return{
+    items,
+    headings};
+    
+    }}
+    
+    
+    module.exports=ResponsesAreCompressed;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/byte-efficiency/uses-text-compression.js");
+    },{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","./byte-efficiency-audit.js":4}],"../audits/byte-efficiency/uses-webp-images":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ByteEfficiencyAudit=require('./byte-efficiency-audit.js');
+    const URL=require('../../lib/url-shim.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Serve images in next-gen formats',
+    
+    description:'Image formats like JPEG 2000, JPEG XR, and WebP often provide better '+
+    'compression than PNG or JPEG, which means faster downloads and less data consumption. '+
+    '[Learn more](https://web.dev/uses-webp-images).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    const IGNORE_THRESHOLD_IN_BYTES=8192;
+    
+    class UsesWebPImages extends ByteEfficiencyAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'uses-webp-images',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:ByteEfficiencyAudit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['OptimizedImages','devtoolsLogs','traces','URL','ImageElements']};
+    
+    }
+    
+    
+    
+    
+    
+    static computeSavings(image){
+    const bytes=image.originalSize-image.webpSize;
+    const percent=100*bytes/image.originalSize;
+    return{bytes,percent};
+    }
+    
+    
+    
+    
+    
+    static estimateWebPSizeFromDimensions(imageElement){
+    const totalPixels=imageElement.naturalWidth*imageElement.naturalHeight;
+    
+    
+    
+    
+    
+    const expectedBytesPerPixel=2*1/10;
+    return Math.round(totalPixels*expectedBytesPerPixel);
+    }
+    
+    
+    
+    
+    
+    static audit_(artifacts){
+    const pageURL=artifacts.URL.finalUrl;
+    const images=artifacts.OptimizedImages;
+    const imageElements=artifacts.ImageElements;
+    
+    const imageElementsByURL=new Map();
+    imageElements.forEach(img=>imageElementsByURL.set(img.src,img));
+    
+    
+    const items=[];
+    const warnings=[];
+    for(const image of images){
+    if(image.failed){
+    warnings.push(`Unable to decode ${URL.getURLDisplayName(image.url)}`);
+    continue;
+    }
+    
+    let webpSize=image.webpSize;
+    let fromProtocol=true;
+    
+    if(typeof webpSize==='undefined'){
+    const imageElement=imageElementsByURL.get(image.url);
+    if(!imageElement){
+    warnings.push(`Unable to locate resource ${URL.getURLDisplayName(image.url)}`);
+    continue;
+    }
+    
+    webpSize=UsesWebPImages.estimateWebPSizeFromDimensions(imageElement);
+    fromProtocol=false;
+    }
+    
+    if(image.originalSize<webpSize+IGNORE_THRESHOLD_IN_BYTES)continue;
+    
+    const url=URL.elideDataURI(image.url);
+    const isCrossOrigin=!URL.originsMatch(pageURL,image.url);
+    const webpSavings=UsesWebPImages.computeSavings({...image,webpSize:webpSize});
+    
+    items.push({
+    url,
+    fromProtocol,
+    isCrossOrigin,
+    totalBytes:image.originalSize,
+    wastedBytes:webpSavings.bytes});
+    
+    }
+    
+    
+    const headings=[
+    {key:'url',valueType:'thumbnail',label:''},
+    {key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+    {key:'totalBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnSize)},
+    {key:'wastedBytes',valueType:'bytes',label:str_(i18n.UIStrings.columnWastedBytes)}];
+    
+    
+    return{
+    warnings,
+    items,
+    headings};
+    
+    }}
+    
+    
+    module.exports=UsesWebPImages;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/byte-efficiency/uses-webp-images.js");
+    },{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","./byte-efficiency-audit.js":4}],"../audits/content-width":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Content is sized correctly for the viewport',
+    
+    failureTitle:'Content is not sized correctly for the viewport',
+    
+    description:'If the width of your app\'s content doesn\'t match the width '+
+    'of the viewport, your app might not be optimized for mobile screens. '+
+    '[Learn more](https://web.dev/content-width).',
+    
+    
+    
+    
+    
+    explanation:'The viewport size of {innerWidth}px does not match the window '+
+    'size of {outerWidth}px.'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class ContentWidth extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'content-width',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['ViewportDimensions','TestedAsMobileDevice']};
+    
+    }
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    const IsMobile=artifacts.TestedAsMobileDevice;
+    const viewportWidth=artifacts.ViewportDimensions.innerWidth;
+    const windowWidth=artifacts.ViewportDimensions.outerWidth;
+    const widthsMatch=viewportWidth===windowWidth;
+    
+    if(!IsMobile){
+    return{
+    score:1,
+    notApplicable:true};
+    
+    }
+    
+    let explanation='';
+    if(!widthsMatch){
+    explanation=str_(UIStrings.explanation,
+    {innerWidth:artifacts.ViewportDimensions.innerWidth,
+    outerWidth:artifacts.ViewportDimensions.outerWidth});
+    }
+    
+    return{
+    score:Number(widthsMatch),
+    explanation};
+    
+    }}
+    
+    
+    module.exports=ContentWidth;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/content-width.js");
+    },{"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/critical-request-chains":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    const ComputedChains=require('../computed/critical-request-chains.js');
+    
+    const UIStrings={
+    
+    title:'Avoid chaining critical requests',
+    
+    description:'The Critical Request Chains below show you what resources are '+
+    'loaded with a high priority. Consider reducing '+
+    'the length of chains, reducing the download size of resources, or '+
+    'deferring the download of unnecessary resources to improve page load. '+
+    '[Learn more](https://web.dev/critical-request-chains).',
+    
+    displayValue:`{itemCount, plural,
+        =1 {1 chain found}
+        other {# chains found}
+        }`};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class CriticalRequestChains extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'critical-request-chains',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
+    requiredArtifacts:['devtoolsLogs','URL']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    static _traverse(tree,cb){
+    
+    
+    
+    
+    
+    
+    function walk(node,depth,startTime,transferSize=0){
+    const children=Object.keys(node);
+    if(children.length===0){
+    return;
+    }
+    children.forEach(id=>{
+    const child=node[id];
+    if(!startTime){
+    startTime=child.request.startTime;
+    }
+    
+    
+    cb({
+    depth,
+    id,
+    node:child,
+    chainDuration:(child.request.endTime-startTime)*1000,
+    chainTransferSize:transferSize+child.request.transferSize});
+    
+    
+    
+    if(child.children){
+    walk(child.children,depth+1,startTime);
+    }
+    },'');
+    }
+    
+    walk(tree,0);
+    }
+    
+    
+    
+    
+    
+    
+    static _getLongestChain(tree){
+    const longest={
+    duration:0,
+    length:0,
+    transferSize:0};
+    
+    CriticalRequestChains._traverse(tree,opts=>{
+    const duration=opts.chainDuration;
+    if(duration>longest.duration){
+    longest.duration=duration;
+    longest.transferSize=opts.chainTransferSize;
+    longest.length=opts.depth;
+    }
+    });
+    
+    longest.length++;
+    return longest;
+    }
+    
+    
+    
+    
+    
+    static flattenRequests(tree){
+    
+    const flattendChains={};
+    
+    const chainMap=new Map();
+    
+    
+    function flatten(opts){
+    const request=opts.node.request;
+    const simpleRequest={
+    url:request.url,
+    startTime:request.startTime,
+    endTime:request.endTime,
+    responseReceivedTime:request.responseReceivedTime,
+    transferSize:request.transferSize};
+    
+    
+    let chain=chainMap.get(opts.id);
+    if(chain){
+    chain.request=simpleRequest;
+    }else{
+    chain={
+    request:simpleRequest};
+    
+    flattendChains[opts.id]=chain;
+    }
+    
+    if(opts.node.children){
+    for(const chainId of Object.keys(opts.node.children)){
+    
+    const childChain={
+    request:{}};
+    
+    chainMap.set(chainId,childChain);
+    if(!chain.children){
+    chain.children={};
+    }
+    chain.children[chainId]=childChain;
+    }
+    }
+    chainMap.set(opts.id,chain);
+    }
+    
+    CriticalRequestChains._traverse(tree,flatten);
+    
+    return flattendChains;
+    }
+    
+    
+    
+    
+    
+    
+    
+    static audit(artifacts,context){
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const URL=artifacts.URL;
+    return ComputedChains.request({devtoolsLog,URL},context).then(chains=>{
+    let chainCount=0;
+    
+    
+    
+    
+    function walk(node,depth){
+    const childIds=Object.keys(node);
+    
+    childIds.forEach(id=>{
+    const child=node[id];
+    if(child.children){
+    walk(child.children,depth+1);
+    }else{
+    
+    chainCount++;
+    }
+    },'');
+    }
+    
+    const flattenedChains=CriticalRequestChains.flattenRequests(chains);
+    
+    
+    const initialNavKey=Object.keys(flattenedChains)[0];
+    const initialNavChildren=initialNavKey&&flattenedChains[initialNavKey].children;
+    if(initialNavChildren&&Object.keys(initialNavChildren).length>0){
+    walk(initialNavChildren,0);
+    }
+    
+    const longestChain=CriticalRequestChains._getLongestChain(flattenedChains);
+    
+    return{
+    score:Number(chainCount===0),
+    notApplicable:chainCount===0,
+    displayValue:chainCount?str_(UIStrings.displayValue,{itemCount:chainCount}):'',
+    extendedInfo:{
+    value:{
+    chains:flattenedChains,
+    longestChain}},
+    
+    
+    details:{
+    type:'criticalrequestchain',
+    chains:flattenedChains,
+    longestChain}};
+    
+    
+    });
+    }}
+    
+    
+    module.exports=CriticalRequestChains;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/critical-request-chains.js");
+    },{"../computed/critical-request-chains.js":9,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/deprecations":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    const Audit=require('./audit.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Avoids deprecated APIs',
+    
+    failureTitle:'Uses deprecated APIs',
+    
+    description:'Deprecated APIs will eventually be removed from the browser. '+
+    '[Learn more](https://web.dev/deprecations).',
+    
+    displayValue:`{itemCount, plural,
+        =1 {1 warning found}
+        other {# warnings found}
+        }`,
+    
+    columnDeprecate:'Deprecation / Warning',
+    
+    columnLine:'Line'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class Deprecations extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'deprecations',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['ConsoleMessages']};
+    
+    }
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    const entries=artifacts.ConsoleMessages;
+    
+    const deprecations=entries.filter(log=>log.entry.source==='deprecation').map(log=>{
+    return{
+    value:log.entry.text,
+    url:log.entry.url||'',
+    source:log.entry.source,
+    lineNumber:log.entry.lineNumber};
+    
+    });
+    
+    
+    const headings=[
+    {key:'value',itemType:'text',text:str_(UIStrings.columnDeprecate)},
+    {key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
+    {key:'lineNumber',itemType:'text',text:str_(UIStrings.columnLine)}];
+    
+    const details=Audit.makeTableDetails(headings,deprecations);
+    
+    let displayValue='';
+    if(deprecations.length>0){
+    displayValue=str_(UIStrings.displayValue,{itemCount:deprecations.length});
+    }
+    
+    return{
+    score:Number(deprecations.length===0),
+    displayValue,
+    extendedInfo:{
+    value:deprecations},
+    
+    details};
+    
+    }}
+    
+    
+    module.exports=Deprecations;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/deprecations.js");
+    },{"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/diagnostics":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const MainThreadTasksComputed=require('../computed/main-thread-tasks.js');
+    const NetworkRecordsComputed=require('../computed/network-records.js');
+    const NetworkAnalysisComputed=require('../computed/network-analysis.js');
+    const NetworkAnalyzer=require('../lib/dependency-graph/simulator/network-analyzer.js');
+    
+    class Diagnostics extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'diagnostics',
+    scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
+    title:'Diagnostics',
+    description:'Collection of useful page vitals.',
+    requiredArtifacts:['traces','devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const tasks=await MainThreadTasksComputed.request(trace,context);
+    const records=await NetworkRecordsComputed.request(devtoolsLog,context);
+    const analysis=await NetworkAnalysisComputed.request(devtoolsLog,context);
+    
+    const toplevelTasks=tasks.filter(t=>!t.parent);
+    const mainDocumentTransferSize=NetworkAnalyzer.findMainDocument(records).transferSize;
+    const totalByteWeight=records.reduce((sum,r)=>sum+(r.transferSize||0),0);
+    const totalTaskTime=toplevelTasks.reduce((sum,t)=>sum+(t.duration||0),0);
+    const maxRtt=Math.max(...analysis.additionalRttByOrigin.values())+analysis.rtt;
+    const maxServerLatency=Math.max(...analysis.serverResponseTimeByOrigin.values());
+    
+    const diagnostics={
+    numRequests:records.length,
+    numScripts:records.filter(r=>r.resourceType==='Script').length,
+    numStylesheets:records.filter(r=>r.resourceType==='Stylesheet').length,
+    numFonts:records.filter(r=>r.resourceType==='Font').length,
+    numTasks:toplevelTasks.length,
+    numTasksOver10ms:toplevelTasks.filter(t=>t.duration>10).length,
+    numTasksOver25ms:toplevelTasks.filter(t=>t.duration>25).length,
+    numTasksOver50ms:toplevelTasks.filter(t=>t.duration>50).length,
+    numTasksOver100ms:toplevelTasks.filter(t=>t.duration>100).length,
+    numTasksOver500ms:toplevelTasks.filter(t=>t.duration>500).length,
+    rtt:analysis.rtt,
+    throughput:analysis.throughput,
+    maxRtt,
+    maxServerLatency,
+    totalByteWeight,
+    totalTaskTime,
+    mainDocumentTransferSize};
+    
+    
+    return{
+    score:1,
+    details:{
+    type:'debugdata',
+    
+    items:[diagnostics]}};
+    
+    
+    }}
+    
+    
+    module.exports=Diagnostics;
+    
+    },{"../computed/main-thread-tasks.js":12,"../computed/network-analysis.js":33,"../computed/network-records.js":34,"../lib/dependency-graph/simulator/network-analyzer.js":62,"./audit.js":3}],"../audits/dobetterweb/appcache-manifest":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('../audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Avoids Application Cache',
+    
+    failureTitle:'Uses Application Cache',
+    
+    description:'Application Cache is deprecated. '+
+    '[Learn more](https://web.dev/appcache-manifest).',
+    
+    
+    
+    
+    displayValue:'Found "{AppCacheManifest}"'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class AppCacheManifestAttr extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'appcache-manifest',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['AppCacheManifest']};
+    
+    }
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    
+    if(artifacts.AppCacheManifest!==null){
+    return{
+    score:0,
+    displayValue:str_(UIStrings.displayValue,{AppCacheManifest:artifacts.AppCacheManifest})};
+    
+    }
+    
+    return{
+    score:1};
+    
+    }}
+    
+    
+    module.exports=AppCacheManifestAttr;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/dobetterweb/appcache-manifest.js");
+    },{"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/dobetterweb/doctype":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('../audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Page has the HTML doctype',
+    
+    failureTitle:'Page lacks the HTML doctype, thus triggering quirks-mode',
+    
+    description:'Specifying a doctype prevents the browser '+
+    'from switching to quirks-mode. '+
+    '[Learn more](https://web.dev/doctype).',
+    
+    explanationNoDoctype:'Document must contain a doctype',
+    
+    explanationPublicId:'Expected publicId to be an empty string',
+    
+    explanationSystemId:'Expected systemId to be an empty string',
+    
+    explanationBadDoctype:'Doctype name must be the lowercase string `html`'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class Doctype extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'doctype',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Doctype']};
+    
+    }
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    if(!artifacts.Doctype){
+    return{
+    score:0,
+    explanation:str_(UIStrings.explanationNoDoctype)};
+    
+    }
+    
+    
+    const doctypeName=artifacts.Doctype.name.trim();
+    const doctypePublicId=artifacts.Doctype.publicId;
+    const doctypeSystemId=artifacts.Doctype.systemId;
+    
+    if(doctypePublicId!==''){
+    return{
+    score:0,
+    explanation:str_(UIStrings.explanationPublicId)};
+    
+    }
+    
+    if(doctypeSystemId!==''){
+    return{
+    score:0,
+    explanation:str_(UIStrings.explanationSystemId)};
+    
+    }
+    
+    
+    
+    
+    if(doctypeName==='html'){
+    return{
+    score:1};
+    
+    }else{
+    return{
+    score:0,
+    explanation:str_(UIStrings.explanationBadDoctype)};
+    
+    }
+    }}
+    
+    
+    module.exports=Doctype;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/dobetterweb/doctype.js");
+    },{"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/dobetterweb/dom-size":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('../audit.js');
+    const Util=require('../../report/html/renderer/util.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Avoids an excessive DOM size',
+    
+    failureTitle:'Avoid an excessive DOM size',
+    
+    description:'A large DOM will increase memory usage, cause longer '+
+    '[style calculations](https://developers.google.com/web/fundamentals/performance/rendering/reduce-the-scope-and-complexity-of-style-calculations), '+
+    'and produce costly [layout reflows](https://developers.google.com/speed/articles/reflow). [Learn more](https://web.dev/dom-size).',
+    
+    columnStatistic:'Statistic',
+    
+    columnElement:'Element',
+    
+    columnValue:'Value',
+    
+    displayValue:`{itemCount, plural,
+        =1 {1 element}
+        other {# elements}
+        }`,
+    
+    statisticDOMElements:'Total DOM Elements',
+    
+    statisticDOMDepth:'Maximum DOM Depth',
+    
+    statisticDOMWidth:'Maximum Child Elements'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    class DOMSize extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'dom-size',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['DOMStats']};
+    
+    }
+    
+    
+    
+    
+    static get defaultOptions(){
+    return{
+    
+    
+    
+    scorePODR:700,
+    scoreMedian:1400};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    static audit(artifacts,context){
+    const stats=artifacts.DOMStats;
+    
+    const score=Audit.computeLogNormalScore(
+    stats.totalBodyElements,
+    context.options.scorePODR,
+    context.options.scoreMedian);
+    
+    
+    
+    const headings=[
+    {key:'statistic',itemType:'text',text:str_(UIStrings.columnStatistic)},
+    {key:'element',itemType:'code',text:str_(UIStrings.columnElement)},
+    {key:'value',itemType:'numeric',text:str_(UIStrings.columnValue)}];
+    
+    
+    
+    const items=[
+    {
+    statistic:str_(UIStrings.statisticDOMElements),
+    element:'',
+    value:Util.formatNumber(stats.totalBodyElements)},
+    
+    {
+    statistic:str_(UIStrings.statisticDOMDepth),
+    element:{
+    type:'code',
+    value:stats.depth.snippet},
+    
+    value:Util.formatNumber(stats.depth.max)},
+    
+    {
+    statistic:str_(UIStrings.statisticDOMWidth),
+    element:{
+    type:'code',
+    value:stats.width.snippet},
+    
+    value:Util.formatNumber(stats.width.max)}];
+    
+    
+    
+    return{
+    score,
+    numericValue:stats.totalBodyElements,
+    displayValue:str_(UIStrings.displayValue,{itemCount:stats.totalBodyElements}),
+    extendedInfo:{
+    value:items},
+    
+    details:Audit.makeTableDetails(headings,items)};
+    
+    }}
+    
+    
+    module.exports=DOMSize;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/dobetterweb/dom-size.js");
+    },{"../../lib/i18n/i18n.js":66,"../../report/html/renderer/util.js":87,"../audit.js":3}],"../audits/dobetterweb/external-anchors-use-rel-noopener":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const URL=require('../../lib/url-shim.js');
+    const Audit=require('../audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Links to cross-origin destinations are safe',
+    
+    failureTitle:'Links to cross-origin destinations are unsafe',
+    
+    description:'Add `rel="noopener"` or `rel="noreferrer"` to any external links to improve '+
+    'performance and prevent security vulnerabilities. '+
+    '[Learn more](https://web.dev/external-anchors-use-rel-noopener).',
+    
+    
+    
+    
+    warning:'Unable to determine the destination for anchor ({anchorHTML}). '+
+    'If not used as a hyperlink, consider removing target=_blank.',
+    
+    columnTarget:'Target',
+    
+    columnRel:'Rel'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class ExternalAnchorsUseRelNoopenerAudit extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'external-anchors-use-rel-noopener',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['URL','AnchorElements']};
+    
+    }
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    
+    const warnings=[];
+    const pageHost=new URL(artifacts.URL.finalUrl).host;
+    const failingAnchors=artifacts.AnchorElements.
+    filter(anchor=>anchor.target==='_blank'&&!anchor.rel.includes('noopener')&&
+    !anchor.rel.includes('noreferrer')).
+    
+    filter(anchor=>{
+    try{
+    return new URL(anchor.href).host!==pageHost;
+    }catch(err){
+    warnings.push(str_(UIStrings.warning,{anchorHTML:anchor.outerHTML}));
+    return true;
+    }
+    }).
+    filter(anchor=>{
+    return!anchor.href||anchor.href.toLowerCase().startsWith('http');
+    }).
+    map(anchor=>{
+    return{
+    href:anchor.href||'Unknown',
+    target:anchor.target||'',
+    rel:anchor.rel||'',
+    outerHTML:anchor.outerHTML||''};
+    
+    });
+    
+    
+    const headings=[
+    {key:'href',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
+    {key:'target',itemType:'text',text:str_(UIStrings.columnTarget)},
+    {key:'rel',itemType:'text',text:str_(UIStrings.columnRel)}];
+    
+    
+    const details=Audit.makeTableDetails(headings,failingAnchors);
+    
+    return{
+    score:Number(failingAnchors.length===0),
+    extendedInfo:{
+    value:failingAnchors},
+    
+    details,
+    warnings};
+    
+    }}
+    
+    
+    module.exports=ExternalAnchorsUseRelNoopenerAudit;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/dobetterweb/external-anchors-use-rel-noopener.js");
+    },{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/dobetterweb/geolocation-on-start":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ViolationAudit=require('../violation-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Avoids requesting the geolocation permission on page load',
+    
+    failureTitle:'Requests the geolocation permission on page load',
+    
+    description:'Users are mistrustful of or confused by sites that request their '+
+    'location without context. Consider tying the request to a user action instead. '+
+    '[Learn more](https://web.dev/geolocation-on-start).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class GeolocationOnStart extends ViolationAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'geolocation-on-start',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['ConsoleMessages']};
+    
+    }
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    
+    const results=ViolationAudit.getViolationResults(artifacts,/geolocation/);
+    
+    
+    const headings=[
+    {key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
+    {key:'label',itemType:'text',text:str_(i18n.UIStrings.columnLocation)}];
+    
+    
+    
+    const details=ViolationAudit.makeTableDetails(headings,results);
+    
+    return{
+    score:Number(results.length===0),
+    extendedInfo:{
+    value:results},
+    
+    details};
+    
+    }}
+    
+    
+    module.exports=GeolocationOnStart;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/dobetterweb/geolocation-on-start.js");
+    },{"../../lib/i18n/i18n.js":66,"../violation-audit.js":7}],"../audits/dobetterweb/js-libraries":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('../audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Detected JavaScript libraries',
+    
+    description:'All front-end JavaScript libraries detected on the page. [Learn more](https://web.dev/js-libraries).',
+    
+    columnVersion:'Version'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class JsLibrariesAudit extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'js-libraries',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Stacks']};
+    
+    }
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    const libDetails=artifacts.Stacks.
+    filter(stack=>stack.detector==='js').
+    map(stack=>({
+    name:stack.name,
+    version:stack.version,
+    npm:stack.npm}));
+    
+    
+    
+    const headings=[
+    {key:'name',itemType:'text',text:str_(i18n.UIStrings.columnName)},
+    {key:'version',itemType:'text',text:str_(UIStrings.columnVersion)}];
+    
+    const details=Audit.makeTableDetails(headings,libDetails,{});
+    
+    return{
+    score:1,
+    details};
+    
+    }}
+    
+    
+    module.exports=JsLibrariesAudit;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/dobetterweb/js-libraries.js");
+    },{"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/dobetterweb/no-document-write":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ViolationAudit=require('../violation-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Avoids `document.write()`',
+    
+    failureTitle:'Uses `document.write()`',
+    
+    description:'For users on slow connections, external scripts dynamically injected via '+
+    '`document.write()` can delay page load by tens of seconds. '+
+    '[Learn more](https://web.dev/no-document-write).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class NoDocWriteAudit extends ViolationAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'no-document-write',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['ConsoleMessages']};
+    
+    }
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    const results=ViolationAudit.getViolationResults(artifacts,/document\.write/);
+    
+    
+    const headings=[
+    {key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
+    {key:'label',itemType:'text',text:str_(i18n.UIStrings.columnLocation)}];
+    
+    
+    const details=ViolationAudit.makeTableDetails(headings,results);
+    
+    return{
+    score:Number(results.length===0),
+    extendedInfo:{
+    value:results},
+    
+    details};
+    
+    }}
+    
+    
+    module.exports=NoDocWriteAudit;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/dobetterweb/no-document-write.js");
+    },{"../../lib/i18n/i18n.js":66,"../violation-audit.js":7}],"../audits/dobetterweb/no-vulnerable-libraries":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('../audit.js');
+    const Sentry=require('../../lib/sentry.js');
+    const semver=require('semver');
+    const snykDatabase=require('../../../third-party/snyk/snapshot.json');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Avoids front-end JavaScript libraries'+
+    ' with known security vulnerabilities',
+    
+    failureTitle:'Includes front-end JavaScript libraries'+
+    ' with known security vulnerabilities',
+    
+    description:'Some third-party scripts may contain known security vulnerabilities '+
+    'that are easily identified and exploited by attackers. '+
+    '[Learn more](https://web.dev/no-vulnerable-libraries).',
+    
+    displayValue:`{itemCount, plural,
+        =1 {1 vulnerability detected}
+        other {# vulnerabilities detected}
+        }`,
+    
+    columnVersion:'Library Version',
+    
+    columnVuln:'Vulnerability Count',
+    
+    columnSeverity:'Highest Severity',
+    
+    rowSeverityLow:'Low',
+    
+    rowSeverityMedium:'Medium',
+    
+    rowSeverityHigh:'High'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    const SEMVER_REGEX=/^(\d+\.\d+\.\d+)[^-0-9]+/;
+    
+    
+    const rowMap={
+    'low':str_(UIStrings.rowSeverityLow),
+    'medium':str_(UIStrings.rowSeverityMedium),
+    'high':str_(UIStrings.rowSeverityHigh)};
+    
+    
+    
+    
+    
+    class NoVulnerableLibrariesAudit extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'no-vulnerable-libraries',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Stacks']};
+    
+    }
+    
+    
+    
+    
+    static get snykDB(){
+    return snykDatabase;
+    }
+    
+    
+    
+    
+    static get severityMap(){
+    return{
+    high:3,
+    medium:2,
+    low:1};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static normalizeVersion(version){
+    if(!version)return version;
+    if(semver.valid(version))return version;
+    
+    
+    if(/^\d+\.\d+$/.test(version))return`${version}.0`;
+    
+    const versionMatch=version.match(SEMVER_REGEX);
+    if(versionMatch)return versionMatch[1];
+    
+    return version;
+    }
+    
+    
+    
+    
+    
+    
+    
+    static getVulnerabilities(normalizedVersion,lib,snykDB){
+    if(!lib.npm||!snykDB.npm[lib.npm]){
+    return[];
+    }
+    
+    
+    try{
+    semver.satisfies(normalizedVersion,'*');
+    }catch(err){
+    err.pkgName=lib.npm;
+    
+    Sentry.captureException(err,{level:'warning'});
+    return[];
+    }
+    
+    
+    const vulnCandidatesForLib=snykDB.npm[lib.npm];
+    const matchingVulns=vulnCandidatesForLib.filter(vulnCandidate=>{
+    
+    
+    const hasMatchingVersion=vulnCandidate.semver.vulnerable.some(vulnSemverRange=>
+    semver.satisfies(normalizedVersion,vulnSemverRange));
+    
+    return hasMatchingVersion;
+    });
+    
+    const vulns=matchingVulns.map(vuln=>{
+    return{
+    severity:rowMap[vuln.severity],
+    numericSeverity:this.severityMap[vuln.severity],
+    library:`${lib.name}@${normalizedVersion}`,
+    url:'https://snyk.io/vuln/'+vuln.id};
+    
+    });
+    
+    return vulns;
+    }
+    
+    
+    
+    
+    
+    static highestSeverity(vulnerabilities){
+    const sortedVulns=vulnerabilities.
+    sort((a,b)=>b.numericSeverity-a.numericSeverity);
+    return sortedVulns[0].severity;
+    }
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    const foundLibraries=artifacts.Stacks.filter(stack=>stack.detector==='js');
+    const snykDB=NoVulnerableLibrariesAudit.snykDB;
+    
+    if(!foundLibraries.length){
+    return{
+    score:1};
+    
+    }
+    
+    let totalVulns=0;
+    
+    const vulnerabilityResults=[];
+    
+    const libraryVulns=foundLibraries.map(lib=>{
+    const version=this.normalizeVersion(lib.version)||'';
+    const vulns=this.getVulnerabilities(version,lib,snykDB);
+    const vulnCount=vulns.length;
+    totalVulns+=vulnCount;
+    
+    let highestSeverity;
+    if(vulns.length>0){
+    highestSeverity=this.highestSeverity(vulns);
+    
+    vulnerabilityResults.push({
+    highestSeverity,
+    vulnCount,
+    detectedLib:{
+    text:lib.name+'@'+version,
+    url:`https://snyk.io/vuln/npm:${lib.npm}?lh=${version}&utm_source=lighthouse&utm_medium=ref&utm_campaign=audit`,
+    type:'link'}});
+    
+    
+    }
+    
+    return{
+    name:lib.name,
+    npmPkgName:lib.npm,
+    version,
+    vulns,
+    highestSeverity};
+    
+    });
+    
+    let displayValue='';
+    if(totalVulns>0){
+    displayValue=str_(UIStrings.displayValue,{itemCount:totalVulns});
+    }
+    
+    
+    const headings=[
+    {key:'detectedLib',itemType:'link',text:str_(UIStrings.columnVersion)},
+    {key:'vulnCount',itemType:'text',text:str_(UIStrings.columnVuln)},
+    {key:'highestSeverity',itemType:'text',text:str_(UIStrings.columnSeverity)}];
+    
+    const details=Audit.makeTableDetails(headings,vulnerabilityResults,{});
+    
+    return{
+    score:Number(totalVulns===0),
+    displayValue,
+    extendedInfo:{
+    jsLibs:libraryVulns,
+    vulnerabilities:vulnerabilityResults},
+    
+    details};
+    
+    }}
+    
+    
+    module.exports=NoVulnerableLibrariesAudit;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/dobetterweb/no-vulnerable-libraries.js");
+    },{"../../../third-party/snyk/snapshot.json":199,"../../lib/i18n/i18n.js":66,"../../lib/sentry.js":78,"../audit.js":3,"semver":179}],"../audits/dobetterweb/notification-on-start":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ViolationAudit=require('../violation-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Avoids requesting the notification permission on page load',
+    
+    failureTitle:'Requests the notification permission on page load',
+    
+    description:'Users are mistrustful of or confused by sites that request to send '+
+    'notifications without context. Consider tying the request to user gestures '+
+    'instead. [Learn more](https://web.dev/notification-on-start).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class NotificationOnStart extends ViolationAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'notification-on-start',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['ConsoleMessages']};
+    
+    }
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    const results=ViolationAudit.getViolationResults(artifacts,/notification permission/);
+    
+    
+    const headings=[
+    {key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
+    {key:'label',itemType:'text',text:str_(i18n.UIStrings.columnLocation)}];
+    
+    
+    const details=ViolationAudit.makeTableDetails(headings,results);
+    
+    return{
+    score:Number(results.length===0),
+    extendedInfo:{
+    value:results},
+    
+    details};
+    
+    }}
+    
+    
+    module.exports=NotificationOnStart;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/dobetterweb/notification-on-start.js");
+    },{"../../lib/i18n/i18n.js":66,"../violation-audit.js":7}],"../audits/dobetterweb/password-inputs-can-be-pasted-into":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('../audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Allows users to paste into password fields',
+    
+    failureTitle:'Prevents users to paste into password fields',
+    
+    description:'Preventing password pasting undermines good security policy. '+
+    '[Learn more](https://web.dev/password-inputs-can-be-pasted-into).',
+    
+    columnFailingElem:'Failing Elements'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class PasswordInputsCanBePastedIntoAudit extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'password-inputs-can-be-pasted-into',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['PasswordInputsWithPreventedPaste']};
+    
+    }
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    const passwordInputsWithPreventedPaste=artifacts.PasswordInputsWithPreventedPaste;
+    
+    
+    const items=[];
+    passwordInputsWithPreventedPaste.forEach(input=>{
+    items.push({
+    node:{type:'node',snippet:input.snippet}});
+    
+    });
+    
+    
+    const headings=[
+    {key:'node',itemType:'node',text:str_(UIStrings.columnFailingElem)}];
+    
+    
+    return{
+    score:Number(passwordInputsWithPreventedPaste.length===0),
+    extendedInfo:{
+    value:passwordInputsWithPreventedPaste},
+    
+    details:Audit.makeTableDetails(headings,items)};
+    
+    }}
+    
+    
+    module.exports=PasswordInputsCanBePastedIntoAudit;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/dobetterweb/password-inputs-can-be-pasted-into.js");
+    },{"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/dobetterweb/uses-http2":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const URL=require('../../lib/url-shim.js');
+    const Audit=require('../audit.js');
+    const NetworkRecords=require('../../computed/network-records.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Uses HTTP/2 for its own resources',
+    
+    failureTitle:'Does not use HTTP/2 for all of its resources',
+    
+    description:'HTTP/2 offers many benefits over HTTP/1.1, including binary headers, '+
+    'multiplexing, and server push. [Learn more](https://web.dev/uses-http2).',
+    
+    displayValue:`{itemCount, plural,
+        =1 {1 request not served via HTTP/2}
+        other {# requests not served via HTTP/2}
+        }`,
+    
+    columnProtocol:'Protocol'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class UsesHTTP2Audit extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'uses-http2',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['URL','devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static audit(artifacts,context){
+    const devtoolsLogs=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    return NetworkRecords.request(devtoolsLogs,context).then(networkRecords=>{
+    const finalHost=new URL(artifacts.URL.finalUrl).host;
+    
+    const seenURLs=new Set();
+    
+    const resources=networkRecords.filter(record=>{
+    
+    
+    if(record.fetchedViaServiceWorker)return false;
+    
+    const isOldHttp=/HTTP\/[01][.\d]?/i.test(record.protocol);
+    if(!isOldHttp)return false;
+    const requestHost=new URL(record.url).host;
+    return requestHost===finalHost;
+    }).map(record=>{
+    return{
+    protocol:record.protocol,
+    url:record.url};
+    
+    }).filter(record=>{
+    if(seenURLs.has(record.url))return false;
+    seenURLs.add(record.url);
+    return true;
+    });
+    
+    let displayValue='';
+    if(resources.length>0){
+    displayValue=str_(UIStrings.displayValue,{itemCount:resources.length});
+    }
+    
+    
+    const headings=[
+    {key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
+    {key:'protocol',itemType:'text',text:str_(UIStrings.columnProtocol)}];
+    
+    const details=Audit.makeTableDetails(headings,resources);
+    
+    return{
+    score:Number(resources.length===0),
+    displayValue:displayValue,
+    extendedInfo:{
+    value:{
+    results:resources}},
+    
+    
+    details};
+    
+    });
+    }}
+    
+    
+    module.exports=UsesHTTP2Audit;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/dobetterweb/uses-http2.js");
+    },{"../../computed/network-records.js":34,"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/dobetterweb/uses-passive-event-listeners":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ViolationAudit=require('../violation-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Uses passive listeners to improve scrolling performance',
+    
+    failureTitle:'Does not use passive listeners to improve scrolling performance',
+    
+    description:'Consider marking your touch and wheel event listeners as `passive` '+
+    'to improve your page\'s scroll performance. '+
+    '[Learn more](https://web.dev/uses-passive-event-listeners).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class PassiveEventsAudit extends ViolationAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'uses-passive-event-listeners',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['ConsoleMessages']};
+    
+    }
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    const results=ViolationAudit.getViolationResults(artifacts,/passive event listener/);
+    
+    
+    const headings=[
+    {key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
+    {key:'label',itemType:'text',text:str_(i18n.UIStrings.columnLocation)}];
+    
+    
+    const details=ViolationAudit.makeTableDetails(headings,results);
+    
+    return{
+    score:Number(results.length===0),
+    extendedInfo:{
+    value:results},
+    
+    details};
+    
+    }}
+    
+    
+    module.exports=PassiveEventsAudit;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/dobetterweb/uses-passive-event-listeners.js");
+    },{"../../lib/i18n/i18n.js":66,"../violation-audit.js":7}],"../audits/errors-in-console":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const log=require('lighthouse-logger');
+    const Audit=require('./audit.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'No browser errors logged to the console',
+    
+    failureTitle:'Browser errors were logged to the console',
+    
+    description:'Errors logged to the console indicate unresolved problems. '+
+    'They can come from network request failures and other browser concerns. '+
+    '[Learn more](https://web.dev/errors-in-console)',
+    
+    columnDesc:'Description'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    class ErrorLogs extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'errors-in-console',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['ConsoleMessages','RuntimeExceptions']};
+    
+    }
+    
+    
+    static defaultOptions(){
+    return{};
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    static filterAccordingToOptions(items,options){
+    const{ignoredPatterns,...restOfOptions}=options;
+    const otherOptionKeys=Object.keys(restOfOptions);
+    if(otherOptionKeys.length)log.warn(this.meta.id,'Unrecognized options',otherOptionKeys);
+    if(!ignoredPatterns)return items;
+    
+    return items.filter(({description})=>{
+    if(!description)return true;
+    for(const pattern of ignoredPatterns){
+    if(pattern instanceof RegExp&&pattern.test(description))return false;
+    if(typeof pattern==='string'&&description.includes(pattern))return false;
+    }
+    
+    return true;
+    });
+    }
+    
+    
+    
+    
+    
+    
+    static audit(artifacts,context){
+    const auditOptions=context.options;
+    
+    const consoleEntries=artifacts.ConsoleMessages;
+    const runtimeExceptions=artifacts.RuntimeExceptions;
+    
+    const consoleRows=
+    consoleEntries.filter(log=>log.entry&&log.entry.level==='error').
+    map(item=>{
+    return{
+    source:item.entry.source,
+    description:item.entry.text,
+    url:item.entry.url};
+    
+    });
+    
+    const runtimeExRows=
+    runtimeExceptions.filter(entry=>entry.exceptionDetails!==undefined).
+    map(entry=>{
+    const description=entry.exceptionDetails.exception?
+    entry.exceptionDetails.exception.description:entry.exceptionDetails.text;
+    
+    return{
+    source:'Runtime.exception',
+    description,
+    url:entry.exceptionDetails.url};
+    
+    });
+    
+    const tableRows=ErrorLogs.filterAccordingToOptions(
+    consoleRows.concat(runtimeExRows),
+    auditOptions).
+    sort((a,b)=>(a.description||'').localeCompare(b.description||''));
+    
+    
+    const headings=[
+    {key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
+    {key:'description',itemType:'code',text:str_(UIStrings.columnDesc)}];
+    
+    
+    const details=Audit.makeTableDetails(headings,tableRows);
+    const numErrors=tableRows.length;
+    
+    return{
+    score:Number(numErrors===0),
+    numericValue:numErrors,
+    details};
+    
+    }}
+    
+    
+    module.exports=ErrorLogs;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/errors-in-console.js");
+    },{"../lib/i18n/i18n.js":66,"./audit.js":3,"lighthouse-logger":125}],"../audits/final-screenshot":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const LHError=require('../lib/lh-error.js');
+    const TraceOfTab=require('../computed/trace-of-tab.js');
+    const Screenshots=require('../computed/screenshots.js');
+    
+    class FinalScreenshot extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'final-screenshot',
+    scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
+    title:'Final Screenshot',
+    description:'The last screenshot captured of the pageload.',
+    requiredArtifacts:['traces']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const traceOfTab=await TraceOfTab.request(trace,context);
+    const screenshots=await Screenshots.request(trace,context);
+    const{navigationStart}=traceOfTab.timestamps;
+    const finalScreenshot=screenshots[screenshots.length-1];
+    
+    if(!finalScreenshot){
+    throw new LHError(LHError.errors.NO_SCREENSHOTS);
+    }
+    
+    return{
+    score:1,
+    details:{
+    type:'screenshot',
+    timing:Math.round((finalScreenshot.timestamp-navigationStart)/1000),
+    timestamp:finalScreenshot.timestamp,
+    data:finalScreenshot.datauri}};
+    
+    
+    }}
+    
+    
+    module.exports=FinalScreenshot;
+    
+    },{"../computed/screenshots.js":37,"../computed/trace-of-tab.js":39,"../lib/lh-error.js":71,"./audit.js":3}],"../audits/font-display":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const URL=require('../lib/url-shim.js');
+    const PASSING_FONT_DISPLAY_REGEX=/^(block|fallback|optional|swap)$/;
+    const CSS_URL_REGEX=/url\((.*?)\)/;
+    const CSS_URL_GLOBAL_REGEX=new RegExp(CSS_URL_REGEX,'g');
+    const i18n=require('../lib/i18n/i18n.js');
+    const Sentry=require('../lib/sentry.js');
+    const NetworkRecords=require('../computed/network-records.js');
+    
+    const UIStrings={
+    
+    title:'All text remains visible during webfont loads',
+    
+    failureTitle:'Ensure text remains visible during webfont load',
+    
+    description:
+    'Leverage the font-display CSS feature to ensure text is user-visible while '+
+    'webfonts are loading. '+
+    '[Learn more](https://web.dev/font-display).',
+    
+    
+    
+    
+    undeclaredFontURLWarning:'Lighthouse was unable to automatically check the font-display value '+
+    'for the following URL: {fontURL}.'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class FontDisplay extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'font-display',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['devtoolsLogs','CSSUsage','URL']};
+    
+    }
+    
+    
+    
+    
+    
+    static findFontDisplayDeclarations(artifacts){
+    
+    const passingURLs=new Set();
+    
+    const failingURLs=new Set();
+    
+    
+    for(const stylesheet of artifacts.CSSUsage.stylesheets){
+    
+    const newlinesStripped=stylesheet.content.replace(/(\r|\n)+/g,' ');
+    
+    const fontFaceDeclarations=newlinesStripped.match(/@font-face\s*{(.*?)}/g)||[];
+    
+    for(const declaration of fontFaceDeclarations){
+    
+    const rawFontURLs=declaration.match(CSS_URL_GLOBAL_REGEX);
+    
+    if(!rawFontURLs)continue;
+    
+    
+    const fontDisplayMatch=declaration.match(/font-display\s*:\s*(\w+)\s*(;|\})/);
+    const rawFontDisplay=fontDisplayMatch&&fontDisplayMatch[1]||'';
+    const hasPassingFontDisplay=PASSING_FONT_DISPLAY_REGEX.test(rawFontDisplay);
+    const targetURLSet=hasPassingFontDisplay?passingURLs:failingURLs;
+    
+    
+    const relativeURLs=rawFontURLs.
+    
+    map(s=>s.match(CSS_URL_REGEX)[1].trim()).
+    map(s=>{
+    
+    if(/^('|").*\1$/.test(s)){
+    return s.substr(1,s.length-2);
+    }
+    
+    return s;
+    });
+    
+    
+    for(const relativeURL of relativeURLs){
+    try{
+    const relativeRoot=URL.isValid(stylesheet.header.sourceURL)?
+    stylesheet.header.sourceURL:artifacts.URL.finalUrl;
+    const absoluteURL=new URL(relativeURL,relativeRoot);
+    targetURLSet.add(absoluteURL.href);
+    }catch(err){
+    Sentry.captureException(err,{tags:{audit:this.meta.id}});
+    }
+    }
+    }
+    }
+    
+    return{passingURLs,failingURLs};
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const devtoolsLogs=artifacts.devtoolsLogs[this.DEFAULT_PASS];
+    const networkRecords=await NetworkRecords.request(devtoolsLogs,context);
+    const{passingURLs,failingURLs}=FontDisplay.findFontDisplayDeclarations(artifacts);
+    
+    const warningURLs=[];
+    
+    const results=networkRecords.
+    
+    filter(record=>record.resourceType==='Font').
+    
+    filter(record=>!/^data:/.test(record.url)).
+    filter(record=>!/^blob:/.test(record.url)).
+    
+    filter(record=>{
+    
+    if(failingURLs.has(record.url))return true;
+    
+    if(!passingURLs.has(record.url))warningURLs.push(record.url);
+    return false;
+    }).
+    map(record=>{
+    
+    
+    const wastedMs=Math.min((record.endTime-record.startTime)*1000,3000);
+    
+    return{
+    url:record.url,
+    wastedMs};
+    
+    });
+    
+    
+    const headings=[
+    {key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
+    {key:'wastedMs',itemType:'ms',text:str_(i18n.UIStrings.columnWastedMs)}];
+    
+    
+    const details=Audit.makeTableDetails(headings,results);
+    
+    return{
+    score:Number(results.length===0),
+    details,
+    warnings:warningURLs.map(fontURL=>str_(UIStrings.undeclaredFontURLWarning,{fontURL}))};
+    
+    }}
+    
+    
+    module.exports=FontDisplay;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/font-display.js");
+    },{"../computed/network-records.js":34,"../lib/i18n/i18n.js":66,"../lib/sentry.js":78,"../lib/url-shim.js":"url","./audit.js":3}],"../audits/image-aspect-ratio":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const URL=require('../lib/url-shim.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Displays images with correct aspect ratio',
+    
+    failureTitle:'Displays images with incorrect aspect ratio',
+    
+    description:'Image display dimensions should match natural aspect ratio. '+
+    '[Learn more](https://web.dev/image-aspect-ratio).',
+    
+    
+    
+    
+    warningCompute:'Invalid image sizing information {url}',
+    
+    columnDisplayed:'Aspect Ratio (Displayed)',
+    
+    columnActual:'Aspect Ratio (Actual)'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    const THRESHOLD_PX=2;
+    
+    
+    
+    class ImageAspectRatio extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'image-aspect-ratio',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['ImageElements']};
+    
+    }
+    
+    
+    
+    
+    
+    static computeAspectRatios(image){
+    const url=URL.elideDataURI(image.src);
+    const actualAspectRatio=image.naturalWidth/image.naturalHeight;
+    const displayedAspectRatio=image.displayedWidth/image.displayedHeight;
+    
+    const targetDisplayHeight=image.displayedWidth/actualAspectRatio;
+    const doRatiosMatch=Math.abs(targetDisplayHeight-image.displayedHeight)<THRESHOLD_PX;
+    
+    if(!Number.isFinite(actualAspectRatio)||
+    !Number.isFinite(displayedAspectRatio)){
+    return new Error(str_(UIStrings.warningCompute,{url}));
+    }
+    
+    return{
+    url,
+    displayedAspectRatio:`${image.displayedWidth} x ${image.displayedHeight}
+            (${displayedAspectRatio.toFixed(2)})`,
+    actualAspectRatio:`${image.naturalWidth} x ${image.naturalHeight}
+            (${actualAspectRatio.toFixed(2)})`,
+    doRatiosMatch};
+    
+    }
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    const images=artifacts.ImageElements;
+    
+    
+    const warnings=[];
+    
+    const results=[];
+    images.filter(image=>{
+    
+    
+    
+    
+    
+    return!image.isCss&&
+    image.mimeType&&
+    image.mimeType!=='image/svg+xml'&&
+    image.naturalHeight>5&&
+    image.naturalWidth>5&&
+    image.displayedWidth&&
+    image.displayedHeight&&
+    !image.usesObjectFit;
+    }).forEach(image=>{
+    const wellDefinedImage=image;
+    const processed=ImageAspectRatio.computeAspectRatios(wellDefinedImage);
+    if(processed instanceof Error){
+    warnings.push(processed.message);
+    return;
+    }
+    
+    if(!processed.doRatiosMatch)results.push(processed);
+    });
+    
+    
+    const headings=[
+    {key:'url',itemType:'thumbnail',text:''},
+    {key:'url',itemType:'url',text:str_(i18n.UIStrings.columnURL)},
+    {key:'displayedAspectRatio',itemType:'text',text:str_(UIStrings.columnDisplayed)},
+    {key:'actualAspectRatio',itemType:'text',text:str_(UIStrings.columnActual)}];
+    
+    
+    return{
+    score:Number(results.length===0),
+    warnings,
+    details:Audit.makeTableDetails(headings,results)};
+    
+    }}
+    
+    
+    module.exports=ImageAspectRatio;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/image-aspect-ratio.js");
+    },{"../lib/i18n/i18n.js":66,"../lib/url-shim.js":"url","./audit.js":3}],"../audits/installable-manifest":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const MultiCheckAudit=require('./multi-check-audit.js');
+    const ManifestValues=require('../computed/manifest-values.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Web app manifest meets the installability requirements',
+    
+    failureTitle:'Web app manifest does not meet the installability requirements',
+    
+    description:'Browsers can proactively prompt users to add your app to their homescreen, '+
+    'which can lead to higher engagement. '+
+    '[Learn more](https://web.dev/installable-manifest).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    class InstallableManifest extends MultiCheckAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'installable-manifest',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['URL','WebAppManifest']};
+    
+    }
+    
+    
+    
+    
+    
+    static assessManifest(manifestValues){
+    if(manifestValues.isParseFailure&&manifestValues.parseFailureReason){
+    return[manifestValues.parseFailureReason];
+    }
+    
+    
+    const failures=[];
+    const bannerCheckIds=[
+    'hasName',
+    
+    
+    
+    
+    
+    
+    'hasShortName',
+    'hasStartUrl',
+    'hasPWADisplayValue',
+    'hasIconsAtLeast192px'];
+    
+    manifestValues.allChecks.
+    filter(item=>bannerCheckIds.includes(item.id)).
+    forEach(item=>{
+    if(!item.passing){
+    failures.push(item.failureText);
+    }
+    });
+    
+    return failures;
+    }
+    
+    
+    
+    
+    
+    
+    static async audit_(artifacts,context){
+    const manifestValues=await ManifestValues.request(artifacts.WebAppManifest,context);
+    const manifestFailures=InstallableManifest.assessManifest(manifestValues);
+    
+    return{
+    failures:[
+    ...manifestFailures],
+    
+    manifestValues};
+    
+    }}
+    
+    
+    module.exports=InstallableManifest;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/installable-manifest.js");
+    },{"../computed/manifest-values.js":13,"../lib/i18n/i18n.js":66,"./multi-check-audit.js":6}],"../audits/is-on-https":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const URL=require('../lib/url-shim.js');
+    const NetworkRecords=require('../computed/network-records.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Uses HTTPS',
+    
+    failureTitle:'Does not use HTTPS',
+    
+    description:'All sites should be protected with HTTPS, even ones that don\'t handle '+
+    'sensitive data. HTTPS prevents intruders from tampering with or passively listening '+
+    'in on the communications between your app and your users, and is a prerequisite for '+
+    'HTTP/2 and many new web platform APIs. '+
+    '[Learn more](https://web.dev/is-on-https).',
+    
+    displayValue:`{itemCount, plural,
+        =1 {1 insecure request found}
+        other {# insecure requests found}
+        }`,
+    
+    columnInsecureURL:'Insecure URL'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    const SECURE_SCHEMES=['data','https','wss','blob','chrome','chrome-extension','about'];
+    const SECURE_DOMAINS=['localhost','127.0.0.1'];
+    
+    class HTTPS extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'is-on-https',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    
+    static isSecureRecord(record){
+    return SECURE_SCHEMES.includes(record.parsedURL.scheme)||
+    SECURE_SCHEMES.includes(record.protocol)||
+    SECURE_DOMAINS.includes(record.parsedURL.host);
+    }
+    
+    
+    
+    
+    
+    
+    static audit(artifacts,context){
+    const devtoolsLogs=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    return NetworkRecords.request(devtoolsLogs,context).then(networkRecords=>{
+    const insecureURLs=networkRecords.
+    filter(record=>!HTTPS.isSecureRecord(record)).
+    map(record=>URL.elideDataURI(record.url));
+    
+    const items=Array.from(new Set(insecureURLs)).map(url=>({url}));
+    
+    let displayValue='';
+    if(items.length>0){
+    displayValue=str_(UIStrings.displayValue,{itemCount:items.length});
+    }
+    
+    
+    const headings=[
+    {key:'url',itemType:'url',text:str_(UIStrings.columnInsecureURL)}];
+    
+    
+    return{
+    score:Number(items.length===0),
+    displayValue,
+    extendedInfo:{
+    value:items},
+    
+    details:Audit.makeTableDetails(headings,items)};
+    
+    });
+    }}
+    
+    
+    module.exports=HTTPS;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/is-on-https.js");
+    },{"../computed/network-records.js":34,"../lib/i18n/i18n.js":66,"../lib/url-shim.js":"url","./audit.js":3}],"../audits/load-fast-enough-for-pwa":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    const isDeepEqual=require('lodash.isequal');
+    const Audit=require('./audit.js');
+    const mobileThrottling=require('../config/constants.js').throttling.mobileSlow4G;
+    const Interactive=require('../computed/metrics/interactive.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    
+    
+    
+    const MAXIMUM_TTI=10*1000;
+    
+    const UIStrings={
+    
+    title:'Page load is fast enough on mobile networks',
+    
+    failureTitle:'Page load is not fast enough on mobile networks',
+    
+    description:'A fast page load over a cellular network ensures a good mobile user experience. [Learn more](https://web.dev/load-fast-enough-for-pwa).',
+    
+    displayValueText:'Interactive at {timeInMs, number, seconds}\xa0s',
+    
+    displayValueTextWithOverride:'Interactive on simulated mobile network at '+
+    '{timeInMs, number, seconds}\xa0s',
+    
+    explanationLoadSlow:'Your page loads too slowly and is not interactive within 10 seconds. '+
+    'Look at the opportunities and diagnostics in the "Performance" section to learn how to '+
+    'improve.'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class LoadFastEnough4Pwa extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'load-fast-enough-for-pwa',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['traces','devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    
+    
+    
+    const settingOverrides={throttlingMethod:'simulate',throttling:mobileThrottling};
+    
+    
+    
+    const override=context.settings.throttlingMethod==='provided'||
+    !isDeepEqual(context.settings.throttling,mobileThrottling);
+    
+    const displayValueTemplate=override?
+    UIStrings.displayValueTextWithOverride:UIStrings.displayValueText;
+    
+    const settings=override?Object.assign({},context.settings,settingOverrides):
+    context.settings;
+    
+    const metricComputationData={trace,devtoolsLog,settings};
+    const tti=await Interactive.request(metricComputationData,context);
+    
+    const score=Number(tti.timing<MAXIMUM_TTI);
+    
+    
+    let displayValue;
+    
+    let explanation;
+    if(!score){
+    displayValue=str_(displayValueTemplate,{timeInMs:tti.timing});
+    explanation=str_(UIStrings.explanationLoadSlow);
+    }
+    
+    return{
+    score,
+    displayValue,
+    explanation,
+    numericValue:tti.timing};
+    
+    }}
+    
+    
+    module.exports=LoadFastEnough4Pwa;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/load-fast-enough-for-pwa.js");
+    },{"../computed/metrics/interactive.js":18,"../config/constants.js":46,"../lib/i18n/i18n.js":66,"./audit.js":3,"lodash.isequal":142}],"../audits/main-thread-tasks":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const MainThreadTasksComputed=require('../computed/main-thread-tasks.js');
+    
+    class MainThreadTasks extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'main-thread-tasks',
+    scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
+    title:'Tasks',
+    description:'Lists the toplevel main thread tasks that executed during page load.',
+    requiredArtifacts:['traces']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const tasks=await MainThreadTasksComputed.request(trace,context);
+    
+    const results=tasks.
+    
+    filter(task=>task.duration>5&&!task.parent).
+    map(task=>{
+    return{
+    duration:task.duration,
+    startTime:task.startTime};
+    
+    });
+    
+    
+    const headings=[
+    {key:'startTime',itemType:'ms',granularity:1,text:'Start Time'},
+    {key:'duration',itemType:'ms',granularity:1,text:'End Time'}];
+    
+    
+    const tableDetails=Audit.makeTableDetails(headings,results);
+    
+    return{
+    score:1,
+    numericValue:results.length,
+    details:tableDetails};
+    
+    }}
+    
+    
+    module.exports=MainThreadTasks;
+    
+    },{"../computed/main-thread-tasks.js":12,"./audit.js":3}],"../audits/mainthread-work-breakdown":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const{taskGroups}=require('../lib/tracehouse/task-groups.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    const MainThreadTasks=require('../computed/main-thread-tasks.js');
+    
+    const UIStrings={
+    
+    title:'Minimizes main-thread work',
+    
+    failureTitle:'Minimize main-thread work',
+    
+    description:'Consider reducing the time spent parsing, compiling and executing JS. '+
+    'You may find delivering smaller JS payloads helps with this. '+
+    '[Learn more](https://web.dev/mainthread-work-breakdown)',
+    
+    columnCategory:'Category'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    class MainThreadWorkBreakdown extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'mainthread-work-breakdown',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['traces']};
+    
+    }
+    
+    
+    
+    
+    static get defaultOptions(){
+    return{
+    
+    scorePODR:1500,
+    scoreMedian:4000};
+    
+    }
+    
+    
+    
+    
+    
+    static getExecutionTimingsByGroup(tasks){
+    
+    const result=new Map();
+    
+    for(const task of tasks){
+    const originalTime=result.get(task.group.id)||0;
+    result.set(task.group.id,originalTime+task.selfTime);
+    }
+    
+    return result;
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const settings=context.settings||{};
+    const trace=artifacts.traces[MainThreadWorkBreakdown.DEFAULT_PASS];
+    
+    const tasks=await MainThreadTasks.request(trace,context);
+    const multiplier=settings.throttlingMethod==='simulate'?
+    settings.throttling.cpuSlowdownMultiplier:1;
+    
+    const executionTimings=MainThreadWorkBreakdown.getExecutionTimingsByGroup(tasks);
+    
+    let totalExecutionTime=0;
+    
+    const categoryTotals={};
+    const results=Array.from(executionTimings).map(([groupId,rawDuration])=>{
+    const duration=rawDuration*multiplier;
+    totalExecutionTime+=duration;
+    
+    const categoryTotal=categoryTotals[groupId]||0;
+    categoryTotals[groupId]=categoryTotal+duration;
+    
+    return{
+    group:groupId,
+    groupLabel:taskGroups[groupId].label,
+    duration:duration};
+    
+    });
+    
+    
+    const headings=[
+    {key:'groupLabel',itemType:'text',text:str_(UIStrings.columnCategory)},
+    {key:'duration',itemType:'ms',granularity:1,text:str_(i18n.UIStrings.columnTimeSpent)}];
+    
+    
+    results.sort((a,b)=>categoryTotals[b.group]-categoryTotals[a.group]);
+    const tableDetails=MainThreadWorkBreakdown.makeTableDetails(headings,results);
+    
+    const score=Audit.computeLogNormalScore(
+    totalExecutionTime,
+    context.options.scorePODR,
+    context.options.scoreMedian);
+    
+    
+    return{
+    score,
+    numericValue:totalExecutionTime,
+    displayValue:str_(i18n.UIStrings.seconds,{timeInMs:totalExecutionTime}),
+    details:tableDetails};
+    
+    }}
+    
+    
+    module.exports=MainThreadWorkBreakdown;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/mainthread-work-breakdown.js");
+    },{"../computed/main-thread-tasks.js":12,"../lib/i18n/i18n.js":66,"../lib/tracehouse/task-groups.js":84,"./audit.js":3}],"../audits/manual/pwa-cross-browser":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ManualAudit=require('./manual-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Site works cross-browser',
+    
+    description:'To reach the most number of users, sites should work across '+
+    'every major browser. [Learn more](https://web.dev/pwa-cross-browser).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    class PWACrossBrowser extends ManualAudit{
+    
+    
+    
+    static get meta(){
+    return Object.assign({
+    id:'pwa-cross-browser',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description)},
+    super.partialMeta);
+    }}
+    
+    
+    module.exports=PWACrossBrowser;
+    module.exports.UIStrings=UIStrings;
+    
+    
+    }).call(this,"/lighthouse-core/audits/manual/pwa-cross-browser.js");
+    },{"../../lib/i18n/i18n.js":66,"./manual-audit.js":5}],"../audits/manual/pwa-each-page-has-url":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ManualAudit=require('./manual-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Each page has a URL',
+    
+    description:'Ensure individual pages are deep linkable via URL and that URLs are '+
+    'unique for the purpose of shareability on social media. [Learn more](https://web.dev/pwa-each-page-has-url).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    class PWAEachPageHasURL extends ManualAudit{
+    
+    
+    
+    static get meta(){
+    return Object.assign({
+    id:'pwa-each-page-has-url',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description)},
+    super.partialMeta);
+    }}
+    
+    
+    module.exports=PWAEachPageHasURL;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/manual/pwa-each-page-has-url.js");
+    },{"../../lib/i18n/i18n.js":66,"./manual-audit.js":5}],"../audits/manual/pwa-page-transitions":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ManualAudit=require('./manual-audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Page transitions don\'t feel like they block on the network',
+    
+    description:'Transitions should feel snappy as you tap around, even on a slow network. '+
+    'This experience is key to a user\'s perception of performance. [Learn more](https://web.dev/pwa-page-transitions).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    class PWAPageTransitions extends ManualAudit{
+    
+    
+    
+    static get meta(){
+    return Object.assign({
+    id:'pwa-page-transitions',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description)},
+    super.partialMeta);
+    }}
+    
+    
+    module.exports=PWAPageTransitions;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/manual/pwa-page-transitions.js");
+    },{"../../lib/i18n/i18n.js":66,"./manual-audit.js":5}],"../audits/metrics/estimated-input-latency":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('../audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    const ComputedEil=require('../../computed/metrics/estimated-input-latency.js');
+    
+    const UIStrings={
+    
+    title:'Estimated Input Latency',
+    
+    description:'Estimated Input Latency is an estimate of how long your app takes to respond to '+
+    'user input, in milliseconds, during the busiest 5s window of page load. If your '+
+    'latency is higher than 50 ms, users may perceive your app as laggy. '+
+    '[Learn more](https://web.dev/estimated-input-latency).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class EstimatedInputLatency extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'estimated-input-latency',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['traces','devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    static get defaultOptions(){
+    return{
+    
+    scorePODR:50,
+    scoreMedian:100};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const metricComputationData={trace,devtoolsLog,settings:context.settings};
+    const metricResult=await ComputedEil.request(metricComputationData,context);
+    
+    return{
+    score:Audit.computeLogNormalScore(
+    metricResult.timing,
+    context.options.scorePODR,
+    context.options.scoreMedian),
+    
+    numericValue:metricResult.timing,
+    displayValue:str_(i18n.UIStrings.ms,{timeInMs:metricResult.timing})};
+    
+    }}
+    
+    
+    module.exports=EstimatedInputLatency;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/metrics/estimated-input-latency.js");
+    },{"../../computed/metrics/estimated-input-latency.js":14,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/first-contentful-paint-3g":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('../audit.js');
+    const regular3G=require('../../config/constants.js').throttling.mobileRegluar3G;
+    const ComputedFcp=require('../../computed/metrics/first-contentful-paint.js');
+    
+    class FirstContentfulPaint3G extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'first-contentful-paint-3g',
+    title:'First Contentful Paint (3G)',
+    description:'First Contentful Paint 3G marks the time at which the first text or image is '+
+    `painted while on a 3G network. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint).`,
+    scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['traces','devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    static get defaultOptions(){
+    return{
+    
+    
+    scorePODR:3000,
+    scoreMedian:6000};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    
+    const settings={...context.settings,throttlingMethod:'simulate',throttling:regular3G};
+    const metricComputationData={trace,devtoolsLog,settings};
+    const metricResult=await ComputedFcp.request(metricComputationData,context);
+    
+    return{
+    score:Audit.computeLogNormalScore(
+    metricResult.timing,
+    context.options.scorePODR,
+    context.options.scoreMedian),
+    
+    numericValue:metricResult.timing,
+    displayValue:`${metricResult.timing}\xa0ms`};
+    
+    }}
+    
+    
+    module.exports=FirstContentfulPaint3G;
+    
+    },{"../../computed/metrics/first-contentful-paint.js":15,"../../config/constants.js":46,"../audit.js":3}],"../audits/metrics/first-contentful-paint":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('../audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    const ComputedFcp=require('../../computed/metrics/first-contentful-paint.js');
+    
+    const UIStrings={
+    
+    title:'First Contentful Paint',
+    
+    description:'First Contentful Paint marks the time at which the first text or image is '+
+    `painted. [Learn more](https://web.dev/first-contentful-paint).`};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class FirstContentfulPaint extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'first-contentful-paint',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['traces','devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    static get defaultOptions(){
+    return{
+    
+    
+    
+    scorePODR:2000,
+    scoreMedian:4000};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const metricComputationData={trace,devtoolsLog,settings:context.settings};
+    const metricResult=await ComputedFcp.request(metricComputationData,context);
+    
+    return{
+    score:Audit.computeLogNormalScore(
+    metricResult.timing,
+    context.options.scorePODR,
+    context.options.scoreMedian),
+    
+    numericValue:metricResult.timing,
+    displayValue:str_(i18n.UIStrings.seconds,{timeInMs:metricResult.timing})};
+    
+    }}
+    
+    
+    module.exports=FirstContentfulPaint;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/metrics/first-contentful-paint.js");
+    },{"../../computed/metrics/first-contentful-paint.js":15,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/first-cpu-idle":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('../audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    const ComputedFci=require('../../computed/metrics/first-cpu-idle.js');
+    
+    const UIStrings={
+    
+    title:'First CPU Idle',
+    
+    description:'First CPU Idle marks the first time at which the page\'s main thread is '+
+    'quiet enough to handle input.  [Learn more](https://web.dev/first-cpu-idle).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class FirstCPUIdle extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'first-cpu-idle',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['traces','devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    static get defaultOptions(){
+    return{
+    
+    
+    
+    scorePODR:2900,
+    scoreMedian:6500};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const metricComputationData={trace,devtoolsLog,settings:context.settings};
+    const metricResult=await ComputedFci.request(metricComputationData,context);
+    
+    return{
+    score:Audit.computeLogNormalScore(
+    metricResult.timing,
+    context.options.scorePODR,
+    context.options.scoreMedian),
+    
+    numericValue:metricResult.timing,
+    displayValue:str_(i18n.UIStrings.seconds,{timeInMs:metricResult.timing})};
+    
+    }}
+    
+    
+    module.exports=FirstCPUIdle;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/metrics/first-cpu-idle.js");
+    },{"../../computed/metrics/first-cpu-idle.js":16,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/first-meaningful-paint":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('../audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    const ComputedFmp=require('../../computed/metrics/first-meaningful-paint.js');
+    
+    const UIStrings={
+    
+    title:'First Meaningful Paint',
+    
+    description:'First Meaningful Paint measures when the primary content of a page is '+
+    'visible. [Learn more](https://web.dev/first-meaningful-paint).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class FirstMeaningfulPaint extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'first-meaningful-paint',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['traces','devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    static get defaultOptions(){
+    return{
+    
+    
+    
+    scorePODR:2000,
+    scoreMedian:4000};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const metricComputationData={trace,devtoolsLog,settings:context.settings};
+    const metricResult=await ComputedFmp.request(metricComputationData,context);
+    
+    return{
+    score:Audit.computeLogNormalScore(
+    metricResult.timing,
+    context.options.scorePODR,
+    context.options.scoreMedian),
+    
+    numericValue:metricResult.timing,
+    displayValue:str_(i18n.UIStrings.seconds,{timeInMs:metricResult.timing})};
+    
+    }}
+    
+    
+    module.exports=FirstMeaningfulPaint;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/metrics/first-meaningful-paint.js");
+    },{"../../computed/metrics/first-meaningful-paint.js":17,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/interactive":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('../audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    const Interactive=require('../../computed/metrics/interactive.js');
+    
+    const UIStrings={
+    
+    title:'Time to Interactive',
+    
+    description:'Time to interactive is the amount of time it takes for the page to become fully '+
+    'interactive. [Learn more](https://web.dev/interactive).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    
+    
+    class InteractiveMetric extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'interactive',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['traces','devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    static get defaultOptions(){
+    return{
+    
+    
+    
+    scorePODR:2900,
+    scoreMedian:7300};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const metricComputationData={trace,devtoolsLog,settings:context.settings};
+    const metricResult=await Interactive.request(metricComputationData,context);
+    const timeInMs=metricResult.timing;
+    const extendedInfo={
+    timeInMs,
+    timestamp:metricResult.timestamp,
+    
+    optimistic:metricResult.optimisticEstimate&&metricResult.optimisticEstimate.timeInMs,
+    
+    pessimistic:metricResult.pessimisticEstimate&&metricResult.pessimisticEstimate.timeInMs};
+    
+    
+    return{
+    score:Audit.computeLogNormalScore(
+    timeInMs,
+    context.options.scorePODR,
+    context.options.scoreMedian),
+    
+    numericValue:timeInMs,
+    displayValue:str_(i18n.UIStrings.seconds,{timeInMs}),
+    extendedInfo:{
+    value:extendedInfo}};
+    
+    
+    }}
+    
+    
+    module.exports=InteractiveMetric;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/metrics/interactive.js");
+    },{"../../computed/metrics/interactive.js":18,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/max-potential-fid":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('../audit.js');
+    const ComputedFid=require('../../computed/metrics/max-potential-fid.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Max Potential First Input Delay',
+    
+    description:'The maximum potential First Input Delay that your users could experience is the '+
+    'duration, in milliseconds, of the longest task. [Learn more](https://developers.google.com/web/updates/2018/05/first-input-delay).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    
+    class MaxPotentialFID extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'max-potential-fid',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['traces','devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    static get defaultOptions(){
+    return{
+    
+    scorePODR:100,
+    scoreMedian:250};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const metricComputationData={trace,devtoolsLog,settings:context.settings};
+    const metricResult=await ComputedFid.request(metricComputationData,context);
+    
+    return{
+    score:Audit.computeLogNormalScore(
+    metricResult.timing,
+    context.options.scorePODR,
+    context.options.scoreMedian),
+    
+    numericValue:metricResult.timing,
+    displayValue:str_(i18n.UIStrings.ms,{timeInMs:metricResult.timing})};
+    
+    }}
+    
+    
+    module.exports=MaxPotentialFID;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/metrics/max-potential-fid.js");
+    },{"../../computed/metrics/max-potential-fid.js":29,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/speed-index":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('../audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    const ComputedSi=require('../../computed/metrics/speed-index.js');
+    
+    const UIStrings={
+    
+    title:'Speed Index',
+    
+    description:'Speed Index shows how quickly the contents of a page are visibly populated. '+
+    '[Learn more](https://web.dev/speed-index).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class SpeedIndex extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'speed-index',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['traces','devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    static get defaultOptions(){
+    return{
+    
+    
+    
+    scorePODR:2900,
+    scoreMedian:5800};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const metricComputationData={trace,devtoolsLog,settings:context.settings};
+    const metricResult=await ComputedSi.request(metricComputationData,context);
+    
+    return{
+    score:Audit.computeLogNormalScore(
+    metricResult.timing,
+    context.options.scorePODR,
+    context.options.scoreMedian),
+    
+    numericValue:metricResult.timing,
+    displayValue:str_(i18n.UIStrings.seconds,{timeInMs:metricResult.timing})};
+    
+    }}
+    
+    
+    module.exports=SpeedIndex;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/metrics/speed-index.js");
+    },{"../../computed/metrics/speed-index.js":31,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics/total-blocking-time":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('../audit.js');
+    const ComputedTBT=require('../../computed/metrics/total-blocking-time.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Total Blocking Time',
+    
+    description:'Sum of all time periods between FCP and Time to Interactive, '+
+    'when task length exceeded 50ms, expressed in milliseconds.'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class TotalBlockingTime extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'total-blocking-time',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['traces','devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    static get defaultOptions(){
+    return{
+    
+    
+    
+    
+    
+    
+    scoreMedian:600,
+    scorePODR:200};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const metricComputationData={trace,devtoolsLog,settings:context.settings};
+    const metricResult=await ComputedTBT.request(metricComputationData,context);
+    
+    return{
+    score:Audit.computeLogNormalScore(
+    metricResult.timing,
+    context.options.scorePODR,
+    context.options.scoreMedian),
+    
+    numericValue:metricResult.timing,
+    displayValue:str_(i18n.UIStrings.ms,{timeInMs:metricResult.timing})};
+    
+    }}
+    
+    
+    module.exports=TotalBlockingTime;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/metrics/total-blocking-time.js");
+    },{"../../computed/metrics/total-blocking-time.js":32,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/metrics":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const TraceOfTab=require('../computed/trace-of-tab.js');
+    const Speedline=require('../computed/speedline.js');
+    const FirstContentfulPaint=require('../computed/metrics/first-contentful-paint.js');
+    const FirstMeaningfulPaint=require('../computed/metrics/first-meaningful-paint.js');
+    const LargestContentfulPaint=require('../computed/metrics/largest-contentful-paint.js');
+    const FirstCPUIdle=require('../computed/metrics/first-cpu-idle.js');
+    const Interactive=require('../computed/metrics/interactive.js');
+    const SpeedIndex=require('../computed/metrics/speed-index.js');
+    const EstimatedInputLatency=require('../computed/metrics/estimated-input-latency.js');
+    const TotalBlockingTime=require('../computed/metrics/total-blocking-time.js');
+    
+    class Metrics extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'metrics',
+    scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
+    title:'Metrics',
+    description:'Collects all available metrics.',
+    requiredArtifacts:['traces','devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const metricComputationData={trace,devtoolsLog,settings:context.settings};
+    
+    
+    
+    
+    
+    
+    
+    
+    const requestOrUndefined=(Artifact,artifact)=>{
+    return Artifact.request(artifact,context).catch(_=>undefined);
+    };
+    
+    const traceOfTab=await TraceOfTab.request(trace,context);
+    const speedline=await Speedline.request(trace,context);
+    const firstContentfulPaint=await FirstContentfulPaint.request(metricComputationData,context);
+    const firstMeaningfulPaint=await FirstMeaningfulPaint.request(metricComputationData,context);
+    const largestContentfulPaint=await requestOrUndefined(LargestContentfulPaint,metricComputationData);
+    const firstCPUIdle=await requestOrUndefined(FirstCPUIdle,metricComputationData);
+    const interactive=await requestOrUndefined(Interactive,metricComputationData);
+    const speedIndex=await requestOrUndefined(SpeedIndex,metricComputationData);
+    const estimatedInputLatency=await EstimatedInputLatency.request(metricComputationData,context);
+    const totalBlockingTime=await TotalBlockingTime.request(metricComputationData,context);
+    
+    
+    const metrics={
+    
+    firstContentfulPaint:firstContentfulPaint.timing,
+    firstContentfulPaintTs:firstContentfulPaint.timestamp,
+    firstMeaningfulPaint:firstMeaningfulPaint.timing,
+    firstMeaningfulPaintTs:firstMeaningfulPaint.timestamp,
+    largestContentfulPaint:largestContentfulPaint&&largestContentfulPaint.timing,
+    largestContentfulPaintTs:largestContentfulPaint&&largestContentfulPaint.timestamp,
+    firstCPUIdle:firstCPUIdle&&firstCPUIdle.timing,
+    firstCPUIdleTs:firstCPUIdle&&firstCPUIdle.timestamp,
+    interactive:interactive&&interactive.timing,
+    interactiveTs:interactive&&interactive.timestamp,
+    speedIndex:speedIndex&&speedIndex.timing,
+    speedIndexTs:speedIndex&&speedIndex.timestamp,
+    estimatedInputLatency:estimatedInputLatency.timing,
+    estimatedInputLatencyTs:estimatedInputLatency.timestamp,
+    totalBlockingTime:totalBlockingTime.timing,
+    
+    
+    observedNavigationStart:traceOfTab.timings.navigationStart,
+    observedNavigationStartTs:traceOfTab.timestamps.navigationStart,
+    observedFirstPaint:traceOfTab.timings.firstPaint,
+    observedFirstPaintTs:traceOfTab.timestamps.firstPaint,
+    observedFirstContentfulPaint:traceOfTab.timings.firstContentfulPaint,
+    observedFirstContentfulPaintTs:traceOfTab.timestamps.firstContentfulPaint,
+    observedFirstMeaningfulPaint:traceOfTab.timings.firstMeaningfulPaint,
+    observedFirstMeaningfulPaintTs:traceOfTab.timestamps.firstMeaningfulPaint,
+    observedLargestContentfulPaint:traceOfTab.timings.largestContentfulPaint,
+    observedLargestContentfulPaintTs:traceOfTab.timestamps.largestContentfulPaint,
+    observedTraceEnd:traceOfTab.timings.traceEnd,
+    observedTraceEndTs:traceOfTab.timestamps.traceEnd,
+    observedLoad:traceOfTab.timings.load,
+    observedLoadTs:traceOfTab.timestamps.load,
+    observedDomContentLoaded:traceOfTab.timings.domContentLoaded,
+    observedDomContentLoadedTs:traceOfTab.timestamps.domContentLoaded,
+    
+    
+    observedFirstVisualChange:speedline.first,
+    observedFirstVisualChangeTs:(speedline.first+speedline.beginning)*1000,
+    observedLastVisualChange:speedline.complete,
+    observedLastVisualChangeTs:(speedline.complete+speedline.beginning)*1000,
+    observedSpeedIndex:speedline.speedIndex,
+    observedSpeedIndexTs:(speedline.speedIndex+speedline.beginning)*1000};
+    
+    
+    for(const[name,value]of Object.entries(metrics)){
+    const key=name;
+    if(typeof value!=='undefined'){
+    metrics[key]=Math.round(value);
+    }
+    }
+    
+    
+    const details={
+    type:'debugdata',
+    
+    items:[metrics,{lcpInvalidated:traceOfTab.lcpInvalidated}]};
+    
+    
+    return{
+    score:1,
+    numericValue:interactive&&interactive.timing||0,
+    details};
+    
+    }}
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    module.exports=Metrics;
+    
+    },{"../computed/metrics/estimated-input-latency.js":14,"../computed/metrics/first-contentful-paint.js":15,"../computed/metrics/first-cpu-idle.js":16,"../computed/metrics/first-meaningful-paint.js":17,"../computed/metrics/interactive.js":18,"../computed/metrics/largest-contentful-paint.js":28,"../computed/metrics/speed-index.js":31,"../computed/metrics/total-blocking-time.js":32,"../computed/speedline.js":38,"../computed/trace-of-tab.js":39,"./audit.js":3}],"../audits/mixed-content":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const URL=require('../lib/url-shim.js');
+    const Util=require('../report/html/renderer/util.js');
+    const NetworkRecords=require('../computed/network-records.js');
+    
+    
+    
+    
+    
+    
+    
+    class MixedContent extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'mixed-content',
+    title:'All resources loaded are secure',
+    failureTitle:'Some insecure resources can be upgraded to HTTPS',
+    description:`Mixed content warnings can prevent you from upgrading to HTTPS.
+          This audit shows which insecure resources this page uses that can be
+          upgraded to HTTPS. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/mixed-content)`,
+    requiredArtifacts:['devtoolsLogs','MixedContent']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    static upgradeURL(url){
+    const parsedURL=new URL(url);
+    parsedURL.protocol='https:';
+    return parsedURL.href;
+    }
+    
+    
+    
+    
+    
+    
+    
+    static simplifyURL(url){
+    const parsedURL=new URL(url);
+    parsedURL.hash='';
+    parsedURL.search='';
+    return parsedURL.href;
+    }
+    
+    
+    
+    
+    
+    
+    
+    static displayURL(url=''){
+    const displayOptions={
+    numPathParts:4,
+    preserveQuery:false,
+    preserveHost:true};
+    
+    return URL.getURLDisplayName(url,displayOptions);
+    }
+    
+    
+    
+    
+    
+    
+    static audit(artifacts,context){
+    const defaultLogs=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const upgradeLogs=artifacts.devtoolsLogs['mixedContentPass'];
+    const baseHostname=new URL(artifacts.MixedContent.url).host;
+    
+    const computedArtifacts=[
+    NetworkRecords.request(defaultLogs,context),
+    NetworkRecords.request(upgradeLogs,context)];
+    
+    
+    return Promise.all(computedArtifacts).then(([defaultRecords,upgradedRecords])=>{
+    const insecureRecords=defaultRecords.filter(
+    record=>!record.isSecure);
+    const secureRecords=defaultRecords.filter(
+    record=>record.isSecure);
+    
+    const upgradePassHosts=new Set();
+    const upgradePassSecureHosts=new Set();
+    upgradedRecords.forEach(record=>{
+    upgradePassHosts.add(new URL(record.url).hostname);
+    if(record.isSecure&&record.finished&&!record.failed){
+    upgradePassSecureHosts.add(new URL(record.url).hostname);
+    }
+    });
+    
+    
+    
+    
+    const seen=new Set();
+    const upgradeableResources=[];
+    
+    for(const record of insecureRecords){
+    const simpleUrl=this.simplifyURL(record.url);
+    if(seen.has(simpleUrl))continue;
+    seen.add(simpleUrl);
+    
+    const resource={
+    host:new URL(record.url).hostname,
+    fullUrl:record.url,
+    referrerDocUrl:this.displayURL(record.documentURL)};
+    
+    
+    if(!upgradePassSecureHosts.has(resource.host))continue;
+    
+    if(!resource.referrerDocUrl.includes(baseHostname))continue;
+    
+    upgradeableResources.push(resource);
+    }
+    
+    const displayValue=`${Util.formatNumber(upgradeableResources.length)}
+              ${upgradeableResources.length===1?'request':'requests'}`;
+    
+    
+    const headings=[
+    {key:'fullUrl',itemType:'url',text:'URL'}];
+    
+    const details=Audit.makeTableDetails(headings,upgradeableResources);
+    
+    const totalRecords=defaultRecords.length;
+    const score=(secureRecords.length+0.5*upgradeableResources.length)/totalRecords;
+    
+    return{
+    score,
+    displayValue:displayValue,
+    details};
+    
+    });
+    }}
+    
+    
+    module.exports=MixedContent;
+    
+    },{"../computed/network-records.js":34,"../lib/url-shim.js":"url","../report/html/renderer/util.js":87,"./audit.js":3}],"../audits/network-requests":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const URL=require('../lib/url-shim.js');
+    const NetworkRecords=require('../computed/network-records.js');
+    
+    class NetworkRequests extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'network-requests',
+    scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
+    title:'Network Requests',
+    description:'Lists the network requests that were made during page load.',
+    requiredArtifacts:['devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static audit(artifacts,context){
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    return NetworkRecords.request(devtoolsLog,context).then(records=>{
+    const earliestStartTime=records.reduce(
+    (min,record)=>Math.min(min,record.startTime),
+    Infinity);
+    
+    
+    
+    const timeToMs=time=>time<earliestStartTime||!Number.isFinite(time)?
+    undefined:(time-earliestStartTime)*1000;
+    
+    const results=records.map(record=>{
+    const endTimeDeltaMs=record.lrStatistics&&record.lrStatistics.endTimeDeltaMs;
+    const TCPMs=record.lrStatistics&&record.lrStatistics.TCPMs;
+    const requestMs=record.lrStatistics&&record.lrStatistics.requestMs;
+    const responseMs=record.lrStatistics&&record.lrStatistics.responseMs;
+    
+    return{
+    url:URL.elideDataURI(record.url),
+    startTime:timeToMs(record.startTime),
+    endTime:timeToMs(record.endTime),
+    transferSize:record.transferSize,
+    resourceSize:record.resourceSize,
+    statusCode:record.statusCode,
+    mimeType:record.mimeType,
+    resourceType:record.resourceType,
+    lrEndTimeDeltaMs:endTimeDeltaMs,
+    lrTCPMs:TCPMs,
+    lrRequestMs:requestMs,
+    lrResponseMs:responseMs};
+    
+    });
+    
+    
+    const headings=[
+    {key:'url',itemType:'url',text:'URL'},
+    {key:'startTime',itemType:'ms',granularity:1,text:'Start Time'},
+    {key:'endTime',itemType:'ms',granularity:1,text:'End Time'},
+    {
+    key:'transferSize',
+    itemType:'bytes',
+    displayUnit:'kb',
+    granularity:1,
+    text:'Transfer Size'},
+    
+    {
+    key:'resourceSize',
+    itemType:'bytes',
+    displayUnit:'kb',
+    granularity:1,
+    text:'Resource Size'},
+    
+    {key:'statusCode',itemType:'text',text:'Status Code'},
+    {key:'mimeType',itemType:'text',text:'MIME Type'},
+    {key:'resourceType',itemType:'text',text:'Resource Type'}];
+    
+    
+    const tableDetails=Audit.makeTableDetails(headings,results);
+    
+    return{
+    score:1,
+    numericValue:results.length,
+    details:tableDetails};
+    
+    });
+    }}
+    
+    
+    module.exports=NetworkRequests;
+    
+    },{"../computed/network-records.js":34,"../lib/url-shim.js":"url","./audit.js":3}],"../audits/network-rtt":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    const NetworkAnalysisComputed=require('../computed/network-analysis.js');
+    
+    const UIStrings={
+    
+    title:'Network Round Trip Times',
+    
+    description:'Network round trip times (RTT) have a large impact on performance. '+
+    'If the RTT to an origin is high, it\'s an indication that servers closer to the user could '+
+    'improve performance. [Learn more](https://hpbn.co/primer-on-latency-and-bandwidth/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class NetworkRTT extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'network-rtt',
+    scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const analysis=await NetworkAnalysisComputed.request(devtoolsLog,context);
+    
+    
+    let maxRtt=0;
+    const baseRtt=analysis.rtt;
+    
+    const results=[];
+    for(const[origin,additionalRtt]of analysis.additionalRttByOrigin.entries()){
+    
+    if(!origin.startsWith('http'))continue;
+    
+    const rtt=additionalRtt+baseRtt;
+    results.push({origin,rtt});
+    maxRtt=Number.isFinite(rtt)?Math.max(rtt,maxRtt):maxRtt;
+    }
+    
+    results.sort((a,b)=>b.rtt-a.rtt);
+    
+    
+    const headings=[
+    {key:'origin',itemType:'text',text:str_(i18n.UIStrings.columnURL)},
+    {key:'rtt',itemType:'ms',granularity:1,text:str_(i18n.UIStrings.columnTimeSpent)}];
+    
+    
+    const tableDetails=Audit.makeTableDetails(headings,results);
+    
+    return{
+    score:1,
+    numericValue:maxRtt,
+    displayValue:str_(i18n.UIStrings.ms,{timeInMs:maxRtt}),
+    details:tableDetails};
+    
+    }}
+    
+    
+    module.exports=NetworkRTT;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/network-rtt.js");
+    },{"../computed/network-analysis.js":33,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/network-server-latency":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    const NetworkAnalysisComputed=require('../computed/network-analysis.js');
+    
+    const UIStrings={
+    
+    title:'Server Backend Latencies',
+    
+    description:'Server latencies can impact web performance. '+
+    'If the server latency of an origin is high, it\'s an indication the server is overloaded '+
+    'or has poor backend performance. [Learn more](https://hpbn.co/primer-on-web-performance/#analyzing-the-resource-waterfall).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class NetworkServerLatency extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'network-server-latency',
+    scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const analysis=await NetworkAnalysisComputed.request(devtoolsLog,context);
+    
+    
+    let maxLatency=0;
+    
+    const results=[];
+    for(const[origin,serverResponseTime]of analysis.serverResponseTimeByOrigin.entries()){
+    
+    if(!origin.startsWith('http'))continue;
+    
+    maxLatency=Math.max(serverResponseTime,maxLatency);
+    results.push({origin,serverResponseTime});
+    }
+    
+    results.sort((a,b)=>b.serverResponseTime-a.serverResponseTime);
+    
+    
+    const headings=[
+    {key:'origin',itemType:'text',text:str_(i18n.UIStrings.columnURL)},
+    {key:'serverResponseTime',itemType:'ms',granularity:1,
+    text:str_(i18n.UIStrings.columnTimeSpent)}];
+    
+    
+    const tableDetails=Audit.makeTableDetails(headings,results);
+    
+    return{
+    score:Math.max(1-maxLatency/500,0),
+    numericValue:maxLatency,
+    displayValue:str_(i18n.UIStrings.ms,{timeInMs:maxLatency}),
+    details:tableDetails};
+    
+    }}
+    
+    
+    module.exports=NetworkServerLatency;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/network-server-latency.js");
+    },{"../computed/network-analysis.js":33,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/offline-start-url":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'`start_url` responds with a 200 when offline',
+    
+    failureTitle:'`start_url` does not respond with a 200 when offline',
+    
+    description:'A service worker enables your web app to be reliable in unpredictable '+
+    'network conditions. [Learn more](https://web.dev/offline-start-url).',
+    
+    
+    
+    
+    warningCantStart:'Lighthouse couldn\'t read the `start_url` from the manifest. As a result, '+
+    'the `start_url` was assumed to be the document\'s URL. Error message: \'{manifestWarning}\'.'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class OfflineStartUrl extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'offline-start-url',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['WebAppManifest','StartUrl']};
+    
+    }
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    
+    
+    const warnings=[];
+    const manifest=artifacts.WebAppManifest;
+    if(manifest&&manifest.value&&manifest.value.start_url.warning){
+    const manifestWarning=manifest.value.start_url.warning;
+    warnings.push(str_(UIStrings.warningCantStart,{manifestWarning}));
+    }
+    
+    const hasOfflineStartUrl=artifacts.StartUrl.statusCode===200;
+    
+    return{
+    score:Number(hasOfflineStartUrl),
+    explanation:artifacts.StartUrl.explanation,
+    warnings};
+    
+    }}
+    
+    
+    module.exports=OfflineStartUrl;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/offline-start-url.js");
+    },{"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/performance-budget":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const ResourceSummary=require('../computed/resource-summary.js');
+    const MainResource=require('../computed/main-resource.js');
+    const Budget=require('../config/budget.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Performance budget',
+    
+    description:'Keep the quantity and size of network requests under the targets '+
+    'set by the provided performance budget. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/budgets).',
+    
+    requestCountOverBudget:`{count, plural,
+        =1 {1 request}
+        other {# requests}
+       }`,
+    
+    columnOverBudget:'Over Budget'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    class ResourceBudget extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'performance-budget',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
+    requiredArtifacts:['devtoolsLogs','URL']};
+    
+    }
+    
+    
+    
+    
+    
+    static getRowLabel(resourceType){
+    
+    const strMappings={
+    'total':i18n.UIStrings.totalResourceType,
+    'document':i18n.UIStrings.documentResourceType,
+    'script':i18n.UIStrings.scriptResourceType,
+    'stylesheet':i18n.UIStrings.stylesheetResourceType,
+    'image':i18n.UIStrings.imageResourceType,
+    'media':i18n.UIStrings.mediaResourceType,
+    'font':i18n.UIStrings.fontResourceType,
+    'other':i18n.UIStrings.otherResourceType,
+    'third-party':i18n.UIStrings.thirdPartyResourceType};
+    
+    return strMappings[resourceType];
+    }
+    
+    
+    
+    
+    
+    
+    static tableItems(budget,summary){
+    const resourceTypes=Object.keys(summary);
+    return resourceTypes.map(resourceType=>{
+    const label=str_(this.getRowLabel(resourceType));
+    const requestCount=summary[resourceType].count;
+    const size=summary[resourceType].size;
+    
+    let sizeOverBudget;
+    let countOverBudget;
+    
+    if(budget.resourceSizes){
+    const sizeBudget=budget.resourceSizes.find(b=>b.resourceType===resourceType);
+    if(sizeBudget&&size>sizeBudget.budget*1024){
+    sizeOverBudget=size-sizeBudget.budget*1024;
+    }
+    }
+    if(budget.resourceCounts){
+    const countBudget=budget.resourceCounts.find(b=>b.resourceType===resourceType);
+    if(countBudget&&requestCount>countBudget.budget){
+    const requestDifference=requestCount-countBudget.budget;
+    countOverBudget=str_(UIStrings.requestCountOverBudget,{count:requestDifference});
+    }
+    }
+    return{
+    resourceType,
+    label,
+    requestCount,
+    size,
+    countOverBudget,
+    sizeOverBudget};
+    
+    }).filter(row=>{
+    
+    if(budget.resourceSizes){
+    if(budget.resourceSizes.some(b=>b.resourceType===row.resourceType))return true;
+    }
+    if(budget.resourceCounts){
+    if(budget.resourceCounts.some(b=>b.resourceType===row.resourceType))return true;
+    }
+    return false;
+    }).sort((a,b)=>{
+    return(b.sizeOverBudget||0)-(a.sizeOverBudget||0);
+    });
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const summary=await ResourceSummary.request({devtoolsLog,URL:artifacts.URL},context);
+    const mainResource=await MainResource.request({URL:artifacts.URL,devtoolsLog},context);
+    
+    
+    const budgets=Array.from(context.settings.budgets||[]);
+    
+    const budget=budgets?budgets.reverse().find(b=>{
+    return Budget.urlMatchesPattern(mainResource.url,b.path);
+    }):undefined;
+    
+    if(!budget){
+    return{
+    score:0,
+    notApplicable:true};
+    
+    }
+    
+    
+    const headers=[
+    {key:'label',itemType:'text',text:str_(i18n.UIStrings.columnResourceType)},
+    {key:'requestCount',itemType:'numeric',text:str_(i18n.UIStrings.columnRequests)},
+    {key:'size',itemType:'bytes',text:str_(i18n.UIStrings.columnTransferSize)},
+    {key:'countOverBudget',itemType:'text',text:''},
+    {key:'sizeOverBudget',itemType:'bytes',text:str_(UIStrings.columnOverBudget)}];
+    
+    
+    return{
+    details:Audit.makeTableDetails(headers,this.tableItems(budget,summary)),
+    score:1};
+    
+    }}
+    
+    
+    module.exports=ResourceBudget;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/performance-budget.js");
+    },{"../computed/main-resource.js":11,"../computed/resource-summary.js":36,"../config/budget.js":42,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/predictive-perf":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const Util=require('../report/html/renderer/util.js');
+    
+    const LanternFcp=require('../computed/metrics/lantern-first-contentful-paint.js');
+    const LanternFmp=require('../computed/metrics/lantern-first-meaningful-paint.js');
+    const LanternInteractive=require('../computed/metrics/lantern-interactive.js');
+    const LanternFirstCPUIdle=require('../computed/metrics/lantern-first-cpu-idle.js');
+    const LanternSpeedIndex=require('../computed/metrics/lantern-speed-index.js');
+    const LanternEil=require('../computed/metrics/lantern-estimated-input-latency.js');
+    
+    
+    
+    const SCORING_POINT_OF_DIMINISHING_RETURNS=1700;
+    const SCORING_MEDIAN=10000;
+    
+    class PredictivePerf extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'predictive-perf',
+    title:'Predicted Performance (beta)',
+    description:
+    'Predicted performance evaluates how your site will perform under '+
+    'a cellular connection on a mobile device.',
+    scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['traces','devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    
+    
+    const settings={};
+    const fcp=await LanternFcp.request({trace,devtoolsLog,settings},context);
+    const fmp=await LanternFmp.request({trace,devtoolsLog,settings},context);
+    const tti=await LanternInteractive.request({trace,devtoolsLog,settings},context);
+    const ttfcpui=await LanternFirstCPUIdle.request({trace,devtoolsLog,settings},context);
+    const si=await LanternSpeedIndex.request({trace,devtoolsLog,settings},context);
+    const eil=await LanternEil.request({trace,devtoolsLog,settings},context);
+    
+    const values={
+    roughEstimateOfFCP:fcp.timing,
+    optimisticFCP:fcp.optimisticEstimate.timeInMs,
+    pessimisticFCP:fcp.pessimisticEstimate.timeInMs,
+    
+    roughEstimateOfFMP:fmp.timing,
+    optimisticFMP:fmp.optimisticEstimate.timeInMs,
+    pessimisticFMP:fmp.pessimisticEstimate.timeInMs,
+    
+    roughEstimateOfTTI:tti.timing,
+    optimisticTTI:tti.optimisticEstimate.timeInMs,
+    pessimisticTTI:tti.pessimisticEstimate.timeInMs,
+    
+    roughEstimateOfTTFCPUI:ttfcpui.timing,
+    optimisticTTFCPUI:ttfcpui.optimisticEstimate.timeInMs,
+    pessimisticTTFCPUI:ttfcpui.pessimisticEstimate.timeInMs,
+    
+    roughEstimateOfSI:si.timing,
+    optimisticSI:si.optimisticEstimate.timeInMs,
+    pessimisticSI:si.pessimisticEstimate.timeInMs,
+    
+    roughEstimateOfEIL:eil.timing,
+    optimisticEIL:eil.optimisticEstimate.timeInMs,
+    pessimisticEIL:eil.pessimisticEstimate.timeInMs};
+    
+    
+    const score=Audit.computeLogNormalScore(
+    values.roughEstimateOfTTI,
+    SCORING_POINT_OF_DIMINISHING_RETURNS,
+    SCORING_MEDIAN);
+    
+    
+    return{
+    score,
+    numericValue:values.roughEstimateOfTTI,
+    displayValue:Util.formatMilliseconds(values.roughEstimateOfTTI),
+    details:{
+    type:'debugdata',
+    
+    items:[values]}};
+    
+    
+    }}
+    
+    
+    module.exports=PredictivePerf;
+    
+    },{"../computed/metrics/lantern-estimated-input-latency.js":19,"../computed/metrics/lantern-first-contentful-paint.js":20,"../computed/metrics/lantern-first-cpu-idle.js":21,"../computed/metrics/lantern-first-meaningful-paint.js":22,"../computed/metrics/lantern-interactive.js":23,"../computed/metrics/lantern-speed-index.js":26,"../report/html/renderer/util.js":87,"./audit.js":3}],"../audits/redirects-http":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Redirects HTTP traffic to HTTPS',
+    
+    failureTitle:'Does not redirect HTTP traffic to HTTPS',
+    
+    description:'If you\'ve already set up HTTPS, make sure that you redirect all HTTP '+
+    'traffic to HTTPS in order to enable secure web features for all your users. [Learn more](https://web.dev/redirects-http).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class RedirectsHTTP extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'redirects-http',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['HTTPRedirect']};
+    
+    }
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    return{
+    score:Number(artifacts.HTTPRedirect.value)};
+    
+    }}
+    
+    
+    module.exports=RedirectsHTTP;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/redirects-http.js");
+    },{"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/redirects":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const UnusedBytes=require('./byte-efficiency/byte-efficiency-audit.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    const TraceOfTab=require('../computed/trace-of-tab.js');
+    const NetworkRecords=require('../computed/network-records.js');
+    const MainResource=require('../computed/main-resource.js');
+    const LanternInteractive=require('../computed/metrics/lantern-interactive.js');
+    
+    const UIStrings={
+    
+    title:'Avoid multiple page redirects',
+    
+    description:'Redirects introduce additional delays before the page can be loaded. [Learn more](https://web.dev/redirects).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class Redirects extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'redirects',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['URL','devtoolsLogs','traces']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const settings=context.settings;
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    
+    const traceOfTab=await TraceOfTab.request(trace,context);
+    const networkRecords=await NetworkRecords.request(devtoolsLog,context);
+    const mainResource=await MainResource.request({URL:artifacts.URL,devtoolsLog},context);
+    
+    const metricComputationData={trace,devtoolsLog,traceOfTab,networkRecords,settings};
+    const metricResult=await LanternInteractive.request(metricComputationData,context);
+    
+    
+    const nodeTimingsByUrl=new Map();
+    for(const[node,timing]of metricResult.pessimisticEstimate.nodeTimings.entries()){
+    if(node.type==='network'){
+    const networkNode=node;
+    nodeTimingsByUrl.set(networkNode.record.url,timing);
+    }
+    }
+    
+    
+    const redirectRequests=Array.from(mainResource.redirects||[]);
+    
+    
+    redirectRequests.push(mainResource);
+    
+    let totalWastedMs=0;
+    const pageRedirects=[];
+    
+    
+    if(redirectRequests.length>1){
+    pageRedirects.push({
+    url:`(Initial: ${redirectRequests[0].url})`,
+    wastedMs:0});
+    
+    }
+    
+    for(let i=1;i<redirectRequests.length;i++){
+    const initialRequest=redirectRequests[i-1];
+    const redirectedRequest=redirectRequests[i];
+    
+    const initialTiming=nodeTimingsByUrl.get(initialRequest.url);
+    const redirectedTiming=nodeTimingsByUrl.get(redirectedRequest.url);
+    if(!initialTiming||!redirectedTiming){
+    throw new Error('Could not find redirects in graph');
+    }
+    
+    const wastedMs=redirectedTiming.startTime-initialTiming.startTime;
+    totalWastedMs+=wastedMs;
+    
+    pageRedirects.push({
+    url:redirectedRequest.url,
+    wastedMs});
+    
+    }
+    
+    
+    const headings=[
+    {key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+    {key:'wastedMs',valueType:'timespanMs',label:str_(i18n.UIStrings.columnTimeSpent)}];
+    
+    const details=Audit.makeOpportunityDetails(headings,pageRedirects,totalWastedMs);
+    
+    return{
+    
+    score:redirectRequests.length<=2?1:UnusedBytes.scoreForWastedMs(totalWastedMs),
+    numericValue:totalWastedMs,
+    displayValue:totalWastedMs?
+    str_(i18n.UIStrings.displayValueMsSavings,{wastedMs:totalWastedMs}):
+    '',
+    extendedInfo:{
+    value:{
+    wastedMs:totalWastedMs}},
+    
+    
+    details};
+    
+    }}
+    
+    
+    module.exports=Redirects;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/redirects.js");
+    },{"../computed/main-resource.js":11,"../computed/metrics/lantern-interactive.js":23,"../computed/network-records.js":34,"../computed/trace-of-tab.js":39,"../lib/i18n/i18n.js":66,"./audit.js":3,"./byte-efficiency/byte-efficiency-audit.js":4}],"../audits/resource-summary":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const ComputedResourceSummary=require('../computed/resource-summary.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Keep request counts low and transfer sizes small',
+    
+    description:'To set budgets for the quantity and size of page resources,'+
+    ' add a budget.json file. [Learn more](https://developers.google.com/web/tools/lighthouse/audits/budgets).',
+    
+    displayValue:`{requestCount, plural, `+
+    `=1 {1 request • {byteCount, number, bytes} KB} `+
+    `other {# requests • {byteCount, number, bytes} KB}}`};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class ResourceSummary extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'resource-summary',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
+    requiredArtifacts:['devtoolsLogs','URL']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const summary=await ComputedResourceSummary.
+    request({devtoolsLog,URL:artifacts.URL},context);
+    
+    
+    const headings=[
+    {key:'label',itemType:'text',text:str_(i18n.UIStrings.columnResourceType)},
+    {key:'requestCount',itemType:'numeric',text:str_(i18n.UIStrings.columnRequests)},
+    {key:'size',itemType:'bytes',text:str_(i18n.UIStrings.columnTransferSize)}];
+    
+    
+    
+    
+    const strMappings={
+    'total':str_(i18n.UIStrings.totalResourceType),
+    'document':str_(i18n.UIStrings.documentResourceType),
+    'script':str_(i18n.UIStrings.scriptResourceType),
+    'stylesheet':str_(i18n.UIStrings.stylesheetResourceType),
+    'image':str_(i18n.UIStrings.imageResourceType),
+    'media':str_(i18n.UIStrings.mediaResourceType),
+    'font':str_(i18n.UIStrings.fontResourceType),
+    'other':str_(i18n.UIStrings.otherResourceType),
+    'third-party':str_(i18n.UIStrings.thirdPartyResourceType)};
+    
+    
+    const types=Object.keys(summary);
+    const rows=types.map(type=>{
+    return{
+    
+    
+    resourceType:type,
+    label:strMappings[type],
+    requestCount:summary[type].count,
+    size:summary[type].size};
+    
+    });
+    
+    const thirdPartyRow=rows.find(r=>r.resourceType==='third-party')||[];
+    const otherRows=rows.filter(r=>r.resourceType!=='third-party').
+    sort((a,b)=>{
+    return b.size-a.size;
+    });
+    const tableItems=otherRows.concat(thirdPartyRow);
+    
+    const tableDetails=Audit.makeTableDetails(headings,tableItems);
+    
+    return{
+    details:tableDetails,
+    score:1,
+    displayValue:str_(UIStrings.displayValue,{
+    requestCount:summary.total.count,
+    byteCount:summary.total.size})};
+    
+    
+    }}
+    
+    
+    module.exports=ResourceSummary;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/resource-summary.js");
+    },{"../computed/resource-summary.js":36,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/screenshot-thumbnails":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const LHError=require('../lib/lh-error.js');
+    const jpeg=require('jpeg-js');
+    const Speedline=require('../computed/speedline.js');
+    const Interactive=require('../computed/metrics/interactive.js');
+    
+    const NUMBER_OF_THUMBNAILS=10;
+    const THUMBNAIL_WIDTH=120;
+    
+    
+    
+    class ScreenshotThumbnails extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'screenshot-thumbnails',
+    scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
+    title:'Screenshot Thumbnails',
+    description:'This is what the load of your site looked like.',
+    requiredArtifacts:['traces','devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    static scaleImageToThumbnail(imageData){
+    const scaledWidth=THUMBNAIL_WIDTH;
+    const scaleFactor=imageData.width/scaledWidth;
+    const scaledHeight=Math.floor(imageData.height/scaleFactor);
+    
+    const outPixels=new Uint8Array(scaledWidth*scaledHeight*4);
+    
+    for(let i=0;i<scaledWidth;i++){
+    for(let j=0;j<scaledHeight;j++){
+    const origX=Math.floor(i*scaleFactor);
+    const origY=Math.floor(j*scaleFactor);
+    
+    const origPos=(origY*imageData.width+origX)*4;
+    const outPos=(j*scaledWidth+i)*4;
+    
+    outPixels[outPos]=imageData.data[origPos];
+    outPixels[outPos+1]=imageData.data[origPos+1];
+    outPixels[outPos+2]=imageData.data[origPos+2];
+    outPixels[outPos+3]=imageData.data[origPos+3];
+    }
+    }
+    
+    return{
+    width:scaledWidth,
+    height:scaledHeight,
+    data:outPixels};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    
+    const cachedThumbnails=new Map();
+    
+    const speedline=await Speedline.request(trace,context);
+    
+    
+    let minimumTimelineDuration=context.options.minimumTimelineDuration||3000;
+    
+    if(context.settings.throttlingMethod!=='simulate'){
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const metricComputationData={trace,devtoolsLog,settings:context.settings};
+    const tti=Interactive.request(metricComputationData,context);
+    try{
+    minimumTimelineDuration=Math.max((await tti).timing,minimumTimelineDuration);
+    }catch(_){}
+    }
+    
+    const thumbnails=[];
+    const analyzedFrames=speedline.frames.filter(frame=>!frame.isProgressInterpolated());
+    const maxFrameTime=
+    speedline.complete||
+    Math.max(...speedline.frames.map(frame=>frame.getTimeStamp()-speedline.beginning));
+    const timelineEnd=Math.max(maxFrameTime,minimumTimelineDuration);
+    
+    if(!analyzedFrames.length||!Number.isFinite(timelineEnd)){
+    throw new LHError(LHError.errors.INVALID_SPEEDLINE);
+    }
+    
+    for(let i=1;i<=NUMBER_OF_THUMBNAILS;i++){
+    const targetTimestamp=speedline.beginning+timelineEnd*i/NUMBER_OF_THUMBNAILS;
+    
+    
+    
+    let frameForTimestamp=null;
+    if(i===NUMBER_OF_THUMBNAILS){
+    frameForTimestamp=analyzedFrames[analyzedFrames.length-1];
+    }else{
+    analyzedFrames.forEach(frame=>{
+    if(frame.getTimeStamp()<=targetTimestamp){
+    frameForTimestamp=frame;
+    }
+    });
+    }
+    
+    let base64Data;
+    const cachedThumbnail=cachedThumbnails.get(frameForTimestamp);
+    if(cachedThumbnail){
+    base64Data=cachedThumbnail;
+    }else{
+    const imageData=frameForTimestamp.getParsedImage();
+    const thumbnailImageData=ScreenshotThumbnails.scaleImageToThumbnail(imageData);
+    base64Data=jpeg.encode(thumbnailImageData,90).data.toString('base64');
+    cachedThumbnails.set(frameForTimestamp,base64Data);
+    }
+    thumbnails.push({
+    timing:Math.round(targetTimestamp-speedline.beginning),
+    timestamp:targetTimestamp*1000,
+    data:`data:image/jpeg;base64,${base64Data}`});
+    
+    }
+    
+    return{
+    score:1,
+    details:{
+    type:'filmstrip',
+    scale:timelineEnd,
+    items:thumbnails}};
+    
+    
+    }}
+    
+    
+    module.exports=ScreenshotThumbnails;
+    
+    },{"../computed/metrics/interactive.js":18,"../computed/speedline.js":38,"../lib/lh-error.js":71,"./audit.js":3,"jpeg-js":122}],"../audits/seo/canonical":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('../audit.js');
+    const URL=require('../../lib/url-shim.js');
+    const MainResource=require('../../computed/main-resource.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Document has a valid `rel=canonical`',
+    
+    failureTitle:'Document does not have a valid `rel=canonical`',
+    
+    description:'Canonical links suggest which URL to show in search results. '+
+    '[Learn more](https://web.dev/canonical).',
+    
+    
+    
+    
+    explanationConflict:'Multiple conflicting URLs ({urlList})',
+    
+    
+    
+    
+    explanationInvalid:'Invalid URL ({url})',
+    
+    
+    
+    
+    explanationRelative:'Relative URL ({url})',
+    
+    
+    
+    
+    explanationPointsElsewhere:'Points to another `hreflang` location ({url})',
+    
+    
+    
+    
+    explanationDifferentDomain:'Points to a different domain ({url})',
+    
+    explanationRoot:'Points to the domain\'s root URL (the homepage), '+
+    'instead of an equivalent page of content'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    class Canonical extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'canonical',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['LinkElements','URL','devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    
+    static collectCanonicalURLs(linkElements){
+    
+    const uniqueCanonicalURLs=new Set();
+    
+    const hreflangURLs=new Set();
+    
+    
+    let invalidCanonicalLink;
+    
+    let relativeCanonicallink;
+    for(const link of linkElements){
+    
+    
+    if(link.source==='body')continue;
+    
+    if(link.rel==='canonical'){
+    
+    if(!link.hrefRaw)continue;
+    
+    
+    if(!link.href)invalidCanonicalLink=link;else
+    
+    if(!URL.isValid(link.hrefRaw))relativeCanonicallink=link;else
+    
+    uniqueCanonicalURLs.add(link.href);
+    }else if(link.rel==='alternate'){
+    if(link.href&&link.hreflang)hreflangURLs.add(link.href);
+    }
+    }
+    
+    return{uniqueCanonicalURLs,hreflangURLs,invalidCanonicalLink,relativeCanonicallink};
+    }
+    
+    
+    
+    
+    
+    static findInvalidCanonicalURLReason(canonicalURLData){
+    const{uniqueCanonicalURLs,invalidCanonicalLink,relativeCanonicallink}=canonicalURLData;
+    
+    
+    if(invalidCanonicalLink){
+    return{
+    score:0,
+    explanation:str_(UIStrings.explanationInvalid,{url:invalidCanonicalLink.hrefRaw})};
+    
+    }
+    
+    
+    if(relativeCanonicallink){
+    return{
+    score:0,
+    explanation:str_(UIStrings.explanationRelative,{url:relativeCanonicallink.hrefRaw})};
+    
+    }
+    
+    
+    const canonicalURLs=Array.from(uniqueCanonicalURLs);
+    
+    
+    if(canonicalURLs.length===0){
+    return{
+    score:1,
+    notApplicable:true};
+    
+    }
+    
+    
+    if(canonicalURLs.length>1){
+    return{
+    score:0,
+    explanation:str_(UIStrings.explanationConflict,{urlList:canonicalURLs.join(', ')})};
+    
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    static findCommonCanonicalURLMistakes(canonicalURLData,canonicalURL,baseURL){
+    const{hreflangURLs}=canonicalURLData;
+    
+    
+    if(
+    hreflangURLs.has(baseURL.href)&&
+    hreflangURLs.has(canonicalURL.href)&&
+    baseURL.href!==canonicalURL.href)
+    {
+    return{
+    score:0,
+    explanation:str_(UIStrings.explanationPointsElsewhere,{url:baseURL.href})};
+    
+    }
+    
+    
+    
+    if(!URL.rootDomainsMatch(canonicalURL,baseURL)){
+    return{
+    score:0,
+    explanation:str_(UIStrings.explanationDifferentDomain,{url:canonicalURL.href})};
+    
+    }
+    
+    
+    if(
+    canonicalURL.origin===baseURL.origin&&
+    canonicalURL.pathname==='/'&&
+    baseURL.pathname!=='/')
+    {
+    return{
+    score:0,
+    explanation:str_(UIStrings.explanationRoot)};
+    
+    }
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    
+    const mainResource=await MainResource.request({devtoolsLog,URL:artifacts.URL},context);
+    const baseURL=new URL(mainResource.url);
+    const canonicalURLData=Canonical.collectCanonicalURLs(artifacts.LinkElements);
+    
+    
+    const invalidURLAuditProduct=Canonical.findInvalidCanonicalURLReason(canonicalURLData);
+    if(invalidURLAuditProduct)return invalidURLAuditProduct;
+    
+    
+    const canonicalURL=new URL([...canonicalURLData.uniqueCanonicalURLs][0]);
+    const mistakeAuditProduct=Canonical.findCommonCanonicalURLMistakes(
+    canonicalURLData,
+    canonicalURL,
+    baseURL);
+    
+    
+    if(mistakeAuditProduct)return mistakeAuditProduct;
+    
+    return{
+    score:1};
+    
+    }}
+    
+    
+    module.exports=Canonical;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/seo/canonical.js");
+    },{"../../computed/main-resource.js":11,"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/seo/font-size":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    const URL=require('../../lib/url-shim.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    const Audit=require('../audit.js');
+    const ComputedViewportMeta=require('../../computed/viewport-meta.js');
+    const MINIMAL_PERCENTAGE_OF_LEGIBLE_TEXT=60;
+    
+    const UIStrings={
+    
+    title:'Document uses legible font sizes',
+    
+    failureTitle:'Document doesn\'t use legible font sizes',
+    
+    description:'Font sizes less than 12px are too small to be legible and require mobile visitors to “pinch to zoom” in order to read. Strive to have >60% of page text ≥12px. [Learn more](https://web.dev/font-size).',
+    
+    displayValue:'{decimalProportion, number, extendedPercent} legible text',
+    
+    explanationViewport:'Text is illegible because there\'s no viewport meta tag optimized '+
+    'for mobile screens.',
+    
+    explanationWithDisclaimer:'{decimalProportion, number, extendedPercent} of text is too '+
+    'small (based on {decimalProportionVisited, number, extendedPercent} sample).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    function getUniqueFailingRules(fontSizeArtifact){
+    
+    const failingRules=new Map();
+    
+    fontSizeArtifact.forEach(({cssRule,fontSize,textLength,node})=>{
+    const artifactId=getFontArtifactId(cssRule,node);
+    const failingRule=failingRules.get(artifactId);
+    
+    if(!failingRule){
+    failingRules.set(artifactId,{
+    node,
+    cssRule,
+    fontSize,
+    textLength});
+    
+    }else{
+    failingRule.textLength+=textLength;
+    }
+    });
+    
+    return[...failingRules.values()];
+    }
+    
+    
+    
+    
+    
+    function getAttributeMap(attributes=[]){
+    const map=new Map();
+    
+    for(let i=0;i<attributes.length;i+=2){
+    const name=attributes[i].toLowerCase();
+    const value=attributes[i+1].trim();
+    
+    if(value){
+    map.set(name,value);
+    }
+    }
+    
+    return map;
+    }
+    
+    
+    
+    
+    
+    
+    function getSelector(node){
+    const attributeMap=getAttributeMap(node.attributes);
+    
+    if(attributeMap.has('id')){
+    return'#'+attributeMap.get('id');
+    }else{
+    const attrClass=attributeMap.get('class');
+    if(attrClass){
+    return'.'+attrClass.split(/\s+/).join('.');
+    }
+    }
+    
+    return node.localName.toLowerCase();
+    }
+    
+    
+    
+    
+    
+    function nodeToTableNode(node){
+    const attributes=node.attributes||[];
+    const attributesString=attributes.map((value,idx)=>
+    idx%2===0?` ${value}`:`="${value}"`).
+    join('');
+    
+    return{
+    type:'node',
+    selector:node.parentNode?getSelector(node.parentNode):'',
+    snippet:`<${node.localName}${attributesString}>`};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    function findStyleRuleSource(baseURL,styleDeclaration,node){
+    if(
+    !styleDeclaration||
+    styleDeclaration.type==='Attributes'||
+    styleDeclaration.type==='Inline')
+    {
+    return{
+    selector:nodeToTableNode(node),
+    source:baseURL};
+    
+    }
+    
+    if(styleDeclaration.parentRule&&
+    styleDeclaration.parentRule.origin==='user-agent'){
+    return{
+    selector:styleDeclaration.parentRule.selectors.map(item=>item.text).join(', '),
+    source:'User Agent Stylesheet'};
+    
+    }
+    
+    if(styleDeclaration.type==='Regular'&&styleDeclaration.parentRule){
+    const rule=styleDeclaration.parentRule;
+    const stylesheet=styleDeclaration.stylesheet;
+    
+    if(stylesheet){
+    let source;
+    const selector=rule.selectors.map(item=>item.text).join(', ');
+    
+    if(stylesheet.sourceURL){
+    const url=new URL(stylesheet.sourceURL,baseURL);
+    const range=styleDeclaration.range;
+    source=`${url.href}`;
+    
+    
+    if(range){
+    let line=range.startLine+1;
+    let column=range.startColumn;
+    
+    
+    
+    
+    
+    
+    
+    const addHtmlLocationOffset=stylesheet.isInline&&!stylesheet.hasSourceURL;
+    if(addHtmlLocationOffset){
+    line+=stylesheet.startLine;
+    
+    if(range.startLine===0){
+    column+=stylesheet.startColumn;
+    }
+    }
+    
+    source+=`:${line}:${column}`;
+    }
+    }else{
+    
+    source='dynamic';
+    }
+    
+    return{
+    selector,
+    source};
+    
+    }
+    }
+    
+    
+    
+    return{
+    selector:'',
+    source:'Unknown'};
+    
+    }
+    
+    
+    
+    
+    
+    
+    function getFontArtifactId(styleDeclaration,node){
+    if(styleDeclaration&&styleDeclaration.type==='Regular'){
+    const startLine=styleDeclaration.range?styleDeclaration.range.startLine:0;
+    const startColumn=styleDeclaration.range?styleDeclaration.range.startColumn:0;
+    return`${styleDeclaration.styleSheetId}@${startLine}:${startColumn}`;
+    }else{
+    return`node_${node.nodeId}`;
+    }
+    }
+    
+    class FontSize extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'font-size',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['FontSize','URL','MetaElements','TestedAsMobileDevice']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    if(!artifacts.TestedAsMobileDevice){
+    
+    return{
+    score:1,
+    notApplicable:true};
+    
+    }
+    
+    const viewportMeta=await ComputedViewportMeta.request(artifacts.MetaElements,context);
+    if(!viewportMeta.isMobileOptimized){
+    return{
+    score:0,
+    explanation:str_(UIStrings.explanationViewport)};
+    
+    }
+    
+    const{
+    analyzedFailingNodesData,
+    analyzedFailingTextLength,
+    failingTextLength,
+    visitedTextLength,
+    totalTextLength}=
+    artifacts.FontSize;
+    
+    if(totalTextLength===0){
+    return{
+    score:1};
+    
+    }
+    
+    const failingRules=getUniqueFailingRules(analyzedFailingNodesData);
+    const percentageOfPassingText=
+    (visitedTextLength-failingTextLength)/visitedTextLength*100;
+    const pageUrl=artifacts.URL.finalUrl;
+    
+    
+    const headings=[
+    {key:'source',itemType:'url',text:'Source'},
+    {key:'selector',itemType:'code',text:'Selector'},
+    {key:'coverage',itemType:'text',text:'% of Page Text'},
+    {key:'fontSize',itemType:'text',text:'Font Size'}];
+    
+    
+    const tableData=failingRules.sort((a,b)=>b.textLength-a.textLength).
+    map(({cssRule,textLength,fontSize,node})=>{
+    const percentageOfAffectedText=textLength/visitedTextLength*100;
+    const origin=findStyleRuleSource(pageUrl,cssRule,node);
+    
+    return{
+    source:origin.source,
+    selector:origin.selector,
+    coverage:`${percentageOfAffectedText.toFixed(2)}%`,
+    fontSize:`${fontSize}px`};
+    
+    });
+    
+    
+    if(analyzedFailingTextLength<failingTextLength){
+    const percentageOfUnanalyzedFailingText=
+    (failingTextLength-analyzedFailingTextLength)/visitedTextLength*100;
+    
+    tableData.push({
+    source:'Add\'l illegible text',
+    selector:'',
+    coverage:`${percentageOfUnanalyzedFailingText.toFixed(2)}%`,
+    fontSize:'< 12px'});
+    
+    }
+    
+    if(percentageOfPassingText>0){
+    tableData.push({
+    source:'Legible text',
+    selector:'',
+    coverage:`${percentageOfPassingText.toFixed(2)}%`,
+    fontSize:'≥ 12px'});
+    
+    }
+    
+    const decimalProportion=percentageOfPassingText/100;
+    const displayValue=str_(UIStrings.displayValue,{decimalProportion});
+    const details=Audit.makeTableDetails(headings,tableData);
+    const passed=percentageOfPassingText>=MINIMAL_PERCENTAGE_OF_LEGIBLE_TEXT;
+    
+    let explanation;
+    if(!passed){
+    const percentageOfFailingText=(100-percentageOfPassingText)/100;
+    
+    
+    if(visitedTextLength<totalTextLength){
+    const percentageOfVisitedText=visitedTextLength/totalTextLength;
+    explanation=str_(UIStrings.explanationWithDisclaimer,
+    {
+    decimalProportion:percentageOfFailingText,
+    decimalProportionVisited:percentageOfVisitedText});
+    
+    }
+    }
+    
+    return{
+    score:Number(passed),
+    details,
+    displayValue,
+    explanation};
+    
+    }}
+    
+    
+    module.exports=FontSize;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/seo/font-size.js");
+    },{"../../computed/viewport-meta.js":41,"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/seo/hreflang":[function(require,module,exports){
+    (function(global,__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('../audit.js');
+    const VALID_LANGS=importValidLangs();
+    const NO_LANGUAGE='x-default';
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Document has a valid `hreflang`',
+    
+    failureTitle:'Document doesn\'t have a valid `hreflang`',
+    
+    description:'hreflang links tell search engines what version of a page they should '+
+    'list in search results for a given language or region. [Learn more]'+
+    '(https://web.dev/hreflang).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    
+    
+    function importValidLangs(){
+    
+    const axeCache=global.axe;
+    
+    global.axe={utils:{}};
+    
+    require('axe-core/lib/core/utils/valid-langs.js');
+    
+    const validLangs=global.axe.utils.validLangs();
+    
+    global.axe=axeCache;
+    
+    return validLangs;
+    }
+    
+    
+    
+    
+    
+    function isValidHreflang(hreflang){
+    if(hreflang.toLowerCase()===NO_LANGUAGE){
+    return true;
+    }
+    
+    
+    const[lang]=hreflang.split('-');
+    return VALID_LANGS.includes(lang.toLowerCase());
+    }
+    
+    class Hreflang extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'hreflang',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['LinkElements','URL']};
+    
+    }
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    
+    const invalidHreflangs=[];
+    
+    for(const link of artifacts.LinkElements){
+    if(link.rel!=='alternate')continue;
+    if(!link.hreflang||isValidHreflang(link.hreflang))continue;
+    if(link.source==='body')continue;
+    
+    if(link.source==='head'){
+    invalidHreflangs.push({
+    source:{
+    type:'node',
+    snippet:`<link rel="alternate" hreflang="${link.hreflang}" href="${link.href}" />`}});
+    
+    
+    }else if(link.source==='headers'){
+    invalidHreflangs.push({
+    source:`Link: <${link.href}>; rel="alternate"; hreflang="${link.hreflang}"`});
+    
+    }
+    }
+    
+    
+    const headings=[
+    {key:'source',itemType:'code',text:'Source'}];
+    
+    const details=Audit.makeTableDetails(headings,invalidHreflangs);
+    
+    return{
+    score:Number(invalidHreflangs.length===0),
+    details};
+    
+    }}
+    
+    
+    module.exports=Hreflang;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{},"/lighthouse-core/audits/seo/hreflang.js");
+    },{"../../lib/i18n/i18n.js":66,"../audit.js":3,"axe-core/lib/core/utils/valid-langs.js":96}],"../audits/seo/http-status-code":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('../audit.js');
+    const MainResource=require('../../computed/main-resource.js');
+    const HTTP_UNSUCCESSFUL_CODE_LOW=400;
+    const HTTP_UNSUCCESSFUL_CODE_HIGH=599;
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Page has successful HTTP status code',
+    
+    failureTitle:'Page has unsuccessful HTTP status code',
+    
+    description:'Pages with unsuccessful HTTP status codes may not be indexed properly. '+
+    '[Learn more](https://web.dev/http-status-code).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class HTTPStatusCode extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'http-status-code',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['devtoolsLogs','URL']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static audit(artifacts,context){
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const URL=artifacts.URL;
+    
+    return MainResource.request({devtoolsLog,URL},context).
+    then(mainResource=>{
+    const statusCode=mainResource.statusCode;
+    
+    if(statusCode>=HTTP_UNSUCCESSFUL_CODE_LOW&&
+    statusCode<=HTTP_UNSUCCESSFUL_CODE_HIGH){
+    return{
+    score:0,
+    displayValue:`${statusCode}`};
+    
+    }
+    
+    return{
+    score:1};
+    
+    });
+    }}
+    
+    
+    module.exports=HTTPStatusCode;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/seo/http-status-code.js");
+    },{"../../computed/main-resource.js":11,"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/seo/is-crawlable":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('../audit.js');
+    const robotsParser=require('robots-parser');
+    const URL=require('../../lib/url-shim.js');
+    const MainResource=require('../../computed/main-resource.js');
+    const BLOCKLIST=new Set([
+    'noindex',
+    'none']);
+    
+    const ROBOTS_HEADER='x-robots-tag';
+    const UNAVAILABLE_AFTER='unavailable_after';
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Page isn’t blocked from indexing',
+    
+    failureTitle:'Page is blocked from indexing',
+    
+    description:'Search engines are unable to include your pages in search results '+
+    'if they don\'t have permission to crawl them. [Learn more](https://web.dev/is-crawable).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    
+    function isUnavailable(directive){
+    const parts=directive.split(':');
+    
+    if(parts.length<=1||parts[0]!==UNAVAILABLE_AFTER){
+    return false;
+    }
+    
+    const date=Date.parse(parts.slice(1).join(':'));
+    
+    return!isNaN(date)&&date<Date.now();
+    }
+    
+    
+    
+    
+    
+    
+    function hasBlockingDirective(directives){
+    return directives.split(',').
+    map(d=>d.toLowerCase().trim()).
+    some(d=>BLOCKLIST.has(d)||isUnavailable(d));
+    }
+    
+    
+    
+    
+    
+    
+    function hasUserAgent(directives){
+    const parts=directives.match(/^([^,:]+):/);
+    
+    
+    
+    return!!parts&&parts[1].toLowerCase()!==UNAVAILABLE_AFTER;
+    }
+    
+    class IsCrawlable extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'is-crawlable',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['MetaElements','RobotsTxt','URL','devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static audit(artifacts,context){
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const metaRobots=artifacts.MetaElements.find(meta=>meta.name==='robots');
+    
+    return MainResource.request({devtoolsLog,URL:artifacts.URL},context).
+    then(mainResource=>{
+    
+    const blockingDirectives=[];
+    
+    if(metaRobots){
+    const metaRobotsContent=metaRobots.content||'';
+    const isBlocking=hasBlockingDirective(metaRobotsContent);
+    
+    if(isBlocking){
+    blockingDirectives.push({
+    source:{
+    type:'node',
+    snippet:`<meta name="robots" content="${metaRobotsContent}" />`}});
+    
+    
+    }
+    }
+    
+    mainResource.responseHeaders&&mainResource.responseHeaders.
+    filter(h=>h.name.toLowerCase()===ROBOTS_HEADER&&!hasUserAgent(h.value)&&
+    hasBlockingDirective(h.value)).
+    forEach(h=>blockingDirectives.push({source:`${h.name}: ${h.value}`}));
+    
+    if(artifacts.RobotsTxt.content){
+    const robotsFileUrl=new URL('/robots.txt',mainResource.url);
+    const robotsTxt=robotsParser(robotsFileUrl.href,artifacts.RobotsTxt.content);
+    
+    if(!robotsTxt.isAllowed(mainResource.url)){
+    blockingDirectives.push({
+    source:{
+    type:'url',
+    value:robotsFileUrl.href}});
+    
+    
+    }
+    }
+    
+    
+    const headings=[
+    {key:'source',itemType:'code',text:'Blocking Directive Source'}];
+    
+    const details=Audit.makeTableDetails(headings,blockingDirectives);
+    
+    return{
+    score:Number(blockingDirectives.length===0),
+    details};
+    
+    });
+    }}
+    
+    
+    module.exports=IsCrawlable;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/seo/is-crawlable.js");
+    },{"../../computed/main-resource.js":11,"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3,"robots-parser":177}],"../audits/seo/link-text":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('../audit.js');
+    const URL=require('../../lib/url-shim.js');
+    const BLOCKLIST=new Set([
+    
+    'click here',
+    'click this',
+    'go',
+    'here',
+    'this',
+    'start',
+    'right here',
+    'more',
+    'learn more',
+    
+    'ここをクリック',
+    'こちらをクリック',
+    'リンク',
+    '続きを読む',
+    '続く',
+    '全文表示',
+    
+    'click aquí',
+    'click aqui',
+    'clicka aquí',
+    'clicka aqui',
+    'pincha aquí',
+    'pincha aqui',
+    'aquí',
+    'aqui',
+    'más',
+    'mas',
+    'más información',
+    'más informacion',
+    'mas información',
+    'mas informacion',
+    'este',
+    'enlace',
+    'este enlace',
+    'empezar',
+    
+    'clique aqui',
+    'inicio',
+    'início',
+    'ir',
+    'mais informação',
+    'mais informações',
+    'mais',
+    'veja mais',
+    
+    '여기',
+    '여기를 클릭',
+    '클릭',
+    '링크',
+    '자세히',
+    '자세히 보기',
+    '계속',
+    '이동',
+    '전체 보기']);
+    
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Links have descriptive text',
+    
+    failureTitle:'Links do not have descriptive text',
+    
+    description:'Descriptive link text helps search engines understand your content. '+
+    '[Learn more](https://web.dev/link-text).',
+    
+    displayValue:`{itemCount, plural,
+        =1 {1 link found}
+        other {# links found}
+        }`};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class LinkText extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'link-text',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['URL','AnchorElements']};
+    
+    }
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    const failingLinks=artifacts.AnchorElements.
+    filter(link=>link.href&&!link.rel.includes('nofollow')).
+    filter(link=>{
+    const href=link.href.toLowerCase();
+    if(
+    href.startsWith('javascript:')||
+    href.startsWith('mailto:')||
+    URL.equalWithExcludedFragments(link.href,artifacts.URL.finalUrl))
+    {
+    return false;
+    }
+    
+    return BLOCKLIST.has(link.text.trim().toLowerCase());
+    }).
+    map(link=>{
+    return{
+    href:link.href,
+    text:link.text.trim()};
+    
+    });
+    
+    
+    const headings=[
+    {key:'href',itemType:'url',text:'Link destination'},
+    {key:'text',itemType:'text',text:'Link Text'}];
+    
+    
+    const details=Audit.makeTableDetails(headings,failingLinks,{});
+    let displayValue;
+    
+    if(failingLinks.length){
+    displayValue=str_(UIStrings.displayValue,{itemCount:failingLinks.length});
+    }
+    
+    return{
+    score:Number(failingLinks.length===0),
+    details,
+    displayValue};
+    
+    }}
+    
+    
+    module.exports=LinkText;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/seo/link-text.js");
+    },{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/seo/manual/structured-data":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ManualAudit=require('../../manual/manual-audit.js');
+    const i18n=require('../../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    description:'Run the [Structured Data Testing Tool](https://search.google.com/structured-data/testing-tool/) and the [Structured Data Linter](http://linter.structured-data.org/) to validate structured data. [Learn more](https://web.dev/structured-data).',
+    
+    title:'Structured data is valid'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    class StructuredData extends ManualAudit{
+    
+    
+    
+    static get meta(){
+    return Object.assign({
+    id:'structured-data',
+    description:str_(UIStrings.description),
+    title:str_(UIStrings.title)},
+    super.partialMeta);
+    }}
+    
+    
+    module.exports=StructuredData;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/seo/manual/structured-data.js");
+    },{"../../../lib/i18n/i18n.js":66,"../../manual/manual-audit.js":5}],"../audits/seo/meta-description":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('../audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Document has a meta description',
+    
+    failureTitle:'Document does not have a meta description',
+    
+    description:'Meta descriptions may be included in search results to concisely summarize '+
+    'page content. '+
+    '[Learn more](https://web.dev/meta-description).',
+    
+    explanation:'Description text is empty.'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class Description extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'meta-description',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['MetaElements']};
+    
+    }
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    const metaDescription=artifacts.MetaElements.find(meta=>meta.name==='description');
+    if(!metaDescription){
+    return{
+    score:0};
+    
+    }
+    
+    const description=metaDescription.content||'';
+    if(description.trim().length===0){
+    return{
+    score:0,
+    explanation:str_(UIStrings.explanation)};
+    
+    }
+    
+    return{
+    score:1};
+    
+    }}
+    
+    
+    module.exports=Description;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/seo/meta-description.js");
+    },{"../../lib/i18n/i18n.js":66,"../audit.js":3}],"../audits/seo/plugins":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('../audit.js');
+    const URL=require('../../lib/url-shim.js');
+    
+    const JAVA_APPLET_TYPE='application/x-java-applet';
+    const JAVA_BEAN_TYPE='application/x-java-bean';
+    const TYPE_BLOCKLIST=new Set([
+    'application/x-shockwave-flash',
+    
+    JAVA_APPLET_TYPE,
+    JAVA_BEAN_TYPE,
+    
+    'application/x-silverlight',
+    'application/x-silverlight-2']);
+    
+    const FILE_EXTENSION_BLOCKLIST=new Set([
+    'swf',
+    'flv',
+    'class',
+    'xap']);
+    
+    const SOURCE_PARAMS=new Set([
+    'code',
+    'movie',
+    'source',
+    'src']);
+    
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Document avoids plugins',
+    
+    failureTitle:'Document uses plugins',
+    
+    description:'Search engines can\'t index plugin content, and '+
+    'many devices restrict plugins or don\'t support them. '+
+    '[Learn more](https://web.dev/plugins).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    
+    function isPluginType(type){
+    type=type.trim().toLowerCase();
+    
+    return TYPE_BLOCKLIST.has(type)||
+    type.startsWith(JAVA_APPLET_TYPE)||
+    type.startsWith(JAVA_BEAN_TYPE);
+    }
+    
+    
+    
+    
+    
+    
+    function isPluginURL(url){
+    try{
+    
+    const filePath=new URL(url,'http://example.com').pathname;
+    const parts=filePath.split('.');
+    
+    if(parts.length<2){
+    return false;
+    }
+    const part=parts.pop();
+    return FILE_EXTENSION_BLOCKLIST.has(part.trim().toLowerCase());
+    }catch(e){
+    return false;
+    }
+    }
+    
+    class Plugins extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'plugins',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['EmbeddedContent']};
+    
+    }
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    const plugins=artifacts.EmbeddedContent.
+    filter(item=>{
+    if(item.tagName==='APPLET'){
+    return true;
+    }
+    
+    if(
+    (item.tagName==='EMBED'||item.tagName==='OBJECT')&&
+    item.type&&
+    isPluginType(item.type))
+    {
+    return true;
+    }
+    
+    const embedSrc=item.src||item.code;
+    if(item.tagName==='EMBED'&&embedSrc&&isPluginURL(embedSrc)){
+    return true;
+    }
+    
+    if(item.tagName==='OBJECT'&&item.data&&isPluginURL(item.data)){
+    return true;
+    }
+    
+    const failingParams=item.params.filter(param=>
+    SOURCE_PARAMS.has(param.name.trim().toLowerCase())&&isPluginURL(param.value));
+    
+    
+    return failingParams.length>0;
+    }).
+    map(plugin=>{
+    const tagName=plugin.tagName.toLowerCase();
+    
+    const attributeKeys=['src','data','code','type'];
+    const attributes=attributeKeys.
+    reduce((result,attr)=>{
+    if(plugin[attr]!==null){
+    result+=` ${attr}="${plugin[attr]}"`;
+    }
+    return result;
+    },'');
+    const params=plugin.params.
+    filter(param=>SOURCE_PARAMS.has(param.name.trim().toLowerCase())).
+    map(param=>`<param ${param.name}="${param.value}" />`).
+    join('');
+    
+    return{
+    source:{
+    type:'node',
+    snippet:`<${tagName}${attributes}>${params}</${tagName}>`}};
+    
+    
+    });
+    
+    
+    const headings=[
+    {key:'source',itemType:'code',text:'Element source'}];
+    
+    
+    const details=Audit.makeTableDetails(headings,plugins);
+    
+    return{
+    score:Number(plugins.length===0),
+    details};
+    
+    }}
+    
+    
+    module.exports=Plugins;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/seo/plugins.js");
+    },{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/seo/robots-txt":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    
+    const Audit=require('../audit.js');
+    const URL=require('../../lib/url-shim.js');
+    
+    const HTTP_CLIENT_ERROR_CODE_LOW=400;
+    const HTTP_SERVER_ERROR_CODE_LOW=500;
+    
+    const DIRECTIVE_SITEMAP='sitemap';
+    const DIRECTIVE_USER_AGENT='user-agent';
+    const DIRECTIVE_ALLOW='allow';
+    const DIRECTIVE_DISALLOW='disallow';
+    const DIRECTIVES_GROUP_MEMBERS=new Set([DIRECTIVE_ALLOW,DIRECTIVE_DISALLOW]);
+    const DIRECTIVE_SAFELIST=new Set([
+    DIRECTIVE_USER_AGENT,DIRECTIVE_DISALLOW,
+    DIRECTIVE_ALLOW,DIRECTIVE_SITEMAP,
+    'crawl-delay',
+    'clean-param','host',
+    'request-rate','visit-time','noindex']);
+    
+    const SITEMAP_VALID_PROTOCOLS=new Set(['https:','http:','ftp:']);
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'robots.txt is valid',
+    
+    failureTitle:'robots.txt is not valid',
+    
+    description:'If your robots.txt file is malformed, crawlers may not be able to understand '+
+    'how you want your website to be crawled or indexed. [Learn more](https://web.dev/robots-txt).',
+    
+    
+    
+    
+    displayValueHttpBadCode:'Request for robots.txt returned HTTP status: {statusCode}',
+    
+    displayValueValidationError:`{itemCount, plural,
+        =1 {1 error found}
+        other {# errors found}
+        }`,
+    
+    explanation:'Lighthouse was unable to download a robots.txt file'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    
+    function verifyDirective(directiveName,directiveValue){
+    if(!DIRECTIVE_SAFELIST.has(directiveName)){
+    throw new Error('Unknown directive');
+    }
+    
+    if(directiveName===DIRECTIVE_SITEMAP){
+    let sitemapUrl;
+    
+    try{
+    sitemapUrl=new URL(directiveValue);
+    }catch(e){
+    throw new Error('Invalid sitemap URL');
+    }
+    
+    if(!SITEMAP_VALID_PROTOCOLS.has(sitemapUrl.protocol)){
+    throw new Error('Invalid sitemap URL protocol');
+    }
+    }
+    
+    if(directiveName===DIRECTIVE_USER_AGENT&&!directiveValue){
+    throw new Error('No user-agent specified');
+    }
+    
+    if(directiveName===DIRECTIVE_ALLOW||directiveName===DIRECTIVE_DISALLOW){
+    if(directiveValue!==''&&directiveValue[0]!=='/'&&directiveValue[0]!=='*'){
+    throw new Error('Pattern should either be empty, start with "/" or "*"');
+    }
+    
+    const dollarIndex=directiveValue.indexOf('$');
+    
+    if(dollarIndex!==-1&&dollarIndex!==directiveValue.length-1){
+    throw new Error('"$" should only be used at the end of the pattern');
+    }
+    }
+    }
+    
+    
+    
+    
+    
+    
+    function parseLine(line){
+    const hashIndex=line.indexOf('#');
+    
+    if(hashIndex!==-1){
+    line=line.substr(0,hashIndex);
+    }
+    
+    line=line.trim();
+    
+    if(line.length===0){
+    return null;
+    }
+    
+    const colonIndex=line.indexOf(':');
+    
+    if(colonIndex===-1){
+    throw new Error('Syntax not understood');
+    }
+    
+    const directiveName=line.slice(0,colonIndex).trim().toLowerCase();
+    const directiveValue=line.slice(colonIndex+1).trim();
+    
+    verifyDirective(directiveName,directiveValue);
+    
+    return{
+    directive:directiveName,
+    value:directiveValue};
+    
+    }
+    
+    
+    
+    
+    
+    function validateRobots(content){
+    
+    
+    
+    const errors=[];
+    let inGroup=false;
+    
+    content.
+    split(/\r\n|\r|\n/).
+    forEach((line,index)=>{
+    let parsedLine;
+    
+    try{
+    parsedLine=parseLine(line);
+    }catch(e){
+    errors.push({
+    index:(index+1).toString(),
+    line:line,
+    message:e.message.toString()});
+    
+    }
+    
+    if(!parsedLine){
+    return;
+    }
+    
+    
+    
+    if(parsedLine.directive===DIRECTIVE_USER_AGENT){
+    inGroup=true;
+    }else if(!inGroup&&DIRECTIVES_GROUP_MEMBERS.has(parsedLine.directive)){
+    errors.push({
+    index:(index+1).toString(),
+    line:line,
+    message:'No user-agent specified'});
+    
+    }
+    });
+    
+    return errors;
+    }
+    
+    class RobotsTxt extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'robots-txt',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['RobotsTxt']};
+    
+    }
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    const{
+    status,
+    content}=
+    artifacts.RobotsTxt;
+    
+    if(!status){
+    return{
+    score:0,
+    explanation:str_(UIStrings.explanation)};
+    
+    }
+    
+    if(status>=HTTP_SERVER_ERROR_CODE_LOW){
+    return{
+    score:0,
+    displayValue:str_(UIStrings.displayValueHttpBadCode,{statusCode:status})};
+    
+    }else if(status>=HTTP_CLIENT_ERROR_CODE_LOW||content===''){
+    return{
+    score:1,
+    notApplicable:true};
+    
+    }
+    
+    
+    if(content===null){
+    throw new Error(`Status ${status} was valid, but content was null`);
+    }
+    
+    const validationErrors=validateRobots(content);
+    
+    
+    const headings=[
+    {key:'index',itemType:'text',text:'Line #'},
+    {key:'line',itemType:'code',text:'Content'},
+    {key:'message',itemType:'code',text:'Error'}];
+    
+    
+    const details=Audit.makeTableDetails(headings,validationErrors,{});
+    let displayValue;
+    
+    if(validationErrors.length){
+    displayValue=
+    str_(UIStrings.displayValueValidationError,{itemCount:validationErrors.length});
+    }
+    
+    return{
+    score:Number(validationErrors.length===0),
+    details,
+    displayValue};
+    
+    }}
+    
+    
+    module.exports=RobotsTxt;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/seo/robots-txt.js");
+    },{"../../lib/i18n/i18n.js":66,"../../lib/url-shim.js":"url","../audit.js":3}],"../audits/seo/tap-targets":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    const Audit=require('../audit.js');
+    const ComputedViewportMeta=require('../../computed/viewport-meta.js');
+    const{
+    rectsTouchOrOverlap,
+    getRectOverlapArea,
+    getRectAtCenter,
+    allRectsContainedWithinEachOther,
+    getLargestRect,
+    getBoundingRectWithPadding}=
+    require('../../lib/rect-helpers.js');
+    const{getTappableRectsFromClientRects}=require('../../lib/tappable-rects.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Tap targets are sized appropriately',
+    
+    failureTitle:'Tap targets are not sized appropriately',
+    
+    description:'Interactive elements like buttons and links should be large enough (48x48px), and have enough space around them, to be easy enough to tap without overlapping onto other elements. [Learn more](https://web.dev/tap-targets).',
+    
+    tapTargetHeader:'Tap Target',
+    
+    overlappingTargetHeader:'Overlapping Target',
+    
+    
+    explanationViewportMetaNotOptimized:'Tap targets are too small because there\'s no viewport meta tag optimized for mobile screens',
+    
+    displayValue:'{decimalProportion, number, percent} appropriately sized tap targets'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    const FINGER_SIZE_PX=48;
+    
+    
+    const MAX_ACCEPTABLE_OVERLAP_SCORE_RATIO=0.25;
+    
+    
+    
+    
+    
+    
+    
+    function getBoundedTapTargets(targets){
+    return targets.map(tapTarget=>{
+    return{
+    tapTarget,
+    paddedBoundsRect:getBoundingRectWithPadding(tapTarget.clientRects,FINGER_SIZE_PX)};
+    
+    });
+    }
+    
+    
+    
+    
+    function clientRectBelowMinimumSize(cr){
+    return cr.width<FINGER_SIZE_PX||cr.height<FINGER_SIZE_PX;
+    }
+    
+    
+    
+    
+    
+    
+    function getTooSmallTargets(targets){
+    return targets.filter(target=>{
+    return target.tapTarget.clientRects.every(clientRectBelowMinimumSize);
+    });
+    }
+    
+    
+    
+    
+    
+    
+    function getAllOverlapFailures(tooSmallTargets,allTargets){
+    
+    const failures=[];
+    
+    tooSmallTargets.forEach(target=>{
+    
+    const tappableRects=getTappableRectsFromClientRects(target.tapTarget.clientRects);
+    
+    for(const maybeOverlappingTarget of allTargets){
+    if(maybeOverlappingTarget===target){
+    
+    continue;
+    }
+    
+    if(!rectsTouchOrOverlap(target.paddedBoundsRect,maybeOverlappingTarget.paddedBoundsRect)){
+    
+    continue;
+    }
+    
+    if(target.tapTarget.href===maybeOverlappingTarget.tapTarget.href){
+    const isHttpOrHttpsLink=/https?:\/\//.test(target.tapTarget.href);
+    if(isHttpOrHttpsLink){
+    
+    continue;
+    }
+    }
+    
+    const maybeOverlappingRects=maybeOverlappingTarget.tapTarget.clientRects;
+    if(allRectsContainedWithinEachOther(tappableRects,maybeOverlappingRects)){
+    
+    
+    
+    
+    continue;
+    }
+    
+    const rectFailure=getOverlapFailureForTargetPair(tappableRects,maybeOverlappingRects);
+    if(rectFailure){
+    failures.push({
+    ...rectFailure,
+    tapTarget:target.tapTarget,
+    overlappingTarget:maybeOverlappingTarget.tapTarget});
+    
+    }
+    }
+    });
+    
+    return failures;
+    }
+    
+    
+    
+    
+    
+    
+    function getOverlapFailureForTargetPair(tappableRects,maybeOverlappingRects){
+    
+    let greatestFailure=null;
+    
+    for(const targetCR of tappableRects){
+    const fingerRect=getRectAtCenter(targetCR,FINGER_SIZE_PX);
+    
+    
+    const tapTargetScore=getRectOverlapArea(fingerRect,targetCR);
+    
+    for(const maybeOverlappingCR of maybeOverlappingRects){
+    const overlappingTargetScore=getRectOverlapArea(fingerRect,maybeOverlappingCR);
+    
+    const overlapScoreRatio=overlappingTargetScore/tapTargetScore;
+    if(overlapScoreRatio<MAX_ACCEPTABLE_OVERLAP_SCORE_RATIO){
+    
+    
+    continue;
+    }
+    
+    
+    if(!greatestFailure||overlapScoreRatio>greatestFailure.overlapScoreRatio){
+    greatestFailure={
+    overlapScoreRatio,
+    tapTargetScore,
+    overlappingTargetScore};
+    
+    }
+    }
+    }
+    return greatestFailure;
+    }
+    
+    
+    
+    
+    
+    
+    function mergeSymmetricFailures(overlapFailures){
+    
+    const failuresAfterMerging=[];
+    
+    overlapFailures.forEach((failure,overlapFailureIndex)=>{
+    const symmetricFailure=overlapFailures.find(f=>
+    f.tapTarget===failure.overlappingTarget&&
+    f.overlappingTarget===failure.tapTarget);
+    
+    
+    if(!symmetricFailure){
+    failuresAfterMerging.push(failure);
+    return;
+    }
+    
+    const{overlapScoreRatio:failureOSR}=failure;
+    const{overlapScoreRatio:symmetricOSR}=symmetricFailure;
+    
+    
+    
+    
+    if(failureOSR>symmetricOSR||
+    failureOSR===symmetricOSR&&
+    overlapFailureIndex<overlapFailures.indexOf(symmetricFailure))
+    {
+    failuresAfterMerging.push(failure);
+    }
+    });
+    
+    return failuresAfterMerging;
+    }
+    
+    
+    
+    
+    
+    function getTableItems(overlapFailures){
+    const tableItems=overlapFailures.map(failure=>{
+    const largestCR=getLargestRect(failure.tapTarget.clientRects);
+    const width=Math.floor(largestCR.width);
+    const height=Math.floor(largestCR.height);
+    const size=width+'x'+height;
+    return{
+    tapTarget:targetToTableNode(failure.tapTarget),
+    overlappingTarget:targetToTableNode(failure.overlappingTarget),
+    tapTargetScore:failure.tapTargetScore,
+    overlappingTargetScore:failure.overlappingTargetScore,
+    overlapScoreRatio:failure.overlapScoreRatio,
+    size,
+    width,
+    height};
+    
+    });
+    
+    tableItems.sort((a,b)=>{
+    return b.overlapScoreRatio-a.overlapScoreRatio;
+    });
+    
+    return tableItems;
+    }
+    
+    
+    
+    
+    
+    function targetToTableNode(target){
+    return{
+    type:'node',
+    snippet:target.snippet,
+    path:target.path,
+    selector:target.selector,
+    nodeLabel:target.nodeLabel};
+    
+    }
+    
+    class TapTargets extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'tap-targets',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['MetaElements','TapTargets','TestedAsMobileDevice']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    if(!artifacts.TestedAsMobileDevice){
+    
+    
+    return{
+    score:1,
+    notApplicable:true};
+    
+    }
+    
+    const viewportMeta=await ComputedViewportMeta.request(artifacts.MetaElements,context);
+    if(!viewportMeta.isMobileOptimized){
+    return{
+    score:0,
+    explanation:str_(UIStrings.explanationViewportMetaNotOptimized)};
+    
+    }
+    
+    
+    const boundedTapTargets=getBoundedTapTargets(artifacts.TapTargets);
+    
+    const tooSmallTargets=getTooSmallTargets(boundedTapTargets);
+    const overlapFailures=getAllOverlapFailures(tooSmallTargets,boundedTapTargets);
+    const overlapFailuresForDisplay=mergeSymmetricFailures(overlapFailures);
+    const tableItems=getTableItems(overlapFailuresForDisplay);
+    
+    
+    const headings=[
+    {key:'tapTarget',itemType:'node',text:str_(UIStrings.tapTargetHeader)},
+    {key:'size',itemType:'text',text:str_(i18n.UIStrings.columnSize)},
+    {key:'overlappingTarget',itemType:'node',text:str_(UIStrings.overlappingTargetHeader)}];
+    
+    
+    const details=Audit.makeTableDetails(headings,tableItems);
+    
+    const tapTargetCount=artifacts.TapTargets.length;
+    const failingTapTargetCount=new Set(overlapFailures.map(f=>f.tapTarget)).size;
+    const passingTapTargetCount=tapTargetCount-failingTapTargetCount;
+    
+    let score=1;
+    let passingTapTargetRatio=1;
+    if(failingTapTargetCount>0){
+    passingTapTargetRatio=passingTapTargetCount/tapTargetCount;
+    
+    
+    score=passingTapTargetRatio*0.89;
+    }
+    const displayValue=str_(UIStrings.displayValue,{decimalProportion:passingTapTargetRatio});
+    
+    return{
+    score,
+    details,
+    displayValue};
+    
+    }}
+    
+    
+    TapTargets.FINGER_SIZE_PX=FINGER_SIZE_PX;
+    
+    module.exports=TapTargets;
+    module.exports.UIStrings=UIStrings;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    }).call(this,"/lighthouse-core/audits/seo/tap-targets.js");
+    },{"../../computed/viewport-meta.js":41,"../../lib/i18n/i18n.js":66,"../../lib/rect-helpers.js":77,"../../lib/tappable-rects.js":82,"../audit.js":3}],"../audits/service-worker":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const URL=require('../lib/url-shim.js');
+    const Audit=require('./audit.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Registers a service worker that controls page and `start_url`',
+    
+    failureTitle:'Does not register a service worker that controls page and `start_url`',
+    
+    description:'The service worker is the technology that enables your app to use many '+
+    'Progressive Web App features, such as offline, add to homescreen, and push '+
+    'notifications. [Learn more](https://web.dev/service-worker).',
+    
+    
+    
+    
+    explanationOutOfScope:'This origin has one or more service workers, however the page '+
+    '({pageUrl}) is not in scope.',
+    
+    explanationNoManifest:'This page is controlled by a service worker, however '+
+    'no `start_url` was found because no manifest was fetched.',
+    
+    explanationBadManifest:'This page is controlled by a service worker, however '+
+    'no `start_url` was found because manifest failed to parse as valid JSON',
+    
+    
+    
+    
+    
+    explanationBadStartUrl:'This page is controlled by a service worker, however '+
+    'the `start_url` ({startUrl}) is not in the service worker\'s scope ({scopeUrl})'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class ServiceWorker extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'service-worker',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['URL','ServiceWorker','WebAppManifest']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    static getVersionsForOrigin(versions,pageUrl){
+    return versions.
+    filter(v=>v.status==='activated').
+    filter(v=>new URL(v.scriptURL).origin===pageUrl.origin);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static getControllingScopeUrl(matchingSWVersions,registrations,pageUrl){
+    
+    const matchingScopeUrls=matchingSWVersions.
+    map(v=>registrations.find(r=>r.registrationId===v.registrationId)).
+    filter(r=>!!r).
+    map(r=>new URL(r.scopeURL).href);
+    
+    
+    
+    const pageControllingScope=matchingScopeUrls.
+    filter(scopeUrl=>pageUrl.href.startsWith(scopeUrl)).
+    sort((scopeA,scopeB)=>scopeA.length-scopeB.length).
+    pop();
+    
+    return pageControllingScope;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    static checkStartUrl(manifest,scopeUrl){
+    if(!manifest){
+    return str_(UIStrings.explanationNoManifest);
+    }
+    if(!manifest.value){
+    return str_(UIStrings.explanationBadManifest);
+    }
+    
+    const startUrl=manifest.value.start_url.value;
+    if(!startUrl.startsWith(scopeUrl)){
+    return str_(UIStrings.explanationBadStartUrl,{startUrl,scopeUrl});
+    }
+    }
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    
+    const pageUrl=new URL(artifacts.URL.finalUrl);
+    const{versions,registrations}=artifacts.ServiceWorker;
+    
+    const versionsForOrigin=ServiceWorker.getVersionsForOrigin(versions,pageUrl);
+    if(versionsForOrigin.length===0){
+    return{
+    score:0};
+    
+    }
+    
+    const controllingScopeUrl=ServiceWorker.getControllingScopeUrl(versionsForOrigin,
+    registrations,pageUrl);
+    if(!controllingScopeUrl){
+    return{
+    score:0,
+    explanation:str_(UIStrings.explanationOutOfScope,{pageUrl:pageUrl.href})};
+    
+    }
+    
+    const startUrlFailure=ServiceWorker.checkStartUrl(artifacts.WebAppManifest,
+    controllingScopeUrl);
+    if(startUrlFailure){
+    return{
+    score:0,
+    explanation:startUrlFailure};
+    
+    }
+    
+    
+    return{
+    score:1};
+    
+    }}
+    
+    
+    module.exports=ServiceWorker;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/service-worker.js");
+    },{"../lib/i18n/i18n.js":66,"../lib/url-shim.js":"url","./audit.js":3}],"../audits/splash-screen":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const MultiCheckAudit=require('./multi-check-audit.js');
+    const ManifestValues=require('../computed/manifest-values.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Configured for a custom splash screen',
+    
+    failureTitle:'Is not configured for a custom splash screen',
+    
+    description:'A themed splash screen ensures a high-quality experience when '+
+    'users launch your app from their homescreens. [Learn '+
+    'more](https://web.dev/splash-screen).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    class SplashScreen extends MultiCheckAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'splash-screen',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['WebAppManifest']};
+    
+    }
+    
+    
+    
+    
+    
+    static assessManifest(manifestValues,failures){
+    if(manifestValues.isParseFailure&&manifestValues.parseFailureReason){
+    failures.push(manifestValues.parseFailureReason);
+    return;
+    }
+    
+    const splashScreenCheckIds=[
+    'hasName',
+    'hasBackgroundColor',
+    'hasThemeColor',
+    'hasIconsAtLeast512px'];
+    
+    
+    manifestValues.allChecks.
+    filter(item=>splashScreenCheckIds.includes(item.id)).
+    forEach(item=>{
+    if(!item.passing){
+    failures.push(item.failureText);
+    }
+    });
+    }
+    
+    
+    
+    
+    
+    
+    static async audit_(artifacts,context){
+    
+    const failures=[];
+    
+    const manifestValues=await ManifestValues.request(artifacts.WebAppManifest,context);
+    SplashScreen.assessManifest(manifestValues,failures);
+    
+    return{
+    failures,
+    manifestValues};
+    
+    }}
+    
+    
+    module.exports=SplashScreen;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/splash-screen.js");
+    },{"../computed/manifest-values.js":13,"../lib/i18n/i18n.js":66,"./multi-check-audit.js":6}],"../audits/themed-omnibox":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const MultiCheckAudit=require('./multi-check-audit.js');
+    const ManifestValues=require('../computed/manifest-values.js');
+    const cssParsers=require('cssstyle/lib/parsers');
+    const i18n=require('../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Sets a theme color for the address bar.',
+    
+    failureTitle:'Does not set a theme color for the address bar.',
+    
+    description:'The browser address bar can be themed to match your site. '+
+    '[Learn more](https://web.dev/themed-omnibox).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    class ThemedOmnibox extends MultiCheckAudit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'themed-omnibox',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['WebAppManifest','MetaElements']};
+    
+    }
+    
+    
+    
+    
+    
+    static isValidColor(color){
+    return cssParsers.valueType(color)===cssParsers.TYPES.COLOR;
+    }
+    
+    
+    
+    
+    
+    static assessMetaThemecolor(themeColorMeta,failures){
+    if(!themeColorMeta){
+    
+    failures.push('No `<meta name="theme-color">` tag found');
+    }else if(!ThemedOmnibox.isValidColor(themeColorMeta.content||'')){
+    failures.push('The theme-color meta tag did not contain a valid CSS color');
+    }
+    }
+    
+    
+    
+    
+    
+    static assessManifest(manifestValues,failures){
+    if(manifestValues.isParseFailure&&manifestValues.parseFailureReason){
+    failures.push(manifestValues.parseFailureReason);
+    return;
+    }
+    
+    const themeColorCheck=manifestValues.allChecks.find(i=>i.id==='hasThemeColor');
+    if(themeColorCheck&&!themeColorCheck.passing){
+    failures.push(themeColorCheck.failureText);
+    }
+    }
+    
+    
+    
+    
+    
+    
+    static async audit_(artifacts,context){
+    
+    const failures=[];
+    
+    const themeColorMeta=artifacts.MetaElements.find(meta=>meta.name==='theme-color');
+    const manifestValues=await ManifestValues.request(artifacts.WebAppManifest,context);
+    ThemedOmnibox.assessManifest(manifestValues,failures);
+    ThemedOmnibox.assessMetaThemecolor(themeColorMeta,failures);
+    
+    return{
+    failures,
+    manifestValues,
+    themeColor:themeColorMeta&&themeColorMeta.content||null};
+    
+    }}
+    
+    
+    module.exports=ThemedOmnibox;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/themed-omnibox.js");
+    },{"../computed/manifest-values.js":13,"../lib/i18n/i18n.js":66,"./multi-check-audit.js":6,"cssstyle/lib/parsers":105}],"../audits/third-party-summary":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const thirdPartyWeb=require('third-party-web/httparchive-nostats-subset');
+    
+    const Audit=require('./audit.js');
+    const BootupTime=require('./bootup-time.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    const NetworkRecords=require('../computed/network-records.js');
+    const MainThreadTasks=require('../computed/main-thread-tasks.js');
+    
+    const UIStrings={
+    
+    title:'Minimize third-party usage',
+    
+    failureTitle:'Reduce the impact of third-party code',
+    
+    description:'Third-party code can significantly impact load performance. '+
+    'Limit the number of redundant third-party providers and try to load third-party code after '+
+    'your page has primarily finished loading. [Learn more](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/loading-third-party-javascript/).',
+    
+    columnThirdParty:'Third-Party',
+    
+    columnBlockingTime:'Main-Thread Blocking Time',
+    
+    displayValue:'Third-party code blocked the main thread for '+
+    `{timeInMs, number, milliseconds}\xa0ms`};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    const PASS_THRESHOLD_IN_MS=250;
+    
+    
+    
+    class ThirdPartySummary extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'third-party-summary',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['traces','devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    static getEntitySafe(url){
+    try{
+    return thirdPartyWeb.getEntity(url);
+    }catch(_){
+    return undefined;
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static getSummaryByEntity(networkRecords,mainThreadTasks,cpuMultiplier){
+    
+    const entities=new Map();
+    const defaultEntityStat={mainThreadTime:0,blockingTime:0,transferSize:0};
+    
+    for(const request of networkRecords){
+    const entity=ThirdPartySummary.getEntitySafe(request.url);
+    if(!entity)continue;
+    
+    const entityStats=entities.get(entity)||{...defaultEntityStat};
+    entityStats.transferSize+=request.transferSize;
+    entities.set(entity,entityStats);
+    }
+    
+    const jsURLs=BootupTime.getJavaScriptURLs(networkRecords);
+    
+    for(const task of mainThreadTasks){
+    const attributeableURL=BootupTime.getAttributableURLForTask(task,jsURLs);
+    const entity=ThirdPartySummary.getEntitySafe(attributeableURL);
+    if(!entity)continue;
+    
+    const entityStats=entities.get(entity)||{...defaultEntityStat};
+    const taskDuration=task.selfTime*cpuMultiplier;
+    
+    entityStats.mainThreadTime+=taskDuration;
+    
+    
+    
+    entityStats.blockingTime+=Math.max(taskDuration-50,0);
+    entities.set(entity,entityStats);
+    }
+    
+    return entities;
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const settings=context.settings||{};
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const networkRecords=await NetworkRecords.request(devtoolsLog,context);
+    const tasks=await MainThreadTasks.request(trace,context);
+    const multiplier=settings.throttlingMethod==='simulate'?
+    settings.throttling.cpuSlowdownMultiplier:1;
+    
+    const summaryByEntity=ThirdPartySummary.getSummaryByEntity(networkRecords,tasks,multiplier);
+    
+    const summary={wastedBytes:0,wastedMs:0};
+    
+    const results=Array.from(summaryByEntity.entries()).
+    map(([entity,stats])=>{
+    summary.wastedBytes+=stats.transferSize;
+    summary.wastedMs+=stats.blockingTime;
+    
+    return{
+    entity:{
+    type:'link',
+    text:entity.name,
+    url:entity.homepage||''},
+    
+    transferSize:stats.transferSize,
+    mainThreadTime:stats.mainThreadTime,
+    blockingTime:stats.blockingTime};
+    
+    }).
+    
+    sort((a,b)=>b.blockingTime-a.blockingTime||b.transferSize-a.transferSize);
+    
+    
+    const headings=[
+    {key:'entity',itemType:'link',text:str_(UIStrings.columnThirdParty)},
+    {key:'transferSize',granularity:1,itemType:'bytes',
+    text:str_(i18n.UIStrings.columnSize)},
+    {key:'blockingTime',granularity:1,itemType:'ms',
+    text:str_(UIStrings.columnBlockingTime)}];
+    
+    
+    if(!results.length){
+    return{
+    score:1,
+    notApplicable:true};
+    
+    }
+    
+    return{
+    score:Number(summary.wastedMs<=PASS_THRESHOLD_IN_MS),
+    displayValue:str_(UIStrings.displayValue,{
+    timeInMs:summary.wastedMs}),
+    
+    details:Audit.makeTableDetails(headings,results,summary)};
+    
+    }}
+    
+    
+    module.exports=ThirdPartySummary;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/third-party-summary.js");
+    },{"../computed/main-thread-tasks.js":12,"../computed/network-records.js":34,"../lib/i18n/i18n.js":66,"./audit.js":3,"./bootup-time.js":"../audits/bootup-time","third-party-web/httparchive-nostats-subset":185}],"../audits/time-to-first-byte":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    const MainResource=require('../computed/main-resource.js');
+    
+    const UIStrings={
+    
+    title:'Server response times are low (TTFB)',
+    
+    failureTitle:'Reduce server response times (TTFB)',
+    
+    description:'Time To First Byte identifies the time at which your server sends a response.'+
+    ' [Learn more](https://web.dev/time-to-first-byte).',
+    
+    displayValue:`Root document took {timeInMs, number, milliseconds}\xa0ms`};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    const TTFB_THRESHOLD=600;
+    
+    class TTFBMetric extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'time-to-first-byte',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['devtoolsLogs','URL']};
+    
+    }
+    
+    
+    
+    
+    static caclulateTTFB(record){
+    const timing=record.timing;
+    return timing?timing.receiveHeadersEnd-timing.sendEnd:0;
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const mainResource=await MainResource.request({devtoolsLog,URL:artifacts.URL},context);
+    
+    const ttfb=TTFBMetric.caclulateTTFB(mainResource);
+    const passed=ttfb<TTFB_THRESHOLD;
+    const displayValue=str_(UIStrings.displayValue,{timeInMs:ttfb});
+    
+    
+    const details={
+    type:'opportunity',
+    overallSavingsMs:ttfb-TTFB_THRESHOLD,
+    headings:[],
+    items:[]};
+    
+    
+    return{
+    numericValue:ttfb,
+    score:Number(passed),
+    displayValue,
+    details,
+    extendedInfo:{
+    value:{
+    wastedMs:ttfb-TTFB_THRESHOLD}}};
+    
+    
+    
+    }}
+    
+    
+    module.exports=TTFBMetric;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/time-to-first-byte.js");
+    },{"../computed/main-resource.js":11,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/user-timings":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    const ComputedUserTimings=require('../computed/user-timings.js');
+    
+    const UIStrings={
+    
+    title:'User Timing marks and measures',
+    
+    description:'Consider instrumenting your app with the User Timing API to measure your '+
+    'app\'s real-world performance during key user experiences. '+
+    '[Learn more](https://web.dev/user-timings).',
+    
+    displayValue:`{itemCount, plural,
+        =1 {1 user timing}
+        other {# user timings}
+        }`,
+    
+    columnType:'Type',
+    
+    columnStartTime:'Start Time',
+    
+    columnDuration:'Duration'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    class UserTimings extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'user-timings',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:Audit.SCORING_MODES.INFORMATIVE,
+    requiredArtifacts:['traces']};
+    
+    }
+    
+    
+    
+    
+    static get blacklistedPrefixes(){
+    return['goog_'];
+    }
+    
+    
+    
+    
+    
+    
+    static excludeBlacklisted(evt){
+    return UserTimings.blacklistedPrefixes.every(prefix=>!evt.name.startsWith(prefix));
+    }
+    
+    
+    
+    
+    
+    
+    static audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    return ComputedUserTimings.request(trace,context).then(computedUserTimings=>{
+    const userTimings=computedUserTimings.filter(UserTimings.excludeBlacklisted);
+    const tableRows=userTimings.map(item=>{
+    return{
+    name:item.name,
+    startTime:item.startTime,
+    duration:item.isMark?undefined:item.duration,
+    timingType:item.isMark?'Mark':'Measure'};
+    
+    }).sort((itemA,itemB)=>{
+    if(itemA.timingType===itemB.timingType){
+    
+    return itemA.startTime-itemB.startTime;
+    }else if(itemA.timingType==='Measure'){
+    
+    return-1;
+    }else{
+    return 1;
+    }
+    });
+    
+    
+    const headings=[
+    {key:'name',itemType:'text',text:str_(i18n.UIStrings.columnName)},
+    {key:'timingType',itemType:'text',text:str_(UIStrings.columnType)},
+    {key:'startTime',itemType:'ms',granularity:0.01,
+    text:str_(UIStrings.columnStartTime)},
+    {key:'duration',itemType:'ms',granularity:0.01,text:str_(UIStrings.columnDuration)}];
+    
+    
+    const details=Audit.makeTableDetails(headings,tableRows);
+    
+    
+    let displayValue;
+    if(userTimings.length){
+    displayValue=str_(UIStrings.displayValue,{itemCount:userTimings.length});
+    }
+    
+    return{
+    
+    score:Number(userTimings.length===0),
+    notApplicable:userTimings.length===0,
+    displayValue,
+    extendedInfo:{
+    value:userTimings},
+    
+    details};
+    
+    });
+    }}
+    
+    
+    module.exports=UserTimings;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/user-timings.js");
+    },{"../computed/user-timings.js":40,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/uses-rel-preconnect":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const UnusedBytes=require('./byte-efficiency/byte-efficiency-audit.js');
+    const URL=require('../lib/url-shim.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    const NetworkRecords=require('../computed/network-records.js');
+    const MainResource=require('../computed/main-resource.js');
+    const LoadSimulator=require('../computed/load-simulator.js');
+    
+    
+    
+    
+    
+    const PRECONNECT_SOCKET_MAX_IDLE=15;
+    
+    const IGNORE_THRESHOLD_IN_MS=50;
+    
+    const UIStrings={
+    
+    title:'Preconnect to required origins',
+    
+    description:
+    'Consider adding `preconnect` or `dns-prefetch` resource hints to establish early '+
+    `connections to important third-party origins. [Learn more](https://web.dev/uses-rel-preconnect).`,
+    
+    
+    
+    
+    crossoriginWarning:'A preconnect <link> was found for "{securityOrigin}" but was not used '+
+    'by the browser. Check that you are using the `crossorigin` attribute properly.'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class UsesRelPreconnectAudit extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'uses-rel-preconnect',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['devtoolsLogs','URL','LinkElements'],
+    scoreDisplayMode:Audit.SCORING_MODES.NUMERIC};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static hasValidTiming(record){
+    return!!record.timing&&record.timing.connectEnd>0&&record.timing.connectStart>0;
+    }
+    
+    
+    
+    
+    
+    
+    static hasAlreadyConnectedToOrigin(record){
+    return(
+    !!record.timing&&
+    record.timing.dnsEnd-record.timing.dnsStart===0&&
+    record.timing.connectEnd-record.timing.connectStart===0);
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    static socketStartTimeIsBelowThreshold(record,mainResource){
+    return Math.max(0,record.startTime-mainResource.endTime)<PRECONNECT_SOCKET_MAX_IDLE;
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const devtoolsLog=artifacts.devtoolsLogs[UsesRelPreconnectAudit.DEFAULT_PASS];
+    const settings=context.settings;
+    let maxWasted=0;
+    
+    const warnings=[];
+    
+    const[networkRecords,mainResource,loadSimulator]=await Promise.all([
+    NetworkRecords.request(devtoolsLog,context),
+    MainResource.request({devtoolsLog,URL:artifacts.URL},context),
+    LoadSimulator.request({devtoolsLog,settings},context)]);
+    
+    
+    const{rtt,additionalRttByOrigin}=loadSimulator.getOptions();
+    
+    
+    const origins=new Map();
+    networkRecords.
+    forEach(record=>{
+    if(
+    
+    !UsesRelPreconnectAudit.hasValidTiming(record)||
+    
+    record.initiator.url===mainResource.url||
+    
+    !record.parsedURL||!record.parsedURL.securityOrigin||
+    
+    mainResource.parsedURL.securityOrigin===record.parsedURL.securityOrigin||
+    
+    UsesRelPreconnectAudit.hasAlreadyConnectedToOrigin(record)||
+    
+    !UsesRelPreconnectAudit.socketStartTimeIsBelowThreshold(record,mainResource))
+    {
+    return;
+    }
+    
+    const securityOrigin=record.parsedURL.securityOrigin;
+    const records=origins.get(securityOrigin)||[];
+    records.push(record);
+    origins.set(securityOrigin,records);
+    });
+    
+    const preconnectLinks=artifacts.LinkElements.filter(el=>el.rel==='preconnect');
+    const preconnectOrigins=new Set(preconnectLinks.map(link=>URL.getOrigin(link.href||'')));
+    
+    
+    let results=[];
+    origins.forEach(records=>{
+    
+    
+    const firstRecordOfOrigin=records.reduce((firstRecord,record)=>{
+    return record.startTime<firstRecord.startTime?record:firstRecord;
+    });
+    
+    
+    if(!firstRecordOfOrigin.timing)return;
+    
+    const securityOrigin=firstRecordOfOrigin.parsedURL.securityOrigin;
+    
+    
+    
+    
+    const additionalRtt=additionalRttByOrigin.get(securityOrigin)||0;
+    let connectionTime=rtt+additionalRtt;
+    
+    if(firstRecordOfOrigin.parsedURL.scheme==='https')connectionTime=connectionTime*2;
+    
+    const timeBetweenMainResourceAndDnsStart=
+    firstRecordOfOrigin.startTime*1000-
+    mainResource.endTime*1000+
+    firstRecordOfOrigin.timing.dnsStart;
+    
+    const wastedMs=Math.min(connectionTime,timeBetweenMainResourceAndDnsStart);
+    if(wastedMs<IGNORE_THRESHOLD_IN_MS)return;
+    
+    if(preconnectOrigins.has(securityOrigin)){
+    
+    warnings.push(str_(UIStrings.crossoriginWarning,{securityOrigin}));
+    return;
+    }
+    
+    maxWasted=Math.max(wastedMs,maxWasted);
+    results.push({
+    url:securityOrigin,
+    wastedMs:wastedMs});
+    
+    });
+    
+    results=results.
+    sort((a,b)=>b.wastedMs-a.wastedMs);
+    
+    
+    const headings=[
+    {key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+    {key:'wastedMs',valueType:'timespanMs',label:str_(i18n.UIStrings.columnWastedMs)}];
+    
+    
+    const details=Audit.makeOpportunityDetails(headings,results,maxWasted);
+    
+    return{
+    score:UnusedBytes.scoreForWastedMs(maxWasted),
+    numericValue:maxWasted,
+    displayValue:maxWasted?
+    str_(i18n.UIStrings.displayValueMsSavings,{wastedMs:maxWasted}):
+    '',
+    extendedInfo:{
+    value:results},
+    
+    warnings,
+    details};
+    
+    }}
+    
+    
+    module.exports=UsesRelPreconnectAudit;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/uses-rel-preconnect.js");
+    },{"../computed/load-simulator.js":10,"../computed/main-resource.js":11,"../computed/network-records.js":34,"../lib/i18n/i18n.js":66,"../lib/url-shim.js":"url","./audit.js":3,"./byte-efficiency/byte-efficiency-audit.js":4}],"../audits/uses-rel-preload":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const URL=require('../lib/url-shim.js');
+    const Audit=require('./audit.js');
+    const UnusedBytes=require('./byte-efficiency/byte-efficiency-audit.js');
+    const CriticalRequestChains=require('../computed/critical-request-chains.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    const MainResource=require('../computed/main-resource.js');
+    const PageDependencyGraph=require('../computed/page-dependency-graph.js');
+    const LoadSimulator=require('../computed/load-simulator.js');
+    
+    const UIStrings={
+    
+    title:'Preload key requests',
+    
+    description:'Consider using `<link rel=preload>` to prioritize fetching resources that are '+
+    'currently requested later in page load. [Learn more](https://web.dev/uses-rel-preload).',
+    
+    
+    
+    
+    crossoriginWarning:'A preload <link> was found for "{preloadURL}" but was not used '+
+    'by the browser. Check that you are using the `crossorigin` attribute properly.'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    const THRESHOLD_IN_MS=100;
+    
+    class UsesRelPreloadAudit extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'uses-rel-preload',
+    title:str_(UIStrings.title),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['devtoolsLogs','traces','URL'],
+    scoreDisplayMode:Audit.SCORING_MODES.NUMERIC};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static getURLsToPreload(mainResource,graph){
+    
+    const urls=new Set();
+    
+    graph.traverse((node,traversalPath)=>{
+    if(node.type!=='network')return;
+    
+    const path=traversalPath.slice(1).filter(initiator=>initiator.type==='network');
+    if(!UsesRelPreloadAudit.shouldPreloadRequest(node.record,mainResource,path))return;
+    urls.add(node.record.url);
+    });
+    
+    return urls;
+    }
+    
+    
+    
+    
+    
+    
+    
+    static getURLsFailedToPreload(graph){
+    
+    const requests=[];
+    graph.traverse(node=>node.type==='network'&&requests.push(node.record));
+    
+    const preloadRequests=requests.filter(req=>req.isLinkPreload);
+    const preloadURLs=new Set(preloadRequests.map(req=>req.url));
+    
+    
+    const failedRequests=requests.filter(req=>preloadURLs.has(req.url)&&!req.isLinkPreload);
+    return new Set(failedRequests.map(req=>req.url));
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static shouldPreloadRequest(request,mainResource,initiatorPath){
+    const mainResourceDepth=mainResource.redirects?mainResource.redirects.length:0;
+    
+    
+    if(request.isLinkPreload)return false;
+    
+    if(!CriticalRequestChains.isCritical(request,mainResource))return false;
+    
+    if(URL.NON_NETWORK_PROTOCOLS.includes(request.protocol))return false;
+    
+    if(initiatorPath.length!==mainResourceDepth+2)return false;
+    
+    return URL.rootDomainsMatch(request.url,mainResource.url);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    static computeWasteWithGraph(urls,graph,simulator){
+    if(!urls.size){
+    return{wastedMs:0,results:[]};
+    }
+    
+    
+    
+    const simulationBeforeChanges=simulator.simulate(graph,{flexibleOrdering:true});
+    const modifiedGraph=graph.cloneWithRelationships();
+    
+    
+    const nodesToPreload=[];
+    
+    let mainDocumentNode=null;
+    modifiedGraph.traverse(node=>{
+    if(node.type!=='network')return;
+    
+    const networkNode=node;
+    if(node.isMainDocument()){
+    mainDocumentNode=networkNode;
+    }else if(networkNode.record&&urls.has(networkNode.record.url)){
+    nodesToPreload.push(networkNode);
+    }
+    });
+    
+    if(!mainDocumentNode){
+    
+    throw new Error('Could not find main document node');
+    }
+    
+    
+    
+    for(const node of nodesToPreload){
+    node.removeAllDependencies();
+    node.addDependency(mainDocumentNode);
+    }
+    
+    
+    const simulationAfterChanges=simulator.simulate(modifiedGraph,{flexibleOrdering:true});
+    const originalNodesByRecord=Array.from(simulationBeforeChanges.nodeTimings.keys()).
+    
+    reduce((map,node)=>map.set(node.record,node),new Map());
+    
+    const results=[];
+    for(const node of nodesToPreload){
+    const originalNode=originalNodesByRecord.get(node.record);
+    const timingAfter=simulationAfterChanges.nodeTimings.get(node);
+    const timingBefore=simulationBeforeChanges.nodeTimings.get(originalNode);
+    if(!timingBefore||!timingAfter)throw new Error('Missing preload node');
+    
+    const wastedMs=Math.round(timingBefore.endTime-timingAfter.endTime);
+    if(wastedMs<THRESHOLD_IN_MS)continue;
+    results.push({url:node.record.url,wastedMs});
+    }
+    
+    if(!results.length){
+    return{wastedMs:0,results};
+    }
+    
+    return{
+    
+    
+    wastedMs:Math.max(...results.map(item=>item.wastedMs)),
+    results};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const trace=artifacts.traces[UsesRelPreloadAudit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[UsesRelPreloadAudit.DEFAULT_PASS];
+    const URL=artifacts.URL;
+    const simulatorOptions={trace,devtoolsLog,settings:context.settings};
+    
+    const[mainResource,graph,simulator]=await Promise.all([
+    MainResource.request({devtoolsLog,URL},context),
+    PageDependencyGraph.request({trace,devtoolsLog},context),
+    LoadSimulator.request(simulatorOptions,context)]);
+    
+    
+    const urls=UsesRelPreloadAudit.getURLsToPreload(mainResource,graph);
+    const{results,wastedMs}=UsesRelPreloadAudit.computeWasteWithGraph(urls,graph,simulator);
+    
+    results.sort((a,b)=>b.wastedMs-a.wastedMs);
+    
+    
+    let warnings;
+    const failedURLs=UsesRelPreloadAudit.getURLsFailedToPreload(graph);
+    if(failedURLs.size){
+    warnings=Array.from(failedURLs).
+    map(preloadURL=>str_(UIStrings.crossoriginWarning,{preloadURL}));
+    }
+    
+    
+    const headings=[
+    {key:'url',valueType:'url',label:str_(i18n.UIStrings.columnURL)},
+    {key:'wastedMs',valueType:'timespanMs',label:str_(i18n.UIStrings.columnWastedMs)}];
+    
+    const details=Audit.makeOpportunityDetails(headings,results,wastedMs);
+    
+    return{
+    score:UnusedBytes.scoreForWastedMs(wastedMs),
+    numericValue:wastedMs,
+    displayValue:wastedMs?
+    str_(i18n.UIStrings.displayValueMsSavings,{wastedMs}):
+    '',
+    extendedInfo:{
+    value:results},
+    
+    details,
+    warnings};
+    
+    }}
+    
+    
+    module.exports=UsesRelPreloadAudit;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/uses-rel-preload.js");
+    },{"../computed/critical-request-chains.js":9,"../computed/load-simulator.js":10,"../computed/main-resource.js":11,"../computed/page-dependency-graph.js":35,"../lib/i18n/i18n.js":66,"../lib/url-shim.js":"url","./audit.js":3,"./byte-efficiency/byte-efficiency-audit.js":4}],"../audits/viewport":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const ComputedViewportMeta=require('../computed/viewport-meta.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Has a `<meta name="viewport">` tag with `width` or `initial-scale`',
+    
+    failureTitle:'Does not have a `<meta name="viewport">` tag with `width` '+
+    'or `initial-scale`',
+    
+    description:'Add a `<meta name="viewport">` tag to optimize your app for mobile screens. '+
+    '[Learn more](https://web.dev/viewport).',
+    
+    explanationNoTag:'No `<meta name="viewport">` tag found'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class Viewport extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'viewport',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['MetaElements']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const viewportMeta=await ComputedViewportMeta.request(artifacts.MetaElements,context);
+    
+    if(!viewportMeta.hasViewportTag){
+    return{
+    score:0,
+    explanation:str_(UIStrings.explanationNoTag)};
+    
+    }
+    
+    return{
+    score:Number(viewportMeta.isMobileOptimized),
+    warnings:viewportMeta.parserWarnings};
+    
+    }}
+    
+    
+    module.exports=Viewport;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/viewport.js");
+    },{"../computed/viewport-meta.js":41,"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/without-javascript":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Contains some content when JavaScript is not available',
+    
+    failureTitle:'Does not provide fallback content when JavaScript is not available',
+    
+    description:'Your app should display some content when JavaScript is disabled, even if '+
+    'it\'s just a warning to the user that JavaScript is required to use the app. '+
+    '[Learn more](https://web.dev/without-javascript).',
+    
+    explanation:'The page body should render some content if its scripts are not available.'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class WithoutJavaScript extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'without-javascript',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['HTMLWithoutJavaScript']};
+    
+    }
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    const artifact=artifacts.HTMLWithoutJavaScript;
+    
+    
+    if(artifact.bodyText.trim()===''&&!artifact.hasNoScript){
+    return{
+    score:0,
+    explanation:str_(UIStrings.explanation)};
+    
+    }
+    
+    return{
+    score:1};
+    
+    }}
+    
+    
+    module.exports=WithoutJavaScript;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/without-javascript.js");
+    },{"../lib/i18n/i18n.js":66,"./audit.js":3}],"../audits/works-offline":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const URL=require('../lib/url-shim.js');
+    const Audit=require('./audit.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    title:'Current page responds with a 200 when offline',
+    
+    failureTitle:'Current page does not respond with a 200 when offline',
+    
+    description:'If you\'re building a Progressive Web App, consider using a service worker '+
+    'so that your app can work offline. '+
+    '[Learn more](https://web.dev/works-offline).',
+    
+    
+    
+    
+    
+    warningNoLoad:'The page may not be loading offline because your test URL '+
+    `({requested}) was redirected to "{final}". `+
+    'Try testing the second URL directly.'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class WorksOffline extends Audit{
+    
+    
+    
+    static get meta(){
+    return{
+    id:'works-offline',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['Offline','URL']};
+    
+    }
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    const warnings=[];
+    const passed=artifacts.Offline===200;
+    if(!passed&&
+    !URL.equalWithExcludedFragments(artifacts.URL.requestedUrl,artifacts.URL.finalUrl)){
+    warnings.push(str_(UIStrings.warningNoLoad,
+    {requested:artifacts.URL.requestedUrl,final:artifacts.URL.finalUrl}));
+    }
+    
+    return{
+    score:Number(passed),
+    warnings};
+    
+    }}
+    
+    
+    module.exports=WorksOffline;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/works-offline.js");
+    },{"../lib/i18n/i18n.js":66,"../lib/url-shim.js":"url","./audit.js":3}],"../gather/gatherers/accessibility":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    const Gatherer=require('./gatherer.js');
+    
+    const axeLibSource="/*! axe v3.3.0\n * Copyright (c) 2019 Deque Systems, Inc.\n *\n * Your use of this Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n *\n * This entire copyright notice must appear in every copy of this file you\n * distribute or in any file that contains substantial portions of this source\n * code.\n */\n!function e(window){var a=window,document=window.document;function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function l(e){this.name=\"SupportError\",this.cause=e.cause,this.message=\"`\".concat(e.cause,\"` - feature unsupported in your environment.\"),e.ruleId&&(this.ruleId=e.ruleId,this.message+=\" Skipping \".concat(this.ruleId,\" rule.\")),this.stack=(new Error).stack}(axe=axe||{}).version=\"3.3.0\",\"function\"==typeof define&&define.amd&&define(\"axe-core\",[],function(){\"use strict\";return axe}),\"object\"===(\"undefined\"==typeof module?\"undefined\":S(module))&&module.exports&&\"function\"==typeof e.toString&&(axe.source=\"(\"+e.toString()+')(typeof window === \"object\" ? window : this);',module.exports=axe),\"function\"==typeof window.getComputedStyle&&(window.axe=axe),(l.prototype=Object.create(Error.prototype)).constructor=l,function o(i,u,s){function l(t,e){if(!u[t]){if(!i[t]){var n=\"function\"==typeof require&&require;if(!e&&n)return n(t,!0);if(c)return c(t,!0);var r=new Error(\"Cannot find module '\"+t+\"'\");throw r.code=\"MODULE_NOT_FOUND\",r}var a=u[t]={exports:{}};i[t][0].call(a.exports,function(e){return l(i[t][1][e]||e)},a,a.exports,o,i,u,s)}return u[t].exports}for(var c=\"function\"==typeof require&&require,e=0;e<s.length;e++)l(s[e]);return l}({1:[function(e,t,n){\"Promise\"in window||e(\"es6-promise\").polyfill(),e(\"weakmap-polyfill\"),axe.imports={axios:e(\"axios\"),CssSelectorParser:e(\"css-selector-parser\").CssSelectorParser,doT:e(\"dot\"),emojiRegexText:e(\"emoji-regex\")}},{axios:2,\"css-selector-parser\":28,dot:30,\"emoji-regex\":31,\"es6-promise\":32,\"weakmap-polyfill\":34}],2:[function(e,t,n){t.exports=e(\"./lib/axios\")},{\"./lib/axios\":4}],3:[function(c,e,t){\"use strict\";var utils=c(\"./../utils\"),d=c(\"./../core/settle\"),m=c(\"./../helpers/buildURL\"),p=c(\"./../helpers/parseHeaders\"),f=c(\"./../helpers/isURLSameOrigin\"),h=c(\"../core/createError\");e.exports=function(l){return new Promise(function(n,r){var a=l.data,o=l.headers;utils.isFormData(a)&&delete o[\"Content-Type\"];var i=new XMLHttpRequest;if(l.auth){var e=l.auth.username||\"\",t=l.auth.password||\"\";o.Authorization=\"Basic \"+btoa(e+\":\"+t)}if(i.open(l.method.toUpperCase(),m(l.url,l.params,l.paramsSerializer),!0),i.timeout=l.timeout,i.onreadystatechange=function(){if(i&&4===i.readyState&&(0!==i.status||i.responseURL&&0===i.responseURL.indexOf(\"file:\"))){var e=\"getAllResponseHeaders\"in i?p(i.getAllResponseHeaders()):null,t={data:l.responseType&&\"text\"!==l.responseType?i.response:i.responseText,status:i.status,statusText:i.statusText,headers:e,config:l,request:i};d(n,r,t),i=null}},i.onabort=function(){i&&(r(h(\"Request aborted\",l,\"ECONNABORTED\",i)),i=null)},i.onerror=function(){r(h(\"Network Error\",l,null,i)),i=null},i.ontimeout=function(){r(h(\"timeout of \"+l.timeout+\"ms exceeded\",l,\"ECONNABORTED\",i)),i=null},utils.isStandardBrowserEnv()){var u=c(\"./../helpers/cookies\"),s=(l.withCredentials||f(l.url))&&l.xsrfCookieName?u.read(l.xsrfCookieName):void 0;s&&(o[l.xsrfHeaderName]=s)}if(\"setRequestHeader\"in i&&utils.forEach(o,function(e,t){void 0===a&&\"content-type\"===t.toLowerCase()?delete o[t]:i.setRequestHeader(t,e)}),l.withCredentials&&(i.withCredentials=!0),l.responseType)try{i.responseType=l.responseType}catch(e){if(\"json\"!==l.responseType)throw e}\"function\"==typeof l.onDownloadProgress&&i.addEventListener(\"progress\",l.onDownloadProgress),\"function\"==typeof l.onUploadProgress&&i.upload&&i.upload.addEventListener(\"progress\",l.onUploadProgress),l.cancelToken&&l.cancelToken.promise.then(function(e){i&&(i.abort(),r(e),i=null)}),void 0===a&&(a=null),i.send(a)})}},{\"../core/createError\":10,\"./../core/settle\":14,\"./../helpers/buildURL\":18,\"./../helpers/cookies\":20,\"./../helpers/isURLSameOrigin\":22,\"./../helpers/parseHeaders\":24,\"./../utils\":26}],4:[function(e,t,n){\"use strict\";var utils=e(\"./utils\"),r=e(\"./helpers/bind\"),a=e(\"./core/Axios\"),o=e(\"./core/mergeConfig\");function i(e){var t=new a(e),n=r(a.prototype.request,t);return utils.extend(n,a.prototype,t),utils.extend(n,t),n}var u=i(e(\"./defaults\"));u.Axios=a,u.create=function(e){return i(o(u.defaults,e))},u.Cancel=e(\"./cancel/Cancel\"),u.CancelToken=e(\"./cancel/CancelToken\"),u.isCancel=e(\"./cancel/isCancel\"),u.all=function(e){return Promise.all(e)},u.spread=e(\"./helpers/spread\"),t.exports=u,t.exports.default=u},{\"./cancel/Cancel\":5,\"./cancel/CancelToken\":6,\"./cancel/isCancel\":7,\"./core/Axios\":8,\"./core/mergeConfig\":13,\"./defaults\":16,\"./helpers/bind\":17,\"./helpers/spread\":25,\"./utils\":26}],5:[function(e,t,n){\"use strict\";function r(e){this.message=e}r.prototype.toString=function(){return\"Cancel\"+(this.message?\": \"+this.message:\"\")},r.prototype.__CANCEL__=!0,t.exports=r},{}],6:[function(e,t,n){\"use strict\";var r=e(\"./Cancel\");function a(e){if(\"function\"!=typeof e)throw new TypeError(\"executor must be a function.\");var t;this.promise=new Promise(function(e){t=e});var n=this;e(function(e){n.reason||(n.reason=new r(e),t(n.reason))})}a.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},a.source=function(){var t;return{token:new a(function(e){t=e}),cancel:t}},t.exports=a},{\"./Cancel\":5}],7:[function(e,t,n){\"use strict\";t.exports=function(e){return!(!e||!e.__CANCEL__)}},{}],8:[function(e,t,n){\"use strict\";var utils=e(\"./../utils\"),r=e(\"../helpers/buildURL\"),a=e(\"./InterceptorManager\"),o=e(\"./dispatchRequest\"),i=e(\"./mergeConfig\");function u(e){this.defaults=e,this.interceptors={request:new a,response:new a}}u.prototype.request=function(e,t){\"string\"==typeof e?(e=t||{}).url=arguments[0]:e=e||{},(e=i(this.defaults,e)).method=e.method?e.method.toLowerCase():\"get\";var n=[o,void 0],r=Promise.resolve(e);for(this.interceptors.request.forEach(function(e){n.unshift(e.fulfilled,e.rejected)}),this.interceptors.response.forEach(function(e){n.push(e.fulfilled,e.rejected)});n.length;)r=r.then(n.shift(),n.shift());return r},u.prototype.getUri=function(e){return e=i(this.defaults,e),r(e.url,e.params,e.paramsSerializer).replace(/^\\?/,\"\")},utils.forEach([\"delete\",\"get\",\"head\",\"options\"],function(n){u.prototype[n]=function(e,t){return this.request(utils.merge(t||{},{method:n,url:e}))}}),utils.forEach([\"post\",\"put\",\"patch\"],function(r){u.prototype[r]=function(e,t,n){return this.request(utils.merge(n||{},{method:r,url:e,data:t}))}}),t.exports=u},{\"../helpers/buildURL\":18,\"./../utils\":26,\"./InterceptorManager\":9,\"./dispatchRequest\":11,\"./mergeConfig\":13}],9:[function(e,t,n){\"use strict\";var utils=e(\"./../utils\");function r(){this.handlers=[]}r.prototype.use=function(e,t){return this.handlers.push({fulfilled:e,rejected:t}),this.handlers.length-1},r.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},r.prototype.forEach=function(t){utils.forEach(this.handlers,function(e){null!==e&&t(e)})},t.exports=r},{\"./../utils\":26}],10:[function(e,t,n){\"use strict\";var i=e(\"./enhanceError\");t.exports=function(e,t,n,r,a){var o=new Error(e);return i(o,t,n,r,a)}},{\"./enhanceError\":12}],11:[function(e,t,n){\"use strict\";var utils=e(\"./../utils\"),r=e(\"./transformData\"),a=e(\"../cancel/isCancel\"),o=e(\"../defaults\"),i=e(\"./../helpers/isAbsoluteURL\"),u=e(\"./../helpers/combineURLs\");function s(e){e.cancelToken&&e.cancelToken.throwIfRequested()}t.exports=function(t){return s(t),t.baseURL&&!i(t.url)&&(t.url=u(t.baseURL,t.url)),t.headers=t.headers||{},t.data=r(t.data,t.headers,t.transformRequest),t.headers=utils.merge(t.headers.common||{},t.headers[t.method]||{},t.headers||{}),utils.forEach([\"delete\",\"get\",\"head\",\"post\",\"put\",\"patch\",\"common\"],function(e){delete t.headers[e]}),(t.adapter||o.adapter)(t).then(function(e){return s(t),e.data=r(e.data,e.headers,t.transformResponse),e},function(e){return a(e)||(s(t),e&&e.response&&(e.response.data=r(e.response.data,e.response.headers,t.transformResponse))),Promise.reject(e)})}},{\"../cancel/isCancel\":7,\"../defaults\":16,\"./../helpers/combineURLs\":19,\"./../helpers/isAbsoluteURL\":21,\"./../utils\":26,\"./transformData\":15}],12:[function(e,t,n){\"use strict\";t.exports=function(e,t,n,r,a){return e.config=t,n&&(e.code=n),e.request=r,e.response=a,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},{}],13:[function(e,t,n){\"use strict\";var utils=e(\"../utils\");t.exports=function(t,n){n=n||{};var r={};return utils.forEach([\"url\",\"method\",\"params\",\"data\"],function(e){void 0!==n[e]&&(r[e]=n[e])}),utils.forEach([\"headers\",\"auth\",\"proxy\"],function(e){utils.isObject(n[e])?r[e]=utils.deepMerge(t[e],n[e]):void 0!==n[e]?r[e]=n[e]:utils.isObject(t[e])?r[e]=utils.deepMerge(t[e]):void 0!==t[e]&&(r[e]=t[e])}),utils.forEach([\"baseURL\",\"transformRequest\",\"transformResponse\",\"paramsSerializer\",\"timeout\",\"withCredentials\",\"adapter\",\"responseType\",\"xsrfCookieName\",\"xsrfHeaderName\",\"onUploadProgress\",\"onDownloadProgress\",\"maxContentLength\",\"validateStatus\",\"maxRedirects\",\"httpAgent\",\"httpsAgent\",\"cancelToken\",\"socketPath\"],function(e){void 0!==n[e]?r[e]=n[e]:void 0!==t[e]&&(r[e]=t[e])}),r}},{\"../utils\":26}],14:[function(e,t,n){\"use strict\";var a=e(\"./createError\");t.exports=function(e,t,n){var r=n.config.validateStatus;!r||r(n.status)?e(n):t(a(\"Request failed with status code \"+n.status,n.config,null,n.request,n))}},{\"./createError\":10}],15:[function(e,t,n){\"use strict\";var utils=e(\"./../utils\");t.exports=function(t,n,e){return utils.forEach(e,function(e){t=e(t,n)}),t}},{\"./../utils\":26}],16:[function(i,u,e){(function(e){\"use strict\";var utils=i(\"./utils\"),n=i(\"./helpers/normalizeHeaderName\"),t={\"Content-Type\":\"application/x-www-form-urlencoded\"};function r(e,t){!utils.isUndefined(e)&&utils.isUndefined(e[\"Content-Type\"])&&(e[\"Content-Type\"]=t)}var a,o={adapter:(void 0!==e&&\"[object process]\"===Object.prototype.toString.call(e)?a=i(\"./adapters/http\"):\"undefined\"!=typeof XMLHttpRequest&&(a=i(\"./adapters/xhr\")),a),transformRequest:[function(e,t){return n(t,\"Accept\"),n(t,\"Content-Type\"),utils.isFormData(e)||utils.isArrayBuffer(e)||utils.isBuffer(e)||utils.isStream(e)||utils.isFile(e)||utils.isBlob(e)?e:utils.isArrayBufferView(e)?e.buffer:utils.isURLSearchParams(e)?(r(t,\"application/x-www-form-urlencoded;charset=utf-8\"),e.toString()):utils.isObject(e)?(r(t,\"application/json;charset=utf-8\"),JSON.stringify(e)):e}],transformResponse:[function(e){if(\"string\"==typeof e)try{e=JSON.parse(e)}catch(e){}return e}],timeout:0,xsrfCookieName:\"XSRF-TOKEN\",xsrfHeaderName:\"X-XSRF-TOKEN\",maxContentLength:-1,validateStatus:function(e){return 200<=e&&e<300}};o.headers={common:{Accept:\"application/json, text/plain, */*\"}},utils.forEach([\"delete\",\"get\",\"head\"],function(e){o.headers[e]={}}),utils.forEach([\"post\",\"put\",\"patch\"],function(e){o.headers[e]=utils.merge(t)}),u.exports=o}).call(this,i(\"_process\"))},{\"./adapters/http\":3,\"./adapters/xhr\":3,\"./helpers/normalizeHeaderName\":23,\"./utils\":26,_process:33}],17:[function(e,t,n){\"use strict\";t.exports=function(n,r){return function(){for(var e=new Array(arguments.length),t=0;t<e.length;t++)e[t]=arguments[t];return n.apply(r,e)}}},{}],18:[function(e,t,n){\"use strict\";var utils=e(\"./../utils\");function i(e){return encodeURIComponent(e).replace(/%40/gi,\"@\").replace(/%3A/gi,\":\").replace(/%24/g,\"$\").replace(/%2C/gi,\",\").replace(/%20/g,\"+\").replace(/%5B/gi,\"[\").replace(/%5D/gi,\"]\")}t.exports=function(e,t,n){if(!t)return e;var r;if(n)r=n(t);else if(utils.isURLSearchParams(t))r=t.toString();else{var a=[];utils.forEach(t,function(e,t){null!=e&&(utils.isArray(e)?t+=\"[]\":e=[e],utils.forEach(e,function(e){utils.isDate(e)?e=e.toISOString():utils.isObject(e)&&(e=JSON.stringify(e)),a.push(i(t)+\"=\"+i(e))}))}),r=a.join(\"&\")}if(r){var o=e.indexOf(\"#\");-1!==o&&(e=e.slice(0,o)),e+=(-1===e.indexOf(\"?\")?\"?\":\"&\")+r}return e}},{\"./../utils\":26}],19:[function(e,t,n){\"use strict\";t.exports=function(e,t){return t?e.replace(/\\/+$/,\"\")+\"/\"+t.replace(/^\\/+/,\"\"):e}},{}],20:[function(e,t,n){\"use strict\";var utils=e(\"./../utils\");t.exports=utils.isStandardBrowserEnv()?{write:function(e,t,n,r,a,o){var i=[];i.push(e+\"=\"+encodeURIComponent(t)),utils.isNumber(n)&&i.push(\"expires=\"+new Date(n).toGMTString()),utils.isString(r)&&i.push(\"path=\"+r),utils.isString(a)&&i.push(\"domain=\"+a),!0===o&&i.push(\"secure\"),document.cookie=i.join(\"; \")},read:function(e){var t=document.cookie.match(new RegExp(\"(^|;\\\\s*)(\"+e+\")=([^;]*)\"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,\"\",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}}},{\"./../utils\":26}],21:[function(e,t,n){\"use strict\";t.exports=function(e){return/^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(e)}},{}],22:[function(e,t,n){\"use strict\";var r,a,o,utils=e(\"./../utils\");function i(e){var t=e;return a&&(o.setAttribute(\"href\",t),t=o.href),o.setAttribute(\"href\",t),{href:o.href,protocol:o.protocol?o.protocol.replace(/:$/,\"\"):\"\",host:o.host,search:o.search?o.search.replace(/^\\?/,\"\"):\"\",hash:o.hash?o.hash.replace(/^#/,\"\"):\"\",hostname:o.hostname,port:o.port,pathname:\"/\"===o.pathname.charAt(0)?o.pathname:\"/\"+o.pathname}}t.exports=utils.isStandardBrowserEnv()?(a=/(msie|trident)/i.test(navigator.userAgent),o=document.createElement(\"a\"),r=i(window.location.href),function(e){var t=utils.isString(e)?i(e):e;return t.protocol===r.protocol&&t.host===r.host}):function(){return!0}},{\"./../utils\":26}],23:[function(e,t,n){\"use strict\";var utils=e(\"../utils\");t.exports=function(n,r){utils.forEach(n,function(e,t){t!==r&&t.toUpperCase()===r.toUpperCase()&&(n[r]=e,delete n[t])})}},{\"../utils\":26}],24:[function(e,t,n){\"use strict\";var utils=e(\"./../utils\"),o=[\"age\",\"authorization\",\"content-length\",\"content-type\",\"etag\",\"expires\",\"from\",\"host\",\"if-modified-since\",\"if-unmodified-since\",\"last-modified\",\"location\",\"max-forwards\",\"proxy-authorization\",\"referer\",\"retry-after\",\"user-agent\"];t.exports=function(e){var t,n,r,a={};return e&&utils.forEach(e.split(\"\\n\"),function(e){if(r=e.indexOf(\":\"),t=utils.trim(e.substr(0,r)).toLowerCase(),n=utils.trim(e.substr(r+1)),t){if(a[t]&&0<=o.indexOf(t))return;a[t]=\"set-cookie\"===t?(a[t]?a[t]:[]).concat([n]):a[t]?a[t]+\", \"+n:n}}),a}},{\"./../utils\":26}],25:[function(e,t,n){\"use strict\";t.exports=function(t){return function(e){return t.apply(null,e)}}},{}],26:[function(e,t,n){\"use strict\";var a=e(\"./helpers/bind\"),r=e(\"is-buffer\"),o=Object.prototype.toString;function i(e){return\"[object Array]\"===o.call(e)}function u(e){return null!==e&&\"object\"==typeof e}function s(e){return\"[object Function]\"===o.call(e)}function l(e,t){if(null!=e)if(\"object\"!=typeof e&&(e=[e]),i(e))for(var n=0,r=e.length;n<r;n++)t.call(null,e[n],n,e);else for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.call(null,e[a],a,e)}t.exports={isArray:i,isArrayBuffer:function(e){return\"[object ArrayBuffer]\"===o.call(e)},isBuffer:r,isFormData:function(e){return\"undefined\"!=typeof FormData&&e instanceof FormData},isArrayBufferView:function(e){return\"undefined\"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&e.buffer instanceof ArrayBuffer},isString:function(e){return\"string\"==typeof e},isNumber:function(e){return\"number\"==typeof e},isObject:u,isUndefined:function(e){return void 0===e},isDate:function(e){return\"[object Date]\"===o.call(e)},isFile:function(e){return\"[object File]\"===o.call(e)},isBlob:function(e){return\"[object Blob]\"===o.call(e)},isFunction:s,isStream:function(e){return u(e)&&s(e.pipe)},isURLSearchParams:function(e){return\"undefined\"!=typeof URLSearchParams&&e instanceof URLSearchParams},isStandardBrowserEnv:function(){return(\"undefined\"==typeof navigator||\"ReactNative\"!==navigator.product&&\"NativeScript\"!==navigator.product&&\"NS\"!==navigator.product)&&(void 0!==window&&void 0!==document)},forEach:l,merge:function n(){var r={};function e(e,t){\"object\"==typeof r[t]&&\"object\"==typeof e?r[t]=n(r[t],e):r[t]=e}for(var t=0,a=arguments.length;t<a;t++)l(arguments[t],e);return r},deepMerge:function n(){var r={};function e(e,t){\"object\"==typeof r[t]&&\"object\"==typeof e?r[t]=n(r[t],e):r[t]=\"object\"==typeof e?n({},e):e}for(var t=0,a=arguments.length;t<a;t++)l(arguments[t],e);return r},extend:function(n,e,r){return l(e,function(e,t){n[t]=r&&\"function\"==typeof e?a(e,r):e}),n},trim:function(e){return e.replace(/^\\s*/,\"\").replace(/\\s*$/,\"\")}}},{\"./helpers/bind\":17,\"is-buffer\":27}],27:[function(e,t,n){t.exports=function(e){return null!=e&&null!=e.constructor&&\"function\"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}},{}],28:[function(e,t,n){t.exports={CssSelectorParser:e(\"./lib/css-selector-parser.js\").CssSelectorParser}},{\"./lib/css-selector-parser.js\":29}],29:[function(e,t,n){function r(){this.pseudos={},this.attrEqualityMods={},this.ruleNestingOperators={},this.substitutesEnabled=!1}function o(e){return\"a\"<=e&&e<=\"f\"||\"A\"<=e&&e<=\"F\"||\"0\"<=e&&e<=\"9\"}r.prototype.registerSelectorPseudos=function(e){for(var t=0,n=arguments.length;t<n;t++)e=arguments[t],this.pseudos[e]=\"selector\";return this},r.prototype.unregisterSelectorPseudos=function(e){for(var t=0,n=arguments.length;t<n;t++)e=arguments[t],delete this.pseudos[e];return this},r.prototype.registerNumericPseudos=function(e){for(var t=0,n=arguments.length;t<n;t++)e=arguments[t],this.pseudos[e]=\"numeric\";return this},r.prototype.unregisterNumericPseudos=function(e){for(var t=0,n=arguments.length;t<n;t++)e=arguments[t],delete this.pseudos[e];return this},r.prototype.registerNestingOperators=function(e){for(var t=0,n=arguments.length;t<n;t++)e=arguments[t],this.ruleNestingOperators[e]=!0;return this},r.prototype.unregisterNestingOperators=function(e){for(var t=0,n=arguments.length;t<n;t++)e=arguments[t],delete this.ruleNestingOperators[e];return this},r.prototype.registerAttrEqualityMods=function(e){for(var t=0,n=arguments.length;t<n;t++)e=arguments[t],this.attrEqualityMods[e]=!0;return this},r.prototype.unregisterAttrEqualityMods=function(e){for(var t=0,n=arguments.length;t<n;t++)e=arguments[t],delete this.attrEqualityMods[e];return this},r.prototype.enableSubstitutes=function(){return this.substitutesEnabled=!0,this},r.prototype.disableSubstitutes=function(){return this.substitutesEnabled=!1,this};var u={\"!\":!0,'\"':!0,\"#\":!0,$:!0,\"%\":!0,\"&\":!0,\"'\":!0,\"(\":!0,\")\":!0,\"*\":!0,\"+\":!0,\",\":!0,\".\":!0,\"/\":!0,\";\":!0,\"<\":!0,\"=\":!0,\">\":!0,\"?\":!0,\"@\":!0,\"[\":!0,\"\\\\\":!0,\"]\":!0,\"^\":!0,\"`\":!0,\"{\":!0,\"|\":!0,\"}\":!0,\"~\":!0},i={\"\\n\":\"\\\\n\",\"\\r\":\"\\\\r\",\"\\t\":\"\\\\t\",\"\\f\":\"\\\\f\",\"\\v\":\"\\\\v\"},y={n:\"\\n\",r:\"\\r\",t:\"\\t\",f:\"\\f\",\"\\\\\":\"\\\\\",\"'\":\"'\"},v={n:\"\\n\",r:\"\\r\",t:\"\\t\",f:\"\\f\",\"\\\\\":\"\\\\\",'\"':'\"'};function a(s,l,c,d,a,m){var p,f,h,b,g;return b=s.length,p=null,h=function(e,t){var n,r,a;for(a=\"\",l++,p=s.charAt(l);l<b;){if(p===e)return l++,a;if(\"\\\\\"===p)if(l++,(p=s.charAt(l))===e)a+=e;else if(n=t[p])a+=n;else{if(o(p)){for(r=p,l++,p=s.charAt(l);o(p);)r+=p,l++,p=s.charAt(l);\" \"===p&&(l++,p=s.charAt(l)),a+=String.fromCharCode(parseInt(r,16));continue}a+=p}else a+=p;l++,p=s.charAt(l)}return a},f=function(){var e,t=\"\";for(p=s.charAt(l);l<b;){if(\"a\"<=(e=p)&&e<=\"z\"||\"A\"<=e&&e<=\"Z\"||\"0\"<=e&&e<=\"9\"||\"-\"===e||\"_\"===e)t+=p;else{if(\"\\\\\"!==p)return t;if(b<=++l)throw Error(\"Expected symbol but end of file reached.\");if(p=s.charAt(l),u[p])t+=p;else{if(o(p)){var n=p;for(l++,p=s.charAt(l);o(p);)n+=p,l++,p=s.charAt(l);\" \"===p&&(l++,p=s.charAt(l)),t+=String.fromCharCode(parseInt(n,16));continue}t+=p}}l++,p=s.charAt(l)}return t},g=function(){p=s.charAt(l);for(var e=!1;\" \"===p||\"\\t\"===p||\"\\n\"===p||\"\\r\"===p||\"\\f\"===p;)e=!0,l++,p=s.charAt(l);return e},this.parse=function(){var e=this.parseSelector();if(l<b)throw Error('Rule expected but \"'+s.charAt(l)+'\" found.');return e},this.parseSelector=function(){var e,t=e=this.parseSingleSelector();for(p=s.charAt(l);\",\"===p;){if(l++,g(),\"selectors\"!==e.type&&(e={type:\"selectors\",selectors:[t]}),!(t=this.parseSingleSelector()))throw Error('Rule expected after \",\".');e.selectors.push(t)}return e},this.parseSingleSelector=function(){g();var e={type:\"ruleSet\"},t=this.parseRule();if(!t)return null;for(var n=e;t&&(t.type=\"rule\",n.rule=t,n=t,g(),p=s.charAt(l),!(b<=l||\",\"===p||\")\"===p));)if(a[p]){var r=p;if(l++,g(),!(t=this.parseRule()))throw Error('Rule expected after \"'+r+'\".');t.nestingOperator=r}else(t=this.parseRule())&&(t.nestingOperator=null);return e},this.parseRule=function(){for(var e,t=null;l<b;)if(\"*\"===(p=s.charAt(l)))l++,(t=t||{}).tagName=\"*\";else if(\"a\"<=(e=p)&&e<=\"z\"||\"A\"<=e&&e<=\"Z\"||\"-\"===e||\"_\"===e||\"\\\\\"===p)(t=t||{}).tagName=f();else if(\".\"===p)l++,((t=t||{}).classNames=t.classNames||[]).push(f());else if(\"#\"===p)l++,(t=t||{}).id=f();else if(\"[\"===p){l++,g();var n={name:f()};if(g(),\"]\"===p)l++;else{var r=\"\";if(d[p]&&(r=p,l++,p=s.charAt(l)),b<=l)throw Error('Expected \"=\" but end of file reached.');if(\"=\"!==p)throw Error('Expected \"=\" but \"'+p+'\" found.');n.operator=r+\"=\",l++,g();var a=\"\";if(n.valueType=\"string\",'\"'===p)a=h('\"',v);else if(\"'\"===p)a=h(\"'\",y);else if(m&&\"$\"===p)l++,a=f(),n.valueType=\"substitute\";else{for(;l<b&&\"]\"!==p;)a+=p,l++,p=s.charAt(l);a=a.trim()}if(g(),b<=l)throw Error('Expected \"]\" but end of file reached.');if(\"]\"!==p)throw Error('Expected \"]\" but \"'+p+'\" found.');l++,n.value=a}((t=t||{}).attrs=t.attrs||[]).push(n)}else{if(\":\"!==p)break;l++;var o=f(),i={name:o};if(\"(\"===p){l++;var u=\"\";if(g(),\"selector\"===c[o])i.valueType=\"selector\",u=this.parseSelector();else{if(i.valueType=c[o]||\"string\",'\"'===p)u=h('\"',v);else if(\"'\"===p)u=h(\"'\",y);else if(m&&\"$\"===p)l++,u=f(),i.valueType=\"substitute\";else{for(;l<b&&\")\"!==p;)u+=p,l++,p=s.charAt(l);u=u.trim()}g()}if(b<=l)throw Error('Expected \")\" but end of file reached.');if(\")\"!==p)throw Error('Expected \")\" but \"'+p+'\" found.');l++,i.value=u}((t=t||{}).pseudos=t.pseudos||[]).push(i)}return t},this}r.prototype.parse=function(e){return new a(e,0,this.pseudos,this.attrEqualityMods,this.ruleNestingOperators,this.substitutesEnabled).parse()},r.prototype.escapeIdentifier=function(e){for(var t=\"\",n=0,r=e.length;n<r;){var a=e.charAt(n);if(u[a])t+=\"\\\\\"+a;else if(\"_\"===a||\"-\"===a||\"A\"<=a&&a<=\"Z\"||\"a\"<=a&&a<=\"z\"||0!==n&&\"0\"<=a&&a<=\"9\")t+=a;else{var o=a.charCodeAt(0);if(55296==(63488&o)){var i=e.charCodeAt(n++);if(55296!=(64512&o)||56320!=(64512&i))throw Error(\"UCS-2(decode): illegal sequence\");o=((1023&o)<<10)+(1023&i)+65536}t+=\"\\\\\"+o.toString(16)+\" \"}n++}return t},r.prototype.escapeStr=function(e){for(var t,n,r=\"\",a=0,o=e.length;a<o;)'\"'===(t=e.charAt(a))?t='\\\\\"':\"\\\\\"===t?t=\"\\\\\\\\\":(n=i[t])&&(t=n),r+=t,a++;return'\"'+r+'\"'},r.prototype.render=function(e){return this._renderEntity(e).trim()},r.prototype._renderEntity=function(e){var t,n,r;switch(r=\"\",e.type){case\"ruleSet\":for(t=e.rule,n=[];t;)t.nestingOperator&&n.push(t.nestingOperator),n.push(this._renderEntity(t)),t=t.rule;r=n.join(\" \");break;case\"selectors\":r=e.selectors.map(this._renderEntity,this).join(\", \");break;case\"rule\":e.tagName&&(r=\"*\"===e.tagName?\"*\":this.escapeIdentifier(e.tagName)),e.id&&(r+=\"#\"+this.escapeIdentifier(e.id)),e.classNames&&(r+=e.classNames.map(function(e){return\".\"+this.escapeIdentifier(e)},this).join(\"\")),e.attrs&&(r+=e.attrs.map(function(e){return e.operator?\"substitute\"===e.valueType?\"[\"+this.escapeIdentifier(e.name)+e.operator+\"$\"+e.value+\"]\":\"[\"+this.escapeIdentifier(e.name)+e.operator+this.escapeStr(e.value)+\"]\":\"[\"+this.escapeIdentifier(e.name)+\"]\"},this).join(\"\")),e.pseudos&&(r+=e.pseudos.map(function(e){return e.valueType?\"selector\"===e.valueType?\":\"+this.escapeIdentifier(e.name)+\"(\"+this._renderEntity(e.value)+\")\":\"substitute\"===e.valueType?\":\"+this.escapeIdentifier(e.name)+\"($\"+e.value+\")\":\"numeric\"===e.valueType?\":\"+this.escapeIdentifier(e.name)+\"(\"+e.value+\")\":\":\"+this.escapeIdentifier(e.name)+\"(\"+this.escapeIdentifier(e.value)+\")\":\":\"+this.escapeIdentifier(e.name)},this).join(\"\"));break;default:throw Error('Unknown entity type: \"'+e.type(NaN))}return r},n.CssSelectorParser=r},{}],30:[function(e,t,n){!function(){\"use strict\";var s,l={name:\"doT\",version:\"1.1.1\",templateSettings:{evaluate:/\\{\\{([\\s\\S]+?(\\}?)+)\\}\\}/g,interpolate:/\\{\\{=([\\s\\S]+?)\\}\\}/g,encode:/\\{\\{!([\\s\\S]+?)\\}\\}/g,use:/\\{\\{#([\\s\\S]+?)\\}\\}/g,useParams:/(^|[^\\w$])def(?:\\.|\\[[\\'\\\"])([\\w$\\.]+)(?:[\\'\\\"]\\])?\\s*\\:\\s*([\\w$\\.]+|\\\"[^\\\"]+\\\"|\\'[^\\']+\\'|\\{[^\\}]+\\})/g,define:/\\{\\{##\\s*([\\w\\.$]+)\\s*(\\:|=)([\\s\\S]+?)#\\}\\}/g,defineParams:/^\\s*([\\w$]+):([\\s\\S]+)/,conditional:/\\{\\{\\?(\\?)?\\s*([\\s\\S]*?)\\s*\\}\\}/g,iterate:/\\{\\{~\\s*(?:\\}\\}|([\\s\\S]+?)\\s*\\:\\s*([\\w$]+)\\s*(?:\\:\\s*([\\w$]+))?\\s*\\}\\})/g,varname:\"it\",strip:!0,append:!0,selfcontained:!1,doNotSkipEncoded:!1},template:void 0,compile:void 0,log:!0};l.encodeHTMLSource=function(e){var t={\"&\":\"&#38;\",\"<\":\"&#60;\",\">\":\"&#62;\",'\"':\"&#34;\",\"'\":\"&#39;\",\"/\":\"&#47;\"},n=e?/[&<>\"'\\/]/g:/&(?!#?\\w+;)|<|>|\"|'|\\//g;return function(e){return e?e.toString().replace(n,function(e){return t[e]||e}):\"\"}},s=function(){return this||(0,eval)(\"this\")}(),void 0!==t&&t.exports?t.exports=l:\"function\"==typeof define&&define.amd?define(function(){return l}):s.doT=l;var c={append:{start:\"'+(\",end:\")+'\",startencode:\"'+encodeHTML(\"},split:{start:\"';out+=(\",end:\");out+='\",startencode:\"';out+=encodeHTML(\"}},d=/$^/;function m(e){return e.replace(/\\\\('|\\\\)/g,\"$1\").replace(/[\\r\\t\\n]/g,\" \")}l.template=function(e,t,n){var r,a,o=(t=t||l.templateSettings).append?c.append:c.split,i=0,u=t.use||t.define?function r(a,e,o){return(\"string\"==typeof e?e:e.toString()).replace(a.define||d,function(e,r,t,n){return 0===r.indexOf(\"def.\")&&(r=r.substring(4)),r in o||(\":\"===t?(a.defineParams&&n.replace(a.defineParams,function(e,t,n){o[r]={arg:t,text:n}}),r in o||(o[r]=n)):new Function(\"def\",\"def['\"+r+\"']=\"+n)(o)),\"\"}).replace(a.use||d,function(e,t){a.useParams&&(t=t.replace(a.useParams,function(e,t,n,r){if(o[n]&&o[n].arg&&r){var a=(n+\":\"+r).replace(/'|\\\\/g,\"_\");return o.__exp=o.__exp||{},o.__exp[a]=o[n].text.replace(new RegExp(\"(^|[^\\\\w$])\"+o[n].arg+\"([^\\\\w$])\",\"g\"),\"$1\"+r+\"$2\"),t+\"def.__exp['\"+a+\"']\"}}));var n=new Function(\"def\",\"return \"+t)(o);return n?r(a,n,o):n})}(t,e,n||{}):e;u=(\"var out='\"+(t.strip?u.replace(/(^|\\r|\\n)\\t* +| +\\t*(\\r|\\n|$)/g,\" \").replace(/\\r|\\n|\\t|\\/\\*[\\s\\S]*?\\*\\//g,\"\"):u).replace(/'|\\\\/g,\"\\\\$&\").replace(t.interpolate||d,function(e,t){return o.start+m(t)+o.end}).replace(t.encode||d,function(e,t){return r=!0,o.startencode+m(t)+o.end}).replace(t.conditional||d,function(e,t,n){return t?n?\"';}else if(\"+m(n)+\"){out+='\":\"';}else{out+='\":n?\"';if(\"+m(n)+\"){out+='\":\"';}out+='\"}).replace(t.iterate||d,function(e,t,n,r){return t?(i+=1,a=r||\"i\"+i,t=m(t),\"';var arr\"+i+\"=\"+t+\";if(arr\"+i+\"){var \"+n+\",\"+a+\"=-1,l\"+i+\"=arr\"+i+\".length-1;while(\"+a+\"<l\"+i+\"){\"+n+\"=arr\"+i+\"[\"+a+\"+=1];out+='\"):\"';} } out+='\"}).replace(t.evaluate||d,function(e,t){return\"';\"+m(t)+\"out+='\"})+\"';return out;\").replace(/\\n/g,\"\\\\n\").replace(/\\t/g,\"\\\\t\").replace(/\\r/g,\"\\\\r\").replace(/(\\s|;|\\}|^|\\{)out\\+='';/g,\"$1\").replace(/\\+''/g,\"\"),r&&(t.selfcontained||!s||s._encodeHTML||(s._encodeHTML=l.encodeHTMLSource(t.doNotSkipEncoded)),u=\"var encodeHTML = typeof _encodeHTML !== 'undefined' ? _encodeHTML : (\"+l.encodeHTMLSource.toString()+\"(\"+(t.doNotSkipEncoded||\"\")+\"));\"+u);try{return new Function(t.varname,u)}catch(e){throw\"undefined\"!=typeof console&&console.log(\"Could not create a template function: \"+u),e}},l.compile=function(e,t){return l.template(e,null,t)}}()},{}],31:[function(e,t,n){\"use strict\";t.exports=function(){return/\\uD83C\\uDFF4\\uDB40\\uDC67\\uDB40\\uDC62(?:\\uDB40\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67|\\uDB40\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDB40\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73)\\uDB40\\uDC7F|\\uD83D\\uDC68(?:\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C\\uDFFB|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFE])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83D\\uDC68|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D[\\uDC66\\uDC67])|[\\u2695\\u2696\\u2708]\\uFE0F|\\uD83D[\\uDC66\\uDC67]|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|(?:\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708])\\uFE0F|\\uD83C\\uDFFB\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C[\\uDFFB-\\uDFFF])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFB\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)\\uD83C\\uDFFB|\\uD83E\\uDDD1(?:\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1)|(?:\\uD83E\\uDDD1\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69]))(?:\\uD83C[\\uDFFB-\\uDFFE])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83D\\uDC69(?:\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFB\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFC-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D(?:\\uD83D[\\uDC68\\uDC69])|\\uD83D[\\uDC68\\uDC69])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]))|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|(?:\\uD83E\\uDDD1\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8|\\uD83D\\uDC69(?:\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\u200D[\\u2695\\u2696\\u2708])|(?:(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)\\uFE0F|\\uD83D\\uDC6F|\\uD83E[\\uDD3C\\uDDDE\\uDDDF])\\u200D[\\u2640\\u2642]|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|\\u200D[\\u2640\\u2642])|\\uD83C\\uDFF4\\u200D\\u2620)\\uFE0F|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83C\\uDFF3\\uFE0F\\u200D\\uD83C\\uDF08|\\uD83D\\uDC15\\u200D\\uD83E\\uDDBA|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67|\\uD83C\\uDDFD\\uD83C\\uDDF0|\\uD83C\\uDDF4\\uD83C\\uDDF2|\\uD83C\\uDDF6\\uD83C\\uDDE6|[#\\*0-9]\\uFE0F\\u20E3|\\uD83C\\uDDE7(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDF9(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF])|\\uD83C\\uDDEA(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA])|\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF7(?:\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC])|\\uD83D\\uDC69(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF2(?:\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF])|\\uD83C\\uDDE6(?:\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF])|\\uD83C\\uDDF0(?:\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDED(?:\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA])|\\uD83C\\uDDE9(?:\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF])|\\uD83C\\uDDFE(?:\\uD83C[\\uDDEA\\uDDF9])|\\uD83C\\uDDEC(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE])|\\uD83C\\uDDF8(?:\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF])|\\uD83C\\uDDEB(?:\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7])|\\uD83C\\uDDF5(?:\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE])|\\uD83C\\uDDFB(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA])|\\uD83C\\uDDF3(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF])|\\uD83C\\uDDE8(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF5\\uDDF7\\uDDFA-\\uDDFF])|\\uD83C\\uDDF1(?:\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE])|\\uD83C\\uDDFF(?:\\uD83C[\\uDDE6\\uDDF2\\uDDFC])|\\uD83C\\uDDFC(?:\\uD83C[\\uDDEB\\uDDF8])|\\uD83C\\uDDFA(?:\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF])|\\uD83C\\uDDEE(?:\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9])|\\uD83C\\uDDEF(?:\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5])|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u261D\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2\\uDFC7]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC70\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDCAA\\uDD74\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1C\\uDD1E\\uDD1F\\uDD30-\\uDD36\\uDDB5\\uDDB6\\uDDBB\\uDDD2-\\uDDD5])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u231A\\u231B\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u25FE\\u2614\\u2615\\u2648-\\u2653\\u267F\\u2693\\u26A1\\u26AA\\u26AB\\u26BD\\u26BE\\u26C4\\u26C5\\u26CE\\u26D4\\u26EA\\u26F2\\u26F3\\u26F5\\u26FA\\u26FD\\u2705\\u270A\\u270B\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2795-\\u2797\\u27B0\\u27BF\\u2B1B\\u2B1C\\u2B50\\u2B55]|\\uD83C[\\uDC04\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF7C\\uDF7E-\\uDF93\\uDFA0-\\uDFCA\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF4\\uDFF8-\\uDFFF]|\\uD83D[\\uDC00-\\uDC3E\\uDC40\\uDC42-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDD7A\\uDD95\\uDD96\\uDDA4\\uDDFB-\\uDE4F\\uDE80-\\uDEC5\\uDECC\\uDED0-\\uDED2\\uDED5\\uDEEB\\uDEEC\\uDEF4-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])|(?:[#\\*0-9\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23E9-\\u23F3\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB-\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u261D\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A1\\u26AA\\u26AB\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C5\\u26C8\\u26CE\\u26CF\\u26D1\\u26D3\\u26D4\\u26E9\\u26EA\\u26F0-\\u26F5\\u26F7-\\u26FA\\u26FD\\u2702\\u2705\\u2708-\\u270D\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2728\\u2733\\u2734\\u2744\\u2747\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2763\\u2764\\u2795-\\u2797\\u27A1\\u27B0\\u27BF\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B50\\u2B55\\u3030\\u303D\\u3297\\u3299]|\\uD83C[\\uDC04\\uDCCF\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE1A\\uDE2F\\uDE32-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF21\\uDF24-\\uDF93\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E-\\uDFF0\\uDFF3-\\uDFF5\\uDFF7-\\uDFFF]|\\uD83D[\\uDC00-\\uDCFD\\uDCFF-\\uDD3D\\uDD49-\\uDD4E\\uDD50-\\uDD67\\uDD6F\\uDD70\\uDD73-\\uDD7A\\uDD87\\uDD8A-\\uDD8D\\uDD90\\uDD95\\uDD96\\uDDA4\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA-\\uDE4F\\uDE80-\\uDEC5\\uDECB-\\uDED2\\uDED5\\uDEE0-\\uDEE5\\uDEE9\\uDEEB\\uDEEC\\uDEF0\\uDEF3-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])\\uFE0F|(?:[\\u261D\\u26F9\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2-\\uDFC4\\uDFC7\\uDFCA-\\uDFCC]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66-\\uDC78\\uDC7C\\uDC81-\\uDC83\\uDC85-\\uDC87\\uDC8F\\uDC91\\uDCAA\\uDD74\\uDD75\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE45-\\uDE47\\uDE4B-\\uDE4F\\uDEA3\\uDEB4-\\uDEB6\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1F\\uDD26\\uDD30-\\uDD39\\uDD3C-\\uDD3E\\uDDB5\\uDDB6\\uDDB8\\uDDB9\\uDDBB\\uDDCD-\\uDDCF\\uDDD1-\\uDDDD])/g}},{}],32:[function(V,n,r){(function(P,U){var e,t;e=this,t=function(){\"use strict\";function s(e){return\"function\"==typeof e}var n=Array.isArray?Array.isArray:function(e){return\"[object Array]\"===Object.prototype.toString.call(e)},r=0,t=void 0,a=void 0,i=function(e,t){m[r]=e,m[r+1]=t,2===(r+=2)&&(a?a(p):y())};var e=void 0!==window?window:void 0,o=e||{},u=o.MutationObserver||o.WebKitMutationObserver,l=\"undefined\"==typeof self&&void 0!==P&&\"[object process]\"==={}.toString.call(P),c=\"undefined\"!=typeof Uint8ClampedArray&&\"undefined\"!=typeof importScripts&&\"undefined\"!=typeof MessageChannel;function d(){var e=setTimeout;return function(){return e(p,1)}}var m=new Array(1e3);function p(){for(var e=0;e<r;e+=2){(0,m[e])(m[e+1]),m[e]=void 0,m[e+1]=void 0}r=0}var f,h,b,g,y=void 0;function v(e,t){var n=this,r=new this.constructor(k);void 0===r[w]&&O(r);var a=n._state;if(a){var o=arguments[a-1];i(function(){return S(a,r,o,n._result)})}else N(n,r,e,t);return r}function D(e){if(e&&\"object\"==typeof e&&e.constructor===this)return e;var t=new this(k);return F(t,e),t}y=l?function(){return P.nextTick(p)}:u?(h=0,b=new u(p),g=document.createTextNode(\"\"),b.observe(g,{characterData:!0}),function(){g.data=h=++h%2}):c?((f=new MessageChannel).port1.onmessage=p,function(){return f.port2.postMessage(0)}):void 0===e&&\"function\"==typeof V?function(){try{var e=Function(\"return this\")().require(\"vertx\");return void 0!==(t=e.runOnLoop||e.runOnContext)?function(){t(p)}:d()}catch(e){return d()}}():d();var w=Math.random().toString(36).substring(2);function k(){}var x=void 0,E=1,C=2;function A(e,t,n){t.constructor===e.constructor&&n===v&&t.constructor.resolve===D?function(t,e){e._state===E?z(t,e._result):e._state===C?q(t,e._result):N(e,void 0,function(e){return F(t,e)},function(e){return q(t,e)})}(e,t):void 0===n?z(e,t):s(n)?function(e,r,a){i(function(t){var n=!1,e=function(e,t,n,r){try{e.call(t,n,r)}catch(e){return e}}(a,r,function(e){n||(n=!0,r!==e?F(t,e):z(t,e))},function(e){n||(n=!0,q(t,e))},t._label);!n&&e&&(n=!0,q(t,e))},e)}(e,t,n):z(e,t)}function F(t,e){if(t===e)q(t,new TypeError(\"You cannot resolve a promise with itself\"));else if(function(e){var t=typeof e;return null!==e&&(\"object\"==t||\"function\"==t)}(e)){var n=void 0;try{n=e.then}catch(e){return void q(t,e)}A(t,e,n)}else z(t,e)}function j(e){e._onerror&&e._onerror(e._result),T(e)}function z(e,t){e._state===x&&(e._result=t,e._state=E,0!==e._subscribers.length&&i(T,e))}function q(e,t){e._state===x&&(e._state=C,e._result=t,i(j,e))}function N(e,t,n,r){var a=e._subscribers,o=a.length;e._onerror=null,a[o]=t,a[o+E]=n,a[o+C]=r,0===o&&e._state&&i(T,e)}function T(e){var t=e._subscribers,n=e._state;if(0!==t.length){for(var r=void 0,a=void 0,o=e._result,i=0;i<t.length;i+=3)r=t[i],a=t[i+n],r?S(n,r,a,o):a(o);e._subscribers.length=0}}function S(e,t,n,r){var a=s(n),o=void 0,i=void 0,u=!0;if(a){try{o=n(r)}catch(e){u=!1,i=e}if(t===o)return void q(t,new TypeError(\"A promises callback cannot return that same promise.\"))}else o=r;t._state!==x||(a&&u?F(t,o):!1===u?q(t,i):e===E?z(t,o):e===C&&q(t,o))}var R=0;function O(e){e[w]=R++,e._state=void 0,e._result=void 0,e._subscribers=[]}var _=(B.prototype._enumerate=function(e){for(var t=0;this._state===x&&t<e.length;t++)this._eachEntry(e[t],t)},B.prototype._eachEntry=function(t,e){var n=this._instanceConstructor,r=n.resolve;if(r===D){var a=void 0,o=void 0,i=!1;try{a=t.then}catch(e){i=!0,o=e}if(a===v&&t._state!==x)this._settledAt(t._state,e,t._result);else if(\"function\"!=typeof a)this._remaining--,this._result[e]=t;else if(n===L){var u=new n(k);i?q(u,o):A(u,t,a),this._willSettleAt(u,e)}else this._willSettleAt(new n(function(e){return e(t)}),e)}else this._willSettleAt(r(t),e)},B.prototype._settledAt=function(e,t,n){var r=this.promise;r._state===x&&(this._remaining--,e===C?q(r,n):this._result[t]=n),0===this._remaining&&z(r,this._result)},B.prototype._willSettleAt=function(e,t){var n=this;N(e,void 0,function(e){return n._settledAt(E,t,e)},function(e){return n._settledAt(C,t,e)})},B);function B(e,t){this._instanceConstructor=e,this.promise=new e(k),this.promise[w]||O(this.promise),n(t)?(this.length=t.length,this._remaining=t.length,this._result=new Array(this.length),0===this.length?z(this.promise,this._result):(this.length=this.length||0,this._enumerate(t),0===this._remaining&&z(this.promise,this._result))):q(this.promise,new Error(\"Array Methods must be provided an Array\"))}var L=(I.prototype.catch=function(e){return this.then(null,e)},I.prototype.finally=function(t){var n=this.constructor;return s(t)?this.then(function(e){return n.resolve(t()).then(function(){return e})},function(e){return n.resolve(t()).then(function(){throw e})}):this.then(t,t)},I);function I(e){this[w]=R++,this._result=this._state=void 0,this._subscribers=[],k!==e&&(\"function\"!=typeof e&&function(){throw new TypeError(\"You must pass a resolver function as the first argument to the promise constructor\")}(),this instanceof I?function(t,e){try{e(function(e){F(t,e)},function(e){q(t,e)})}catch(e){q(t,e)}}(this,e):function(){throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\")}())}return L.prototype.then=v,L.all=function(e){return new _(this,e).promise},L.race=function(a){var o=this;return n(a)?new o(function(e,t){for(var n=a.length,r=0;r<n;r++)o.resolve(a[r]).then(e,t)}):new o(function(e,t){return t(new TypeError(\"You must pass an array to race.\"))})},L.resolve=D,L.reject=function(e){var t=new this(k);return q(t,e),t},L._setScheduler=function(e){a=e},L._setAsap=function(e){i=e},L._asap=i,L.polyfill=function(){var e=void 0;if(void 0!==U)e=U;else if(\"undefined\"!=typeof self)e=self;else try{e=Function(\"return this\")()}catch(e){throw new Error(\"polyfill failed because global object is unavailable in this environment\")}var t=e.Promise;if(t){var n=null;try{n=Object.prototype.toString.call(t.resolve())}catch(e){}if(\"[object Promise]\"===n&&!t.cast)return}e.Promise=L},L.Promise=L},\"object\"==typeof r&&void 0!==n?n.exports=t():\"function\"==typeof define&&define.amd?define(t):e.ES6Promise=t()}).call(this,V(\"_process\"),void 0!==a?a:\"undefined\"!=typeof self?self:void 0!==window?window:{})},{_process:33}],33:[function(e,t,n){var r,a,o=t.exports={};function i(){throw new Error(\"setTimeout has not been defined\")}function u(){throw new Error(\"clearTimeout has not been defined\")}function s(t){if(r===setTimeout)return setTimeout(t,0);if((r===i||!r)&&setTimeout)return r=setTimeout,setTimeout(t,0);try{return r(t,0)}catch(e){try{return r.call(null,t,0)}catch(e){return r.call(this,t,0)}}}!function(){try{r=\"function\"==typeof setTimeout?setTimeout:i}catch(e){r=i}try{a=\"function\"==typeof clearTimeout?clearTimeout:u}catch(e){a=u}}();var l,c=[],d=!1,m=-1;function p(){d&&l&&(d=!1,l.length?c=l.concat(c):m=-1,c.length&&f())}function f(){if(!d){var e=s(p);d=!0;for(var t=c.length;t;){for(l=c,c=[];++m<t;)l&&l[m].run();m=-1,t=c.length}l=null,d=!1,function(t){if(a===clearTimeout)return clearTimeout(t);if((a===u||!a)&&clearTimeout)return a=clearTimeout,clearTimeout(t);try{a(t)}catch(e){try{return a.call(null,t)}catch(e){return a.call(this,t)}}}(e)}}function h(e,t){this.fun=e,this.array=t}function b(){}o.nextTick=function(e){var t=new Array(arguments.length-1);if(1<arguments.length)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];c.push(new h(e,t)),1!==c.length||d||s(f)},h.prototype.run=function(){this.fun.apply(null,this.array)},o.title=\"browser\",o.browser=!0,o.env={},o.argv=[],o.version=\"\",o.versions={},o.on=b,o.addListener=b,o.once=b,o.off=b,o.removeListener=b,o.removeAllListeners=b,o.emit=b,o.prependListener=b,o.prependOnceListener=b,o.listeners=function(e){return[]},o.binding=function(e){throw new Error(\"process.binding is not supported\")},o.cwd=function(){return\"/\"},o.chdir=function(e){throw new Error(\"process.chdir is not supported\")},o.umask=function(){return 0}},{}],34:[function(e,t,n){(function(e){!function(e){\"use strict\";if(!e.WeakMap){var n=Object.prototype.hasOwnProperty,r=function(e,t,n){Object.defineProperty?Object.defineProperty(e,t,{configurable:!0,writable:!0,value:n}):e[t]=n};e.WeakMap=(r(t.prototype,\"delete\",function(e){if(a(this,\"delete\"),!i(e))return!1;var t=e[this._id];return!(!t||t[0]!==e||(delete e[this._id],0))}),r(t.prototype,\"get\",function(e){if(a(this,\"get\"),i(e)){var t=e[this._id];return t&&t[0]===e?t[1]:void 0}}),r(t.prototype,\"has\",function(e){if(a(this,\"has\"),!i(e))return!1;var t=e[this._id];return!(!t||t[0]!==e)}),r(t.prototype,\"set\",function(e,t){if(a(this,\"set\"),!i(e))throw new TypeError(\"Invalid value used as weak map key\");var n=e[this._id];return n&&n[0]===e?n[1]=t:r(e,this._id,[e,t]),this}),r(t,\"_polyfill\",!0),t)}function t(){if(void 0===this)throw new TypeError(\"Constructor WeakMap requires 'new'\");if(r(this,\"_id\",function(e){return e+\"_\"+o()+\".\"+o()}(\"_WeakMap\")),0<arguments.length)throw new TypeError(\"WeakMap iterable is not supported\")}function a(e,t){if(!i(e)||!n.call(e,\"_id\"))throw new TypeError(t+\" method called on incompatible receiver \"+typeof e)}function o(){return Math.random().toString().substring(2)}function i(e){return Object(e)===e}}(\"undefined\"!=typeof self?self:void 0!==window?window:void 0!==e?e:this)}).call(this,void 0!==a?a:\"undefined\"!=typeof self?self:void 0!==window?window:{})},{}]},{},[1]);var utils=axe.utils={},u={};function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function t(e,t,n){\"use strict\";var r,a;for(r=0,a=e.length;r<a;r++)t[n](e[r])}function n(e){this.brand=\"axe\",this.application=\"axeAPI\",this.tagExclude=[\"experimental\"],this.defaultConfig=e,this._init(),this._defaultLocale=null}n.prototype._setDefaultLocale=function(){if(!this._defaultLocale){for(var e={checks:{},rules:{}},t=Object.keys(this.data.checks),n=0;n<t.length;n++){var r=t[n],a=this.data.checks[r].messages,o=a.pass,i=a.fail,u=a.incomplete;e.checks[r]={pass:o,fail:i,incomplete:u}}for(var s=Object.keys(this.data.rules),l=0;l<s.length;l++){var c=s[l],d=this.data.rules[c],m=d.description,p=d.help;e.rules[c]={description:m,help:p}}this._defaultLocale=e}},n.prototype._resetLocale=function(){var e=this._defaultLocale;e&&this.applyLocale(e)};function c(a,e,o){return o.performanceTimer&&axe.utils.performanceTimer.mark(\"mark_rule_start_\"+a.id),function(n,r){a.run(e,o,function(e){n(e)},function(e){if(o.debug)r(e);else{var t=Object.assign(new f(a),{result:axe.constants.CANTTELL,description:\"An error occured while running this rule\",message:e.message,stack:e.stack,error:e,errorNode:e.errorNode});n(t)}})}}function o(e,t,n){var r=e.brand,a=e.application;return axe.constants.helpUrlBase+r+\"/\"+(n||axe.version.substring(0,axe.version.lastIndexOf(\".\")))+\"/\"+t+\"?application=\"+a}function d(e){\"use strict\";this.id=e.id,this.data=null,this.relatedNodes=[],this.result=null}function r(e){\"use strict\";return\"string\"==typeof e?new Function(\"return \"+e+\";\")():e}function i(e){e&&(this.id=e.id,this.configure(e))}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function s(e,t,n){\"use strict\";var r,a;e.frames=e.frames||[];var o=document.querySelectorAll(n.shift());e:for(var i=0,u=o.length;i<u;i++){a=o[i];for(var s=0,l=e.frames.length;s<l;s++)if(e.frames[s].node===a){e.frames[s][t].push(n);break e}r={node:a,include:[],exclude:[]},n&&r[t].push(n),e.frames.push(r)}}function m(e,t){\"use strict\";for(var n,r,a=[],o=0,i=e[t].length;o<i;o++){if(\"string\"==typeof(n=e[t][o])){r=Array.from(document.querySelectorAll(n)),a=a.concat(r.map(function(e){return axe.utils.getNodeFromTree(e)}));break}!n||!n.length||n instanceof Node?n instanceof Node&&(n.documentElement instanceof Node?a.push(e.flatTree[0]):a.push(axe.utils.getNodeFromTree(n))):1<n.length?s(e,t,n):(r=Array.from(document.querySelectorAll(n[0])),a=a.concat(r.map(function(e){return axe.utils.getNodeFromTree(e)})))}return a.filter(function(e){return e})}function p(e){\"use strict\";var t=this;this.frames=[],this.initiator=!e||\"boolean\"!=typeof e.initiator||e.initiator,this.page=!1,e=function(e){\"use strict\";if(e&&\"object\"===S(e)||e instanceof NodeList){if(e instanceof Node)return{include:[e],exclude:[]};if(e.hasOwnProperty(\"include\")||e.hasOwnProperty(\"exclude\"))return{include:e.include&&+e.include.length?e.include:[document],exclude:e.exclude||[]};if(e.length===+e.length)return{include:e,exclude:[]}}return\"string\"==typeof e?{include:[e],exclude:[]}:{include:[document],exclude:[]}}(e),this.flatTree=axe.utils.getFlattenedTree(function(e){var t=e.include,n=e.exclude;return(Array.from(t).concat(Array.from(n)).reduce(function(e,t){return e||(t instanceof Element?t.ownerDocument:t instanceof Document?t:void 0)},null)||document).documentElement}(e)),this.exclude=e.exclude,this.include=e.include,this.include=m(this,\"include\"),this.exclude=m(this,\"exclude\"),axe.utils.select(\"frame, iframe\",this).forEach(function(e){Be(e,t)&&function(e,t){\"use strict\";axe.utils.isHidden(t)||axe.utils.findBy(e,\"node\",t)||e.push({node:t,include:[],exclude:[]})}(t.frames,e.actualNode)}),1===this.include.length&&this.include[0].actualNode===document.documentElement&&(this.page=!0);var n=function(e){\"use strict\";if(0===e.include.length){if(0===e.frames.length){var t=axe.utils.respondable.isInFrame()?\"frame\":\"page\";return new Error(\"No elements found for include in \"+t+\" Context\")}e.frames.forEach(function(e,t){if(0===e.include.length)return new Error(\"No elements found for include in Context of frame \"+t)})}}(this);if(n instanceof Error)throw n;Array.isArray(this.include)||(this.include=Array.from(this.include)),this.include.sort(axe.utils.nodeSorter)}function f(e){\"use strict\";this.id=e.id,this.result=axe.constants.NA,this.pageLevel=e.pageLevel,this.impact=null,this.nodes=[]}function h(e,t){\"use strict\";this._audit=t,this.id=e.id,this.selector=e.selector||\"*\",this.excludeHidden=\"boolean\"!=typeof e.excludeHidden||e.excludeHidden,this.enabled=\"boolean\"!=typeof e.enabled||e.enabled,this.pageLevel=\"boolean\"==typeof e.pageLevel&&e.pageLevel,this.any=e.any||[],this.all=e.all||[],this.none=e.none||[],this.tags=e.tags||[],this.preload=!!e.preload,e.matches&&(this.matches=r(e.matches))}function b(e){if(e.length){var n=!1,r={};return e.forEach(function(e){var t=e.results.filter(function(e){return e});(r[e.type]=t).length&&(n=!0)}),n?r:null}}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function g(e){return(g=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)})(e)}function y(e){if(void 0===e)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}function v(e,t){return(v=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e})(e,t)}function D(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function w(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function k(e,t,n){return t&&w(e.prototype,t),n&&w(e,n),e}n.prototype._applyCheckLocale=function(e){for(var t,n,r,a,o=Object.keys(e),i=0;i<o.length;i++){var u=o[i];if(!this.data.checks[u])throw new Error('Locale provided for unknown check: \"'.concat(u,'\"'));this.data.checks[u]=(t=this.data.checks[u],n=e[u],a=r=void 0,r=n.pass,a=n.fail,\"string\"==typeof r&&(r=axe.imports.doT.compile(r)),\"string\"==typeof a&&(a=axe.imports.doT.compile(a)),R({},t,{messages:{pass:r||t.messages.pass,fail:a||t.messages.fail,incomplete:\"object\"===S(t.messages.incomplete)?R({},t.messages.incomplete,n.incomplete):n.incomplete}}))}},n.prototype._applyRuleLocale=function(e){for(var t,n,r,a,o=Object.keys(e),i=0;i<o.length;i++){var u=o[i];if(!this.data.rules[u])throw new Error('Locale provided for unknown rule: \"'.concat(u,'\"'));this.data.rules[u]=(t=this.data.rules[u],n=e[u],a=r=void 0,r=n.help,a=n.description,\"string\"==typeof r&&(r=axe.imports.doT.compile(r)),\"string\"==typeof a&&(a=axe.imports.doT.compile(a)),R({},t,{help:r||t.help,description:a||t.description}))}},n.prototype.applyLocale=function(e){this._setDefaultLocale(),e.checks&&this._applyCheckLocale(e.checks),e.rules&&this._applyRuleLocale(e.rules)},n.prototype._init=function(){var e=function(e){\"use strict\";var t;return e?(t=axe.utils.clone(e)).commons=e.commons:t={},t.reporter=t.reporter||null,t.rules=t.rules||[],t.checks=t.checks||[],t.data=R({checks:{},rules:{}},t.data),t}(this.defaultConfig);axe.commons=e.commons,this.reporter=e.reporter,this.commands={},this.rules=[],this.checks={},t(e.rules,this,\"addRule\"),t(e.checks,this,\"addCheck\"),this.data={},this.data.checks=e.data&&e.data.checks||{},this.data.rules=e.data&&e.data.rules||{},this.data.failureSummaries=e.data&&e.data.failureSummaries||{},this.data.incompleteFallbackMessage=e.data&&e.data.incompleteFallbackMessage||\"\",this._constructHelpUrls()},n.prototype.registerCommand=function(e){\"use strict\";this.commands[e.id]=e.callback},n.prototype.addRule=function(e){\"use strict\";e.metadata&&(this.data.rules[e.id]=e.metadata);var t=this.getRule(e.id);t?t.configure(e):this.rules.push(new h(e,this))},n.prototype.addCheck=function(e){\"use strict\";var t=e.metadata;\"object\"===S(t)&&(this.data.checks[e.id]=t,\"object\"===S(t.messages)&&Object.keys(t.messages).filter(function(e){return t.messages.hasOwnProperty(e)&&\"string\"==typeof t.messages[e]}).forEach(function(e){0===t.messages[e].indexOf(\"function\")&&(t.messages[e]=new Function(\"return \"+t.messages[e]+\";\")())})),this.checks[e.id]?this.checks[e.id].configure(e):this.checks[e.id]=new i(e)},n.prototype.run=function(o,i,u,s){\"use strict\";this.normalizeOptions(i),axe._selectCache=[];var e=function(e,n,r){return e.reduce(function(e,t){return axe.utils.ruleShouldRun(t,n,r)&&(t.preload?e.later.push(t):e.now.push(t)),e},{now:[],later:[]})}(this.rules,o,i),t=e.now,l=e.later,n=axe.utils.queue();t.forEach(function(e){n.defer(c(e,o,i))});var r=axe.utils.queue();l.length&&r.defer(function(t){axe.utils.preload(i).then(function(e){return t(e)}).catch(function(e){console.warn(\"Couldn't load preload assets: \",e),t(void 0)})});var a=axe.utils.queue();a.defer(n),a.defer(r),a.then(function(e){var t=e.pop();if(t&&t.length){var n=t[0];n&&(o=R({},o,n))}var r=e[0];if(!l.length)return axe._selectCache=void 0,void u(r.filter(function(e){return!!e}));var a=axe.utils.queue();l.forEach(function(e){var t=c(e,o,i);a.defer(t)}),a.then(function(e){axe._selectCache=void 0,u(r.concat(e).filter(function(e){return!!e}))}).catch(s)}).catch(s)},n.prototype.after=function(e,n){\"use strict\";var r=this.rules;return e.map(function(e){var t=axe.utils.findBy(r,\"id\",e.id);if(!t)throw new Error(\"Result for unknown rule. You may be running mismatch axe-core versions\");return t.after(e,n)})},n.prototype.getRule=function(t){return this.rules.find(function(e){return e.id===t})},n.prototype.normalizeOptions=function(e){\"use strict\";var t=this;if(\"object\"===S(e.runOnly)){Array.isArray(e.runOnly)&&(e.runOnly={type:\"tag\",values:e.runOnly});var n=e.runOnly;if(n.value&&!n.values&&(n.values=n.value,delete n.value),!Array.isArray(n.values)||0===n.values.length)throw new Error(\"runOnly.values must be a non-empty array\");if([\"rule\",\"rules\"].includes(n.type))n.type=\"rule\",n.values.forEach(function(e){if(!t.getRule(e))throw new Error(\"unknown rule `\"+e+\"` in options.runOnly\")});else{if(![\"tag\",\"tags\",void 0].includes(n.type))throw new Error(\"Unknown runOnly type '\".concat(n.type,\"'\"));n.type=\"tag\";var r=t.rules.reduce(function(e,t){return e.length?e.filter(function(e){return!t.tags.includes(e)}):e},n.values);0!==r.length&&axe.log(\"Could not find tags `\"+r.join(\"`, `\")+\"`\")}}return\"object\"===S(e.rules)&&Object.keys(e.rules).forEach(function(e){if(!t.getRule(e))throw new Error(\"unknown rule `\"+e+\"` in options.rules\")}),e},n.prototype.setBranding=function(e){\"use strict\";var t={brand:this.brand,application:this.application};e&&e.hasOwnProperty(\"brand\")&&e.brand&&\"string\"==typeof e.brand&&(this.brand=e.brand),e&&e.hasOwnProperty(\"application\")&&e.application&&\"string\"==typeof e.application&&(this.application=e.application),this._constructHelpUrls(t)},n.prototype._constructHelpUrls=function(){var n=this,r=0<arguments.length&&void 0!==arguments[0]?arguments[0]:null,a=(axe.version.match(/^[1-9][0-9]*\\.[0-9]+/)||[\"x.y\"])[0];this.rules.forEach(function(e){n.data.rules[e.id]||(n.data.rules[e.id]={});var t=n.data.rules[e.id];(\"string\"!=typeof t.helpUrl||r&&t.helpUrl===o(r,e.id,a))&&(t.helpUrl=o(n,e.id,a))})},n.prototype.resetRulesAndChecks=function(){\"use strict\";this._init(),this._resetLocale()},function(){\"use strict\";var n={},e={set:function(e,t){n[e]=t},get:function(e){return n[e]},clear:function(){n={}}};axe._cache=e}(),i.prototype.enabled=!0,i.prototype.run=function(t,e,n,r,a){\"use strict\";var o=(e=e||{}).hasOwnProperty(\"enabled\")?e.enabled:this.enabled,i=e.options||this.options;if(o){var u,s=new d(this),l=axe.utils.checkHelper(s,e,r,a);try{u=this.evaluate.call(l,t.actualNode,i,t,n)}catch(e){return t&&t.actualNode&&(e.errorNode=new X(t.actualNode).toJSON()),void a(e)}l.isAsync||(s.result=u,r(s))}else r(null)},i.prototype.runSync=function(t,e,n){var r=(e=e||{}).enabled;if(!(void 0===r?this.enabled:r))return null;var a,o=e.options||this.options,i=new d(this),u=axe.utils.checkHelper(i,e);u.async=function(){throw new Error(\"Cannot run async check while in a synchronous run\")};try{a=this.evaluate.call(u,t.actualNode,o,t,n)}catch(e){throw t&&t.actualNode&&(e.errorNode=new X(t.actualNode).toJSON()),e}return i.result=a,i},i.prototype.configure=function(t){var n=this;[\"options\",\"enabled\"].filter(function(e){return t.hasOwnProperty(e)}).forEach(function(e){return n[e]=t[e]}),[\"evaluate\",\"after\"].filter(function(e){return t.hasOwnProperty(e)}).forEach(function(e){return n[e]=r(t[e])})},h.prototype.matches=function(){\"use strict\";return!0},h.prototype.gather=function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},n=\"mark_gather_start_\"+this.id,r=\"mark_gather_end_\"+this.id,a=\"mark_isHidden_start_\"+this.id,o=\"mark_isHidden_end_\"+this.id;t.performanceTimer&&axe.utils.performanceTimer.mark(n);var i=axe.utils.select(this.selector,e);return this.excludeHidden&&(t.performanceTimer&&axe.utils.performanceTimer.mark(a),i=i.filter(function(e){return!axe.utils.isHidden(e.actualNode)}),t.performanceTimer&&(axe.utils.performanceTimer.mark(o),axe.utils.performanceTimer.measure(\"rule_\"+this.id+\"#gather_axe.utils.isHidden\",a,o))),t.performanceTimer&&(axe.utils.performanceTimer.mark(r),axe.utils.performanceTimer.measure(\"rule_\"+this.id+\"#gather\",n,r)),i},h.prototype.runChecks=function(t,a,o,i,n,e){\"use strict\";var u=this,s=axe.utils.queue();this[t].forEach(function(e){var n=u._audit.checks[e.id||e],r=axe.utils.getCheckOption(n,u.id,o);s.defer(function(e,t){n.run(a,r,i,e,t)})}),s.then(function(e){e=e.filter(function(e){return e}),n({type:t,results:e})}).catch(e)},h.prototype.runChecksSync=function(e,r,a,o){\"use strict\";var i=this,u=[];return this[e].forEach(function(e){var t=i._audit.checks[e.id||e],n=axe.utils.getCheckOption(t,i.id,a);u.push(t.runSync(r,n,o))}),{type:e,results:u=u.filter(function(e){return e})}},h.prototype.run=function(a){var o=this,i=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},e=2<arguments.length?arguments[2]:void 0,t=3<arguments.length?arguments[3]:void 0;i.performanceTimer&&this._trackPerformance();var n,u=axe.utils.queue(),s=new f(this);try{n=this.gatherAndMatchNodes(a,i)}catch(e){return void t(new l({cause:e,ruleId:this.id}))}i.performanceTimer&&this._logGatherPerformance(n),n.forEach(function(r){u.defer(function(n,t){var e=axe.utils.queue();[\"any\",\"all\",\"none\"].forEach(function(n){e.defer(function(e,t){o.runChecks(n,r,i,a,e,t)})}),e.then(function(e){var t=b(e);t&&(t.node=new axe.utils.DqElement(r.actualNode,i),s.nodes.push(t)),n()}).catch(function(e){return t(e)})})}),u.defer(function(e){return setTimeout(e,0)}),i.performanceTimer&&this._logRulePerformance(),u.then(function(){return e(s)}).catch(function(e){return t(e)})},h.prototype.runSync=function(r){var a=this,o=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{};o.performanceTimer&&this._trackPerformance();var e,i=new f(this);try{e=this.gatherAndMatchNodes(r,o)}catch(e){throw new l({cause:e,ruleId:this.id})}return o.performanceTimer&&this._logGatherPerformance(e),e.forEach(function(t){var n=[];[\"any\",\"all\",\"none\"].forEach(function(e){n.push(a.runChecksSync(e,t,o,r))});var e=b(n);e&&(e.node=t.actualNode?new axe.utils.DqElement(t.actualNode,o):null,i.nodes.push(e))}),o.performanceTimer&&this._logRulePerformance(),i},h.prototype._trackPerformance=function(){this._markStart=\"mark_rule_start_\"+this.id,this._markEnd=\"mark_rule_end_\"+this.id,this._markChecksStart=\"mark_runchecks_start_\"+this.id,this._markChecksEnd=\"mark_runchecks_end_\"+this.id},h.prototype._logGatherPerformance=function(e){axe.log(\"gather (\",e.length,\"):\",axe.utils.performanceTimer.timeElapsed()+\"ms\"),axe.utils.performanceTimer.mark(this._markChecksStart)},h.prototype._logRulePerformance=function(){axe.utils.performanceTimer.mark(this._markChecksEnd),axe.utils.performanceTimer.mark(this._markEnd),axe.utils.performanceTimer.measure(\"runchecks_\"+this.id,this._markChecksStart,this._markChecksEnd),axe.utils.performanceTimer.measure(\"rule_\"+this.id,this._markStart,this._markEnd)},h.prototype.gatherAndMatchNodes=function(t,e){var n=this,r=\"mark_matches_start_\"+this.id,a=\"mark_matches_end_\"+this.id,o=this.gather(t,e);return e.performanceTimer&&axe.utils.performanceTimer.mark(r),o=o.filter(function(e){return n.matches(e.actualNode,e,t)}),e.performanceTimer&&(axe.utils.performanceTimer.mark(a),axe.utils.performanceTimer.measure(\"rule_\"+this.id+\"#matches\",r,a)),o},h.prototype.after=function(a,o){\"use strict\";var e=function(n){\"use strict\";return axe.utils.getAllChecks(n).map(function(e){var t=n._audit.checks[e.id||e];return t&&\"function\"==typeof t.after?t:null}).filter(Boolean)}(this),i=this.id;return e.forEach(function(e){var t=function(e,t){\"use strict\";var n=[];return e.forEach(function(e){axe.utils.getAllChecks(e).forEach(function(e){e.id===t&&n.push(e)})}),n}(a.nodes,e.id),n=axe.utils.getCheckOption(e,i,o),r=e.after(t,n);t.forEach(function(e){-1===r.indexOf(e)&&(e.filtered=!0)})}),a.nodes=function(e){\"use strict\";var r=[\"any\",\"all\",\"none\"],t=e.nodes.filter(function(t){var n=0;return r.forEach(function(e){t[e]=function(e){\"use strict\";return e.filter(function(e){return!0!==e.filtered})}(t[e]),n+=t[e].length}),0<n});return e.pageLevel&&t.length&&(t=[t.reduce(function(t,n){if(t)return r.forEach(function(e){t[e].push.apply(t[e],n[e])}),t})]),t}(a),a},h.prototype.configure=function(e){\"use strict\";e.hasOwnProperty(\"selector\")&&(this.selector=e.selector),e.hasOwnProperty(\"excludeHidden\")&&(this.excludeHidden=\"boolean\"!=typeof e.excludeHidden||e.excludeHidden),e.hasOwnProperty(\"enabled\")&&(this.enabled=\"boolean\"!=typeof e.enabled||e.enabled),e.hasOwnProperty(\"pageLevel\")&&(this.pageLevel=\"boolean\"==typeof e.pageLevel&&e.pageLevel),e.hasOwnProperty(\"any\")&&(this.any=e.any),e.hasOwnProperty(\"all\")&&(this.all=e.all),e.hasOwnProperty(\"none\")&&(this.none=e.none),e.hasOwnProperty(\"tags\")&&(this.tags=e.tags),e.hasOwnProperty(\"matches\")&&(\"string\"==typeof e.matches?this.matches=new Function(\"return \"+e.matches+\";\")():this.matches=e.matches)};var x=/[\\t\\r\\n\\f]/g,E=(k(C,[{key:\"hasClass\",value:function(){throw new Error('VirtualNode class must have a \"hasClass\" function')}},{key:\"attr\",value:function(){throw new Error('VirtualNode class must have a \"attr\" function')}},{key:\"hasAttr\",value:function(){throw new Error('VirtualNode class must have a \"hasAttr\" function')}},{key:\"props\",get:function(){throw new Error('VirtualNode class must have a \"props\" object consisting of \"nodeType\" and \"nodeName\" properties')}}]),C);function C(){D(this,C),this.children=[],this.parent=null}var A=(function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&v(e,t)}(F,E),k(F,[{key:\"hasClass\",value:function(e){var t=this.attr(\"class\");if(!t)return!1;var n=\" \"+e+\" \";return 0<=(\" \"+t+\" \").replace(x,\" \").indexOf(n)}},{key:\"attr\",value:function(e){return\"function\"!=typeof this.actualNode.getAttribute?null:this.actualNode.getAttribute(e)}},{key:\"hasAttr\",value:function(e){return\"function\"==typeof this.actualNode.hasAttribute&&this.actualNode.hasAttribute(e)}},{key:\"props\",get:function(){var e=this.actualNode,t=e.nodeType,n=e.nodeName,r=e.id,a=e.type;return{nodeType:t,nodeName:n.toLowerCase(),id:r,type:a}}},{key:\"isFocusable\",get:function(){return this._cache.hasOwnProperty(\"isFocusable\")||(this._cache.isFocusable=axe.commons.dom.isFocusable(this.actualNode)),this._cache.isFocusable}},{key:\"tabbableElements\",get:function(){return this._cache.hasOwnProperty(\"tabbableElements\")||(this._cache.tabbableElements=axe.commons.dom.getTabbableElements(this)),this._cache.tabbableElements}}]),F);function F(e,t,n){var r;return D(this,F),(r=function(e,t){return!t||\"object\"!==S(t)&&\"function\"!=typeof t?y(e):t}(this,g(F).call(this))).shadowId=n,r.children=[],r.actualNode=e,r.parent=t,r._isHidden=null,r._cache={},axe._cache.get(\"nodeMap\")&&axe._cache.get(\"nodeMap\").set(e,y(r)),r}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function j(t,n){\"use strict\";if(t=t||function(){},n=n||axe.log,!axe._audit)throw new Error(\"No audit configured\");var r=axe.utils.queue(),a=[];Object.keys(axe.plugins).forEach(function(e){r.defer(function(t){function n(e){a.push(e),t()}try{axe.plugins[e].cleanup(t,n)}catch(e){n(e)}})});var e=axe.utils.getFlattenedTree(document.body);axe.utils.querySelectorAll(e,\"iframe, frame\").forEach(function(n){r.defer(function(e,t){return axe.utils.sendCommandToFrame(n.actualNode,{command:\"cleanup-plugin\"},e,t)})}),r.then(function(e){0===a.length?t(e):n(a)}).catch(n)}function z(e,t,n){\"use strict\";function r(e){e instanceof Error==!1&&(e=new Error(e)),n(e)}var a=n,o=e&&e.context||{};o.hasOwnProperty(\"include\")&&!o.include.length&&(o.include=[document]);var i=e&&e.options||{};switch(e.command){case\"rules\":return _(o,i,function(e,t){a(e),t()},r);case\"cleanup-plugin\":return j(a,r);default:if(axe._audit&&axe._audit.commands&&axe._audit.commands[e.command])return axe._audit.commands[e.command](e,n)}}function q(e){\"use strict\";this._run=e.run,this._collect=e.collect,this._registry={},e.commands.forEach(function(e){axe._audit.registerCommand(e)})}axe.AbstractVirtualNode=E,function(axe){var o={helpUrlBase:\"https://dequeuniversity.com/rules/\",results:[],resultGroups:[],resultGroupMap:{},impact:Object.freeze([\"minor\",\"moderate\",\"serious\",\"critical\"]),preload:Object.freeze({assets:[\"cssom\"],timeout:1e4})};[{name:\"NA\",value:\"inapplicable\",priority:0,group:\"inapplicable\"},{name:\"PASS\",value:\"passed\",priority:1,group:\"passes\"},{name:\"CANTTELL\",value:\"cantTell\",priority:2,group:\"incomplete\"},{name:\"FAIL\",value:\"failed\",priority:3,group:\"violations\"}].forEach(function(e){var t=e.name,n=e.value,r=e.priority,a=e.group;o[t]=n,o[t+\"_PRIO\"]=r,o[t+\"_GROUP\"]=a,o.results[r]=n,o.resultGroups[r]=a,o.resultGroupMap[n]=a}),Object.freeze(o.results),Object.freeze(o.resultGroups),Object.freeze(o.resultGroupMap),Object.freeze(o),Object.defineProperty(axe,\"constants\",{value:o,enumerable:!0,configurable:!1,writable:!1})}(axe),axe.log=function(){\"use strict\";\"object\"===(\"undefined\"==typeof console?\"undefined\":S(console))&&console.log&&Function.prototype.apply.call(console.log,console,arguments)},axe.cleanup=j,axe.configure=function(e){\"use strict\";var t;if(!(t=axe._audit))throw new Error(\"No audit configured\");e.reporter&&(\"function\"==typeof e.reporter||T[e.reporter])&&(t.reporter=e.reporter),e.checks&&e.checks.forEach(function(e){t.addCheck(e)});var n=[];e.rules&&e.rules.forEach(function(e){n.push(e.id),t.addRule(e)}),e.disableOtherRules&&t.rules.forEach(function(e){!1===n.includes(e.id)&&(e.enabled=!1)}),void 0!==e.branding?t.setBranding(e.branding):t._constructHelpUrls(),e.tagExclude&&(t.tagExclude=e.tagExclude),e.locale&&t.applyLocale(e.locale)},axe.getRules=function(e){\"use strict\";var t=(e=e||[]).length?axe._audit.rules.filter(function(t){return!!e.filter(function(e){return-1!==t.tags.indexOf(e)}).length}):axe._audit.rules,n=axe._audit.data.rules||{};return t.map(function(e){var t=n[e.id]||{};return{ruleId:e.id,description:t.description,help:t.help,helpUrl:t.helpUrl,tags:e.tags}})},axe._load=function(e){\"use strict\";axe.utils.respondable.subscribe(\"axe.ping\",function(e,t,n){n({axe:!0})}),axe.utils.respondable.subscribe(\"axe.start\",z),axe._audit=new n(e)},(axe=axe||{}).plugins={},q.prototype.run=function(){\"use strict\";return this._run.apply(this,arguments)},q.prototype.collect=function(){\"use strict\";return this._collect.apply(this,arguments)},q.prototype.cleanup=function(e){\"use strict\";var n=axe.utils.queue(),r=this;Object.keys(this._registry).forEach(function(t){n.defer(function(e){r._registry[t].cleanup(e)})}),n.then(function(){e()})},q.prototype.add=function(e){\"use strict\";this._registry[e.id]=e},axe.registerPlugin=function(e){\"use strict\";axe.plugins[e.id]=new q(e)};var N,T={};function O(){axe._cache.clear(),axe._tree=void 0,axe._selectorData=void 0}function _(n,r,a,o){\"use strict\";try{n=new p(n),axe._tree=n.flatTree,axe._selectorData=axe.utils.getSelectorData(n.flatTree)}catch(e){return O(),o(e)}var i,e=axe.utils.queue(),u=axe._audit;r.performanceTimer&&axe.utils.performanceTimer.auditStart(),n.frames.length&&!1!==r.iframes&&e.defer(function(e,t){axe.utils.collectResultsFromFrames(n,r,\"rules\",null,e,t)}),e.defer(function(e,t){r.restoreScroll&&(i=axe.utils.getScrollState()),u.run(n,r,e,t)}),e.then(function(e){try{i&&axe.utils.setScrollState(i),r.performanceTimer&&axe.utils.performanceTimer.auditEnd();var t=axe.utils.mergeResults(e.map(function(e){return{results:e}}));n.initiator&&((t=u.after(t,r)).forEach(axe.utils.publishMetaData),t=t.map(axe.utils.finalizeRuleResult));try{a(t,O)}catch(e){O(),axe.log(e)}}catch(e){O(),o(e)}}).catch(function(e){O(),o(e)})}function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}axe.getReporter=function(e){\"use strict\";return\"string\"==typeof e&&T[e]?T[e]:\"function\"==typeof e?e:N},axe.addReporter=function(e,t,n){\"use strict\";T[e]=t,n&&(N=t)},axe.reset=function(){\"use strict\";var e=axe._audit;if(!e)throw new Error(\"No audit configured\");e.resetRulesAndChecks()},axe._runRules=_,axe.runVirtualRule=function(t,e){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};n.reporter=n.reporter||axe._audit.reporter||\"v1\",axe._selectorData={};var r=axe._audit.rules.find(function(e){return e.id===t});if(!r)throw new Error(\"unknown rule `\"+t+\"`\");var a={include:[e]},o=(r=Object.create(r,{excludeHidden:{value:!1}})).runSync(a,n);axe.utils.publishMetaData(o),axe.utils.finalizeRuleResult(o);var i=axe.utils.aggregateResult([o]);return i.violations.forEach(function(e){return e.nodes.forEach(function(e){e.failureSummary=u.failureSummary(e)})}),R({},u.getEnvironmentData(),i,{toolOptions:n})};function B(){}function L(e,t,n){\"use strict\";var r=new TypeError(\"axe.run arguments are invalid\");if(!function(e){\"use strict\";switch(!0){case\"string\"==typeof e:case Array.isArray(e):case Node&&e instanceof Node:case NodeList&&e instanceof NodeList:return!0;case\"object\"!==S(e):return!1;case void 0!==e.include:case void 0!==e.exclude:case\"number\"==typeof e.length:return!0;default:return!1}}(e)){if(void 0!==n)throw r;n=t,t=e,e=document}if(\"object\"!==S(t)){if(void 0!==n)throw r;n=t,t={}}if(\"function\"!=typeof n&&void 0!==n)throw r;return{context:e,options:t,callback:n||B}}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}axe.run=function(e,a,o){\"use strict\";if(!axe._audit)throw new Error(\"No audit configured\");var t,n=L(e,a,o);e=n.context,a=n.options,o=n.callback,a.reporter=a.reporter||axe._audit.reporter||\"v1\",a.performanceTimer&&axe.utils.performanceTimer.start();var i=B,u=B;return\"function\"==typeof Promise&&o===B&&(t=new Promise(function(e,t){i=t,u=e})),axe._runRules(e,a,function(e,t){function n(e){t();try{o(null,e)}catch(e){axe.log(e)}u(e)}a.performanceTimer&&axe.utils.performanceTimer.end();try{var r=axe.getReporter(a.reporter)(e,a,n);void 0!==r&&n(r)}catch(e){t(),o(e),i(e)}},function(e){o(e),i(e)}),t},u.failureSummary=function(e){\"use strict\";var n={};return n.none=e.none.concat(e.all),n.any=e.any,Object.keys(n).map(function(e){if(n[e].length){var t=axe._audit.data.failureSummaries[e];return t&&\"function\"==typeof t.failureMessage?t.failureMessage(n[e].map(function(e){return e.message||\"\"})):void 0}}).filter(function(e){return void 0!==e}).join(\"\\n\\n\")},u.getEnvironmentData=function(e){var t=0<arguments.length&&void 0!==e?e:window,n=t.screen,r=void 0===n?{}:n,a=t.navigator,o=void 0===a?{}:a,i=t.location,u=void 0===i?{}:i,s=t.innerHeight,l=t.innerWidth,c=r.msOrientation||r.orientation||r.mozOrientation||{};return{testEngine:{name:\"axe-core\",version:axe.version},testRunner:{name:axe._audit.brand},testEnvironment:{userAgent:o.userAgent,windowWidth:l,windowHeight:s,orientationAngle:c.angle,orientationType:c.type},timestamp:(new Date).toISOString(),url:u.href}},u.incompleteFallbackMessage=function(){\"use strict\";return axe._audit.data.incompleteFallbackMessage()};var I=axe.constants.resultGroups;function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}u.processAggregate=function(e,n){var t=axe.utils.aggregateResult(e);return I.forEach(function(e){n.resultTypes&&!n.resultTypes.includes(e)&&(t[e]||[]).forEach(function(e){Array.isArray(e.nodes)&&0<e.nodes.length&&(e.nodes=[e.nodes[0]])}),t[e]=(t[e]||[]).map(function(t){return t=Object.assign({},t),Array.isArray(t.nodes)&&0<t.nodes.length&&(t.nodes=t.nodes.map(function(e){return\"object\"===S(e.node)&&(e.html=e.node.source,n.elementRef&&!e.node.fromFrame&&(e.element=e.node.element),!1===n.selectors&&!e.node.fromFrame||(e.target=e.node.selector),n.xpath&&(e.xpath=e.node.xpath)),delete e.result,delete e.node,function(t,n){\"use strict\";[\"any\",\"all\",\"none\"].forEach(function(e){Array.isArray(t[e])&&t[e].filter(function(e){return Array.isArray(e.relatedNodes)}).forEach(function(e){e.relatedNodes=e.relatedNodes.map(function(e){var t={html:e.source};return n.elementRef&&!e.fromFrame&&(t.element=e.element),!1===n.selectors&&!e.fromFrame||(t.target=e.selector),n.xpath&&(t.xpath=e.xpath),t})})})}(e,n),e})),I.forEach(function(e){return delete t[e]}),delete t.pageLevel,delete t.result,t})}),t},axe.addReporter(\"na\",function(e,t,n){\"use strict\";console.warn('\"na\" reporter will be deprecated in axe v4.0. Use the \"v2\" reporter instead.'),\"function\"==typeof t&&(n=t,t={});var r=u.processAggregate(e,t);n(R({},u.getEnvironmentData(),{toolOptions:t,violations:r.violations,passes:r.passes,incomplete:r.incomplete,inapplicable:r.inapplicable}))}),axe.addReporter(\"no-passes\",function(e,t,n){\"use strict\";\"function\"==typeof t&&(n=t,t={}),t.resultTypes=[\"violations\"];var r=u.processAggregate(e,t);n(R({},u.getEnvironmentData(),{toolOptions:t,violations:r.violations}))}),axe.addReporter(\"rawEnv\",function(e,t,n){\"function\"==typeof t&&(n=t,t={}),axe.getReporter(\"raw\")(e,t,function(e){var t=u.getEnvironmentData();n({raw:e,env:t})})}),axe.addReporter(\"raw\",function(e,t,n){\"use strict\";if(\"function\"==typeof t&&(n=t,t={}),!e||!Array.isArray(e))return n(e);n(e.map(function(e){for(var t=R({},e),n=0,r=[\"passes\",\"violations\",\"incomplete\",\"inapplicable\"];n<r.length;n++){var a=r[n];t[a]&&Array.isArray(t[a])&&(t[a]=t[a].map(function(e){return R({},e,{node:e.node.toJSON()})}))}return t}))}),axe.addReporter(\"v1\",function(e,t,n){\"use strict\";\"function\"==typeof t&&(n=t,t={});var r=u.processAggregate(e,t);r.violations.forEach(function(e){return e.nodes.forEach(function(e){e.failureSummary=u.failureSummary(e)})}),n(R({},u.getEnvironmentData(),{toolOptions:t,violations:r.violations,passes:r.passes,incomplete:r.incomplete,inapplicable:r.inapplicable}))}),axe.addReporter(\"v2\",function(e,t,n){\"use strict\";\"function\"==typeof t&&(n=t,t={});var r=u.processAggregate(e,t);n(R({},u.getEnvironmentData(),{toolOptions:t,violations:r.violations,passes:r.passes,incomplete:r.incomplete,inapplicable:r.inapplicable}))},!0),axe.utils.aggregate=function(t,e,n){e=e.slice(),n&&e.push(n);var r=e.map(function(e){return t.indexOf(e)}).sort();return t[r.pop()]};var P=axe.constants,U=P.CANTTELL_PRIO,V=P.FAIL_PRIO,M=[];M[axe.constants.PASS_PRIO]=!0,M[axe.constants.CANTTELL_PRIO]=null,M[axe.constants.FAIL_PRIO]=!1;var axe,H=[\"any\",\"all\",\"none\"];function G(n,r){return H.reduce(function(e,t){return e[t]=(n[t]||[]).map(function(e){return r(e,t)}),e},{})}function W(e,t,n){var r=Object.assign({},t);r.nodes=(r[n]||[]).concat(),axe.constants.resultGroups.forEach(function(e){delete r[e]}),e[n].push(r)}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function $(e,t){\"use strict\";var n;return axe._tree&&(n=axe.utils.getSelector(t)),new Error(e+\": \"+(n||t))}function X(e,t,n){this._fromFrame=!!n,this.spec=n||{},t&&t.absolutePaths&&(this._options={toRoot:!0}),this.source=void 0!==this.spec.source?this.spec.source:function(e){var t=e.outerHTML;return t||\"function\"!=typeof XMLSerializer||(t=(new XMLSerializer).serializeToString(e)),function(e,t){if(t=t||300,e.length>t){var n=e.indexOf(\">\");e=e.substring(0,n+1)}return e}(t||\"\")}(e),this._element=e}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function Y(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=[],r=!0,a=!1,o=void 0;try{for(var i,u=e[Symbol.iterator]();!(r=(i=u.next()).done)&&(n.push(i.value),!t||n.length!==t);r=!0);}catch(e){a=!0,o=e}finally{try{r||null==u.return||u.return()}finally{if(a)throw o}}return n}(e,t)||function(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}()}function J(e,t){return[e.substring(0,t),e.substring(t)]}function K(e){return e.replace(/\\s+$/,\"\")}axe.utils.aggregateChecks=function(e){var n=Object.assign({},e);G(n,function(e,t){var n=void 0===e.result?-1:M.indexOf(e.result);e.priority=-1!==n?n:axe.constants.CANTTELL_PRIO,\"none\"===t&&(e.priority===axe.constants.PASS_PRIO?e.priority=axe.constants.FAIL_PRIO:e.priority===axe.constants.FAIL_PRIO&&(e.priority=axe.constants.PASS_PRIO))});var r={all:n.all.reduce(function(e,t){return Math.max(e,t.priority)},0),none:n.none.reduce(function(e,t){return Math.max(e,t.priority)},0),any:n.any.reduce(function(e,t){return Math.min(e,t.priority)},4)%4};n.priority=Math.max(r.all,r.none,r.any);var a=[];return H.forEach(function(t){n[t]=n[t].filter(function(e){return e.priority===n.priority&&e.priority===r[t]}),n[t].forEach(function(e){return a.push(e.impact)})}),[U,V].includes(n.priority)?n.impact=axe.utils.aggregate(axe.constants.impact,a):n.impact=null,G(n,function(e){delete e.result,delete e.priority}),n.result=axe.constants.results[n.priority],delete n.priority,n},axe.utils.aggregateNodeResults=function(e){var n={};if((e=e.map(function(e){if(e.any&&e.all&&e.none)return axe.utils.aggregateChecks(e);if(Array.isArray(e.node))return axe.utils.finalizeRuleResult(e);throw new TypeError(\"Invalid Result type\")}))&&e.length){var t=e.map(function(e){return e.result});n.result=axe.utils.aggregate(axe.constants.results,t,n.result)}else n.result=\"inapplicable\";axe.constants.resultGroups.forEach(function(e){return n[e]=[]}),e.forEach(function(e){var t=axe.constants.resultGroupMap[e.result];n[t].push(e)});var r=axe.constants.FAIL_GROUP;if(0===n[r].length&&(r=axe.constants.CANTTELL_GROUP),0<n[r].length){var a=n[r].map(function(e){return e.impact});n.impact=axe.utils.aggregate(axe.constants.impact,a)||null}else n.impact=null;return n},axe.utils.aggregateResult=function(e){var n={};return axe.constants.resultGroups.forEach(function(e){return n[e]=[]}),e.forEach(function(t){t.error?W(n,t,axe.constants.CANTTELL_GROUP):t.result===axe.constants.NA?W(n,t,axe.constants.NA_GROUP):axe.constants.resultGroups.forEach(function(e){Array.isArray(t[e])&&0<t[e].length&&W(n,t,e)})}),n},axe.utils.areStylesSet=function e(t,n,r){\"use strict\";var a=window.getComputedStyle(t,null),o=!1;return!!a&&(n.forEach(function(e){a.getPropertyValue(e.property)===e.value&&(o=!0)}),!!o||!(t.nodeName.toUpperCase()===r.toUpperCase()||!t.parentNode)&&e(t.parentNode,n,r))},axe.utils.checkHelper=function(t,n,r,a){\"use strict\";return{isAsync:!1,async:function(){return this.isAsync=!0,function(e){e instanceof Error==!1?(t.result=e,r(t)):a(e)}},data:function(e){t.data=e},relatedNodes:function(e){e=e instanceof Node?[e]:axe.utils.toArray(e),t.relatedNodes=e.map(function(e){return new axe.utils.DqElement(e,n)})}}},axe.utils.clone=function(e){\"use strict\";var t,n,r=e;if(null!==e&&\"object\"===S(e))if(Array.isArray(e))for(r=[],t=0,n=e.length;t<n;t++)r[t]=axe.utils.clone(e[t]);else for(t in r={},e)r[t]=axe.utils.clone(e[t]);return r},axe.utils.sendCommandToFrame=function(t,n,r,a){\"use strict\";var o=t.contentWindow;if(!o)return axe.log(\"Frame does not have a content window\",t),void r(null);var i=setTimeout(function(){i=setTimeout(function(){n.debug?a($(\"No response from frame\",t)):r(null)},0)},500);axe.utils.respondable(o,\"axe.ping\",null,void 0,function(){clearTimeout(i);var e=n.options&&n.options.frameWaitTime||6e4;i=setTimeout(function(){a($(\"Axe in frame timed out\",t))},e),axe.utils.respondable(o,\"axe.start\",n,void 0,function(e){clearTimeout(i),e instanceof Error==!1?r(e):a(e)})})},axe.utils.collectResultsFromFrames=function(e,t,n,o,r,a){\"use strict\";var i=axe.utils.queue();e.frames.forEach(function(r){var a={options:t,command:n,parameter:o,context:{initiator:!1,page:e.page,include:r.include||[],exclude:r.exclude||[]}};i.defer(function(t,e){var n=r.node;axe.utils.sendCommandToFrame(n,a,function(e){if(e)return t({results:e,frameElement:n,frame:axe.utils.getSelector(n)});t(null)},e)})}),i.then(function(e){r(axe.utils.mergeResults(e,t))}).catch(a)},axe.utils.contains=function(e,t){\"use strict\";if(e.shadowId||t.shadowId)return function t(e,n){return e.shadowId===n.shadowId||!!e.children.find(function(e){return t(e,n)})}(e,t);if(e.actualNode)return\"function\"==typeof e.actualNode.contains?e.actualNode.contains(t.actualNode):!!(16&e.actualNode.compareDocumentPosition(t.actualNode));do{if(t===e)return!0}while(t=t&&t.parent);return!1},function(axe){var e=new axe.imports.CssSelectorParser;e.registerSelectorPseudos(\"not\"),e.registerNestingOperators(\">\"),e.registerAttrEqualityMods(\"^\",\"$\",\"*\"),axe.utils.cssParser=e}(axe),X.prototype={get selector(){return this.spec.selector||[axe.utils.getSelector(this.element,this._options)]},get xpath(){return this.spec.xpath||[axe.utils.getXpath(this.element)]},get element(){return this._element},get fromFrame(){return this._fromFrame},toJSON:function(){\"use strict\";return{selector:this.selector,source:this.source,xpath:this.xpath}}},X.fromFrame=function(e,t,n){return e.selector.unshift(n.selector),e.xpath.unshift(n.xpath),new axe.utils.DqElement(n.element,t,e)},axe.utils.DqElement=X,axe.utils.matchesSelector=function(){\"use strict\";var n;return function(e,t){return n&&e[n]||(n=function(e){var t,n,r=[\"matches\",\"matchesSelector\",\"mozMatchesSelector\",\"webkitMatchesSelector\",\"msMatchesSelector\"],a=r.length;for(t=0;t<a;t++)if(e[n=r[t]])return n}(e)),!!e[n]&&e[n](t)}}(),axe.utils.escapeSelector=function(e){\"use strict\";for(var t,n=String(e),r=n.length,a=-1,o=\"\",i=n.charCodeAt(0);++a<r;)0!=(t=n.charCodeAt(a))?o+=1<=t&&t<=31||127==t||0==a&&48<=t&&t<=57||1==a&&48<=t&&t<=57&&45==i?\"\\\\\"+t.toString(16)+\" \":(0!=a||1!=r||45!=t)&&(128<=t||45==t||95==t||48<=t&&t<=57||65<=t&&t<=90||97<=t&&t<=122)?n.charAt(a):\"\\\\\"+n.charAt(a):o+=\"�\";return o},axe.utils.extendMetaData=function(t,n){Object.assign(t,n),Object.keys(n).filter(function(e){return\"function\"==typeof n[e]}).forEach(function(e){t[e]=null;try{t[e]=n[e](t)}catch(e){}})},axe.utils.finalizeRuleResult=function(e){return Object.assign(e,axe.utils.aggregateNodeResults(e.nodes)),delete e.nodes,e},axe.utils.findBy=function(e,t,n){if(Array.isArray(e))return e.find(function(e){return\"object\"===S(e)&&e[t]===n})},(axe=axe||{utils:{}}).utils.getFlattenedTree=function(e,t){return axe._cache.set(\"nodeMap\",new WeakMap),function a(e,o,n){var r,t,i;function u(e,t,n){var r=a(t,o,n);return r&&(e=e.concat(r)),e}if(e.documentElement&&(e=e.documentElement),i=e.nodeName.toLowerCase(),axe.utils.isShadowRoot(e))return r=new A(e,n,o),o=\"a\"+Math.random().toString().substring(2),t=Array.from(e.shadowRoot.childNodes),r.children=t.reduce(function(e,t){return u(e,t,r)},[]),[r];if(\"content\"===i)return(t=Array.from(e.getDistributedNodes())).reduce(function(e,t){return u(e,t,n)},[]);if(\"slot\"!==i||\"function\"!=typeof e.assignedNodes)return 1===e.nodeType?(r=new A(e,n,o),t=Array.from(e.childNodes),r.children=t.reduce(function(e,t){return u(e,t,r)},[]),[r]):3===e.nodeType?[new A(e,n)]:void 0;(t=Array.from(e.assignedNodes())).length||(t=function(e){var t=[];for(e=e.firstChild;e;)t.push(e),e=e.nextSibling;return t}(e));window.getComputedStyle(e);return t.reduce(function(e,t){return u(e,t,n)},[])}(e,t)},axe.utils.getNodeFromTree=function(e,t){var n=t||e;return axe._cache.get(\"nodeMap\")?axe._cache.get(\"nodeMap\").get(n):null},axe.utils.getAllChecks=function(e){\"use strict\";return[].concat(e.any||[]).concat(e.all||[]).concat(e.none||[])},axe.utils.getBaseLang=function(e){return e?e.trim().split(\"-\")[0].toLowerCase():\"\"},axe.utils.getCheckOption=function(e,t,n){var r=((n.rules&&n.rules[t]||{}).checks||{})[e.id],a=(n.checks||{})[e.id],o=e.enabled,i=e.options;return a&&(a.hasOwnProperty(\"enabled\")&&(o=a.enabled),a.hasOwnProperty(\"options\")&&(i=a.options)),r&&(r.hasOwnProperty(\"enabled\")&&(o=r.enabled),r.hasOwnProperty(\"options\")&&(i=r.options)),{enabled:o,options:i,absolutePaths:n.absolutePaths}},axe.utils.getFriendlyUriEnd=function(e,t){var n=0<arguments.length&&void 0!==e?e:\"\",r=1<arguments.length&&void 0!==t?t:{};if(!(n.length<=1||\"data:\"===n.substr(0,5)||\"javascript:\"===n.substr(0,11)||n.includes(\"?\"))){var a=r.currentDomain,o=r.maxLength,i=void 0===o?25:o,u=function(e){var t=e,n=\"\",r=\"\",a=\"\",o=\"\",i=\"\";if(e.includes(\"#\")){var u=Y(J(e,e.indexOf(\"#\")),2);e=u[0],i=u[1]}if(e.includes(\"?\")){var s=Y(J(e,e.indexOf(\"?\")),2);e=s[0],o=s[1]}if(e.includes(\"://\")){var l=Y(e.split(\"://\"),2);n=l[0];var c=Y(J(e=l[1],e.indexOf(\"/\")),2);r=c[0],e=c[1]}else if(\"//\"===e.substr(0,2)){var d=Y(J(e=e.substr(2),e.indexOf(\"/\")),2);r=d[0],e=d[1]}if(\"www.\"===r.substr(0,4)&&(r=r.substr(4)),r&&r.includes(\":\")){var m=Y(J(r,r.indexOf(\":\")),2);r=m[0],a=m[1]}return{original:t,protocol:n,domain:r,port:a,path:e,query:o,hash:i}}(n),s=u.path,l=u.domain,c=u.hash,d=s.substr(s.substr(0,s.length-2).lastIndexOf(\"/\")+1);if(c)return d&&(d+c).length<=i?K(d+c):d.length<2&&2<c.length&&c.length<=i?K(c):void 0;if(l&&l.length<i&&s.length<=1)return K(l+s);if(s===\"/\"+d&&l&&a&&l!==a&&(l+s).length<=i)return K(l+s);var m=d.lastIndexOf(\".\");return(-1===m||1<m)&&(-1!==m||2<d.length)&&d.length<=i&&!d.match(/index(\\.[a-zA-Z]{2-4})?/)&&!function(e){var t=0<arguments.length&&void 0!==e?e:\"\";return 0!==t.length&&(t.match(/[0-9]/g)||\"\").length>=t.length/2}(d)?K(d):void 0}},axe.utils.getNodeAttributes=function(e){return e.attributes instanceof window.NamedNodeMap?e.attributes:e.cloneNode(!1).attributes},axe.utils.getRootNode=function(e){var t=e.getRootNode&&e.getRootNode()||document;return t===e&&(t=document),t},axe.utils.getScroll=function(e,t){var n=1<arguments.length&&void 0!==t?t:0,r=e.scrollWidth>e.clientWidth+n,a=e.scrollHeight>e.clientHeight+n;if(r||a){var o=window.getComputedStyle(e),i=o.getPropertyValue(\"overflow-x\"),u=o.getPropertyValue(\"overflow-y\");return r&&(\"visible\"!==i&&\"hidden\"!==i)||a&&(\"visible\"!==u&&\"hidden\"!==u)?{elm:e,top:e.scrollTop,left:e.scrollLeft}:void 0}};var Z,Q,ee=axe.utils.escapeSelector,te=[\"class\",\"style\",\"id\",\"selected\",\"checked\",\"disabled\",\"tabindex\",\"aria-checked\",\"aria-selected\",\"aria-invalid\",\"aria-activedescendant\",\"aria-busy\",\"aria-disabled\",\"aria-expanded\",\"aria-grabbed\",\"aria-pressed\",\"aria-valuenow\"],ne=31;function re(e,t){var n,r=t.name;if(-1!==r.indexOf(\"href\")||-1!==r.indexOf(\"src\")){var a=axe.utils.getFriendlyUriEnd(e.getAttribute(r));if(a){var o=encodeURI(a);if(!o)return;n=ee(t.name)+'$=\"'+ee(o)+'\"'}else n=ee(t.name)+'=\"'+ee(e.getAttribute(r))+'\"'}else n=ee(r)+'=\"'+ee(t.value)+'\"';return n}function ae(e,t){return e.count<t.count?-1:e.count===t.count?0:1}function oe(e){return!te.includes(e.name)&&-1===e.name.indexOf(\":\")&&(!e.value||e.value.length<ne)}function ie(t,n){var e=t.parentNode&&Array.from(t.parentNode.children||\"\")||[];return e.find(function(e){return e!==t&&axe.utils.matchesSelector(e,n)})?\":nth-child(\"+(1+e.indexOf(t))+\")\":\"\"}function ue(e){if(e.getAttribute(\"id\")){var t=e.getRootNode&&e.getRootNode()||document,n=\"#\"+ee(e.getAttribute(\"id\")||\"\");return n.match(/player_uid_/)||1!==t.querySelectorAll(n).length?void 0:n}}function se(e){return void 0===Z&&(Z=axe.utils.isXHTML(document)),ee(Z?e.localName:e.nodeName.toLowerCase())}function le(e,t){var n,r=\"\",a=function(n,e){var r=[],a=e.classes,o=e.tags;return n.classList&&Array.from(n.classList).forEach(function(e){var t=ee(e);a[t]<o[n.nodeName]&&r.push({name:t,count:a[t],species:\"class\"})}),r.sort(ae)}(e,t),o=function(n,e){var r=[],a=e.attributes,o=e.tags;return n.hasAttributes()&&Array.from(axe.utils.getNodeAttributes(n)).filter(oe).forEach(function(e){var t=re(n,e);t&&a[t]<o[n.nodeName]&&r.push({name:t,count:a[t],species:\"attribute\"})}),r.sort(ae)}(e,t);return a.length&&1===a[0].count?n=[a[0]]:o.length&&1===o[0].count?(n=[o[0]],r=se(e)):((n=a.concat(o)).sort(ae),(n=n.slice(0,3)).some(function(e){return\"class\"===e.species})?n.sort(function(e,t){return e.species!==t.species&&\"class\"===e.species?-1:e.species===t.species?0:1}):r=se(e)),r+n.reduce(function(e,t){switch(t.species){case\"class\":return e+\".\"+t.name;case\"attribute\":return e+\"[\"+t.name+\"]\"}return e},\"\")}function ce(e,t,n){if(!axe._selectorData)throw new Error(\"Expect axe._selectorData to be set up\");var r,a,o=t.toRoot,i=void 0!==o&&o;do{var u=ue(e);u||(u=le(e,axe._selectorData),u+=ie(e,u)),r=r?u+\" > \"+r:u,a=a?a.filter(function(e){return axe.utils.matchesSelector(e,r)}):Array.from(n.querySelectorAll(r)),e=e.parentElement}while((1<a.length||i)&&e&&11!==e.nodeType);return 1===a.length?r:-1!==r.indexOf(\" > \")?\":root\"+r.substring(r.indexOf(\" > \")):\":root\"}axe.utils.getSelectorData=function(e){function t(){var e=a.pop(),n=e.actualNode;if(n.querySelectorAll){var t=n.nodeName;r.tags[t]?r.tags[t]++:r.tags[t]=1,n.classList&&Array.from(n.classList).forEach(function(e){var t=ee(e);r.classes[t]?r.classes[t]++:r.classes[t]=1}),n.hasAttributes()&&Array.from(axe.utils.getNodeAttributes(n)).filter(oe).forEach(function(e){var t=re(n,e);t&&(r.attributes[t]?r.attributes[t]++:r.attributes[t]=1)})}for(e.children.length&&(o.push(a),a=e.children.slice());!a.length&&o.length;)a=o.pop()}for(var r={classes:{},tags:{},attributes:{}},a=(e=Array.isArray(e)?e:[e]).slice(),o=[];a.length;)t();return r},axe.utils.getSelector=function(e,t){var n=1<arguments.length&&void 0!==t?t:{};if(!e)return\"\";var r=e.getRootNode&&e.getRootNode()||document;if(11!==r.nodeType)return ce(e,n,r);for(var a=[];11===r.nodeType;)a.push({elm:e,doc:r}),r=(e=r.host).getRootNode();return a.push({elm:e,doc:r}),a.reverse().map(function(e){return ce(e.elm,n,e.doc)})},axe.utils.getStyleSheetFactory=function(d){if(!d)throw new Error(\"axe.utils.getStyleSheetFactory should be invoked with an argument\");return function(e){var t=e.data,n=e.isCrossOrigin,r=void 0!==n&&n,a=e.shadowId,o=e.root,i=e.priority,u=e.isLink,s=void 0!==u&&u,l=d.createElement(\"style\");if(s){var c=d.createTextNode('@import \"'.concat(t.href,'\"'));l.appendChild(c)}else l.appendChild(d.createTextNode(t));return d.head.appendChild(l),{sheet:l.sheet,isCrossOrigin:r,shadowId:a,root:o,priority:i}}},axe.utils.getXpath=function(e){return function(e){return e.reduce(function(e,t){return t.id?\"/\".concat(t.str,\"[@id='\").concat(t.id,\"']\"):e+\"/\".concat(t.str)+(0<t.count?\"[\".concat(t.count,\"]\"):\"\")},\"\")}(function e(t,n){var r,a;if(!t)return[];if(!n&&9===t.nodeType)return n=[{str:\"html\"}];if(n=n||[],t.parentNode&&t.parentNode!==t&&(n=e(t.parentNode,n)),t.previousSibling){for(a=1,r=t.previousSibling;1===r.nodeType&&r.nodeName===t.nodeName&&a++,r=r.previousSibling;);1===a&&(a=null)}else if(t.nextSibling)for(r=t.nextSibling;r=1===r.nodeType&&r.nodeName===t.nodeName?(a=1,null):(a=null,r.previousSibling););if(1===t.nodeType){var o={};o.str=t.nodeName.toLowerCase();var i=t.getAttribute&&axe.utils.escapeSelector(t.getAttribute(\"id\"));i&&1===t.ownerDocument.querySelectorAll(\"#\"+i).length&&(o.id=t.getAttribute(\"id\")),1<a&&(o.count=a),n.push(o)}return n}(e))},axe.utils.injectStyle=function(e){\"use strict\";if(Q&&Q.parentNode)return void 0===Q.styleSheet?Q.appendChild(document.createTextNode(e)):Q.styleSheet.cssText+=e,Q;if(e){var t=document.head||document.getElementsByTagName(\"head\")[0];return(Q=document.createElement(\"style\")).type=\"text/css\",void 0===Q.styleSheet?Q.appendChild(document.createTextNode(e)):Q.styleSheet.cssText=e,t.appendChild(Q),Q}},axe.utils.isHidden=function(e,t){\"use strict\";var n=axe.utils.getNodeFromTree(e);if(9===e.nodeType)return!1;if(11===e.nodeType&&(e=e.host),n&&null!==n._isHidden)return n._isHidden;var r=window.getComputedStyle(e,null);if(!r||!e.parentNode||\"none\"===r.getPropertyValue(\"display\")||!t&&\"hidden\"===r.getPropertyValue(\"visibility\")||\"true\"===e.getAttribute(\"aria-hidden\"))return!0;var a=e.assignedSlot?e.assignedSlot:e.parentNode,o=axe.utils.isHidden(a,!0);return n&&(n._isHidden=o),o};var de=[\"a\",\"abbr\",\"address\",\"area\",\"article\",\"aside\",\"audio\",\"b\",\"base\",\"bdi\",\"bdo\",\"blockquote\",\"body\",\"br\",\"button\",\"canvas\",\"caption\",\"cite\",\"code\",\"col\",\"colgroup\",\"data\",\"datalist\",\"dd\",\"del\",\"details\",\"dfn\",\"dialog\",\"div\",\"dl\",\"dt\",\"em\",\"embed\",\"fieldset\",\"figcaption\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"head\",\"header\",\"hgroup\",\"hr\",\"html\",\"i\",\"iframe\",\"img\",\"input\",\"ins\",\"kbd\",\"keygen\",\"label\",\"legend\",\"li\",\"link\",\"main\",\"map\",\"mark\",\"math\",\"menu\",\"menuitem\",\"meta\",\"meter\",\"nav\",\"noscript\",\"object\",\"ol\",\"optgroup\",\"option\",\"output\",\"p\",\"param\",\"picture\",\"pre\",\"progress\",\"q\",\"rb\",\"rp\",\"rt\",\"rtc\",\"ruby\",\"s\",\"samp\",\"script\",\"section\",\"select\",\"slot\",\"small\",\"source\",\"span\",\"strong\",\"style\",\"sub\",\"summary\",\"sup\",\"svg\",\"table\",\"tbody\",\"td\",\"template\",\"textarea\",\"tfoot\",\"th\",\"thead\",\"time\",\"title\",\"tr\",\"track\",\"u\",\"ul\",\"var\",\"video\",\"wbr\"];axe.utils.isHtmlElement=function(e){var t=e.nodeName.toLowerCase();return de.includes(t)&&\"http://www.w3.org/2000/svg\"!==e.namespaceURI};var me,pe,fe=[\"article\",\"aside\",\"blockquote\",\"body\",\"div\",\"footer\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"main\",\"nav\",\"p\",\"section\",\"span\"];function he(e){return function(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}(e)||function(e){if(Symbol.iterator in Object(e)||\"[object Arguments]\"===Object.prototype.toString.call(e))return Array.from(e)}(e)||function(){throw new TypeError(\"Invalid attempt to spread non-iterable instance\")}()}function be(){throw new TypeError(\"Invalid attempt to spread non-iterable instance\")}function ge(e){if(Symbol.iterator in Object(e)||\"[object Arguments]\"===Object.prototype.toString.call(e))return Array.from(e)}function ye(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}function ve(e){return\"function\"==typeof e||\"[object Function]\"===me.call(e)}function De(e){var t=function(e){var t=Number(e);return isNaN(t)?0:0!==t&&isFinite(t)?(0<t?1:-1)*Math.floor(Math.abs(t)):t}(e);return Math.min(Math.max(t,0),pe)}function we(e){var t=e.nodeName.toUpperCase(),n=e.getAttribute(\"href\"),r=e.getAttribute(\"rel\"),a=\"LINK\"===t&&n&&r&&e.rel.toUpperCase().includes(\"STYLESHEET\");return\"STYLE\"===t||a&&ke(e.media)}function ke(e){return!e||!e.toUpperCase().includes(\"PRINT\")}function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function xe(a,o){\"use strict\";return function(e){var t=a[e.id]||{},n=t.messages||{},r=Object.assign({},t);delete r.messages,void 0===e.result?\"object\"===S(n.incomplete)?r.message=function(){return function(t,n){function r(e){return e.incomplete&&e.incomplete.default?e.incomplete.default:u.incompleteFallbackMessage()}if(!t||!t.missingData)return r(n);try{var e=n.incomplete[t.missingData[0].reason];if(!e)throw new Error;return e}catch(e){return\"string\"==typeof t.missingData?n.incomplete[t.missingData]:r(n)}}(e.data,n)}:r.message=n.incomplete:r.message=e.result===o?n.pass:n.fail,axe.utils.extendMetaData(e,r)}}axe.utils.isShadowRoot=function(e){var t=e.nodeName.toLowerCase();return!(!e.shadowRoot||!/^[a-z][a-z0-9_.-]*-[a-z0-9_.-]*$/.test(t)&&!fe.includes(t))},axe.utils.isXHTML=function(e){\"use strict\";return!!e.createElement&&\"A\"===e.createElement(\"A\").localName},axe.utils.mergeResults=function(e,r){\"use strict\";var a=[];return e.forEach(function(n){var e=function(e){\"use strict\";return e&&e.results?Array.isArray(e.results)?e.results.length?e.results:null:[e.results]:null}(n);e&&e.length&&e.forEach(function(e){e.nodes&&n.frame&&function(e,n,t,r){\"use strict\";var a={element:t,selector:r,xpath:axe.utils.getXpath(t)};e.forEach(function(e){e.node=axe.utils.DqElement.fromFrame(e.node,n,a);var t=axe.utils.getAllChecks(e);t.length&&t.forEach(function(e){e.relatedNodes=e.relatedNodes.map(function(e){return axe.utils.DqElement.fromFrame(e,n,a)})})})}(e.nodes,r,n.frameElement,n.frame);var t=axe.utils.findBy(a,\"id\",e.id);t?e.nodes.length&&function(e,t){\"use strict\";for(var n,r,a=t[0].node,o=0,i=e.length;o<i;o++)if(r=e[o].node,0<(n=axe.utils.nodeSorter({actualNode:r.element},{actualNode:a.element}))||0===n&&a.selector.length<r.selector.length)return e.splice.apply(e,[o,0].concat(t));e.push.apply(e,t)}(t.nodes,e.nodes):a.push(e)})}),a},axe.utils.nodeSorter=function(e,t){return(e=e.actualNode||e)===(t=t.actualNode||t)?0:4&e.compareDocumentPosition(t)?-1:1},axe.utils.parseCrossOriginStylesheet=function(e,r,a,o,i){var t={method:\"get\",url:e};return o.push(e),axe.imports.axios(t).then(function(e){var t=e.data,n=r.convertDataToStylesheet({data:t,isCrossOrigin:i,priority:a,root:r.rootNode,shadowId:r.shadowId});return axe.utils.parseStylesheet(n.sheet,r,a,o,n.isCrossOrigin)})},axe.utils.parseSameOriginStylesheet=function(e,a,o,i,t){var n=4<arguments.length&&void 0!==t&&t,r=Array.from(e.cssRules);if(!r)return Promise.resolve();var u=r.filter(function(e){return 3===e.type});if(!u.length)return Promise.resolve({isCrossOrigin:n,priority:o,root:a.rootNode,shadowId:a.shadowId,sheet:e});var s=u.filter(function(e){return e.href}).map(function(e){return e.href}).filter(function(e){return!i.includes(e)}).map(function(e,t){var n=[].concat(he(o),[t]),r=/^https?:\\/\\/|^\\/\\//i.test(e);return axe.utils.parseCrossOriginStylesheet(e,a,n,i,r)}),l=r.filter(function(e){return 3!==e.type});return l.length&&s.push(Promise.resolve(a.convertDataToStylesheet({data:l.map(function(e){return e.cssText}).join(),isCrossOrigin:n,priority:o,root:a.rootNode,shadowId:a.shadowId}))),Promise.all(s)},axe.utils.parseStylesheet=function(e,t,n,r,a){var o=4<arguments.length&&void 0!==a&&a;return function(e){try{return!(!e.cssRules&&e.href)}catch(e){return!1}}(e)?axe.utils.parseSameOriginStylesheet(e,t,n,r,o):axe.utils.parseCrossOriginStylesheet(e.href,t,n,r,!0)},utils.performanceTimer=function(){\"use strict\";function e(){if(window.performance&&window.performance)return window.performance.now()}var t=null,n=e();return{start:function(){this.mark(\"mark_axe_start\")},end:function(){this.mark(\"mark_axe_end\"),this.measure(\"axe\",\"mark_axe_start\",\"mark_axe_end\"),this.logMeasures(\"axe\")},auditStart:function(){this.mark(\"mark_audit_start\")},auditEnd:function(){this.mark(\"mark_audit_end\"),this.measure(\"audit_start_to_end\",\"mark_audit_start\",\"mark_audit_end\"),this.logMeasures()},mark:function(e){window.performance&&void 0!==window.performance.mark&&window.performance.mark(e)},measure:function(e,t,n){window.performance&&void 0!==window.performance.measure&&window.performance.measure(e,t,n)},logMeasures:function(e){function t(e){axe.log(\"Measure \"+e.name+\" took \"+e.duration+\"ms\")}if(window.performance&&void 0!==window.performance.getEntriesByType)for(var n=window.performance.getEntriesByName(\"mark_axe_start\")[0],r=window.performance.getEntriesByType(\"measure\").filter(function(e){return e.startTime>=n.startTime}),a=0;a<r.length;++a){var o=r[a];if(o.name===e)return void t(o);t(o)}},timeElapsed:function(){return e()-n},reset:function(){t=t||e(),n=e()}}}(),\"function\"!=typeof Object.assign&&(Object.assign=function(e){\"use strict\";if(null==e)throw new TypeError(\"Cannot convert undefined or null to object\");for(var t=Object(e),n=1;n<arguments.length;n++){var r=arguments[n];if(null!=r)for(var a in r)r.hasOwnProperty(a)&&(t[a]=r[a])}return t}),Array.prototype.find||Object.defineProperty(Array.prototype,\"find\",{value:function(e){if(null===this)throw new TypeError(\"Array.prototype.find called on null or undefined\");if(\"function\"!=typeof e)throw new TypeError(\"predicate must be a function\");for(var t,n=Object(this),r=n.length>>>0,a=arguments[1],o=0;o<r;o++)if(t=n[o],e.call(a,t,o,n))return t}}),axe.utils.pollyfillElementsFromPoint=function(){if(document.elementsFromPoint)return document.elementsFromPoint;if(document.msElementsFromPoint)return document.msElementsFromPoint;var e,t=((e=document.createElement(\"x\")).style.cssText=\"pointer-events:auto\",\"auto\"===e.style.pointerEvents),u=t?\"pointer-events\":\"visibility\",s=t?\"none\":\"hidden\",l=document.createElement(\"style\");return l.innerHTML=t?\"* { pointer-events: all }\":\"* { visibility: visible }\",function(e,t){var n,r,a,o=[],i=[];for(document.head.appendChild(l);(n=document.elementFromPoint(e,t))&&-1===o.indexOf(n);)o.push(n),i.push({value:n.style.getPropertyValue(u),priority:n.style.getPropertyPriority(u)}),n.style.setProperty(u,s,\"important\");for(o.indexOf(document.documentElement)<o.length-1&&(o.splice(o.indexOf(document.documentElement),1),o.push(document.documentElement)),r=i.length;a=i[--r];)o[r].style.setProperty(u,a.value?a.value:\"\",a.priority);return document.head.removeChild(l),o}},\"function\"==typeof window.addEventListener&&(document.elementsFromPoint=axe.utils.pollyfillElementsFromPoint()),Array.prototype.includes||Object.defineProperty(Array.prototype,\"includes\",{value:function(e,t){\"use strict\";var n=Object(this),r=parseInt(n.length,10)||0;if(0===r)return!1;var a,o,i=parseInt(t,10)||0;for(0<=i?a=i:(a=r+i)<0&&(a=0);a<r;){if(e===(o=n[a])||e!=e&&o!=o)return!0;a++}return!1}}),Array.prototype.some||Object.defineProperty(Array.prototype,\"some\",{value:function(e,t){\"use strict\";if(null==this)throw new TypeError(\"Array.prototype.some called on null or undefined\");if(\"function\"!=typeof e)throw new TypeError;for(var n=Object(this),r=n.length>>>0,a=2<=arguments.length?t:void 0,o=0;o<r;o++)if(o in n&&e.call(a,n[o],o,n))return!0;return!1}}),Array.from||Object.defineProperty(Array,\"from\",{value:(me=Object.prototype.toString,pe=Math.pow(2,53)-1,function(e,t,n){var r=Object(e);if(null==e)throw new TypeError(\"Array.from requires an array-like object - not null or undefined\");var a,o=1<arguments.length?t:void 0;if(void 0!==o){if(!ve(o))throw new TypeError(\"Array.from: when provided, the second argument must be a function\");2<arguments.length&&(a=n)}for(var i,u=De(r.length),s=ve(this)?Object(new this(u)):new Array(u),l=0;l<u;)i=r[l],s[l]=o?void 0===a?o(i,l):o.call(a,i,l):i,l+=1;return s.length=u,s})}),String.prototype.includes||(String.prototype.includes=function(e,t){return\"number\"!=typeof t&&(t=0),!(t+e.length>this.length)&&-1!==this.indexOf(e,t)}),axe.utils.preloadCssom=function(e){var t=e.treeRoot,n=function(e){var t=[],n=axe.utils.querySelectorAllFilter(e,\"*\",function(e){return!t.includes(e.shadowId)&&(t.push(e.shadowId),!0)}).map(function(e){return{shadowId:e.shadowId,rootNode:axe.utils.getRootNode(e.actualNode)}});return axe.utils.uniqueArray(n,[])}(void 0===t?axe._tree[0]:t);if(!n.length)return Promise.resolve();var r=document.implementation.createHTMLDocument(\"Dynamic document for loading cssom\");return function(e,l){var c=[];return e.forEach(function(e,t){var n=e.rootNode,r=e.shadowId,a=function(e,t,n){var r;r=11===e.nodeType&&t?function(o,i){return Array.from(o.children).filter(we).reduce(function(e,t){var n=t.nodeName.toUpperCase(),r=\"STYLE\"===n?t.textContent:t,a=i({data:r,isLink:\"LINK\"===n,root:o});return e.push(a.sheet),e},[])}(e,n):function(e){return Array.from(e.styleSheets).filter(function(e){return ke(e.media.mediaText)})}(e);return function(e){var t=[];return e.filter(function(e){return!e.href||!t.includes(e.href)&&(t.push(e.href),!0)})}(r)}(n,r,l);if(!a)return Promise.all(c);var o=t+1,i={rootNode:n,shadowId:r,convertDataToStylesheet:l,rootIndex:o},u=[],s=Promise.all(a.map(function(e,t){var n=[o,t];return axe.utils.parseStylesheet(e,i,n,u)}));c.push(s)}),Promise.all(c)}(n,axe.utils.getStyleSheetFactory(r)).then(function(e){return function n(e){return e.reduce(function(e,t){return Array.isArray(t)?e.concat(n(t)):e.concat(t)},[])}(e)})},axe.utils.shouldPreload=function(e){return!e||void 0===e.preload||null===e.preload||(\"boolean\"==typeof e.preload?e.preload:function(e){return\"object\"===S(e)&&Array.isArray(e.assets)}(e.preload))},axe.utils.getPreloadConfig=function(e){var t=axe.constants.preload,n=t.assets,r=t.timeout,a={assets:n,timeout:r};if(!e.preload)return a;if(\"boolean\"==typeof e.preload)return a;if(!e.preload.assets.every(function(e){return n.includes(e.toLowerCase())}))throw new Error(\"Requested assets, not supported. \"+\"Supported assets are: \".concat(n.join(\", \"),\".\"));return a.assets=axe.utils.uniqueArray(e.preload.assets.map(function(e){return e.toLowerCase()}),[]),e.preload.timeout&&\"number\"==typeof e.preload.timeout&&!Number.isNaN(e.preload.timeout)&&(a.timeout=e.preload.timeout),a},axe.utils.preload=function(o){var i={cssom:axe.utils.preloadCssom};return axe.utils.shouldPreload(o)?new Promise(function(n,e){var t=axe.utils.getPreloadConfig(o),r=t.assets,a=t.timeout;setTimeout(function(){return e(\"Preload assets timed out.\")},a),Promise.all(r.map(function(t){return i[t](o).then(function(e){return function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}({},t,e)})})).then(function(e){var t=e.reduce(function(e,t){return R({},e,t)},{});n(t)})}):Promise.resolve()},axe.utils.publishMetaData=function(e){\"use strict\";var t=axe._audit.data.checks||{},n=axe._audit.data.rules||{},r=axe.utils.findBy(axe._audit.rules,\"id\",e.id)||{};e.tags=axe.utils.clone(r.tags||[]);var a=xe(t,!0),o=xe(t,!1);e.nodes.forEach(function(e){e.any.forEach(a),e.all.forEach(a),e.none.forEach(o)}),axe.utils.extendMetaData(e,axe.utils.clone(n[e.id]||{}))};var Ee=function(){},Ce=function(){};var Ae,Fe,je=(Ae=/(?=[\\-\\[\\]{}()*+?.\\\\\\^$|,#\\s])/g,function(e){return e.replace(Ae,\"\\\\\")}),ze=/\\\\/g;function qe(e){if(e)return e.map(function(e){var t,n,r=e.name.replace(ze,\"\"),a=(e.value||\"\").replace(ze,\"\");switch(e.operator){case\"^=\":n=new RegExp(\"^\"+je(a));break;case\"$=\":n=new RegExp(je(a)+\"$\");break;case\"~=\":n=new RegExp(\"(^|\\\\s)\"+je(a)+\"(\\\\s|$)\");break;case\"|=\":n=new RegExp(\"^\"+je(a)+\"(-|$)\");break;case\"=\":t=function(e){return a===e};break;case\"*=\":t=function(e){return e&&e.includes(a)};break;case\"!=\":t=function(e){return a!==e};break;default:t=function(e){return!!e}}return\"\"===a&&/^[*$^]=$/.test(e.operator)&&(t=function(){return!1}),{key:r,value:a,test:t=t||function(e){return e&&n.test(e)}}})}function Ne(e){if(e)return e.map(function(e){return{value:e=e.replace(ze,\"\"),regexp:new RegExp(\"(^|\\\\s)\"+je(e)+\"(\\\\s|$)\")}})}function Te(e){if(e)return e.map(function(e){var t;return\"not\"===e.name&&(t=(t=e.value).selectors?t.selectors:[t],t=Ee(t)),{name:e.name,expressions:t,value:e.value}})}function Se(e,t,n,r){var a={vNodes:e.slice(),anyLevel:t,thisLevel:n,parentShadowId:r};return a.vNodes.reverse(),a}function Re(e,t){return function(e,t){return 1===e.props.nodeType&&(\"*\"===t.tag||e.props.nodeName===t.tag)}(e,t[0])&&function(t,e){return!e.classes||e.classes.every(function(e){return t.hasClass(e.value)})}(e,t[0])&&function(r,e){return!e.attributes||e.attributes.reduce(function(e,t){var n=r.attr(t.key);return e&&null!==n&&(!t.value||t.test(n))},!0)}(e,t[0])&&function(e,t){return!t.id||e.props.id===t.id}(e,t[0])&&function(n,e){return!(e.pseudos&&!e.pseudos.reduce(function(e,t){if(\"not\"===t.name)return e&&!Ce([n],t.expressions,!1).length;throw new Error(\"the pseudo selector \"+t.name+\" has not yet been implemented\")},!0))}(e,t[0])}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}function Oe(t,e){\"use strict\";var n,r,a=axe._audit&&axe._audit.tagExclude?axe._audit.tagExclude:[];return r=e.hasOwnProperty(\"include\")||e.hasOwnProperty(\"exclude\")?(n=e.include||[],n=Array.isArray(n)?n:[n],r=e.exclude||[],(r=Array.isArray(r)?r:[r]).concat(a.filter(function(e){return-1===n.indexOf(e)}))):(n=Array.isArray(e)?e:[e],a.filter(function(e){return-1===n.indexOf(e)})),!!(n.some(function(e){return-1!==t.tags.indexOf(e)})||0===n.length&&!1!==t.enabled)&&r.every(function(e){return-1===t.tags.indexOf(e)})}function _e(e){\"use strict\";return e.sort(function(e,t){return axe.utils.contains(e,t)?1:-1})[0]}function Be(t,e){\"use strict\";var n=e.include&&_e(e.include.filter(function(e){return axe.utils.contains(e,t)})),r=e.exclude&&_e(e.exclude.filter(function(e){return axe.utils.contains(e,t)}));return!!(!r&&n||r&&axe.utils.contains(r,n))}function Le(e,t){\"use strict\";var n;if(0===e.length)return t;e.length<t.length&&(n=e,e=t,t=n);for(var r=0,a=t.length;r<a;r++)e.includes(t[r])||e.push(t[r]);return e}Ee=function(e){return e.map(function(e){for(var t=[],n=e.rule;n;)t.push({tag:n.tagName?n.tagName.toLowerCase():\"*\",combinator:n.nestingOperator?n.nestingOperator:\" \",id:n.id,attributes:qe(n.attrs),classes:Ne(n.classNames),pseudos:Te(n.pseudos)}),n=n.rule;return t})},Ce=function(e,t,n,r){for(var a=[],o=Se(Array.isArray(e)?e:[e],t,[],e[0].shadowId),i=[];o.vNodes.length;){for(var u=o.vNodes.pop(),s=[],l=[],c=o.anyLevel.slice().concat(o.thisLevel),d=!1,m=0;m<c.length;m++){var p=c[m];if(Re(u,p)&&(!p[0].id||u.shadowId===o.parentShadowId))if(1===p.length)d||r&&!r(u)||(i.push(u),d=!0);else{var f=p.slice(1);if(!1===[\" \",\">\"].includes(f[0].combinator))throw new Error(\"axe.utils.querySelectorAll does not support the combinator: \"+p[1].combinator);\">\"===f[0].combinator?s.push(f):l.push(f)}!o.anyLevel.includes(p)||p[0].id&&u.shadowId!==o.parentShadowId||l.push(p)}for(u.children&&u.children.length&&n&&(a.push(o),o=Se(u.children,l,s,u.shadowId));!o.vNodes.length&&a.length;)o=a.pop()}return i},axe.utils.querySelectorAll=function(e,t){return axe.utils.querySelectorAllFilter(e,t)},axe.utils.querySelectorAllFilter=function(e,t,n){e=Array.isArray(e)?e:[e];var r=axe.utils.cssParser.parse(t);return r=r.selectors?r.selectors:[r],r=Ee(r),Ce(e,r,!0,n)},function(){\"use strict\";function m(){}function p(e){if(\"function\"!=typeof e)throw new TypeError(\"Queue methods require functions as arguments\")}axe.utils.queue=function(){function t(e){r=e,setTimeout(function(){null!=r&&axe.log(\"Uncaught error (of queue)\",r)},1)}var r,a=[],o=0,i=0,n=m,u=!1,s=t;function l(t){return function(e){a[t]=e,(i-=1)||n===m||(u=!0,n(a))}}function c(e){return n=m,s(e),a}var d={defer:function(e){if(\"object\"===S(e)&&e.then&&e.catch){var n=e;e=function(e,t){n.then(e).catch(t)}}if(p(e),void 0===r){if(u)throw new Error(\"Queue already completed\");return a.push(e),++i,function(){for(var e=a.length;o<e;o++){var t=a[o];try{t.call(null,l(o),c)}catch(e){c(e)}}}(),d}},then:function(e){if(p(e),n!==m)throw new Error(\"queue `then` already set\");return r||(n=e,i||(u=!0,n(a))),d},catch:function(e){if(p(e),s!==t)throw new Error(\"queue `catch` already set\");return r?(e(r),r=null):s=e,d},abort:c};return d}}(),function(e){\"use strict\";var s={},i={},a=Object.freeze([\"EvalError\",\"RangeError\",\"ReferenceError\",\"SyntaxError\",\"TypeError\",\"URIError\"]);function l(){var e=\"axeAPI\",t=\"\";return void 0!==axe&&axe._audit&&axe._audit.application&&(e=axe._audit.application),void 0!==axe&&(t=axe.version),e+\".\"+t}function u(e,t,n,r,a,o){var i;n instanceof Error&&(i={name:n.name,message:n.message,stack:n.stack},n=void 0);var u={uuid:r,topic:t,message:n,error:i,_respondable:!0,_source:l(),_keepalive:a};\"function\"==typeof o&&(s[r]=o),e.postMessage(JSON.stringify(u),\"*\")}function t(e,t,n,r,a){u(e,t,n,Fe.v1(),r,a)}function c(r,a,o){return function(e,t,n){u(r,a,e,o,t,n)}}function o(e){var t;if(\"string\"==typeof e){try{t=JSON.parse(e)}catch(e){}if(function(e){if(\"object\"!==S(e)||\"string\"!=typeof e.uuid||!0!==e._respondable)return!1;var t=l();return e._source===t||\"axeAPI.x.y.z\"===e._source||\"axeAPI.x.y.z\"===t}(t))return\"object\"===S(t.error)?t.error=function(e){var t=e.message||\"Unknown error occurred\",n=a.includes(e.name)?e.name:\"Error\",r=window[n]||Error;return e.stack&&(t+=\"\\n\"+e.stack.replace(e.message,\"\")),new r(t)}(t.error):t.error=void 0,t}}t.subscribe=function(e,t){i[e]=t},t.isInFrame=function(e){return!!(e=e||window).frameElement},\"function\"==typeof window.addEventListener&&window.addEventListener(\"message\",function(t){var n=o(t.data);if(n){var r=n.uuid,e=n._keepalive,a=s[r];if(a)a(n.error||n.message,e,c(t.source,n.topic,r)),e||delete s[r];if(!n.error)try{!function(e,t,n){var r=t.topic,a=i[r];if(a){var o=c(e,null,t.uuid);a(t.message,n,o)}}(t.source,n,e)}catch(e){u(t.source,n.topic,e,r,!1)}}},!1),e.respondable=t}(utils),axe.utils.ruleShouldRun=function(e,t,n){\"use strict\";var r=n.runOnly||{},a=(n.rules||{})[e.id];return!(e.pageLevel&&!t.page)&&(\"rule\"===r.type?-1!==r.values.indexOf(e.id):a&&\"boolean\"==typeof a.enabled?a.enabled:\"tag\"===r.type&&r.values?Oe(e,r.values):Oe(e,[]))},axe.utils.getScrollState=function(e){var t=0<arguments.length&&void 0!==e?e:window,n=t.document.documentElement;return[void 0!==t.pageXOffset?{elm:t,top:t.pageYOffset,left:t.pageXOffset}:{elm:n,top:n.scrollTop,left:n.scrollLeft}].concat(function r(e){return Array.from(e.children).reduce(function(e,t){var n=axe.utils.getScroll(t);return n&&e.push(n),e.concat(r(t))},[])}(document.body))},axe.utils.setScrollState=function(e){e.forEach(function(e){return function(e,t,n){if(e===window)return e.scroll(n,t);e.scrollTop=t,e.scrollLeft=n}(e.elm,e.top,e.left)})},axe.utils.select=function(e,t){\"use strict\";var n,r=[];if(axe._selectCache)for(var a=0,o=axe._selectCache.length;a<o;a++){var i=axe._selectCache[a];if(i.selector===e)return i.result}for(var u,s=(u=t,function(e){return Be(e,u)}),l=function(e){return e.reduce(function(e,t){return e.length&&axe.utils.contains(e[e.length-1],t)||e.push(t),e},[])}(t.include),c=0;c<l.length;c++)n=l[c],r=Le(r,axe.utils.querySelectorAllFilter(n,e,s));return axe._selectCache&&axe._selectCache.push({selector:e,result:r}),r},axe.utils.toArray=function(e){\"use strict\";return Array.prototype.slice.call(e)},axe.utils.uniqueArray=function(e,t){return e.concat(t).filter(function(e,t,n){return n.indexOf(e)===t})},axe.utils.tokenList=function(e){\"use strict\";return e.trim().replace(/\\s{2,}/g,\" \").split(\" \")},function(e){var i,t=e.crypto||e.msCrypto;if(!i&&t&&t.getRandomValues){var n=new Uint8Array(16);i=function(){return t.getRandomValues(n),n}}if(!i){var r=new Array(16);i=function(){for(var e,t=0;t<16;t++)0==(3&t)&&(e=4294967296*Math.random()),r[t]=e>>>((3&t)<<3)&255;return r}}for(var u=\"function\"==typeof e.Buffer?e.Buffer:Array,a=[],o={},s=0;s<256;s++)a[s]=(s+256).toString(16).substr(1),o[a[s]]=s;function p(e,t){var n=t||0,r=a;return r[e[n++]]+r[e[n++]]+r[e[n++]]+r[e[n++]]+\"-\"+r[e[n++]]+r[e[n++]]+\"-\"+r[e[n++]]+r[e[n++]]+\"-\"+r[e[n++]]+r[e[n++]]+\"-\"+r[e[n++]]+r[e[n++]]+r[e[n++]]+r[e[n++]]+r[e[n++]]+r[e[n++]]}var l=i(),f=[1|l[0],l[1],l[2],l[3],l[4],l[5]],h=16383&(l[6]<<8|l[7]),b=0,g=0;function c(e,t,n){var r=t&&n||0;\"string\"==typeof e&&(t=\"binary\"==e?new u(16):null,e=null);var a=(e=e||{}).random||(e.rng||i)();if(a[6]=15&a[6]|64,a[8]=63&a[8]|128,t)for(var o=0;o<16;o++)t[r+o]=a[o];return t||p(a)}(Fe=c).v1=function(e,t,n){var r=t&&n||0,a=t||[],o=null!=(e=e||{}).clockseq?e.clockseq:h,i=null!=e.msecs?e.msecs:(new Date).getTime(),u=null!=e.nsecs?e.nsecs:g+1,s=i-b+(u-g)/1e4;if(s<0&&null==e.clockseq&&(o=o+1&16383),(s<0||b<i)&&null==e.nsecs&&(u=0),1e4<=u)throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");b=i,h=o;var l=(1e4*(268435455&(i+=122192928e5))+(g=u))%4294967296;a[r++]=l>>>24&255,a[r++]=l>>>16&255,a[r++]=l>>>8&255,a[r++]=255&l;var c=i/4294967296*1e4&268435455;a[r++]=c>>>8&255,a[r++]=255&c,a[r++]=c>>>24&15|16,a[r++]=c>>>16&255,a[r++]=o>>>8|128,a[r++]=255&o;for(var d=e.node||f,m=0;m<6;m++)a[r+m]=d[m];return t||p(a)},Fe.v4=c,Fe.parse=function(e,t,n){var r=t&&n||0,a=0;for(t=t||[],e.toLowerCase().replace(/[0-9a-f]{2}/g,function(e){a<16&&(t[r+a++]=o[e])});a<16;)t[r+a++]=0;return t},Fe.unparse=p,Fe.BufferClass=u}(window),axe.utils.validInputTypes=function(){\"use strict\";return[\"hidden\",\"text\",\"search\",\"tel\",\"url\",\"email\",\"password\",\"date\",\"month\",\"week\",\"time\",\"datetime-local\",\"number\",\"range\",\"color\",\"checkbox\",\"radio\",\"file\",\"submit\",\"image\",\"reset\",\"button\"]};var Ie=[\"aa\",\"ab\",\"ae\",\"af\",\"ak\",\"am\",\"an\",\"ar\",\"as\",\"av\",\"ay\",\"az\",\"ba\",\"be\",\"bg\",\"bh\",\"bi\",\"bm\",\"bn\",\"bo\",\"br\",\"bs\",\"ca\",\"ce\",\"ch\",\"co\",\"cr\",\"cs\",\"cu\",\"cv\",\"cy\",\"da\",\"de\",\"dv\",\"dz\",\"ee\",\"el\",\"en\",\"eo\",\"es\",\"et\",\"eu\",\"fa\",\"ff\",\"fi\",\"fj\",\"fo\",\"fr\",\"fy\",\"ga\",\"gd\",\"gl\",\"gn\",\"gu\",\"gv\",\"ha\",\"he\",\"hi\",\"ho\",\"hr\",\"ht\",\"hu\",\"hy\",\"hz\",\"ia\",\"id\",\"ie\",\"ig\",\"ii\",\"ik\",\"in\",\"io\",\"is\",\"it\",\"iu\",\"iw\",\"ja\",\"ji\",\"jv\",\"jw\",\"ka\",\"kg\",\"ki\",\"kj\",\"kk\",\"kl\",\"km\",\"kn\",\"ko\",\"kr\",\"ks\",\"ku\",\"kv\",\"kw\",\"ky\",\"la\",\"lb\",\"lg\",\"li\",\"ln\",\"lo\",\"lt\",\"lu\",\"lv\",\"mg\",\"mh\",\"mi\",\"mk\",\"ml\",\"mn\",\"mo\",\"mr\",\"ms\",\"mt\",\"my\",\"na\",\"nb\",\"nd\",\"ne\",\"ng\",\"nl\",\"nn\",\"no\",\"nr\",\"nv\",\"ny\",\"oc\",\"oj\",\"om\",\"or\",\"os\",\"pa\",\"pi\",\"pl\",\"ps\",\"pt\",\"qu\",\"rm\",\"rn\",\"ro\",\"ru\",\"rw\",\"sa\",\"sc\",\"sd\",\"se\",\"sg\",\"sh\",\"si\",\"sk\",\"sl\",\"sm\",\"sn\",\"so\",\"sq\",\"sr\",\"ss\",\"st\",\"su\",\"sv\",\"sw\",\"ta\",\"te\",\"tg\",\"th\",\"ti\",\"tk\",\"tl\",\"tn\",\"to\",\"tr\",\"ts\",\"tt\",\"tw\",\"ty\",\"ug\",\"uk\",\"ur\",\"uz\",\"ve\",\"vi\",\"vo\",\"wa\",\"wo\",\"xh\",\"yi\",\"yo\",\"za\",\"zh\",\"zu\",\"aaa\",\"aab\",\"aac\",\"aad\",\"aae\",\"aaf\",\"aag\",\"aah\",\"aai\",\"aak\",\"aal\",\"aam\",\"aan\",\"aao\",\"aap\",\"aaq\",\"aas\",\"aat\",\"aau\",\"aav\",\"aaw\",\"aax\",\"aaz\",\"aba\",\"abb\",\"abc\",\"abd\",\"abe\",\"abf\",\"abg\",\"abh\",\"abi\",\"abj\",\"abl\",\"abm\",\"abn\",\"abo\",\"abp\",\"abq\",\"abr\",\"abs\",\"abt\",\"abu\",\"abv\",\"abw\",\"abx\",\"aby\",\"abz\",\"aca\",\"acb\",\"acd\",\"ace\",\"acf\",\"ach\",\"aci\",\"ack\",\"acl\",\"acm\",\"acn\",\"acp\",\"acq\",\"acr\",\"acs\",\"act\",\"acu\",\"acv\",\"acw\",\"acx\",\"acy\",\"acz\",\"ada\",\"adb\",\"add\",\"ade\",\"adf\",\"adg\",\"adh\",\"adi\",\"adj\",\"adl\",\"adn\",\"ado\",\"adp\",\"adq\",\"adr\",\"ads\",\"adt\",\"adu\",\"adw\",\"adx\",\"ady\",\"adz\",\"aea\",\"aeb\",\"aec\",\"aed\",\"aee\",\"aek\",\"ael\",\"aem\",\"aen\",\"aeq\",\"aer\",\"aes\",\"aeu\",\"aew\",\"aey\",\"aez\",\"afa\",\"afb\",\"afd\",\"afe\",\"afg\",\"afh\",\"afi\",\"afk\",\"afn\",\"afo\",\"afp\",\"afs\",\"aft\",\"afu\",\"afz\",\"aga\",\"agb\",\"agc\",\"agd\",\"age\",\"agf\",\"agg\",\"agh\",\"agi\",\"agj\",\"agk\",\"agl\",\"agm\",\"agn\",\"ago\",\"agp\",\"agq\",\"agr\",\"ags\",\"agt\",\"agu\",\"agv\",\"agw\",\"agx\",\"agy\",\"agz\",\"aha\",\"ahb\",\"ahg\",\"ahh\",\"ahi\",\"ahk\",\"ahl\",\"ahm\",\"ahn\",\"aho\",\"ahp\",\"ahr\",\"ahs\",\"aht\",\"aia\",\"aib\",\"aic\",\"aid\",\"aie\",\"aif\",\"aig\",\"aih\",\"aii\",\"aij\",\"aik\",\"ail\",\"aim\",\"ain\",\"aio\",\"aip\",\"aiq\",\"air\",\"ais\",\"ait\",\"aiw\",\"aix\",\"aiy\",\"aja\",\"ajg\",\"aji\",\"ajn\",\"ajp\",\"ajt\",\"aju\",\"ajw\",\"ajz\",\"akb\",\"akc\",\"akd\",\"ake\",\"akf\",\"akg\",\"akh\",\"aki\",\"akj\",\"akk\",\"akl\",\"akm\",\"ako\",\"akp\",\"akq\",\"akr\",\"aks\",\"akt\",\"aku\",\"akv\",\"akw\",\"akx\",\"aky\",\"akz\",\"ala\",\"alc\",\"ald\",\"ale\",\"alf\",\"alg\",\"alh\",\"ali\",\"alj\",\"alk\",\"all\",\"alm\",\"aln\",\"alo\",\"alp\",\"alq\",\"alr\",\"als\",\"alt\",\"alu\",\"alv\",\"alw\",\"alx\",\"aly\",\"alz\",\"ama\",\"amb\",\"amc\",\"ame\",\"amf\",\"amg\",\"ami\",\"amj\",\"amk\",\"aml\",\"amm\",\"amn\",\"amo\",\"amp\",\"amq\",\"amr\",\"ams\",\"amt\",\"amu\",\"amv\",\"amw\",\"amx\",\"amy\",\"amz\",\"ana\",\"anb\",\"anc\",\"and\",\"ane\",\"anf\",\"ang\",\"anh\",\"ani\",\"anj\",\"ank\",\"anl\",\"anm\",\"ann\",\"ano\",\"anp\",\"anq\",\"anr\",\"ans\",\"ant\",\"anu\",\"anv\",\"anw\",\"anx\",\"any\",\"anz\",\"aoa\",\"aob\",\"aoc\",\"aod\",\"aoe\",\"aof\",\"aog\",\"aoh\",\"aoi\",\"aoj\",\"aok\",\"aol\",\"aom\",\"aon\",\"aor\",\"aos\",\"aot\",\"aou\",\"aox\",\"aoz\",\"apa\",\"apb\",\"apc\",\"apd\",\"ape\",\"apf\",\"apg\",\"aph\",\"api\",\"apj\",\"apk\",\"apl\",\"apm\",\"apn\",\"apo\",\"app\",\"apq\",\"apr\",\"aps\",\"apt\",\"apu\",\"apv\",\"apw\",\"apx\",\"apy\",\"apz\",\"aqa\",\"aqc\",\"aqd\",\"aqg\",\"aql\",\"aqm\",\"aqn\",\"aqp\",\"aqr\",\"aqt\",\"aqz\",\"arb\",\"arc\",\"ard\",\"are\",\"arh\",\"ari\",\"arj\",\"ark\",\"arl\",\"arn\",\"aro\",\"arp\",\"arq\",\"arr\",\"ars\",\"art\",\"aru\",\"arv\",\"arw\",\"arx\",\"ary\",\"arz\",\"asa\",\"asb\",\"asc\",\"asd\",\"ase\",\"asf\",\"asg\",\"ash\",\"asi\",\"asj\",\"ask\",\"asl\",\"asn\",\"aso\",\"asp\",\"asq\",\"asr\",\"ass\",\"ast\",\"asu\",\"asv\",\"asw\",\"asx\",\"asy\",\"asz\",\"ata\",\"atb\",\"atc\",\"atd\",\"ate\",\"atg\",\"ath\",\"ati\",\"atj\",\"atk\",\"atl\",\"atm\",\"atn\",\"ato\",\"atp\",\"atq\",\"atr\",\"ats\",\"att\",\"atu\",\"atv\",\"atw\",\"atx\",\"aty\",\"atz\",\"aua\",\"aub\",\"auc\",\"aud\",\"aue\",\"auf\",\"aug\",\"auh\",\"aui\",\"auj\",\"auk\",\"aul\",\"aum\",\"aun\",\"auo\",\"aup\",\"auq\",\"aur\",\"aus\",\"aut\",\"auu\",\"auw\",\"aux\",\"auy\",\"auz\",\"avb\",\"avd\",\"avi\",\"avk\",\"avl\",\"avm\",\"avn\",\"avo\",\"avs\",\"avt\",\"avu\",\"avv\",\"awa\",\"awb\",\"awc\",\"awd\",\"awe\",\"awg\",\"awh\",\"awi\",\"awk\",\"awm\",\"awn\",\"awo\",\"awr\",\"aws\",\"awt\",\"awu\",\"awv\",\"aww\",\"awx\",\"awy\",\"axb\",\"axe\",\"axg\",\"axk\",\"axl\",\"axm\",\"axx\",\"aya\",\"ayb\",\"ayc\",\"ayd\",\"aye\",\"ayg\",\"ayh\",\"ayi\",\"ayk\",\"ayl\",\"ayn\",\"ayo\",\"ayp\",\"ayq\",\"ayr\",\"ays\",\"ayt\",\"ayu\",\"ayx\",\"ayy\",\"ayz\",\"aza\",\"azb\",\"azc\",\"azd\",\"azg\",\"azj\",\"azm\",\"azn\",\"azo\",\"azt\",\"azz\",\"baa\",\"bab\",\"bac\",\"bad\",\"bae\",\"baf\",\"bag\",\"bah\",\"bai\",\"baj\",\"bal\",\"ban\",\"bao\",\"bap\",\"bar\",\"bas\",\"bat\",\"bau\",\"bav\",\"baw\",\"bax\",\"bay\",\"baz\",\"bba\",\"bbb\",\"bbc\",\"bbd\",\"bbe\",\"bbf\",\"bbg\",\"bbh\",\"bbi\",\"bbj\",\"bbk\",\"bbl\",\"bbm\",\"bbn\",\"bbo\",\"bbp\",\"bbq\",\"bbr\",\"bbs\",\"bbt\",\"bbu\",\"bbv\",\"bbw\",\"bbx\",\"bby\",\"bbz\",\"bca\",\"bcb\",\"bcc\",\"bcd\",\"bce\",\"bcf\",\"bcg\",\"bch\",\"bci\",\"bcj\",\"bck\",\"bcl\",\"bcm\",\"bcn\",\"bco\",\"bcp\",\"bcq\",\"bcr\",\"bcs\",\"bct\",\"bcu\",\"bcv\",\"bcw\",\"bcy\",\"bcz\",\"bda\",\"bdb\",\"bdc\",\"bdd\",\"bde\",\"bdf\",\"bdg\",\"bdh\",\"bdi\",\"bdj\",\"bdk\",\"bdl\",\"bdm\",\"bdn\",\"bdo\",\"bdp\",\"bdq\",\"bdr\",\"bds\",\"bdt\",\"bdu\",\"bdv\",\"bdw\",\"bdx\",\"bdy\",\"bdz\",\"bea\",\"beb\",\"bec\",\"bed\",\"bee\",\"bef\",\"beg\",\"beh\",\"bei\",\"bej\",\"bek\",\"bem\",\"beo\",\"bep\",\"beq\",\"ber\",\"bes\",\"bet\",\"beu\",\"bev\",\"bew\",\"bex\",\"bey\",\"bez\",\"bfa\",\"bfb\",\"bfc\",\"bfd\",\"bfe\",\"bff\",\"bfg\",\"bfh\",\"bfi\",\"bfj\",\"bfk\",\"bfl\",\"bfm\",\"bfn\",\"bfo\",\"bfp\",\"bfq\",\"bfr\",\"bfs\",\"bft\",\"bfu\",\"bfw\",\"bfx\",\"bfy\",\"bfz\",\"bga\",\"bgb\",\"bgc\",\"bgd\",\"bge\",\"bgf\",\"bgg\",\"bgi\",\"bgj\",\"bgk\",\"bgl\",\"bgm\",\"bgn\",\"bgo\",\"bgp\",\"bgq\",\"bgr\",\"bgs\",\"bgt\",\"bgu\",\"bgv\",\"bgw\",\"bgx\",\"bgy\",\"bgz\",\"bha\",\"bhb\",\"bhc\",\"bhd\",\"bhe\",\"bhf\",\"bhg\",\"bhh\",\"bhi\",\"bhj\",\"bhk\",\"bhl\",\"bhm\",\"bhn\",\"bho\",\"bhp\",\"bhq\",\"bhr\",\"bhs\",\"bht\",\"bhu\",\"bhv\",\"bhw\",\"bhx\",\"bhy\",\"bhz\",\"bia\",\"bib\",\"bic\",\"bid\",\"bie\",\"bif\",\"big\",\"bij\",\"bik\",\"bil\",\"bim\",\"bin\",\"bio\",\"bip\",\"biq\",\"bir\",\"bit\",\"biu\",\"biv\",\"biw\",\"bix\",\"biy\",\"biz\",\"bja\",\"bjb\",\"bjc\",\"bjd\",\"bje\",\"bjf\",\"bjg\",\"bjh\",\"bji\",\"bjj\",\"bjk\",\"bjl\",\"bjm\",\"bjn\",\"bjo\",\"bjp\",\"bjq\",\"bjr\",\"bjs\",\"bjt\",\"bju\",\"bjv\",\"bjw\",\"bjx\",\"bjy\",\"bjz\",\"bka\",\"bkb\",\"bkc\",\"bkd\",\"bkf\",\"bkg\",\"bkh\",\"bki\",\"bkj\",\"bkk\",\"bkl\",\"bkm\",\"bkn\",\"bko\",\"bkp\",\"bkq\",\"bkr\",\"bks\",\"bkt\",\"bku\",\"bkv\",\"bkw\",\"bkx\",\"bky\",\"bkz\",\"bla\",\"blb\",\"blc\",\"bld\",\"ble\",\"blf\",\"blg\",\"blh\",\"bli\",\"blj\",\"blk\",\"bll\",\"blm\",\"bln\",\"blo\",\"blp\",\"blq\",\"blr\",\"bls\",\"blt\",\"blv\",\"blw\",\"blx\",\"bly\",\"blz\",\"bma\",\"bmb\",\"bmc\",\"bmd\",\"bme\",\"bmf\",\"bmg\",\"bmh\",\"bmi\",\"bmj\",\"bmk\",\"bml\",\"bmm\",\"bmn\",\"bmo\",\"bmp\",\"bmq\",\"bmr\",\"bms\",\"bmt\",\"bmu\",\"bmv\",\"bmw\",\"bmx\",\"bmy\",\"bmz\",\"bna\",\"bnb\",\"bnc\",\"bnd\",\"bne\",\"bnf\",\"bng\",\"bni\",\"bnj\",\"bnk\",\"bnl\",\"bnm\",\"bnn\",\"bno\",\"bnp\",\"bnq\",\"bnr\",\"bns\",\"bnt\",\"bnu\",\"bnv\",\"bnw\",\"bnx\",\"bny\",\"bnz\",\"boa\",\"bob\",\"boe\",\"bof\",\"bog\",\"boh\",\"boi\",\"boj\",\"bok\",\"bol\",\"bom\",\"bon\",\"boo\",\"bop\",\"boq\",\"bor\",\"bot\",\"bou\",\"bov\",\"bow\",\"box\",\"boy\",\"boz\",\"bpa\",\"bpb\",\"bpd\",\"bpg\",\"bph\",\"bpi\",\"bpj\",\"bpk\",\"bpl\",\"bpm\",\"bpn\",\"bpo\",\"bpp\",\"bpq\",\"bpr\",\"bps\",\"bpt\",\"bpu\",\"bpv\",\"bpw\",\"bpx\",\"bpy\",\"bpz\",\"bqa\",\"bqb\",\"bqc\",\"bqd\",\"bqf\",\"bqg\",\"bqh\",\"bqi\",\"bqj\",\"bqk\",\"bql\",\"bqm\",\"bqn\",\"bqo\",\"bqp\",\"bqq\",\"bqr\",\"bqs\",\"bqt\",\"bqu\",\"bqv\",\"bqw\",\"bqx\",\"bqy\",\"bqz\",\"bra\",\"brb\",\"brc\",\"brd\",\"brf\",\"brg\",\"brh\",\"bri\",\"brj\",\"brk\",\"brl\",\"brm\",\"brn\",\"bro\",\"brp\",\"brq\",\"brr\",\"brs\",\"brt\",\"bru\",\"brv\",\"brw\",\"brx\",\"bry\",\"brz\",\"bsa\",\"bsb\",\"bsc\",\"bse\",\"bsf\",\"bsg\",\"bsh\",\"bsi\",\"bsj\",\"bsk\",\"bsl\",\"bsm\",\"bsn\",\"bso\",\"bsp\",\"bsq\",\"bsr\",\"bss\",\"bst\",\"bsu\",\"bsv\",\"bsw\",\"bsx\",\"bsy\",\"bta\",\"btb\",\"btc\",\"btd\",\"bte\",\"btf\",\"btg\",\"bth\",\"bti\",\"btj\",\"btk\",\"btl\",\"btm\",\"btn\",\"bto\",\"btp\",\"btq\",\"btr\",\"bts\",\"btt\",\"btu\",\"btv\",\"btw\",\"btx\",\"bty\",\"btz\",\"bua\",\"bub\",\"buc\",\"bud\",\"bue\",\"buf\",\"bug\",\"buh\",\"bui\",\"buj\",\"buk\",\"bum\",\"bun\",\"buo\",\"bup\",\"buq\",\"bus\",\"but\",\"buu\",\"buv\",\"buw\",\"bux\",\"buy\",\"buz\",\"bva\",\"bvb\",\"bvc\",\"bvd\",\"bve\",\"bvf\",\"bvg\",\"bvh\",\"bvi\",\"bvj\",\"bvk\",\"bvl\",\"bvm\",\"bvn\",\"bvo\",\"bvp\",\"bvq\",\"bvr\",\"bvt\",\"bvu\",\"bvv\",\"bvw\",\"bvx\",\"bvy\",\"bvz\",\"bwa\",\"bwb\",\"bwc\",\"bwd\",\"bwe\",\"bwf\",\"bwg\",\"bwh\",\"bwi\",\"bwj\",\"bwk\",\"bwl\",\"bwm\",\"bwn\",\"bwo\",\"bwp\",\"bwq\",\"bwr\",\"bws\",\"bwt\",\"bwu\",\"bww\",\"bwx\",\"bwy\",\"bwz\",\"bxa\",\"bxb\",\"bxc\",\"bxd\",\"bxe\",\"bxf\",\"bxg\",\"bxh\",\"bxi\",\"bxj\",\"bxk\",\"bxl\",\"bxm\",\"bxn\",\"bxo\",\"bxp\",\"bxq\",\"bxr\",\"bxs\",\"bxu\",\"bxv\",\"bxw\",\"bxx\",\"bxz\",\"bya\",\"byb\",\"byc\",\"byd\",\"bye\",\"byf\",\"byg\",\"byh\",\"byi\",\"byj\",\"byk\",\"byl\",\"bym\",\"byn\",\"byo\",\"byp\",\"byq\",\"byr\",\"bys\",\"byt\",\"byv\",\"byw\",\"byx\",\"byy\",\"byz\",\"bza\",\"bzb\",\"bzc\",\"bzd\",\"bze\",\"bzf\",\"bzg\",\"bzh\",\"bzi\",\"bzj\",\"bzk\",\"bzl\",\"bzm\",\"bzn\",\"bzo\",\"bzp\",\"bzq\",\"bzr\",\"bzs\",\"bzt\",\"bzu\",\"bzv\",\"bzw\",\"bzx\",\"bzy\",\"bzz\",\"caa\",\"cab\",\"cac\",\"cad\",\"cae\",\"caf\",\"cag\",\"cah\",\"cai\",\"caj\",\"cak\",\"cal\",\"cam\",\"can\",\"cao\",\"cap\",\"caq\",\"car\",\"cas\",\"cau\",\"cav\",\"caw\",\"cax\",\"cay\",\"caz\",\"cba\",\"cbb\",\"cbc\",\"cbd\",\"cbe\",\"cbg\",\"cbh\",\"cbi\",\"cbj\",\"cbk\",\"cbl\",\"cbn\",\"cbo\",\"cbq\",\"cbr\",\"cbs\",\"cbt\",\"cbu\",\"cbv\",\"cbw\",\"cby\",\"cca\",\"ccc\",\"ccd\",\"cce\",\"ccg\",\"cch\",\"ccj\",\"ccl\",\"ccm\",\"ccn\",\"cco\",\"ccp\",\"ccq\",\"ccr\",\"ccs\",\"cda\",\"cdc\",\"cdd\",\"cde\",\"cdf\",\"cdg\",\"cdh\",\"cdi\",\"cdj\",\"cdm\",\"cdn\",\"cdo\",\"cdr\",\"cds\",\"cdy\",\"cdz\",\"cea\",\"ceb\",\"ceg\",\"cek\",\"cel\",\"cen\",\"cet\",\"cfa\",\"cfd\",\"cfg\",\"cfm\",\"cga\",\"cgc\",\"cgg\",\"cgk\",\"chb\",\"chc\",\"chd\",\"chf\",\"chg\",\"chh\",\"chj\",\"chk\",\"chl\",\"chm\",\"chn\",\"cho\",\"chp\",\"chq\",\"chr\",\"cht\",\"chw\",\"chx\",\"chy\",\"chz\",\"cia\",\"cib\",\"cic\",\"cid\",\"cie\",\"cih\",\"cik\",\"cim\",\"cin\",\"cip\",\"cir\",\"ciw\",\"ciy\",\"cja\",\"cje\",\"cjh\",\"cji\",\"cjk\",\"cjm\",\"cjn\",\"cjo\",\"cjp\",\"cjr\",\"cjs\",\"cjv\",\"cjy\",\"cka\",\"ckb\",\"ckh\",\"ckl\",\"ckn\",\"cko\",\"ckq\",\"ckr\",\"cks\",\"ckt\",\"cku\",\"ckv\",\"ckx\",\"cky\",\"ckz\",\"cla\",\"clc\",\"cld\",\"cle\",\"clh\",\"cli\",\"clj\",\"clk\",\"cll\",\"clm\",\"clo\",\"clt\",\"clu\",\"clw\",\"cly\",\"cma\",\"cmc\",\"cme\",\"cmg\",\"cmi\",\"cmk\",\"cml\",\"cmm\",\"cmn\",\"cmo\",\"cmr\",\"cms\",\"cmt\",\"cna\",\"cnb\",\"cnc\",\"cng\",\"cnh\",\"cni\",\"cnk\",\"cnl\",\"cno\",\"cnr\",\"cns\",\"cnt\",\"cnu\",\"cnw\",\"cnx\",\"coa\",\"cob\",\"coc\",\"cod\",\"coe\",\"cof\",\"cog\",\"coh\",\"coj\",\"cok\",\"col\",\"com\",\"con\",\"coo\",\"cop\",\"coq\",\"cot\",\"cou\",\"cov\",\"cow\",\"cox\",\"coy\",\"coz\",\"cpa\",\"cpb\",\"cpc\",\"cpe\",\"cpf\",\"cpg\",\"cpi\",\"cpn\",\"cpo\",\"cpp\",\"cps\",\"cpu\",\"cpx\",\"cpy\",\"cqd\",\"cqu\",\"cra\",\"crb\",\"crc\",\"crd\",\"crf\",\"crg\",\"crh\",\"cri\",\"crj\",\"crk\",\"crl\",\"crm\",\"crn\",\"cro\",\"crp\",\"crq\",\"crr\",\"crs\",\"crt\",\"crv\",\"crw\",\"crx\",\"cry\",\"crz\",\"csa\",\"csb\",\"csc\",\"csd\",\"cse\",\"csf\",\"csg\",\"csh\",\"csi\",\"csj\",\"csk\",\"csl\",\"csm\",\"csn\",\"cso\",\"csq\",\"csr\",\"css\",\"cst\",\"csu\",\"csv\",\"csw\",\"csy\",\"csz\",\"cta\",\"ctc\",\"ctd\",\"cte\",\"ctg\",\"cth\",\"ctl\",\"ctm\",\"ctn\",\"cto\",\"ctp\",\"cts\",\"ctt\",\"ctu\",\"ctz\",\"cua\",\"cub\",\"cuc\",\"cug\",\"cuh\",\"cui\",\"cuj\",\"cuk\",\"cul\",\"cum\",\"cuo\",\"cup\",\"cuq\",\"cur\",\"cus\",\"cut\",\"cuu\",\"cuv\",\"cuw\",\"cux\",\"cuy\",\"cvg\",\"cvn\",\"cwa\",\"cwb\",\"cwd\",\"cwe\",\"cwg\",\"cwt\",\"cya\",\"cyb\",\"cyo\",\"czh\",\"czk\",\"czn\",\"czo\",\"czt\",\"daa\",\"dac\",\"dad\",\"dae\",\"daf\",\"dag\",\"dah\",\"dai\",\"daj\",\"dak\",\"dal\",\"dam\",\"dao\",\"dap\",\"daq\",\"dar\",\"das\",\"dau\",\"dav\",\"daw\",\"dax\",\"day\",\"daz\",\"dba\",\"dbb\",\"dbd\",\"dbe\",\"dbf\",\"dbg\",\"dbi\",\"dbj\",\"dbl\",\"dbm\",\"dbn\",\"dbo\",\"dbp\",\"dbq\",\"dbr\",\"dbt\",\"dbu\",\"dbv\",\"dbw\",\"dby\",\"dcc\",\"dcr\",\"dda\",\"ddd\",\"dde\",\"ddg\",\"ddi\",\"ddj\",\"ddn\",\"ddo\",\"ddr\",\"dds\",\"ddw\",\"dec\",\"ded\",\"dee\",\"def\",\"deg\",\"deh\",\"dei\",\"dek\",\"del\",\"dem\",\"den\",\"dep\",\"deq\",\"der\",\"des\",\"dev\",\"dez\",\"dga\",\"dgb\",\"dgc\",\"dgd\",\"dge\",\"dgg\",\"dgh\",\"dgi\",\"dgk\",\"dgl\",\"dgn\",\"dgo\",\"dgr\",\"dgs\",\"dgt\",\"dgu\",\"dgw\",\"dgx\",\"dgz\",\"dha\",\"dhd\",\"dhg\",\"dhi\",\"dhl\",\"dhm\",\"dhn\",\"dho\",\"dhr\",\"dhs\",\"dhu\",\"dhv\",\"dhw\",\"dhx\",\"dia\",\"dib\",\"dic\",\"did\",\"dif\",\"dig\",\"dih\",\"dii\",\"dij\",\"dik\",\"dil\",\"dim\",\"din\",\"dio\",\"dip\",\"diq\",\"dir\",\"dis\",\"dit\",\"diu\",\"diw\",\"dix\",\"diy\",\"diz\",\"dja\",\"djb\",\"djc\",\"djd\",\"dje\",\"djf\",\"dji\",\"djj\",\"djk\",\"djl\",\"djm\",\"djn\",\"djo\",\"djr\",\"dju\",\"djw\",\"dka\",\"dkk\",\"dkl\",\"dkr\",\"dks\",\"dkx\",\"dlg\",\"dlk\",\"dlm\",\"dln\",\"dma\",\"dmb\",\"dmc\",\"dmd\",\"dme\",\"dmg\",\"dmk\",\"dml\",\"dmm\",\"dmn\",\"dmo\",\"dmr\",\"dms\",\"dmu\",\"dmv\",\"dmw\",\"dmx\",\"dmy\",\"dna\",\"dnd\",\"dne\",\"dng\",\"dni\",\"dnj\",\"dnk\",\"dnn\",\"dnr\",\"dnt\",\"dnu\",\"dnv\",\"dnw\",\"dny\",\"doa\",\"dob\",\"doc\",\"doe\",\"dof\",\"doh\",\"doi\",\"dok\",\"dol\",\"don\",\"doo\",\"dop\",\"doq\",\"dor\",\"dos\",\"dot\",\"dov\",\"dow\",\"dox\",\"doy\",\"doz\",\"dpp\",\"dra\",\"drb\",\"drc\",\"drd\",\"dre\",\"drg\",\"drh\",\"dri\",\"drl\",\"drn\",\"dro\",\"drq\",\"drr\",\"drs\",\"drt\",\"dru\",\"drw\",\"dry\",\"dsb\",\"dse\",\"dsh\",\"dsi\",\"dsl\",\"dsn\",\"dso\",\"dsq\",\"dta\",\"dtb\",\"dtd\",\"dth\",\"dti\",\"dtk\",\"dtm\",\"dtn\",\"dto\",\"dtp\",\"dtr\",\"dts\",\"dtt\",\"dtu\",\"dty\",\"dua\",\"dub\",\"duc\",\"dud\",\"due\",\"duf\",\"dug\",\"duh\",\"dui\",\"duj\",\"duk\",\"dul\",\"dum\",\"dun\",\"duo\",\"dup\",\"duq\",\"dur\",\"dus\",\"duu\",\"duv\",\"duw\",\"dux\",\"duy\",\"duz\",\"dva\",\"dwa\",\"dwl\",\"dwr\",\"dws\",\"dwu\",\"dww\",\"dwy\",\"dya\",\"dyb\",\"dyd\",\"dyg\",\"dyi\",\"dym\",\"dyn\",\"dyo\",\"dyu\",\"dyy\",\"dza\",\"dzd\",\"dze\",\"dzg\",\"dzl\",\"dzn\",\"eaa\",\"ebg\",\"ebk\",\"ebo\",\"ebr\",\"ebu\",\"ecr\",\"ecs\",\"ecy\",\"eee\",\"efa\",\"efe\",\"efi\",\"ega\",\"egl\",\"ego\",\"egx\",\"egy\",\"ehu\",\"eip\",\"eit\",\"eiv\",\"eja\",\"eka\",\"ekc\",\"eke\",\"ekg\",\"eki\",\"ekk\",\"ekl\",\"ekm\",\"eko\",\"ekp\",\"ekr\",\"eky\",\"ele\",\"elh\",\"eli\",\"elk\",\"elm\",\"elo\",\"elp\",\"elu\",\"elx\",\"ema\",\"emb\",\"eme\",\"emg\",\"emi\",\"emk\",\"emm\",\"emn\",\"emo\",\"emp\",\"ems\",\"emu\",\"emw\",\"emx\",\"emy\",\"ena\",\"enb\",\"enc\",\"end\",\"enf\",\"enh\",\"enl\",\"enm\",\"enn\",\"eno\",\"enq\",\"enr\",\"enu\",\"env\",\"enw\",\"enx\",\"eot\",\"epi\",\"era\",\"erg\",\"erh\",\"eri\",\"erk\",\"ero\",\"err\",\"ers\",\"ert\",\"erw\",\"ese\",\"esg\",\"esh\",\"esi\",\"esk\",\"esl\",\"esm\",\"esn\",\"eso\",\"esq\",\"ess\",\"esu\",\"esx\",\"esy\",\"etb\",\"etc\",\"eth\",\"etn\",\"eto\",\"etr\",\"ets\",\"ett\",\"etu\",\"etx\",\"etz\",\"euq\",\"eve\",\"evh\",\"evn\",\"ewo\",\"ext\",\"eya\",\"eyo\",\"eza\",\"eze\",\"faa\",\"fab\",\"fad\",\"faf\",\"fag\",\"fah\",\"fai\",\"faj\",\"fak\",\"fal\",\"fam\",\"fan\",\"fap\",\"far\",\"fat\",\"fau\",\"fax\",\"fay\",\"faz\",\"fbl\",\"fcs\",\"fer\",\"ffi\",\"ffm\",\"fgr\",\"fia\",\"fie\",\"fil\",\"fip\",\"fir\",\"fit\",\"fiu\",\"fiw\",\"fkk\",\"fkv\",\"fla\",\"flh\",\"fli\",\"fll\",\"fln\",\"flr\",\"fly\",\"fmp\",\"fmu\",\"fnb\",\"fng\",\"fni\",\"fod\",\"foi\",\"fom\",\"fon\",\"for\",\"fos\",\"fox\",\"fpe\",\"fqs\",\"frc\",\"frd\",\"frk\",\"frm\",\"fro\",\"frp\",\"frq\",\"frr\",\"frs\",\"frt\",\"fse\",\"fsl\",\"fss\",\"fub\",\"fuc\",\"fud\",\"fue\",\"fuf\",\"fuh\",\"fui\",\"fuj\",\"fum\",\"fun\",\"fuq\",\"fur\",\"fut\",\"fuu\",\"fuv\",\"fuy\",\"fvr\",\"fwa\",\"fwe\",\"gaa\",\"gab\",\"gac\",\"gad\",\"gae\",\"gaf\",\"gag\",\"gah\",\"gai\",\"gaj\",\"gak\",\"gal\",\"gam\",\"gan\",\"gao\",\"gap\",\"gaq\",\"gar\",\"gas\",\"gat\",\"gau\",\"gav\",\"gaw\",\"gax\",\"gay\",\"gaz\",\"gba\",\"gbb\",\"gbc\",\"gbd\",\"gbe\",\"gbf\",\"gbg\",\"gbh\",\"gbi\",\"gbj\",\"gbk\",\"gbl\",\"gbm\",\"gbn\",\"gbo\",\"gbp\",\"gbq\",\"gbr\",\"gbs\",\"gbu\",\"gbv\",\"gbw\",\"gbx\",\"gby\",\"gbz\",\"gcc\",\"gcd\",\"gce\",\"gcf\",\"gcl\",\"gcn\",\"gcr\",\"gct\",\"gda\",\"gdb\",\"gdc\",\"gdd\",\"gde\",\"gdf\",\"gdg\",\"gdh\",\"gdi\",\"gdj\",\"gdk\",\"gdl\",\"gdm\",\"gdn\",\"gdo\",\"gdq\",\"gdr\",\"gds\",\"gdt\",\"gdu\",\"gdx\",\"gea\",\"geb\",\"gec\",\"ged\",\"geg\",\"geh\",\"gei\",\"gej\",\"gek\",\"gel\",\"gem\",\"geq\",\"ges\",\"gev\",\"gew\",\"gex\",\"gey\",\"gez\",\"gfk\",\"gft\",\"gfx\",\"gga\",\"ggb\",\"ggd\",\"gge\",\"ggg\",\"ggk\",\"ggl\",\"ggn\",\"ggo\",\"ggr\",\"ggt\",\"ggu\",\"ggw\",\"gha\",\"ghc\",\"ghe\",\"ghh\",\"ghk\",\"ghl\",\"ghn\",\"gho\",\"ghr\",\"ghs\",\"ght\",\"gia\",\"gib\",\"gic\",\"gid\",\"gie\",\"gig\",\"gih\",\"gil\",\"gim\",\"gin\",\"gio\",\"gip\",\"giq\",\"gir\",\"gis\",\"git\",\"giu\",\"giw\",\"gix\",\"giy\",\"giz\",\"gji\",\"gjk\",\"gjm\",\"gjn\",\"gjr\",\"gju\",\"gka\",\"gkd\",\"gke\",\"gkn\",\"gko\",\"gkp\",\"gku\",\"glc\",\"gld\",\"glh\",\"gli\",\"glj\",\"glk\",\"gll\",\"glo\",\"glr\",\"glu\",\"glw\",\"gly\",\"gma\",\"gmb\",\"gmd\",\"gme\",\"gmg\",\"gmh\",\"gml\",\"gmm\",\"gmn\",\"gmq\",\"gmu\",\"gmv\",\"gmw\",\"gmx\",\"gmy\",\"gmz\",\"gna\",\"gnb\",\"gnc\",\"gnd\",\"gne\",\"gng\",\"gnh\",\"gni\",\"gnj\",\"gnk\",\"gnl\",\"gnm\",\"gnn\",\"gno\",\"gnq\",\"gnr\",\"gnt\",\"gnu\",\"gnw\",\"gnz\",\"goa\",\"gob\",\"goc\",\"god\",\"goe\",\"gof\",\"gog\",\"goh\",\"goi\",\"goj\",\"gok\",\"gol\",\"gom\",\"gon\",\"goo\",\"gop\",\"goq\",\"gor\",\"gos\",\"got\",\"gou\",\"gow\",\"gox\",\"goy\",\"goz\",\"gpa\",\"gpe\",\"gpn\",\"gqa\",\"gqi\",\"gqn\",\"gqr\",\"gqu\",\"gra\",\"grb\",\"grc\",\"grd\",\"grg\",\"grh\",\"gri\",\"grj\",\"grk\",\"grm\",\"gro\",\"grq\",\"grr\",\"grs\",\"grt\",\"gru\",\"grv\",\"grw\",\"grx\",\"gry\",\"grz\",\"gse\",\"gsg\",\"gsl\",\"gsm\",\"gsn\",\"gso\",\"gsp\",\"gss\",\"gsw\",\"gta\",\"gti\",\"gtu\",\"gua\",\"gub\",\"guc\",\"gud\",\"gue\",\"guf\",\"gug\",\"guh\",\"gui\",\"guk\",\"gul\",\"gum\",\"gun\",\"guo\",\"gup\",\"guq\",\"gur\",\"gus\",\"gut\",\"guu\",\"guv\",\"guw\",\"gux\",\"guz\",\"gva\",\"gvc\",\"gve\",\"gvf\",\"gvj\",\"gvl\",\"gvm\",\"gvn\",\"gvo\",\"gvp\",\"gvr\",\"gvs\",\"gvy\",\"gwa\",\"gwb\",\"gwc\",\"gwd\",\"gwe\",\"gwf\",\"gwg\",\"gwi\",\"gwj\",\"gwm\",\"gwn\",\"gwr\",\"gwt\",\"gwu\",\"gww\",\"gwx\",\"gxx\",\"gya\",\"gyb\",\"gyd\",\"gye\",\"gyf\",\"gyg\",\"gyi\",\"gyl\",\"gym\",\"gyn\",\"gyo\",\"gyr\",\"gyy\",\"gza\",\"gzi\",\"gzn\",\"haa\",\"hab\",\"hac\",\"had\",\"hae\",\"haf\",\"hag\",\"hah\",\"hai\",\"haj\",\"hak\",\"hal\",\"ham\",\"han\",\"hao\",\"hap\",\"haq\",\"har\",\"has\",\"hav\",\"haw\",\"hax\",\"hay\",\"haz\",\"hba\",\"hbb\",\"hbn\",\"hbo\",\"hbu\",\"hca\",\"hch\",\"hdn\",\"hds\",\"hdy\",\"hea\",\"hed\",\"heg\",\"heh\",\"hei\",\"hem\",\"hgm\",\"hgw\",\"hhi\",\"hhr\",\"hhy\",\"hia\",\"hib\",\"hid\",\"hif\",\"hig\",\"hih\",\"hii\",\"hij\",\"hik\",\"hil\",\"him\",\"hio\",\"hir\",\"hit\",\"hiw\",\"hix\",\"hji\",\"hka\",\"hke\",\"hkk\",\"hkn\",\"hks\",\"hla\",\"hlb\",\"hld\",\"hle\",\"hlt\",\"hlu\",\"hma\",\"hmb\",\"hmc\",\"hmd\",\"hme\",\"hmf\",\"hmg\",\"hmh\",\"hmi\",\"hmj\",\"hmk\",\"hml\",\"hmm\",\"hmn\",\"hmp\",\"hmq\",\"hmr\",\"hms\",\"hmt\",\"hmu\",\"hmv\",\"hmw\",\"hmx\",\"hmy\",\"hmz\",\"hna\",\"hnd\",\"hne\",\"hnh\",\"hni\",\"hnj\",\"hnn\",\"hno\",\"hns\",\"hnu\",\"hoa\",\"hob\",\"hoc\",\"hod\",\"hoe\",\"hoh\",\"hoi\",\"hoj\",\"hok\",\"hol\",\"hom\",\"hoo\",\"hop\",\"hor\",\"hos\",\"hot\",\"hov\",\"how\",\"hoy\",\"hoz\",\"hpo\",\"hps\",\"hra\",\"hrc\",\"hre\",\"hrk\",\"hrm\",\"hro\",\"hrp\",\"hrr\",\"hrt\",\"hru\",\"hrw\",\"hrx\",\"hrz\",\"hsb\",\"hsh\",\"hsl\",\"hsn\",\"hss\",\"hti\",\"hto\",\"hts\",\"htu\",\"htx\",\"hub\",\"huc\",\"hud\",\"hue\",\"huf\",\"hug\",\"huh\",\"hui\",\"huj\",\"huk\",\"hul\",\"hum\",\"huo\",\"hup\",\"huq\",\"hur\",\"hus\",\"hut\",\"huu\",\"huv\",\"huw\",\"hux\",\"huy\",\"huz\",\"hvc\",\"hve\",\"hvk\",\"hvn\",\"hvv\",\"hwa\",\"hwc\",\"hwo\",\"hya\",\"hyw\",\"hyx\",\"iai\",\"ian\",\"iap\",\"iar\",\"iba\",\"ibb\",\"ibd\",\"ibe\",\"ibg\",\"ibh\",\"ibi\",\"ibl\",\"ibm\",\"ibn\",\"ibr\",\"ibu\",\"iby\",\"ica\",\"ich\",\"icl\",\"icr\",\"ida\",\"idb\",\"idc\",\"idd\",\"ide\",\"idi\",\"idr\",\"ids\",\"idt\",\"idu\",\"ifa\",\"ifb\",\"ife\",\"iff\",\"ifk\",\"ifm\",\"ifu\",\"ify\",\"igb\",\"ige\",\"igg\",\"igl\",\"igm\",\"ign\",\"igo\",\"igs\",\"igw\",\"ihb\",\"ihi\",\"ihp\",\"ihw\",\"iin\",\"iir\",\"ijc\",\"ije\",\"ijj\",\"ijn\",\"ijo\",\"ijs\",\"ike\",\"iki\",\"ikk\",\"ikl\",\"iko\",\"ikp\",\"ikr\",\"iks\",\"ikt\",\"ikv\",\"ikw\",\"ikx\",\"ikz\",\"ila\",\"ilb\",\"ilg\",\"ili\",\"ilk\",\"ill\",\"ilm\",\"ilo\",\"ilp\",\"ils\",\"ilu\",\"ilv\",\"ilw\",\"ima\",\"ime\",\"imi\",\"iml\",\"imn\",\"imo\",\"imr\",\"ims\",\"imy\",\"inb\",\"inc\",\"ine\",\"ing\",\"inh\",\"inj\",\"inl\",\"inm\",\"inn\",\"ino\",\"inp\",\"ins\",\"int\",\"inz\",\"ior\",\"iou\",\"iow\",\"ipi\",\"ipo\",\"iqu\",\"iqw\",\"ira\",\"ire\",\"irh\",\"iri\",\"irk\",\"irn\",\"iro\",\"irr\",\"iru\",\"irx\",\"iry\",\"isa\",\"isc\",\"isd\",\"ise\",\"isg\",\"ish\",\"isi\",\"isk\",\"ism\",\"isn\",\"iso\",\"isr\",\"ist\",\"isu\",\"itb\",\"itc\",\"itd\",\"ite\",\"iti\",\"itk\",\"itl\",\"itm\",\"ito\",\"itr\",\"its\",\"itt\",\"itv\",\"itw\",\"itx\",\"ity\",\"itz\",\"ium\",\"ivb\",\"ivv\",\"iwk\",\"iwm\",\"iwo\",\"iws\",\"ixc\",\"ixl\",\"iya\",\"iyo\",\"iyx\",\"izh\",\"izi\",\"izr\",\"izz\",\"jaa\",\"jab\",\"jac\",\"jad\",\"jae\",\"jaf\",\"jah\",\"jaj\",\"jak\",\"jal\",\"jam\",\"jan\",\"jao\",\"jaq\",\"jar\",\"jas\",\"jat\",\"jau\",\"jax\",\"jay\",\"jaz\",\"jbe\",\"jbi\",\"jbj\",\"jbk\",\"jbn\",\"jbo\",\"jbr\",\"jbt\",\"jbu\",\"jbw\",\"jcs\",\"jct\",\"jda\",\"jdg\",\"jdt\",\"jeb\",\"jee\",\"jeg\",\"jeh\",\"jei\",\"jek\",\"jel\",\"jen\",\"jer\",\"jet\",\"jeu\",\"jgb\",\"jge\",\"jgk\",\"jgo\",\"jhi\",\"jhs\",\"jia\",\"jib\",\"jic\",\"jid\",\"jie\",\"jig\",\"jih\",\"jii\",\"jil\",\"jim\",\"jio\",\"jiq\",\"jit\",\"jiu\",\"jiv\",\"jiy\",\"jje\",\"jjr\",\"jka\",\"jkm\",\"jko\",\"jkp\",\"jkr\",\"jku\",\"jle\",\"jls\",\"jma\",\"jmb\",\"jmc\",\"jmd\",\"jmi\",\"jml\",\"jmn\",\"jmr\",\"jms\",\"jmw\",\"jmx\",\"jna\",\"jnd\",\"jng\",\"jni\",\"jnj\",\"jnl\",\"jns\",\"job\",\"jod\",\"jog\",\"jor\",\"jos\",\"jow\",\"jpa\",\"jpr\",\"jpx\",\"jqr\",\"jra\",\"jrb\",\"jrr\",\"jrt\",\"jru\",\"jsl\",\"jua\",\"jub\",\"juc\",\"jud\",\"juh\",\"jui\",\"juk\",\"jul\",\"jum\",\"jun\",\"juo\",\"jup\",\"jur\",\"jus\",\"jut\",\"juu\",\"juw\",\"juy\",\"jvd\",\"jvn\",\"jwi\",\"jya\",\"jye\",\"jyy\",\"kaa\",\"kab\",\"kac\",\"kad\",\"kae\",\"kaf\",\"kag\",\"kah\",\"kai\",\"kaj\",\"kak\",\"kam\",\"kao\",\"kap\",\"kaq\",\"kar\",\"kav\",\"kaw\",\"kax\",\"kay\",\"kba\",\"kbb\",\"kbc\",\"kbd\",\"kbe\",\"kbf\",\"kbg\",\"kbh\",\"kbi\",\"kbj\",\"kbk\",\"kbl\",\"kbm\",\"kbn\",\"kbo\",\"kbp\",\"kbq\",\"kbr\",\"kbs\",\"kbt\",\"kbu\",\"kbv\",\"kbw\",\"kbx\",\"kby\",\"kbz\",\"kca\",\"kcb\",\"kcc\",\"kcd\",\"kce\",\"kcf\",\"kcg\",\"kch\",\"kci\",\"kcj\",\"kck\",\"kcl\",\"kcm\",\"kcn\",\"kco\",\"kcp\",\"kcq\",\"kcr\",\"kcs\",\"kct\",\"kcu\",\"kcv\",\"kcw\",\"kcx\",\"kcy\",\"kcz\",\"kda\",\"kdc\",\"kdd\",\"kde\",\"kdf\",\"kdg\",\"kdh\",\"kdi\",\"kdj\",\"kdk\",\"kdl\",\"kdm\",\"kdn\",\"kdo\",\"kdp\",\"kdq\",\"kdr\",\"kdt\",\"kdu\",\"kdv\",\"kdw\",\"kdx\",\"kdy\",\"kdz\",\"kea\",\"keb\",\"kec\",\"ked\",\"kee\",\"kef\",\"keg\",\"keh\",\"kei\",\"kej\",\"kek\",\"kel\",\"kem\",\"ken\",\"keo\",\"kep\",\"keq\",\"ker\",\"kes\",\"ket\",\"keu\",\"kev\",\"kew\",\"kex\",\"key\",\"kez\",\"kfa\",\"kfb\",\"kfc\",\"kfd\",\"kfe\",\"kff\",\"kfg\",\"kfh\",\"kfi\",\"kfj\",\"kfk\",\"kfl\",\"kfm\",\"kfn\",\"kfo\",\"kfp\",\"kfq\",\"kfr\",\"kfs\",\"kft\",\"kfu\",\"kfv\",\"kfw\",\"kfx\",\"kfy\",\"kfz\",\"kga\",\"kgb\",\"kgc\",\"kgd\",\"kge\",\"kgf\",\"kgg\",\"kgh\",\"kgi\",\"kgj\",\"kgk\",\"kgl\",\"kgm\",\"kgn\",\"kgo\",\"kgp\",\"kgq\",\"kgr\",\"kgs\",\"kgt\",\"kgu\",\"kgv\",\"kgw\",\"kgx\",\"kgy\",\"kha\",\"khb\",\"khc\",\"khd\",\"khe\",\"khf\",\"khg\",\"khh\",\"khi\",\"khj\",\"khk\",\"khl\",\"khn\",\"kho\",\"khp\",\"khq\",\"khr\",\"khs\",\"kht\",\"khu\",\"khv\",\"khw\",\"khx\",\"khy\",\"khz\",\"kia\",\"kib\",\"kic\",\"kid\",\"kie\",\"kif\",\"kig\",\"kih\",\"kii\",\"kij\",\"kil\",\"kim\",\"kio\",\"kip\",\"kiq\",\"kis\",\"kit\",\"kiu\",\"kiv\",\"kiw\",\"kix\",\"kiy\",\"kiz\",\"kja\",\"kjb\",\"kjc\",\"kjd\",\"kje\",\"kjf\",\"kjg\",\"kjh\",\"kji\",\"kjj\",\"kjk\",\"kjl\",\"kjm\",\"kjn\",\"kjo\",\"kjp\",\"kjq\",\"kjr\",\"kjs\",\"kjt\",\"kju\",\"kjv\",\"kjx\",\"kjy\",\"kjz\",\"kka\",\"kkb\",\"kkc\",\"kkd\",\"kke\",\"kkf\",\"kkg\",\"kkh\",\"kki\",\"kkj\",\"kkk\",\"kkl\",\"kkm\",\"kkn\",\"kko\",\"kkp\",\"kkq\",\"kkr\",\"kks\",\"kkt\",\"kku\",\"kkv\",\"kkw\",\"kkx\",\"kky\",\"kkz\",\"kla\",\"klb\",\"klc\",\"kld\",\"kle\",\"klf\",\"klg\",\"klh\",\"kli\",\"klj\",\"klk\",\"kll\",\"klm\",\"kln\",\"klo\",\"klp\",\"klq\",\"klr\",\"kls\",\"klt\",\"klu\",\"klv\",\"klw\",\"klx\",\"kly\",\"klz\",\"kma\",\"kmb\",\"kmc\",\"kmd\",\"kme\",\"kmf\",\"kmg\",\"kmh\",\"kmi\",\"kmj\",\"kmk\",\"kml\",\"kmm\",\"kmn\",\"kmo\",\"kmp\",\"kmq\",\"kmr\",\"kms\",\"kmt\",\"kmu\",\"kmv\",\"kmw\",\"kmx\",\"kmy\",\"kmz\",\"kna\",\"knb\",\"knc\",\"knd\",\"kne\",\"knf\",\"kng\",\"kni\",\"knj\",\"knk\",\"knl\",\"knm\",\"knn\",\"kno\",\"knp\",\"knq\",\"knr\",\"kns\",\"knt\",\"knu\",\"knv\",\"knw\",\"knx\",\"kny\",\"knz\",\"koa\",\"koc\",\"kod\",\"koe\",\"kof\",\"kog\",\"koh\",\"koi\",\"koj\",\"kok\",\"kol\",\"koo\",\"kop\",\"koq\",\"kos\",\"kot\",\"kou\",\"kov\",\"kow\",\"kox\",\"koy\",\"koz\",\"kpa\",\"kpb\",\"kpc\",\"kpd\",\"kpe\",\"kpf\",\"kpg\",\"kph\",\"kpi\",\"kpj\",\"kpk\",\"kpl\",\"kpm\",\"kpn\",\"kpo\",\"kpp\",\"kpq\",\"kpr\",\"kps\",\"kpt\",\"kpu\",\"kpv\",\"kpw\",\"kpx\",\"kpy\",\"kpz\",\"kqa\",\"kqb\",\"kqc\",\"kqd\",\"kqe\",\"kqf\",\"kqg\",\"kqh\",\"kqi\",\"kqj\",\"kqk\",\"kql\",\"kqm\",\"kqn\",\"kqo\",\"kqp\",\"kqq\",\"kqr\",\"kqs\",\"kqt\",\"kqu\",\"kqv\",\"kqw\",\"kqx\",\"kqy\",\"kqz\",\"kra\",\"krb\",\"krc\",\"krd\",\"kre\",\"krf\",\"krh\",\"kri\",\"krj\",\"krk\",\"krl\",\"krm\",\"krn\",\"kro\",\"krp\",\"krr\",\"krs\",\"krt\",\"kru\",\"krv\",\"krw\",\"krx\",\"kry\",\"krz\",\"ksa\",\"ksb\",\"ksc\",\"ksd\",\"kse\",\"ksf\",\"ksg\",\"ksh\",\"ksi\",\"ksj\",\"ksk\",\"ksl\",\"ksm\",\"ksn\",\"kso\",\"ksp\",\"ksq\",\"ksr\",\"kss\",\"kst\",\"ksu\",\"ksv\",\"ksw\",\"ksx\",\"ksy\",\"ksz\",\"kta\",\"ktb\",\"ktc\",\"ktd\",\"kte\",\"ktf\",\"ktg\",\"kth\",\"kti\",\"ktj\",\"ktk\",\"ktl\",\"ktm\",\"ktn\",\"kto\",\"ktp\",\"ktq\",\"ktr\",\"kts\",\"ktt\",\"ktu\",\"ktv\",\"ktw\",\"ktx\",\"kty\",\"ktz\",\"kub\",\"kuc\",\"kud\",\"kue\",\"kuf\",\"kug\",\"kuh\",\"kui\",\"kuj\",\"kuk\",\"kul\",\"kum\",\"kun\",\"kuo\",\"kup\",\"kuq\",\"kus\",\"kut\",\"kuu\",\"kuv\",\"kuw\",\"kux\",\"kuy\",\"kuz\",\"kva\",\"kvb\",\"kvc\",\"kvd\",\"kve\",\"kvf\",\"kvg\",\"kvh\",\"kvi\",\"kvj\",\"kvk\",\"kvl\",\"kvm\",\"kvn\",\"kvo\",\"kvp\",\"kvq\",\"kvr\",\"kvs\",\"kvt\",\"kvu\",\"kvv\",\"kvw\",\"kvx\",\"kvy\",\"kvz\",\"kwa\",\"kwb\",\"kwc\",\"kwd\",\"kwe\",\"kwf\",\"kwg\",\"kwh\",\"kwi\",\"kwj\",\"kwk\",\"kwl\",\"kwm\",\"kwn\",\"kwo\",\"kwp\",\"kwq\",\"kwr\",\"kws\",\"kwt\",\"kwu\",\"kwv\",\"kww\",\"kwx\",\"kwy\",\"kwz\",\"kxa\",\"kxb\",\"kxc\",\"kxd\",\"kxe\",\"kxf\",\"kxh\",\"kxi\",\"kxj\",\"kxk\",\"kxl\",\"kxm\",\"kxn\",\"kxo\",\"kxp\",\"kxq\",\"kxr\",\"kxs\",\"kxt\",\"kxu\",\"kxv\",\"kxw\",\"kxx\",\"kxy\",\"kxz\",\"kya\",\"kyb\",\"kyc\",\"kyd\",\"kye\",\"kyf\",\"kyg\",\"kyh\",\"kyi\",\"kyj\",\"kyk\",\"kyl\",\"kym\",\"kyn\",\"kyo\",\"kyp\",\"kyq\",\"kyr\",\"kys\",\"kyt\",\"kyu\",\"kyv\",\"kyw\",\"kyx\",\"kyy\",\"kyz\",\"kza\",\"kzb\",\"kzc\",\"kzd\",\"kze\",\"kzf\",\"kzg\",\"kzh\",\"kzi\",\"kzj\",\"kzk\",\"kzl\",\"kzm\",\"kzn\",\"kzo\",\"kzp\",\"kzq\",\"kzr\",\"kzs\",\"kzt\",\"kzu\",\"kzv\",\"kzw\",\"kzx\",\"kzy\",\"kzz\",\"laa\",\"lab\",\"lac\",\"lad\",\"lae\",\"laf\",\"lag\",\"lah\",\"lai\",\"laj\",\"lak\",\"lal\",\"lam\",\"lan\",\"lap\",\"laq\",\"lar\",\"las\",\"lau\",\"law\",\"lax\",\"lay\",\"laz\",\"lba\",\"lbb\",\"lbc\",\"lbe\",\"lbf\",\"lbg\",\"lbi\",\"lbj\",\"lbk\",\"lbl\",\"lbm\",\"lbn\",\"lbo\",\"lbq\",\"lbr\",\"lbs\",\"lbt\",\"lbu\",\"lbv\",\"lbw\",\"lbx\",\"lby\",\"lbz\",\"lcc\",\"lcd\",\"lce\",\"lcf\",\"lch\",\"lcl\",\"lcm\",\"lcp\",\"lcq\",\"lcs\",\"lda\",\"ldb\",\"ldd\",\"ldg\",\"ldh\",\"ldi\",\"ldj\",\"ldk\",\"ldl\",\"ldm\",\"ldn\",\"ldo\",\"ldp\",\"ldq\",\"lea\",\"leb\",\"lec\",\"led\",\"lee\",\"lef\",\"leg\",\"leh\",\"lei\",\"lej\",\"lek\",\"lel\",\"lem\",\"len\",\"leo\",\"lep\",\"leq\",\"ler\",\"les\",\"let\",\"leu\",\"lev\",\"lew\",\"lex\",\"ley\",\"lez\",\"lfa\",\"lfn\",\"lga\",\"lgb\",\"lgg\",\"lgh\",\"lgi\",\"lgk\",\"lgl\",\"lgm\",\"lgn\",\"lgq\",\"lgr\",\"lgt\",\"lgu\",\"lgz\",\"lha\",\"lhh\",\"lhi\",\"lhl\",\"lhm\",\"lhn\",\"lhp\",\"lhs\",\"lht\",\"lhu\",\"lia\",\"lib\",\"lic\",\"lid\",\"lie\",\"lif\",\"lig\",\"lih\",\"lii\",\"lij\",\"lik\",\"lil\",\"lio\",\"lip\",\"liq\",\"lir\",\"lis\",\"liu\",\"liv\",\"liw\",\"lix\",\"liy\",\"liz\",\"lja\",\"lje\",\"lji\",\"ljl\",\"ljp\",\"ljw\",\"ljx\",\"lka\",\"lkb\",\"lkc\",\"lkd\",\"lke\",\"lkh\",\"lki\",\"lkj\",\"lkl\",\"lkm\",\"lkn\",\"lko\",\"lkr\",\"lks\",\"lkt\",\"lku\",\"lky\",\"lla\",\"llb\",\"llc\",\"lld\",\"lle\",\"llf\",\"llg\",\"llh\",\"lli\",\"llj\",\"llk\",\"lll\",\"llm\",\"lln\",\"llo\",\"llp\",\"llq\",\"lls\",\"llu\",\"llx\",\"lma\",\"lmb\",\"lmc\",\"lmd\",\"lme\",\"lmf\",\"lmg\",\"lmh\",\"lmi\",\"lmj\",\"lmk\",\"lml\",\"lmm\",\"lmn\",\"lmo\",\"lmp\",\"lmq\",\"lmr\",\"lmu\",\"lmv\",\"lmw\",\"lmx\",\"lmy\",\"lmz\",\"lna\",\"lnb\",\"lnd\",\"lng\",\"lnh\",\"lni\",\"lnj\",\"lnl\",\"lnm\",\"lnn\",\"lno\",\"lns\",\"lnu\",\"lnw\",\"lnz\",\"loa\",\"lob\",\"loc\",\"loe\",\"lof\",\"log\",\"loh\",\"loi\",\"loj\",\"lok\",\"lol\",\"lom\",\"lon\",\"loo\",\"lop\",\"loq\",\"lor\",\"los\",\"lot\",\"lou\",\"lov\",\"low\",\"lox\",\"loy\",\"loz\",\"lpa\",\"lpe\",\"lpn\",\"lpo\",\"lpx\",\"lra\",\"lrc\",\"lre\",\"lrg\",\"lri\",\"lrk\",\"lrl\",\"lrm\",\"lrn\",\"lro\",\"lrr\",\"lrt\",\"lrv\",\"lrz\",\"lsa\",\"lsd\",\"lse\",\"lsg\",\"lsh\",\"lsi\",\"lsl\",\"lsm\",\"lso\",\"lsp\",\"lsr\",\"lss\",\"lst\",\"lsy\",\"ltc\",\"ltg\",\"lth\",\"lti\",\"ltn\",\"lto\",\"lts\",\"ltu\",\"lua\",\"luc\",\"lud\",\"lue\",\"luf\",\"lui\",\"luj\",\"luk\",\"lul\",\"lum\",\"lun\",\"luo\",\"lup\",\"luq\",\"lur\",\"lus\",\"lut\",\"luu\",\"luv\",\"luw\",\"luy\",\"luz\",\"lva\",\"lvk\",\"lvs\",\"lvu\",\"lwa\",\"lwe\",\"lwg\",\"lwh\",\"lwl\",\"lwm\",\"lwo\",\"lws\",\"lwt\",\"lwu\",\"lww\",\"lya\",\"lyg\",\"lyn\",\"lzh\",\"lzl\",\"lzn\",\"lzz\",\"maa\",\"mab\",\"mad\",\"mae\",\"maf\",\"mag\",\"mai\",\"maj\",\"mak\",\"mam\",\"man\",\"map\",\"maq\",\"mas\",\"mat\",\"mau\",\"mav\",\"maw\",\"max\",\"maz\",\"mba\",\"mbb\",\"mbc\",\"mbd\",\"mbe\",\"mbf\",\"mbh\",\"mbi\",\"mbj\",\"mbk\",\"mbl\",\"mbm\",\"mbn\",\"mbo\",\"mbp\",\"mbq\",\"mbr\",\"mbs\",\"mbt\",\"mbu\",\"mbv\",\"mbw\",\"mbx\",\"mby\",\"mbz\",\"mca\",\"mcb\",\"mcc\",\"mcd\",\"mce\",\"mcf\",\"mcg\",\"mch\",\"mci\",\"mcj\",\"mck\",\"mcl\",\"mcm\",\"mcn\",\"mco\",\"mcp\",\"mcq\",\"mcr\",\"mcs\",\"mct\",\"mcu\",\"mcv\",\"mcw\",\"mcx\",\"mcy\",\"mcz\",\"mda\",\"mdb\",\"mdc\",\"mdd\",\"mde\",\"mdf\",\"mdg\",\"mdh\",\"mdi\",\"mdj\",\"mdk\",\"mdl\",\"mdm\",\"mdn\",\"mdp\",\"mdq\",\"mdr\",\"mds\",\"mdt\",\"mdu\",\"mdv\",\"mdw\",\"mdx\",\"mdy\",\"mdz\",\"mea\",\"meb\",\"mec\",\"med\",\"mee\",\"mef\",\"meg\",\"meh\",\"mei\",\"mej\",\"mek\",\"mel\",\"mem\",\"men\",\"meo\",\"mep\",\"meq\",\"mer\",\"mes\",\"met\",\"meu\",\"mev\",\"mew\",\"mey\",\"mez\",\"mfa\",\"mfb\",\"mfc\",\"mfd\",\"mfe\",\"mff\",\"mfg\",\"mfh\",\"mfi\",\"mfj\",\"mfk\",\"mfl\",\"mfm\",\"mfn\",\"mfo\",\"mfp\",\"mfq\",\"mfr\",\"mfs\",\"mft\",\"mfu\",\"mfv\",\"mfw\",\"mfx\",\"mfy\",\"mfz\",\"mga\",\"mgb\",\"mgc\",\"mgd\",\"mge\",\"mgf\",\"mgg\",\"mgh\",\"mgi\",\"mgj\",\"mgk\",\"mgl\",\"mgm\",\"mgn\",\"mgo\",\"mgp\",\"mgq\",\"mgr\",\"mgs\",\"mgt\",\"mgu\",\"mgv\",\"mgw\",\"mgx\",\"mgy\",\"mgz\",\"mha\",\"mhb\",\"mhc\",\"mhd\",\"mhe\",\"mhf\",\"mhg\",\"mhh\",\"mhi\",\"mhj\",\"mhk\",\"mhl\",\"mhm\",\"mhn\",\"mho\",\"mhp\",\"mhq\",\"mhr\",\"mhs\",\"mht\",\"mhu\",\"mhw\",\"mhx\",\"mhy\",\"mhz\",\"mia\",\"mib\",\"mic\",\"mid\",\"mie\",\"mif\",\"mig\",\"mih\",\"mii\",\"mij\",\"mik\",\"mil\",\"mim\",\"min\",\"mio\",\"mip\",\"miq\",\"mir\",\"mis\",\"mit\",\"miu\",\"miw\",\"mix\",\"miy\",\"miz\",\"mja\",\"mjb\",\"mjc\",\"mjd\",\"mje\",\"mjg\",\"mjh\",\"mji\",\"mjj\",\"mjk\",\"mjl\",\"mjm\",\"mjn\",\"mjo\",\"mjp\",\"mjq\",\"mjr\",\"mjs\",\"mjt\",\"mju\",\"mjv\",\"mjw\",\"mjx\",\"mjy\",\"mjz\",\"mka\",\"mkb\",\"mkc\",\"mke\",\"mkf\",\"mkg\",\"mkh\",\"mki\",\"mkj\",\"mkk\",\"mkl\",\"mkm\",\"mkn\",\"mko\",\"mkp\",\"mkq\",\"mkr\",\"mks\",\"mkt\",\"mku\",\"mkv\",\"mkw\",\"mkx\",\"mky\",\"mkz\",\"mla\",\"mlb\",\"mlc\",\"mld\",\"mle\",\"mlf\",\"mlh\",\"mli\",\"mlj\",\"mlk\",\"mll\",\"mlm\",\"mln\",\"mlo\",\"mlp\",\"mlq\",\"mlr\",\"mls\",\"mlu\",\"mlv\",\"mlw\",\"mlx\",\"mlz\",\"mma\",\"mmb\",\"mmc\",\"mmd\",\"mme\",\"mmf\",\"mmg\",\"mmh\",\"mmi\",\"mmj\",\"mmk\",\"mml\",\"mmm\",\"mmn\",\"mmo\",\"mmp\",\"mmq\",\"mmr\",\"mmt\",\"mmu\",\"mmv\",\"mmw\",\"mmx\",\"mmy\",\"mmz\",\"mna\",\"mnb\",\"mnc\",\"mnd\",\"mne\",\"mnf\",\"mng\",\"mnh\",\"mni\",\"mnj\",\"mnk\",\"mnl\",\"mnm\",\"mnn\",\"mno\",\"mnp\",\"mnq\",\"mnr\",\"mns\",\"mnt\",\"mnu\",\"mnv\",\"mnw\",\"mnx\",\"mny\",\"mnz\",\"moa\",\"moc\",\"mod\",\"moe\",\"mof\",\"mog\",\"moh\",\"moi\",\"moj\",\"mok\",\"mom\",\"moo\",\"mop\",\"moq\",\"mor\",\"mos\",\"mot\",\"mou\",\"mov\",\"mow\",\"mox\",\"moy\",\"moz\",\"mpa\",\"mpb\",\"mpc\",\"mpd\",\"mpe\",\"mpg\",\"mph\",\"mpi\",\"mpj\",\"mpk\",\"mpl\",\"mpm\",\"mpn\",\"mpo\",\"mpp\",\"mpq\",\"mpr\",\"mps\",\"mpt\",\"mpu\",\"mpv\",\"mpw\",\"mpx\",\"mpy\",\"mpz\",\"mqa\",\"mqb\",\"mqc\",\"mqe\",\"mqf\",\"mqg\",\"mqh\",\"mqi\",\"mqj\",\"mqk\",\"mql\",\"mqm\",\"mqn\",\"mqo\",\"mqp\",\"mqq\",\"mqr\",\"mqs\",\"mqt\",\"mqu\",\"mqv\",\"mqw\",\"mqx\",\"mqy\",\"mqz\",\"mra\",\"mrb\",\"mrc\",\"mrd\",\"mre\",\"mrf\",\"mrg\",\"mrh\",\"mrj\",\"mrk\",\"mrl\",\"mrm\",\"mrn\",\"mro\",\"mrp\",\"mrq\",\"mrr\",\"mrs\",\"mrt\",\"mru\",\"mrv\",\"mrw\",\"mrx\",\"mry\",\"mrz\",\"msb\",\"msc\",\"msd\",\"mse\",\"msf\",\"msg\",\"msh\",\"msi\",\"msj\",\"msk\",\"msl\",\"msm\",\"msn\",\"mso\",\"msp\",\"msq\",\"msr\",\"mss\",\"mst\",\"msu\",\"msv\",\"msw\",\"msx\",\"msy\",\"msz\",\"mta\",\"mtb\",\"mtc\",\"mtd\",\"mte\",\"mtf\",\"mtg\",\"mth\",\"mti\",\"mtj\",\"mtk\",\"mtl\",\"mtm\",\"mtn\",\"mto\",\"mtp\",\"mtq\",\"mtr\",\"mts\",\"mtt\",\"mtu\",\"mtv\",\"mtw\",\"mtx\",\"mty\",\"mua\",\"mub\",\"muc\",\"mud\",\"mue\",\"mug\",\"muh\",\"mui\",\"muj\",\"muk\",\"mul\",\"mum\",\"mun\",\"muo\",\"mup\",\"muq\",\"mur\",\"mus\",\"mut\",\"muu\",\"muv\",\"mux\",\"muy\",\"muz\",\"mva\",\"mvb\",\"mvd\",\"mve\",\"mvf\",\"mvg\",\"mvh\",\"mvi\",\"mvk\",\"mvl\",\"mvm\",\"mvn\",\"mvo\",\"mvp\",\"mvq\",\"mvr\",\"mvs\",\"mvt\",\"mvu\",\"mvv\",\"mvw\",\"mvx\",\"mvy\",\"mvz\",\"mwa\",\"mwb\",\"mwc\",\"mwd\",\"mwe\",\"mwf\",\"mwg\",\"mwh\",\"mwi\",\"mwj\",\"mwk\",\"mwl\",\"mwm\",\"mwn\",\"mwo\",\"mwp\",\"mwq\",\"mwr\",\"mws\",\"mwt\",\"mwu\",\"mwv\",\"mww\",\"mwx\",\"mwy\",\"mwz\",\"mxa\",\"mxb\",\"mxc\",\"mxd\",\"mxe\",\"mxf\",\"mxg\",\"mxh\",\"mxi\",\"mxj\",\"mxk\",\"mxl\",\"mxm\",\"mxn\",\"mxo\",\"mxp\",\"mxq\",\"mxr\",\"mxs\",\"mxt\",\"mxu\",\"mxv\",\"mxw\",\"mxx\",\"mxy\",\"mxz\",\"myb\",\"myc\",\"myd\",\"mye\",\"myf\",\"myg\",\"myh\",\"myi\",\"myj\",\"myk\",\"myl\",\"mym\",\"myn\",\"myo\",\"myp\",\"myq\",\"myr\",\"mys\",\"myt\",\"myu\",\"myv\",\"myw\",\"myx\",\"myy\",\"myz\",\"mza\",\"mzb\",\"mzc\",\"mzd\",\"mze\",\"mzg\",\"mzh\",\"mzi\",\"mzj\",\"mzk\",\"mzl\",\"mzm\",\"mzn\",\"mzo\",\"mzp\",\"mzq\",\"mzr\",\"mzs\",\"mzt\",\"mzu\",\"mzv\",\"mzw\",\"mzx\",\"mzy\",\"mzz\",\"naa\",\"nab\",\"nac\",\"nad\",\"nae\",\"naf\",\"nag\",\"nah\",\"nai\",\"naj\",\"nak\",\"nal\",\"nam\",\"nan\",\"nao\",\"nap\",\"naq\",\"nar\",\"nas\",\"nat\",\"naw\",\"nax\",\"nay\",\"naz\",\"nba\",\"nbb\",\"nbc\",\"nbd\",\"nbe\",\"nbf\",\"nbg\",\"nbh\",\"nbi\",\"nbj\",\"nbk\",\"nbm\",\"nbn\",\"nbo\",\"nbp\",\"nbq\",\"nbr\",\"nbs\",\"nbt\",\"nbu\",\"nbv\",\"nbw\",\"nbx\",\"nby\",\"nca\",\"ncb\",\"ncc\",\"ncd\",\"nce\",\"ncf\",\"ncg\",\"nch\",\"nci\",\"ncj\",\"nck\",\"ncl\",\"ncm\",\"ncn\",\"nco\",\"ncp\",\"ncq\",\"ncr\",\"ncs\",\"nct\",\"ncu\",\"ncx\",\"ncz\",\"nda\",\"ndb\",\"ndc\",\"ndd\",\"ndf\",\"ndg\",\"ndh\",\"ndi\",\"ndj\",\"ndk\",\"ndl\",\"ndm\",\"ndn\",\"ndp\",\"ndq\",\"ndr\",\"nds\",\"ndt\",\"ndu\",\"ndv\",\"ndw\",\"ndx\",\"ndy\",\"ndz\",\"nea\",\"neb\",\"nec\",\"ned\",\"nee\",\"nef\",\"neg\",\"neh\",\"nei\",\"nej\",\"nek\",\"nem\",\"nen\",\"neo\",\"neq\",\"ner\",\"nes\",\"net\",\"neu\",\"nev\",\"new\",\"nex\",\"ney\",\"nez\",\"nfa\",\"nfd\",\"nfl\",\"nfr\",\"nfu\",\"nga\",\"ngb\",\"ngc\",\"ngd\",\"nge\",\"ngf\",\"ngg\",\"ngh\",\"ngi\",\"ngj\",\"ngk\",\"ngl\",\"ngm\",\"ngn\",\"ngo\",\"ngp\",\"ngq\",\"ngr\",\"ngs\",\"ngt\",\"ngu\",\"ngv\",\"ngw\",\"ngx\",\"ngy\",\"ngz\",\"nha\",\"nhb\",\"nhc\",\"nhd\",\"nhe\",\"nhf\",\"nhg\",\"nhh\",\"nhi\",\"nhk\",\"nhm\",\"nhn\",\"nho\",\"nhp\",\"nhq\",\"nhr\",\"nht\",\"nhu\",\"nhv\",\"nhw\",\"nhx\",\"nhy\",\"nhz\",\"nia\",\"nib\",\"nic\",\"nid\",\"nie\",\"nif\",\"nig\",\"nih\",\"nii\",\"nij\",\"nik\",\"nil\",\"nim\",\"nin\",\"nio\",\"niq\",\"nir\",\"nis\",\"nit\",\"niu\",\"niv\",\"niw\",\"nix\",\"niy\",\"niz\",\"nja\",\"njb\",\"njd\",\"njh\",\"nji\",\"njj\",\"njl\",\"njm\",\"njn\",\"njo\",\"njr\",\"njs\",\"njt\",\"nju\",\"njx\",\"njy\",\"njz\",\"nka\",\"nkb\",\"nkc\",\"nkd\",\"nke\",\"nkf\",\"nkg\",\"nkh\",\"nki\",\"nkj\",\"nkk\",\"nkm\",\"nkn\",\"nko\",\"nkp\",\"nkq\",\"nkr\",\"nks\",\"nkt\",\"nku\",\"nkv\",\"nkw\",\"nkx\",\"nkz\",\"nla\",\"nlc\",\"nle\",\"nlg\",\"nli\",\"nlj\",\"nlk\",\"nll\",\"nlm\",\"nln\",\"nlo\",\"nlq\",\"nlr\",\"nlu\",\"nlv\",\"nlw\",\"nlx\",\"nly\",\"nlz\",\"nma\",\"nmb\",\"nmc\",\"nmd\",\"nme\",\"nmf\",\"nmg\",\"nmh\",\"nmi\",\"nmj\",\"nmk\",\"nml\",\"nmm\",\"nmn\",\"nmo\",\"nmp\",\"nmq\",\"nmr\",\"nms\",\"nmt\",\"nmu\",\"nmv\",\"nmw\",\"nmx\",\"nmy\",\"nmz\",\"nna\",\"nnb\",\"nnc\",\"nnd\",\"nne\",\"nnf\",\"nng\",\"nnh\",\"nni\",\"nnj\",\"nnk\",\"nnl\",\"nnm\",\"nnn\",\"nnp\",\"nnq\",\"nnr\",\"nns\",\"nnt\",\"nnu\",\"nnv\",\"nnw\",\"nnx\",\"nny\",\"nnz\",\"noa\",\"noc\",\"nod\",\"noe\",\"nof\",\"nog\",\"noh\",\"noi\",\"noj\",\"nok\",\"nol\",\"nom\",\"non\",\"noo\",\"nop\",\"noq\",\"nos\",\"not\",\"nou\",\"nov\",\"now\",\"noy\",\"noz\",\"npa\",\"npb\",\"npg\",\"nph\",\"npi\",\"npl\",\"npn\",\"npo\",\"nps\",\"npu\",\"npx\",\"npy\",\"nqg\",\"nqk\",\"nql\",\"nqm\",\"nqn\",\"nqo\",\"nqq\",\"nqy\",\"nra\",\"nrb\",\"nrc\",\"nre\",\"nrf\",\"nrg\",\"nri\",\"nrk\",\"nrl\",\"nrm\",\"nrn\",\"nrp\",\"nrr\",\"nrt\",\"nru\",\"nrx\",\"nrz\",\"nsa\",\"nsc\",\"nsd\",\"nse\",\"nsf\",\"nsg\",\"nsh\",\"nsi\",\"nsk\",\"nsl\",\"nsm\",\"nsn\",\"nso\",\"nsp\",\"nsq\",\"nsr\",\"nss\",\"nst\",\"nsu\",\"nsv\",\"nsw\",\"nsx\",\"nsy\",\"nsz\",\"ntd\",\"nte\",\"ntg\",\"nti\",\"ntj\",\"ntk\",\"ntm\",\"nto\",\"ntp\",\"ntr\",\"nts\",\"ntu\",\"ntw\",\"ntx\",\"nty\",\"ntz\",\"nua\",\"nub\",\"nuc\",\"nud\",\"nue\",\"nuf\",\"nug\",\"nuh\",\"nui\",\"nuj\",\"nuk\",\"nul\",\"num\",\"nun\",\"nuo\",\"nup\",\"nuq\",\"nur\",\"nus\",\"nut\",\"nuu\",\"nuv\",\"nuw\",\"nux\",\"nuy\",\"nuz\",\"nvh\",\"nvm\",\"nvo\",\"nwa\",\"nwb\",\"nwc\",\"nwe\",\"nwg\",\"nwi\",\"nwm\",\"nwo\",\"nwr\",\"nwx\",\"nwy\",\"nxa\",\"nxd\",\"nxe\",\"nxg\",\"nxi\",\"nxk\",\"nxl\",\"nxm\",\"nxn\",\"nxo\",\"nxq\",\"nxr\",\"nxu\",\"nxx\",\"nyb\",\"nyc\",\"nyd\",\"nye\",\"nyf\",\"nyg\",\"nyh\",\"nyi\",\"nyj\",\"nyk\",\"nyl\",\"nym\",\"nyn\",\"nyo\",\"nyp\",\"nyq\",\"nyr\",\"nys\",\"nyt\",\"nyu\",\"nyv\",\"nyw\",\"nyx\",\"nyy\",\"nza\",\"nzb\",\"nzd\",\"nzi\",\"nzk\",\"nzm\",\"nzs\",\"nzu\",\"nzy\",\"nzz\",\"oaa\",\"oac\",\"oar\",\"oav\",\"obi\",\"obk\",\"obl\",\"obm\",\"obo\",\"obr\",\"obt\",\"obu\",\"oca\",\"och\",\"oco\",\"ocu\",\"oda\",\"odk\",\"odt\",\"odu\",\"ofo\",\"ofs\",\"ofu\",\"ogb\",\"ogc\",\"oge\",\"ogg\",\"ogo\",\"ogu\",\"oht\",\"ohu\",\"oia\",\"oin\",\"ojb\",\"ojc\",\"ojg\",\"ojp\",\"ojs\",\"ojv\",\"ojw\",\"oka\",\"okb\",\"okd\",\"oke\",\"okg\",\"okh\",\"oki\",\"okj\",\"okk\",\"okl\",\"okm\",\"okn\",\"oko\",\"okr\",\"oks\",\"oku\",\"okv\",\"okx\",\"ola\",\"old\",\"ole\",\"olk\",\"olm\",\"olo\",\"olr\",\"olt\",\"olu\",\"oma\",\"omb\",\"omc\",\"ome\",\"omg\",\"omi\",\"omk\",\"oml\",\"omn\",\"omo\",\"omp\",\"omq\",\"omr\",\"omt\",\"omu\",\"omv\",\"omw\",\"omx\",\"ona\",\"onb\",\"one\",\"ong\",\"oni\",\"onj\",\"onk\",\"onn\",\"ono\",\"onp\",\"onr\",\"ons\",\"ont\",\"onu\",\"onw\",\"onx\",\"ood\",\"oog\",\"oon\",\"oor\",\"oos\",\"opa\",\"opk\",\"opm\",\"opo\",\"opt\",\"opy\",\"ora\",\"orc\",\"ore\",\"org\",\"orh\",\"orn\",\"oro\",\"orr\",\"ors\",\"ort\",\"oru\",\"orv\",\"orw\",\"orx\",\"ory\",\"orz\",\"osa\",\"osc\",\"osi\",\"oso\",\"osp\",\"ost\",\"osu\",\"osx\",\"ota\",\"otb\",\"otd\",\"ote\",\"oti\",\"otk\",\"otl\",\"otm\",\"otn\",\"oto\",\"otq\",\"otr\",\"ots\",\"ott\",\"otu\",\"otw\",\"otx\",\"oty\",\"otz\",\"oua\",\"oub\",\"oue\",\"oui\",\"oum\",\"oun\",\"ovd\",\"owi\",\"owl\",\"oyb\",\"oyd\",\"oym\",\"oyy\",\"ozm\",\"paa\",\"pab\",\"pac\",\"pad\",\"pae\",\"paf\",\"pag\",\"pah\",\"pai\",\"pak\",\"pal\",\"pam\",\"pao\",\"pap\",\"paq\",\"par\",\"pas\",\"pat\",\"pau\",\"pav\",\"paw\",\"pax\",\"pay\",\"paz\",\"pbb\",\"pbc\",\"pbe\",\"pbf\",\"pbg\",\"pbh\",\"pbi\",\"pbl\",\"pbm\",\"pbn\",\"pbo\",\"pbp\",\"pbr\",\"pbs\",\"pbt\",\"pbu\",\"pbv\",\"pby\",\"pbz\",\"pca\",\"pcb\",\"pcc\",\"pcd\",\"pce\",\"pcf\",\"pcg\",\"pch\",\"pci\",\"pcj\",\"pck\",\"pcl\",\"pcm\",\"pcn\",\"pcp\",\"pcr\",\"pcw\",\"pda\",\"pdc\",\"pdi\",\"pdn\",\"pdo\",\"pdt\",\"pdu\",\"pea\",\"peb\",\"ped\",\"pee\",\"pef\",\"peg\",\"peh\",\"pei\",\"pej\",\"pek\",\"pel\",\"pem\",\"peo\",\"pep\",\"peq\",\"pes\",\"pev\",\"pex\",\"pey\",\"pez\",\"pfa\",\"pfe\",\"pfl\",\"pga\",\"pgd\",\"pgg\",\"pgi\",\"pgk\",\"pgl\",\"pgn\",\"pgs\",\"pgu\",\"pgy\",\"pgz\",\"pha\",\"phd\",\"phg\",\"phh\",\"phi\",\"phk\",\"phl\",\"phm\",\"phn\",\"pho\",\"phq\",\"phr\",\"pht\",\"phu\",\"phv\",\"phw\",\"pia\",\"pib\",\"pic\",\"pid\",\"pie\",\"pif\",\"pig\",\"pih\",\"pii\",\"pij\",\"pil\",\"pim\",\"pin\",\"pio\",\"pip\",\"pir\",\"pis\",\"pit\",\"piu\",\"piv\",\"piw\",\"pix\",\"piy\",\"piz\",\"pjt\",\"pka\",\"pkb\",\"pkc\",\"pkg\",\"pkh\",\"pkn\",\"pko\",\"pkp\",\"pkr\",\"pks\",\"pkt\",\"pku\",\"pla\",\"plb\",\"plc\",\"pld\",\"ple\",\"plf\",\"plg\",\"plh\",\"plj\",\"plk\",\"pll\",\"pln\",\"plo\",\"plp\",\"plq\",\"plr\",\"pls\",\"plt\",\"plu\",\"plv\",\"plw\",\"ply\",\"plz\",\"pma\",\"pmb\",\"pmc\",\"pmd\",\"pme\",\"pmf\",\"pmh\",\"pmi\",\"pmj\",\"pmk\",\"pml\",\"pmm\",\"pmn\",\"pmo\",\"pmq\",\"pmr\",\"pms\",\"pmt\",\"pmu\",\"pmw\",\"pmx\",\"pmy\",\"pmz\",\"pna\",\"pnb\",\"pnc\",\"pne\",\"png\",\"pnh\",\"pni\",\"pnj\",\"pnk\",\"pnl\",\"pnm\",\"pnn\",\"pno\",\"pnp\",\"pnq\",\"pnr\",\"pns\",\"pnt\",\"pnu\",\"pnv\",\"pnw\",\"pnx\",\"pny\",\"pnz\",\"poc\",\"pod\",\"poe\",\"pof\",\"pog\",\"poh\",\"poi\",\"pok\",\"pom\",\"pon\",\"poo\",\"pop\",\"poq\",\"pos\",\"pot\",\"pov\",\"pow\",\"pox\",\"poy\",\"poz\",\"ppa\",\"ppe\",\"ppi\",\"ppk\",\"ppl\",\"ppm\",\"ppn\",\"ppo\",\"ppp\",\"ppq\",\"ppr\",\"pps\",\"ppt\",\"ppu\",\"pqa\",\"pqe\",\"pqm\",\"pqw\",\"pra\",\"prb\",\"prc\",\"prd\",\"pre\",\"prf\",\"prg\",\"prh\",\"pri\",\"prk\",\"prl\",\"prm\",\"prn\",\"pro\",\"prp\",\"prq\",\"prr\",\"prs\",\"prt\",\"pru\",\"prw\",\"prx\",\"pry\",\"prz\",\"psa\",\"psc\",\"psd\",\"pse\",\"psg\",\"psh\",\"psi\",\"psl\",\"psm\",\"psn\",\"pso\",\"psp\",\"psq\",\"psr\",\"pss\",\"pst\",\"psu\",\"psw\",\"psy\",\"pta\",\"pth\",\"pti\",\"ptn\",\"pto\",\"ptp\",\"ptq\",\"ptr\",\"ptt\",\"ptu\",\"ptv\",\"ptw\",\"pty\",\"pua\",\"pub\",\"puc\",\"pud\",\"pue\",\"puf\",\"pug\",\"pui\",\"puj\",\"puk\",\"pum\",\"puo\",\"pup\",\"puq\",\"pur\",\"put\",\"puu\",\"puw\",\"pux\",\"puy\",\"puz\",\"pwa\",\"pwb\",\"pwg\",\"pwi\",\"pwm\",\"pwn\",\"pwo\",\"pwr\",\"pww\",\"pxm\",\"pye\",\"pym\",\"pyn\",\"pys\",\"pyu\",\"pyx\",\"pyy\",\"pzn\",\"qaa..qtz\",\"qua\",\"qub\",\"quc\",\"qud\",\"quf\",\"qug\",\"quh\",\"qui\",\"quk\",\"qul\",\"qum\",\"qun\",\"qup\",\"quq\",\"qur\",\"qus\",\"quv\",\"quw\",\"qux\",\"quy\",\"quz\",\"qva\",\"qvc\",\"qve\",\"qvh\",\"qvi\",\"qvj\",\"qvl\",\"qvm\",\"qvn\",\"qvo\",\"qvp\",\"qvs\",\"qvw\",\"qvy\",\"qvz\",\"qwa\",\"qwc\",\"qwe\",\"qwh\",\"qwm\",\"qws\",\"qwt\",\"qxa\",\"qxc\",\"qxh\",\"qxl\",\"qxn\",\"qxo\",\"qxp\",\"qxq\",\"qxr\",\"qxs\",\"qxt\",\"qxu\",\"qxw\",\"qya\",\"qyp\",\"raa\",\"rab\",\"rac\",\"rad\",\"raf\",\"rag\",\"rah\",\"rai\",\"raj\",\"rak\",\"ral\",\"ram\",\"ran\",\"rao\",\"rap\",\"raq\",\"rar\",\"ras\",\"rat\",\"rau\",\"rav\",\"raw\",\"rax\",\"ray\",\"raz\",\"rbb\",\"rbk\",\"rbl\",\"rbp\",\"rcf\",\"rdb\",\"rea\",\"reb\",\"ree\",\"reg\",\"rei\",\"rej\",\"rel\",\"rem\",\"ren\",\"rer\",\"res\",\"ret\",\"rey\",\"rga\",\"rge\",\"rgk\",\"rgn\",\"rgr\",\"rgs\",\"rgu\",\"rhg\",\"rhp\",\"ria\",\"rie\",\"rif\",\"ril\",\"rim\",\"rin\",\"rir\",\"rit\",\"riu\",\"rjg\",\"rji\",\"rjs\",\"rka\",\"rkb\",\"rkh\",\"rki\",\"rkm\",\"rkt\",\"rkw\",\"rma\",\"rmb\",\"rmc\",\"rmd\",\"rme\",\"rmf\",\"rmg\",\"rmh\",\"rmi\",\"rmk\",\"rml\",\"rmm\",\"rmn\",\"rmo\",\"rmp\",\"rmq\",\"rmr\",\"rms\",\"rmt\",\"rmu\",\"rmv\",\"rmw\",\"rmx\",\"rmy\",\"rmz\",\"rna\",\"rnd\",\"rng\",\"rnl\",\"rnn\",\"rnp\",\"rnr\",\"rnw\",\"roa\",\"rob\",\"roc\",\"rod\",\"roe\",\"rof\",\"rog\",\"rol\",\"rom\",\"roo\",\"rop\",\"ror\",\"rou\",\"row\",\"rpn\",\"rpt\",\"rri\",\"rro\",\"rrt\",\"rsb\",\"rsi\",\"rsl\",\"rsm\",\"rtc\",\"rth\",\"rtm\",\"rts\",\"rtw\",\"rub\",\"ruc\",\"rue\",\"ruf\",\"rug\",\"ruh\",\"rui\",\"ruk\",\"ruo\",\"rup\",\"ruq\",\"rut\",\"ruu\",\"ruy\",\"ruz\",\"rwa\",\"rwk\",\"rwm\",\"rwo\",\"rwr\",\"rxd\",\"rxw\",\"ryn\",\"rys\",\"ryu\",\"rzh\",\"saa\",\"sab\",\"sac\",\"sad\",\"sae\",\"saf\",\"sah\",\"sai\",\"saj\",\"sak\",\"sal\",\"sam\",\"sao\",\"sap\",\"saq\",\"sar\",\"sas\",\"sat\",\"sau\",\"sav\",\"saw\",\"sax\",\"say\",\"saz\",\"sba\",\"sbb\",\"sbc\",\"sbd\",\"sbe\",\"sbf\",\"sbg\",\"sbh\",\"sbi\",\"sbj\",\"sbk\",\"sbl\",\"sbm\",\"sbn\",\"sbo\",\"sbp\",\"sbq\",\"sbr\",\"sbs\",\"sbt\",\"sbu\",\"sbv\",\"sbw\",\"sbx\",\"sby\",\"sbz\",\"sca\",\"scb\",\"sce\",\"scf\",\"scg\",\"sch\",\"sci\",\"sck\",\"scl\",\"scn\",\"sco\",\"scp\",\"scq\",\"scs\",\"sct\",\"scu\",\"scv\",\"scw\",\"scx\",\"sda\",\"sdb\",\"sdc\",\"sde\",\"sdf\",\"sdg\",\"sdh\",\"sdj\",\"sdk\",\"sdl\",\"sdm\",\"sdn\",\"sdo\",\"sdp\",\"sdr\",\"sds\",\"sdt\",\"sdu\",\"sdv\",\"sdx\",\"sdz\",\"sea\",\"seb\",\"sec\",\"sed\",\"see\",\"sef\",\"seg\",\"seh\",\"sei\",\"sej\",\"sek\",\"sel\",\"sem\",\"sen\",\"seo\",\"sep\",\"seq\",\"ser\",\"ses\",\"set\",\"seu\",\"sev\",\"sew\",\"sey\",\"sez\",\"sfb\",\"sfe\",\"sfm\",\"sfs\",\"sfw\",\"sga\",\"sgb\",\"sgc\",\"sgd\",\"sge\",\"sgg\",\"sgh\",\"sgi\",\"sgj\",\"sgk\",\"sgl\",\"sgm\",\"sgn\",\"sgo\",\"sgp\",\"sgr\",\"sgs\",\"sgt\",\"sgu\",\"sgw\",\"sgx\",\"sgy\",\"sgz\",\"sha\",\"shb\",\"shc\",\"shd\",\"she\",\"shg\",\"shh\",\"shi\",\"shj\",\"shk\",\"shl\",\"shm\",\"shn\",\"sho\",\"shp\",\"shq\",\"shr\",\"shs\",\"sht\",\"shu\",\"shv\",\"shw\",\"shx\",\"shy\",\"shz\",\"sia\",\"sib\",\"sid\",\"sie\",\"sif\",\"sig\",\"sih\",\"sii\",\"sij\",\"sik\",\"sil\",\"sim\",\"sio\",\"sip\",\"siq\",\"sir\",\"sis\",\"sit\",\"siu\",\"siv\",\"siw\",\"six\",\"siy\",\"siz\",\"sja\",\"sjb\",\"sjd\",\"sje\",\"sjg\",\"sjk\",\"sjl\",\"sjm\",\"sjn\",\"sjo\",\"sjp\",\"sjr\",\"sjs\",\"sjt\",\"sju\",\"sjw\",\"ska\",\"skb\",\"skc\",\"skd\",\"ske\",\"skf\",\"skg\",\"skh\",\"ski\",\"skj\",\"skk\",\"skm\",\"skn\",\"sko\",\"skp\",\"skq\",\"skr\",\"sks\",\"skt\",\"sku\",\"skv\",\"skw\",\"skx\",\"sky\",\"skz\",\"sla\",\"slc\",\"sld\",\"sle\",\"slf\",\"slg\",\"slh\",\"sli\",\"slj\",\"sll\",\"slm\",\"sln\",\"slp\",\"slq\",\"slr\",\"sls\",\"slt\",\"slu\",\"slw\",\"slx\",\"sly\",\"slz\",\"sma\",\"smb\",\"smc\",\"smd\",\"smf\",\"smg\",\"smh\",\"smi\",\"smj\",\"smk\",\"sml\",\"smm\",\"smn\",\"smp\",\"smq\",\"smr\",\"sms\",\"smt\",\"smu\",\"smv\",\"smw\",\"smx\",\"smy\",\"smz\",\"snb\",\"snc\",\"sne\",\"snf\",\"sng\",\"snh\",\"sni\",\"snj\",\"snk\",\"snl\",\"snm\",\"snn\",\"sno\",\"snp\",\"snq\",\"snr\",\"sns\",\"snu\",\"snv\",\"snw\",\"snx\",\"sny\",\"snz\",\"soa\",\"sob\",\"soc\",\"sod\",\"soe\",\"sog\",\"soh\",\"soi\",\"soj\",\"sok\",\"sol\",\"son\",\"soo\",\"sop\",\"soq\",\"sor\",\"sos\",\"sou\",\"sov\",\"sow\",\"sox\",\"soy\",\"soz\",\"spb\",\"spc\",\"spd\",\"spe\",\"spg\",\"spi\",\"spk\",\"spl\",\"spm\",\"spn\",\"spo\",\"spp\",\"spq\",\"spr\",\"sps\",\"spt\",\"spu\",\"spv\",\"spx\",\"spy\",\"sqa\",\"sqh\",\"sqj\",\"sqk\",\"sqm\",\"sqn\",\"sqo\",\"sqq\",\"sqr\",\"sqs\",\"sqt\",\"squ\",\"sra\",\"srb\",\"src\",\"sre\",\"srf\",\"srg\",\"srh\",\"sri\",\"srk\",\"srl\",\"srm\",\"srn\",\"sro\",\"srq\",\"srr\",\"srs\",\"srt\",\"sru\",\"srv\",\"srw\",\"srx\",\"sry\",\"srz\",\"ssa\",\"ssb\",\"ssc\",\"ssd\",\"sse\",\"ssf\",\"ssg\",\"ssh\",\"ssi\",\"ssj\",\"ssk\",\"ssl\",\"ssm\",\"ssn\",\"sso\",\"ssp\",\"ssq\",\"ssr\",\"sss\",\"sst\",\"ssu\",\"ssv\",\"ssx\",\"ssy\",\"ssz\",\"sta\",\"stb\",\"std\",\"ste\",\"stf\",\"stg\",\"sth\",\"sti\",\"stj\",\"stk\",\"stl\",\"stm\",\"stn\",\"sto\",\"stp\",\"stq\",\"str\",\"sts\",\"stt\",\"stu\",\"stv\",\"stw\",\"sty\",\"sua\",\"sub\",\"suc\",\"sue\",\"sug\",\"sui\",\"suj\",\"suk\",\"sul\",\"sum\",\"suq\",\"sur\",\"sus\",\"sut\",\"suv\",\"suw\",\"sux\",\"suy\",\"suz\",\"sva\",\"svb\",\"svc\",\"sve\",\"svk\",\"svm\",\"svr\",\"svs\",\"svx\",\"swb\",\"swc\",\"swf\",\"swg\",\"swh\",\"swi\",\"swj\",\"swk\",\"swl\",\"swm\",\"swn\",\"swo\",\"swp\",\"swq\",\"swr\",\"sws\",\"swt\",\"swu\",\"swv\",\"sww\",\"swx\",\"swy\",\"sxb\",\"sxc\",\"sxe\",\"sxg\",\"sxk\",\"sxl\",\"sxm\",\"sxn\",\"sxo\",\"sxr\",\"sxs\",\"sxu\",\"sxw\",\"sya\",\"syb\",\"syc\",\"syd\",\"syi\",\"syk\",\"syl\",\"sym\",\"syn\",\"syo\",\"syr\",\"sys\",\"syw\",\"syx\",\"syy\",\"sza\",\"szb\",\"szc\",\"szd\",\"sze\",\"szg\",\"szl\",\"szn\",\"szp\",\"szs\",\"szv\",\"szw\",\"taa\",\"tab\",\"tac\",\"tad\",\"tae\",\"taf\",\"tag\",\"tai\",\"taj\",\"tak\",\"tal\",\"tan\",\"tao\",\"tap\",\"taq\",\"tar\",\"tas\",\"tau\",\"tav\",\"taw\",\"tax\",\"tay\",\"taz\",\"tba\",\"tbb\",\"tbc\",\"tbd\",\"tbe\",\"tbf\",\"tbg\",\"tbh\",\"tbi\",\"tbj\",\"tbk\",\"tbl\",\"tbm\",\"tbn\",\"tbo\",\"tbp\",\"tbq\",\"tbr\",\"tbs\",\"tbt\",\"tbu\",\"tbv\",\"tbw\",\"tbx\",\"tby\",\"tbz\",\"tca\",\"tcb\",\"tcc\",\"tcd\",\"tce\",\"tcf\",\"tcg\",\"tch\",\"tci\",\"tck\",\"tcl\",\"tcm\",\"tcn\",\"tco\",\"tcp\",\"tcq\",\"tcs\",\"tct\",\"tcu\",\"tcw\",\"tcx\",\"tcy\",\"tcz\",\"tda\",\"tdb\",\"tdc\",\"tdd\",\"tde\",\"tdf\",\"tdg\",\"tdh\",\"tdi\",\"tdj\",\"tdk\",\"tdl\",\"tdm\",\"tdn\",\"tdo\",\"tdq\",\"tdr\",\"tds\",\"tdt\",\"tdu\",\"tdv\",\"tdx\",\"tdy\",\"tea\",\"teb\",\"tec\",\"ted\",\"tee\",\"tef\",\"teg\",\"teh\",\"tei\",\"tek\",\"tem\",\"ten\",\"teo\",\"tep\",\"teq\",\"ter\",\"tes\",\"tet\",\"teu\",\"tev\",\"tew\",\"tex\",\"tey\",\"tez\",\"tfi\",\"tfn\",\"tfo\",\"tfr\",\"tft\",\"tga\",\"tgb\",\"tgc\",\"tgd\",\"tge\",\"tgf\",\"tgg\",\"tgh\",\"tgi\",\"tgj\",\"tgn\",\"tgo\",\"tgp\",\"tgq\",\"tgr\",\"tgs\",\"tgt\",\"tgu\",\"tgv\",\"tgw\",\"tgx\",\"tgy\",\"tgz\",\"thc\",\"thd\",\"the\",\"thf\",\"thh\",\"thi\",\"thk\",\"thl\",\"thm\",\"thn\",\"thp\",\"thq\",\"thr\",\"ths\",\"tht\",\"thu\",\"thv\",\"thw\",\"thx\",\"thy\",\"thz\",\"tia\",\"tic\",\"tid\",\"tie\",\"tif\",\"tig\",\"tih\",\"tii\",\"tij\",\"tik\",\"til\",\"tim\",\"tin\",\"tio\",\"tip\",\"tiq\",\"tis\",\"tit\",\"tiu\",\"tiv\",\"tiw\",\"tix\",\"tiy\",\"tiz\",\"tja\",\"tjg\",\"tji\",\"tjl\",\"tjm\",\"tjn\",\"tjo\",\"tjs\",\"tju\",\"tjw\",\"tka\",\"tkb\",\"tkd\",\"tke\",\"tkf\",\"tkg\",\"tkk\",\"tkl\",\"tkm\",\"tkn\",\"tkp\",\"tkq\",\"tkr\",\"tks\",\"tkt\",\"tku\",\"tkv\",\"tkw\",\"tkx\",\"tkz\",\"tla\",\"tlb\",\"tlc\",\"tld\",\"tlf\",\"tlg\",\"tlh\",\"tli\",\"tlj\",\"tlk\",\"tll\",\"tlm\",\"tln\",\"tlo\",\"tlp\",\"tlq\",\"tlr\",\"tls\",\"tlt\",\"tlu\",\"tlv\",\"tlw\",\"tlx\",\"tly\",\"tma\",\"tmb\",\"tmc\",\"tmd\",\"tme\",\"tmf\",\"tmg\",\"tmh\",\"tmi\",\"tmj\",\"tmk\",\"tml\",\"tmm\",\"tmn\",\"tmo\",\"tmp\",\"tmq\",\"tmr\",\"tms\",\"tmt\",\"tmu\",\"tmv\",\"tmw\",\"tmy\",\"tmz\",\"tna\",\"tnb\",\"tnc\",\"tnd\",\"tne\",\"tnf\",\"tng\",\"tnh\",\"tni\",\"tnk\",\"tnl\",\"tnm\",\"tnn\",\"tno\",\"tnp\",\"tnq\",\"tnr\",\"tns\",\"tnt\",\"tnu\",\"tnv\",\"tnw\",\"tnx\",\"tny\",\"tnz\",\"tob\",\"toc\",\"tod\",\"toe\",\"tof\",\"tog\",\"toh\",\"toi\",\"toj\",\"tol\",\"tom\",\"too\",\"top\",\"toq\",\"tor\",\"tos\",\"tou\",\"tov\",\"tow\",\"tox\",\"toy\",\"toz\",\"tpa\",\"tpc\",\"tpe\",\"tpf\",\"tpg\",\"tpi\",\"tpj\",\"tpk\",\"tpl\",\"tpm\",\"tpn\",\"tpo\",\"tpp\",\"tpq\",\"tpr\",\"tpt\",\"tpu\",\"tpv\",\"tpw\",\"tpx\",\"tpy\",\"tpz\",\"tqb\",\"tql\",\"tqm\",\"tqn\",\"tqo\",\"tqp\",\"tqq\",\"tqr\",\"tqt\",\"tqu\",\"tqw\",\"tra\",\"trb\",\"trc\",\"trd\",\"tre\",\"trf\",\"trg\",\"trh\",\"tri\",\"trj\",\"trk\",\"trl\",\"trm\",\"trn\",\"tro\",\"trp\",\"trq\",\"trr\",\"trs\",\"trt\",\"tru\",\"trv\",\"trw\",\"trx\",\"try\",\"trz\",\"tsa\",\"tsb\",\"tsc\",\"tsd\",\"tse\",\"tsf\",\"tsg\",\"tsh\",\"tsi\",\"tsj\",\"tsk\",\"tsl\",\"tsm\",\"tsp\",\"tsq\",\"tsr\",\"tss\",\"tst\",\"tsu\",\"tsv\",\"tsw\",\"tsx\",\"tsy\",\"tsz\",\"tta\",\"ttb\",\"ttc\",\"ttd\",\"tte\",\"ttf\",\"ttg\",\"tth\",\"tti\",\"ttj\",\"ttk\",\"ttl\",\"ttm\",\"ttn\",\"tto\",\"ttp\",\"ttq\",\"ttr\",\"tts\",\"ttt\",\"ttu\",\"ttv\",\"ttw\",\"tty\",\"ttz\",\"tua\",\"tub\",\"tuc\",\"tud\",\"tue\",\"tuf\",\"tug\",\"tuh\",\"tui\",\"tuj\",\"tul\",\"tum\",\"tun\",\"tuo\",\"tup\",\"tuq\",\"tus\",\"tut\",\"tuu\",\"tuv\",\"tuw\",\"tux\",\"tuy\",\"tuz\",\"tva\",\"tvd\",\"tve\",\"tvk\",\"tvl\",\"tvm\",\"tvn\",\"tvo\",\"tvs\",\"tvt\",\"tvu\",\"tvw\",\"tvy\",\"twa\",\"twb\",\"twc\",\"twd\",\"twe\",\"twf\",\"twg\",\"twh\",\"twl\",\"twm\",\"twn\",\"two\",\"twp\",\"twq\",\"twr\",\"twt\",\"twu\",\"tww\",\"twx\",\"twy\",\"txa\",\"txb\",\"txc\",\"txe\",\"txg\",\"txh\",\"txi\",\"txj\",\"txm\",\"txn\",\"txo\",\"txq\",\"txr\",\"txs\",\"txt\",\"txu\",\"txx\",\"txy\",\"tya\",\"tye\",\"tyh\",\"tyi\",\"tyj\",\"tyl\",\"tyn\",\"typ\",\"tyr\",\"tys\",\"tyt\",\"tyu\",\"tyv\",\"tyx\",\"tyz\",\"tza\",\"tzh\",\"tzj\",\"tzl\",\"tzm\",\"tzn\",\"tzo\",\"tzx\",\"uam\",\"uan\",\"uar\",\"uba\",\"ubi\",\"ubl\",\"ubr\",\"ubu\",\"uby\",\"uda\",\"ude\",\"udg\",\"udi\",\"udj\",\"udl\",\"udm\",\"udu\",\"ues\",\"ufi\",\"uga\",\"ugb\",\"uge\",\"ugn\",\"ugo\",\"ugy\",\"uha\",\"uhn\",\"uis\",\"uiv\",\"uji\",\"uka\",\"ukg\",\"ukh\",\"ukk\",\"ukl\",\"ukp\",\"ukq\",\"uks\",\"uku\",\"ukw\",\"uky\",\"ula\",\"ulb\",\"ulc\",\"ule\",\"ulf\",\"uli\",\"ulk\",\"ull\",\"ulm\",\"uln\",\"ulu\",\"ulw\",\"uma\",\"umb\",\"umc\",\"umd\",\"umg\",\"umi\",\"umm\",\"umn\",\"umo\",\"ump\",\"umr\",\"ums\",\"umu\",\"una\",\"und\",\"une\",\"ung\",\"unk\",\"unm\",\"unn\",\"unp\",\"unr\",\"unu\",\"unx\",\"unz\",\"uok\",\"upi\",\"upv\",\"ura\",\"urb\",\"urc\",\"ure\",\"urf\",\"urg\",\"urh\",\"uri\",\"urj\",\"urk\",\"url\",\"urm\",\"urn\",\"uro\",\"urp\",\"urr\",\"urt\",\"uru\",\"urv\",\"urw\",\"urx\",\"ury\",\"urz\",\"usa\",\"ush\",\"usi\",\"usk\",\"usp\",\"usu\",\"uta\",\"ute\",\"utp\",\"utr\",\"utu\",\"uum\",\"uun\",\"uur\",\"uuu\",\"uve\",\"uvh\",\"uvl\",\"uwa\",\"uya\",\"uzn\",\"uzs\",\"vaa\",\"vae\",\"vaf\",\"vag\",\"vah\",\"vai\",\"vaj\",\"val\",\"vam\",\"van\",\"vao\",\"vap\",\"var\",\"vas\",\"vau\",\"vav\",\"vay\",\"vbb\",\"vbk\",\"vec\",\"ved\",\"vel\",\"vem\",\"veo\",\"vep\",\"ver\",\"vgr\",\"vgt\",\"vic\",\"vid\",\"vif\",\"vig\",\"vil\",\"vin\",\"vis\",\"vit\",\"viv\",\"vka\",\"vki\",\"vkj\",\"vkk\",\"vkl\",\"vkm\",\"vko\",\"vkp\",\"vkt\",\"vku\",\"vlp\",\"vls\",\"vma\",\"vmb\",\"vmc\",\"vmd\",\"vme\",\"vmf\",\"vmg\",\"vmh\",\"vmi\",\"vmj\",\"vmk\",\"vml\",\"vmm\",\"vmp\",\"vmq\",\"vmr\",\"vms\",\"vmu\",\"vmv\",\"vmw\",\"vmx\",\"vmy\",\"vmz\",\"vnk\",\"vnm\",\"vnp\",\"vor\",\"vot\",\"vra\",\"vro\",\"vrs\",\"vrt\",\"vsi\",\"vsl\",\"vsv\",\"vto\",\"vum\",\"vun\",\"vut\",\"vwa\",\"waa\",\"wab\",\"wac\",\"wad\",\"wae\",\"waf\",\"wag\",\"wah\",\"wai\",\"waj\",\"wak\",\"wal\",\"wam\",\"wan\",\"wao\",\"wap\",\"waq\",\"war\",\"was\",\"wat\",\"wau\",\"wav\",\"waw\",\"wax\",\"way\",\"waz\",\"wba\",\"wbb\",\"wbe\",\"wbf\",\"wbh\",\"wbi\",\"wbj\",\"wbk\",\"wbl\",\"wbm\",\"wbp\",\"wbq\",\"wbr\",\"wbs\",\"wbt\",\"wbv\",\"wbw\",\"wca\",\"wci\",\"wdd\",\"wdg\",\"wdj\",\"wdk\",\"wdu\",\"wdy\",\"wea\",\"wec\",\"wed\",\"weg\",\"weh\",\"wei\",\"wem\",\"wen\",\"weo\",\"wep\",\"wer\",\"wes\",\"wet\",\"weu\",\"wew\",\"wfg\",\"wga\",\"wgb\",\"wgg\",\"wgi\",\"wgo\",\"wgu\",\"wgw\",\"wgy\",\"wha\",\"whg\",\"whk\",\"whu\",\"wib\",\"wic\",\"wie\",\"wif\",\"wig\",\"wih\",\"wii\",\"wij\",\"wik\",\"wil\",\"wim\",\"win\",\"wir\",\"wit\",\"wiu\",\"wiv\",\"wiw\",\"wiy\",\"wja\",\"wji\",\"wka\",\"wkb\",\"wkd\",\"wkl\",\"wku\",\"wkw\",\"wky\",\"wla\",\"wlc\",\"wle\",\"wlg\",\"wli\",\"wlk\",\"wll\",\"wlm\",\"wlo\",\"wlr\",\"wls\",\"wlu\",\"wlv\",\"wlw\",\"wlx\",\"wly\",\"wma\",\"wmb\",\"wmc\",\"wmd\",\"wme\",\"wmh\",\"wmi\",\"wmm\",\"wmn\",\"wmo\",\"wms\",\"wmt\",\"wmw\",\"wmx\",\"wnb\",\"wnc\",\"wnd\",\"wne\",\"wng\",\"wni\",\"wnk\",\"wnm\",\"wnn\",\"wno\",\"wnp\",\"wnu\",\"wnw\",\"wny\",\"woa\",\"wob\",\"woc\",\"wod\",\"woe\",\"wof\",\"wog\",\"woi\",\"wok\",\"wom\",\"won\",\"woo\",\"wor\",\"wos\",\"wow\",\"woy\",\"wpc\",\"wra\",\"wrb\",\"wrd\",\"wrg\",\"wrh\",\"wri\",\"wrk\",\"wrl\",\"wrm\",\"wrn\",\"wro\",\"wrp\",\"wrr\",\"wrs\",\"wru\",\"wrv\",\"wrw\",\"wrx\",\"wry\",\"wrz\",\"wsa\",\"wsg\",\"wsi\",\"wsk\",\"wsr\",\"wss\",\"wsu\",\"wsv\",\"wtf\",\"wth\",\"wti\",\"wtk\",\"wtm\",\"wtw\",\"wua\",\"wub\",\"wud\",\"wuh\",\"wul\",\"wum\",\"wun\",\"wur\",\"wut\",\"wuu\",\"wuv\",\"wux\",\"wuy\",\"wwa\",\"wwb\",\"wwo\",\"wwr\",\"www\",\"wxa\",\"wxw\",\"wya\",\"wyb\",\"wyi\",\"wym\",\"wyr\",\"wyy\",\"xaa\",\"xab\",\"xac\",\"xad\",\"xae\",\"xag\",\"xai\",\"xaj\",\"xak\",\"xal\",\"xam\",\"xan\",\"xao\",\"xap\",\"xaq\",\"xar\",\"xas\",\"xat\",\"xau\",\"xav\",\"xaw\",\"xay\",\"xba\",\"xbb\",\"xbc\",\"xbd\",\"xbe\",\"xbg\",\"xbi\",\"xbj\",\"xbm\",\"xbn\",\"xbo\",\"xbp\",\"xbr\",\"xbw\",\"xbx\",\"xby\",\"xcb\",\"xcc\",\"xce\",\"xcg\",\"xch\",\"xcl\",\"xcm\",\"xcn\",\"xco\",\"xcr\",\"xct\",\"xcu\",\"xcv\",\"xcw\",\"xcy\",\"xda\",\"xdc\",\"xdk\",\"xdm\",\"xdo\",\"xdy\",\"xeb\",\"xed\",\"xeg\",\"xel\",\"xem\",\"xep\",\"xer\",\"xes\",\"xet\",\"xeu\",\"xfa\",\"xga\",\"xgb\",\"xgd\",\"xgf\",\"xgg\",\"xgi\",\"xgl\",\"xgm\",\"xgn\",\"xgr\",\"xgu\",\"xgw\",\"xha\",\"xhc\",\"xhd\",\"xhe\",\"xhr\",\"xht\",\"xhu\",\"xhv\",\"xia\",\"xib\",\"xii\",\"xil\",\"xin\",\"xip\",\"xir\",\"xis\",\"xiv\",\"xiy\",\"xjb\",\"xjt\",\"xka\",\"xkb\",\"xkc\",\"xkd\",\"xke\",\"xkf\",\"xkg\",\"xkh\",\"xki\",\"xkj\",\"xkk\",\"xkl\",\"xkn\",\"xko\",\"xkp\",\"xkq\",\"xkr\",\"xks\",\"xkt\",\"xku\",\"xkv\",\"xkw\",\"xkx\",\"xky\",\"xkz\",\"xla\",\"xlb\",\"xlc\",\"xld\",\"xle\",\"xlg\",\"xli\",\"xln\",\"xlo\",\"xlp\",\"xls\",\"xlu\",\"xly\",\"xma\",\"xmb\",\"xmc\",\"xmd\",\"xme\",\"xmf\",\"xmg\",\"xmh\",\"xmj\",\"xmk\",\"xml\",\"xmm\",\"xmn\",\"xmo\",\"xmp\",\"xmq\",\"xmr\",\"xms\",\"xmt\",\"xmu\",\"xmv\",\"xmw\",\"xmx\",\"xmy\",\"xmz\",\"xna\",\"xnb\",\"xnd\",\"xng\",\"xnh\",\"xni\",\"xnk\",\"xnn\",\"xno\",\"xnr\",\"xns\",\"xnt\",\"xnu\",\"xny\",\"xnz\",\"xoc\",\"xod\",\"xog\",\"xoi\",\"xok\",\"xom\",\"xon\",\"xoo\",\"xop\",\"xor\",\"xow\",\"xpa\",\"xpc\",\"xpe\",\"xpg\",\"xpi\",\"xpj\",\"xpk\",\"xpm\",\"xpn\",\"xpo\",\"xpp\",\"xpq\",\"xpr\",\"xps\",\"xpt\",\"xpu\",\"xpy\",\"xqa\",\"xqt\",\"xra\",\"xrb\",\"xrd\",\"xre\",\"xrg\",\"xri\",\"xrm\",\"xrn\",\"xrq\",\"xrr\",\"xrt\",\"xru\",\"xrw\",\"xsa\",\"xsb\",\"xsc\",\"xsd\",\"xse\",\"xsh\",\"xsi\",\"xsj\",\"xsl\",\"xsm\",\"xsn\",\"xso\",\"xsp\",\"xsq\",\"xsr\",\"xss\",\"xsu\",\"xsv\",\"xsy\",\"xta\",\"xtb\",\"xtc\",\"xtd\",\"xte\",\"xtg\",\"xth\",\"xti\",\"xtj\",\"xtl\",\"xtm\",\"xtn\",\"xto\",\"xtp\",\"xtq\",\"xtr\",\"xts\",\"xtt\",\"xtu\",\"xtv\",\"xtw\",\"xty\",\"xtz\",\"xua\",\"xub\",\"xud\",\"xug\",\"xuj\",\"xul\",\"xum\",\"xun\",\"xuo\",\"xup\",\"xur\",\"xut\",\"xuu\",\"xve\",\"xvi\",\"xvn\",\"xvo\",\"xvs\",\"xwa\",\"xwc\",\"xwd\",\"xwe\",\"xwg\",\"xwj\",\"xwk\",\"xwl\",\"xwo\",\"xwr\",\"xwt\",\"xww\",\"xxb\",\"xxk\",\"xxm\",\"xxr\",\"xxt\",\"xya\",\"xyb\",\"xyj\",\"xyk\",\"xyl\",\"xyt\",\"xyy\",\"xzh\",\"xzm\",\"xzp\",\"yaa\",\"yab\",\"yac\",\"yad\",\"yae\",\"yaf\",\"yag\",\"yah\",\"yai\",\"yaj\",\"yak\",\"yal\",\"yam\",\"yan\",\"yao\",\"yap\",\"yaq\",\"yar\",\"yas\",\"yat\",\"yau\",\"yav\",\"yaw\",\"yax\",\"yay\",\"yaz\",\"yba\",\"ybb\",\"ybd\",\"ybe\",\"ybh\",\"ybi\",\"ybj\",\"ybk\",\"ybl\",\"ybm\",\"ybn\",\"ybo\",\"ybx\",\"yby\",\"ych\",\"ycl\",\"ycn\",\"ycp\",\"yda\",\"ydd\",\"yde\",\"ydg\",\"ydk\",\"yds\",\"yea\",\"yec\",\"yee\",\"yei\",\"yej\",\"yel\",\"yen\",\"yer\",\"yes\",\"yet\",\"yeu\",\"yev\",\"yey\",\"yga\",\"ygi\",\"ygl\",\"ygm\",\"ygp\",\"ygr\",\"ygs\",\"ygu\",\"ygw\",\"yha\",\"yhd\",\"yhl\",\"yhs\",\"yia\",\"yif\",\"yig\",\"yih\",\"yii\",\"yij\",\"yik\",\"yil\",\"yim\",\"yin\",\"yip\",\"yiq\",\"yir\",\"yis\",\"yit\",\"yiu\",\"yiv\",\"yix\",\"yiy\",\"yiz\",\"yka\",\"ykg\",\"yki\",\"ykk\",\"ykl\",\"ykm\",\"ykn\",\"yko\",\"ykr\",\"ykt\",\"yku\",\"yky\",\"yla\",\"ylb\",\"yle\",\"ylg\",\"yli\",\"yll\",\"ylm\",\"yln\",\"ylo\",\"ylr\",\"ylu\",\"yly\",\"yma\",\"ymb\",\"ymc\",\"ymd\",\"yme\",\"ymg\",\"ymh\",\"ymi\",\"ymk\",\"yml\",\"ymm\",\"ymn\",\"ymo\",\"ymp\",\"ymq\",\"ymr\",\"yms\",\"ymt\",\"ymx\",\"ymz\",\"yna\",\"ynd\",\"yne\",\"yng\",\"ynh\",\"ynk\",\"ynl\",\"ynn\",\"yno\",\"ynq\",\"yns\",\"ynu\",\"yob\",\"yog\",\"yoi\",\"yok\",\"yol\",\"yom\",\"yon\",\"yos\",\"yot\",\"yox\",\"yoy\",\"ypa\",\"ypb\",\"ypg\",\"yph\",\"ypk\",\"ypm\",\"ypn\",\"ypo\",\"ypp\",\"ypz\",\"yra\",\"yrb\",\"yre\",\"yri\",\"yrk\",\"yrl\",\"yrm\",\"yrn\",\"yro\",\"yrs\",\"yrw\",\"yry\",\"ysc\",\"ysd\",\"ysg\",\"ysl\",\"ysn\",\"yso\",\"ysp\",\"ysr\",\"yss\",\"ysy\",\"yta\",\"ytl\",\"ytp\",\"ytw\",\"yty\",\"yua\",\"yub\",\"yuc\",\"yud\",\"yue\",\"yuf\",\"yug\",\"yui\",\"yuj\",\"yuk\",\"yul\",\"yum\",\"yun\",\"yup\",\"yuq\",\"yur\",\"yut\",\"yuu\",\"yuw\",\"yux\",\"yuy\",\"yuz\",\"yva\",\"yvt\",\"ywa\",\"ywg\",\"ywl\",\"ywn\",\"ywq\",\"ywr\",\"ywt\",\"ywu\",\"yww\",\"yxa\",\"yxg\",\"yxl\",\"yxm\",\"yxu\",\"yxy\",\"yyr\",\"yyu\",\"yyz\",\"yzg\",\"yzk\",\"zaa\",\"zab\",\"zac\",\"zad\",\"zae\",\"zaf\",\"zag\",\"zah\",\"zai\",\"zaj\",\"zak\",\"zal\",\"zam\",\"zao\",\"zap\",\"zaq\",\"zar\",\"zas\",\"zat\",\"zau\",\"zav\",\"zaw\",\"zax\",\"zay\",\"zaz\",\"zbc\",\"zbe\",\"zbl\",\"zbt\",\"zbw\",\"zca\",\"zch\",\"zdj\",\"zea\",\"zeg\",\"zeh\",\"zen\",\"zga\",\"zgb\",\"zgh\",\"zgm\",\"zgn\",\"zgr\",\"zhb\",\"zhd\",\"zhi\",\"zhn\",\"zhw\",\"zhx\",\"zia\",\"zib\",\"zik\",\"zil\",\"zim\",\"zin\",\"zir\",\"ziw\",\"ziz\",\"zka\",\"zkb\",\"zkd\",\"zkg\",\"zkh\",\"zkk\",\"zkn\",\"zko\",\"zkp\",\"zkr\",\"zkt\",\"zku\",\"zkv\",\"zkz\",\"zle\",\"zlj\",\"zlm\",\"zln\",\"zlq\",\"zls\",\"zlw\",\"zma\",\"zmb\",\"zmc\",\"zmd\",\"zme\",\"zmf\",\"zmg\",\"zmh\",\"zmi\",\"zmj\",\"zmk\",\"zml\",\"zmm\",\"zmn\",\"zmo\",\"zmp\",\"zmq\",\"zmr\",\"zms\",\"zmt\",\"zmu\",\"zmv\",\"zmw\",\"zmx\",\"zmy\",\"zmz\",\"zna\",\"znd\",\"zne\",\"zng\",\"znk\",\"zns\",\"zoc\",\"zoh\",\"zom\",\"zoo\",\"zoq\",\"zor\",\"zos\",\"zpa\",\"zpb\",\"zpc\",\"zpd\",\"zpe\",\"zpf\",\"zpg\",\"zph\",\"zpi\",\"zpj\",\"zpk\",\"zpl\",\"zpm\",\"zpn\",\"zpo\",\"zpp\",\"zpq\",\"zpr\",\"zps\",\"zpt\",\"zpu\",\"zpv\",\"zpw\",\"zpx\",\"zpy\",\"zpz\",\"zqe\",\"zra\",\"zrg\",\"zrn\",\"zro\",\"zrp\",\"zrs\",\"zsa\",\"zsk\",\"zsl\",\"zsm\",\"zsr\",\"zsu\",\"zte\",\"ztg\",\"ztl\",\"ztm\",\"ztn\",\"ztp\",\"ztq\",\"zts\",\"ztt\",\"ztu\",\"ztx\",\"zty\",\"zua\",\"zuh\",\"zum\",\"zun\",\"zuy\",\"zwa\",\"zxx\",\"zyb\",\"zyg\",\"zyj\",\"zyn\",\"zyp\",\"zza\",\"zzj\"];function he(e){return ye(e)||ge(e)||be()}function be(){throw new TypeError(\"Invalid attempt to spread non-iterable instance\")}function ge(e){if(Symbol.iterator in Object(e)||\"[object Arguments]\"===Object.prototype.toString.call(e))return Array.from(e)}function ye(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t<e.length;t++)n[t]=e[t];return n}}function R(){return(R=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function S(e){return(S=\"function\"==typeof Symbol&&\"symbol\"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&\"function\"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e})(e)}axe.utils.validLangs=function(){\"use strict\";return Ie},axe._load({data:{rules:{accesskeys:{description:\"Ensures every accesskey attribute value is unique\",help:\"accesskey attribute value must be unique\"},\"area-alt\":{description:\"Ensures <area> elements of image maps have alternate text\",help:\"Active <area> elements must have alternate text\"},\"aria-allowed-attr\":{description:\"Ensures ARIA attributes are allowed for an element's role\",help:\"Elements must only use allowed ARIA attributes\"},\"aria-allowed-role\":{description:\"Ensures role attribute has an appropriate value for the element\",help:\"ARIA role must be appropriate for the element\"},\"aria-dpub-role-fallback\":{description:\"Ensures unsupported DPUB roles are only used on elements with implicit fallback roles\",help:\"Unsupported DPUB ARIA roles should be used on elements with implicit fallback roles\"},\"aria-hidden-body\":{description:\"Ensures aria-hidden='true' is not present on the document body.\",help:\"aria-hidden='true' must not be present on the document body\"},\"aria-hidden-focus\":{description:\"Ensures aria-hidden elements do not contain focusable elements\",help:\"ARIA hidden element must not contain focusable elements\"},\"aria-input-field-name\":{description:\"Ensures every ARIA input field has an accessible name\",help:\"ARIA input fields have an accessible name\"},\"aria-required-attr\":{description:\"Ensures elements with ARIA roles have all required ARIA attributes\",help:\"Required ARIA attributes must be provided\"},\"aria-required-children\":{description:\"Ensures elements with an ARIA role that require child roles contain them\",help:\"Certain ARIA roles must contain particular children\"},\"aria-required-parent\":{description:\"Ensures elements with an ARIA role that require parent roles are contained by them\",help:\"Certain ARIA roles must be contained by particular parents\"},\"aria-roles\":{description:\"Ensures all elements with a role attribute use a valid value\",help:\"ARIA roles used must conform to valid values\"},\"aria-toggle-field-name\":{description:\"Ensures every ARIA toggle field has an accessible name\",help:\"ARIA toggle fields have an accessible name\"},\"aria-valid-attr-value\":{description:\"Ensures all ARIA attributes have valid values\",help:\"ARIA attributes must conform to valid values\"},\"aria-valid-attr\":{description:\"Ensures attributes that begin with aria- are valid ARIA attributes\",help:\"ARIA attributes must conform to valid names\"},\"audio-caption\":{description:\"Ensures <audio> elements have captions\",help:\"<audio> elements must have a captions track\"},\"autocomplete-valid\":{description:\"Ensure the autocomplete attribute is correct and suitable for the form field\",help:\"autocomplete attribute must be used correctly\"},\"avoid-inline-spacing\":{description:\"Ensure that text spacing set through style attributes can be adjusted with custom stylesheets\",help:\"Inline text spacing must be adjustable with custom stylesheets\"},blink:{description:\"Ensures <blink> elements are not used\",help:\"<blink> elements are deprecated and must not be used\"},\"button-name\":{description:\"Ensures buttons have discernible text\",help:\"Buttons must have discernible text\"},bypass:{description:\"Ensures each page has at least one mechanism for a user to bypass navigation and jump straight to the content\",help:\"Page must have means to bypass repeated blocks\"},checkboxgroup:{description:'Ensures related <input type=\"checkbox\"> elements have a group and that the group designation is consistent',help:\"Checkbox inputs with the same name attribute value must be part of a group\"},\"color-contrast\":{description:\"Ensures the contrast between foreground and background colors meets WCAG 2 AA contrast ratio thresholds\",help:\"Elements must have sufficient color contrast\"},\"css-orientation-lock\":{description:\"Ensures content is not locked to any specific display orientation, and the content is operable in all display orientations\",help:\"CSS Media queries are not used to lock display orientation\"},\"definition-list\":{description:\"Ensures <dl> elements are structured correctly\",help:\"<dl> elements must only directly contain properly-ordered <dt> and <dd> groups, <script> or <template> elements\"},dlitem:{description:\"Ensures <dt> and <dd> elements are contained by a <dl>\",help:\"<dt> and <dd> elements must be contained by a <dl>\"},\"document-title\":{description:\"Ensures each HTML document contains a non-empty <title> element\",help:\"Documents must have <title> element to aid in navigation\"},\"duplicate-id-active\":{description:\"Ensures every id attribute value of active elements is unique\",help:\"IDs of active elements must be unique\"},\"duplicate-id-aria\":{description:\"Ensures every id attribute value used in ARIA and in labels is unique\",help:\"IDs used in ARIA and labels must be unique\"},\"duplicate-id\":{description:\"Ensures every id attribute value is unique\",help:\"id attribute value must be unique\"},\"empty-heading\":{description:\"Ensures headings have discernible text\",help:\"Headings must not be empty\"},\"focus-order-semantics\":{description:\"Ensures elements in the focus order have an appropriate role\",help:\"Elements in the focus order need a role appropriate for interactive content\"},\"form-field-multiple-labels\":{description:\"Ensures form field does not have multiple label elements\",help:\"Form field must not have multiple label elements\"},\"frame-tested\":{description:\"Ensures <iframe> and <frame> elements contain the axe-core script\",help:\"Frames must be tested with axe-core\"},\"frame-title-unique\":{description:\"Ensures <iframe> and <frame> elements contain a unique title attribute\",help:\"Frames must have a unique title attribute\"},\"frame-title\":{description:\"Ensures <iframe> and <frame> elements contain a non-empty title attribute\",help:\"Frames must have title attribute\"},\"heading-order\":{description:\"Ensures the order of headings is semantically correct\",help:\"Heading levels should only increase by one\"},\"hidden-content\":{description:\"Informs users about hidden content.\",help:\"Hidden content on the page cannot be analyzed\"},\"html-has-lang\":{description:\"Ensures every HTML document has a lang attribute\",help:\"<html> element must have a lang attribute\"},\"html-lang-valid\":{description:\"Ensures the lang attribute of the <html> element has a valid value\",help:\"<html> element must have a valid value for the lang attribute\"},\"html-xml-lang-mismatch\":{description:\"Ensure that HTML elements with both valid lang and xml:lang attributes agree on the base language of the page\",help:\"HTML elements with lang and xml:lang must have the same base language\"},\"image-alt\":{description:\"Ensures <img> elements have alternate text or a role of none or presentation\",help:\"Images must have alternate text\"},\"image-redundant-alt\":{description:\"Ensure image alternative is not repeated as text\",help:\"Alternative text of images should not be repeated as text\"},\"input-button-name\":{description:\"Ensures input buttons have discernible text\",help:\"Input buttons must have discernible text\"},\"input-image-alt\":{description:'Ensures <input type=\"image\"> elements have alternate text',help:\"Image buttons must have alternate text\"},\"label-content-name-mismatch\":{description:\"Ensures that elements labelled through their content must have their visible text as part of their accessible name\",help:\"Elements must have their visible text as part of their accessible name\"},\"label-title-only\":{description:\"Ensures that every form element is not solely labeled using the title or aria-describedby attributes\",help:\"Form elements should have a visible label\"},label:{description:\"Ensures every form element has a label\",help:\"Form elements must have labels\"},\"landmark-banner-is-top-level\":{description:\"Ensures the banner landmark is at top level\",help:\"Banner landmark must not be contained in another landmark\"},\"landmark-complementary-is-top-level\":{description:\"Ensures the complementary landmark or aside is at top level\",help:\"Aside must not be contained in another landmark\"},\"landmark-contentinfo-is-top-level\":{description:\"Ensures the contentinfo landmark is at top level\",help:\"Contentinfo landmark must not be contained in another landmark\"},\"landmark-main-is-top-level\":{description:\"Ensures the main landmark is at top level\",help:\"Main landmark must not be contained in another landmark\"},\"landmark-no-duplicate-banner\":{description:\"Ensures the document has at most one banner landmark\",help:\"Document must not have more than one banner landmark\"},\"landmark-no-duplicate-contentinfo\":{description:\"Ensures the document has at most one contentinfo landmark\",help:\"Document must not have more than one contentinfo landmark\"},\"landmark-one-main\":{description:\"Ensures the document has only one main landmark and each iframe in the page has at most one main landmark\",help:\"Document must have one main landmark\"},\"landmark-unique\":{help:\"Ensures landmarks are unique\",description:\"Landmarks must have a unique role or role/label/title (i.e. accessible name) combination\"},\"layout-table\":{description:\"Ensures presentational <table> elements do not use <th>, <caption> elements or the summary attribute\",help:\"Layout tables must not use data table elements\"},\"link-in-text-block\":{description:\"Links can be distinguished without relying on color\",help:\"Links must be distinguished from surrounding text in a way that does not rely on color\"},\"link-name\":{description:\"Ensures links have discernible text\",help:\"Links must have discernible text\"},list:{description:\"Ensures that lists are structured correctly\",help:\"<ul> and <ol> must only directly contain <li>, <script> or <template> elements\"},listitem:{description:\"Ensures <li> elements are used semantically\",help:\"<li> elements must be contained in a <ul> or <ol>\"},marquee:{description:\"Ensures <marquee> elements are not used\",help:\"<marquee> elements are deprecated and must not be used\"},\"meta-refresh\":{description:'Ensures <meta http-equiv=\"refresh\"> is not used',help:\"Timed refresh must not exist\"},\"meta-viewport-large\":{description:'Ensures <meta name=\"viewport\"> can scale a significant amount',help:\"Users should be able to zoom and scale the text up to 500%\"},\"meta-viewport\":{description:'Ensures <meta name=\"viewport\"> does not disable text scaling and zooming',help:\"Zooming and scaling must not be disabled\"},\"object-alt\":{description:\"Ensures <object> elements have alternate text\",help:\"<object> elements must have alternate text\"},\"p-as-heading\":{description:\"Ensure p elements are not used to style headings\",help:\"Bold, italic text and font-size are not used to style p elements as a heading\"},\"page-has-heading-one\":{description:\"Ensure that the page, or at least one of its frames contains a level-one heading\",help:\"Page must contain a level-one heading\"},radiogroup:{description:'Ensures related <input type=\"radio\"> elements have a group and that the group designation is consistent',help:\"Radio inputs with the same name attribute value must be part of a group\"},region:{description:\"Ensures all page content is contained by landmarks\",help:\"All page content must be contained by landmarks\"},\"role-img-alt\":{description:\"Ensures [role='img'] elements have alternate text\",help:\"[role='img'] elements have an alternative text\"},\"scope-attr-valid\":{description:\"Ensures the scope attribute is used correctly on tables\",help:\"scope attribute should be used correctly\"},\"scrollable-region-focusable\":{description:\"Elements that have scrollable content should be accessible by keyboard\",help:\"Ensure that scrollable region has keyboard access\"},\"server-side-image-map\":{description:\"Ensures that server-side image maps are not used\",help:\"Server-side image maps must not be used\"},\"skip-link\":{description:\"Ensure all skip links have a focusable target\",help:\"The skip-link target should exist and be focusable\"},tabindex:{description:\"Ensures tabindex attribute values are not greater than 0\",help:\"Elements should not have tabindex greater than zero\"},\"table-duplicate-name\":{description:\"Ensure that tables do not have the same summary and caption\",help:\"The <caption> element should not contain the same text as the summary attribute\"},\"table-fake-caption\":{description:\"Ensure that tables with a caption use the <caption> element.\",help:\"Data or header cells should not be used to give caption to a data table.\"},\"td-has-header\":{description:\"Ensure that each non-empty data cell in a large table has one or more table headers\",help:\"All non-empty td element in table larger than 3 by 3 must have an associated table header\"},\"td-headers-attr\":{description:\"Ensure that each cell in a table using the headers refers to another cell in that table\",help:\"All cells in a table element that use the headers attribute must only refer to other cells of that same table\"},\"th-has-data-cells\":{description:\"Ensure that each table header in a data table refers to data cells\",help:\"All th elements and elements with role=columnheader/rowheader must have data cells they describe\"},\"valid-lang\":{description:\"Ensures lang attributes have valid values\",help:\"lang attribute must have a valid value\"},\"video-caption\":{description:\"Ensures <video> elements have captions\",help:\"<video> elements must have captions\"},\"video-description\":{description:\"Ensures <video> elements have audio descriptions\",help:\"<video> elements must have an audio description track\"}},checks:{accesskeys:{impact:\"serious\",messages:{pass:function(e){return\"Accesskey attribute value is unique\"},fail:function(e){return\"Document has multiple elements with the same accesskey\"}}},\"non-empty-alt\":{impact:\"critical\",messages:{pass:function(e){return\"Element has a non-empty alt attribute\"},fail:function(e){return\"Element has no alt attribute or the alt attribute is empty\"}}},\"non-empty-title\":{impact:\"serious\",messages:{pass:function(e){return\"Element has a title attribute\"},fail:function(e){return\"Element has no title attribute or the title attribute is empty\"}}},\"aria-label\":{impact:\"serious\",messages:{pass:function(e){return\"aria-label attribute exists and is not empty\"},fail:function(e){return\"aria-label attribute does not exist or is empty\"}}},\"aria-labelledby\":{impact:\"serious\",messages:{pass:function(e){return\"aria-labelledby attribute exists and references elements that are visible to screen readers\"},fail:function(e){return\"aria-labelledby attribute does not exist, references elements that do not exist or references elements that are empty\"}}},\"aria-allowed-attr\":{impact:\"critical\",messages:{pass:function(e){return\"ARIA attributes are used correctly for the defined role\"},fail:function(e){var t=\"ARIA attribute\"+(e.data&&1<e.data.length?\"s are\":\" is\")+\" not allowed:\",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t}}},\"aria-unsupported-attr\":{impact:\"critical\",messages:{pass:function(e){return\"ARIA attribute is supported\"},fail:function(e){var t=\"ARIA attribute is not widely supported in screen readers and assistive technologies: \",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t}}},\"aria-allowed-role\":{impact:\"minor\",messages:{pass:function(e){return\"ARIA role is allowed for given element\"},fail:function(e){return\"ARIA role\"+(e.data&&1<e.data.length?\"s\":\"\")+\" \"+e.data.join(\", \")+\" \"+(e.data&&1<e.data.length?\"are\":\" is\")+\" not allowed for given element\"},incomplete:function(e){return\"ARIA role\"+(e.data&&1<e.data.length?\"s\":\"\")+\" \"+e.data.join(\", \")+\" must be removed when the element is made visible, as \"+(e.data&&1<e.data.length?\"they are\":\"it is\")+\" not allowed for the element\"}}},\"implicit-role-fallback\":{impact:\"moderate\",messages:{pass:function(e){return\"Element’s implicit ARIA role is an appropriate fallback\"},fail:function(e){return\"Element’s implicit ARIA role is not a good fallback for the (unsupported) role\"}}},\"aria-hidden-body\":{impact:\"critical\",messages:{pass:function(e){return\"No aria-hidden attribute is present on document body\"},fail:function(e){return\"aria-hidden=true should not be present on the document body\"}}},\"focusable-disabled\":{impact:\"serious\",messages:{pass:function(e){return\"No focusable elements contained within element\"},fail:function(e){return\"Focusable content should be disabled or be removed from the DOM\"}}},\"focusable-not-tabbable\":{impact:\"serious\",messages:{pass:function(e){return\"No focusable elements contained within element\"},fail:function(e){return\"Focusable content should have tabindex='-1' or be removed from the DOM\"}}},\"no-implicit-explicit-label\":{impact:\"moderate\",messages:{pass:function(e){return\"There is no mismatch between a <label> and accessible name\"},incomplete:function(e){return\"Check that the <label> does not need be part of the ARIA \"+e.data+\" field's name\"}}},\"aria-required-attr\":{impact:\"critical\",messages:{pass:function(e){return\"All required ARIA attributes are present\"},fail:function(e){var t=\"Required ARIA attribute\"+(e.data&&1<e.data.length?\"s\":\"\")+\" not present:\",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t}}},\"aria-required-children\":{impact:\"critical\",messages:{pass:function(e){return\"Required ARIA children are present\"},fail:function(e){var t=\"Required ARIA \"+(e.data&&1<e.data.length?\"children\":\"child\")+\" role not present:\",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t},incomplete:function(e){var t=\"Expecting ARIA \"+(e.data&&1<e.data.length?\"children\":\"child\")+\" role to be added:\",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t}}},\"aria-required-parent\":{impact:\"critical\",messages:{pass:function(e){return\"Required ARIA parent role present\"},fail:function(e){var t=\"Required ARIA parent\"+(e.data&&1<e.data.length?\"s\":\"\")+\" role not present:\",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t}}},invalidrole:{impact:\"critical\",messages:{pass:function(e){return\"ARIA role is valid\"},fail:function(e){return\"Role must be one of the valid ARIA roles\"}}},abstractrole:{impact:\"serious\",messages:{pass:function(e){return\"Abstract roles are not used\"},fail:function(e){return\"Abstract roles cannot be directly used\"}}},unsupportedrole:{impact:\"critical\",messages:{pass:function(e){return\"ARIA role is supported\"},fail:function(e){var t=\"The role used is not widely supported in screen readers and assistive technologies: \",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t}}},\"has-visible-text\":{impact:\"minor\",messages:{pass:function(e){return\"Element has text that is visible to screen readers\"},fail:function(e){return\"Element does not have text that is visible to screen readers\"}}},\"aria-valid-attr-value\":{impact:\"critical\",messages:{pass:function(e){return\"ARIA attribute values are valid\"},fail:function(e){var t=\"Invalid ARIA attribute value\"+(e.data&&1<e.data.length?\"s\":\"\")+\":\",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t}}},\"aria-errormessage\":{impact:\"critical\",messages:{pass:function(e){return\"Uses a supported aria-errormessage technique\"},fail:function(e){var t=\"aria-errormessage value\"+(e.data&&1<e.data.length?\"s\":\"\")+\" \",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" `\"+n[r+=1];return t+=\"` must use a technique to announce the message (e.g., aria-live, aria-describedby, role=alert, etc.)\"}}},\"aria-valid-attr\":{impact:\"critical\",messages:{pass:function(e){return\"ARIA attribute name\"+(e.data&&1<e.data.length?\"s\":\"\")+\" are valid\"},fail:function(e){var t=\"Invalid ARIA attribute name\"+(e.data&&1<e.data.length?\"s\":\"\")+\":\",n=e.data;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\" \"+n[r+=1];return t}}},caption:{impact:\"critical\",messages:{pass:function(e){return\"The multimedia element has a captions track\"},incomplete:function(e){return\"Check that captions is available for the element\"}}},\"autocomplete-valid\":{impact:\"serious\",messages:{pass:function(e){return\"the autocomplete attribute is correctly formatted\"},fail:function(e){return\"the autocomplete attribute is incorrectly formatted\"}}},\"autocomplete-appropriate\":{impact:\"serious\",messages:{pass:function(e){return\"the autocomplete value is on an appropriate element\"},fail:function(e){return\"the autocomplete value is inappropriate for this type of input\"}}},\"avoid-inline-spacing\":{impact:\"serious\",messages:{pass:function(e){return\"No inline styles with '!important' that affect text spacing has been specified\"},fail:function(e){return\"Remove '!important' from inline style\"+(e.data&&1<e.data.length?\"s\":\"\")+\" \"+e.data.join(\", \")+\", as overriding this is not supported by most browsers\"}}},\"is-on-screen\":{impact:\"serious\",messages:{pass:function(e){return\"Element is not visible\"},fail:function(e){return\"Element is visible\"}}},\"button-has-visible-text\":{impact:\"critical\",messages:{pass:function(e){return\"Element has inner text that is visible to screen readers\"},fail:function(e){return\"Element does not have inner text that is visible to screen readers\"}}},\"role-presentation\":{impact:\"minor\",messages:{pass:function(e){return'Element\\'s default semantics were overriden with role=\"presentation\"'},fail:function(e){return'Element\\'s default semantics were not overridden with role=\"presentation\"'}}},\"role-none\":{impact:\"minor\",messages:{pass:function(e){return'Element\\'s default semantics were overriden with role=\"none\"'},fail:function(e){return'Element\\'s default semantics were not overridden with role=\"none\"'}}},\"internal-link-present\":{impact:\"serious\",messages:{pass:function(e){return\"Valid skip link found\"},fail:function(e){return\"No valid skip link found\"}}},\"header-present\":{impact:\"serious\",messages:{pass:function(e){return\"Page has a header\"},fail:function(e){return\"Page does not have a header\"}}},landmark:{impact:\"serious\",messages:{pass:function(e){return\"Page has a landmark region\"},fail:function(e){return\"Page does not have a landmark region\"}}},\"group-labelledby\":{impact:\"critical\",messages:{pass:function(e){return'Elements with the name \"'+e.data.name+'\" have both a shared label, and a unique label, referenced through aria-labelledby'},fail:function(e){var t=\"\",n=e.data&&e.data.failureCode;return t+='Elements with the name \"'+e.data.name+'\" do not all have ',t+=\"no-shared-label\"===n?\"a shared label\":\"no-unique-label\"===n?\"a unique label\":\"both a shared label, and a unique label\",t+=\", referenced through aria-labelledby\"}}},fieldset:{impact:\"critical\",messages:{pass:function(e){return\"Element is contained in a fieldset\"},fail:function(e){var t=\"\",n=e.data&&e.data.failureCode;return t+=\"no-legend\"===n?\"Fieldset does not have a legend as its first child\":\"empty-legend\"===n?\"Legend does not have text that is visible to screen readers\":\"mixed-inputs\"===n?\"Fieldset contains unrelated inputs\":\"no-group-label\"===n?\"ARIA group does not have aria-label or aria-labelledby\":\"group-mixed-inputs\"===n?\"ARIA group contains unrelated inputs\":\"Element does not have a containing fieldset or ARIA group\"}}},\"color-contrast\":{impact:\"serious\",messages:{pass:function(e){return\"Element has sufficient color contrast of \"+e.data.contrastRatio},fail:function(e){return\"Element has insufficient color contrast of \"+e.data.contrastRatio+\" (foreground color: \"+e.data.fgColor+\", background color: \"+e.data.bgColor+\", font size: \"+e.data.fontSize+\", font weight: \"+e.data.fontWeight+\"). Expected contrast ratio of \"+e.data.expectedContrastRatio},incomplete:{bgImage:\"Element's background color could not be determined due to a background image\",bgGradient:\"Element's background color could not be determined due to a background gradient\",imgNode:\"Element's background color could not be determined because element contains an image node\",bgOverlap:\"Element's background color could not be determined because it is overlapped by another element\",fgAlpha:\"Element's foreground color could not be determined because of alpha transparency\",elmPartiallyObscured:\"Element's background color could not be determined because it's partially obscured by another element\",elmPartiallyObscuring:\"Element's background color could not be determined because it partially overlaps other elements\",outsideViewport:\"Element's background color could not be determined because it's outside the viewport\",equalRatio:\"Element has a 1:1 contrast ratio with the background\",shortTextContent:\"Element content is too short to determine if it is actual text content\",default:\"Unable to determine contrast ratio\"}}},\"css-orientation-lock\":{impact:\"serious\",messages:{pass:function(e){return\"Display is operable, and orientation lock does not exist\"},fail:function(e){return\"CSS Orientation lock is applied, and makes display inoperable\"},incomplete:function(e){return\"CSS Orientation lock cannot be determined\"}}},\"structured-dlitems\":{impact:\"serious\",messages:{pass:function(e){return\"When not empty, element has both <dt> and <dd> elements\"},fail:function(e){return\"When not empty, element does not have at least one <dt> element followed by at least one <dd> element\"}}},\"only-dlitems\":{impact:\"serious\",messages:{pass:function(e){return\"List element only has direct children that are allowed inside <dt> or <dd> elements\"},fail:function(e){return\"List element has direct children that are not allowed inside <dt> or <dd> elements\"}}},dlitem:{impact:\"serious\",messages:{pass:function(e){return\"Description list item has a <dl> parent element\"},fail:function(e){return\"Description list item does not have a <dl> parent element\"}}},\"doc-has-title\":{impact:\"serious\",messages:{pass:function(e){return\"Document has a non-empty <title> element\"},fail:function(e){return\"Document does not have a non-empty <title> element\"}}},\"duplicate-id-active\":{impact:\"serious\",messages:{pass:function(e){return\"Document has no active elements that share the same id attribute\"},fail:function(e){return\"Document has active elements with the same id attribute: \"+e.data}}},\"duplicate-id-aria\":{impact:\"critical\",messages:{pass:function(e){return\"Document has no elements referenced with ARIA or labels that share the same id attribute\"},fail:function(e){return\"Document has multiple elements referenced with ARIA with the same id attribute: \"+e.data}}},\"duplicate-id\":{impact:\"minor\",messages:{pass:function(e){return\"Document has no static elements that share the same id attribute\"},fail:function(e){return\"Document has multiple static elements with the same id attribute\"}}},\"has-widget-role\":{impact:\"minor\",messages:{pass:function(e){return\"Element has a widget role.\"},fail:function(e){return\"Element does not have a widget role.\"}}},\"valid-scrollable-semantics\":{impact:\"minor\",messages:{pass:function(e){return\"Element has valid semantics for an element in the focus order.\"},fail:function(e){return\"Element has invalid semantics for an element in the focus order.\"}}},\"multiple-label\":{impact:\"moderate\",messages:{pass:function(e){return\"Form field does not have multiple label elements\"},fail:function(e){return\"Multiple label elements is not widely supported in assistive technologies\"}}},\"frame-tested\":{impact:\"critical\",messages:{pass:function(e){return\"The iframe was tested with axe-core\"},fail:function(e){return\"The iframe could not be tested with axe-core\"},incomplete:function(e){return\"The iframe still has to be tested with axe-core\"}}},\"unique-frame-title\":{impact:\"serious\",messages:{pass:function(e){return\"Element's title attribute is unique\"},fail:function(e){return\"Element's title attribute is not unique\"}}},\"heading-order\":{impact:\"moderate\",messages:{pass:function(e){return\"Heading order valid\"},fail:function(e){return\"Heading order invalid\"}}},\"hidden-content\":{impact:\"minor\",messages:{pass:function(e){return\"All content on the page has been analyzed.\"},fail:function(e){return\"There were problems analyzing the content on this page.\"},incomplete:function(e){return\"There is hidden content on the page that was not analyzed. You will need to trigger the display of this content in order to analyze it.\"}}},\"has-lang\":{impact:\"serious\",messages:{pass:function(e){return\"The <html> element has a lang attribute\"},fail:function(e){return\"The <html> element does not have a lang attribute\"}}},\"valid-lang\":{impact:\"serious\",messages:{pass:function(e){return\"Value of lang attribute is included in the list of valid languages\"},fail:function(e){return\"Value of lang attribute not included in the list of valid languages\"}}},\"xml-lang-mismatch\":{impact:\"moderate\",messages:{pass:function(e){return\"Lang and xml:lang attributes have the same base language\"},fail:function(e){return\"Lang and xml:lang attributes do not have the same base language\"}}},\"has-alt\":{impact:\"critical\",messages:{pass:function(e){return\"Element has an alt attribute\"},fail:function(e){return\"Element does not have an alt attribute\"}}},\"alt-space-value\":{impact:\"critical\",messages:{pass:function(e){return\"Element has a valid alt attribute value\"},fail:function(e){return\"Element has an alt attribute containing only a space character, which is not ignored by all screen readers\"}}},\"duplicate-img-label\":{impact:\"minor\",messages:{pass:function(e){return\"Element does not duplicate existing text in <img> alt text\"},fail:function(e){return\"Element contains <img> element with alt text that duplicates existing text\"}}},\"non-empty-if-present\":{impact:\"critical\",messages:{pass:function(e){var t=\"Element \";return e.data?t+=\"has a non-empty value attribute\":t+=\"does not have a value attribute\",t},fail:function(e){return\"Element has a value attribute and the value attribute is empty\"}}},\"non-empty-value\":{impact:\"critical\",messages:{pass:function(e){return\"Element has a non-empty value attribute\"},fail:function(e){return\"Element has no value attribute or the value attribute is empty\"}}},\"label-content-name-mismatch\":{impact:\"serious\",messages:{pass:function(e){return\"Element contains visible text as part of it's accessible name\"},fail:function(e){return\"Text inside the element is not included in the accessible name\"}}},\"title-only\":{impact:\"serious\",messages:{pass:function(e){return\"Form element does not solely use title attribute for its label\"},fail:function(e){return\"Only title used to generate label for form element\"}}},\"implicit-label\":{impact:\"critical\",messages:{pass:function(e){return\"Form element has an implicit (wrapped) <label>\"},fail:function(e){return\"Form element does not have an implicit (wrapped) <label>\"}}},\"explicit-label\":{impact:\"critical\",messages:{pass:function(e){return\"Form element has an explicit <label>\"},fail:function(e){return\"Form element does not have an explicit <label>\"}}},\"help-same-as-label\":{impact:\"minor\",messages:{pass:function(e){return\"Help text (title or aria-describedby) does not duplicate label text\"},fail:function(e){return\"Help text (title or aria-describedby) text is the same as the label text\"}}},\"hidden-explicit-label\":{impact:\"critical\",messages:{pass:function(e){return\"Form element has a visible explicit <label>\"},fail:function(e){return\"Form element has explicit <label> that is hidden\"}}},\"landmark-is-top-level\":{impact:\"moderate\",messages:{pass:function(e){return\"The \"+e.data.role+\" landmark is at the top level.\"},fail:function(e){return\"The \"+e.data.role+\" landmark is contained in another landmark.\"}}},\"page-no-duplicate-banner\":{impact:\"moderate\",messages:{pass:function(e){return\"Document does not have more than one banner landmark\"},fail:function(e){return\"Document has more than one banner landmark\"}}},\"page-no-duplicate-contentinfo\":{impact:\"moderate\",messages:{pass:function(e){return\"Document does not have more than one contentinfo landmark\"},fail:function(e){return\"Document has more than one contentinfo landmark\"}}},\"page-has-main\":{impact:\"moderate\",messages:{pass:function(e){return\"Document has at least one main landmark\"},fail:function(e){return\"Document does not have a main landmark\"}}},\"page-no-duplicate-main\":{impact:\"moderate\",messages:{pass:function(e){return\"Document does not have more than one main landmark\"},fail:function(e){return\"Document has more than one main landmark\"}}},\"landmark-is-unique\":{impact:\"moderate\",messages:{pass:function(e){return\"Landmarks must have a unique role or role/label/title (i.e. accessible name) combination\"},fail:function(e){return\"The landmark must have a unique aria-label, aria-labelledby, or title to make landmarks distinguishable\"}}},\"has-th\":{impact:\"serious\",messages:{pass:function(e){return\"Layout table does not use <th> elements\"},fail:function(e){return\"Layout table uses <th> elements\"}}},\"has-caption\":{impact:\"serious\",messages:{pass:function(e){return\"Layout table does not use <caption> element\"},fail:function(e){return\"Layout table uses <caption> element\"}}},\"has-summary\":{impact:\"serious\",messages:{pass:function(e){return\"Layout table does not use summary attribute\"},fail:function(e){return\"Layout table uses summary attribute\"}}},\"link-in-text-block\":{impact:\"serious\",messages:{pass:function(e){return\"Links can be distinguished from surrounding text in some way other than by color\"},fail:function(e){return\"Links need to be distinguished from surrounding text in some way other than by color\"},incomplete:{bgContrast:\"Element's contrast ratio could not be determined. Check for a distinct hover/focus style\",bgImage:\"Element's contrast ratio could not be determined due to a background image\",bgGradient:\"Element's contrast ratio could not be determined due to a background gradient\",imgNode:\"Element's contrast ratio could not be determined because element contains an image node\",bgOverlap:\"Element's contrast ratio could not be determined because of element overlap\",default:\"Unable to determine contrast ratio\"}}},\"focusable-no-name\":{impact:\"serious\",messages:{pass:function(e){return\"Element is not in tab order or has accessible text\"},fail:function(e){return\"Element is in tab order and does not have accessible text\"}}},\"only-listitems\":{impact:\"serious\",messages:{pass:function(e){return\"List element only has direct children that are allowed inside <li> elements\"},fail:function(e){return\"List element has direct children that are not allowed inside <li> elements\"}}},listitem:{impact:\"serious\",messages:{pass:function(e){return'List item has a <ul>, <ol> or role=\"list\" parent element'},fail:function(e){return'List item does not have a <ul>, <ol> or role=\"list\" parent element'}}},\"meta-refresh\":{impact:\"critical\",messages:{pass:function(e){return\"<meta> tag does not immediately refresh the page\"},fail:function(e){return\"<meta> tag forces timed refresh of page\"}}},\"meta-viewport-large\":{impact:\"minor\",messages:{pass:function(e){return\"<meta> tag does not prevent significant zooming on mobile devices\"},fail:function(e){return\"<meta> tag limits zooming on mobile devices\"}}},\"meta-viewport\":{impact:\"critical\",messages:{pass:function(e){return\"<meta> tag does not disable zooming on mobile devices\"},fail:function(e){return e.data+\" on <meta> tag disables zooming on mobile devices\"}}},\"p-as-heading\":{impact:\"serious\",messages:{pass:function(e){return\"<p> elements are not styled as headings\"},fail:function(e){return\"Heading elements should be used instead of styled p elements\"}}},\"page-has-heading-one\":{impact:\"moderate\",messages:{pass:function(e){return\"Page has at least one level-one heading\"},fail:function(e){return\"Page must have a level-one heading\"}}},region:{impact:\"moderate\",messages:{pass:function(e){return\"All page content is contained by landmarks\"},fail:function(e){return\"Some page content is not contained by landmarks\"}}},\"html5-scope\":{impact:\"moderate\",messages:{pass:function(e){return\"Scope attribute is only used on table header elements (<th>)\"},fail:function(e){return\"In HTML 5, scope attributes may only be used on table header elements (<th>)\"}}},\"scope-value\":{impact:\"critical\",messages:{pass:function(e){return\"Scope attribute is used correctly\"},fail:function(e){return\"The value of the scope attribute may only be 'row' or 'col'\"}}},\"focusable-content\":{impact:\"moderate\",messages:{pass:function(e){return\"Element contains focusable elements\"},fail:function(e){return\"Element should have focusable content\"}}},\"focusable-element\":{impact:\"moderate\",messages:{pass:function(e){return\"Element is focusable\"},fail:function(e){return\"Element should be focusable\"}}},exists:{impact:\"minor\",messages:{pass:function(e){return\"Element does not exist\"},fail:function(e){return\"Element exists\"}}},\"skip-link\":{impact:\"moderate\",messages:{pass:function(e){return\"Skip link target exists\"},incomplete:function(e){return\"Skip link target should become visible on activation\"},fail:function(e){return\"No skip link target\"}}},tabindex:{impact:\"serious\",messages:{pass:function(e){return\"Element does not have a tabindex greater than 0\"},fail:function(e){return\"Element has a tabindex greater than 0\"}}},\"same-caption-summary\":{impact:\"minor\",messages:{pass:function(e){return\"Content of summary attribute and <caption> are not duplicated\"},fail:function(e){return\"Content of summary attribute and <caption> element are identical\"}}},\"caption-faked\":{impact:\"serious\",messages:{pass:function(e){return\"The first row of a table is not used as a caption\"},fail:function(e){return\"The first row of the table should be a caption instead of a table cell\"}}},\"td-has-header\":{impact:\"critical\",messages:{pass:function(e){return\"All non-empty data cells have table headers\"},fail:function(e){return\"Some non-empty data cells do not have table headers\"}}},\"td-headers-attr\":{impact:\"serious\",messages:{pass:function(e){return\"The headers attribute is exclusively used to refer to other cells in the table\"},fail:function(e){return\"The headers attribute is not exclusively used to refer to other cells in the table\"}}},\"th-has-data-cells\":{impact:\"serious\",messages:{pass:function(e){return\"All table header cells refer to data cells\"},fail:function(e){return\"Not all table header cells refer to data cells\"},incomplete:function(e){return\"Table data cells are missing or empty\"}}},description:{impact:\"critical\",messages:{pass:function(e){return\"The multimedia element has an audio description track\"},incomplete:function(e){return\"Check that audio description is available for the element\"}}}},failureSummaries:{any:{failureMessage:function(e){var t=\"Fix any of the following:\",n=e;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\"\\n  \"+n[r+=1].split(\"\\n\").join(\"\\n  \");return t}},none:{failureMessage:function(e){var t=\"Fix all of the following:\",n=e;if(n)for(var r=-1,a=n.length-1;r<a;)t+=\"\\n  \"+n[r+=1].split(\"\\n\").join(\"\\n  \");return t}}},incompleteFallbackMessage:function(e){return\"axe couldn't tell the reason. Time to break out the element inspector!\"}},rules:[{id:\"accesskeys\",selector:\"[accesskey]\",excludeHidden:!1,tags:[\"best-practice\",\"cat.keyboard\"],all:[],any:[],none:[\"accesskeys\"]},{id:\"area-alt\",selector:\"map area[href]\",excludeHidden:!1,tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"non-empty-alt\",\"non-empty-title\",\"aria-label\",\"aria-labelledby\"],none:[]},{id:\"aria-allowed-attr\",matches:function(e,t,n){var r=/^aria-/;if(e.hasAttributes())for(var a=axe.utils.getNodeAttributes(e),o=0,i=a.length;o<i;o++)if(r.test(a[o].name))return!0;return!1},tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[\"aria-allowed-attr\"],none:[\"aria-unsupported-attr\"]},{id:\"aria-allowed-role\",excludeHidden:!1,selector:\"[role]\",matches:function(e,t,n){return null!==axe.commons.aria.getRole(e,{noImplicit:!0,dpub:!0,fallback:!0})},tags:[\"cat.aria\",\"best-practice\"],all:[],any:[{options:{allowImplicit:!0,ignoredTags:[]},id:\"aria-allowed-role\"}],none:[]},{id:\"aria-dpub-role-fallback\",selector:\"[role]\",matches:function(e,t,n){var r=e.getAttribute(\"role\");return[\"doc-backlink\",\"doc-biblioentry\",\"doc-biblioref\",\"doc-cover\",\"doc-endnote\",\"doc-glossref\",\"doc-noteref\"].includes(r)},tags:[\"cat.aria\",\"wcag2a\",\"wcag131\"],all:[\"implicit-role-fallback\"],any:[],none:[]},{id:\"aria-hidden-body\",selector:\"body\",excludeHidden:!1,tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[\"aria-hidden-body\"],none:[]},{id:\"aria-hidden-focus\",selector:'[aria-hidden=\"true\"]',matches:function(e,t,n){var r=axe.commons.dom.getComposedParent;return function e(t){return!t||\"true\"!==t.getAttribute(\"aria-hidden\")&&e(r(t))}(r(e))},excludeHidden:!1,tags:[\"cat.name-role-value\",\"wcag2a\",\"wcag412\",\"wcag131\"],all:[\"focusable-disabled\",\"focusable-not-tabbable\"],any:[],none:[]},{id:\"aria-input-field-name\",selector:'[role=\"combobox\"], [role=\"listbox\"], [role=\"searchbox\"], [role=\"slider\"], [role=\"spinbutton\"], [role=\"textbox\"]',matches:function(e,t,n){var r=axe.commons.aria,a=e.nodeName.toUpperCase(),o=r.getRole(e,{noImplicit:!0});return(\"AREA\"!==a||!e.getAttribute(\"href\"))&&(![\"INPUT\",\"SELECT\",\"TEXTAREA\"].includes(a)&&(\"IMG\"!==a&&(\"img\"!==o||\"SVG\"===a)&&(\"BUTTON\"!==a&&\"button\"!==o)))},tags:[\"wcag2a\",\"wcag412\"],all:[],any:[\"aria-label\",\"aria-labelledby\",\"non-empty-title\"],none:[\"no-implicit-explicit-label\"]},{id:\"aria-required-attr\",selector:\"[role]\",tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[\"aria-required-attr\"],none:[]},{id:\"aria-required-children\",selector:\"[role]\",tags:[\"cat.aria\",\"wcag2a\",\"wcag131\"],all:[],any:[{options:{reviewEmpty:[\"doc-bibliography\",\"doc-endnotes\",\"grid\",\"list\",\"listbox\",\"table\",\"tablist\",\"tree\",\"treegrid\",\"rowgroup\"]},id:\"aria-required-children\"}],none:[]},{id:\"aria-required-parent\",selector:\"[role]\",tags:[\"cat.aria\",\"wcag2a\",\"wcag131\"],all:[],any:[\"aria-required-parent\"],none:[]},{id:\"aria-roles\",selector:\"[role]\",tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[],none:[\"invalidrole\",\"abstractrole\",\"unsupportedrole\"]},{id:\"aria-toggle-field-name\",selector:'[role=\"checkbox\"], [role=\"menuitemcheckbox\"], [role=\"menuitemradio\"], [role=\"radio\"], [role=\"switch\"]',matches:function(e,t,n){var r=axe.commons.aria,a=e.nodeName.toUpperCase(),o=r.getRole(e,{noImplicit:!0});return(\"AREA\"!==a||!e.getAttribute(\"href\"))&&(![\"INPUT\",\"SELECT\",\"TEXTAREA\"].includes(a)&&(\"IMG\"!==a&&(\"img\"!==o||\"SVG\"===a)&&(\"BUTTON\"!==a&&\"button\"!==o)))},tags:[\"wcag2a\",\"wcag412\"],all:[],any:[\"aria-label\",\"aria-labelledby\",\"non-empty-title\",\"has-visible-text\"],none:[\"no-implicit-explicit-label\"]},{id:\"aria-valid-attr-value\",matches:function(e,t,n){var r=/^aria-/;if(e.hasAttributes())for(var a=axe.utils.getNodeAttributes(e),o=0,i=a.length;o<i;o++)if(r.test(a[o].name))return!0;return!1},tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[{options:[],id:\"aria-valid-attr-value\"},\"aria-errormessage\"],any:[],none:[]},{id:\"aria-valid-attr\",matches:function(e,t,n){var r=/^aria-/;if(e.hasAttributes())for(var a=axe.utils.getNodeAttributes(e),o=0,i=a.length;o<i;o++)if(r.test(a[o].name))return!0;return!1},tags:[\"cat.aria\",\"wcag2a\",\"wcag412\"],all:[],any:[{options:[],id:\"aria-valid-attr\"}],none:[]},{id:\"audio-caption\",selector:\"audio\",enabled:!1,excludeHidden:!1,tags:[\"cat.time-and-media\",\"wcag2a\",\"wcag121\",\"section508\",\"section508.22.a\"],all:[],any:[],none:[\"caption\"]},{id:\"autocomplete-valid\",matches:function(e,t,n){var r=axe.commons,a=r.text,o=r.aria,i=r.dom,u=t.attr(\"autocomplete\");if(!u||\"\"===a.sanitize(u))return!1;var s=t.props.nodeName;if(!1===[\"textarea\",\"input\",\"select\"].includes(s))return!1;if(\"input\"===s&&[\"submit\",\"reset\",\"button\",\"hidden\"].includes(t.props.type))return!1;var l=t.attr(\"aria-disabled\")||\"false\";if(t.hasAttr(\"disabled\")||\"true\"===l.toLowerCase())return!1;var c=t.attr(\"role\"),d=t.attr(\"tabindex\");if(\"-1\"===d&&c){var m=o.lookupTable.role[c];if(void 0===m||\"widget\"!==m.type)return!1}return!(\"-1\"===d&&t.actualNode&&!i.isVisible(t.actualNode,!1)&&!i.isVisible(t.actualNode,!0))},tags:[\"cat.forms\",\"wcag21aa\",\"wcag135\"],all:[\"autocomplete-valid\",\"autocomplete-appropriate\"],any:[],none:[]},{id:\"avoid-inline-spacing\",selector:\"[style]\",tags:[\"wcag21\",\"wcag1412\"],all:[\"avoid-inline-spacing\"],any:[],none:[]},{id:\"blink\",selector:\"blink\",excludeHidden:!1,tags:[\"cat.time-and-media\",\"wcag2a\",\"wcag222\",\"section508\",\"section508.22.j\"],all:[],any:[],none:[\"is-on-screen\"]},{id:\"button-name\",selector:'button, [role=\"button\"]',tags:[\"cat.name-role-value\",\"wcag2a\",\"wcag412\",\"section508\",\"section508.22.a\"],all:[],any:[\"button-has-visible-text\",\"aria-label\",\"aria-labelledby\",\"role-presentation\",\"role-none\",\"non-empty-title\"],none:[]},{id:\"bypass\",selector:\"html\",pageLevel:!0,matches:function(e,t,n){return!!e.querySelector(\"a[href]\")},tags:[\"cat.keyboard\",\"wcag2a\",\"wcag241\",\"section508\",\"section508.22.o\"],all:[],any:[\"internal-link-present\",\"header-present\",\"landmark\"],none:[]},{id:\"checkboxgroup\",selector:\"input[type=checkbox][name]\",tags:[\"cat.forms\",\"best-practice\"],all:[],any:[\"group-labelledby\",\"fieldset\"],none:[]},{id:\"color-contrast\",matches:function(e,t,n){var r=e.nodeName.toUpperCase(),a=e.type;if(\"true\"===e.getAttribute(\"aria-disabled\")||axe.commons.dom.findUpVirtual(t,'[aria-disabled=\"true\"]'))return!1;if(\"INPUT\"===r)return-1===[\"hidden\",\"range\",\"color\",\"checkbox\",\"radio\",\"image\"].indexOf(a)&&!e.disabled;if(\"SELECT\"===r)return!!e.options.length&&!e.disabled;if(\"TEXTAREA\"===r)return!e.disabled;if(\"OPTION\"===r)return!1;if(\"BUTTON\"===r&&e.disabled||axe.commons.dom.findUpVirtual(t,\"button[disabled]\"))return!1;if(\"FIELDSET\"===r&&e.disabled||axe.commons.dom.findUpVirtual(t,\"fieldset[disabled]\"))return!1;var o=axe.commons.dom.findUpVirtual(t,\"label\");if(\"LABEL\"===r||o){var i=e,u=t;o&&(i=o,u=axe.utils.getNodeFromTree(o));var s=axe.commons.dom.getRootNode(i);if((l=i.htmlFor&&s.getElementById(i.htmlFor))&&l.disabled)return!1;if((l=axe.utils.querySelectorAll(u,'input:not([type=\"hidden\"]):not([type=\"image\"]):not([type=\"button\"]):not([type=\"submit\"]):not([type=\"reset\"]), select, textarea')).length&&l[0].actualNode.disabled)return!1}if(e.getAttribute(\"id\")){var l,c=axe.utils.escapeSelector(e.getAttribute(\"id\"));if((l=axe.commons.dom.getRootNode(e).querySelector(\"[aria-labelledby~=\"+c+\"]\"))&&l.disabled)return!1}if(\"\"===axe.commons.text.visibleVirtual(t,!1,!0))return!1;var d,m,p=document.createRange(),f=t.children,h=f.length;for(m=0;m<h;m++)3===(d=f[m]).actualNode.nodeType&&\"\"!==axe.commons.text.sanitize(d.actualNode.nodeValue)&&p.selectNodeContents(d.actualNode);var b=p.getClientRects();for(h=b.length,m=0;m<h;m++)if(axe.commons.dom.visuallyOverlaps(b[m],e))return!0;return!1},excludeHidden:!1,options:{noScroll:!1},tags:[\"cat.color\",\"wcag2aa\",\"wcag143\"],all:[],any:[\"color-contrast\"],none:[]},{id:\"css-orientation-lock\",selector:\"html\",tags:[\"cat.structure\",\"wcag134\",\"wcag21aa\",\"experimental\"],all:[\"css-orientation-lock\"],any:[],none:[],preload:!0},{id:\"definition-list\",selector:\"dl\",matches:function(e,t,n){return!e.getAttribute(\"role\")},tags:[\"cat.structure\",\"wcag2a\",\"wcag131\"],all:[],any:[],none:[\"structured-dlitems\",\"only-dlitems\"]},{id:\"dlitem\",selector:\"dd, dt\",matches:function(e,t,n){return!e.getAttribute(\"role\")},tags:[\"cat.structure\",\"wcag2a\",\"wcag131\"],all:[],any:[\"dlitem\"],none:[]},{id:\"document-title\",selector:\"html\",matches:function(e,t,n){return e.ownerDocument.defaultView.self===e.ownerDocument.defaultView.top},tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag242\"],all:[],any:[\"doc-has-title\"],none:[]},{id:\"duplicate-id-active\",selector:\"[id]\",matches:function(e,t,n){var r=axe.commons,a=r.dom,o=r.aria,i=e.getAttribute(\"id\").trim(),u='*[id=\"'.concat(axe.utils.escapeSelector(i),'\"]');return Array.from(a.getRootNode(e).querySelectorAll(u)).some(a.isFocusable)&&!o.isAccessibleRef(e)},excludeHidden:!1,tags:[\"cat.parsing\",\"wcag2a\",\"wcag411\"],all:[],any:[\"duplicate-id-active\"],none:[]},{id:\"duplicate-id-aria\",selector:\"[id]\",matches:function(e,t,n){return axe.commons.aria.isAccessibleRef(e)},excludeHidden:!1,tags:[\"cat.parsing\",\"wcag2a\",\"wcag411\"],all:[],any:[\"duplicate-id-aria\"],none:[]},{id:\"duplicate-id\",selector:\"[id]\",matches:function(e,t,n){var r=axe.commons,a=r.dom,o=r.aria,i=e.getAttribute(\"id\").trim(),u='*[id=\"'.concat(axe.utils.escapeSelector(i),'\"]');return Array.from(a.getRootNode(e).querySelectorAll(u)).every(function(e){return!a.isFocusable(e)})&&!o.isAccessibleRef(e)},excludeHidden:!1,tags:[\"cat.parsing\",\"wcag2a\",\"wcag411\"],all:[],any:[\"duplicate-id\"],none:[]},{id:\"empty-heading\",selector:'h1, h2, h3, h4, h5, h6, [role=\"heading\"]',matches:function(e,t,n){var r;return e.hasAttribute(\"role\")&&(r=e.getAttribute(\"role\").split(/\\s+/i).filter(axe.commons.aria.isValidRole)),r&&0<r.length?r.includes(\"heading\"):\"heading\"===axe.commons.aria.implicitRole(e)},tags:[\"cat.name-role-value\",\"best-practice\"],all:[],any:[\"has-visible-text\"],none:[]},{id:\"focus-order-semantics\",selector:\"div, h1, h2, h3, h4, h5, h6, [role=heading], p, span\",matches:function(e,t,n){return axe.commons.dom.insertedIntoFocusOrder(e)},tags:[\"cat.keyboard\",\"best-practice\",\"experimental\"],all:[],any:[{options:[],id:\"has-widget-role\"},{options:[],id:\"valid-scrollable-semantics\"}],none:[]},{id:\"form-field-multiple-labels\",selector:\"input, select, textarea\",matches:function(e,t,n){if(\"input\"!==e.nodeName.toLowerCase()||!1===e.hasAttribute(\"type\"))return!0;var r=e.getAttribute(\"type\").toLowerCase();return!1===[\"hidden\",\"image\",\"button\",\"submit\",\"reset\"].includes(r)},tags:[\"cat.forms\",\"wcag2a\",\"wcag332\"],all:[],any:[],none:[\"multiple-label\"]},{id:\"frame-tested\",selector:\"frame, iframe\",tags:[\"cat.structure\",\"review-item\",\"best-practice\"],all:[{options:{isViolation:!1},id:\"frame-tested\"}],any:[],none:[]},{id:\"frame-title-unique\",selector:\"frame[title], iframe[title]\",matches:function(e,t,n){var r=e.getAttribute(\"title\");return!(!r||!axe.commons.text.sanitize(r).trim())},tags:[\"cat.text-alternatives\",\"best-practice\"],all:[],any:[],none:[\"unique-frame-title\"]},{id:\"frame-title\",selector:\"frame, iframe\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag241\",\"wcag412\",\"section508\",\"section508.22.i\"],all:[],any:[\"aria-label\",\"aria-labelledby\",\"non-empty-title\",\"role-presentation\",\"role-none\"],none:[]},{id:\"heading-order\",selector:\"h1, h2, h3, h4, h5, h6, [role=heading]\",matches:function(e,t,n){var r;return e.hasAttribute(\"role\")&&(r=e.getAttribute(\"role\").split(/\\s+/i).filter(axe.commons.aria.isValidRole)),r&&0<r.length?r.includes(\"heading\"):\"heading\"===axe.commons.aria.implicitRole(e)},tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[\"heading-order\"],none:[]},{id:\"hidden-content\",selector:\"*\",excludeHidden:!1,tags:[\"cat.structure\",\"experimental\",\"review-item\",\"best-practice\"],all:[],any:[\"hidden-content\"],none:[]},{id:\"html-has-lang\",selector:\"html\",matches:function(e,t,n){return e.ownerDocument.defaultView.self===e.ownerDocument.defaultView.top},tags:[\"cat.language\",\"wcag2a\",\"wcag311\"],all:[],any:[\"has-lang\"],none:[]},{id:\"html-lang-valid\",selector:\"html[lang], html[xml\\\\:lang]\",tags:[\"cat.language\",\"wcag2a\",\"wcag311\"],all:[],any:[],none:[\"valid-lang\"]},{id:\"html-xml-lang-mismatch\",selector:\"html[lang][xml\\\\:lang]\",matches:function(e,t,n){var r=axe.utils.getBaseLang,a=r(e.getAttribute(\"lang\")),o=r(e.getAttribute(\"xml:lang\"));return axe.utils.validLangs().includes(a)&&axe.utils.validLangs().includes(o)},tags:[\"cat.language\",\"wcag2a\",\"wcag311\"],all:[\"xml-lang-mismatch\"],any:[],none:[]},{id:\"image-alt\",selector:\"img\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"has-alt\",\"aria-label\",\"aria-labelledby\",\"non-empty-title\",\"role-presentation\",\"role-none\"],none:[\"alt-space-value\"]},{id:\"image-redundant-alt\",selector:\"img\",tags:[\"cat.text-alternatives\",\"best-practice\"],all:[],any:[],none:[\"duplicate-img-label\"]},{id:\"input-button-name\",selector:'input[type=\"button\"], input[type=\"submit\"], input[type=\"reset\"]',tags:[\"cat.name-role-value\",\"wcag2a\",\"wcag412\",\"section508\",\"section508.22.a\"],all:[],any:[\"non-empty-if-present\",\"non-empty-value\",\"aria-label\",\"aria-labelledby\",\"role-presentation\",\"role-none\",\"non-empty-title\"],none:[]},{id:\"input-image-alt\",selector:'input[type=\"image\"]',tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"non-empty-alt\",\"aria-label\",\"aria-labelledby\",\"non-empty-title\"],none:[]},{id:\"label-content-name-mismatch\",matches:function(e,t,n){var r=axe.commons,a=r.aria,o=r.text,i=a.getRole(e);return!!i&&(!!a.lookupTable.rolesOfType.widget.includes(i)&&(!!a.getRolesWithNameFromContents().includes(i)&&(!(!o.sanitize(a.arialabelText(e))&&!o.sanitize(a.arialabelledbyText(e)))&&!!o.sanitize(o.visibleVirtual(t)))))},tags:[\"wcag21a\",\"wcag253\",\"experimental\"],all:[],any:[\"label-content-name-mismatch\"],none:[]},{id:\"label-title-only\",selector:\"input, select, textarea\",matches:function(e,t,n){if(\"input\"!==e.nodeName.toLowerCase()||!1===e.hasAttribute(\"type\"))return!0;var r=e.getAttribute(\"type\").toLowerCase();return!1===[\"hidden\",\"image\",\"button\",\"submit\",\"reset\"].includes(r)},tags:[\"cat.forms\",\"best-practice\"],all:[],any:[],none:[\"title-only\"]},{id:\"label\",selector:\"input, select, textarea\",matches:function(e,t,n){if(\"input\"!==e.nodeName.toLowerCase()||!1===e.hasAttribute(\"type\"))return!0;var r=e.getAttribute(\"type\").toLowerCase();return!1===[\"hidden\",\"image\",\"button\",\"submit\",\"reset\"].includes(r)},tags:[\"cat.forms\",\"wcag2a\",\"wcag332\",\"wcag131\",\"section508\",\"section508.22.n\"],all:[],any:[\"aria-label\",\"aria-labelledby\",\"implicit-label\",\"explicit-label\",\"non-empty-title\"],none:[\"help-same-as-label\",\"hidden-explicit-label\"]},{id:\"landmark-banner-is-top-level\",selector:\"header:not([role]), [role=banner]\",matches:function(e,t,n){return e.hasAttribute(\"role\")||!axe.commons.dom.findUpVirtual(t,\"article, aside, main, nav, section\")},tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[\"landmark-is-top-level\"],none:[]},{id:\"landmark-complementary-is-top-level\",selector:\"aside:not([role]), [role=complementary]\",tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[\"landmark-is-top-level\"],none:[]},{id:\"landmark-contentinfo-is-top-level\",selector:\"footer:not([role]), [role=contentinfo]\",matches:function(e,t,n){return e.hasAttribute(\"role\")||!axe.commons.dom.findUpVirtual(t,\"article, aside, main, nav, section\")},tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[\"landmark-is-top-level\"],none:[]},{id:\"landmark-main-is-top-level\",selector:\"main:not([role]), [role=main]\",tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[\"landmark-is-top-level\"],none:[]},{id:\"landmark-no-duplicate-banner\",selector:\"html\",tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[{options:{selector:\"header:not([role]), [role=banner]\",nativeScopeFilter:\"article, aside, main, nav, section\"},id:\"page-no-duplicate-banner\"}],none:[]},{id:\"landmark-no-duplicate-contentinfo\",selector:\"html\",tags:[\"cat.semantics\",\"best-practice\"],all:[],any:[{options:{selector:\"footer:not([role]), [role=contentinfo]\",nativeScopeFilter:\"article, aside, main, nav, section\"},id:\"page-no-duplicate-contentinfo\"}],none:[]},{id:\"landmark-one-main\",selector:\"html\",tags:[\"cat.semantics\",\"best-practice\"],all:[{options:{selector:\"main:not([role]), [role='main']\"},id:\"page-has-main\"},{options:{selector:\"main:not([role]), [role='main']\"},id:\"page-no-duplicate-main\"}],any:[],none:[]},{id:\"landmark-unique\",selector:\"[role=banner], [role=complementary], [role=contentinfo], [role=main], [role=navigation], [role=region], [role=search], [role=form], form, footer, header, aside, main, nav, section\",tags:[\"cat.semantics\",\"best-practice\"],matches:function(e,t,n){var o=[\"article\",\"aside\",\"main\",\"nav\",\"section\"].join(\",\");return function(e){var t=e.actualNode,n=axe.commons.aria.getRolesByType(\"landmark\"),r=axe.commons.aria.getRole(t);if(!r)return!1;var a=t.nodeName.toUpperCase();return\"HEADER\"===a||\"FOOTER\"===a?function(e){return!axe.commons.dom.findUpVirtual(e,o)}(e):\"SECTION\"!==a&&\"FORM\"!==a?0<=n.indexOf(r)||\"region\"===r:!!axe.commons.text.accessibleTextVirtual(e)}(t)&&axe.commons.dom.isVisible(e,!0)},all:[],any:[\"landmark-is-unique\"],none:[]},{id:\"layout-table\",selector:\"table\",matches:function(e,t,n){var r=(e.getAttribute(\"role\")||\"\").toLowerCase();return!((\"presentation\"===r||\"none\"===r)&&!axe.commons.dom.isFocusable(e)||axe.commons.table.isDataTable(e))},tags:[\"cat.semantics\",\"wcag2a\",\"wcag131\"],all:[],any:[],none:[\"has-th\",\"has-caption\",\"has-summary\"]},{id:\"link-in-text-block\",selector:\"a[href], [role=link]\",matches:function(e,t,n){var r=axe.commons.text.sanitize(e.textContent),a=e.getAttribute(\"role\");return(!a||\"link\"===a)&&(!!r&&(!!axe.commons.dom.isVisible(e,!1)&&axe.commons.dom.isInTextBlock(e)))},excludeHidden:!1,tags:[\"cat.color\",\"experimental\",\"wcag2a\",\"wcag141\"],all:[\"link-in-text-block\"],any:[],none:[]},{id:\"link-name\",selector:\"a[href], [role=link][href]\",matches:function(e,t,n){return\"button\"!==e.getAttribute(\"role\")},tags:[\"cat.name-role-value\",\"wcag2a\",\"wcag412\",\"wcag244\",\"section508\",\"section508.22.a\"],all:[],any:[\"has-visible-text\",\"aria-label\",\"aria-labelledby\",\"role-presentation\",\"role-none\"],none:[\"focusable-no-name\"]},{id:\"list\",selector:\"ul, ol\",matches:function(e,t,n){return!e.getAttribute(\"role\")},tags:[\"cat.structure\",\"wcag2a\",\"wcag131\"],all:[],any:[],none:[\"only-listitems\"]},{id:\"listitem\",selector:\"li\",matches:function(e,t,n){return!e.getAttribute(\"role\")},tags:[\"cat.structure\",\"wcag2a\",\"wcag131\"],all:[],any:[\"listitem\"],none:[]},{id:\"marquee\",selector:\"marquee\",excludeHidden:!1,tags:[\"cat.parsing\",\"wcag2a\",\"wcag222\"],all:[],any:[],none:[\"is-on-screen\"]},{id:\"meta-refresh\",selector:'meta[http-equiv=\"refresh\"]',excludeHidden:!1,tags:[\"cat.time\",\"wcag2a\",\"wcag2aaa\",\"wcag221\",\"wcag224\",\"wcag325\"],all:[],any:[\"meta-refresh\"],none:[]},{id:\"meta-viewport-large\",selector:'meta[name=\"viewport\"]',excludeHidden:!1,tags:[\"cat.sensory-and-visual-cues\",\"best-practice\"],all:[],any:[{options:{scaleMinimum:5,lowerBound:2},id:\"meta-viewport-large\"}],none:[]},{id:\"meta-viewport\",selector:'meta[name=\"viewport\"]',excludeHidden:!1,tags:[\"cat.sensory-and-visual-cues\",\"wcag2aa\",\"wcag144\"],all:[],any:[{options:{scaleMinimum:2},id:\"meta-viewport\"}],none:[]},{id:\"object-alt\",selector:\"object\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"has-visible-text\",\"aria-label\",\"aria-labelledby\",\"non-empty-title\",\"role-presentation\",\"role-none\"],none:[]},{id:\"p-as-heading\",selector:\"p\",matches:function(e,t,n){var r=Array.from(e.parentNode.childNodes),a=e.textContent.trim();return!(0===a.length||2<=(a.match(/[.!?:;](?![.!?:;])/g)||[]).length)&&0!==r.slice(r.indexOf(e)+1).filter(function(e){return\"P\"===e.nodeName.toUpperCase()&&\"\"!==e.textContent.trim()}).length},tags:[\"cat.semantics\",\"wcag2a\",\"wcag131\",\"experimental\"],all:[{options:{margins:[{weight:150,italic:!0},{weight:150,size:1.15},{italic:!0,size:1.15},{size:1.4}]},id:\"p-as-heading\"}],any:[],none:[]},{id:\"page-has-heading-one\",selector:\"html\",tags:[\"cat.semantics\",\"best-practice\"],all:[{options:{selector:'h1:not([role]), [role=\"heading\"][aria-level=\"1\"]'},id:\"page-has-heading-one\"}],any:[],none:[]},{id:\"radiogroup\",selector:\"input[type=radio][name]\",tags:[\"cat.forms\",\"best-practice\"],all:[],any:[\"group-labelledby\",\"fieldset\"],none:[]},{id:\"region\",selector:\"html\",pageLevel:!0,tags:[\"cat.keyboard\",\"best-practice\"],all:[],any:[\"region\"],none:[]},{id:\"role-img-alt\",selector:\"[role='img']:not(svg):not(img):not(area):not(input):not(object)\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag111\",\"section508\",\"section508.22.a\"],all:[],any:[\"aria-label\",\"aria-labelledby\",\"non-empty-title\"],none:[]},{id:\"scope-attr-valid\",selector:\"td[scope], th[scope]\",tags:[\"cat.tables\",\"best-practice\"],all:[\"html5-scope\",\"scope-value\"],any:[],none:[]},{id:\"scrollable-region-focusable\",matches:function(e,t,n){var r=axe.utils.querySelectorAll,a=axe.commons.dom.hasContentVirtual;return!1!=!!axe.utils.getScroll(e,13)&&!!r(t,\"*\").some(function(e){return a(e,!0,!0)})},tags:[\"wcag2a\",\"wcag211\"],all:[],any:[\"focusable-content\",\"focusable-element\"],none:[]},{id:\"server-side-image-map\",selector:\"img[ismap]\",tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag211\",\"section508\",\"section508.22.f\"],all:[],any:[],none:[\"exists\"]},{id:\"skip-link\",selector:'a[href^=\"#\"], a[href^=\"/#\"]',matches:function(e,t,n){return axe.commons.dom.isSkipLink(e)},tags:[\"cat.keyboard\",\"best-practice\"],all:[],any:[\"skip-link\"],none:[]},{id:\"tabindex\",selector:\"[tabindex]\",tags:[\"cat.keyboard\",\"best-practice\"],all:[],any:[\"tabindex\"],none:[]},{id:\"table-duplicate-name\",selector:\"table\",tags:[\"cat.tables\",\"best-practice\"],all:[],any:[],none:[\"same-caption-summary\"]},{id:\"table-fake-caption\",selector:\"table\",matches:function(e,t,n){return axe.commons.table.isDataTable(e)},tags:[\"cat.tables\",\"experimental\",\"wcag2a\",\"wcag131\",\"section508\",\"section508.22.g\"],all:[\"caption-faked\"],any:[],none:[]},{id:\"td-has-header\",selector:\"table\",matches:function(e,t,n){if(axe.commons.table.isDataTable(e)){var r=axe.commons.table.toArray(e);return 3<=r.length&&3<=r[0].length&&3<=r[1].length&&3<=r[2].length}return!1},tags:[\"cat.tables\",\"experimental\",\"wcag2a\",\"wcag131\",\"section508\",\"section508.22.g\"],all:[\"td-has-header\"],any:[],none:[]},{id:\"td-headers-attr\",selector:\"table\",tags:[\"cat.tables\",\"wcag2a\",\"wcag131\",\"section508\",\"section508.22.g\"],all:[\"td-headers-attr\"],any:[],none:[]},{id:\"th-has-data-cells\",selector:\"table\",matches:function(e,t,n){return axe.commons.table.isDataTable(e)},tags:[\"cat.tables\",\"wcag2a\",\"wcag131\",\"section508\",\"section508.22.g\"],all:[\"th-has-data-cells\"],any:[],none:[]},{id:\"valid-lang\",selector:\"[lang], [xml\\\\:lang]\",matches:function(e,t,n){return\"html\"!==e.nodeName.toLowerCase()},tags:[\"cat.language\",\"wcag2aa\",\"wcag312\"],all:[],any:[],none:[\"valid-lang\"]},{id:\"video-caption\",selector:\"video\",excludeHidden:!1,tags:[\"cat.text-alternatives\",\"wcag2a\",\"wcag122\",\"section508\",\"section508.22.a\"],all:[],any:[],none:[\"caption\"]},{id:\"video-description\",selector:\"video\",excludeHidden:!1,tags:[\"cat.text-alternatives\",\"wcag2aa\",\"wcag125\",\"section508\",\"section508.22.b\"],all:[],any:[],none:[\"description\"]}],checks:[{id:\"abstractrole\",evaluate:function(e,t,n,r){return\"abstract\"===axe.commons.aria.getRoleType(e.getAttribute(\"role\"))}},{id:\"aria-allowed-attr\",evaluate:function(e,t,n,r){t=t||{};var a,o,i,u=[],s=e.getAttribute(\"role\"),l=axe.utils.getNodeAttributes(e);if(s=s||axe.commons.aria.implicitRole(e),i=axe.commons.aria.allowedAttr(s),Array.isArray(t[s])&&(i=axe.utils.uniqueArray(t[s].concat(i))),s&&i)for(var c=0,d=l.length;c<d;c++)o=(a=l[c]).name,axe.commons.aria.validateAttr(o)&&!i.includes(o)&&u.push(o+'=\"'+a.nodeValue+'\"');return!u.length||(this.data(u),!1)}},{id:\"aria-allowed-role\",evaluate:function(e,t,n,r){var a=axe.commons.dom,o=t||{},i=o.allowImplicit,u=void 0===i||i,s=o.ignoredTags,l=void 0===s?[]:s,c=e.nodeName.toUpperCase();if(l.map(function(e){return e.toUpperCase()}).includes(c))return!0;var d=axe.commons.aria.getElementUnallowedRoles(e,u);if(d.length){if(this.data(d),!a.isVisible(e,!0))return;return!1}return!0},options:{allowImplicit:!0,ignoredTags:[]}},{id:\"aria-hidden-body\",evaluate:function(e,t,n,r){return\"true\"!==e.getAttribute(\"aria-hidden\")}},{id:\"aria-errormessage\",evaluate:function(n,e,t,r){var a=axe.commons,o=a.aria,i=a.dom;e=Array.isArray(e)?e:[];var u=n.getAttribute(\"aria-errormessage\"),s=n.hasAttribute(\"aria-errormessage\"),l=i.getRootNode(n);return!(-1===e.indexOf(u)&&s&&!function(e){if(\"\"===e.trim())return o.lookupTable.attributes[\"aria-errormessage\"].allowEmpty;var t=e&&l.getElementById(e);return t?\"alert\"===t.getAttribute(\"role\")||\"assertive\"===t.getAttribute(\"aria-live\")||-1<axe.utils.tokenList(n.getAttribute(\"aria-describedby\")||\"\").indexOf(e):void 0}(u))||(this.data(axe.utils.tokenList(u)),!1)}},{id:\"has-widget-role\",evaluate:function(e,t,n,r){var a=e.getAttribute(\"role\");if(null===a)return!1;var o=axe.commons.aria.getRoleType(a);return\"widget\"===o||\"composite\"===o},options:[]},{id:\"implicit-role-fallback\",evaluate:function(e,t,n,r){var a=e.getAttribute(\"role\");if(null===a||!axe.commons.aria.isValidRole(a))return!0;var o=axe.commons.aria.getRoleType(a);return axe.commons.aria.implicitRole(e)===o}},{id:\"invalidrole\",evaluate:function(e,t,n,r){return!axe.commons.aria.isValidRole(e.getAttribute(\"role\"),{allowAbstract:!0})}},{id:\"no-implicit-explicit-label\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.aria,i=a.text,u=o.getRole(e,{noImplicit:!0});this.data(u);var s=i.sanitize(i.labelText(n)).toLowerCase(),l=i.sanitize(i.accessibleText(e)).toLowerCase();return!(!l&&!s)&&(!((l||!s)&&l.includes(s))&&void 0)}},{id:\"aria-required-attr\",evaluate:function(e,t,n,r){t=t||{};var a=[],o=axe.commons.forms,i=o.isNativeTextbox,u=o.isNativeSelect,s=o.isAriaTextbox,l=o.isAriaListbox,c=o.isAriaCombobox,d=o.isAriaRange,m={\"aria-valuenow\":function(){return!(i(e)||u(e)||s(e)||l(e)||c(e)||d(e)&&e.hasAttribute(\"aria-valuenow\"))}};if(e.hasAttributes()){var p=e.getAttribute(\"role\"),f=axe.commons.aria.requiredAttr(p);if(Array.isArray(t[p])&&(f=axe.utils.uniqueArray(t[p],f)),p&&f)for(var h=0,b=f.length;h<b;h++){var g=f[h];e.getAttribute(g)||m[g]&&!m[g]()||a.push(g)}}return!a.length||(this.data(a),!1)}},{id:\"aria-required-children\",evaluate:function(e,t,m,n){var r=axe.commons.aria.requiredOwned,i=axe.commons.aria.implicitNodes,u=axe.utils.matchesSelector,p=axe.commons.dom.idrefs,a=t&&Array.isArray(t.reviewEmpty)?t.reviewEmpty:[];function f(e,t,n,r){if(null===e)return!1;var a=i(n),o=['[role=\"'+n+'\"]'];return a&&(o=o.concat(a)),o=o.join(\",\"),r&&u(e,o)||!!axe.utils.querySelectorAll(t,o)[0]}function h(e,t){var n,r;for(n=0,r=e.length;n<r;n++)if(null!==e[n]){var a=axe.utils.getNodeFromTree(e[n]);if(f(e[n],a,t,!0))return!0}return!1}var o=e.getAttribute(\"role\"),s=r(o);if(!s)return!0;var l=!1,c=s.one;if(!c){l=!0;c=s.all}var d=function(e,t,n,r){var a,o=t.length,i=[],u=p(e,\"aria-owns\");for(a=0;a<o;a++){var s=t[a];if(f(e,m,s)||h(u,s)){if(!n)return null}else n&&i.push(s)}if(\"combobox\"===r){var l=i.indexOf(\"textbox\");0<=l&&\"INPUT\"===e.nodeName.toUpperCase()&&[\"text\",\"search\",\"email\",\"url\",\"tel\"].includes(e.type)&&i.splice(l,1);var c=i.indexOf(\"listbox\"),d=e.getAttribute(\"aria-expanded\");0<=c&&(!d||\"false\"===d)&&i.splice(c,1)}return i.length?i:!n&&t.length?t:null}(e,c,l,o);return!d||(this.data(d),!(!a.includes(o)||0!==e.children.length||0!==p(e,\"aria-owns\").length)&&void 0)},options:{reviewEmpty:[\"doc-bibliography\",\"doc-endnotes\",\"grid\",\"list\",\"listbox\",\"table\",\"tablist\",\"tree\",\"treegrid\",\"rowgroup\"]}},{id:\"aria-required-parent\",evaluate:function(e,t,n,r){function u(e){return(axe.commons.aria.implicitNodes(e)||[]).concat('[role=\"'+e+'\"]').join(\",\")}function a(e,t,n){var r,a,o=e.actualNode.getAttribute(\"role\"),i=[];if(!(t=t||axe.commons.aria.requiredContext(o)))return null;for(r=0,a=t.length;r<a;r++){if(n&&axe.utils.matchesSelector(e.actualNode,u(t[r])))return null;if(axe.commons.dom.findUpVirtual(e,u(t[r])))return null;i.push(t[r])}return i}var o=a(n);if(!o)return!0;var i=function(e){for(var t=[],n=null;e;){if(e.getAttribute(\"id\")){var r=axe.utils.escapeSelector(e.getAttribute(\"id\"));(n=axe.commons.dom.getRootNode(e).querySelector(\"[aria-owns~=\".concat(r,\"]\")))&&t.push(n)}e=e.parentElement}return t.length?t:null}(e);if(i)for(var s=0,l=i.length;s<l;s++)if(!(o=a(axe.utils.getNodeFromTree(i[s]),o,!0)))return!0;return this.data(o),!1}},{id:\"aria-unsupported-attr\",evaluate:function(o,e,t,n){var i=o.nodeName.toUpperCase(),u=axe.commons.aria.lookupTable,s=axe.commons.aria.getRole(o),r=Array.from(axe.utils.getNodeAttributes(o)).filter(function(e){var t=e.name,n=u.attributes[t];if(!axe.commons.aria.validateAttr(t))return!1;var r=n.unsupported;if(\"object\"!==S(r))return!!r;var a=axe.commons.matches(o,r.exceptions);return Object.keys(u.evaluateRoleForElement).includes(i)?!u.evaluateRoleForElement[i]({node:o,role:s,out:a}):!a}).map(function(e){return e.name.toString()});return!!r.length&&(this.data(r),!0)}},{id:\"unsupportedrole\",evaluate:function(e,t,n,r){return axe.commons.aria.isUnsupportedRole(axe.commons.aria.getRole(e))}},{id:\"aria-valid-attr-value\",evaluate:function(e,t,n,r){t=Array.isArray(t)?t:[];for(var a=[],o=/^aria-/,i=axe.utils.getNodeAttributes(e),u=[\"aria-errormessage\"],s={\"aria-controls\":function(){return\"false\"!==e.getAttribute(\"aria-expanded\")&&\"false\"!==e.getAttribute(\"aria-selected\")},\"aria-owns\":function(){return\"false\"!==e.getAttribute(\"aria-expanded\")}},l=0,c=i.length;l<c;l++){var d=i[l],m=d.name;u.includes(m)||-1!==t.indexOf(m)||!o.test(m)||s[m]&&!s[m]()||axe.commons.aria.validateAttrValue(e,m)||a.push(\"\".concat(m,'=\"').concat(d.nodeValue,'\"'))}return!a.length||(this.data(a),!1)},options:[]},{id:\"aria-valid-attr\",evaluate:function(e,t,n,r){t=Array.isArray(t)?t:[];for(var a,o=[],i=/^aria-/,u=axe.utils.getNodeAttributes(e),s=0,l=u.length;s<l;s++)a=u[s].name,-1===t.indexOf(a)&&i.test(a)&&!axe.commons.aria.validateAttr(a)&&o.push(a);return!o.length||(this.data(o),!1)},options:[]},{id:\"valid-scrollable-semantics\",evaluate:function(e,t,n,r){var a,o,i,u={ARTICLE:!0,ASIDE:!0,NAV:!0,SECTION:!0},s={application:!0,banner:!1,complementary:!0,contentinfo:!0,form:!0,main:!0,navigation:!0,region:!0,search:!1};return(o=(i=e).getAttribute(\"role\"))&&s[o.toLowerCase()]||!1||(a=i.nodeName.toUpperCase(),u[a]||!1)},options:[]},{id:\"color-contrast\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.dom,i=a.color,u=a.text;if(!o.isVisible(e,!1))return!0;var s,l=!!(t||{}).noScroll,c=[],d=i.getBackgroundColor(e,c,l),m=i.getForegroundColor(e,l),p=window.getComputedStyle(e),f=parseFloat(p.getPropertyValue(\"font-size\")),h=p.getPropertyValue(\"font-weight\"),b=-1!==[\"bold\",\"bolder\",\"600\",\"700\",\"800\",\"900\"].indexOf(h),g=i.hasValidContrastRatio(d,m,f,b),y=Math.floor(100*g.contrastRatio)/100;null===d&&(s=i.incompleteData.get(\"bgColor\"));var v=1==y,D=1===u.visibleVirtual(n,!1,!0).length;v?s=i.incompleteData.set(\"bgColor\",\"equalRatio\"):D&&(s=\"shortTextContent\");var w={fgColor:m?m.toHexString():void 0,bgColor:d?d.toHexString():void 0,contrastRatio:g?y:void 0,fontSize:(72*f/96).toFixed(1)+\"pt\",fontWeight:b?\"bold\":\"normal\",missingData:s,expectedContrastRatio:g.expectedContrastRatio+\":1\"};return this.data(w),null===m||null===d||v||D&&!g.isValid?(s=null,i.incompleteData.clear(),void this.relatedNodes(c)):(g.isValid||this.relatedNodes(c),g.isValid)}},{id:\"link-in-text-block\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.color,i=a.dom;function u(e,t){var n=e.getRelativeLuminance(),r=t.getRelativeLuminance();return(Math.max(n,r)+.05)/(Math.min(n,r)+.05)}var s=[\"block\",\"list-item\",\"table\",\"flex\",\"grid\",\"inline-block\"];function l(e){var t=window.getComputedStyle(e).getPropertyValue(\"display\");return-1!==s.indexOf(t)||\"table-\"===t.substr(0,6)}if(l(e))return!1;for(var c,d,m=i.getComposedParent(e);1===m.nodeType&&!l(m);)m=i.getComposedParent(m);if(this.relatedNodes([m]),o.elementIsDistinct(e,m))return!0;if(c=o.getForegroundColor(e),d=o.getForegroundColor(m),c&&d){var p,f=u(c,d);return 1===f||(3<=f?(axe.commons.color.incompleteData.set(\"fgColor\",\"bgContrast\"),this.data({missingData:axe.commons.color.incompleteData.get(\"fgColor\")}),void axe.commons.color.incompleteData.clear()):(c=o.getBackgroundColor(e),d=o.getBackgroundColor(m),(!c||!d||3<=u(c,d))&&(p=c&&d?\"bgContrast\":axe.commons.color.incompleteData.get(\"bgColor\"),axe.commons.color.incompleteData.set(\"fgColor\",p),this.data({missingData:axe.commons.color.incompleteData.get(\"fgColor\")}),void axe.commons.color.incompleteData.clear())))}}},{id:\"autocomplete-appropriate\",evaluate:function(e,t,n,r){if(\"input\"!==n.props.nodeName)return!0;var a=[\"text\",\"search\",\"number\"],o=[\"text\",\"search\",\"url\"],i={bday:[\"text\",\"search\",\"date\"],email:[\"text\",\"search\",\"email\"],\"cc-exp\":[\"text\",\"search\",\"month\"],\"street-address\":[\"text\"],tel:[\"text\",\"search\",\"tel\"],\"cc-exp-month\":a,\"cc-exp-year\":a,\"transaction-amount\":a,\"bday-day\":a,\"bday-month\":a,\"bday-year\":a,\"new-password\":[\"text\",\"search\",\"password\"],\"current-password\":[\"text\",\"search\",\"password\"],url:o,photo:o,impp:o};\"object\"===S(t)&&Object.keys(t).forEach(function(e){i[e]||(i[e]=[]),i[e]=i[e].concat(t[e])});var u=n.attr(\"autocomplete\").split(/\\s+/g).map(function(e){return e.toLowerCase()}),s=u[u.length-1];if(axe.commons.text.autocomplete.stateTerms.includes(s))return!0;var l=i[s],c=n.hasAttr(\"type\")?axe.commons.text.sanitize(n.attr(\"type\")).toLowerCase():\"text\";return c=axe.utils.validInputTypes().includes(c)?c:\"text\",void 0===l?\"text\"===c:l.includes(c)}},{id:\"autocomplete-valid\",evaluate:function(e,t,n,r){var a=n.attr(\"autocomplete\")||\"\";return axe.commons.text.isValidAutocomplete(a,t)}},{id:\"fieldset\",evaluate:function(e,t,n,r){var o,i=this;function u(e,t){return axe.utils.toArray(e.querySelectorAll('select,textarea,button,input:not([name=\"'+t+'\"]):not([type=\"hidden\"])'))}var a={name:e.getAttribute(\"name\"),type:e.getAttribute(\"type\")},s=function(e){var t=axe.utils.escapeSelector(e.actualNode.name),n=axe.commons.dom.getRootNode(e.actualNode).querySelectorAll('input[type=\"'+axe.utils.escapeSelector(e.actualNode.type)+'\"][name=\"'+t+'\"]');if(n.length<2)return!0;var r=axe.commons.dom.findUpVirtual(e,\"fieldset\"),a=axe.commons.dom.findUpVirtual(e,'[role=\"group\"]'+(\"radio\"===e.actualNode.type?',[role=\"radiogroup\"]':\"\"));return a||r?r?function(e,t){var n=e.firstElementChild;if(!n||\"LEGEND\"!==n.nodeName.toUpperCase())return i.relatedNodes([e]),!(o=\"no-legend\");if(!axe.commons.text.accessibleText(n))return i.relatedNodes([n]),!(o=\"empty-legend\");var r=u(e,t);return!r.length||(i.relatedNodes(r),!(o=\"mixed-inputs\"))}(r,t):function(e,t){var n=axe.commons.dom.idrefs(e,\"aria-labelledby\").some(function(e){return e&&axe.commons.text.accessibleText(e)}),r=e.getAttribute(\"aria-label\");if(!(n||r&&axe.commons.text.sanitize(r)))return i.relatedNodes(e),!(o=\"no-group-label\");var a=u(e,t);return!a.length||(i.relatedNodes(a),!(o=\"group-mixed-inputs\"))}(a,t):(o=\"no-group\",i.relatedNodes(function(e,t){return axe.utils.toArray(e).filter(function(e){return e!==t})}(n,e.actualNode)),!1)}(n);return s||(a.failureCode=o),this.data(a),s},after:function(e,t){var r={};return e.filter(function(e){if(e.result)return!0;var t=e.data;if(t){if(r[t.type]=r[t.type]||{},!r[t.type][t.name])return r[t.type][t.name]=[t],!0;var n=r[t.type][t.name].some(function(e){return e.failureCode===t.failureCode});return n||r[t.type][t.name].push(t),!n}return!1})}},{id:\"group-labelledby\",evaluate:function(n,e,t,r){var a=axe.commons,o=a.dom,i=a.text,u=axe.utils.escapeSelector(n.type),s=axe.utils.escapeSelector(n.name),l=o.getRootNode(n),c={name:n.name,type:n.type},d=Array.from(l.querySelectorAll('input[type=\"'.concat(u,'\"][name=\"').concat(s,'\"]')));if(d.length<=1)return this.data(c),!0;var m=o.idrefs(n,\"aria-labelledby\").filter(function(e){return!!e}),p=m.slice();d.forEach(function(e){if(e!==n){var t=o.idrefs(e,\"aria-labelledby\").filter(function(e){return e});m=m.filter(function(e){return t.includes(e)}),p=p.filter(function(e){return!t.includes(e)})}});var f={inLabelledByContext:!0};return p=p.filter(function(e){return i.accessibleText(e,f)}),m=m.filter(function(e){return i.accessibleText(e,f)}),0<p.length&&0<m.length?(this.data(c),!0):(0<p.length&&0===m.length?c.failureCode=\"no-shared-label\":0===p.length&&0<m.length&&(c.failureCode=\"no-unique-label\"),this.data(c),!1)},after:function(e,t){var n={};return e.filter(function(e){var t=e.data;return!(!t||(n[t.type]=n[t.type]||{},n[t.type][t.name]))&&(n[t.type][t.name]=!0)})}},{id:\"accesskeys\",evaluate:function(e,t,n,r){return axe.commons.dom.isVisible(e,!1)&&(this.data(e.getAttribute(\"accesskey\")),this.relatedNodes([e])),!0},after:function(e,t){var n={};return e.filter(function(e){if(!e.data)return!1;var t=e.data.toUpperCase();return n[t]?(n[t].relatedNodes.push(e.relatedNodes[0]),!1):((n[t]=e).relatedNodes=[],!0)}).map(function(e){return e.result=!!e.relatedNodes.length,e})}},{id:\"focusable-content\",evaluate:function(e,t,n,r){var a=n.tabbableElements;return!!a&&0<a.filter(function(e){return e!==n}).length}},{id:\"focusable-disabled\",evaluate:function(e,t,n,r){var a=[\"BUTTON\",\"FIELDSET\",\"INPUT\",\"SELECT\",\"TEXTAREA\"],o=n.tabbableElements;if(!o||!o.length)return!0;var i=o.reduce(function(e,t){var n=t.actualNode,r=n.nodeName.toUpperCase();return a.includes(r)&&e.push(n),e},[]);return this.relatedNodes(i),0===i.length}},{id:\"focusable-element\",evaluate:function(e,t,n,r){var a=n.isFocusable,o=parseInt(n.actualNode.getAttribute(\"tabindex\"),10);return(o=isNaN(o)?null:o)?a&&0<=o:a}},{id:\"focusable-no-name\",evaluate:function(e,t,n,r){var a=e.getAttribute(\"tabindex\");return!!(axe.commons.dom.isFocusable(e)&&-1<a)&&!axe.commons.text.accessibleTextVirtual(n)}},{id:\"focusable-not-tabbable\",evaluate:function(e,t,n,r){var a=[\"BUTTON\",\"FIELDSET\",\"INPUT\",\"SELECT\",\"TEXTAREA\"],o=n.tabbableElements;if(!o||!o.length)return!0;var i=o.reduce(function(e,t){var n=t.actualNode,r=n.nodeName.toUpperCase();return a.includes(r)||e.push(n),e},[]);return this.relatedNodes(i),0===i.length}},{id:\"landmark-is-top-level\",evaluate:function(e,t,n,r){var a=axe.commons.aria.getRolesByType(\"landmark\"),o=axe.commons.dom.getComposedParent(e);for(this.data({role:e.getAttribute(\"role\")||axe.commons.aria.implicitRole(e)});o;){var i=o.getAttribute(\"role\");if(i||\"FORM\"===o.nodeName.toUpperCase()||(i=axe.commons.aria.implicitRole(o)),i&&a.includes(i))return!1;o=axe.commons.dom.getComposedParent(o)}return!0}},{id:\"page-has-heading-one\",evaluate:function(e,t,n,r){if(!t||!t.selector||\"string\"!=typeof t.selector)throw new TypeError(\"visible-in-page requires options.selector to be a string\");var a=axe.utils.querySelectorAll(n,t.selector);return this.relatedNodes(a.map(function(e){return e.actualNode})),0<a.length},after:function(e,t){return e.some(function(e){return!0===e.result})&&e.forEach(function(e){e.result=!0}),e},options:{selector:'h1:not([role]), [role=\"heading\"][aria-level=\"1\"]'}},{id:\"page-has-main\",evaluate:function(e,t,n,r){if(!t||!t.selector||\"string\"!=typeof t.selector)throw new TypeError(\"visible-in-page requires options.selector to be a string\");var a=axe.utils.querySelectorAll(n,t.selector);return this.relatedNodes(a.map(function(e){return e.actualNode})),0<a.length},after:function(e,t){return e.some(function(e){return!0===e.result})&&e.forEach(function(e){e.result=!0}),e},options:{selector:\"main:not([role]), [role='main']\"}},{id:\"page-no-duplicate-banner\",evaluate:function(e,t,n,r){if(!t||!t.selector||\"string\"!=typeof t.selector)throw new TypeError(\"visible-in-page requires options.selector to be a string\");var a=axe.utils.querySelectorAll(n,t.selector);return\"string\"==typeof t.nativeScopeFilter&&(a=a.filter(function(e){return e.actualNode.hasAttribute(\"role\")||!axe.commons.dom.findUpVirtual(e,t.nativeScopeFilter)})),this.relatedNodes(a.map(function(e){return e.actualNode})),a.length<=1},options:{selector:\"header:not([role]), [role=banner]\",nativeScopeFilter:\"article, aside, main, nav, section\"}},{id:\"page-no-duplicate-contentinfo\",evaluate:function(e,t,n,r){if(!t||!t.selector||\"string\"!=typeof t.selector)throw new TypeError(\"visible-in-page requires options.selector to be a string\");var a=axe.utils.querySelectorAll(n,t.selector);return\"string\"==typeof t.nativeScopeFilter&&(a=a.filter(function(e){return e.actualNode.hasAttribute(\"role\")||!axe.commons.dom.findUpVirtual(e,t.nativeScopeFilter)})),this.relatedNodes(a.map(function(e){return e.actualNode})),a.length<=1},options:{selector:\"footer:not([role]), [role=contentinfo]\",nativeScopeFilter:\"article, aside, main, nav, section\"}},{id:\"page-no-duplicate-main\",evaluate:function(e,t,n,r){if(!t||!t.selector||\"string\"!=typeof t.selector)throw new TypeError(\"visible-in-page requires options.selector to be a string\");var a=axe.utils.querySelectorAll(n,t.selector);return\"string\"==typeof t.nativeScopeFilter&&(a=a.filter(function(e){return e.actualNode.hasAttribute(\"role\")||!axe.commons.dom.findUpVirtual(e,t.nativeScopeFilter)})),this.relatedNodes(a.map(function(e){return e.actualNode})),a.length<=1},options:{selector:\"main:not([role]), [role='main']\"}},{id:\"tabindex\",evaluate:function(e,t,n,r){return e.tabIndex<=0}},{id:\"alt-space-value\",evaluate:function(e,t,n,r){var a=/^\\s+$/.test(e.getAttribute(\"alt\"));return e.hasAttribute(\"alt\")&&a}},{id:\"duplicate-img-label\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.aria,i=a.text,u=a.dom;if([\"none\",\"presentation\"].includes(o.getRole(e)))return!1;var s=u.findUpVirtual(n,'button, [role=\"button\"], a[href], p, li, td, th'),l=axe.utils.getNodeFromTree(s),c=i.visibleVirtual(l,!0).toLowerCase();return\"\"!==c&&c===i.accessibleTextVirtual(n).toLowerCase()}},{id:\"explicit-label\",evaluate:function(e,t,n,r){if(e.getAttribute(\"id\")){var a=axe.commons.dom.getRootNode(e),o=axe.utils.escapeSelector(e.getAttribute(\"id\")),i=a.querySelector('label[for=\"'.concat(o,'\"]'));if(i)return!axe.commons.dom.isVisible(i)||!!axe.commons.text.accessibleText(i)}return!1}},{id:\"help-same-as-label\",evaluate:function(e,t,n,r){var a=axe.commons.text.labelVirtual(n),o=e.getAttribute(\"title\");if(!a)return!1;o||(o=\"\",e.getAttribute(\"aria-describedby\")&&(o=axe.commons.dom.idrefs(e,\"aria-describedby\").map(function(e){return e?axe.commons.text.accessibleText(e):\"\"}).join(\"\")));return axe.commons.text.sanitize(o)===axe.commons.text.sanitize(a)},enabled:!1},{id:\"hidden-explicit-label\",evaluate:function(e,t,n,r){if(e.getAttribute(\"id\")){var a=axe.commons.dom.getRootNode(e),o=axe.utils.escapeSelector(e.getAttribute(\"id\")),i=a.querySelector('label[for=\"'.concat(o,'\"]'));if(i&&!axe.commons.dom.isVisible(i,!0))return\"\"===axe.commons.text.accessibleTextVirtual(n).trim()}return!1}},{id:\"implicit-label\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.dom,i=a.text,u=o.findUpVirtual(n,\"label\");return!!u&&!!i.accessibleText(u,{inControlContext:!0})}},{id:\"label-content-name-mismatch\",evaluate:function(e,t,n,r){var a=axe.commons.text,o=a.accessibleText(e).toLowerCase();if(!(a.isHumanInterpretable(o)<1)){var i=a.sanitize(a.visibleVirtual(n)).toLowerCase();return a.isHumanInterpretable(i)<1?!!u(i,o)||void 0:u(i,o)}function u(e,t){var n=s(t),r=s(e);return!(!n||!r)&&n.includes(r)}function s(e){var t=a.removeUnicode(e,{emoji:!0,nonBmp:!0,punctuations:!0});return a.sanitize(t)}}},{id:\"multiple-label\",evaluate:function(e,t,n,r){var a=axe.utils.escapeSelector(e.getAttribute(\"id\")),o=e.parentNode,i=axe.commons.dom.getRootNode(e);i=i.documentElement||i;var u=Array.from(i.querySelectorAll('label[for=\"'.concat(a,'\"]')));for(u.length&&(u=u.filter(function(e){return axe.commons.dom.isVisible(e)}));o;)\"LABEL\"===o.nodeName.toUpperCase()&&-1===u.indexOf(o)&&u.push(o),o=o.parentNode;if(this.relatedNodes(u),1<u.length){var s=u.filter(function(e){return axe.commons.dom.isVisible(e,!0)});return 1<s.length||!axe.commons.dom.idrefs(e,\"aria-labelledby\").includes(s[0])}return!1}},{id:\"title-only\",evaluate:function(e,t,n,r){return!(axe.commons.text.labelVirtual(n)||!e.getAttribute(\"title\")&&!e.getAttribute(\"aria-describedby\"))}},{id:\"landmark-is-unique\",evaluate:function(e,t,n,r){var a=axe.commons.aria.getRole(e),o=axe.commons.text.accessibleTextVirtual(n);return o=o?o.toLowerCase():null,this.data({role:a,accessibleText:o}),this.relatedNodes([e]),!0},after:function(e,t){var n=[];return e.filter(function(t){var e=n.find(function(e){return t.data.role===e.data.role&&t.data.accessibleText===e.data.accessibleText});return e?(e.result=!1,e.relatedNodes.push(t.relatedNodes[0]),!1):(n.push(t),t.relatedNodes=[],!0)})}},{id:\"has-lang\",evaluate:function(e,t,n,r){return!!(e.getAttribute(\"lang\")||e.getAttribute(\"xml:lang\")||\"\").trim()}},{id:\"valid-lang\",evaluate:function(a,e,t,n){var o,r;return o=(e||axe.utils.validLangs()).map(axe.utils.getBaseLang),!!(r=[\"lang\",\"xml:lang\"].reduce(function(e,t){var n=a.getAttribute(t);if(\"string\"!=typeof n)return e;var r=axe.utils.getBaseLang(n);return\"\"!==r&&-1===o.indexOf(r)&&e.push(t+'=\"'+a.getAttribute(t)+'\"'),e},[])).length&&(this.data(r),!0)}},{id:\"xml-lang-mismatch\",evaluate:function(e,t,n,r){var a=axe.utils.getBaseLang;return a(e.getAttribute(\"lang\"))===a(e.getAttribute(\"xml:lang\"))}},{id:\"dlitem\",evaluate:function(e,t,n,r){var a=axe.commons.dom.getComposedParent(e),o=a.nodeName.toUpperCase(),i=axe.commons.aria.getRole(a,{noImplicit:!0});return\"DIV\"===o&&[\"presentation\",\"none\",null].includes(i)&&(o=(a=axe.commons.dom.getComposedParent(a)).nodeName.toUpperCase(),i=axe.commons.aria.getRole(a,{noImplicit:!0})),\"DL\"===o&&(!i||\"list\"===i)}},{id:\"listitem\",evaluate:function(e,t,n,r){var a=axe.commons.dom.getComposedParent(e);if(a){var o=a.nodeName.toUpperCase(),i=(a.getAttribute(\"role\")||\"\").toLowerCase();return\"list\"===i||(!i||!axe.commons.aria.isValidRole(i))&&[\"UL\",\"OL\"].includes(o)}}},{id:\"only-dlitems\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.dom,i=a.aria,u=[\"definition\",\"term\",\"list\"],s=n.children.reduce(function(e,t){var n=t.actualNode;return\"DIV\"===n.nodeName.toUpperCase()&&null===i.getRole(n)?e.concat(t.children):e.concat(t)},[]).reduce(function(e,t){var n=t.actualNode,r=n.nodeName.toUpperCase();if(1===n.nodeType&&o.isVisible(n,!0,!1)){var a=i.getRole(n,{noImplicit:!0});(\"DT\"!==r&&\"DD\"!==r||a)&&(u.includes(a)||e.badNodes.push(n))}else 3===n.nodeType&&\"\"!==n.nodeValue.trim()&&(e.hasNonEmptyTextNode=!0);return e},{badNodes:[],hasNonEmptyTextNode:!1});return s.badNodes.length&&this.relatedNodes(s.badNodes),!!s.badNodes.length||s.hasNonEmptyTextNode}},{id:\"only-listitems\",evaluate:function(e,t,n,r){var o=axe.commons.dom,a=n.children.reduce(function(e,t){var n=t.actualNode,r=n.nodeName.toUpperCase();if(1===n.nodeType&&o.isVisible(n,!0,!1)){var a=function(e,t){return\"listitem\"===e||\"LI\"===t&&!e}((n.getAttribute(\"role\")||\"\").toLowerCase(),r);e.hasListItem=function(e,t,n){return e||\"LI\"===t&&n||n}(e.hasListItem,r,a),a&&(e.isEmpty=!1),\"LI\"!==r||a||e.liItemsWithRole++,\"LI\"===r||a||e.badNodes.push(n)}return 3===n.nodeType&&\"\"!==n.nodeValue.trim()&&(e.hasNonEmptyTextNode=!0),e},{badNodes:[],isEmpty:!0,hasNonEmptyTextNode:!1,hasListItem:!1,liItemsWithRole:0}),i=n.children.filter(function(e){return\"LI\"===e.actualNode.nodeName.toUpperCase()}),u=0<a.liItemsWithRole&&i.length===a.liItemsWithRole;return a.badNodes.length&&this.relatedNodes(a.badNodes),!(a.hasListItem||a.isEmpty&&!u)||!!a.badNodes.length||a.hasNonEmptyTextNode}},{id:\"structured-dlitems\",evaluate:function(e,t,n,r){var a=n.children;if(!a||!a.length)return!1;for(var o,i=!1,u=!1,s=0;s<a.length;s++){if(\"DT\"===(o=a[s].actualNode.nodeName.toUpperCase())&&(i=!0),i&&\"DD\"===o)return!1;\"DD\"===o&&(u=!0)}return i||u}},{id:\"caption\",evaluate:function(e,t,n,r){return!axe.utils.querySelectorAll(n,\"track\").some(function(e){return\"captions\"===(e.actualNode.getAttribute(\"kind\")||\"\").toLowerCase()})&&void 0}},{id:\"description\",evaluate:function(e,t,n,r){return!axe.utils.querySelectorAll(n,\"track\").some(function(e){return\"descriptions\"===(e.actualNode.getAttribute(\"kind\")||\"\").toLowerCase()})&&void 0}},{id:\"frame-tested\",evaluate:function(e,t,n,r){var a=this.async(),o=Object.assign({isViolation:!1,timeout:500},t),i=o.isViolation,u=o.timeout,s=setTimeout(function(){s=setTimeout(function(){s=null,a(!i&&void 0)},0)},u);axe.utils.respondable(e.contentWindow,\"axe.ping\",null,void 0,function(){null!==s&&(clearTimeout(s),a(!0))})},options:{isViolation:!1}},{id:\"css-orientation-lock\",evaluate:function(e,t,n,r){var a=(r||{}).cssom,o=void 0===a?void 0:a;if(o&&o.length){var i=o.reduce(function(e,t){var n=t.sheet,r=t.root,a=t.shadowId,o=a||\"topDocument\";if(e[o]||(e[o]={root:r,rules:[]}),!n||!n.cssRules)return e;var i=Array.from(n.cssRules);return e[o].rules=e[o].rules.concat(i),e},{}),s=!1,l=[];return Object.keys(i).forEach(function(e){var t=i[e],u=t.root,n=t.rules.filter(function(e){return 4===e.type});if(n&&n.length){var r=n.filter(function(e){var t=e.cssText;return/orientation:\\s*landscape/i.test(t)||/orientation:\\s*portrait/i.test(t)});r&&r.length&&r.forEach(function(e){e.cssRules.length&&Array.from(e.cssRules).forEach(function(e){if(e.selectorText&&!(e.style.length<=0)){var t=e.style.transform||e.style.webkitTransform||e.style.msTransform||!1;if(t){var n=t.match(/rotate\\(([^)]+)deg\\)/),r=parseInt(n&&n[1]||0),a=r%90==0&&r%180!=0;if(a&&\"HTML\"!==e.selectorText.toUpperCase()){var o=e.selectorText,i=Array.from(u.querySelectorAll(o));i&&i.length&&(l=l.concat(i))}s=a}}})})}}),s?(l.length&&this.relatedNodes(l),!1):!0}}},{id:\"meta-viewport-large\",evaluate:function(e,t,n,r){t=t||{};for(var a,o=(e.getAttribute(\"content\")||\"\").split(/[;,]/),i={},u=t.scaleMinimum||2,s=t.lowerBound||!1,l=0,c=o.length;l<c;l++){var d=(a=o[l].split(\"=\")).shift().toLowerCase();d&&a.length&&(i[d.trim()]=a.shift().trim().toLowerCase())}return!!(s&&i[\"maximum-scale\"]&&parseFloat(i[\"maximum-scale\"])<s)||(s||\"no\"!==i[\"user-scalable\"]?!(i[\"maximum-scale\"]&&parseFloat(i[\"maximum-scale\"])<u)||(this.data(\"maximum-scale\"),!1):(this.data(\"user-scalable=no\"),!1))},options:{scaleMinimum:5,lowerBound:2}},{id:\"meta-viewport\",evaluate:function(e,t,n,r){t=t||{};for(var a,o=(e.getAttribute(\"content\")||\"\").split(/[;,]/),i={},u=t.scaleMinimum||2,s=t.lowerBound||!1,l=0,c=o.length;l<c;l++){var d=(a=o[l].split(\"=\")).shift().toLowerCase();d&&a.length&&(i[d.trim()]=a.shift().trim().toLowerCase())}return!!(s&&i[\"maximum-scale\"]&&parseFloat(i[\"maximum-scale\"])<s)||(s||\"no\"!==i[\"user-scalable\"]?!(i[\"maximum-scale\"]&&parseFloat(i[\"maximum-scale\"])<u)||(this.data(\"maximum-scale\"),!1):(this.data(\"user-scalable=no\"),!1))},options:{scaleMinimum:2}},{id:\"header-present\",evaluate:function(e,t,n,r){return!!axe.utils.querySelectorAll(n,'h1, h2, h3, h4, h5, h6, [role=\"heading\"]')[0]}},{id:\"heading-order\",evaluate:function(e,t,n,r){var a=e.getAttribute(\"aria-level\");if(null!==a)return this.data(parseInt(a,10)),!0;var o=e.nodeName.toUpperCase().match(/H(\\d)/);return o&&this.data(parseInt(o[1],10)),!0},after:function(e,t){if(e.length<2)return e;for(var n=e[0].data,r=1;r<e.length;r++)e[r].result&&e[r].data>n+1&&(e[r].result=!1),n=e[r].data;return e}},{id:\"internal-link-present\",evaluate:function(e,t,n,r){return axe.utils.querySelectorAll(n,\"a[href]\").some(function(e){return/^#[^/!]/.test(e.actualNode.getAttribute(\"href\"))})}},{id:\"landmark\",evaluate:function(e,t,n,r){return 0<axe.utils.querySelectorAll(n,'main, [role=\"main\"]').length}},{id:\"meta-refresh\",evaluate:function(e,t,n,r){var a=e.getAttribute(\"content\")||\"\",o=a.split(/[;,]/);return\"\"===a||\"0\"===o[0]}},{id:\"p-as-heading\",evaluate:function(e,t,n,r){var a=Array.from(e.parentNode.children),o=a.indexOf(e),i=(t=t||{}).margins||[],u=a.slice(o+1).find(function(e){return\"P\"===e.nodeName.toUpperCase()}),s=a.slice(0,o).reverse().find(function(e){return\"P\"===e.nodeName.toUpperCase()});function l(e){var t=window.getComputedStyle(function(e){for(var t=e,n=e.textContent.trim(),r=n;r===n&&void 0!==t;){var a=-1;if(0===(e=t).children.length)return e;for(;a++,\"\"===(r=e.children[a].textContent.trim())&&a+1<e.children.length;);t=e.children[a]}return e}(e));return{fontWeight:function(e){switch(e){case\"lighter\":return 100;case\"normal\":return 400;case\"bold\":return 700;case\"bolder\":return 900}return e=parseInt(e),isNaN(e)?400:e}(t.getPropertyValue(\"font-weight\")),fontSize:parseInt(t.getPropertyValue(\"font-size\")),isItalic:\"italic\"===t.getPropertyValue(\"font-style\")}}function c(n,r,e){return e.reduce(function(e,t){return e||(!t.size||n.fontSize/t.size>r.fontSize)&&(!t.weight||n.fontWeight-t.weight>r.fontWeight)&&(!t.italic||n.isItalic&&!r.isItalic)},!1)}var d=l(e),m=u?l(u):null,p=s?l(s):null;if(!m||!c(d,m,i))return!0;var f=axe.commons.dom.findUpVirtual(n,\"blockquote\");return!!(f&&\"BLOCKQUOTE\"===f.nodeName.toUpperCase()||p&&!c(d,p,i))&&void 0},options:{margins:[{weight:150,italic:!0},{weight:150,size:1.15},{italic:!0,size:1.15},{size:1.4}]}},{id:\"region\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.dom,i=a.aria,u=i.getRolesByType(\"landmark\"),s=u.reduce(function(e,t){return e.concat(i.implicitNodes(t))},[]).filter(function(e){return null!==e});var l=function e(t){var n=t.actualNode;return function(a){var o=a.actualNode,e=axe.commons.aria.getRole(o,{noImplicit:!0}),t=(o.getAttribute(\"aria-live\")||\"\").toLowerCase().trim();return e?\"dialog\"===e||u.includes(e):!![\"assertive\",\"polite\"].includes(t)||s.some(function(e){var t=axe.utils.matchesSelector(o,e);if(\"FORM\"!==o.nodeName.toUpperCase())return t;var n=o.getAttribute(\"title\"),r=n&&\"\"!==n.trim()?axe.commons.text.sanitize(n):null;return t&&(!!i.labelVirtual(a)||!!r)})}(t)||o.isSkipLink(t.actualNode)&&o.getElementByReference(t.actualNode,\"href\")||!o.isVisible(n,!0)?[]:o.hasContent(n,!0)?[n]:t.children.filter(function(e){return 1===e.actualNode.nodeType}).map(e).reduce(function(e,t){return e.concat(t)},[])}(n);return this.relatedNodes(l),0===l.length},after:function(e,t){return[e[0]]}},{id:\"skip-link\",evaluate:function(e,t,n,r){var a=axe.commons.dom.getElementByReference(e,\"href\");return!!a&&(axe.commons.dom.isVisible(a,!0)||void 0)}},{id:\"unique-frame-title\",evaluate:function(e,t,n,r){var a=axe.commons.text.sanitize(e.title).trim().toLowerCase();return this.data(a),!0},after:function(e,t){var n={};return e.forEach(function(e){n[e.data]=void 0!==n[e.data]?++n[e.data]:0}),e.forEach(function(e){e.result=!!n[e.data]}),e}},{id:\"duplicate-id-active\",evaluate:function(t,e,n,r){var a=t.getAttribute(\"id\").trim();if(!a)return!0;var o=axe.commons.dom.getRootNode(t),i=Array.from(o.querySelectorAll('[id=\"'.concat(axe.utils.escapeSelector(a),'\"]'))).filter(function(e){return e!==t});return i.length&&this.relatedNodes(i),this.data(a),0===i.length},after:function(e,t){var n=[];return e.filter(function(e){return-1===n.indexOf(e.data)&&(n.push(e.data),!0)})}},{id:\"duplicate-id-aria\",evaluate:function(t,e,n,r){var a=t.getAttribute(\"id\").trim();if(!a)return!0;var o=axe.commons.dom.getRootNode(t),i=Array.from(o.querySelectorAll('[id=\"'.concat(axe.utils.escapeSelector(a),'\"]'))).filter(function(e){return e!==t});return i.length&&this.relatedNodes(i),this.data(a),0===i.length},after:function(e,t){var n=[];return e.filter(function(e){return-1===n.indexOf(e.data)&&(n.push(e.data),!0)})}},{id:\"duplicate-id\",evaluate:function(t,e,n,r){var a=t.getAttribute(\"id\").trim();if(!a)return!0;var o=axe.commons.dom.getRootNode(t),i=Array.from(o.querySelectorAll('[id=\"'.concat(axe.utils.escapeSelector(a),'\"]'))).filter(function(e){return e!==t});return i.length&&this.relatedNodes(i),this.data(a),0===i.length},after:function(e,t){var n=[];return e.filter(function(e){return-1===n.indexOf(e.data)&&(n.push(e.data),!0)})}},{id:\"aria-label\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.text,i=a.aria;return!!o.sanitize(i.arialabelText(e))}},{id:\"aria-labelledby\",evaluate:function(e,t,n,r){var a=axe.commons,o=a.text,i=a.aria;return!!o.sanitize(i.arialabelledbyText(e))}},{id:\"avoid-inline-spacing\",evaluate:function(t,e,n,r){var a=[\"line-height\",\"letter-spacing\",\"word-spacing\"].filter(function(e){if(\"important\"===t.style.getPropertyPriority(e))return e});return!(0<a.length)||(this.data(a),!1)}},{id:\"button-has-visible-text\",evaluate:function(e,t,n,r){var a,o=e.nodeName.toUpperCase(),i=e.getAttribute(\"role\");return(\"BUTTON\"===o||\"button\"===i&&\"INPUT\"!==o)&&(a=axe.commons.text.accessibleTextVirtual(n),this.data(a),!!a)}},{id:\"doc-has-title\",evaluate:function(e,t,n,r){var a=document.title;return!(!a||!axe.commons.text.sanitize(a).trim())}},{id:\"exists\",evaluate:function(e,t,n,r){return!0}},{id:\"has-alt\",evaluate:function(e,t,n,r){var a=e.nodeName.toLowerCase();return e.hasAttribute(\"alt\")&&(\"img\"===a||\"input\"===a||\"area\"===a)}},{id:\"has-visible-text\",evaluate:function(e,t,n,r){return 0<axe.commons.text.accessibleTextVirtual(n).length}},{id:\"is-on-screen\",evaluate:function(e,t,n,r){return axe.commons.dom.isVisible(e,!1)&&!axe.commons.dom.isOffscreen(e)}},{id:\"non-empty-alt\",evaluate:function(e,t,n,r){var a=e.getAttribute(\"alt\");return!(!a||!axe.commons.text.sanitize(a).trim())}},{id:\"non-empty-if-present\",evaluate:function(e,t,n,r){var a=e.nodeName.toUpperCase(),o=(e.getAttribute(\"type\")||\"\").toLowerCase(),i=e.getAttribute(\"value\");return this.data(i),!(\"INPUT\"!==a||![\"submit\",\"reset\"].includes(o))&&null===i}},{id:\"non-empty-title\",evaluate:function(e,t,n,r){var a=axe.commons.text;return!!a.sanitize(a.titleText(e))}},{id:\"non-empty-value\",evaluate:function(e,t,n,r){var a=e.getAttribute(\"value\");return!(!a||!axe.commons.text.sanitize(a).trim())}},{id:\"role-none\",evaluate:function(e,t,n,r){return\"none\"===e.getAttribute(\"role\")}},{id:\"role-presentation\",evaluate:function(e,t,n,r){return\"presentation\"===e.getAttribute(\"role\")}},{id:\"caption-faked\",evaluate:function(e,t,n,r){var a=axe.commons.table.toGrid(e),o=a[0];return a.length<=1||o.length<=1||e.rows.length<=1||o.reduce(function(e,t,n){return e||t!==o[n+1]&&void 0!==o[n+1]},!1)}},{id:\"has-caption\",evaluate:function(e,t,n,r){return!!e.caption}},{id:\"has-summary\",evaluate:function(e,t,n,r){return!!e.summary}},{id:\"has-th\",evaluate:function(e,t,n,r){for(var a,o,i=[],u=0,s=e.rows.length;u<s;u++)for(var l=0,c=(a=e.rows[u]).cells.length;l<c;l++)\"TH\"!==(o=a.cells[l]).nodeName.toUpperCase()&&-1===[\"rowheader\",\"columnheader\"].indexOf(o.getAttribute(\"role\"))||i.push(o);return!!i.length&&(this.relatedNodes(i),!0)}},{id:\"html5-scope\",evaluate:function(e,t,n,r){return!axe.commons.dom.isHTML5(document)||\"TH\"===e.nodeName.toUpperCase()}},{id:\"same-caption-summary\",evaluate:function(e,t,n,r){return!(!e.summary||!e.caption)&&e.summary.toLowerCase()===axe.commons.text.accessibleText(e.caption).toLowerCase()}},{id:\"scope-value\",evaluate:function(e,t,n,r){var a=e.getAttribute(\"scope\").toLowerCase();return-1!==[\"row\",\"col\",\"rowgroup\",\"colgroup\"].indexOf(a)}},{id:\"td-has-header\",evaluate:function(e,t,n,r){var a=axe.commons.table,o=[];return a.getAllCells(e).forEach(function(e){axe.commons.dom.hasContent(e)&&a.isDataCell(e)&&!axe.commons.aria.label(e)&&(a.getHeaders(e).some(function(e){return null!==e&&!!axe.commons.dom.hasContent(e)})||o.push(e))}),!o.length||(this.relatedNodes(o),!1)}},{id:\"td-headers-attr\",evaluate:function(e,t,n,r){for(var a=[],o=0,i=e.rows.length;o<i;o++)for(var u=e.rows[o],s=0,l=u.cells.length;s<l;s++)a.push(u.cells[s]);var c=a.reduce(function(e,t){return t.getAttribute(\"id\")&&e.push(t.getAttribute(\"id\")),e},[]),d=a.reduce(function(e,t){var n,r,a=(t.getAttribute(\"headers\")||\"\").split(/\\s/).reduce(function(e,t){return(t=t.trim())&&e.push(t),e},[]);return 0!==a.length&&(t.getAttribute(\"id\")&&(n=-1!==a.indexOf(t.getAttribute(\"id\").trim())),r=a.reduce(function(e,t){return e||-1===c.indexOf(t)},!1),(n||r)&&e.push(t)),e},[]);return!(0<d.length)||(this.relatedNodes(d),!1)}},{id:\"th-has-data-cells\",evaluate:function(e,t,n,r){var a=axe.commons.table,o=a.getAllCells(e),i=this,u=[];o.forEach(function(e){var t=e.getAttribute(\"headers\");t&&(u=u.concat(t.split(/\\s+/)));var n=e.getAttribute(\"aria-labelledby\");n&&(u=u.concat(n.split(/\\s+/)))});var s=o.filter(function(e){return\"\"!==axe.commons.text.sanitize(e.textContent)&&(\"TH\"===e.nodeName.toUpperCase()||-1!==[\"rowheader\",\"columnheader\"].indexOf(e.getAttribute(\"role\")))}),l=a.toGrid(e);return!!s.reduce(function(e,t){if(t.getAttribute(\"id\")&&u.includes(t.getAttribute(\"id\")))return!!e||e;var n=!1,r=a.getCellPosition(t,l);return a.isColumnHeader(t)&&(n=a.traverse(\"down\",r,l).reduce(function(e,t){return e||axe.commons.dom.hasContent(t)&&!a.isColumnHeader(t)},!1)),!n&&a.isRowHeader(t)&&(n=a.traverse(\"right\",r,l).reduce(function(e,t){return e||axe.commons.dom.hasContent(t)&&!a.isRowHeader(t)},!1)),n||i.relatedNodes(t),e&&n},!0)||void 0}},{id:\"hidden-content\",evaluate:function(e,t,n,r){if(![\"SCRIPT\",\"HEAD\",\"TITLE\",\"NOSCRIPT\",\"STYLE\",\"TEMPLATE\"].includes(e.nodeName.toUpperCase())&&axe.commons.dom.hasContentVirtual(n)){var a=window.getComputedStyle(e);if(\"none\"===a.getPropertyValue(\"display\"))return;if(\"hidden\"===a.getPropertyValue(\"visibility\")){var o=axe.commons.dom.getComposedParent(e),i=o&&window.getComputedStyle(o);if(!i||\"hidden\"!==i.getPropertyValue(\"visibility\"))return}}return!0}}],commons:function(){function e(e){return null===e}function t(e){return null!==e}var commons={},l=commons.aria={},n=l.lookupTable={};n.attributes={\"aria-activedescendant\":{type:\"idref\",allowEmpty:!0,unsupported:!1},\"aria-atomic\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-autocomplete\":{type:\"nmtoken\",values:[\"inline\",\"list\",\"both\",\"none\"],unsupported:!1},\"aria-busy\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-checked\":{type:\"nmtoken\",values:[\"true\",\"false\",\"mixed\",\"undefined\"],unsupported:!1},\"aria-colcount\":{type:\"int\",unsupported:!1},\"aria-colindex\":{type:\"int\",unsupported:!1},\"aria-colspan\":{type:\"int\",unsupported:!1},\"aria-controls\":{type:\"idrefs\",allowEmpty:!0,unsupported:!1},\"aria-current\":{type:\"nmtoken\",allowEmpty:!0,values:[\"page\",\"step\",\"location\",\"date\",\"time\",\"true\",\"false\"],unsupported:!1},\"aria-describedby\":{type:\"idrefs\",allowEmpty:!0,unsupported:!1},\"aria-describedat\":{unsupported:!0,unstandardized:!0},\"aria-details\":{unsupported:!0},\"aria-disabled\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-dropeffect\":{type:\"nmtokens\",values:[\"copy\",\"move\",\"reference\",\"execute\",\"popup\",\"none\"],unsupported:!1},\"aria-errormessage\":{type:\"idref\",allowEmpty:!0,unsupported:!1},\"aria-expanded\":{type:\"nmtoken\",values:[\"true\",\"false\",\"undefined\"],unsupported:!1},\"aria-flowto\":{type:\"idrefs\",allowEmpty:!0,unsupported:!1},\"aria-grabbed\":{type:\"nmtoken\",values:[\"true\",\"false\",\"undefined\"],unsupported:!1},\"aria-haspopup\":{type:\"nmtoken\",allowEmpty:!0,values:[\"true\",\"false\",\"menu\",\"listbox\",\"tree\",\"grid\",\"dialog\"],unsupported:!1},\"aria-hidden\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-invalid\":{type:\"nmtoken\",allowEmpty:!0,values:[\"true\",\"false\",\"spelling\",\"grammar\"],unsupported:!1},\"aria-keyshortcuts\":{type:\"string\",allowEmpty:!0,unsupported:!1},\"aria-label\":{type:\"string\",allowEmpty:!0,unsupported:!1},\"aria-labelledby\":{type:\"idrefs\",allowEmpty:!0,unsupported:!1},\"aria-level\":{type:\"int\",unsupported:!1},\"aria-live\":{type:\"nmtoken\",values:[\"off\",\"polite\",\"assertive\"],unsupported:!1},\"aria-modal\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-multiline\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-multiselectable\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-orientation\":{type:\"nmtoken\",values:[\"horizontal\",\"vertical\"],unsupported:!1},\"aria-owns\":{type:\"idrefs\",allowEmpty:!0,unsupported:!1},\"aria-placeholder\":{type:\"string\",allowEmpty:!0,unsupported:!1},\"aria-posinset\":{type:\"int\",unsupported:!1},\"aria-pressed\":{type:\"nmtoken\",values:[\"true\",\"false\",\"mixed\",\"undefined\"],unsupported:!1},\"aria-readonly\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-relevant\":{type:\"nmtokens\",values:[\"additions\",\"removals\",\"text\",\"all\"],unsupported:!1},\"aria-required\":{type:\"boolean\",values:[\"true\",\"false\"],unsupported:!1},\"aria-roledescription\":{type:\"string\",allowEmpty:!0,unsupported:{exceptions:[\"button\",{nodeName:\"input\",properties:{type:[\"button\",\"checkbox\",\"image\",\"radio\",\"reset\",\"submit\"]}},\"img\",\"select\",\"summary\"]}},\"aria-rowcount\":{type:\"int\",unsupported:!1},\"aria-rowindex\":{type:\"int\",unsupported:!1},\"aria-rowspan\":{type:\"int\",unsupported:!1},\"aria-selected\":{type:\"nmtoken\",values:[\"true\",\"false\",\"undefined\"],unsupported:!1},\"aria-setsize\":{type:\"int\",unsupported:!1},\"aria-sort\":{type:\"nmtoken\",values:[\"ascending\",\"descending\",\"other\",\"none\"],unsupported:!1},\"aria-valuemax\":{type:\"decimal\",unsupported:!1},\"aria-valuemin\":{type:\"decimal\",unsupported:!1},\"aria-valuenow\":{type:\"decimal\",unsupported:!1},\"aria-valuetext\":{type:\"string\",unsupported:!1}},n.globalAttributes=[\"aria-atomic\",\"aria-busy\",\"aria-controls\",\"aria-current\",\"aria-describedby\",\"aria-disabled\",\"aria-dropeffect\",\"aria-flowto\",\"aria-grabbed\",\"aria-haspopup\",\"aria-hidden\",\"aria-invalid\",\"aria-keyshortcuts\",\"aria-label\",\"aria-labelledby\",\"aria-live\",\"aria-owns\",\"aria-relevant\",\"aria-roledescription\"],n.role={alert:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},alertdialog:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-modal\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"dialog\",\"section\"]},application:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"article\",\"audio\",\"embed\",\"iframe\",\"object\",\"section\",\"svg\",\"video\"]},article:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"article\"],unsupported:!1},banner:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"header\"],unsupported:!1,allowedElements:[\"section\"]},button:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-pressed\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:[\"button\",'input[type=\"button\"]','input[type=\"image\"]','input[type=\"reset\"]','input[type=\"submit\"]',\"summary\"],unsupported:!1,allowedElements:[{nodeName:\"a\",attributes:{href:t}}]},cell:{type:\"structure\",attributes:{allowed:[\"aria-colindex\",\"aria-colspan\",\"aria-rowindex\",\"aria-rowspan\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"row\"],implicit:[\"td\",\"th\"],unsupported:!1},checkbox:{type:\"widget\",attributes:{allowed:[\"aria-checked\",\"aria-required\",\"aria-readonly\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:['input[type=\"checkbox\"]'],unsupported:!1,allowedElements:[\"button\"]},columnheader:{type:\"structure\",attributes:{allowed:[\"aria-colindex\",\"aria-colspan\",\"aria-expanded\",\"aria-rowindex\",\"aria-rowspan\",\"aria-required\",\"aria-readonly\",\"aria-selected\",\"aria-sort\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"row\"],implicit:[\"th\"],unsupported:!1},combobox:{type:\"composite\",attributes:{allowed:[\"aria-autocomplete\",\"aria-required\",\"aria-activedescendant\",\"aria-orientation\",\"aria-errormessage\"],required:[\"aria-expanded\"]},owned:{all:[\"listbox\",\"textbox\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[{nodeName:\"input\",properties:{type:\"text\"}}]},command:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},complementary:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"aside\"],unsupported:!1,allowedElements:[\"section\"]},composite:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},contentinfo:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"footer\"],unsupported:!1,allowedElements:[\"section\"]},definition:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"dd\",\"dfn\"],unsupported:!1},dialog:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-modal\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"dialog\"],unsupported:!1,allowedElements:[\"section\"]},directory:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[\"ol\",\"ul\"]},document:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"body\"],unsupported:!1,allowedElements:[\"article\",\"embed\",\"iframe\",\"object\",\"section\",\"svg\"]},\"doc-abstract\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-acknowledgments\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-afterword\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-appendix\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-backlink\":{type:\"link\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[{nodeName:\"a\",attributes:{href:t}}]},\"doc-biblioentry\":{type:\"listitem\",attributes:{allowed:[\"aria-expanded\",\"aria-level\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:[\"doc-bibliography\"],unsupported:!1,allowedElements:[\"li\"]},\"doc-bibliography\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:{one:[\"doc-biblioentry\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-biblioref\":{type:\"link\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[{nodeName:\"a\",attributes:{href:t}}]},\"doc-chapter\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-colophon\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-conclusion\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-cover\":{type:\"img\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1},\"doc-credit\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-credits\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-dedication\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-endnote\":{type:\"listitem\",attributes:{allowed:[\"aria-expanded\",\"aria-level\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:[\"doc-endnotes\"],unsupported:!1,allowedElements:[\"li\"]},\"doc-endnotes\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:{one:[\"doc-endnote\"]},namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-epigraph\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1},\"doc-epilogue\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-errata\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-example\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"aside\",\"section\"]},\"doc-footnote\":{type:\"section\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"aside\",\"footer\",\"header\"]},\"doc-foreword\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-glossary\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:[\"term\",\"definition\"],namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"dl\"]},\"doc-glossref\":{type:\"link\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[{nodeName:\"a\",attributes:{href:t}}]},\"doc-index\":{type:\"navigation\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"nav\",\"section\"]},\"doc-introduction\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-noteref\":{type:\"link\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[{nodeName:\"a\",attributes:{href:t}}]},\"doc-notice\":{type:\"note\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-pagebreak\":{type:\"separator\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"hr\"]},\"doc-pagelist\":{type:\"navigation\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"nav\",\"section\"]},\"doc-part\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-preface\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-prologue\":{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-pullquote\":{type:\"none\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"aside\",\"section\"]},\"doc-qna\":{type:\"section\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},\"doc-subtitle\":{type:\"sectionhead\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:{nodeName:[\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"]}},\"doc-tip\":{type:\"note\",attributes:{allowed:[\"aria-expanded\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"aside\"]},\"doc-toc\":{type:\"navigation\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,namefrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"nav\",\"section\"]},feed:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:{one:[\"article\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"article\",\"aside\",\"section\"]},figure:{type:\"structure\",unsupported:!1},form:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"form\"],unsupported:!1},grid:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-colcount\",\"aria-level\",\"aria-multiselectable\",\"aria-readonly\",\"aria-rowcount\",\"aria-errormessage\"]},owned:{one:[\"rowgroup\",\"row\"]},nameFrom:[\"author\"],context:null,implicit:[\"table\"],unsupported:!1},gridcell:{type:\"widget\",attributes:{allowed:[\"aria-colindex\",\"aria-colspan\",\"aria-expanded\",\"aria-rowindex\",\"aria-rowspan\",\"aria-selected\",\"aria-readonly\",\"aria-required\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"row\"],implicit:[\"td\",\"th\"],unsupported:!1},group:{type:\"structure\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"details\",\"optgroup\"],unsupported:!1,allowedElements:[\"dl\",\"figcaption\",\"fieldset\",\"figure\",\"footer\",\"header\",\"ol\",\"ul\"]},heading:{type:\"structure\",attributes:{required:[\"aria-level\"],allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:[\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"],unsupported:!1},img:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"img\"],unsupported:!1,allowedElements:[\"embed\",\"iframe\",\"object\",\"svg\"]},input:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},landmark:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},link:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:[\"a[href]\"],unsupported:!1,allowedElements:[\"button\",{nodeName:\"input\",properties:{type:[\"image\",\"button\"]}}]},list:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:{all:[\"listitem\"]},nameFrom:[\"author\"],context:null,implicit:[\"ol\",\"ul\",\"dl\"],unsupported:!1},listbox:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-multiselectable\",\"aria-required\",\"aria-expanded\",\"aria-orientation\",\"aria-errormessage\"]},owned:{all:[\"option\"]},nameFrom:[\"author\"],context:null,implicit:[\"select\"],unsupported:!1,allowedElements:[\"ol\",\"ul\"]},listitem:{type:\"structure\",attributes:{allowed:[\"aria-level\",\"aria-posinset\",\"aria-setsize\",\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"list\"],implicit:[\"li\",\"dt\"],unsupported:!1},log:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},main:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"main\"],unsupported:!1,allowedElements:[\"article\",\"section\"]},marquee:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},math:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"math\"],unsupported:!1},menu:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-orientation\",\"aria-errormessage\"]},owned:{one:[\"menuitem\",\"menuitemradio\",\"menuitemcheckbox\"]},nameFrom:[\"author\"],context:null,implicit:['menu[type=\"context\"]'],unsupported:!1,allowedElements:[\"ol\",\"ul\"]},menubar:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-orientation\",\"aria-errormessage\"]},owned:{one:[\"menuitem\",\"menuitemradio\",\"menuitemcheckbox\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"ol\",\"ul\"]},menuitem:{type:\"widget\",attributes:{allowed:[\"aria-posinset\",\"aria-setsize\",\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"menu\",\"menubar\"],implicit:['menuitem[type=\"command\"]'],unsupported:!1,allowedElements:[\"button\",\"li\",{nodeName:\"iput\",properties:{type:[\"image\",\"button\"]}},{nodeName:\"a\",attributes:{href:t}}]},menuitemcheckbox:{type:\"widget\",attributes:{allowed:[\"aria-checked\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"menu\",\"menubar\"],implicit:['menuitem[type=\"checkbox\"]'],unsupported:!1,allowedElements:[{nodeName:[\"button\",\"li\"]},{nodeName:\"input\",properties:{type:[\"checkbox\",\"image\",\"button\"]}},{nodeName:\"a\",attributes:{href:t}}]},menuitemradio:{type:\"widget\",attributes:{allowed:[\"aria-checked\",\"aria-selected\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"menu\",\"menubar\"],implicit:['menuitem[type=\"radio\"]'],unsupported:!1,allowedElements:[{nodeName:[\"button\",\"li\"]},{nodeName:\"input\",properties:{type:[\"image\",\"button\",\"radio\"]}},{nodeName:\"a\",attributes:{href:t}}]},navigation:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"nav\"],unsupported:!1,allowedElements:[\"section\"]},none:{type:\"structure\",attributes:null,owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[{nodeName:[\"article\",\"aside\",\"dl\",\"embed\",\"figcaption\",\"fieldset\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"iframe\",\"li\",\"ol\",\"section\",\"ul\"]},{nodeName:\"img\",attributes:{alt:t}}]},note:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"aside\"]},option:{type:\"widget\",attributes:{allowed:[\"aria-selected\",\"aria-posinset\",\"aria-setsize\",\"aria-checked\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"listbox\"],implicit:[\"option\"],unsupported:!1,allowedElements:[{nodeName:[\"button\",\"li\"]},{nodeName:\"input\",properties:{type:[\"checkbox\",\"button\"]}},{nodeName:\"a\",attributes:{href:t}}]},presentation:{type:\"structure\",attributes:null,owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[{nodeName:[\"article\",\"aside\",\"dl\",\"embed\",\"figcaption\",\"fieldset\",\"figure\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"header\",\"iframe\",\"li\",\"ol\",\"section\",\"ul\"]},{nodeName:\"img\",attributes:{alt:t}}]},progressbar:{type:\"widget\",attributes:{allowed:[\"aria-valuetext\",\"aria-valuenow\",\"aria-valuemax\",\"aria-valuemin\",\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"progress\"],unsupported:!1},radio:{type:\"widget\",attributes:{allowed:[\"aria-selected\",\"aria-posinset\",\"aria-setsize\",\"aria-required\",\"aria-errormessage\",\"aria-checked\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:['input[type=\"radio\"]'],unsupported:!1,allowedElements:[{nodeName:[\"button\",\"li\"]},{nodeName:\"input\",properties:{type:[\"image\",\"button\"]}}]},radiogroup:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-required\",\"aria-expanded\",\"aria-readonly\",\"aria-errormessage\"]},owned:{all:[\"radio\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:{nodeName:[\"ol\",\"ul\"]}},range:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},region:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"section[aria-label]\",\"section[aria-labelledby]\",\"section[title]\"],unsupported:!1,allowedElements:{nodeName:[\"article\",\"aside\"]}},roletype:{type:\"abstract\",unsupported:!1},row:{type:\"structure\",attributes:{allowed:[\"aria-activedescendant\",\"aria-colindex\",\"aria-expanded\",\"aria-level\",\"aria-selected\",\"aria-rowindex\",\"aria-errormessage\"]},owned:{one:[\"cell\",\"columnheader\",\"rowheader\",\"gridcell\"]},nameFrom:[\"author\",\"contents\"],context:[\"rowgroup\",\"grid\",\"treegrid\",\"table\"],implicit:[\"tr\"],unsupported:!1},rowgroup:{type:\"structure\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-errormessage\"]},owned:{all:[\"row\"]},nameFrom:[\"author\",\"contents\"],context:[\"grid\",\"table\",\"treegrid\"],implicit:[\"tbody\",\"thead\",\"tfoot\"],unsupported:!1},rowheader:{type:\"structure\",attributes:{allowed:[\"aria-colindex\",\"aria-colspan\",\"aria-expanded\",\"aria-rowindex\",\"aria-rowspan\",\"aria-required\",\"aria-readonly\",\"aria-selected\",\"aria-sort\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"row\"],implicit:[\"th\"],unsupported:!1},scrollbar:{type:\"widget\",attributes:{required:[\"aria-controls\",\"aria-valuenow\"],allowed:[\"aria-valuetext\",\"aria-orientation\",\"aria-errormessage\",\"aria-valuemax\",\"aria-valuemin\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1},search:{type:\"landmark\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:{nodeName:[\"aside\",\"form\",\"section\"]}},searchbox:{type:\"widget\",attributes:{allowed:[\"aria-activedescendant\",\"aria-autocomplete\",\"aria-multiline\",\"aria-readonly\",\"aria-required\",\"aria-placeholder\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['input[type=\"search\"]'],unsupported:!1,allowedElements:{nodeName:\"input\",properties:{type:\"text\"}}},section:{nameFrom:[\"author\",\"contents\"],type:\"abstract\",unsupported:!1},sectionhead:{nameFrom:[\"author\",\"contents\"],type:\"abstract\",unsupported:!1},select:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1},separator:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-orientation\",\"aria-valuenow\",\"aria-valuemax\",\"aria-valuemin\",\"aria-valuetext\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"hr\"],unsupported:!1,allowedElements:[\"li\"]},slider:{type:\"widget\",attributes:{allowed:[\"aria-valuetext\",\"aria-orientation\",\"aria-readonly\",\"aria-errormessage\",\"aria-valuemax\",\"aria-valuemin\"],required:[\"aria-valuenow\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['input[type=\"range\"]'],unsupported:!1},spinbutton:{type:\"widget\",attributes:{allowed:[\"aria-valuetext\",\"aria-required\",\"aria-readonly\",\"aria-errormessage\",\"aria-valuemax\",\"aria-valuemin\"],required:[\"aria-valuenow\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['input[type=\"number\"]'],unsupported:!1,allowedElements:{nodeName:\"input\",properties:{type:\"text\"}}},status:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:[\"output\"],unsupported:!1,allowedElements:[\"section\"]},structure:{type:\"abstract\",unsupported:!1},switch:{type:\"widget\",attributes:{allowed:[\"aria-errormessage\"],required:[\"aria-checked\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,unsupported:!1,allowedElements:[\"button\",{nodeName:\"input\",properties:{type:[\"checkbox\",\"image\",\"button\"]}},{nodeName:\"a\",attributes:{href:t}}]},tab:{type:\"widget\",attributes:{allowed:[\"aria-selected\",\"aria-expanded\",\"aria-setsize\",\"aria-posinset\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"tablist\"],unsupported:!1,allowedElements:[{nodeName:[\"button\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"li\"]},{nodeName:\"input\",properties:{type:\"button\"}},{nodeName:\"a\",attributes:{href:t}}]},table:{type:\"structure\",attributes:{allowed:[\"aria-colcount\",\"aria-rowcount\",\"aria-errormessage\"]},owned:{one:[\"rowgroup\",\"row\"]},nameFrom:[\"author\"],context:null,implicit:[\"table\"],unsupported:!1},tablist:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-level\",\"aria-multiselectable\",\"aria-orientation\",\"aria-errormessage\"]},owned:{all:[\"tab\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"ol\",\"ul\"]},tabpanel:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"section\"]},term:{type:\"structure\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,implicit:[\"dt\"],unsupported:!1},textbox:{type:\"widget\",attributes:{allowed:[\"aria-activedescendant\",\"aria-autocomplete\",\"aria-multiline\",\"aria-readonly\",\"aria-required\",\"aria-placeholder\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['input[type=\"text\"]','input[type=\"email\"]','input[type=\"password\"]','input[type=\"tel\"]','input[type=\"url\"]',\"input:not([type])\",\"textarea\"],unsupported:!1},timer:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,unsupported:!1},toolbar:{type:\"structure\",attributes:{allowed:[\"aria-activedescendant\",\"aria-expanded\",\"aria-orientation\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\"],context:null,implicit:['menu[type=\"toolbar\"]'],unsupported:!1,allowedElements:[\"ol\",\"ul\"]},tooltip:{type:\"widget\",attributes:{allowed:[\"aria-expanded\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:null,unsupported:!1},tree:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-multiselectable\",\"aria-required\",\"aria-expanded\",\"aria-orientation\",\"aria-errormessage\"]},owned:{all:[\"treeitem\"]},nameFrom:[\"author\"],context:null,unsupported:!1,allowedElements:[\"ol\",\"ul\"]},treegrid:{type:\"composite\",attributes:{allowed:[\"aria-activedescendant\",\"aria-colcount\",\"aria-expanded\",\"aria-level\",\"aria-multiselectable\",\"aria-readonly\",\"aria-required\",\"aria-rowcount\",\"aria-orientation\",\"aria-errormessage\"]},owned:{one:[\"rowgroup\",\"row\"]},nameFrom:[\"author\"],context:null,unsupported:!1},treeitem:{type:\"widget\",attributes:{allowed:[\"aria-checked\",\"aria-selected\",\"aria-expanded\",\"aria-level\",\"aria-posinset\",\"aria-setsize\",\"aria-errormessage\"]},owned:null,nameFrom:[\"author\",\"contents\"],context:[\"group\",\"tree\"],unsupported:!1,allowedElements:[\"li\",{nodeName:\"a\",attributes:{href:t}}]},widget:{type:\"abstract\",unsupported:!1},window:{nameFrom:[\"author\"],type:\"abstract\",unsupported:!1}},n.elementsAllowedNoRole=[{nodeName:[\"base\",\"body\",\"caption\",\"col\",\"colgroup\",\"datalist\",\"dd\",\"details\",\"dt\",\"head\",\"html\",\"keygen\",\"label\",\"legend\",\"main\",\"map\",\"math\",\"meta\",\"meter\",\"noscript\",\"optgroup\",\"param\",\"picture\",\"progress\",\"script\",\"source\",\"style\",\"template\",\"textarea\",\"title\",\"track\"]},{nodeName:\"area\",attributes:{href:t}},{nodeName:\"input\",properties:{type:[\"color\",\"data\",\"datatime\",\"file\",\"hidden\",\"month\",\"number\",\"password\",\"range\",\"reset\",\"submit\",\"time\",\"week\"]}},{nodeName:\"input\",attributes:{list:e},properties:{type:[\"email\",\"search\",\"tel\",\"url\"]}},{nodeName:\"link\",attributes:{href:t}},{nodeName:\"menu\",attributes:{type:\"context\"}},{nodeName:\"menuitem\",attributes:{type:[\"command\",\"checkbox\",\"radio\"]}},{nodeName:\"select\",condition:function(e){return 1<Number(e.getAttribute(\"size\"))},properties:{multiple:!0}},{nodeName:[\"clippath\",\"cursor\",\"defs\",\"desc\",\"feblend\",\"fecolormatrix\",\"fecomponenttransfer\",\"fecomposite\",\"feconvolvematrix\",\"fediffuselighting\",\"fedisplacementmap\",\"fedistantlight\",\"fedropshadow\",\"feflood\",\"fefunca\",\"fefuncb\",\"fefuncg\",\"fefuncr\",\"fegaussianblur\",\"feimage\",\"femerge\",\"femergenode\",\"femorphology\",\"feoffset\",\"fepointlight\",\"fespecularlighting\",\"fespotlight\",\"fetile\",\"feturbulence\",\"filter\",\"hatch\",\"hatchpath\",\"lineargradient\",\"marker\",\"mask\",\"meshgradient\",\"meshpatch\",\"meshrow\",\"metadata\",\"mpath\",\"pattern\",\"radialgradient\",\"solidcolor\",\"stop\",\"switch\",\"view\"]}],n.elementsAllowedAnyRole=[{nodeName:\"a\",attributes:{href:e}},{nodeName:[\"abbr\",\"address\",\"canvas\",\"div\",\"p\",\"pre\",\"blockquote\",\"ins\",\"del\",\"output\",\"span\",\"table\",\"tbody\",\"thead\",\"tfoot\",\"td\",\"em\",\"strong\",\"small\",\"s\",\"cite\",\"q\",\"dfn\",\"abbr\",\"time\",\"code\",\"var\",\"samp\",\"kbd\",\"sub\",\"sup\",\"i\",\"b\",\"u\",\"mark\",\"ruby\",\"rt\",\"rp\",\"bdi\",\"bdo\",\"br\",\"wbr\",\"th\",\"tr\"]}],n.evaluateRoleForElement={A:function(e){var t=e.node,n=e.out;return\"http://www.w3.org/2000/svg\"===t.namespaceURI||(!t.href.length||n)},AREA:function(e){return!e.node.href},BUTTON:function(e){var t=e.node,n=e.role,r=e.out;return\"menu\"===t.getAttribute(\"type\")?\"menuitem\"===n:r},IMG:function(e){var t=e.node,n=e.out;return t.alt?!n:n},INPUT:function(e){var t=e.node,n=e.role,r=e.out;switch(t.type){case\"button\":case\"image\":return r;case\"checkbox\":return!(\"button\"!==n||!t.hasAttribute(\"aria-pressed\"))||r;case\"radio\":return\"menuitemradio\"===n;case\"text\":return\"combobox\"===n||\"searchbox\"===n||\"spinbutton\"===n;default:return!1}},LI:function(e){var t=e.node,n=e.out;return!axe.utils.matchesSelector(t,\"ol li, ul li\")||n},MENU:function(e){return\"context\"!==e.node.getAttribute(\"type\")},OPTION:function(e){var t=e.node;return!axe.utils.matchesSelector(t,\"select > option, datalist > option, optgroup > option\")},SELECT:function(e){var t=e.node,n=e.role;return!t.multiple&&t.size<=1&&\"menu\"===n},SVG:function(e){var t=e.node,n=e.out;return!(!t.parentNode||\"http://www.w3.org/2000/svg\"!==t.parentNode.namespaceURI)||n}},n.rolesOfType={widget:[\"button\",\"checkbox\",\"dialog\",\"gridcell\",\"heading\",\"link\",\"log\",\"marquee\",\"menuitem\",\"menuitemcheckbox\",\"menuitemradio\",\"option\",\"progressbar\",\"radio\",\"scrollbar\",\"slider\",\"spinbutton\",\"status\",\"switch\",\"tab\",\"tabpanel\",\"textbox\",\"timer\",\"tooltip\",\"tree\",\"treeitem\"]};var s={};commons.color=s;var h=commons.dom={},r={};function i(e,t){return i.fromDefinition(e,t)}commons.forms=r,commons.matches=i;var o=commons.table={},g=commons.text={EdgeFormDefaults:{}};commons.utils=axe.utils;l.arialabelText=function(e){return 1!==(e=e.actualNode||e).nodeType?\"\":e.getAttribute(\"aria-label\")||\"\"},l.arialabelledbyText=function(r,e){var a=1<arguments.length&&void 0!==e?e:{};return 1!==(r=r.actualNode||r).nodeType||a.inLabelledByContext||a.inControlContext?\"\":h.idrefs(r,\"aria-labelledby\").filter(function(e){return e}).reduce(function(e,t){var n=g.accessibleText(t,R({inLabelledByContext:!0,startNode:a.startNode||r},a));return e?\"\".concat(e,\" \").concat(n):n},\"\")},l.requiredAttr=function(e){var t=l.lookupTable.role[e];return t&&t.attributes&&t.attributes.required||[]},l.allowedAttr=function(e){var t=l.lookupTable.role[e],n=t&&t.attributes&&t.attributes.allowed||[],r=t&&t.attributes&&t.attributes.required||[];return n.concat(l.lookupTable.globalAttributes).concat(r)},l.validateAttr=function(e){return!!l.lookupTable.attributes[e]},l.getElementUnallowedRoles=function(t,e){var n=!(1<arguments.length&&void 0!==e)||e,r=t.nodeName.toUpperCase();if(!axe.utils.isHtmlElement(t))return[];var a=function(e){var t=[];if(!e)return t;if(e.hasAttribute(\"role\")){var n=axe.utils.tokenList(e.getAttribute(\"role\").toLowerCase());t=t.concat(n)}if(e.hasAttributeNS(\"http://www.idpf.org/2007/ops\",\"type\")){var r=axe.utils.tokenList(e.getAttributeNS(\"http://www.idpf.org/2007/ops\",\"type\").toLowerCase()).map(function(e){return\"doc-\".concat(e)});t=t.concat(r)}return t=t.filter(function(e){return axe.commons.aria.isValidRole(e)})}(t),o=axe.commons.aria.implicitRole(t);return a.filter(function(e){return(!n||e!==o)&&(!(n||\"row\"===e&&\"TR\"===r&&axe.utils.matchesSelector(t,'table[role=\"grid\"] > tr'))||!l.isAriaRoleAllowedOnElement(t,e))})},l.getOwnedVirtual=function(e){var t=e.actualNode,n=e.children;if(!t||!n)throw new Error(\"getOwnedVirtual requires a virtual node\");return h.idrefs(t,\"aria-owns\").reduce(function(e,t){if(t){var n=axe.utils.getNodeFromTree(t);e.push(n)}return e},n)},l.getRole=function(e,t){var n=1<arguments.length&&void 0!==t?t:{},r=n.noImplicit,a=n.fallback,o=n.abstracts,i=n.dpub;if(1!==(e=e.actualNode||e).nodeType)return null;var u=(e.getAttribute(\"role\")||\"\").trim().toLowerCase(),s=(a?axe.utils.tokenList(u):[u]).filter(function(e){return!(!i&&\"doc-\"===e.substr(0,4))&&l.isValidRole(e,{allowAbstract:o})})[0];return s||r?s||null:l.implicitRole(e)};var a,u=/^idrefs?$/;function c(e){return e.getPropertyValue(\"font-family\").split(/[,;]/g).map(function(e){return e.trim().toLowerCase()})}function d(e,t){var n={TD:[\"TR\",\"TBODY\"],TH:[\"TR\",\"THEAD\"],INPUT:[\"LABEL\"]},r=e.map(function(e){return e.nodeName}),a=e;for(var o in n)if(r.includes(o))for(var i in n[o])if(o.hasOwnProperty(i)){var u=axe.commons.dom.findUp(t,n[o][i]);if(u&&-1===e.indexOf(u))axe.commons.dom.visuallyOverlaps(t.getBoundingClientRect(),u)&&a.splice(r.indexOf(o)+1,0,u);t.nodeName===n[o][i]&&-1===r.indexOf(t.nodeName)&&a.splice(r.indexOf(o)+1,0,t)}return a}function m(e,t){var n=e.getClientRects()[0],r=h.shadowElementsFromPoint(n.left,n.top);if(r)for(var a=0;a<r.length;a++)if(r[a]!==e&&r[a]===t)return!0;return!1}l.isAccessibleRef=function(e){e=e.actualNode||e;var t=h.getRootNode(e);t=t.documentElement||t;var n=e.id;axe._cache.get(\"idRefs\")||(axe._cache.set(\"idRefs\",{}),function e(n,t){n.hasAttribute&&(\"LABEL\"===n.nodeName.toUpperCase()&&n.hasAttribute(\"for\")&&(axe._cache.get(\"idRefs\")[n.getAttribute(\"for\")]=!0),t.filter(function(e){return n.hasAttribute(e)}).forEach(function(e){var t=n.getAttribute(e);axe.utils.tokenList(t).forEach(function(e){axe._cache.get(\"idRefs\")[e]=!0})}));for(var r=0;r<n.children.length;r++)e(n.children[r],t)}(t,Object.keys(l.lookupTable.attributes).filter(function(e){var t=l.lookupTable.attributes[e].type;return u.test(t)})));return!0===axe._cache.get(\"idRefs\")[n]},l.isAriaRoleAllowedOnElement=function(e,t){var n=e.nodeName.toUpperCase(),r=axe.commons.aria.lookupTable;if(i(e,r.elementsAllowedNoRole))return!1;if(i(e,r.elementsAllowedAnyRole))return!0;var a=r.role[t];if(!a||!a.allowedElements)return!1;var o=i(e,a.allowedElements);return Object.keys(r.evaluateRoleForElement).includes(n)?r.evaluateRoleForElement[n]({node:e,role:t,out:o}):o},l.isUnsupportedRole=function(e){var t=l.lookupTable.role[e];return!!t&&t.unsupported},l.labelVirtual=function(e){var t,n=e.actualNode;return n.getAttribute(\"aria-labelledby\")&&(t=h.idrefs(n,\"aria-labelledby\").map(function(e){var t=axe.utils.getNodeFromTree(e);return t?g.visibleVirtual(t,!0):\"\"}).join(\" \").trim())?t:(t=(t=n.getAttribute(\"aria-label\"))&&g.sanitize(t).trim())?t:null},l.label=function(e){return e=axe.utils.getNodeFromTree(e),l.labelVirtual(e)},l.namedFromContents=function(e,t){var n=(1<arguments.length&&void 0!==t?t:{}).strict;if(1!==(e=e.actualNode||e).nodeType)return!1;var r=l.getRole(e),a=l.lookupTable.role[r];return!!(a&&a.nameFrom.includes(\"contents\")||\"TABLE\"===e.nodeName.toUpperCase())||!n&&(!a||[\"presentation\",\"none\"].includes(r))},l.isValidRole=function(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},n=t.allowAbstract,r=t.flagUnsupported,a=void 0!==r&&r,o=l.lookupTable.role[e],i=!!o&&o.unsupported;return!(!o||a&&i)&&(!!n||\"abstract\"!==o.type)},l.getRolesWithNameFromContents=function(){return Object.keys(l.lookupTable.role).filter(function(e){return l.lookupTable.role[e].nameFrom&&-1!==l.lookupTable.role[e].nameFrom.indexOf(\"contents\")})},l.getRolesByType=function(t){return Object.keys(l.lookupTable.role).filter(function(e){return l.lookupTable.role[e].type===t})},l.getRoleType=function(e){var t=l.lookupTable.role[e];return t&&t.type||null},l.requiredOwned=function(e){\"use strict\";var t=null,n=l.lookupTable.role[e];return n&&(t=axe.utils.clone(n.owned)),t},l.requiredContext=function(e){\"use strict\";var t=null,n=l.lookupTable.role[e];return n&&(t=axe.utils.clone(n.context)),t},l.implicitNodes=function(e){\"use strict\";var t=null,n=l.lookupTable.role[e];return n&&n.implicit&&(t=axe.utils.clone(n.implicit)),t},l.implicitRole=function(n){\"use strict\";var e=Object.keys(l.lookupTable.role).map(function(e){var t=l.lookupTable.role[e];return{name:e,implicit:t&&t.implicit}}).reduce(function(e,t){return t.implicit&&t.implicit.some(function(e){return axe.utils.matchesSelector(n,e)})&&e.push(t.name),e},[]);if(!e.length)return null;for(var r,t=axe.utils.getNodeAttributes(n),a=[],o=0,i=t.length;o<i;o++){var u=t[o];u.name.match(/^aria-/)&&a.push(u.name)}return(r=a,e.map(function(e){return{score:function(e){return l.allowedAttr(e).reduce(function(e,t){return e+(-1<r.indexOf(t)?1:0)},0)}(e),name:e}}).sort(function(e,t){return t.score-e.score}).map(function(e){return e.name})).shift()},l.validateAttrValue=function(e,t){\"use strict\";var n,r,a=e.getAttribute(t),o=l.lookupTable.attributes[t],i=h.getRootNode(e);if(!o)return!0;if(o.allowEmpty&&(!a||\"\"===a.trim()))return!0;switch(o.type){case\"boolean\":case\"nmtoken\":return\"string\"==typeof a&&o.values.includes(a.toLowerCase());case\"nmtokens\":return(r=axe.utils.tokenList(a)).reduce(function(e,t){return e&&o.values.includes(t)},0!==r.length);case\"idref\":return!(!a||!i.getElementById(a));case\"idrefs\":return(r=axe.utils.tokenList(a)).some(function(e){return i.getElementById(e)});case\"string\":return\"\"!==a.trim();case\"decimal\":return!(!(n=a.match(/^[-+]?([0-9]*)\\.?([0-9]*)$/))||!n[1]&&!n[2]);case\"int\":return/^[-+]?[0-9]+$/.test(a)}},s.centerPointOfRect=function(e){if(!(e.left>window.innerWidth)&&!(e.top>window.innerHeight))return{x:Math.min(Math.ceil(e.left+e.width/2),window.innerWidth-1),y:Math.min(Math.ceil(e.top+e.height/2),window.innerHeight-1)}},s.Color=function(e,t,n,r){this.red=e,this.green=t,this.blue=n,this.alpha=r,this.toHexString=function(){var e=Math.round(this.red).toString(16),t=Math.round(this.green).toString(16),n=Math.round(this.blue).toString(16);return\"#\"+(15.5<this.red?e:\"0\"+e)+(15.5<this.green?t:\"0\"+t)+(15.5<this.blue?n:\"0\"+n)};var a=/^rgb\\((\\d+), (\\d+), (\\d+)\\)$/,o=/^rgba\\((\\d+), (\\d+), (\\d+), (\\d*(\\.\\d+)?)\\)/;this.parseRgbString=function(e){if(\"transparent\"===e)return this.red=0,this.green=0,this.blue=0,void(this.alpha=0);var t=e.match(a);return t?(this.red=parseInt(t[1],10),this.green=parseInt(t[2],10),this.blue=parseInt(t[3],10),void(this.alpha=1)):(t=e.match(o))?(this.red=parseInt(t[1],10),this.green=parseInt(t[2],10),this.blue=parseInt(t[3],10),void(this.alpha=Math.round(100*parseFloat(t[4]))/100)):void 0},this.getRelativeLuminance=function(){var e=this.red/255,t=this.green/255,n=this.blue/255;return.2126*(e<=.03928?e/12.92:Math.pow((.055+e)/1.055,2.4))+.7152*(t<=.03928?t/12.92:Math.pow((.055+t)/1.055,2.4))+.0722*(n<=.03928?n/12.92:Math.pow((.055+n)/1.055,2.4))}},s.flattenColors=function(e,t){var n=e.alpha,r=(1-n)*t.red+n*e.red,a=(1-n)*t.green+n*e.green,o=(1-n)*t.blue+n*e.blue,i=e.alpha+t.alpha*(1-e.alpha);return new s.Color(r,a,o,i)},s.getContrast=function(e,t){if(!t||!e)return null;t.alpha<1&&(t=s.flattenColors(t,e));var n=e.getRelativeLuminance(),r=t.getRelativeLuminance();return(Math.max(r,n)+.05)/(Math.min(r,n)+.05)},s.hasValidContrastRatio=function(e,t,n,r){var a=s.getContrast(e,t),o=r&&Math.ceil(72*n)/96<14||!r&&Math.ceil(72*n)/96<18?4.5:3;return{isValid:o<a,contrastRatio:a,expectedContrastRatio:o}},s.elementHasImage=function(e,t){var n=e.nodeName.toUpperCase();if([\"IMG\",\"CANVAS\",\"OBJECT\",\"IFRAME\",\"VIDEO\",\"SVG\"].includes(n))return axe.commons.color.incompleteData.set(\"bgColor\",\"imgNode\"),!0;var r=(t=t||window.getComputedStyle(e)).getPropertyValue(\"background-image\"),a=\"none\"!==r;if(a){var o=/gradient/.test(r);axe.commons.color.incompleteData.set(\"bgColor\",o?\"bgGradient\":\"bgImage\")}return a},s.elementIsDistinct=function(e,t){var r=window.getComputedStyle(e);if(\"none\"!==r.getPropertyValue(\"background-image\"))return!0;if([\"border-bottom\",\"border-top\",\"outline\"].reduce(function(e,t){var n=new s.Color;return n.parseRgbString(r.getPropertyValue(t+\"-color\")),e||\"none\"!==r.getPropertyValue(t+\"-style\")&&0<parseFloat(r.getPropertyValue(t+\"-width\"))&&0!==n.alpha},!1))return!0;var n=window.getComputedStyle(t);if(c(r)[0]!==c(n)[0])return!0;var a=[\"text-decoration-line\",\"text-decoration-style\",\"font-weight\",\"font-style\",\"font-size\"].reduce(function(e,t){return e||r.getPropertyValue(t)!==n.getPropertyValue(t)},!1),o=r.getPropertyValue(\"text-decoration\");return o.split(\" \").length<3&&(a=a||o!==n.getPropertyValue(\"text-decoration\")),a},s.getBackgroundColor=function(r,e,t){var a=1<arguments.length&&void 0!==e?e:[];if(!0!==(2<arguments.length&&void 0!==t&&t)){var n=r.getBoundingClientRect().height-2>=2*window.innerHeight;r.scrollIntoView(n)}var o=[],i=s.getBackgroundStack(r);return(i||[]).some(function(e){var t=window.getComputedStyle(e),n=s.getOwnBackgroundColor(t);return function(e,t,n){var r=e!==t&&!h.visuallyContains(e,t)&&0!==n.alpha;r&&axe.commons.color.incompleteData.set(\"bgColor\",\"elmPartiallyObscured\");return r}(r,e,n)||s.elementHasImage(e,t)?(o=null,a.push(e),!0):0!==n.alpha&&(a.push(e),o.push(n),1===n.alpha)}),null===o||null===i?null:(o.push(new s.Color(255,255,255,1)),o.reduce(s.flattenColors))},s.getBackgroundStack=function(e){var t=s.filteredRectStack(e);if(null===t)return null;t=d(t,e);var n=(t=function(e){var t=e.indexOf(document.body),n=e;(1<t||-1===t)&&!s.elementHasImage(document.documentElement)&&0===s.getOwnBackgroundColor(window.getComputedStyle(document.documentElement)).alpha&&(1<t&&n.splice(t,1),n.splice(e.indexOf(document.documentElement),1),n.push(document.body));return n}(t=h.reduceToElementsBelowFloating(t,e))).indexOf(e);return.99<=function(e,t,n){var r=0;if(0<e)for(var a=e-1;0<=a;a--){var o=t[a],i=window.getComputedStyle(o),u=s.getOwnBackgroundColor(i);u.alpha&&m(n,o)?r+=u.alpha:t.splice(a,1)}return r}(n,t,e)?(axe.commons.color.incompleteData.set(\"bgColor\",\"bgOverlap\"),null):-1!==n?t:null},s.filteredRectStack=function(a){var o=s.getRectStack(a);if(o&&1===o.length)return o[0];if(o&&1<o.length){var i,u=o.shift();return d(u,a),o.forEach(function(e,t){if(0!==t){var n=o[t-1],r=o[t];i=n.every(function(e,t){return e===r[t]})||u.includes(a)}}),i?o[0]:(axe.commons.color.incompleteData.set(\"bgColor\",\"elmPartiallyObscuring\"),null)}return axe.commons.color.incompleteData.set(\"bgColor\",\"outsideViewport\"),null},s.getRectStack=function(e){var t=axe.commons.color.centerPointOfRect(e.getBoundingClientRect());if(!t)return null;var n=h.shadowElementsFromPoint(t.x,t.y),r=Array.from(e.getClientRects());if(!r||r.length<=1)return[n];var a=r.filter(function(e){return e.width&&0<e.width}).map(function(e){var t=axe.commons.color.centerPointOfRect(e);if(t)return h.shadowElementsFromPoint(t.x,t.y)});return a.some(function(e){return void 0===e})?null:(a.splice(0,0,n),a)},h.isOpaque=function(e){var t=window.getComputedStyle(e);return s.elementHasImage(e,t)||1===s.getOwnBackgroundColor(t).alpha},s.getForegroundColor=function(e,t){var n=window.getComputedStyle(e),r=new s.Color;r.parseRgbString(n.getPropertyValue(\"color\"));var a=n.getPropertyValue(\"opacity\");if(r.alpha=r.alpha*a,1===r.alpha)return r;var o=s.getBackgroundColor(e,[],t);if(null!==o)return s.flattenColors(r,o);var i=axe.commons.color.incompleteData.get(\"bgColor\");return axe.commons.color.incompleteData.set(\"fgColor\",i),null},s.getOwnBackgroundColor=function(e){var t=new s.Color;if(t.parseRgbString(e.getPropertyValue(\"background-color\")),0!==t.alpha){var n=e.getPropertyValue(\"opacity\");t.alpha=t.alpha*n}return t},s.incompleteData=(a={},{set:function(e,t){if(\"string\"!=typeof e)throw new Error(\"Incomplete data: key must be a string\");return t&&(a[e]=t),a[e]},get:function(e){return a[e]},clear:function(){a={}}}),h.reduceToElementsBelowFloating=function(e,t){var n,r,a,o=[\"fixed\",\"sticky\"],i=[],u=!1;for(n=0;n<e.length;++n)(r=e[n])===t&&(u=!0),a=window.getComputedStyle(r),u||-1===o.indexOf(a.position)?i.push(r):i=[];return i},h.findElmsInContext=function(e){var t,n=e.context,r=e.value,a=e.attr,o=e.elm,i=void 0===o?\"\":o,u=axe.utils.escapeSelector(r);return t=9===n.nodeType||11===n.nodeType?n:h.getRootNode(n),Array.from(t.querySelectorAll(i+\"[\"+a+\"=\"+u+\"]\"))},h.findUp=function(e,t){return h.findUpVirtual(axe.utils.getNodeFromTree(e),t)},h.findUpVirtual=function(e,t){var n;if(n=e.actualNode,!e.shadowId&&\"function\"==typeof e.actualNode.closest){var r=e.actualNode.closest(t);return r||null}for(;(n=n.assignedSlot?n.assignedSlot:n.parentNode)&&11===n.nodeType&&(n=n.host),n&&!axe.utils.matchesSelector(n,t)&&n!==document.documentElement;);return n&&axe.utils.matchesSelector(n,t)?n:null},h.getComposedParent=function e(t){if(t.assignedSlot)return e(t.assignedSlot);if(t.parentNode){var n=t.parentNode;if(1===n.nodeType)return n;if(n.host)return n.host}return null},h.getElementByReference=function(e,t){var n=e.getAttribute(t);if(!n)return null;\"#\"===n.charAt(0)?n=decodeURIComponent(n.substring(1)):\"/#\"===n.substr(0,2)&&(n=decodeURIComponent(n.substring(2)));var r=document.getElementById(n);return r||((r=document.getElementsByName(n)).length?r[0]:null)},h.getElementCoordinates=function(e){\"use strict\";var t=h.getScrollOffset(document),n=t.left,r=t.top,a=e.getBoundingClientRect();return{top:a.top+r,right:a.right+n,bottom:a.bottom+r,left:a.left+n,width:a.right-a.left,height:a.bottom-a.top}},h.getRootNode=axe.utils.getRootNode,h.getScrollOffset=function(e){\"use strict\";if(!e.nodeType&&e.document&&(e=e.document),9!==e.nodeType)return{left:e.scrollLeft,top:e.scrollTop};var t=e.documentElement,n=e.body;return{left:t&&t.scrollLeft||n&&n.scrollLeft||0,top:t&&t.scrollTop||n&&n.scrollTop||0}},h.getTabbableElements=function(e){return axe.utils.querySelectorAll(e,\"*\").filter(function(e){var t=e.isFocusable,n=e.actualNode.getAttribute(\"tabindex\");return(n=n&&!isNaN(parseInt(n,10))?parseInt(n):null)?t&&0<=n:t})},h.getViewportSize=function(e){\"use strict\";var t,n=e.document,r=n.documentElement;return e.innerWidth?{width:e.innerWidth,height:e.innerHeight}:r?{width:r.clientWidth,height:r.clientHeight}:{width:(t=n.body).clientWidth,height:t.clientHeight}};var p=[\"HEAD\",\"TITLE\",\"TEMPLATE\",\"SCRIPT\",\"STYLE\",\"IFRAME\",\"OBJECT\",\"VIDEO\",\"AUDIO\",\"NOSCRIPT\"];function f(e){return e.disabled||h.isHiddenWithCSS(e)&&\"AREA\"!==e.nodeName.toUpperCase()}h.hasContentVirtual=function(e,t,n){return function(e){if(!p.includes(e.actualNode.nodeName.toUpperCase()))return e.children.some(function(e){var t=e.actualNode;return 3===t.nodeType&&t.nodeValue.trim()})}(e)||h.isVisualContent(e.actualNode)||!!n||!!l.labelVirtual(e)||!t&&e.children.some(function(e){return 1===e.actualNode.nodeType&&h.hasContentVirtual(e)})},h.hasContent=function(e,t,n){return e=axe.utils.getNodeFromTree(e),h.hasContentVirtual(e,t,n)},h.idrefs=function(e,t){\"use strict\";var n,r,a=h.getRootNode(e),o=[],i=e.getAttribute(t);if(i)for(n=0,r=(i=axe.utils.tokenList(i)).length;n<r;n++)o.push(a.getElementById(i[n]));return o},h.isFocusable=function(e){\"use strict\";if(f(e))return!1;if(h.isNativelyFocusable(e))return!0;var t=e.getAttribute(\"tabindex\");return!(!t||isNaN(parseInt(t,10)))},h.isNativelyFocusable=function(e){\"use strict\";if(!e||f(e))return!1;switch(e.nodeName.toUpperCase()){case\"A\":case\"AREA\":if(e.href)return!0;break;case\"INPUT\":return\"hidden\"!==e.type;case\"TEXTAREA\":case\"SELECT\":case\"DETAILS\":case\"BUTTON\":return!0}return!1},h.insertedIntoFocusOrder=function(e){return-1<e.tabIndex&&h.isFocusable(e)&&!h.isNativelyFocusable(e)},h.isHiddenWithCSS=function(e,t){if(9===e.nodeType)return!1;if(11===e.nodeType&&(e=e.host),[\"STYLE\",\"SCRIPT\"].includes(e.nodeName.toUpperCase()))return!1;var n=window.getComputedStyle(e,null);if(!n)throw new Error(\"Style does not exist for the given element.\");if(\"none\"===n.getPropertyValue(\"display\"))return!0;var r=[\"hidden\",\"collapse\"],a=n.getPropertyValue(\"visibility\");if(r.includes(a)&&!t)return!0;if(r.includes(a)&&t&&r.includes(t))return!0;var o=h.getComposedParent(e);return!(!o||r.includes(a))&&h.isHiddenWithCSS(o,a)},h.isHTML5=function(e){var t=e.doctype;return null!==t&&(\"html\"===t.name&&!t.publicId&&!t.systemId)};var b=[\"block\",\"list-item\",\"table\",\"flex\",\"grid\",\"inline-block\"];function y(e){var t=window.getComputedStyle(e).getPropertyValue(\"display\");return b.includes(t)||\"table-\"===t.substr(0,6)}h.isInTextBlock=function(n){if(y(n))return!1;var e=function(e){for(var t=h.getComposedParent(e);t&&!y(t);)t=h.getComposedParent(t);return axe.utils.getNodeFromTree(t)}(n),r=\"\",a=\"\",o=0;return function t(e,n){!1!==n(e.actualNode)&&e.children.forEach(function(e){return t(e,n)})}(e,function(e){if(2===o)return!1;if(3===e.nodeType&&(r+=e.nodeValue),1===e.nodeType){var t=(e.nodeName||\"\").toUpperCase();if([\"BR\",\"HR\"].includes(t))0===o?a=r=\"\":o=2;else{if(\"none\"===e.style.display||\"hidden\"===e.style.overflow||![\"\",null,\"none\"].includes(e.style.float)||![\"\",null,\"relative\"].includes(e.style.position))return!1;if(\"A\"===t&&e.href||\"link\"===(e.getAttribute(\"role\")||\"\").toLowerCase())return e===n&&(o=1),a+=e.textContent,!1}}}),r=axe.commons.text.sanitize(r),a=axe.commons.text.sanitize(a),r.length>a.length},h.isNode=function(e){\"use strict\";return e instanceof Node},h.isOffscreen=function(e){var t,n=document.documentElement,r=window.getComputedStyle(e),a=window.getComputedStyle(document.body||n).getPropertyValue(\"direction\"),o=h.getElementCoordinates(e);if(o.bottom<0&&(function(e,t){for(e=h.getComposedParent(e);e&&\"html\"!==e.nodeName.toLowerCase();){if(e.scrollTop&&0<=(t+=e.scrollTop))return!1;e=h.getComposedParent(e)}return!0}(e,o.bottom)||\"absolute\"===r.position))return!0;if(0===o.left&&0===o.right)return!1;if(\"ltr\"===a){if(o.right<=0)return!0}else if(t=Math.max(n.scrollWidth,h.getViewportSize(window).width),o.left>=t)return!0;return!1};var v=/^\\/?#[^/!]/;h.isSkipLink=function(e){return!!v.test(e.getAttribute(\"href\"))&&(void 0!==axe._cache.get(\"firstPageLink\")?t=axe._cache.get(\"firstPageLink\"):(t=axe.utils.querySelectorAll(axe._tree,'a:not([href^=\"#\"]):not([href^=\"/#\"]):not([href^=\"javascript\"])')[0],axe._cache.set(\"firstPageLink\",t||null)),!t||e.compareDocumentPosition(t.actualNode)===e.DOCUMENT_POSITION_FOLLOWING);var t},h.isVisible=function(e,t,n){\"use strict\";var r=axe.utils.getNodeFromTree(e),a=\"_isVisible\"+(t?\"ScreenReader\":\"\");if(9===e.nodeType)return!0;if(11===e.nodeType&&(e=e.host),r&&void 0!==r[a])return r[a];var o=window.getComputedStyle(e,null);if(null===o)return!1;var i=e.nodeName.toUpperCase();if(\"none\"===o.getPropertyValue(\"display\")||[\"STYLE\",\"SCRIPT\",\"NOSCRIPT\",\"TEMPLATE\"].includes(i)||!t&&function(e){\"use strict\";var t=e.match(/rect\\s*\\(([0-9]+)px,?\\s*([0-9]+)px,?\\s*([0-9]+)px,?\\s*([0-9]+)px\\s*\\)/);return!(!t||5!==t.length)&&(t[3]-t[1]<=0&&t[2]-t[4]<=0)}(o.getPropertyValue(\"clip\"))||!n&&(\"hidden\"===o.getPropertyValue(\"visibility\")||!t&&h.isOffscreen(e))||t&&\"true\"===e.getAttribute(\"aria-hidden\"))return!1;var u=e.assignedSlot?e.assignedSlot:e.parentNode,s=!1;return u&&(s=h.isVisible(u,t,!0)),r&&(r[a]=s),s};var D=[\"checkbox\",\"img\",\"radio\",\"range\",\"slider\",\"spinbutton\",\"textbox\"];h.isVisualContent=function(e){var t=e.getAttribute(\"role\");if(t)return-1!==D.indexOf(t);switch(e.nodeName.toUpperCase()){case\"IMG\":case\"IFRAME\":case\"OBJECT\":case\"VIDEO\":case\"AUDIO\":case\"CANVAS\":case\"SVG\":case\"MATH\":case\"BUTTON\":case\"SELECT\":case\"TEXTAREA\":case\"KEYGEN\":case\"PROGRESS\":case\"METER\":return!0;case\"INPUT\":return\"hidden\"!==e.type;default:return!1}},h.shadowElementsFromPoint=function(r,a){var t=2<arguments.length&&void 0!==arguments[2]?arguments[2]:document,o=3<arguments.length&&void 0!==arguments[3]?arguments[3]:0;if(999<o)throw new Error(\"Infinite loop detected\");return Array.from(t.elementsFromPoint(r,a)).filter(function(e){return h.getRootNode(e)===t}).reduce(function(e,t){if(axe.utils.isShadowRoot(t)){var n=h.shadowElementsFromPoint(r,a,t.shadowRoot,o+1);(e=e.concat(n)).length&&axe.commons.dom.visuallyContains(e[0],t)&&e.push(t)}else e.push(t);return e},[])},h.visuallyContains=function(e,t){var n=e.getBoundingClientRect(),r=n.top+.01,a=n.bottom-.01,o=n.left+.01,i=n.right-.01,u=t.getBoundingClientRect(),s=u.top,l=u.left,c=s-t.scrollTop,d=s-t.scrollTop+t.scrollHeight,m=l-t.scrollLeft,p=l-t.scrollLeft+t.scrollWidth,f=window.getComputedStyle(t);return\"inline\"===f.getPropertyValue(\"display\")||!(o<m&&o<u.left||r<c&&r<u.top||p<i&&i>u.right||d<a&&a>u.bottom)&&(!(i>u.right||a>u.bottom)||(\"scroll\"===f.overflow||\"auto\"===f.overflow||\"hidden\"===f.overflow||t instanceof HTMLBodyElement||t instanceof HTMLHtmlElement))},h.visuallyOverlaps=function(e,t){var n=t.getBoundingClientRect(),r=n.top,a=n.left,o=r-t.scrollTop,i=r-t.scrollTop+t.scrollHeight,u=a-t.scrollLeft,s=a-t.scrollLeft+t.scrollWidth;if(e.left>s&&e.left>n.right||e.top>i&&e.top>n.bottom||e.right<u&&e.right<n.left||e.bottom<o&&e.bottom<n.top)return!1;var l=window.getComputedStyle(t);return!(e.left>n.right||e.top>n.bottom)||(\"scroll\"===l.overflow||\"auto\"===l.overflow||t instanceof HTMLBodyElement||t instanceof HTMLHtmlElement)},r.isAriaCombobox=function(e){return\"combobox\"===axe.commons.aria.getRole(e,{noImplicit:!0})},r.isAriaListbox=function(e){return\"listbox\"===axe.commons.aria.getRole(e,{noImplicit:!0})};var w=[\"progressbar\",\"scrollbar\",\"slider\",\"spinbutton\"];r.isAriaRange=function(e){var t=axe.commons.aria.getRole(e,{noImplicit:!0});return w.includes(t)},r.isAriaTextbox=function(e){return\"textbox\"===axe.commons.aria.getRole(e,{noImplicit:!0})},r.isNativeSelect=function(e){return\"SELECT\"===e.nodeName.toUpperCase()};var k=[\"button\",\"checkbox\",\"color\",\"file\",\"hidden\",\"image\",\"password\",\"radio\",\"reset\",\"submit\"];r.isNativeTextbox=function(e){var t=e.nodeName.toUpperCase();return\"TEXTAREA\"===t||\"INPUT\"===t&&!k.includes(e.type)},i.attributes=function(t,e){return t=t.actualNode||t,i.fromFunction(function(e){return t.getAttribute(e)},e)},i.condition=function(e,t){return!!t(e)};var x,E=[\"nodeName\",\"attributes\",\"properties\",\"condition\"];function C(e){var t=e.actualNode;return 3!==t.nodeType?\"\":t.textContent}i.fromDefinition=function(r,a){return r=r.actualNode||r,Array.isArray(a)?a.some(function(e){return i(r,e)}):\"string\"==typeof a?axe.utils.matchesSelector(r,a):Object.keys(a).every(function(e){if(!E.includes(e))throw new Error('Unknown matcher type \"'.concat(e,'\"'));var t=i[e],n=a[e];return t(r,n)})},i.fromFunction=function(t,n){if(\"object\"!==S(n)||Array.isArray(n)||n instanceof RegExp)throw new Error(\"Expect matcher to be an object\");return Object.keys(n).every(function(e){return i.fromPrimative(t(e),n[e])})},i.fromPrimative=function(e,t){var n=S(t);return Array.isArray(t)&&void 0!==e?t.includes(e):\"function\"===n?!!t(e):t instanceof RegExp?t.test(e):t===e},i.nodeName=function(e,t,n){var r=(2<arguments.length&&void 0!==n?n:{}).isXHTML;if(e=e.actualNode||e,void 0===r){if(\"string\"==typeof t)return axe.utils.matchesSelector(e,t);void 0===x&&(x=axe.utils.isXHTML(e.ownerDocument)),r=x}var a=r?e.nodeName:e.nodeName.toLowerCase();return i.fromPrimative(a,t)},i.properties=function(t,e){return t=t.actualNode||t,i.fromFunction(function(e){return t[e]},e)},o.getAllCells=function(e){var t,n,r,a,o=[];for(t=0,r=e.rows.length;t<r;t++)for(n=0,a=e.rows[t].cells.length;n<a;n++)o.push(e.rows[t].cells[n]);return o},o.getCellPosition=function(e,t){var n,r;for(t=t||o.toGrid(h.findUp(e,\"table\")),n=0;n<t.length;n++)if(t[n]&&-1!==(r=t[n].indexOf(e)))return{x:r,y:n}},o.getHeaders=function(e){if(e.hasAttribute(\"headers\"))return commons.dom.idrefs(e,\"headers\");var t=commons.table.toGrid(commons.dom.findUp(e,\"table\")),n=commons.table.getCellPosition(e,t),r=o.traverse(\"left\",n,t).filter(function(e){return o.isRowHeader(e)}),a=o.traverse(\"up\",n,t).filter(function(e){return o.isColumnHeader(e)});return[].concat(r,a).reverse()},o.getScope=function(e){var t=e.getAttribute(\"scope\"),n=e.getAttribute(\"role\");if(e instanceof Element==!1||-1===[\"TD\",\"TH\"].indexOf(e.nodeName.toUpperCase()))throw new TypeError(\"Expected TD or TH element\");if(\"columnheader\"===n)return\"col\";if(\"rowheader\"===n)return\"row\";if(\"col\"===t||\"row\"===t)return t;if(\"TH\"!==e.nodeName.toUpperCase())return!1;var r=o.toGrid(h.findUp(e,\"table\")),a=o.getCellPosition(e);return r[a.y].reduce(function(e,t){return e&&\"TH\"===t.nodeName.toUpperCase()},!0)?\"col\":r.map(function(e){return e[a.x]}).reduce(function(e,t){return e&&t&&\"TH\"===t.nodeName.toUpperCase()},!0)?\"row\":\"auto\"},o.isColumnHeader=function(e){return-1!==[\"col\",\"auto\"].indexOf(o.getScope(e))},o.isDataCell=function(e){if(!e.children.length&&!e.textContent.trim())return!1;var t=e.getAttribute(\"role\");return axe.commons.aria.isValidRole(t)?[\"cell\",\"gridcell\"].includes(t):\"TD\"===e.nodeName.toUpperCase()},o.isDataTable=function(e){var t=(e.getAttribute(\"role\")||\"\").toLowerCase();if((\"presentation\"===t||\"none\"===t)&&!h.isFocusable(e))return!1;if(\"true\"===e.getAttribute(\"contenteditable\")||h.findUp(e,'[contenteditable=\"true\"]'))return!0;if(\"grid\"===t||\"treegrid\"===t||\"table\"===t)return!0;if(\"landmark\"===commons.aria.getRoleType(t))return!0;if(\"0\"===e.getAttribute(\"datatable\"))return!1;if(e.getAttribute(\"summary\"))return!0;if(e.tHead||e.tFoot||e.caption)return!0;for(var n=0,r=e.children.length;n<r;n++)if(\"COLGROUP\"===e.children[n].nodeName.toUpperCase())return!0;for(var a,o,i=0,u=e.rows.length,s=!1,l=0;l<u;l++)for(var c=0,d=(a=e.rows[l]).cells.length;c<d;c++){if(\"TH\"===(o=a.cells[c]).nodeName.toUpperCase())return!0;if(s||o.offsetWidth===o.clientWidth&&o.offsetHeight===o.clientHeight||(s=!0),o.getAttribute(\"scope\")||o.getAttribute(\"headers\")||o.getAttribute(\"abbr\"))return!0;if([\"columnheader\",\"rowheader\"].includes((o.getAttribute(\"role\")||\"\").toLowerCase()))return!0;if(1===o.children.length&&\"ABBR\"===o.children[0].nodeName.toUpperCase())return!0;i++}if(e.getElementsByTagName(\"table\").length)return!1;if(u<2)return!1;var m,p,f=e.rows[Math.ceil(u/2)];if(1===f.cells.length&&1===f.cells[0].colSpan)return!1;if(5<=f.cells.length)return!0;if(s)return!0;for(l=0;l<u;l++){if(a=e.rows[l],m&&m!==window.getComputedStyle(a).getPropertyValue(\"background-color\"))return!0;if(m=window.getComputedStyle(a).getPropertyValue(\"background-color\"),p&&p!==window.getComputedStyle(a).getPropertyValue(\"background-image\"))return!0;p=window.getComputedStyle(a).getPropertyValue(\"background-image\")}return 20<=u||!(h.getElementCoordinates(e).width>.95*h.getViewportSize(window).width)&&(!(i<10)&&!e.querySelector(\"object, embed, iframe, applet\"))},o.isHeader=function(e){if(o.isColumnHeader(e)||o.isRowHeader(e))return!0;if(e.getAttribute(\"id\")){var t=axe.utils.escapeSelector(e.getAttribute(\"id\"));return!!document.querySelector('[headers~=\"'.concat(t,'\"]'))}return!1},o.isRowHeader=function(e){return[\"row\",\"auto\"].includes(o.getScope(e))},o.toGrid=function(e){for(var t=[],n=e.rows,r=0,a=n.length;r<a;r++){var o=n[r].cells;t[r]=t[r]||[];for(var i=0,u=0,s=o.length;u<s;u++)for(var l=0;l<o[u].colSpan;l++){for(var c=0;c<o[u].rowSpan;c++){for(t[r+c]=t[r+c]||[];t[r+c][i];)i++;t[r+c][i]=o[u]}i++}}return t},o.toArray=o.toGrid,o.traverse=function(e,t,n,r){if(Array.isArray(t)&&(r=n,n=t,t={x:0,y:0}),\"string\"==typeof e)switch(e){case\"left\":e={x:-1,y:0};break;case\"up\":e={x:0,y:-1};break;case\"right\":e={x:1,y:0};break;case\"down\":e={x:0,y:1}}return function e(t,n,r,a){var o,i=r[n.y]?r[n.y][n.x]:void 0;return i?\"function\"==typeof a&&!0===(o=a(i,n,r))?[i]:((o=e(t,{x:n.x+t.x,y:n.y+t.y},r,a)).unshift(i),o):[]}(e,{x:t.x+e.x,y:t.y+e.y},n,r)},g.accessibleText=function(e,t){var n=axe.utils.getNodeFromTree(e);return g.accessibleTextVirtual(n,t)},g.accessibleTextVirtual=function(n,e){var r=1<arguments.length&&void 0!==e?e:{},t=n.actualNode;if(r=function(e,t){var n=e.actualNode;t.startNode||(t=R({startNode:e},t));1===n.nodeType&&t.inLabelledByContext&&void 0===t.includeHidden&&(t=R({includeHidden:!h.isVisible(n,!0)},t));return t}(n,r),function(e,t){var n=e.actualNode;if(1!==n.nodeType||t.includeHidden)return!1;return!h.isVisible(n,!0)}(n,r))return\"\";var a=[l.arialabelledbyText,l.arialabelText,g.nativeTextAlternative,g.formControlValue,g.subtreeText,C,g.titleText].reduce(function(e,t){return\"\"!==e?e:t(n,r)},\"\");return r.startNode===n&&(a=g.sanitize(a)),r.debug&&axe.log(a||\"{empty-value}\",t,r),a},g.accessibleTextVirtual.alreadyProcessed=function(e,t){return t.processed=t.processed||[],!!t.processed.includes(e)||(t.processed.push(e),!1)};var A=[\"textbox\",\"progressbar\",\"scrollbar\",\"slider\",\"spinbutton\",\"combobox\",\"listbox\"];g.formControlValueMethods={nativeTextboxValue:function(e){if(e=e.actualNode||e,axe.commons.forms.isNativeTextbox(e))return e.value||\"\";return\"\"},nativeSelectValue:function(e){return e=e.actualNode||e,axe.commons.forms.isNativeSelect(e)&&Array.from(e.options).filter(function(e){return e.selected}).map(function(e){return e.text}).join(\" \")||\"\"},ariaTextboxValue:function(e){var t=e.actualNode;if(!axe.commons.forms.isAriaTextbox(t))return\"\";return h.isHiddenWithCSS(t)?t.textContent:g.visibleVirtual(e,!0)},ariaListboxValue:function(e,t){var n=e.actualNode;if(!axe.commons.forms.isAriaListbox(n))return\"\";var r=l.getOwnedVirtual(e).filter(function(e){return\"option\"===l.getRole(e)&&\"true\"===e.actualNode.getAttribute(\"aria-selected\")});return 0!==r.length?axe.commons.text.accessibleTextVirtual(r[0],t):\"\"},ariaComboboxValue:function(e,t){var n,r=e.actualNode;return axe.commons.forms.isAriaCombobox(r)&&(n=l.getOwnedVirtual(e).filter(function(e){return\"listbox\"===l.getRole(e)})[0])?g.formControlValueMethods.ariaListboxValue(n,t):\"\"},ariaRangeValue:function(e){if(e=e.actualNode||e,!axe.commons.forms.isAriaRange(e)||!e.hasAttribute(\"aria-valuenow\"))return\"\";var t=+e.getAttribute(\"aria-valuenow\");return isNaN(t)?\"0\":String(t)}},g.formControlValue=function(n,e){var r=1<arguments.length&&void 0!==e?e:{},t=n.actualNode,a=g.unsupported.accessibleNameFromFieldValue||[],o=l.getRole(t);if(r.startNode===n||!A.includes(o)||a.includes(o))return\"\";var i=Object.keys(g.formControlValueMethods).map(function(e){return g.formControlValueMethods[e]}).reduce(function(e,t){return e||t(n,r)},\"\");return r.debug&&axe.log(i||\"{empty-value}\",t,r),i},g.isHumanInterpretable=function(e){if(!e.length)return 0;if([\"x\",\"i\"].includes(e))return 0;var t=g.removeUnicode(e,{emoji:!0,nonBmp:!0,punctuations:!0});return g.sanitize(t)?1:0};g.autocomplete={stateTerms:[\"on\",\"off\"],standaloneTerms:[\"name\",\"honorific-prefix\",\"given-name\",\"additional-name\",\"family-name\",\"honorific-suffix\",\"nickname\",\"username\",\"new-password\",\"current-password\",\"organization-title\",\"organization\",\"street-address\",\"address-line1\",\"address-line2\",\"address-line3\",\"address-level4\",\"address-level3\",\"address-level2\",\"address-level1\",\"country\",\"country-name\",\"postal-code\",\"cc-name\",\"cc-given-name\",\"cc-additional-name\",\"cc-family-name\",\"cc-number\",\"cc-exp\",\"cc-exp-month\",\"cc-exp-year\",\"cc-csc\",\"cc-type\",\"transaction-currency\",\"transaction-amount\",\"language\",\"bday\",\"bday-day\",\"bday-month\",\"bday-year\",\"sex\",\"url\",\"photo\"],qualifiers:[\"home\",\"work\",\"mobile\",\"fax\",\"pager\"],qualifiedTerms:[\"tel\",\"tel-country-code\",\"tel-national\",\"tel-area-code\",\"tel-local\",\"tel-local-prefix\",\"tel-local-suffix\",\"tel-extension\",\"email\",\"impp\"],locations:[\"billing\",\"shipping\"]},g.isValidAutocomplete=function(e,t){var n=1<arguments.length&&void 0!==t?t:{},r=n.looseTyped,a=void 0!==r&&r,o=n.stateTerms,i=void 0===o?[]:o,u=n.locations,s=void 0===u?[]:u,l=n.qualifiers,c=void 0===l?[]:l,d=n.standaloneTerms,m=void 0===d?[]:d,p=n.qualifiedTerms,f=void 0===p?[]:p;if(e=e.toLowerCase().trim(),(i=i.concat(g.autocomplete.stateTerms)).includes(e)||\"\"===e)return!0;c=c.concat(g.autocomplete.qualifiers),s=s.concat(g.autocomplete.locations),m=m.concat(g.autocomplete.standaloneTerms),f=f.concat(g.autocomplete.qualifiedTerms);var h=e.split(/\\s+/g);if(!a&&(8<h[0].length&&\"section-\"===h[0].substr(0,8)&&h.shift(),s.includes(h[0])&&h.shift(),c.includes(h[0])&&(h.shift(),m=[]),1!==h.length))return!1;var b=h[h.length-1];return m.includes(b)||f.includes(b)},g.labelText=function(e,t){var n=1<arguments.length&&void 0!==t?t:{},r=g.accessibleTextVirtual.alreadyProcessed;if(n.inControlContext||n.inLabelledByContext||r(e,n))return\"\";n.startNode||(n.startNode=e);var a,o=R({inControlContext:!0},n),i=function(e){var t=e.actualNode;return t.id?h.findElmsInContext({elm:\"label\",attr:\"for\",value:t.id,context:t}):[]}(e),u=h.findUpVirtual(e,\"label\");return u?(a=[].concat(he(i),[u])).sort(axe.utils.nodeSorter):a=i,a.map(function(e){return g.accessibleText(e,o)}).filter(function(e){return\"\"!==e}).join(\" \")},g.labelVirtual=function(e){var t,n;if(n=l.labelVirtual(e))return n;if(e.actualNode.id){var r=axe.utils.escapeSelector(e.actualNode.getAttribute(\"id\"));if(n=(t=axe.commons.dom.getRootNode(e.actualNode).querySelector('label[for=\"'+r+'\"]'))&&g.visible(t,!0))return n}return(n=(t=h.findUpVirtual(e,\"label\"))&&g.visible(t,!0))||null},g.label=function(e){return e=axe.utils.getNodeFromTree(e),g.labelVirtual(e)},g.nativeElementType=[{matches:[{nodeName:\"textarea\"},{nodeName:\"input\",properties:{type:[\"text\",\"password\",\"search\",\"tel\",\"email\",\"url\"]}}],namingMethods:\"labelText\"},{matches:{nodeName:\"input\",properties:{type:[\"button\",\"submit\",\"reset\"]}},namingMethods:[\"valueText\",\"titleText\",\"buttonDefaultText\"]},{matches:{nodeName:\"input\",properties:{type:\"image\"}},namingMethods:[\"altText\",\"valueText\",\"labelText\",\"titleText\",\"buttonDefaultText\"]},{matches:\"button\",namingMethods:\"subtreeText\"},{matches:\"fieldset\",namingMethods:\"fieldsetLegendText\"},{matches:\"OUTPUT\",namingMethods:\"subtreeText\"},{matches:[{nodeName:\"select\"},{nodeName:\"input\",properties:{type:/^(?!text|password|search|tel|email|url|button|submit|reset)/}}],namingMethods:\"labelText\"},{matches:\"summary\",namingMethods:\"subtreeText\"},{matches:\"figure\",namingMethods:[\"figureText\",\"titleText\"]},{matches:\"img\",namingMethods:\"altText\"},{matches:\"table\",namingMethods:[\"tableCaptionText\",\"tableSummaryText\"]},{matches:[\"hr\",\"br\"],namingMethods:[\"titleText\",\"singleSpace\"]}],g.nativeTextAlternative=function(n,e){var r=1<arguments.length&&void 0!==e?e:{},t=n.actualNode;if(1!==t.nodeType||[\"presentation\",\"none\"].includes(l.getRole(t)))return\"\";var a=function(n){var e=g.nativeElementType,t=g.nativeTextMethods,r=e.find(function(e){var t=e.matches;return axe.commons.matches(n,t)});return(r?[].concat(r.namingMethods):[]).map(function(e){return t[e]})}(n).reduce(function(e,t){return e||t(n,r)},\"\");return r.debug&&axe.log(a||\"{empty-value}\",t,r),a};var F={submit:\"Submit\",image:\"Submit\",reset:\"Reset\",button:\"\"};function j(e,t){return t.actualNode.getAttribute(e)||\"\"}function z(e,t,n){var r=t.actualNode,a=[e=e.toLowerCase(),r.nodeName.toLowerCase()].join(\",\"),o=r.querySelector(a);return o&&o.nodeName.toLowerCase()===e?g.accessibleText(o,n):\"\"}g.nativeTextMethods={valueText:function(e){return e.actualNode.value||\"\"},buttonDefaultText:function(e){var t=e.actualNode;return F[t.type]||\"\"},tableCaptionText:z.bind(null,\"caption\"),figureText:z.bind(null,\"figcaption\"),fieldsetLegendText:z.bind(null,\"legend\"),altText:j.bind(null,\"alt\"),tableSummaryText:j.bind(null,\"summary\"),titleText:function(e,t){return g.titleText(e,t)},subtreeText:function(e,t){return g.subtreeText(e,t)},labelText:function(e,t){return g.labelText(e,t)},singleSpace:function(){return\" \"}},g.sanitize=function(e){\"use strict\";return e.replace(/\\r\\n/g,\"\\n\").replace(/\\u00A0/g,\" \").replace(/[\\s]{2,}/g,\" \").trim()},g.subtreeText=function(e,t){var n=1<arguments.length&&void 0!==t?t:{},r=g.accessibleTextVirtual.alreadyProcessed;n.startNode=n.startNode||e;var a=n.strict;return r(e,n)||!l.namedFromContents(e,{strict:a})?\"\":l.getOwnedVirtual(e).reduce(function(e,t){return function(e,t,n){var r=t.actualNode.nodeName.toUpperCase(),a=g.accessibleTextVirtual(t,n);if(!a)return e;q.includes(r)||(\" \"!==a[0]&&(a+=\" \"),e&&\" \"!==e[e.length-1]&&(a=\" \"+a));return e+a}(e,t,n)},\"\")};var q=[\"A\",\"EM\",\"STRONG\",\"SMALL\",\"MARK\",\"ABBR\",\"DFN\",\"I\",\"B\",\"S\",\"U\",\"CODE\",\"VAR\",\"SAMP\",\"KBD\",\"SUP\",\"SUB\",\"Q\",\"CITE\",\"SPAN\",\"BDO\",\"BDI\",\"WBR\",\"INS\",\"DEL\",\"MAP\",\"AREA\",\"NOSCRIPT\",\"RUBY\",\"BUTTON\",\"LABEL\",\"OUTPUT\",\"DATALIST\",\"KEYGEN\",\"PROGRESS\",\"COMMAND\",\"CANVAS\",\"TIME\",\"METER\",\"#TEXT\"];var N=[\"button\",\"iframe\",\"a[href]\",{nodeName:\"input\",properties:{type:\"button\"}}];function T(){return new RegExp(\"[ᴀ-ᵿᶀ-ᶿ᷀-᷿₠-⃏⃐-⃿℀-⅏⅐-↏←-⇿∀-⋿⌀-⏿␀-␿⑀-⑟①-⓿─-╿▀-▟■-◿☀-⛿✀-➿]\")}return g.titleText=function(e){return 1===(e=e.actualNode||e).nodeType&&e.hasAttribute(\"title\")?!axe.commons.matches(e,N)&&[\"none\",\"presentation\"].includes(l.getRole(e))?\"\":e.getAttribute(\"title\"):\"\"},g.hasUnicode=function(e,t){var n=t.emoji,r=t.nonBmp,a=t.punctuations;return n?axe.imports.emojiRegexText().test(e):r?T().test(e):!!a&&/[\\u2000-\\u206F\\u2E00-\\u2E7F\\\\'!\"#$%&()*+,\\-.\\/:;<=>?@\\[\\]^_`{|}~]/g.test(e)},g.removeUnicode=function(e,t){var n=t.emoji,r=t.nonBmp,a=t.punctuations;return n&&(e=e.replace(axe.imports.emojiRegexText(),\"\")),r&&(e=e.replace(T(),\"\")),a&&(e=e.replace(/[\\u2000-\\u206F\\u2E00-\\u2E7F\\\\'!\"#$%&()*+,\\-.\\/:;<=>?@\\[\\]^_`{|}~]/g,\"\")),e},g.unsupported={accessibleNameFromFieldValue:[\"combobox\",\"listbox\",\"progressbar\"]},g.visibleVirtual=function(n,r,a){var e=n.children.map(function(e){if(3===e.actualNode.nodeType){var t=e.actualNode.nodeValue;if(t&&h.isVisible(n.actualNode,r))return t}else if(!a)return g.visibleVirtual(e,r)}).join(\"\");return g.sanitize(e)},g.visible=function(e,t,n){return e=axe.utils.getNodeFromTree(e),g.visibleVirtual(e,t,n)},commons}()})}(\"object\"==typeof window?window:this);";
+    const pageFunctions=require('../../lib/page-functions.js');
+    
+    
+    
+    
+    
+    
+    
+    
+    function runA11yChecks(){
+    
+    return window.axe.run(document,{
+    elementRef:true,
+    runOnly:{
+    type:'tag',
+    values:[
+    'wcag2a',
+    'wcag2aa']},
+    
+    
+    resultTypes:['violations','inapplicable'],
+    rules:{
+    'tabindex':{enabled:true},
+    'accesskeys':{enabled:true},
+    'table-fake-caption':{enabled:false},
+    'td-has-header':{enabled:false},
+    'marquee':{enabled:false},
+    'area-alt':{enabled:false},
+    'aria-dpub-role-fallback':{enabled:false},
+    'aria-hidden-body':{enabled:false},
+    'duplicate-id-active':{enabled:false},
+    'duplicate-id-aria':{enabled:false},
+    'html-xml-lang-mismatch':{enabled:false},
+    'blink':{enabled:false},
+    'server-side-image-map':{enabled:false},
+    'aria-hidden-focus':{enabled:false},
+    'form-field-multiple-labels':{enabled:false},
+    'aria-input-field-name':{enabled:false},
+    'aria-toggle-field-name':{enabled:false}}}).
+    
+    
+    then(axeResult=>{
+    
+    
+    axeResult.violations.forEach(v=>v.nodes.forEach(node=>{
+    
+    node.path=getNodePath(node.element);
+    
+    node.snippet=getOuterHTMLSnippet(node.element);
+    
+    node.nodeLabel=getNodeLabel(node.element);
+    
+    node.element=node.any=node.all=node.none=undefined;
+    }));
+    
+    
+    axeResult={violations:axeResult.violations,notApplicable:axeResult.inapplicable};
+    return axeResult;
+    });
+    }
+    
+    class Accessibility extends Gatherer{
+    
+    
+    
+    
+    afterPass(passContext){
+    const driver=passContext.driver;
+    const expression=`(function () {
+          ${pageFunctions.getOuterHTMLSnippetString};
+          ${pageFunctions.getNodePathString};
+          ${pageFunctions.getNodeLabelString};
+          ${axeLibSource};
+          return (${runA11yChecks.toString()}());
+        })()`;
+    
+    return driver.evaluateAsync(expression,{useIsolation:true}).then(returnedValue=>{
+    if(!returnedValue){
+    throw new Error('No axe-core results returned');
+    }
+    if(!Array.isArray(returnedValue.violations)){
+    throw new Error('Unable to parse axe results'+returnedValue);
+    }
+    return returnedValue;
+    });
+    }}
+    
+    
+    module.exports=Accessibility;
+    
+    },{"../../lib/page-functions.js":76,"./gatherer.js":53}],"../gather/gatherers/anchor-elements":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Gatherer=require('./gatherer.js');
+    const pageFunctions=require('../../lib/page-functions.js');
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function collectAnchorElements(){
+    
+    const resolveURLOrEmpty=url=>{
+    try{
+    return new URL(url,window.location.href).href;
+    }catch(_){
+    return'';
+    }
+    };
+    
+    
+    
+    const anchorElements=getElementsInDocument('a');
+    
+    return anchorElements.map(node=>{
+    
+    const outerHTML=getOuterHTMLSnippet(node);
+    
+    if(node instanceof HTMLAnchorElement){
+    return{
+    href:node.href,
+    text:node.innerText,
+    rel:node.rel,
+    target:node.target,
+    outerHTML};
+    
+    }
+    
+    return{
+    href:resolveURLOrEmpty(node.href.baseVal),
+    text:node.textContent||'',
+    rel:'',
+    target:node.target.baseVal||'',
+    outerHTML};
+    
+    });
+    }
+    
+    class AnchorElements extends Gatherer{
+    
+    
+    
+    
+    async afterPass(passContext){
+    const driver=passContext.driver;
+    const expression=`(() => {
+          ${pageFunctions.getOuterHTMLSnippetString};
+          ${pageFunctions.getElementsInDocumentString};
+    
+          return (${collectAnchorElements})();
+        })()`;
+    
+    
+    return driver.evaluateAsync(expression,{useIsolation:true});
+    }}
+    
+    
+    module.exports=AnchorElements;
+    
+    },{"../../lib/page-functions.js":76,"./gatherer.js":53}],"../gather/gatherers/cache-contents":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    const Gatherer=require('./gatherer.js');
+    
+    
+    
+    
+    
+    
+    function getCacheContents(){
+    
+    return caches.keys().
+    
+    
+    then(cacheNames=>Promise.all(cacheNames.map(cacheName=>caches.open(cacheName)))).
+    
+    then(caches=>{
+    
+    const requests=[];
+    
+    
+    return Promise.all(caches.map(cache=>{
+    return cache.keys().
+    then(reqs=>{
+    requests.push(...reqs.map(r=>r.url));
+    });
+    })).then(_=>{
+    return requests;
+    });
+    });
+    }
+    
+    class CacheContents extends Gatherer{
+    
+    
+    
+    
+    
+    async afterPass(passContext){
+    const driver=passContext.driver;
+    
+    
+    const cacheUrls=await driver.evaluateAsync(`(${getCacheContents.toString()}())`);
+    if(!cacheUrls||!Array.isArray(cacheUrls)){
+    throw new Error('Unable to retrieve cache contents');
+    }
+    
+    return cacheUrls;
+    }}
+    
+    
+    module.exports=CacheContents;
+    
+    },{"./gatherer.js":53}],"../gather/gatherers/console-messages":[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Gatherer=require('./gatherer.js');
+    
+    class ConsoleMessages extends Gatherer{
+    constructor(){
+    super();
+    
+    this._logEntries=[];
+    this._onConsoleEntryAdded=this.onConsoleEntry.bind(this);
+    }
+    
+    
+    
+    
+    onConsoleEntry(entry){
+    this._logEntries.push(entry);
+    }
+    
+    
+    
+    
+    async beforePass(passContext){
+    const driver=passContext.driver;
+    driver.on('Log.entryAdded',this._onConsoleEntryAdded);
+    await driver.sendCommand('Log.enable');
+    await driver.sendCommand('Log.startViolationsReport',{
+    config:[{name:'discouragedAPIUse',threshold:-1}]});
+    
+    }
+    
+    
+    
+    
+    
+    async afterPass(passContext){
+    await passContext.driver.sendCommand('Log.stopViolationsReport');
+    await passContext.driver.off('Log.entryAdded',this._onConsoleEntryAdded);
+    await passContext.driver.sendCommand('Log.disable');
+    return this._logEntries;
+    }}
+    
+    
+    module.exports=ConsoleMessages;
+    
+    },{"./gatherer.js":53}],"../gather/gatherers/css-usage":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Gatherer=require('./gatherer.js');
+    
+    
+    
+    
+    class CSSUsage extends Gatherer{
+    
+    
+    
+    
+    async afterPass(passContext){
+    const driver=passContext.driver;
+    
+    
+    const stylesheets=[];
+    
+    const onStylesheetAdded=sheet=>stylesheets.push(sheet);
+    driver.on('CSS.styleSheetAdded',onStylesheetAdded);
+    
+    await driver.sendCommand('DOM.enable');
+    await driver.sendCommand('CSS.enable');
+    await driver.sendCommand('CSS.startRuleUsageTracking');
+    await driver.evaluateAsync('getComputedStyle(document.body)');
+    driver.off('CSS.styleSheetAdded',onStylesheetAdded);
+    
+    
+    const promises=stylesheets.map(sheet=>{
+    const styleSheetId=sheet.header.styleSheetId;
+    return driver.sendCommand('CSS.getStyleSheetText',{styleSheetId}).then(content=>{
+    return{
+    header:sheet.header,
+    content:content.text};
+    
+    });
+    });
+    const styleSheetInfo=await Promise.all(promises);
+    
+    const ruleUsageResponse=await driver.sendCommand('CSS.stopRuleUsageTracking');
+    await driver.sendCommand('CSS.disable');
+    await driver.sendCommand('DOM.disable');
+    
+    const dedupedStylesheets=new Map(styleSheetInfo.map(sheet=>{
+    return[sheet.content,sheet];
+    }));
+    return{
+    rules:ruleUsageResponse.ruleUsage,
+    stylesheets:Array.from(dedupedStylesheets.values())};
+    
+    }}
+    
+    
+    module.exports=CSSUsage;
+    
+    },{"./gatherer.js":53}],"../gather/gatherers/dobetterweb/appcache":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Gatherer=require('../gatherer.js');
+    
+    class AppCacheManifest extends Gatherer{
+    
+    
+    
+    
+    
+    
+    afterPass(passContext){
+    const driver=passContext.driver;
+    
+    return driver.querySelector('html').
+    then(node=>node&&node.getAttribute('manifest'));
+    }}
+    
+    
+    module.exports=AppCacheManifest;
+    
+    },{"../gatherer.js":53}],"../gather/gatherers/dobetterweb/doctype":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Gatherer=require('../gatherer.js');
+    
+    
+    
+    
+    
+    
+    function getDoctype(){
+    
+    if(!document.doctype){
+    return null;
+    }
+    
+    const{name,publicId,systemId}=document.doctype;
+    return{name,publicId,systemId};
+    }
+    
+    class Doctype extends Gatherer{
+    
+    
+    
+    
+    afterPass(passContext){
+    const driver=passContext.driver;
+    return driver.evaluateAsync(`(${getDoctype.toString()}())`);
+    }}
+    
+    
+    module.exports=Doctype;
+    
+    },{"../gatherer.js":53}],"../gather/gatherers/dobetterweb/domstats":[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Gatherer=require('../gatherer.js');
+    const pageFunctions=require('../../../lib/page-functions.js');
+    
+    
+    
+    
+    
+    
+    
+    
+    function createSelectorsLabel(element){
+    let name=element.localName||'';
+    const idAttr=element.getAttribute&&element.getAttribute('id');
+    if(idAttr){
+    name+=`#${idAttr}`;
+    }
+    
+    
+    if(element.classList){
+    const className=element.classList.toString();
+    if(className){
+    name+=`.${className.trim().replace(/\s+/g,'.')}`;
+    }
+    }else if(ShadowRoot.prototype.isPrototypeOf(element)){
+    name+='#shadow-root';
+    }
+    
+    return name;
+    }
+    
+    
+    
+    
+    
+    
+    function elementPathInDOM(element){
+    const visited=new Set();
+    const path=[createSelectorsLabel(element)];
+    let node=element;
+    while(node){
+    visited.add(node);
+    
+    
+    
+    if(ShadowRoot.prototype.isPrototypeOf(node)){
+    const isShadowHost=node.host&&node.localName!=='a';
+    node=isShadowHost?node.host:node.parentElement;
+    }else{
+    const isShadowHost=node.parentNode&&node.parentNode.host&&
+    node.parentNode.localName!=='a';
+    node=isShadowHost?node.parentNode.host:node.parentElement;
+    }
+    
+    if(visited.has(node)){
+    node=null;
+    }
+    
+    if(node){
+    path.unshift(createSelectorsLabel(node));
+    }
+    }
+    return path;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function getDOMStats(element,deep=true){
+    let deepestElement=null;
+    let maxDepth=-1;
+    let maxWidth=-1;
+    let numElements=0;
+    let parentWithMostChildren=null;
+    
+    
+    
+    
+    
+    const _calcDOMWidthAndHeight=function(element,depth=1){
+    if(depth>maxDepth){
+    deepestElement=element;
+    maxDepth=depth;
+    }
+    if(element.children.length>maxWidth){
+    parentWithMostChildren=element;
+    maxWidth=element.children.length;
+    }
+    
+    let child=element.firstElementChild;
+    while(child){
+    _calcDOMWidthAndHeight(child,depth+1);
+    
+    if(deep&&child.shadowRoot){
+    _calcDOMWidthAndHeight(child.shadowRoot,depth+1);
+    }
+    child=child.nextElementSibling;
+    numElements++;
+    }
+    
+    return{maxDepth,maxWidth,numElements};
+    };
+    
+    const result=_calcDOMWidthAndHeight(element);
+    
+    return{
+    depth:{
+    max:result.maxDepth,
+    pathToElement:elementPathInDOM(deepestElement),
+    
+    snippet:getOuterHTMLSnippet(deepestElement,['style'])},
+    
+    width:{
+    max:result.maxWidth,
+    pathToElement:elementPathInDOM(parentWithMostChildren),
+    snippet:getOuterHTMLSnippet(parentWithMostChildren,['style'])},
+    
+    totalBodyElements:result.numElements};
+    
+    }
+    
+    class DOMStats extends Gatherer{
+    
+    
+    
+    
+    async afterPass(passContext){
+    const driver=passContext.driver;
+    
+    const expression=`(function() {
+          ${pageFunctions.getOuterHTMLSnippetString};
+          ${createSelectorsLabel.toString()};
+          ${elementPathInDOM.toString()};
+          return (${getDOMStats.toString()}(document.body));
+        })()`;
+    await driver.sendCommand('DOM.enable');
+    const results=await driver.evaluateAsync(expression,{useIsolation:true});
+    await driver.sendCommand('DOM.disable');
+    return results;
+    }}
+    
+    
+    module.exports=DOMStats;
+    
+    },{"../../../lib/page-functions.js":76,"../gatherer.js":53}],"../gather/gatherers/dobetterweb/optimized-images":[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const log=require('lighthouse-logger');
+    const Gatherer=require('../gatherer.js');
+    const URL=require('../../../lib/url-shim.js');
+    const NetworkRequest=require('../../../lib/network-request.js');
+    const Sentry=require('../../../lib/sentry.js');
+    const Driver=require('../../driver.js');
+    
+    
+    
+    const MAX_TIME_TO_SPEND_ENCODING=5000;
+    
+    const MAX_RESOURCE_SIZE_TO_ENCODE=2000*1024;
+    
+    const JPEG_QUALITY=0.92;
+    const WEBP_QUALITY=0.85;
+    
+    const MINIMUM_IMAGE_SIZE=4096;
+    
+    const IMAGE_REGEX=/^image\/((x|ms|x-ms)-)?(png|bmp|jpeg)$/;
+    
+    
+    
+    class OptimizedImages extends Gatherer{
+    constructor(){
+    super();
+    this._encodingStartAt=0;
+    }
+    
+    
+    
+    
+    
+    static filterImageRequests(networkRecords){
+    
+    const seenUrls=new Set();
+    return networkRecords.reduce((prev,record)=>{
+    
+    if(seenUrls.has(record.url)||!record.finished||record.sessionId){
+    return prev;
+    }
+    
+    seenUrls.add(record.url);
+    const isOptimizableImage=record.resourceType===NetworkRequest.TYPES.Image&&
+    IMAGE_REGEX.test(record.mimeType);
+    
+    const actualResourceSize=Math.min(record.resourceSize||0,record.transferSize||0);
+    if(isOptimizableImage&&actualResourceSize>MINIMUM_IMAGE_SIZE){
+    prev.push({
+    requestId:record.requestId,
+    url:record.url,
+    mimeType:record.mimeType,
+    resourceSize:actualResourceSize});
+    
+    }
+    
+    return prev;
+    },[]);
+    }
+    
+    
+    
+    
+    
+    
+    
+    _getEncodedResponse(driver,requestId,encoding){
+    requestId=NetworkRequest.getRequestIdForBackend(requestId);
+    
+    const quality=encoding==='jpeg'?JPEG_QUALITY:WEBP_QUALITY;
+    const params={requestId,encoding,quality,sizeOnly:true};
+    return driver.sendCommand('Audits.getEncodedResponse',params);
+    }
+    
+    
+    
+    
+    
+    
+    async calculateImageStats(driver,networkRecord){
+    const originalSize=networkRecord.resourceSize;
+    
+    
+    if(Date.now()-this._encodingStartAt>MAX_TIME_TO_SPEND_ENCODING||
+    originalSize>MAX_RESOURCE_SIZE_TO_ENCODE){
+    return{originalSize,jpegSize:undefined,webpSize:undefined};
+    }
+    
+    const jpegData=await this._getEncodedResponse(driver,networkRecord.requestId,'jpeg');
+    const webpData=await this._getEncodedResponse(driver,networkRecord.requestId,'webp');
+    
+    return{
+    originalSize,
+    jpegSize:jpegData.encodedSize,
+    webpSize:webpData.encodedSize};
+    
+    }
+    
+    
+    
+    
+    
+    
+    async computeOptimizedImages(driver,imageRecords){
+    this._encodingStartAt=Date.now();
+    
+    
+    const results=[];
+    
+    for(const record of imageRecords){
+    try{
+    const stats=await this.calculateImageStats(driver,record);
+    
+    const image={failed:false,...stats,...record};
+    results.push(image);
+    }catch(err){
+    log.warn('optimized-images',err.message);
+    
+    
+    
+    Sentry.captureException(err,{
+    tags:{gatherer:'OptimizedImages'},
+    extra:{imageUrl:URL.elideDataURI(record.url)},
+    level:'warning'});
+    
+    
+    
+    const imageError={failed:true,errMsg:err.message,...record};
+    results.push(imageError);
+    }
+    }
+    
+    return results;
+    }
+    
+    
+    
+    
+    
+    
+    afterPass(passContext,loadData){
+    const networkRecords=loadData.networkRecords;
+    const imageRecords=OptimizedImages.
+    filterImageRequests(networkRecords).
+    sort((a,b)=>b.resourceSize-a.resourceSize);
+    
+    return Promise.resolve().
+    then(_=>this.computeOptimizedImages(passContext.driver,imageRecords)).
+    then(results=>{
+    const successfulResults=results.filter(result=>!result.failed);
+    if(results.length&&!successfulResults.length){
+    throw new Error('All image optimizations failed');
+    }
+    
+    return results;
+    });
+    }}
+    
+    
+    module.exports=OptimizedImages;
+    
+    },{"../../../lib/network-request.js":75,"../../../lib/sentry.js":78,"../../../lib/url-shim.js":"url","../../driver.js":51,"../gatherer.js":53,"lighthouse-logger":125}],"../gather/gatherers/dobetterweb/password-inputs-with-prevented-paste":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    const Gatherer=require('../gatherer.js');
+    const pageFunctions=require('../../../lib/page-functions.js');
+    
+    
+    
+    
+    
+    
+    function findPasswordInputsWithPreventedPaste(){
+    return Array.from(document.querySelectorAll('input[type="password"]')).
+    filter(passwordInput=>
+    !passwordInput.dispatchEvent(
+    new ClipboardEvent('paste',{cancelable:true}))).
+    
+    
+    map(passwordInput=>({
+    
+    snippet:getOuterHTMLSnippet(passwordInput)}));
+    
+    }
+    
+    class PasswordInputsWithPreventedPaste extends Gatherer{
+    
+    
+    
+    
+    afterPass(passContext){
+    return passContext.driver.evaluateAsync(`(() => {
+          ${pageFunctions.getOuterHTMLSnippetString};
+          return (${findPasswordInputsWithPreventedPaste.toString()}());
+        })()`);
+    }}
+    
+    
+    
+    module.exports=PasswordInputsWithPreventedPaste;
+    
+    },{"../../../lib/page-functions.js":76,"../gatherer.js":53}],"../gather/gatherers/dobetterweb/response-compression":[function(require,module,exports){
+    (function(Buffer){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Gatherer=require('../gatherer.js');
+    const URL=require('../../../lib/url-shim.js');
+    const Sentry=require('../../../lib/sentry.js');
+    const NetworkRequest=require('../../../lib/network-request.js');
+    const gzip=require('zlib').gzip;
+    
+    const CHROME_EXTENSION_PROTOCOL='chrome-extension:';
+    const compressionHeaders=['content-encoding','x-original-content-encoding'];
+    const compressionTypes=['gzip','br','deflate'];
+    const binaryMimeTypes=['image','audio','video'];
+    
+    const textResourceTypes=[
+    NetworkRequest.TYPES.Document,
+    NetworkRequest.TYPES.Script,
+    NetworkRequest.TYPES.Stylesheet,
+    NetworkRequest.TYPES.XHR,
+    NetworkRequest.TYPES.Fetch,
+    NetworkRequest.TYPES.EventSource];
+    
+    
+    class ResponseCompression extends Gatherer{
+    
+    
+    
+    
+    static filterUnoptimizedResponses(networkRecords){
+    
+    const unoptimizedResponses=[];
+    
+    networkRecords.forEach(record=>{
+    
+    if(record.sessionId)return;
+    
+    const mimeType=record.mimeType;
+    const resourceType=record.resourceType||NetworkRequest.TYPES.Other;
+    const resourceSize=record.resourceSize;
+    
+    const isBinaryResource=mimeType&&binaryMimeTypes.some(type=>mimeType.startsWith(type));
+    const isTextResource=!isBinaryResource&&textResourceTypes.includes(resourceType);
+    const isChromeExtensionResource=record.url.startsWith(CHROME_EXTENSION_PROTOCOL);
+    
+    if(!isTextResource||!resourceSize||!record.finished||
+    isChromeExtensionResource||!record.transferSize||record.statusCode===304){
+    return;
+    }
+    
+    const isContentEncoded=(record.responseHeaders||[]).find(header=>
+    compressionHeaders.includes(header.name.toLowerCase())&&
+    compressionTypes.includes(header.value));
+    
+    
+    if(!isContentEncoded){
+    unoptimizedResponses.push({
+    requestId:record.requestId,
+    url:record.url,
+    mimeType:mimeType,
+    transferSize:record.transferSize,
+    resourceSize:resourceSize,
+    gzipSize:0});
+    
+    }
+    });
+    
+    return unoptimizedResponses;
+    }
+    
+    
+    
+    
+    
+    
+    afterPass(passContext,loadData){
+    const networkRecords=loadData.networkRecords;
+    const textRecords=ResponseCompression.filterUnoptimizedResponses(networkRecords);
+    
+    const driver=passContext.driver;
+    return Promise.all(textRecords.map(record=>{
+    return driver.getRequestContent(record.requestId).then(content=>{
+    
+    if(!content){
+    return record;
+    }
+    
+    return new Promise((resolve,reject)=>{
+    return gzip(content,(err,res)=>{
+    if(err){
+    return reject(err);
+    }
+    
+    
+    record.gzipSize=Buffer.byteLength(res,'utf8');
+    
+    resolve(record);
+    });
+    });
+    }).catch(err=>{
+    Sentry.captureException(err,{
+    tags:{gatherer:'ResponseCompression'},
+    extra:{url:URL.elideDataURI(record.url)},
+    level:'warning'});
+    
+    
+    record.gzipSize=undefined;
+    return record;
+    });
+    }));
+    }}
+    
+    
+    module.exports=ResponseCompression;
+    
+    }).call(this,require("buffer").Buffer);
+    },{"../../../lib/network-request.js":75,"../../../lib/sentry.js":78,"../../../lib/url-shim.js":"url","../gatherer.js":53,"buffer":102,"zlib":100}],"../gather/gatherers/dobetterweb/tags-blocking-first-paint":[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Gatherer=require('../gatherer.js');
+    const Driver=require('../../driver.js');
+    
+    
+    
+    
+    function installMediaListener(){
+    window.___linkMediaChanges=[];
+    Object.defineProperty(HTMLLinkElement.prototype,'media',{
+    set:function(val){
+    window.___linkMediaChanges.push({
+    href:this.href,
+    media:val,
+    msSinceHTMLEnd:Date.now()-window.performance.timing.responseEnd,
+    matches:window.matchMedia(val).matches});
+    
+    
+    return this.setAttribute('media',val);
+    }});
+    
+    }
+    
+    
+    
+    
+    
+    function collectTagsThatBlockFirstPaint(){
+    return new Promise((resolve,reject)=>{
+    try{
+    const tagList=[...document.querySelectorAll('link, head script[src]')].
+    filter(tag=>{
+    if(tag.tagName==='SCRIPT'){
+    const scriptTag=tag;
+    return(
+    !scriptTag.hasAttribute('async')&&
+    !scriptTag.hasAttribute('defer')&&
+    !/^data:/.test(scriptTag.src)&&
+    !/^blob:/.test(scriptTag.src)&&
+    scriptTag.getAttribute('type')!=='module');
+    
+    }else if(tag.tagName==='LINK'){
+    
+    
+    
+    const linkTag=tag;
+    const blockingStylesheet=linkTag.rel==='stylesheet'&&
+    window.matchMedia(linkTag.media).matches&&!linkTag.disabled;
+    const blockingImport=linkTag.rel==='import'&&!linkTag.hasAttribute('async');
+    return blockingStylesheet||blockingImport;
+    }
+    
+    return false;
+    }).
+    map(tag=>{
+    return{
+    tagName:tag.tagName,
+    url:tag.tagName==='LINK'?tag.href:tag.src,
+    src:tag.src,
+    href:tag.href,
+    rel:tag.rel,
+    media:tag.media,
+    disabled:tag.disabled,
+    mediaChanges:window.___linkMediaChanges.filter(item=>item.href===tag.href)};
+    
+    });
+    resolve(tagList);
+    }catch(e){
+    const friendly='Unable to gather Scripts/Stylesheets/HTML Imports on the page';
+    reject(new Error(`${friendly}: ${e.message}`));
+    }
+    });
+    }
+    
+    class TagsBlockingFirstPaint extends Gatherer{
+    
+    
+    
+    static _filteredAndIndexedByUrl(networkRecords){
+    
+    const result={};
+    
+    return networkRecords.reduce((prev,record)=>{
+    if(!record.finished){
+    return prev;
+    }
+    
+    const isParserGenerated=record.initiator.type==='parser';
+    
+    
+    const isParserScriptOrStyle=/(css|script)/.test(record.mimeType)&&isParserGenerated;
+    const isFailedRequest=record._failed;
+    const isHtml=record.mimeType&&record.mimeType.includes('html');
+    
+    
+    
+    if(isHtml||isParserScriptOrStyle||isFailedRequest&&isParserGenerated){
+    prev[record.url]={
+    isLinkPreload:!!record.isLinkPreload,
+    transferSize:record.transferSize,
+    startTime:record.startTime,
+    endTime:record.endTime};
+    
+    }
+    
+    return prev;
+    },result);
+    }
+    
+    
+    
+    
+    
+    static findBlockingTags(driver,networkRecords){
+    const scriptSrc=`(${collectTagsThatBlockFirstPaint.toString()}())`;
+    const firstRequestEndTime=networkRecords.reduce(
+    (min,record)=>Math.min(min,record.endTime),
+    Infinity);
+    
+    return driver.evaluateAsync(scriptSrc).then(tags=>{
+    const requests=TagsBlockingFirstPaint._filteredAndIndexedByUrl(networkRecords);
+    
+    return tags.reduce((prev,tag)=>{
+    const request=requests[tag.url];
+    if(request&&!request.isLinkPreload){
+    
+    
+    
+    const timesResourceBecameNonBlocking=(tag.mediaChanges||[]).
+    filter(change=>!change.matches).
+    map(change=>change.msSinceHTMLEnd);
+    const earliestNonBlockingTime=Math.min(...timesResourceBecameNonBlocking);
+    const lastTimeResourceWasBlocking=Math.max(
+    request.startTime,
+    firstRequestEndTime+earliestNonBlockingTime/1000);
+    
+    
+    prev.push({
+    tag,
+    transferSize:request.transferSize||0,
+    startTime:request.startTime,
+    endTime:Math.min(request.endTime,lastTimeResourceWasBlocking)});
+    
+    
+    
+    requests[tag.url]=null;
+    }
+    
+    return prev;
+    },[]);
+    });
+    }
+    
+    
+    
+    
+    beforePass(passContext){
+    return passContext.driver.evaluateScriptOnNewDocument(`(${installMediaListener.toString()})()`);
+    }
+    
+    
+    
+    
+    
+    
+    afterPass(passContext,loadData){
+    return TagsBlockingFirstPaint.findBlockingTags(passContext.driver,loadData.networkRecords);
+    }}
+    
+    
+    module.exports=TagsBlockingFirstPaint;
+    
+    },{"../../driver.js":51,"../gatherer.js":53}],"../gather/gatherers/html-without-javascript":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Gatherer=require('./gatherer.js');
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function getBodyText(){
+    
+    const body=document.querySelector('body');
+    return Promise.resolve({
+    bodyText:body?body.innerText:'',
+    hasNoScript:!!document.querySelector('noscript')});
+    
+    }
+    
+    class HTMLWithoutJavaScript extends Gatherer{
+    
+    
+    
+    beforePass(passContext){
+    passContext.disableJavaScript=true;
+    }
+    
+    
+    
+    
+    
+    async afterPass(passContext){
+    
+    passContext.disableJavaScript=false;
+    
+    const expression=`(${getBodyText.toString()}())`;
+    const{bodyText,hasNoScript}=await passContext.driver.evaluateAsync(expression);
+    if(typeof bodyText!=='string'){
+    throw new Error('document body innerText returned by protocol was not a string');
+    }
+    
+    return{
+    bodyText,
+    hasNoScript};
+    
+    }}
+    
+    
+    module.exports=HTMLWithoutJavaScript;
+    
+    },{"./gatherer.js":53}],"../gather/gatherers/http-redirect":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Gatherer=require('./gatherer.js');
+    
+    
+    
+    
+    
+    
+    class HTTPRedirect extends Gatherer{
+    constructor(){
+    super();
+    this._preRedirectURL='';
+    }
+    
+    
+    
+    
+    beforePass(passContext){
+    this._preRedirectURL=passContext.url;
+    passContext.url=this._preRedirectURL.replace(/^https/,'http');
+    }
+    
+    
+    
+    
+    
+    async afterPass(passContext){
+    
+    passContext.url=this._preRedirectURL;
+    
+    const expression=`new URL(window.location).protocol === 'https:'`;
+    const isHttps=await passContext.driver.evaluateAsync(expression,{useIsolation:true});
+    return{
+    value:isHttps};
+    
+    }}
+    
+    
+    module.exports=HTTPRedirect;
+    
+    },{"./gatherer.js":53}],"../gather/gatherers/iframe-elements":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Gatherer=require('./gatherer.js');
+    const pageFunctions=require('../../lib/page-functions.js');
+    
+    
+    
+    
+    
+    
+    
+    function collectIFrameElements(){
+    
+    const iFrameElements=getElementsInDocument('iframe');
+    return iFrameElements.map(node=>{
+    const clientRect=node.getBoundingClientRect();
+    const{top,bottom,left,right,width,height}=clientRect;
+    return{
+    id:node.id,
+    src:node.src,
+    clientRect:{top,bottom,left,right,width,height},
+    
+    isPositionFixed:isPositionFixed(node)};
+    
+    });
+    }
+    
+    class IFrameElements extends Gatherer{
+    
+    
+    
+    
+    
+    async afterPass(passContext){
+    const driver=passContext.driver;
+    
+    const expression=`(() => {
+          ${pageFunctions.getOuterHTMLSnippetString};
+          ${pageFunctions.getElementsInDocumentString};
+          ${pageFunctions.isPositionFixedString};
+          return (${collectIFrameElements})();
+        })()`;
+    
+    
+    const iframeElements=await driver.evaluateAsync(expression,{useIsolation:true});
+    return iframeElements;
+    }}
+    
+    
+    module.exports=IFrameElements;
+    
+    },{"../../lib/page-functions.js":76,"./gatherer.js":53}],"../gather/gatherers/image-elements":[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Gatherer=require('./gatherer.js');
+    const pageFunctions=require('../../lib/page-functions.js');
+    const Driver=require('../driver.js');
+    
+    
+    
+    
+    
+    
+    function getClientRect(element){
+    const clientRect=element.getBoundingClientRect();
+    return{
+    
+    top:clientRect.top,
+    bottom:clientRect.bottom,
+    left:clientRect.left,
+    right:clientRect.right};
+    
+    }
+    
+    
+    
+    
+    
+    
+    function getHTMLImages(allElements){
+    const allImageElements=allElements.filter(element=>{
+    return element.localName==='img';
+    });
+    
+    return allImageElements.map(element=>{
+    const computedStyle=window.getComputedStyle(element);
+    return{
+    
+    
+    src:element.currentSrc,
+    displayedWidth:element.width,
+    displayedHeight:element.height,
+    clientRect:getClientRect(element),
+    naturalWidth:element.naturalWidth,
+    naturalHeight:element.naturalHeight,
+    isCss:false,
+    resourceSize:0,
+    isPicture:!!element.parentElement&&element.parentElement.tagName==='PICTURE',
+    usesObjectFit:['cover','contain','scale-down','none'].includes(
+    computedStyle.getPropertyValue('object-fit'))};
+    
+    
+    });
+    }
+    
+    
+    
+    
+    
+    
+    function getCSSImages(allElements){
+    
+    
+    const CSS_URL_REGEX=/^url\("([^"]+)"\)$/;
+    
+    
+    const images=[];
+    
+    for(const element of allElements){
+    const style=window.getComputedStyle(element);
+    
+    if(!style.backgroundImage||!CSS_URL_REGEX.test(style.backgroundImage))continue;
+    
+    const imageMatch=style.backgroundImage.match(CSS_URL_REGEX);
+    
+    const url=imageMatch[1];
+    
+    images.push({
+    src:url,
+    displayedWidth:element.clientWidth,
+    displayedHeight:element.clientHeight,
+    clientRect:getClientRect(element),
+    
+    naturalWidth:0,
+    naturalHeight:0,
+    isCss:true,
+    isPicture:false,
+    usesObjectFit:false,
+    resourceSize:0});
+    
+    }
+    
+    return images;
+    }
+    
+    
+    
+    function collectImageElementInfo(){
+    
+    
+    const allElements=getElementsInDocument();
+    return getHTMLImages(allElements).concat(getCSSImages(allElements));
+    }
+    
+    
+    
+    
+    
+    
+    function determineNaturalSize(url){
+    return new Promise((resolve,reject)=>{
+    const img=new Image();
+    img.addEventListener('error',_=>reject(new Error('determineNaturalSize failed img load')));
+    img.addEventListener('load',()=>{
+    resolve({
+    naturalWidth:img.naturalWidth,
+    naturalHeight:img.naturalHeight});
+    
+    });
+    
+    img.src=url;
+    });
+    }
+    
+    class ImageElements extends Gatherer{
+    constructor(){
+    super();
+    
+    this._naturalSizeCache=new Map();
+    }
+    
+    
+    
+    
+    
+    
+    async fetchElementWithSizeInformation(driver,element){
+    const url=JSON.stringify(element.src);
+    if(this._naturalSizeCache.has(url)){
+    return Object.assign(element,this._naturalSizeCache.get(url));
+    }
+    
+    try{
+    
+    driver.setNextProtocolTimeout(250);
+    
+    const size=await driver.evaluateAsync(`(${determineNaturalSize.toString()})(${url})`);
+    this._naturalSizeCache.set(url,size);
+    return Object.assign(element,size);
+    }catch(_){
+    
+    return element;
+    }
+    }
+    
+    
+    
+    
+    
+    
+    async afterPass(passContext,loadData){
+    const driver=passContext.driver;
+    const indexedNetworkRecords=loadData.networkRecords.reduce((map,record)=>{
+    
+    
+    if(/^image/.test(record.mimeType)&&record.finished&&record.statusCode===200){
+    map[record.url]=record;
+    }
+    
+    return map;
+    },{});
+    
+    const expression=`(function() {
+          ${pageFunctions.getElementsInDocumentString}; // define function on page
+          ${getClientRect.toString()};
+          ${getHTMLImages.toString()};
+          ${getCSSImages.toString()};
+          ${collectImageElementInfo.toString()};
+    
+          return collectImageElementInfo();
+        })()`;
+    
+    
+    const elements=await driver.evaluateAsync(expression);
+    
+    
+    const imageUsage=[];
+    const top50Images=Object.values(indexedNetworkRecords).
+    sort((a,b)=>b.resourceSize-a.resourceSize).
+    slice(0,50);
+    
+    for(let element of elements){
+    
+    const networkRecord=indexedNetworkRecords[element.src]||{};
+    element.mimeType=networkRecord.mimeType;
+    
+    
+    
+    
+    
+    const{resourceSize=0,transferSize=0}=networkRecord;
+    element.resourceSize=Math.min(resourceSize,transferSize);
+    
+    
+    
+    
+    
+    if(
+    (element.isPicture||element.isCss)&&
+    networkRecord&&
+    top50Images.includes(networkRecord))
+    {
+    element=await this.fetchElementWithSizeInformation(driver,element);
+    }
+    
+    imageUsage.push(element);
+    }
+    
+    return imageUsage;
+    }}
+    
+    
+    module.exports=ImageElements;
+    
+    },{"../../lib/page-functions.js":76,"../driver.js":51,"./gatherer.js":53}],"../gather/gatherers/js-usage":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Gatherer=require('./gatherer.js');
+    
+    
+    
+    
+    class JsUsage extends Gatherer{
+    
+    
+    
+    async beforePass(passContext){
+    await passContext.driver.sendCommand('Profiler.enable');
+    await passContext.driver.sendCommand('Profiler.startPreciseCoverage');
+    }
+    
+    
+    
+    
+    
+    async afterPass(passContext){
+    const driver=passContext.driver;
+    
+    const coverageResponse=await driver.sendCommand('Profiler.takePreciseCoverage');
+    await driver.sendCommand('Profiler.stopPreciseCoverage');
+    await driver.sendCommand('Profiler.disable');
+    return coverageResponse.result;
+    }}
+    
+    
+    module.exports=JsUsage;
+    
+    },{"./gatherer.js":53}],"../gather/gatherers/link-elements":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Gatherer=require('./gatherer.js');
+    const URL=require('../../lib/url-shim.js').URL;
+    const NetworkAnalyzer=require('../../lib/dependency-graph/simulator/network-analyzer.js');
+    const LinkHeader=require('http-link-header');
+    const{getElementsInDocumentString}=require('../../lib/page-functions.js');
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function normalizeUrlOrNull(url,finalUrl){
+    try{
+    return new URL(url,finalUrl).href;
+    }catch(_){
+    return null;
+    }
+    }
+    
+    
+    
+    
+    
+    function getCrossoriginFromHeader(value){
+    if(value==='anonymous')return'anonymous';
+    if(value==='use-credentials')return'use-credentials';
+    return null;
+    }
+    
+    
+    
+    
+    
+    function getLinkElementsInDOM(){
+    
+    
+    const browserElements=getElementsInDocument('link');
+    
+    const linkElements=[];
+    
+    for(const link of browserElements){
+    
+    
+    if(!(link instanceof HTMLLinkElement))continue;
+    
+    linkElements.push({
+    rel:link.rel,
+    href:link.href,
+    hrefRaw:link.href,
+    hreflang:link.hreflang,
+    as:link.as,
+    crossOrigin:link.crossOrigin,
+    source:link.closest('head')?'head':'body'});
+    
+    }
+    
+    return linkElements;
+    }
+    
+    class LinkElements extends Gatherer{
+    
+    
+    
+    
+    static getLinkElementsInDOM(passContext){
+    
+    
+    return passContext.driver.evaluateAsync(`(() => {
+          ${getElementsInDocumentString};
+          ${getLinkElementsInDOM};
+    
+          return getLinkElementsInDOM();
+        })()`,{useIsolation:true});
+    }
+    
+    
+    
+    
+    
+    
+    static getLinkElementsInHeaders(passContext,loadData){
+    const finalUrl=passContext.url;
+    const records=loadData.networkRecords;
+    const mainDocument=NetworkAnalyzer.findMainDocument(records,finalUrl);
+    
+    
+    const linkElements=[];
+    
+    for(const header of mainDocument.responseHeaders){
+    if(header.name.toLowerCase()!=='link')continue;
+    
+    for(const link of LinkHeader.parse(header.value).refs){
+    linkElements.push({
+    rel:link.rel||'',
+    href:normalizeUrlOrNull(link.uri,finalUrl),
+    hrefRaw:link.uri||'',
+    hreflang:link.hreflang||'',
+    as:link.as||'',
+    crossOrigin:getCrossoriginFromHeader(link.crossorigin),
+    source:'headers'});
+    
+    }
+    }
+    
+    return linkElements;
+    }
+    
+    
+    
+    
+    
+    
+    async afterPass(passContext,loadData){
+    const fromDOM=await LinkElements.getLinkElementsInDOM(passContext);
+    const fromHeaders=LinkElements.getLinkElementsInHeaders(passContext,loadData);
+    const linkElements=fromDOM.concat(fromHeaders);
+    
+    for(const link of linkElements){
+    
+    link.rel=link.rel.toLowerCase();
+    }
+    
+    return linkElements;
+    }}
+    
+    
+    module.exports=LinkElements;
+    
+    },{"../../lib/dependency-graph/simulator/network-analyzer.js":62,"../../lib/page-functions.js":76,"../../lib/url-shim.js":"url","./gatherer.js":53,"http-link-header":109}],"../gather/gatherers/main-document-content":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Gatherer=require('./gatherer.js');
+    const NetworkAnalyzer=require('../../lib/dependency-graph/simulator/network-analyzer.js');
+    
+    
+    
+    
+    class MainDocumentContent extends Gatherer{
+    
+    
+    
+    
+    
+    async afterPass(passContext,loadData){
+    const mainResource=NetworkAnalyzer.findMainDocument(loadData.networkRecords,passContext.url);
+    
+    const driver=passContext.driver;
+    return driver.getRequestContent(mainResource.requestId);
+    }}
+    
+    
+    module.exports=MainDocumentContent;
+    
+    },{"../../lib/dependency-graph/simulator/network-analyzer.js":62,"./gatherer.js":53}],"../gather/gatherers/meta-elements":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Gatherer=require('./gatherer.js');
+    const getElementsInDocumentString=require('../../lib/page-functions.js').getElementsInDocumentString;
+    
+    class MetaElements extends Gatherer{
+    
+    
+    
+    
+    async afterPass(passContext){
+    const driver=passContext.driver;
+    
+    
+    
+    return driver.evaluateAsync(`(() => {
+          ${getElementsInDocumentString};
+    
+          return getElementsInDocument('head meta').map(meta => {
+            return {
+              name: meta.name.toLowerCase(),
+              content: meta.content,
+            };
+          });
+        })()`,{useIsolation:true});
+    }}
+    
+    
+    module.exports=MetaElements;
+    
+    },{"../../lib/page-functions.js":76,"./gatherer.js":53}],"../gather/gatherers/mixed-content":[function(require,module,exports){
+    (function(Buffer){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Gatherer=require('./gatherer.js');
+    const URL=require('../../lib/url-shim.js');
+    
+    const Driver=require('../driver.js');
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    class MixedContent extends Gatherer{
+    constructor(){
+    super();
+    this.ids=new Set();
+    this.url=undefined;
+    this._onRequestIntercepted=undefined;
+    }
+    
+    
+    
+    
+    
+    upgradeURL(url){
+    const parsedURL=new URL(url);
+    parsedURL.protocol='https:';
+    return parsedURL.href;
+    }
+    
+    
+    
+    
+    
+    downgradeURL(url){
+    const parsedURL=new URL(url);
+    parsedURL.protocol='http:';
+    return parsedURL.href;
+    }
+    
+    
+    
+    
+    
+    _getRequestInterceptor(pageUrl,driver){
+    
+    const onRequestIntercepted=event=>{
+    
+    
+    
+    if(new URL(event.request.url).protocol==='http:'&&
+    !URL.equalWithExcludedFragments(event.request.url,pageUrl)&&
+    !this.ids.has(event.interceptionId)){
+    this.ids.add(event.interceptionId);
+    event.request.url=this.upgradeURL(event.request.url);
+    driver.sendCommand('Network.continueInterceptedRequest',{
+    interceptionId:event.interceptionId,
+    rawResponse:Buffer.from(
+    `HTTP/1.1 302 Found\r\nLocation: ${event.request.url}\r\n\r\n`,
+    'utf8').toString('base64')});
+    
+    }else{
+    driver.sendCommand('Network.continueInterceptedRequest',{
+    interceptionId:event.interceptionId});
+    
+    }
+    };
+    
+    return onRequestIntercepted;
+    }
+    
+    
+    
+    
+    async beforePass(passContext){
+    const driver=passContext.driver;
+    
+    
+    
+    
+    
+    passContext.url=this.downgradeURL(passContext.url);
+    this.url=passContext.url;
+    this._onRequestIntercepted=this._getRequestInterceptor(this.url,driver);
+    
+    await driver.sendCommand('Network.enable');
+    driver.on('Network.requestIntercepted',this._onRequestIntercepted);
+    await driver.sendCommand('Network.setCacheDisabled',{cacheDisabled:true});
+    await driver.sendCommand('Network.setRequestInterception',{patterns:[{urlPattern:'*'}]});
+    }
+    
+    
+    
+    
+    
+    async afterPass(passContext){
+    const driver=passContext.driver;
+    await driver.sendCommand('Network.setRequestInterception',{patterns:[]});
+    if(this._onRequestIntercepted){
+    driver.off('Network.requestIntercepted',this._onRequestIntercepted);
+    }
+    await driver.sendCommand('Network.setCacheDisabled',{cacheDisabled:false});
+    
+    return{url:passContext.url};
+    }}
+    
+    
+    module.exports=MixedContent;
+    
+    }).call(this,require("buffer").Buffer);
+    },{"../../lib/url-shim.js":"url","../driver.js":51,"./gatherer.js":53,"buffer":102}],"../gather/gatherers/offline":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Gatherer=require('./gatherer.js');
+    const URL=require('../../lib/url-shim.js');
+    
+    class Offline extends Gatherer{
+    
+    
+    
+    beforePass(passContext){
+    
+    
+    
+    return passContext.driver.goOffline();
+    }
+    
+    
+    
+    
+    
+    
+    async afterPass(passContext,loadData){
+    const navigationRecord=loadData.networkRecords.filter(record=>{
+    return URL.equalWithExcludedFragments(record.url,passContext.url)&&
+    record.fetchedViaServiceWorker;
+    }).pop();
+    
+    return navigationRecord?navigationRecord.statusCode:-1;
+    }}
+    
+    
+    module.exports=Offline;
+    
+    },{"../../lib/url-shim.js":"url","./gatherer.js":53}],"../gather/gatherers/runtime-exceptions":[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Gatherer=require('./gatherer.js');
+    
+    class RuntimeExceptions extends Gatherer{
+    constructor(){
+    super();
+    
+    this._exceptions=[];
+    this._onRuntimeExceptionThrown=this.onRuntimeExceptionThrown.bind(this);
+    }
+    
+    
+    
+    
+    onRuntimeExceptionThrown(entry){
+    this._exceptions.push(entry);
+    }
+    
+    
+    
+    
+    beforePass(passContext){
+    const driver=passContext.driver;
+    driver.on('Runtime.exceptionThrown',this._onRuntimeExceptionThrown);
+    }
+    
+    
+    
+    
+    
+    async afterPass(passContext){
+    await passContext.driver.off('Runtime.exceptionThrown',this._onRuntimeExceptionThrown);
+    return this._exceptions;
+    }}
+    
+    
+    module.exports=RuntimeExceptions;
+    
+    },{"./gatherer.js":53}],"../gather/gatherers/script-elements":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Gatherer=require('./gatherer.js');
+    const NetworkAnalyzer=require('../../lib/dependency-graph/simulator/network-analyzer.js');
+    const NetworkRequest=require('../../lib/network-request.js');
+    const getElementsInDocumentString=require('../../lib/page-functions.js').getElementsInDocumentString;
+    const pageFunctions=require('../../lib/page-functions.js');
+    
+    
+    
+    
+    
+    
+    
+    function collectAllScriptElements(){
+    
+    
+    const scripts=getElementsInDocument('script');
+    
+    return scripts.map(script=>{
+    return{
+    type:script.type||null,
+    src:script.src||null,
+    id:script.id||null,
+    async:script.async,
+    defer:script.defer,
+    source:script.closest('head')?'head':'body',
+    
+    devtoolsNodePath:getNodePath(script),
+    content:script.src?null:script.text,
+    requestId:null};
+    
+    });
+    }
+    
+    
+    
+    
+    class ScriptElements extends Gatherer{
+    
+    
+    
+    
+    
+    async afterPass(passContext,loadData){
+    const driver=passContext.driver;
+    const mainResource=NetworkAnalyzer.findMainDocument(loadData.networkRecords,passContext.url);
+    
+    
+    const scripts=await driver.evaluateAsync(`(() => {
+          ${getElementsInDocumentString}
+          ${pageFunctions.getNodePathString};
+          return (${collectAllScriptElements.toString()})();
+        })()`,{useIsolation:true});
+    
+    for(const script of scripts){
+    if(script.content)script.requestId=mainResource.requestId;
+    }
+    
+    const scriptRecords=loadData.networkRecords.
+    
+    filter(record=>!record.sessionId).
+    
+    filter(record=>record.resourceType===NetworkRequest.TYPES.Script);
+    
+    for(const record of scriptRecords){
+    try{
+    const content=await driver.getRequestContent(record.requestId);
+    if(!content)continue;
+    
+    const matchedScriptElement=scripts.find(script=>script.src===record.url);
+    if(matchedScriptElement){
+    matchedScriptElement.requestId=record.requestId;
+    matchedScriptElement.content=content;
+    }else{
+    scripts.push({
+    devtoolsNodePath:'',
+    type:null,
+    src:record.url,
+    id:null,
+    async:false,
+    defer:false,
+    source:'network',
+    requestId:record.requestId,
+    content});
+    
+    }
+    }catch(e){}
+    }
+    
+    return scripts;
+    }}
+    
+    
+    module.exports=ScriptElements;
+    
+    },{"../../lib/dependency-graph/simulator/network-analyzer.js":62,"../../lib/network-request.js":75,"../../lib/page-functions.js":76,"./gatherer.js":53}],"../gather/gatherers/seo/embedded-content":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Gatherer=require('../gatherer.js');
+    const pageFunctions=require('../../../lib/page-functions.js');
+    
+    class EmbeddedContent extends Gatherer{
+    
+    
+    
+    
+    afterPass(passContext){
+    const expression=`(function() {
+          ${pageFunctions.getElementsInDocumentString}; // define function on page
+          const selector = 'object, embed, applet';
+          const elements = getElementsInDocument(selector);
+          return elements
+            .map(node => ({
+              tagName: node.tagName,
+              type: node.getAttribute('type'),
+              src: node.getAttribute('src'),
+              data: node.getAttribute('data'),
+              code: node.getAttribute('code'),
+              params: Array.from(node.children)
+                .filter(el => el.tagName === 'PARAM')
+                .map(el => ({
+                  name: el.getAttribute('name') || '',
+                  value: el.getAttribute('value') || '',
+                })),
+            }));
+        })()`;
+    
+    return passContext.driver.evaluateAsync(expression);
+    }}
+    
+    
+    module.exports=EmbeddedContent;
+    
+    },{"../../../lib/page-functions.js":76,"../gatherer.js":53}],"../gather/gatherers/seo/font-size":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const Gatherer=require('../gatherer.js');
+    const Sentry=require('../../../lib/sentry.js');
+    const FONT_SIZE_PROPERTY_NAME='font-size';
+    const TEXT_NODE_BLOCK_LIST=new Set(['SCRIPT','STYLE','NOSCRIPT']);
+    const MINIMAL_LEGIBLE_FONT_SIZE_PX=12;
+    
+    const MAX_NODES_VISITED=500;
+    const MAX_NODES_SOURCE_RULE_FETCHED=50;
+    
+    
+    const TEXT_NODE_TYPE=3;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function nodeInBody(node){
+    if(!node){
+    return false;
+    }
+    if(node.nodeName==='BODY'){
+    return true;
+    }
+    return nodeInBody(node.parentNode);
+    }
+    
+    
+    
+    
+    
+    
+    
+    async function getAllNodesFromBody(driver){
+    const nodes=await driver.getNodesInDocument();
+    
+    const nodeMap=new Map();
+    nodes.forEach(node=>nodeMap.set(node.nodeId,node));
+    nodes.forEach(node=>node.parentNode=nodeMap.get(node.parentId));
+    return nodes.filter(nodeInBody);
+    }
+    
+    
+    
+    
+    
+    function hasFontSizeDeclaration(style){
+    return!!style&&!!style.cssProperties.find(({name})=>name===FONT_SIZE_PROPERTY_NAME);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function computeSelectorSpecificity(selector){
+    const tokens=selector.split(' ');
+    
+    let numIDs=0;
+    let numClasses=0;
+    let numTypes=0;
+    
+    for(const token of tokens){
+    const ids=token.match(/\b#[a-z0-9]+/g)||[];
+    const classes=token.match(/\b\.[a-z0-9]+/g)||[];
+    const types=token.match(/^[a-z]+/)?[1]:[];
+    numIDs+=ids.length;
+    numClasses+=classes.length;
+    numTypes+=types.length;
+    }
+    
+    return Math.min(9,numIDs)*100+Math.min(9,numClasses)*10+Math.min(9,numTypes);
+    }
+    
+    
+    
+    
+    
+    
+    
+    function findMostSpecificMatchedCSSRule(matchedCSSRules=[]){
+    let maxSpecificity=-Infinity;
+    
+    let maxSpecificityRule;
+    
+    for(const{rule,matchingSelectors}of matchedCSSRules){
+    if(hasFontSizeDeclaration(rule.style)){
+    const specificities=matchingSelectors.map(idx=>
+    computeSelectorSpecificity(rule.selectorList.selectors[idx].text));
+    
+    const specificity=Math.max(...specificities);
+    
+    if(specificity>=maxSpecificity){
+    maxSpecificity=specificity;
+    maxSpecificityRule=rule;
+    }
+    }
+    }
+    
+    if(maxSpecificityRule){
+    return{
+    type:'Regular',
+    ...maxSpecificityRule.style,
+    parentRule:{
+    origin:maxSpecificityRule.origin,
+    selectors:maxSpecificityRule.selectorList.selectors}};
+    
+    
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    function findInheritedCSSRule(inheritedEntries=[]){
+    
+    
+    
+    
+    for(const{inlineStyle,matchedCSSRules}of inheritedEntries){
+    if(hasFontSizeDeclaration(inlineStyle))return{type:'Inline',...inlineStyle};
+    
+    const directRule=findMostSpecificMatchedCSSRule(matchedCSSRules);
+    if(directRule)return directRule;
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function getEffectiveFontRule({attributesStyle,inlineStyle,matchedCSSRules,inherited}){
+    
+    if(hasFontSizeDeclaration(inlineStyle))return{type:'Inline',...inlineStyle};
+    
+    
+    const matchedRule=findMostSpecificMatchedCSSRule(matchedCSSRules);
+    if(matchedRule)return matchedRule;
+    
+    
+    if(hasFontSizeDeclaration(attributesStyle))return{type:'Attributes',...attributesStyle};
+    
+    
+    const inheritedRule=findInheritedCSSRule(inherited);
+    if(inheritedRule)return inheritedRule;
+    
+    return undefined;
+    }
+    
+    
+    
+    
+    
+    function getNodeTextLength(node){
+    
+    return!node.nodeValue?0:Array.from(node.nodeValue.trim()).length;
+    }
+    
+    
+    
+    
+    
+    
+    async function fetchSourceRule(driver,node){
+    const matchedRules=await driver.sendCommand('CSS.getMatchedStylesForNode',{
+    nodeId:node.nodeId});
+    
+    const sourceRule=getEffectiveFontRule(matchedRules);
+    if(!sourceRule)return undefined;
+    
+    return{
+    type:sourceRule.type,
+    range:sourceRule.range,
+    styleSheetId:sourceRule.styleSheetId,
+    parentRule:sourceRule.parentRule&&{
+    origin:sourceRule.parentRule.origin,
+    selectors:sourceRule.parentRule.selectors}};
+    
+    
+    }
+    
+    
+    
+    
+    
+    
+    async function fetchComputedFontSize(driver,textNode){
+    try{
+    const{computedStyle}=await driver.sendCommand('CSS.getComputedStyleForNode',{
+    nodeId:textNode.parentId});
+    
+    
+    const fontSizeProperty=computedStyle.find(({name})=>name===FONT_SIZE_PROPERTY_NAME);
+    
+    return{
+    
+    fontSize:parseInt(fontSizeProperty.value,10),
+    textLength:getNodeTextLength(textNode),
+    node:textNode.parentNode};
+    
+    }catch(err){
+    Sentry.captureException(err,{tags:{gatherer:'FontSize'}});
+    return null;
+    }
+    }
+    
+    
+    
+    
+    
+    function isNonEmptyTextNode(node){
+    return(
+    node.nodeType===TEXT_NODE_TYPE&&
+    !TEXT_NODE_BLOCK_LIST.has(node.parentNode.nodeName)&&
+    getNodeTextLength(node)>0);
+    
+    }
+    
+    class FontSize extends Gatherer{
+    
+    
+    
+    static async fetchNodesToAnalyze(driver){
+    let failingTextLength=0;
+    let visitedTextLength=0;
+    let totalTextLength=0;
+    
+    const nodes=await getAllNodesFromBody(driver);
+    
+    const textNodes=nodes.filter(isNonEmptyTextNode);
+    totalTextLength=textNodes.reduce((sum,node)=>sum+=getNodeTextLength(node),0);
+    
+    const nodesToVisit=textNodes.
+    sort((a,b)=>getNodeTextLength(b)-getNodeTextLength(a)).
+    slice(0,MAX_NODES_VISITED);
+    
+    const nodePromises=nodesToVisit.map(node=>fetchComputedFontSize(driver,node));
+    const visitedNodes=await Promise.all(nodePromises);
+    
+    
+    const failingNodes=[];
+    for(const visitedNode of visitedNodes){
+    if(!visitedNode)continue;
+    visitedTextLength+=visitedNode.textLength;
+    
+    if(visitedNode.fontSize<MINIMAL_LEGIBLE_FONT_SIZE_PX){
+    failingNodes.push(visitedNode);
+    failingTextLength+=visitedNode.textLength;
+    }
+    }
+    
+    return{totalTextLength,visitedTextLength,failingTextLength,failingNodes};
+    }
+    
+    
+    
+    
+    
+    static async fetchFailingNodeSourceRules(driver,failingNodes){
+    const analysisPromises=failingNodes.
+    sort((a,b)=>b.textLength-a.textLength).
+    slice(0,MAX_NODES_SOURCE_RULE_FETCHED).
+    map(async failingNode=>{
+    failingNode.cssRule=await fetchSourceRule(driver,failingNode.node);
+    return failingNode;
+    });
+    
+    const analyzedFailingNodesData=await Promise.all(analysisPromises);
+    
+    const analyzedFailingTextLength=analyzedFailingNodesData.reduce(
+    (sum,{textLength})=>sum+=textLength,
+    0);
+    
+    
+    return{analyzedFailingNodesData,analyzedFailingTextLength};
+    }
+    
+    
+    
+    
+    
+    async afterPass(passContext){
+    
+    const stylesheets=new Map();
+    
+    const onStylesheetAdd=sheet=>stylesheets.set(sheet.header.styleSheetId,sheet.header);
+    passContext.driver.on('CSS.styleSheetAdded',onStylesheetAdd);
+    
+    await Promise.all([
+    passContext.driver.sendCommand('DOM.enable'),
+    passContext.driver.sendCommand('CSS.enable')]);
+    
+    
+    const{
+    totalTextLength,
+    visitedTextLength,
+    failingTextLength,
+    failingNodes}=
+    await FontSize.fetchNodesToAnalyze(passContext.driver);
+    
+    const{
+    analyzedFailingNodesData,
+    analyzedFailingTextLength}=
+    await FontSize.fetchFailingNodeSourceRules(passContext.driver,failingNodes);
+    
+    passContext.driver.off('CSS.styleSheetAdded',onStylesheetAdd);
+    
+    analyzedFailingNodesData.
+    filter(data=>data.cssRule&&data.cssRule.styleSheetId).
+    
+    forEach(data=>data.cssRule.stylesheet=stylesheets.get(data.cssRule.styleSheetId));
+    
+    await Promise.all([
+    passContext.driver.sendCommand('DOM.disable'),
+    passContext.driver.sendCommand('CSS.disable')]);
+    
+    
+    return{
+    analyzedFailingNodesData,
+    analyzedFailingTextLength,
+    failingTextLength,
+    visitedTextLength,
+    totalTextLength};
+    
+    }}
+    
+    
+    module.exports=FontSize;
+    module.exports.TEXT_NODE_TYPE=TEXT_NODE_TYPE;
+    module.exports.computeSelectorSpecificity=computeSelectorSpecificity;
+    module.exports.getEffectiveFontRule=getEffectiveFontRule;
+    
+    },{"../../../lib/sentry.js":78,"../gatherer.js":53}],"../gather/gatherers/seo/robots-txt":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Gatherer=require('../gatherer.js');
+    
+    
+    
+    
+    
+    async function getRobotsTxtContent(){
+    try{
+    const response=await fetch(new URL('/robots.txt',location.href).href);
+    if(!response.ok){
+    return{status:response.status,content:null};
+    }
+    
+    const content=await response.text();
+    return{status:response.status,content};
+    }catch(_){
+    return{status:null,content:null};
+    }
+    }
+    
+    
+    class RobotsTxt extends Gatherer{
+    
+    
+    
+    
+    afterPass(passContext){
+    return passContext.driver.evaluateAsync(`(${getRobotsTxtContent.toString()}())`);
+    }}
+    
+    
+    module.exports=RobotsTxt;
+    
+    },{"../gatherer.js":53}],"../gather/gatherers/seo/tap-targets":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    const Gatherer=require('../gatherer.js');
+    const pageFunctions=require('../../../lib/page-functions.js');
+    const{
+    rectContains,
+    getRectArea,
+    getRectCenterPoint,
+    getLargestRect}=
+    require('../../../lib/rect-helpers.js');
+    
+    const TARGET_SELECTORS=[
+    'button',
+    'a',
+    'input',
+    'textarea',
+    'select',
+    'option',
+    '[role=button]',
+    '[role=checkbox]',
+    '[role=link]',
+    '[role=menuitem]',
+    '[role=menuitemcheckbox]',
+    '[role=menuitemradio]',
+    '[role=option]',
+    '[role=scrollbar]',
+    '[role=slider]',
+    '[role=spinbutton]'];
+    
+    const tapTargetsSelector=TARGET_SELECTORS.join(',');
+    
+    
+    
+    
+    
+    
+    function elementIsVisible(element){
+    return!!(element.offsetWidth||element.offsetHeight||element.getClientRects().length);
+    }
+    
+    
+    
+    
+    
+    
+    function getClientRects(element){
+    const clientRects=Array.from(
+    element.getClientRects()).
+    map(clientRect=>{
+    
+    
+    const{width,height,left,top,right,bottom}=clientRect;
+    return{width,height,left,top,right,bottom};
+    });
+    
+    for(const child of element.children){
+    clientRects.push(...getClientRects(child));
+    }
+    
+    return clientRects;
+    }
+    
+    
+    
+    
+    
+    
+    function elementHasAncestorTapTarget(element){
+    if(!element.parentElement){
+    return false;
+    }
+    if(element.parentElement.matches(tapTargetsSelector)){
+    return true;
+    }
+    return elementHasAncestorTapTarget(element.parentElement);
+    }
+    
+    
+    
+    
+    
+    function hasTextNodeSiblingsFormingTextBlock(element){
+    if(!element.parentElement){
+    return false;
+    }
+    
+    const parentElement=element.parentElement;
+    
+    const nodeText=element.textContent||'';
+    const parentText=parentElement.textContent||'';
+    if(parentText.length-nodeText.length<5){
+    
+    
+    return false;
+    }
+    
+    for(const sibling of element.parentElement.childNodes){
+    if(sibling===element){
+    continue;
+    }
+    const siblingTextContent=(sibling.textContent||'').trim();
+    
+    
+    
+    
+    if(sibling.nodeType===Node.TEXT_NODE&&siblingTextContent.length>0){
+    return true;
+    }
+    }
+    
+    return false;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function elementIsInTextBlock(element){
+    const{display}=getComputedStyle(element);
+    if(display!=='inline'&&display!=='inline-block'){
+    return false;
+    }
+    
+    if(hasTextNodeSiblingsFormingTextBlock(element)){
+    return true;
+    }else if(element.parentElement){
+    return elementIsInTextBlock(element.parentElement);
+    }else{
+    return false;
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    function truncate(str,maxLength){
+    if(str.length<=maxLength){
+    return str;
+    }
+    return str.slice(0,maxLength-1)+'…';
+    }
+    
+    
+    
+    
+    
+    
+    function elementCenterIsAtZAxisTop(el,elCenterPoint){
+    const viewportHeight=window.innerHeight;
+    const targetScrollY=Math.floor(elCenterPoint.y/viewportHeight)*viewportHeight;
+    if(window.scrollY!==targetScrollY){
+    window.scrollTo(0,targetScrollY);
+    }
+    
+    const topEl=document.elementFromPoint(
+    elCenterPoint.x,
+    elCenterPoint.y-window.scrollY);
+    
+    
+    return topEl===el||el.contains(topEl);
+    }
+    
+    
+    
+    
+    
+    
+    
+    function disableFixedAndStickyElementPointerEvents(){
+    const className='lighthouse-disable-pointer-events';
+    const styleTag=document.createElement('style');
+    styleTag.textContent=`.${className} { pointer-events: none !important }`;
+    document.body.appendChild(styleTag);
+    
+    document.querySelectorAll('*').forEach(el=>{
+    const position=getComputedStyle(el).position;
+    if(position==='fixed'||position==='sticky'){
+    el.classList.add(className);
+    }
+    });
+    
+    return function undo(){
+    Array.from(document.getElementsByClassName(className)).forEach(el=>{
+    el.classList.remove(className);
+    });
+    styleTag.remove();
+    };
+    }
+    
+    
+    
+    
+    
+    function gatherTapTargets(){
+    
+    const targets=[];
+    
+    
+    window.scrollTo(0,0);
+    
+    
+    
+    const tapTargetElements=getElementsInDocument(tapTargetsSelector);
+    
+    
+    
+    
+    
+    const tapTargetsWithClientRects=[];
+    tapTargetElements.forEach(tapTargetElement=>{
+    
+    if(elementHasAncestorTapTarget(tapTargetElement)){
+    
+    
+    return;
+    }
+    if(elementIsInTextBlock(tapTargetElement)){
+    
+    
+    return;
+    }
+    if(!elementIsVisible(tapTargetElement)){
+    return;
+    }
+    
+    tapTargetsWithClientRects.push({
+    tapTargetElement,
+    clientRects:getClientRects(tapTargetElement)});
+    
+    });
+    
+    
+    
+    
+    const reenableFixedAndStickyElementPointerEvents=disableFixedAndStickyElementPointerEvents();
+    
+    
+    
+    
+    
+    const tapTargetsWithVisibleClientRects=[];
+    
+    
+    
+    tapTargetsWithClientRects.forEach(({tapTargetElement,clientRects})=>{
+    
+    let visibleClientRects=clientRects.filter(cr=>cr.width!==0&&cr.height!==0);
+    
+    
+    
+    
+    
+    
+    visibleClientRects=visibleClientRects.filter(rect=>{
+    
+    
+    const rectCenterPoint=getRectCenterPoint(rect);
+    return elementCenterIsAtZAxisTop(tapTargetElement,rectCenterPoint);
+    });
+    
+    if(visibleClientRects.length>0){
+    tapTargetsWithVisibleClientRects.push({
+    tapTargetElement,
+    visibleClientRects});
+    
+    }
+    });
+    
+    for(const{tapTargetElement,visibleClientRects}of tapTargetsWithVisibleClientRects){
+    targets.push({
+    clientRects:visibleClientRects,
+    snippet:truncate(tapTargetElement.outerHTML,300),
+    
+    path:getNodePath(tapTargetElement),
+    
+    selector:getNodeSelector(tapTargetElement),
+    
+    nodeLabel:getNodeLabel(tapTargetElement),
+    href:tapTargetElement['href']||''});
+    
+    }
+    
+    reenableFixedAndStickyElementPointerEvents();
+    
+    return targets;
+    }
+    
+    class TapTargets extends Gatherer{
+    
+    
+    
+    
+    afterPass(passContext){
+    const expression=`(function() {
+          const tapTargetsSelector = "${tapTargetsSelector}";
+          ${pageFunctions.getElementsInDocumentString};
+          ${disableFixedAndStickyElementPointerEvents.toString()};
+          ${elementIsVisible.toString()};
+          ${elementHasAncestorTapTarget.toString()};
+          ${elementCenterIsAtZAxisTop.toString()}
+          ${truncate.toString()};
+          ${getClientRects.toString()};
+          ${hasTextNodeSiblingsFormingTextBlock.toString()};
+          ${elementIsInTextBlock.toString()};
+          ${getRectArea.toString()};
+          ${getLargestRect.toString()};
+          ${getRectCenterPoint.toString()};
+          ${rectContains.toString()};
+          ${pageFunctions.getNodePathString};
+          ${pageFunctions.getNodeSelectorString};
+          ${pageFunctions.getNodeLabelString};
+          ${gatherTapTargets.toString()};
+    
+          return gatherTapTargets();
+        })()`;
+    
+    return passContext.driver.evaluateAsync(expression,{useIsolation:true});
+    }}
+    
+    
+    module.exports=TapTargets;
+    
+    },{"../../../lib/page-functions.js":76,"../../../lib/rect-helpers.js":77,"../gatherer.js":53}],"../gather/gatherers/service-worker":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Gatherer=require('./gatherer.js');
+    
+    class ServiceWorker extends Gatherer{
+    
+    
+    
+    
+    async beforePass(passContext){
+    const{versions}=await passContext.driver.getServiceWorkerVersions();
+    const{registrations}=await passContext.driver.getServiceWorkerRegistrations();
+    
+    return{
+    versions,
+    registrations};
+    
+    }}
+    
+    
+    module.exports=ServiceWorker;
+    
+    },{"./gatherer.js":53}],"../gather/gatherers/source-maps":[function(require,module,exports){
+    (function(Buffer){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    const Gatherer=require('./gatherer.js');
+    const URL=require('../../lib/url-shim.js');
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    async function fetchSourceMap(url){
+    
+    const response=await fetch(url);
+    if(response.ok){
+    return response.text();
+    }else{
+    throw new Error(`Received status code ${response.status} for ${url}`);
+    }
+    }
+    
+    
+    
+    
+    class SourceMaps extends Gatherer{
+    constructor(){
+    super();
+    
+    this._scriptParsedEvents=[];
+    this.onScriptParsed=this.onScriptParsed.bind(this);
+    }
+    
+    
+    
+    
+    
+    
+    async fetchSourceMapInPage(driver,sourceMapUrl){
+    driver.setNextProtocolTimeout(1500);
+    
+    const sourceMapJson=
+    await driver.evaluateAsync(`(${fetchSourceMap})(${JSON.stringify(sourceMapUrl)})`);
+    return JSON.parse(sourceMapJson);
+    }
+    
+    
+    
+    
+    
+    parseSourceMapFromDataUrl(sourceMapURL){
+    const buffer=Buffer.from(sourceMapURL.split(',')[1],'base64');
+    return JSON.parse(buffer.toString());
+    }
+    
+    
+    
+    
+    onScriptParsed(event){
+    if(event.sourceMapURL){
+    this._scriptParsedEvents.push(event);
+    }
+    }
+    
+    
+    
+    
+    async beforePass(passContext){
+    const driver=passContext.driver;
+    driver.on('Debugger.scriptParsed',this.onScriptParsed);
+    await driver.sendCommand('Debugger.enable');
+    }
+    
+    
+    
+    
+    
+    
+    _resolveUrl(url,base){
+    try{
+    return new URL(url,base).href;
+    }catch(e){
+    return;
+    }
+    }
+    
+    
+    
+    
+    
+    
+    async _retrieveMapFromScriptParsedEvent(driver,event){
+    if(!event.sourceMapURL){
+    throw new Error('precondition failed: event.sourceMapURL should exist');
+    }
+    
+    
+    
+    const isSourceMapADataUri=event.sourceMapURL.startsWith('data:');
+    const scriptUrl=event.url;
+    const rawSourceMapUrl=isSourceMapADataUri?
+    event.sourceMapURL:
+    this._resolveUrl(event.sourceMapURL,event.url);
+    
+    if(!rawSourceMapUrl){
+    return{
+    scriptUrl,
+    errorMessage:`Could not resolve map url: ${event.sourceMapURL}`};
+    
+    }
+    
+    
+    const sourceMapUrl=isSourceMapADataUri?undefined:rawSourceMapUrl;
+    
+    try{
+    const map=isSourceMapADataUri?
+    this.parseSourceMapFromDataUrl(rawSourceMapUrl):
+    await this.fetchSourceMapInPage(driver,rawSourceMapUrl);
+    return{
+    scriptUrl,
+    sourceMapUrl,
+    map};
+    
+    }catch(err){
+    return{
+    scriptUrl,
+    sourceMapUrl,
+    errorMessage:err.toString()};
+    
+    }
+    }
+    
+    
+    
+    
+    
+    async afterPass(passContext){
+    const driver=passContext.driver;
+    
+    driver.off('Debugger.scriptParsed',this.onScriptParsed);
+    await driver.sendCommand('Debugger.disable');
+    
+    const eventProcessPromises=this._scriptParsedEvents.
+    map(event=>this._retrieveMapFromScriptParsedEvent(driver,event));
+    
+    return Promise.all(eventProcessPromises);
+    }}
+    
+    
+    module.exports=SourceMaps;
+    
+    }).call(this,require("buffer").Buffer);
+    },{"../../lib/url-shim.js":"url","./gatherer.js":53,"buffer":102}],"../gather/gatherers/start-url":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Gatherer=require('./gatherer.js');
+    
+    
+    
+    class StartUrl extends Gatherer{
+    
+    
+    
+    
+    
+    async afterPass(passContext){
+    
+    await passContext.driver.goOffline();
+    const result=await this._determineStartUrlAvailability(passContext);
+    await passContext.driver.goOnline(passContext);
+    
+    return result;
+    }
+    
+    
+    
+    
+    
+    
+    async _determineStartUrlAvailability(passContext){
+    const manifest=passContext.baseArtifacts.WebAppManifest;
+    const startUrlInfo=this._readManifestStartUrl(manifest);
+    if(startUrlInfo.isReadFailure){
+    return{statusCode:-1,explanation:startUrlInfo.reason};
+    }
+    
+    try{
+    return await this._attemptStartURLFetch(passContext.driver,startUrlInfo.startUrl);
+    }catch(err){
+    return{statusCode:-1,explanation:'Error while fetching start_url via service worker.'};
+    }
+    }
+    
+    
+    
+    
+    
+    
+    _readManifestStartUrl(manifest){
+    if(!manifest||!manifest.value){
+    const detailedMsg=manifest&&manifest.warning;
+    
+    if(detailedMsg){
+    return{isReadFailure:true,reason:`Error fetching web app manifest: ${detailedMsg}.`};
+    }else{
+    return{isReadFailure:true,reason:`No usable web app manifest found on page.`};
+    }
+    }
+    
+    
+    return{isReadFailure:false,startUrl:manifest.value.start_url.value};
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    _attemptStartURLFetch(driver,startUrl){
+    
+    
+    const timeoutPromise=new Promise(resolve=>
+    setTimeout(
+    ()=>resolve({statusCode:-1,explanation:'Timed out waiting for start_url to respond.'}),
+    3000));
+    
+    
+    
+    const fetchPromise=new Promise(resolve=>{
+    driver.on('Network.responseReceived',onResponseReceived);
+    
+    
+    function onResponseReceived(responseEvent){
+    const{response}=responseEvent;
+    
+    if(response.url!==startUrl)return;
+    driver.off('Network.responseReceived',onResponseReceived);
+    
+    if(!response.fromServiceWorker){
+    return resolve({
+    statusCode:-1,
+    explanation:'The start_url did respond, but not via a service worker.'});
+    
+    }
+    
+    return resolve({statusCode:response.status});
+    }
+    });
+    
+    return driver.
+    evaluateAsync(`window.location = '${startUrl}'`).
+    then(()=>Promise.race([fetchPromise,timeoutPromise]));
+    }}
+    
+    
+    module.exports=StartUrl;
+    
+    },{"./gatherer.js":53}],"../gather/gatherers/viewport-dimensions":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Gatherer=require('./gatherer.js');
+    
+    
+    
+    
+    
+    
+    
+    function getViewportDimensions(){
+    
+    
+    
+    return Promise.resolve({
+    innerWidth:window.innerWidth,
+    innerHeight:window.innerHeight,
+    outerWidth:window.outerWidth,
+    outerHeight:window.outerHeight,
+    devicePixelRatio:window.devicePixelRatio});
+    
+    }
+    
+    class ViewportDimensions extends Gatherer{
+    
+    
+    
+    
+    async afterPass(passContext){
+    const driver=passContext.driver;
+    
+    
+    const dimensions=await driver.evaluateAsync(`(${getViewportDimensions.toString()}())`,
+    {useIsolation:true});
+    
+    const allNumeric=Object.values(dimensions).every(Number.isFinite);
+    if(!allNumeric){
+    const results=JSON.stringify(dimensions);
+    throw new Error(`ViewportDimensions results were not numeric: ${results}`);
+    }
+    
+    return dimensions;
+    }}
+    
+    
+    module.exports=ViewportDimensions;
+    
+    },{"./gatherer.js":53}],1:[function(require,module,exports){
+    (function(global){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const lighthouse=require('../lighthouse-core/index.js');
+    const RawProtocol=require('../lighthouse-core/gather/connections/raw.js');
+    const log=require('lighthouse-logger');
+    const{registerLocaleData,lookupLocale}=require('../lighthouse-core/lib/i18n/i18n.js');
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function getDefaultConfigForCategories(categoryIDs){
+    return{
+    extends:'lighthouse:default',
+    plugins:['lighthouse-plugin-publisher-ads'],
+    settings:{
+    onlyCategories:categoryIDs}};
+    
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function runLighthouseInWorker(port,url,flags,categoryIDs){
+    
+    flags.logLevel=flags.logLevel||'info';
+    flags.channel='devtools';
+    global.devtools=true;
+    const config=getDefaultConfigForCategories(categoryIDs);
+    const connection=new RawProtocol(port);
+    
+    return lighthouse(url,flags,config,connection);
+    }
+    
+    
+    function listenForStatus(listenCallback){
+    log.events.addListener('status',listenCallback);
+    }
+    
+    if(typeof module!=='undefined'&&module.exports){
+    
+    module.exports={
+    runLighthouseInWorker,
+    listenForStatus,
+    registerLocaleData,
+    lookupLocale};
+    
+    }
+    
+    
+    
+    if(typeof self!=='undefined'){
+    
+    self.runLighthouseInWorker=runLighthouseInWorker;
+    
+    self.listenForStatus=listenForStatus;
+    
+    self.registerLocaleData=registerLocaleData;
+    
+    self.lookupLocale=lookupLocale;
+    }
+    
+    }).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
+    },{"../lighthouse-core/gather/connections/raw.js":49,"../lighthouse-core/index.js":54,"../lighthouse-core/lib/i18n/i18n.js":66,"lighthouse-logger":125}],2:[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const Audit=require('../audit.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    failingElementsHeader:'Failing Elements'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    class AxeAudit extends Audit{
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    
+    
+    
+    const notApplicables=artifacts.Accessibility.notApplicable||[];
+    const isNotApplicable=notApplicables.find(result=>result.id===this.meta.id);
+    if(isNotApplicable){
+    return{
+    score:1,
+    notApplicable:true};
+    
+    }
+    
+    const violations=artifacts.Accessibility.violations||[];
+    const rule=violations.find(result=>result.id===this.meta.id);
+    const impact=rule&&rule.impact;
+    const tags=rule&&rule.tags;
+    
+    
+    let items=[];
+    if(rule&&rule.nodes){
+    items=rule.nodes.map(node=>({
+    node:{
+    type:'node',
+    selector:Array.isArray(node.target)?node.target.join(' '):'',
+    path:node.path,
+    snippet:node.html||node.snippet,
+    explanation:node.failureSummary,
+    nodeLabel:node.nodeLabel}}));
+    
+    
+    }
+    
+    
+    const headings=[
+    {key:'node',itemType:'node',text:str_(UIStrings.failingElementsHeader)}];
+    
+    
+    
+    let debugData;
+    if(impact||tags){
+    debugData={
+    type:'debugdata',
+    impact,
+    tags};
+    
+    }
+    
+    return{
+    score:Number(rule===undefined),
+    extendedInfo:{
+    value:rule},
+    
+    details:{...Audit.makeTableDetails(headings,items),debugData}};
+    
+    }}
+    
+    
+    module.exports=AxeAudit;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/audits/accessibility/axe-audit.js");
+    },{"../../lib/i18n/i18n.js":66,"../audit.js":3}],3:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const statistics=require('../lib/statistics.js');
+    const Util=require('../report/html/renderer/util.js');
+    
+    const DEFAULT_PASS='defaultPass';
+    
+    
+    
+    
+    
+    
+    const clampTo2Decimals=val=>Math.round(val*100)/100;
+    
+    class Audit{
+    
+    
+    
+    static get DEFAULT_PASS(){
+    return DEFAULT_PASS;
+    }
+    
+    
+    
+    
+    static get SCORING_MODES(){
+    return{
+    NUMERIC:'numeric',
+    BINARY:'binary',
+    MANUAL:'manual',
+    INFORMATIVE:'informative',
+    NOT_APPLICABLE:'notApplicable',
+    ERROR:'error'};
+    
+    }
+    
+    
+    
+    
+    static get meta(){
+    throw new Error('Audit meta information must be overridden.');
+    }
+    
+    
+    
+    
+    static get defaultOptions(){
+    return{};
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static audit(artifacts,context){
+    throw new Error('audit() method must be overriden');
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static computeLogNormalScore(measuredValue,diminishingReturnsValue,medianValue){
+    const distribution=statistics.getLogNormalDistribution(
+    medianValue,
+    diminishingReturnsValue);
+    
+    
+    let score=distribution.computeComplementaryPercentile(measuredValue);
+    score=Math.min(1,score);
+    score=Math.max(0,score);
+    return clampTo2Decimals(score);
+    }
+    
+    
+    
+    
+    
+    
+    
+    static makeTableDetails(headings,results,summary){
+    if(results.length===0){
+    return{
+    type:'table',
+    headings:[],
+    items:[],
+    summary};
+    
+    }
+    
+    return{
+    type:'table',
+    headings:headings,
+    items:results,
+    summary};
+    
+    }
+    
+    
+    
+    
+    
+    static makeListDetails(items){
+    return{
+    type:'list',
+    items:items};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static makeSnippetDetails({
+    content,
+    title,
+    lineMessages,
+    generalMessages,
+    node,
+    maxLineLength=200,
+    maxLinesAroundMessage=20})
+    {
+    const allLines=Audit._makeSnippetLinesArray(content,maxLineLength);
+    const lines=Util.filterRelevantLines(allLines,lineMessages,maxLinesAroundMessage);
+    return{
+    type:'snippet',
+    lines,
+    title,
+    lineMessages,
+    generalMessages,
+    lineCount:allLines.length,
+    node};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static _makeSnippetLinesArray(content,maxLineLength){
+    return content.split('\n').map((line,lineIndex)=>{
+    const lineNumber=lineIndex+1;
+    
+    const lineDetail={
+    content:line.slice(0,maxLineLength),
+    lineNumber};
+    
+    if(line.length>maxLineLength){
+    lineDetail.truncated=true;
+    }
+    return lineDetail;
+    });
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    static makeOpportunityDetails(headings,items,overallSavingsMs,overallSavingsBytes){
+    return{
+    type:'opportunity',
+    headings:items.length===0?[]:headings,
+    items,
+    overallSavingsMs,
+    overallSavingsBytes};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    static _normalizeAuditScore(score,scoreDisplayMode,auditId){
+    if(scoreDisplayMode!==Audit.SCORING_MODES.BINARY&&
+    scoreDisplayMode!==Audit.SCORING_MODES.NUMERIC){
+    return null;
+    }
+    
+    
+    if(score===null||!Number.isFinite(score)){
+    throw new Error(`Invalid score for ${auditId}: ${score}`);
+    }
+    if(score>1)throw new Error(`Audit score for ${auditId} is > 1`);
+    if(score<0)throw new Error(`Audit score for ${auditId} is < 0`);
+    
+    score=clampTo2Decimals(score);
+    
+    return score;
+    }
+    
+    
+    
+    
+    
+    
+    static generateErrorAuditResult(audit,errorMessage){
+    return Audit.generateAuditResult(audit,{
+    score:null,
+    errorMessage});
+    
+    }
+    
+    
+    
+    
+    
+    
+    static generateAuditResult(audit,product){
+    if(product.score===undefined){
+    throw new Error('generateAuditResult requires a score');
+    }
+    
+    
+    let scoreDisplayMode=audit.meta.scoreDisplayMode||Audit.SCORING_MODES.BINARY;
+    
+    
+    if(product.errorMessage){
+    
+    scoreDisplayMode=Audit.SCORING_MODES.ERROR;
+    }else if(product.notApplicable){
+    
+    scoreDisplayMode=Audit.SCORING_MODES.NOT_APPLICABLE;
+    }
+    
+    const score=Audit._normalizeAuditScore(product.score,scoreDisplayMode,audit.meta.id);
+    
+    let auditTitle=audit.meta.title;
+    if(audit.meta.failureTitle){
+    if(score!==null&&score<Util.PASS_THRESHOLD){
+    auditTitle=audit.meta.failureTitle;
+    }
+    }
+    
+    return{
+    id:audit.meta.id,
+    title:auditTitle,
+    description:audit.meta.description,
+    
+    score,
+    scoreDisplayMode,
+    numericValue:product.numericValue,
+    
+    displayValue:product.displayValue,
+    explanation:product.explanation,
+    errorMessage:product.errorMessage,
+    warnings:product.warnings,
+    
+    details:product.details};
+    
+    }}
+    
+    
+    module.exports=Audit;
+    
+    },{"../lib/statistics.js":81,"../report/html/renderer/util.js":87}],4:[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('../audit.js');
+    const linearInterpolation=require('../../lib/statistics.js').linearInterpolation;
+    const Interactive=require('../../computed/metrics/lantern-interactive.js');
+    const i18n=require('../../lib/i18n/i18n.js');
+    const NetworkRecords=require('../../computed/network-records.js');
+    const LoadSimulator=require('../../computed/load-simulator.js');
+    const PageDependencyGraph=require('../../computed/page-dependency-graph.js');
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,{});
+    
+    
+    
+    
+    const KB_IN_BYTES=1024;
+    
+    const WASTED_MS_FOR_AVERAGE=300;
+    const WASTED_MS_FOR_POOR=750;
+    const WASTED_MS_FOR_SCORE_OF_ZERO=5000;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    class UnusedBytes extends Audit{
+    
+    
+    
+    
+    
+    
+    static scoreForWastedMs(wastedMs){
+    if(wastedMs===0){
+    return 1;
+    }else if(wastedMs<WASTED_MS_FOR_AVERAGE){
+    return linearInterpolation(0,1,WASTED_MS_FOR_AVERAGE,0.75,wastedMs);
+    }else if(wastedMs<WASTED_MS_FOR_POOR){
+    return linearInterpolation(WASTED_MS_FOR_AVERAGE,0.75,WASTED_MS_FOR_POOR,0.5,wastedMs);
+    }else{
+    return Math.max(
+    0,
+    linearInterpolation(WASTED_MS_FOR_POOR,0.5,WASTED_MS_FOR_SCORE_OF_ZERO,0,wastedMs));
+    
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static estimateTransferSize(networkRecord,totalBytes,resourceType){
+    if(!networkRecord){
+    
+    
+    
+    
+    switch(resourceType){
+    case'Stylesheet':
+    
+    return Math.round(totalBytes*0.2);
+    case'Script':
+    case'Document':
+    
+    return Math.round(totalBytes*0.33);
+    default:
+    
+    return Math.round(totalBytes*0.5);}
+    
+    }else if(networkRecord.resourceType===resourceType){
+    
+    return networkRecord.transferSize||0;
+    }else{
+    
+    
+    const transferSize=networkRecord.transferSize||0;
+    const resourceSize=networkRecord.resourceSize||0;
+    
+    const compressionRatio=Number.isFinite(resourceSize)&&resourceSize>0?
+    transferSize/resourceSize:1;
+    return Math.round(totalBytes*compressionRatio);
+    }
+    }
+    
+    
+    
+    
+    
+    
+    static audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const settings=context&&context.settings||{};
+    const simulatorOptions={
+    devtoolsLog,
+    settings};
+    
+    
+    return NetworkRecords.request(devtoolsLog,context).
+    then(networkRecords=>
+    Promise.all([
+    this.audit_(artifacts,networkRecords,context),
+    PageDependencyGraph.request({trace,devtoolsLog},context),
+    LoadSimulator.request(simulatorOptions,context)])).
+    
+    
+    then(([result,graph,simulator])=>this.createAuditProduct(result,graph,simulator));
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static computeWasteWithTTIGraph(results,graph,simulator,options){
+    options=Object.assign({includeLoad:true,label:this.meta.id},options);
+    const beforeLabel=`${options.label}-before`;
+    const afterLabel=`${options.label}-after`;
+    
+    const simulationBeforeChanges=simulator.simulate(graph,{label:beforeLabel});
+    
+    const resultsByUrl=new Map();
+    for(const result of results){
+    resultsByUrl.set(result.url,result);
+    }
+    
+    
+    
+    const originalTransferSizes=new Map();
+    graph.traverse(node=>{
+    if(node.type!=='network')return;
+    const result=resultsByUrl.get(node.record.url);
+    if(!result)return;
+    
+    const original=node.record.transferSize;
+    originalTransferSizes.set(node.record.requestId,original);
+    
+    const wastedBytes=result.wastedBytes;
+    node.record.transferSize=Math.max(original-wastedBytes,0);
+    });
+    
+    const simulationAfterChanges=simulator.simulate(graph,{label:afterLabel});
+    
+    
+    graph.traverse(node=>{
+    if(node.type!=='network')return;
+    const originalTransferSize=originalTransferSizes.get(node.record.requestId);
+    if(originalTransferSize===undefined)return;
+    node.record.transferSize=originalTransferSize;
+    });
+    
+    const savingsOnOverallLoad=simulationBeforeChanges.timeInMs-simulationAfterChanges.timeInMs;
+    const savingsOnTTI=Interactive.getLastLongTaskEndTime(simulationBeforeChanges.nodeTimings)-
+    Interactive.getLastLongTaskEndTime(simulationAfterChanges.nodeTimings);
+    
+    let savings=savingsOnTTI;
+    if(options.includeLoad)savings=Math.max(savings,savingsOnOverallLoad);
+    
+    
+    return Math.round(Math.max(savings,0)/10)*10;
+    }
+    
+    
+    
+    
+    
+    
+    
+    static createAuditProduct(result,graph,simulator){
+    const results=result.items.sort((itemA,itemB)=>itemB.wastedBytes-itemA.wastedBytes);
+    
+    const wastedBytes=results.reduce((sum,item)=>sum+item.wastedBytes,0);
+    const wastedKb=Math.round(wastedBytes/KB_IN_BYTES);
+    const wastedMs=this.computeWasteWithTTIGraph(results,graph,simulator);
+    
+    let displayValue=result.displayValue||'';
+    if(typeof result.displayValue==='undefined'&&wastedBytes){
+    displayValue=str_(i18n.UIStrings.displayValueByteSavings,{wastedBytes});
+    }
+    
+    const details=Audit.makeOpportunityDetails(result.headings,results,wastedMs,wastedBytes);
+    
+    return{
+    explanation:result.explanation,
+    warnings:result.warnings,
+    displayValue,
+    numericValue:wastedMs,
+    score:UnusedBytes.scoreForWastedMs(wastedMs),
+    extendedInfo:{
+    value:{
+    wastedMs,
+    wastedKb,
+    results}},
+    
+    
+    details};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static audit_(artifacts,networkRecords,context){
+    throw new Error('audit_ unimplemented');
+    }}
+    
+    
+    
+    
+    module.exports=UnusedBytes;
+    
+    }).call(this,"/lighthouse-core/audits/byte-efficiency/byte-efficiency-audit.js");
+    },{"../../computed/load-simulator.js":10,"../../computed/metrics/lantern-interactive.js":23,"../../computed/network-records.js":34,"../../computed/page-dependency-graph.js":35,"../../lib/i18n/i18n.js":66,"../../lib/statistics.js":81,"../audit.js":3}],5:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const Audit=require('../audit.js');
+    
+    class ManualAudit extends Audit{
+    
+    
+    
+    static get partialMeta(){
+    return{
+    scoreDisplayMode:Audit.SCORING_MODES.MANUAL,
+    requiredArtifacts:[]};
+    
+    }
+    
+    
+    
+    
+    static audit(){
+    return{
+    score:0};
+    
+    
+    }}
+    
+    
+    module.exports=ManualAudit;
+    
+    },{"../audit.js":3}],6:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    const Audit=require('./audit.js');
+    
+    class MultiCheckAudit extends Audit{
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const multiProduct=await this.audit_(artifacts,context);
+    return this.createAuditProduct(multiProduct);
+    }
+    
+    
+    
+    
+    
+    static createAuditProduct(result){
+    
+    const detailsItem={
+    ...result,
+    ...result.manifestValues,
+    manifestValues:undefined,
+    allChecks:undefined};
+    
+    
+    if(result.manifestValues&&result.manifestValues.allChecks){
+    result.manifestValues.allChecks.forEach(check=>{
+    detailsItem[check.id]=check.passing;
+    });
+    }
+    
+    
+    
+    const details={
+    type:'debugdata',
+    
+    items:[detailsItem]};
+    
+    
+    
+    if(result.failures.length>0){
+    return{
+    score:0,
+    
+    explanation:`Failures: ${result.failures.join(',\n')}.`,
+    details};
+    
+    }
+    
+    
+    return{
+    score:1,
+    details};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    static audit_(artifacts,context){
+    throw new Error('audit_ unimplemented');
+    }}
+    
+    
+    
+    
+    module.exports=MultiCheckAudit;
+    
+    },{"./audit.js":3}],7:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audit.js');
+    
+    class ViolationAudit extends Audit{
+    
+    
+    
+    
+    
+    static getViolationResults(artifacts,pattern){
+    const seen=new Set();
+    return artifacts.ConsoleMessages.
+    map(message=>message.entry).
+    filter(entry=>entry.url&&entry.source==='violation'&&pattern.test(entry.text)).
+    map(entry=>({label:`line: ${entry.lineNumber}`,url:entry.url})).
+    filter(entry=>{
+    
+    
+    const key=`${entry.url}!${entry.label}`;
+    if(seen.has(key))return false;
+    seen.add(key);
+    return true;
+    });
+    }}
+    
+    
+    module.exports=ViolationAudit;
+    
+    },{"./audit.js":3}],8:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const ArbitraryEqualityMap=require('../lib/arbitrary-equality-map.js');
+    const log=require('lighthouse-logger');
+    
+    
+    
+    
+    
+    
+    
+    function makeComputedArtifact(computableArtifact){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const request=(artifacts,context)=>{
+    const computedCache=context.computedCache;
+    const computedName=computableArtifact.name;
+    
+    const cache=computedCache.get(computedName)||new ArbitraryEqualityMap();
+    computedCache.set(computedName,cache);
+    
+    const computed=cache.get(artifacts);
+    if(computed){
+    return computed;
+    }
+    
+    const status={msg:`Computing artifact: ${computedName}`,id:`lh:computed:${computedName}`};
+    log.time(status,'verbose');
+    
+    const artifactPromise=
+    computableArtifact.compute_(artifacts,context);
+    cache.set(artifacts,artifactPromise);
+    
+    artifactPromise.then(()=>log.timeEnd(status)).catch(()=>log.timeEnd(status));
+    
+    return artifactPromise;
+    };
+    
+    return Object.assign(computableArtifact,{request});
+    }
+    
+    module.exports=makeComputedArtifact;
+    
+    },{"../lib/arbitrary-equality-map.js":55,"lighthouse-logger":125}],9:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('./computed-artifact.js');
+    const NetworkRequest=require('../lib/network-request.js');
+    const assert=require('assert');
+    const NetworkRecords=require('./network-records.js');
+    const MainResource=require('./main-resource.js');
+    
+    class CriticalRequestChains{
+    
+    
+    
+    
+    
+    
+    
+    
+    static isCritical(request,mainResource){
+    assert.ok(mainResource,'mainResource not provided');
+    
+    
+    if(request.isLinkPreload){
+    return false;
+    }
+    
+    
+    
+    
+    
+    while(request.redirectDestination){
+    request=request.redirectDestination;
+    }
+    
+    
+    const isIframe=request.resourceType===NetworkRequest.TYPES.Document&&
+    request.frameId!==mainResource.frameId;
+    
+    
+    
+    
+    const nonCriticalResourceTypes=[
+    NetworkRequest.TYPES.Image,
+    NetworkRequest.TYPES.XHR,
+    NetworkRequest.TYPES.Fetch,
+    NetworkRequest.TYPES.EventSource];
+    
+    if(nonCriticalResourceTypes.includes(request.resourceType||'Other')||
+    isIframe||
+    request.mimeType&&request.mimeType.startsWith('image/')){
+    return false;
+    }
+    
+    return['VeryHigh','High','Medium'].includes(request.priority);
+    }
+    
+    
+    
+    
+    
+    
+    static extractChain(networkRecords,mainResource){
+    networkRecords=networkRecords.filter(req=>req.finished);
+    
+    
+    
+    const requestIdToRequests=new Map();
+    for(const request of networkRecords){
+    requestIdToRequests.set(request.requestId,request);
+    }
+    
+    
+    
+    const criticalRequests=networkRecords.filter(request=>
+    CriticalRequestChains.isCritical(request,mainResource));
+    
+    
+    
+    const criticalRequestChains={};
+    for(const request of criticalRequests){
+    
+    
+    
+    
+    const ancestors=[];
+    let ancestorRequest=request.initiatorRequest;
+    
+    let node=criticalRequestChains;
+    while(ancestorRequest){
+    const ancestorIsCritical=CriticalRequestChains.isCritical(ancestorRequest,mainResource);
+    
+    
+    
+    
+    
+    if(!ancestorIsCritical||ancestors.includes(ancestorRequest.requestId)){
+    
+    
+    ancestors.length=0;
+    node=undefined;
+    break;
+    }
+    ancestors.push(ancestorRequest.requestId);
+    ancestorRequest=ancestorRequest.initiatorRequest;
+    }
+    
+    
+    
+    let ancestor=ancestors.pop();
+    while(ancestor&&node){
+    const parentRequest=requestIdToRequests.get(ancestor);
+    if(!parentRequest){
+    throw new Error(`request with id ${ancestor} not found.`);
+    }
+    
+    const parentRequestId=parentRequest.requestId;
+    if(!node[parentRequestId]){
+    node[parentRequestId]={
+    request:parentRequest,
+    children:{}};
+    
+    }
+    
+    
+    ancestor=ancestors.pop();
+    node=node[parentRequestId].children;
+    }
+    
+    if(!node){
+    continue;
+    }
+    
+    
+    if(node[request.requestId]){
+    continue;
+    }
+    
+    
+    node[request.requestId]={
+    request,
+    children:{}};
+    
+    }
+    
+    return criticalRequestChains;
+    }
+    
+    
+    
+    
+    
+    
+    static async compute_(data,context){
+    const[networkRecords,mainResource]=await Promise.all([
+    NetworkRecords.request(data.devtoolsLog,context),
+    MainResource.request(data,context)]);
+    
+    
+    return CriticalRequestChains.extractChain(networkRecords,mainResource);
+    }}
+    
+    
+    module.exports=makeComputedArtifact(CriticalRequestChains);
+    
+    },{"../lib/network-request.js":75,"./computed-artifact.js":8,"./main-resource.js":11,"./network-records.js":34,"assert":92}],10:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('./computed-artifact.js');
+    const constants=require('../config/constants.js');
+    const Simulator=require('../lib/dependency-graph/simulator/simulator.js');
+    const NetworkAnalysis=require('./network-analysis.js');
+    
+    class LoadSimulator{
+    
+    
+    
+    
+    
+    static async compute_(data,context){
+    const{throttlingMethod,throttling,precomputedLanternData}=data.settings;
+    const networkAnalysis=await NetworkAnalysis.request(data.devtoolsLog,context);
+    
+    
+    const options={
+    additionalRttByOrigin:networkAnalysis.additionalRttByOrigin,
+    serverResponseTimeByOrigin:networkAnalysis.serverResponseTimeByOrigin};
+    
+    
+    
+    
+    if(precomputedLanternData){
+    options.additionalRttByOrigin=new Map(Object.entries(
+    precomputedLanternData.additionalRttByOrigin));
+    options.serverResponseTimeByOrigin=new Map(Object.entries(
+    precomputedLanternData.serverResponseTimeByOrigin));
+    }
+    
+    switch(throttlingMethod){
+    case'provided':
+    options.rtt=networkAnalysis.rtt;
+    options.throughput=networkAnalysis.throughput;
+    options.cpuSlowdownMultiplier=1;
+    options.layoutTaskMultiplier=1;
+    break;
+    case'devtools':
+    if(throttling){
+    options.rtt=
+    throttling.requestLatencyMs/constants.throttling.DEVTOOLS_RTT_ADJUSTMENT_FACTOR;
+    options.throughput=
+    throttling.downloadThroughputKbps*1024/
+    constants.throttling.DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR;
+    }
+    
+    options.cpuSlowdownMultiplier=1;
+    options.layoutTaskMultiplier=1;
+    break;
+    case'simulate':
+    if(throttling){
+    options.rtt=throttling.rttMs;
+    options.throughput=throttling.throughputKbps*1024;
+    options.cpuSlowdownMultiplier=throttling.cpuSlowdownMultiplier;
+    }
+    break;
+    default:
+    
+    break;}
+    
+    
+    return new Simulator(options);
+    }
+    
+    
+    
+    
+    
+    static convertAnalysisToSaveableLanternData(networkAnalysis){
+    
+    const lanternData={additionalRttByOrigin:{},serverResponseTimeByOrigin:{}};
+    for(const[origin,value]of networkAnalysis.additionalRttByOrigin.entries()){
+    if(origin.startsWith('http'))lanternData.additionalRttByOrigin[origin]=value;
+    }
+    
+    for(const[origin,value]of networkAnalysis.serverResponseTimeByOrigin.entries()){
+    if(origin.startsWith('http'))lanternData.serverResponseTimeByOrigin[origin]=value;
+    }
+    
+    return lanternData;
+    }}
+    
+    
+    module.exports=makeComputedArtifact(LoadSimulator);
+    
+    },{"../config/constants.js":46,"../lib/dependency-graph/simulator/simulator.js":63,"./computed-artifact.js":8,"./network-analysis.js":33}],11:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('./computed-artifact.js');
+    const NetworkAnalyzer=require('../lib/dependency-graph/simulator/network-analyzer.js');
+    const NetworkRecords=require('./network-records.js');
+    
+    
+    
+    
+    
+    class MainResource{
+    
+    
+    
+    
+    
+    static async compute_(data,context){
+    const finalUrl=data.URL.finalUrl;
+    const requests=await NetworkRecords.request(data.devtoolsLog,context);
+    const mainResource=NetworkAnalyzer.findMainDocument(requests,finalUrl);
+    if(!mainResource){
+    throw new Error('Unable to identify the main resource');
+    }
+    
+    return mainResource;
+    }}
+    
+    
+    module.exports=makeComputedArtifact(MainResource);
+    
+    },{"../lib/dependency-graph/simulator/network-analyzer.js":62,"./computed-artifact.js":8,"./network-records.js":34}],12:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('./computed-artifact.js');
+    const MainThreadTasks_=require('../lib/tracehouse/main-thread-tasks.js');
+    const TraceOfTab=require('./trace-of-tab.js');
+    
+    class MainThreadTasks{
+    
+    
+    
+    
+    
+    static async compute_(trace,context){
+    const{mainThreadEvents,timestamps}=await TraceOfTab.request(trace,context);
+    return MainThreadTasks_.getMainThreadTasks(mainThreadEvents,timestamps.traceEnd);
+    }}
+    
+    
+    module.exports=makeComputedArtifact(MainThreadTasks);
+    
+    },{"../lib/tracehouse/main-thread-tasks.js":83,"./computed-artifact.js":8,"./trace-of-tab.js":39}],13:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('./computed-artifact.js');
+    const icons=require('../lib/icons.js');
+    
+    const PWA_DISPLAY_VALUES=['minimal-ui','fullscreen','standalone'];
+    
+    
+    
+    const SUGGESTED_SHORTNAME_LENGTH=12;
+    
+    class ManifestValues{
+    
+    
+    
+    
+    
+    static get manifestChecks(){
+    return[
+    {
+    id:'hasStartUrl',
+    failureText:'Manifest does not contain a `start_url`',
+    validate:manifestValue=>!!manifestValue.start_url.value},
+    
+    {
+    id:'hasIconsAtLeast192px',
+    failureText:'Manifest does not have a PNG icon of at least 192px',
+    validate:manifestValue=>icons.doExist(manifestValue)&&
+    icons.pngSizedAtLeast(192,manifestValue).length>0},
+    
+    {
+    id:'hasIconsAtLeast512px',
+    failureText:'Manifest does not have a PNG icon of at least 512px',
+    validate:manifestValue=>icons.doExist(manifestValue)&&
+    icons.pngSizedAtLeast(512,manifestValue).length>0},
+    
+    {
+    id:'hasPWADisplayValue',
+    failureText:'Manifest\'s `display` value is not one of: '+PWA_DISPLAY_VALUES.join(' | '),
+    validate:manifestValue=>PWA_DISPLAY_VALUES.includes(manifestValue.display.value)},
+    
+    {
+    id:'hasBackgroundColor',
+    failureText:'Manifest does not have `background_color`',
+    validate:manifestValue=>!!manifestValue.background_color.value},
+    
+    {
+    id:'hasThemeColor',
+    failureText:'Manifest does not have `theme_color`',
+    validate:manifestValue=>!!manifestValue.theme_color.value},
+    
+    {
+    id:'hasShortName',
+    failureText:'Manifest does not have `short_name`',
+    validate:manifestValue=>!!manifestValue.short_name.value},
+    
+    {
+    id:'shortNameLength',
+    failureText:`Manifest's \`short_name\` is too long (>${SUGGESTED_SHORTNAME_LENGTH} `+
+    `characters) to be displayed on a homescreen without truncation`,
+    
+    validate:manifestValue=>!!manifestValue.short_name.value&&
+    manifestValue.short_name.value.length<=SUGGESTED_SHORTNAME_LENGTH},
+    
+    {
+    id:'hasName',
+    failureText:'Manifest does not have `name`',
+    validate:manifestValue=>!!manifestValue.name.value}];
+    
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async compute_(manifest){
+    
+    if(manifest===null){
+    return{
+    isParseFailure:true,
+    parseFailureReason:'No manifest was fetched',
+    allChecks:[]};
+    
+    }
+    const manifestValue=manifest.value;
+    if(manifestValue===undefined){
+    return{
+    isParseFailure:true,
+    parseFailureReason:'Manifest failed to parse as valid JSON',
+    allChecks:[]};
+    
+    }
+    
+    
+    const remainingChecks=ManifestValues.manifestChecks.map(item=>{
+    return{
+    id:item.id,
+    failureText:item.failureText,
+    passing:item.validate(manifestValue)};
+    
+    });
+    
+    return{
+    isParseFailure:false,
+    allChecks:remainingChecks};
+    
+    }}
+    
+    
+    module.exports=makeComputedArtifact(ManifestValues);
+    
+    },{"../lib/icons.js":68,"./computed-artifact.js":8}],14:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('../computed-artifact.js');
+    const ComputedMetric=require('./metric.js');
+    const LHError=require('../../lib/lh-error.js');
+    const TracingProcessor=require('../../lib/tracehouse/trace-processor.js');
+    const LanternEstimatedInputLatency=require('./lantern-estimated-input-latency.js');
+    
+    const ROLLING_WINDOW_SIZE=5000;
+    
+    
+    
+    
+    
+    
+    class EstimatedInputLatency extends ComputedMetric{
+    
+    
+    
+    
+    static calculateRollingWindowEIL(events){
+    const candidateStartEvts=events.filter(evt=>evt.duration>=10);
+    
+    let worst90thPercentileLatency=16;
+    for(const startEvt of candidateStartEvts){
+    const latencyPercentiles=TracingProcessor.getRiskToResponsiveness(
+    events,
+    startEvt.start,
+    startEvt.start+ROLLING_WINDOW_SIZE,
+    [0.9]);
+    
+    
+    worst90thPercentileLatency=Math.max(latencyPercentiles[0].time,worst90thPercentileLatency);
+    }
+    
+    return worst90thPercentileLatency;
+    }
+    
+    
+    
+    
+    
+    
+    static computeSimulatedMetric(data,context){
+    return LanternEstimatedInputLatency.request(data,context);
+    }
+    
+    
+    
+    
+    
+    static computeObservedMetric(data){
+    const{firstMeaningfulPaint}=data.traceOfTab.timings;
+    if(!firstMeaningfulPaint){
+    throw new LHError(LHError.errors.NO_FMP);
+    }
+    
+    const events=TracingProcessor.getMainThreadTopLevelEvents(
+    data.traceOfTab,
+    firstMeaningfulPaint).
+    filter(evt=>evt.duration>=1);
+    
+    return Promise.resolve({
+    timing:EstimatedInputLatency.calculateRollingWindowEIL(events)});
+    
+    }}
+    
+    
+    module.exports=makeComputedArtifact(EstimatedInputLatency);
+    
+    },{"../../lib/lh-error.js":71,"../../lib/tracehouse/trace-processor.js":85,"../computed-artifact.js":8,"./lantern-estimated-input-latency.js":19,"./metric.js":30}],15:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('../computed-artifact.js');
+    const ComputedMetric=require('./metric.js');
+    const LanternFirstContentfulPaint=require('./lantern-first-contentful-paint.js');
+    
+    class FirstContentfulPaint extends ComputedMetric{
+    
+    
+    
+    
+    
+    static computeSimulatedMetric(data,context){
+    return LanternFirstContentfulPaint.request(data,context);
+    }
+    
+    
+    
+    
+    
+    static async computeObservedMetric(data){
+    const{traceOfTab}=data;
+    
+    return{
+    timing:traceOfTab.timings.firstContentfulPaint,
+    timestamp:traceOfTab.timestamps.firstContentfulPaint};
+    
+    }}
+    
+    
+    module.exports=makeComputedArtifact(FirstContentfulPaint);
+    
+    },{"../computed-artifact.js":8,"./lantern-first-contentful-paint.js":20,"./metric.js":30}],16:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('../computed-artifact.js');
+    const ComputedMetric=require('./metric.js');
+    const TracingProcessor=require('../../lib/tracehouse/trace-processor.js');
+    const LHError=require('../../lib/lh-error.js');
+    const LanternFirstCPUIdle=require('./lantern-first-cpu-idle.js');
+    
+    const LONG_TASK_THRESHOLD=50;
+    
+    const MAX_TASK_CLUSTER_DURATION=250;
+    const MIN_TASK_CLUSTER_PADDING=1000;
+    const MIN_TASK_CLUSTER_FMP_DISTANCE=5000;
+    
+    const MAX_QUIET_WINDOW_SIZE=5000;
+    
+    
+    const EXPONENTIATION_COEFFICIENT=-Math.log(3-1)/15;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    class FirstCPUIdle extends ComputedMetric{
+    
+    
+    
+    
+    static getRequiredWindowSizeInMs(t){
+    const tInSeconds=t/1000;
+    const exponentiationComponent=Math.exp(EXPONENTIATION_COEFFICIENT*tInSeconds);
+    return(4*exponentiationComponent+1)*1000;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static getTaskClustersInWindow(tasks,startIndex,windowEnd){
+    const clusters=[];
+    
+    let previousTaskEndTime=-Infinity;
+    
+    let currentCluster=[];
+    
+    
+    
+    
+    
+    const clusteringWindowEnd=windowEnd+MIN_TASK_CLUSTER_PADDING;
+    
+    const isInClusteringWindow=task=>task.start<clusteringWindowEnd;
+    for(let i=startIndex;i<tasks.length;i++){
+    if(!isInClusteringWindow(tasks[i])){
+    break;
+    }
+    
+    const task=tasks[i];
+    
+    
+    if(task.start-previousTaskEndTime>MIN_TASK_CLUSTER_PADDING){
+    currentCluster=[];
+    clusters.push(currentCluster);
+    }
+    
+    currentCluster.push(task);
+    previousTaskEndTime=task.end;
+    }
+    
+    return clusters.
+    
+    map(tasks=>{
+    const start=tasks[0].start;
+    const end=tasks[tasks.length-1].end;
+    const duration=end-start;
+    return{start,end,duration};
+    }).
+    
+    filter(cluster=>cluster.start<windowEnd);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static findQuietWindow(FMP,traceEnd,longTasks){
+    
+    if(longTasks.length===0||
+    longTasks[0].start>FMP+FirstCPUIdle.getRequiredWindowSizeInMs(0)){
+    return FMP;
+    }
+    
+    
+    const isTooCloseToFMP=cluster=>cluster.start<FMP+MIN_TASK_CLUSTER_FMP_DISTANCE;
+    
+    const isTooLong=cluster=>cluster.duration>MAX_TASK_CLUSTER_DURATION;
+    
+    const isBadCluster=cluster=>isTooCloseToFMP(cluster)||isTooLong(cluster);
+    
+    
+    
+    for(let i=0;i<longTasks.length;i++){
+    const windowStart=longTasks[i].end;
+    const windowSize=FirstCPUIdle.getRequiredWindowSizeInMs(windowStart-FMP);
+    const windowEnd=windowStart+windowSize;
+    
+    
+    if(windowEnd>traceEnd){
+    throw new LHError(LHError.errors.NO_FCPUI_IDLE_PERIOD);
+    }
+    
+    
+    if(i+1<longTasks.length&&
+    longTasks[i+1].start-windowStart<=MIN_TASK_CLUSTER_PADDING){
+    continue;
+    }
+    
+    const taskClusters=FirstCPUIdle.getTaskClustersInWindow(longTasks,i+1,windowEnd);
+    const hasBadTaskClusters=taskClusters.some(isBadCluster);
+    
+    if(!hasBadTaskClusters){
+    return windowStart;
+    }
+    }
+    
+    throw new LHError(LHError.errors.NO_FCPUI_IDLE_PERIOD);
+    }
+    
+    
+    
+    
+    
+    
+    static computeSimulatedMetric(data,context){
+    return LanternFirstCPUIdle.request(data,context);
+    }
+    
+    
+    
+    
+    
+    static async computeObservedMetric(data){
+    const{traceOfTab}=data;
+    const navStart=traceOfTab.timestamps.navigationStart;
+    const FMP=traceOfTab.timings.firstMeaningfulPaint;
+    const DCL=traceOfTab.timings.domContentLoaded;
+    const traceEnd=traceOfTab.timings.traceEnd;
+    
+    if(!FMP||!DCL){
+    throw new LHError(FMP?LHError.errors.NO_DCL:LHError.errors.NO_FMP);
+    }
+    
+    if(traceEnd-FMP<MAX_QUIET_WINDOW_SIZE){
+    throw new LHError(LHError.errors.FMP_TOO_LATE_FOR_FCPUI);
+    }
+    
+    const longTasksAfterFMP=TracingProcessor.getMainThreadTopLevelEvents(traceOfTab,FMP).
+    filter(evt=>evt.duration>=LONG_TASK_THRESHOLD);
+    const firstInteractive=FirstCPUIdle.findQuietWindow(FMP,traceEnd,longTasksAfterFMP);
+    
+    const valueInMs=Math.max(firstInteractive,DCL);
+    
+    return Promise.resolve({
+    timing:valueInMs,
+    timestamp:valueInMs*1000+navStart});
+    
+    }}
+    
+    
+    
+    
+    
+    
+    
+    module.exports=makeComputedArtifact(FirstCPUIdle);
+    
+    },{"../../lib/lh-error.js":71,"../../lib/tracehouse/trace-processor.js":85,"../computed-artifact.js":8,"./lantern-first-cpu-idle.js":21,"./metric.js":30}],17:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('../computed-artifact.js');
+    const ComputedMetric=require('./metric.js');
+    const LHError=require('../../lib/lh-error.js');
+    const LanternFirstMeaningfulPaint=require('./lantern-first-meaningful-paint.js');
+    
+    class FirstMeaningfulPaint extends ComputedMetric{
+    
+    
+    
+    
+    
+    static computeSimulatedMetric(data,context){
+    return LanternFirstMeaningfulPaint.request(data,context);
+    }
+    
+    
+    
+    
+    
+    static async computeObservedMetric(data){
+    const{traceOfTab}=data;
+    if(!traceOfTab.timestamps.firstMeaningfulPaint){
+    throw new LHError(LHError.errors.NO_FMP);
+    }
+    
+    return{
+    
+    timing:traceOfTab.timings.firstMeaningfulPaint,
+    timestamp:traceOfTab.timestamps.firstMeaningfulPaint};
+    
+    }}
+    
+    
+    module.exports=makeComputedArtifact(FirstMeaningfulPaint);
+    
+    },{"../../lib/lh-error.js":71,"../computed-artifact.js":8,"./lantern-first-meaningful-paint.js":22,"./metric.js":30}],18:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('../computed-artifact.js');
+    const ComputedMetric=require('./metric.js');
+    const LanternInteractive=require('./lantern-interactive.js');
+    
+    const NetworkRecorder=require('../../lib/network-recorder.js');
+    const TracingProcessor=require('../../lib/tracehouse/trace-processor.js');
+    const LHError=require('../../lib/lh-error.js');
+    
+    const REQUIRED_QUIET_WINDOW=5000;
+    const ALLOWED_CONCURRENT_REQUESTS=2;
+    
+    
+    
+    
+    
+    
+    class Interactive extends ComputedMetric{
+    
+    
+    
+    
+    
+    
+    
+    static _findNetworkQuietPeriods(networkRecords,traceOfTab){
+    const traceEndTsInMs=traceOfTab.timestamps.traceEnd/1000;
+    
+    const filteredNetworkRecords=networkRecords.filter(record=>{
+    return record.finished&&record.requestMethod==='GET'&&!record.failed&&
+    
+    record.statusCode<400;
+    });
+    return NetworkRecorder.findNetworkQuietPeriods(filteredNetworkRecords,
+    ALLOWED_CONCURRENT_REQUESTS,traceEndTsInMs);
+    }
+    
+    
+    
+    
+    
+    
+    
+    static _findCPUQuietPeriods(longTasks,traceOfTab){
+    const navStartTsInMs=traceOfTab.timestamps.navigationStart/1000;
+    const traceEndTsInMs=traceOfTab.timestamps.traceEnd/1000;
+    if(longTasks.length===0){
+    return[{start:0,end:traceEndTsInMs}];
+    }
+    
+    
+    const quietPeriods=[];
+    longTasks.forEach((task,index)=>{
+    if(index===0){
+    quietPeriods.push({
+    start:0,
+    end:task.start+navStartTsInMs});
+    
+    }
+    
+    if(index===longTasks.length-1){
+    quietPeriods.push({
+    start:task.end+navStartTsInMs,
+    end:traceEndTsInMs});
+    
+    }else{
+    quietPeriods.push({
+    start:task.end+navStartTsInMs,
+    end:longTasks[index+1].start+navStartTsInMs});
+    
+    }
+    });
+    
+    return quietPeriods;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    static findOverlappingQuietPeriods(longTasks,networkRecords,traceOfTab){
+    const FcpTsInMs=traceOfTab.timestamps.firstContentfulPaint/1000;
+    
+    
+    const isLongEnoughQuietPeriod=period=>
+    period.end>FcpTsInMs+REQUIRED_QUIET_WINDOW&&
+    period.end-period.start>=REQUIRED_QUIET_WINDOW;
+    const networkQuietPeriods=this._findNetworkQuietPeriods(networkRecords,traceOfTab).
+    filter(isLongEnoughQuietPeriod);
+    const cpuQuietPeriods=this._findCPUQuietPeriods(longTasks,traceOfTab).
+    filter(isLongEnoughQuietPeriod);
+    
+    const cpuQueue=cpuQuietPeriods.slice();
+    const networkQueue=networkQuietPeriods.slice();
+    
+    
+    let cpuCandidate=cpuQueue.shift();
+    let networkCandidate=networkQueue.shift();
+    while(cpuCandidate&&networkCandidate){
+    if(cpuCandidate.start>=networkCandidate.start){
+    
+    if(networkCandidate.end>=cpuCandidate.start+REQUIRED_QUIET_WINDOW){
+    return{
+    cpuQuietPeriod:cpuCandidate,
+    networkQuietPeriod:networkCandidate,
+    cpuQuietPeriods,
+    networkQuietPeriods};
+    
+    }else{
+    networkCandidate=networkQueue.shift();
+    }
+    }else{
+    
+    if(cpuCandidate.end>=networkCandidate.start+REQUIRED_QUIET_WINDOW){
+    return{
+    cpuQuietPeriod:cpuCandidate,
+    networkQuietPeriod:networkCandidate,
+    cpuQuietPeriods,
+    networkQuietPeriods};
+    
+    }else{
+    cpuCandidate=cpuQueue.shift();
+    }
+    }
+    }
+    
+    throw new LHError(
+    cpuCandidate?
+    LHError.errors.NO_TTI_NETWORK_IDLE_PERIOD:
+    LHError.errors.NO_TTI_CPU_IDLE_PERIOD);
+    
+    }
+    
+    
+    
+    
+    
+    
+    static computeSimulatedMetric(data,context){
+    return LanternInteractive.request(data,context);
+    }
+    
+    
+    
+    
+    
+    static computeObservedMetric(data){
+    const{traceOfTab,networkRecords}=data;
+    
+    if(!traceOfTab.timestamps.domContentLoaded){
+    throw new LHError(LHError.errors.NO_DCL);
+    }
+    
+    const longTasks=TracingProcessor.getMainThreadTopLevelEvents(traceOfTab).
+    filter(event=>event.duration>=50);
+    const quietPeriodInfo=Interactive.findOverlappingQuietPeriods(
+    longTasks,
+    networkRecords,
+    traceOfTab);
+    
+    
+    const cpuQuietPeriod=quietPeriodInfo.cpuQuietPeriod;
+    
+    const timestamp=Math.max(
+    cpuQuietPeriod.start,
+    traceOfTab.timestamps.firstContentfulPaint/1000,
+    traceOfTab.timestamps.domContentLoaded/1000)*
+    1000;
+    const timing=(timestamp-traceOfTab.timestamps.navigationStart)/1000;
+    return Promise.resolve({timing,timestamp});
+    }}
+    
+    
+    module.exports=makeComputedArtifact(Interactive);
+    
+    
+    
+    
+    
+    
+    
+    },{"../../lib/lh-error.js":71,"../../lib/network-recorder.js":74,"../../lib/tracehouse/trace-processor.js":85,"../computed-artifact.js":8,"./lantern-interactive.js":23,"./metric.js":30}],19:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('../computed-artifact.js');
+    const LanternMetric=require('./lantern-metric.js');
+    const BaseNode=require('../../lib/dependency-graph/base-node.js');
+    const LanternFirstMeaningfulPaint=require('./lantern-first-meaningful-paint.js');
+    
+    
+    
+    class LanternEstimatedInputLatency extends LanternMetric{
+    
+    
+    
+    static get COEFFICIENTS(){
+    return{
+    intercept:0,
+    optimistic:0.4,
+    pessimistic:0.4};
+    
+    }
+    
+    
+    
+    
+    
+    static getOptimisticGraph(dependencyGraph){
+    return dependencyGraph;
+    }
+    
+    
+    
+    
+    
+    static getPessimisticGraph(dependencyGraph){
+    return dependencyGraph;
+    }
+    
+    
+    
+    
+    
+    
+    static getEstimateFromSimulation(simulation,extras){
+    
+    
+    const fmpTimeInMs=extras.optimistic?
+    extras.fmpResult.pessimisticEstimate.timeInMs:
+    extras.fmpResult.optimisticEstimate.timeInMs;
+    
+    const events=LanternEstimatedInputLatency.getEventsAfterFMP(
+    simulation.nodeTimings,
+    fmpTimeInMs);
+    
+    
+    
+    const EstimatedInputLatency=require('./estimated-input-latency.js');
+    
+    return{
+    timeInMs:EstimatedInputLatency.calculateRollingWindowEIL(events),
+    nodeTimings:simulation.nodeTimings};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async compute_(data,context){
+    const fmpResult=await LanternFirstMeaningfulPaint.request(data,context);
+    return this.computeMetricWithGraphs(data,context,{fmpResult});
+    }
+    
+    
+    
+    
+    
+    static getEventsAfterFMP(nodeTimings,fmpTimeInMs){
+    
+    const events=[];
+    for(const[node,timing]of nodeTimings.entries()){
+    if(node.type!==BaseNode.TYPES.CPU)continue;
+    if(timing.endTime<fmpTimeInMs)continue;
+    
+    events.push({
+    start:timing.startTime,
+    end:timing.endTime,
+    duration:timing.duration});
+    
+    }
+    
+    return events.sort((a,b)=>a.start-b.start);
+    }}
+    
+    
+    module.exports=makeComputedArtifact(LanternEstimatedInputLatency);
+    
+    },{"../../lib/dependency-graph/base-node.js":57,"../computed-artifact.js":8,"./estimated-input-latency.js":14,"./lantern-first-meaningful-paint.js":22,"./lantern-metric.js":25}],20:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('../computed-artifact.js');
+    const LanternMetric=require('./lantern-metric.js');
+    const BaseNode=require('../../lib/dependency-graph/base-node.js');
+    
+    
+    
+    
+    
+    class LanternFirstContentfulPaint extends LanternMetric{
+    
+    
+    
+    static get COEFFICIENTS(){
+    return{
+    intercept:0,
+    optimistic:0.5,
+    pessimistic:0.5};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static getBlockingNodeData(
+    graph,
+    filterTimestamp,
+    blockingScriptFilter,
+    extraBlockingCpuNodesToIncludeFilter)
+    {
+    
+    const scriptUrlToNodeMap=new Map();
+    
+    
+    const cpuNodes=[];
+    graph.traverse(node=>{
+    if(node.type===BaseNode.TYPES.CPU){
+    
+    
+    if(node.startTime<=filterTimestamp)cpuNodes.push(node);
+    
+    
+    const scriptUrls=node.getEvaluateScriptURLs();
+    for(const url of scriptUrls){
+    
+    const existing=scriptUrlToNodeMap.get(url)||node;
+    scriptUrlToNodeMap.set(url,node.startTime<existing.startTime?node:existing);
+    }
+    }
+    });
+    
+    cpuNodes.sort((a,b)=>a.startTime-b.startTime);
+    
+    
+    const possiblyRenderBlockingScriptUrls=LanternMetric.getScriptUrls(graph,node=>{
+    return node.endTime<=filterTimestamp&&blockingScriptFilter(node);
+    });
+    
+    
+    
+    const definitelyNotRenderBlockingScriptUrls=new Set();
+    
+    const blockingCpuNodeIds=new Set();
+    for(const url of possiblyRenderBlockingScriptUrls){
+    
+    const cpuNodeForUrl=scriptUrlToNodeMap.get(url);
+    
+    
+    if(!cpuNodeForUrl)continue;
+    
+    
+    if(cpuNodes.includes(cpuNodeForUrl)){
+    blockingCpuNodeIds.add(cpuNodeForUrl.id);
+    continue;
+    }
+    
+    
+    
+    definitelyNotRenderBlockingScriptUrls.add(url);
+    }
+    
+    
+    
+    const firstLayout=cpuNodes.find(node=>node.didPerformLayout());
+    if(firstLayout)blockingCpuNodeIds.add(firstLayout.id);
+    const firstPaint=cpuNodes.find(node=>node.childEvents.some(e=>e.name==='Paint'));
+    if(firstPaint)blockingCpuNodeIds.add(firstPaint.id);
+    const firstParse=cpuNodes.find(node=>node.childEvents.some(e=>e.name==='ParseHTML'));
+    if(firstParse)blockingCpuNodeIds.add(firstParse.id);
+    
+    
+    if(extraBlockingCpuNodesToIncludeFilter){
+    cpuNodes.
+    filter(extraBlockingCpuNodesToIncludeFilter).
+    forEach(node=>blockingCpuNodeIds.add(node.id));
+    }
+    
+    return{
+    definitelyNotRenderBlockingScriptUrls,
+    blockingCpuNodeIds};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static getFirstPaintBasedGraph(
+    dependencyGraph,
+    paintTs,
+    blockingResourcesFilter,
+    extraBlockingCpuNodesToIncludeFilter)
+    {
+    const{
+    definitelyNotRenderBlockingScriptUrls,
+    blockingCpuNodeIds}=
+    this.getBlockingNodeData(
+    dependencyGraph,
+    paintTs,
+    blockingResourcesFilter,
+    extraBlockingCpuNodesToIncludeFilter);
+    
+    
+    return dependencyGraph.cloneWithRelationships(node=>{
+    if(node.type===BaseNode.TYPES.NETWORK){
+    
+    if(node.endTime>paintTs&&!node.isMainDocument())return false;
+    
+    const url=node.record.url;
+    
+    if(definitelyNotRenderBlockingScriptUrls.has(url)){
+    return false;
+    }
+    
+    return blockingResourcesFilter(node);
+    }else{
+    
+    return blockingCpuNodeIds.has(node.id);
+    }
+    });
+    }
+    
+    
+    
+    
+    
+    
+    static getOptimisticGraph(dependencyGraph,traceOfTab){
+    return this.getFirstPaintBasedGraph(
+    dependencyGraph,
+    traceOfTab.timestamps.firstContentfulPaint,
+    
+    
+    
+    node=>node.hasRenderBlockingPriority()&&node.initiatorType!=='script');
+    
+    }
+    
+    
+    
+    
+    
+    
+    static getPessimisticGraph(dependencyGraph,traceOfTab){
+    return this.getFirstPaintBasedGraph(
+    dependencyGraph,
+    traceOfTab.timestamps.firstContentfulPaint,
+    node=>node.hasRenderBlockingPriority());
+    
+    }}
+    
+    
+    module.exports=makeComputedArtifact(LanternFirstContentfulPaint);
+    
+    },{"../../lib/dependency-graph/base-node.js":57,"../computed-artifact.js":8,"./lantern-metric.js":25}],21:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('../computed-artifact.js');
+    const BaseNode=require('../../lib/dependency-graph/base-node.js');
+    const LanternInteractive=require('./lantern-interactive.js');
+    
+    class LanternFirstCPUIdle extends LanternInteractive{
+    
+    
+    
+    static get COEFFICIENTS(){
+    return{
+    intercept:0,
+    optimistic:1,
+    pessimistic:0};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    static getEstimateFromSimulation(simulation,extras){
+    const fmpTimeInMs=extras.optimistic?
+    extras.fmpResult.optimisticEstimate.timeInMs:
+    extras.fmpResult.pessimisticEstimate.timeInMs;
+    
+    return{
+    timeInMs:LanternFirstCPUIdle.getFirstCPUIdleWindowStart(simulation.nodeTimings,fmpTimeInMs),
+    nodeTimings:simulation.nodeTimings};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static getFirstCPUIdleWindowStart(nodeTimings,fmpTimeInMs,longTaskLength=50){
+    
+    const longTasks=[];
+    for(const[node,timing]of nodeTimings.entries()){
+    if(node.type!==BaseNode.TYPES.CPU)continue;
+    if(timing.duration<longTaskLength)continue;
+    longTasks.push({start:timing.startTime,end:timing.endTime});
+    }
+    
+    longTasks.sort((a,b)=>a.start-b.start);
+    
+    const FirstCPUIdle=require('./first-cpu-idle.js');
+    return FirstCPUIdle.findQuietWindow(fmpTimeInMs,Infinity,longTasks);
+    }
+    
+    
+    
+    
+    
+    
+    static async compute_(data,context){
+    return super.compute_(data,context);
+    }}
+    
+    
+    module.exports=makeComputedArtifact(LanternFirstCPUIdle);
+    
+    },{"../../lib/dependency-graph/base-node.js":57,"../computed-artifact.js":8,"./first-cpu-idle.js":16,"./lantern-interactive.js":23}],22:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('../computed-artifact.js');
+    const LanternMetric=require('./lantern-metric.js');
+    const LHError=require('../../lib/lh-error.js');
+    const LanternFirstContentfulPaint=require('./lantern-first-contentful-paint.js');
+    
+    
+    
+    class LanternFirstMeaningfulPaint extends LanternMetric{
+    
+    
+    
+    static get COEFFICIENTS(){
+    return{
+    intercept:0,
+    optimistic:0.5,
+    pessimistic:0.5};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static getOptimisticGraph(dependencyGraph,traceOfTab){
+    const fmp=traceOfTab.timestamps.firstMeaningfulPaint;
+    if(!fmp){
+    throw new LHError(LHError.errors.NO_FMP);
+    }
+    
+    return LanternFirstContentfulPaint.getFirstPaintBasedGraph(
+    dependencyGraph,
+    fmp,
+    
+    
+    node=>node.hasRenderBlockingPriority()&&node.initiatorType!=='script');
+    
+    }
+    
+    
+    
+    
+    
+    
+    static getPessimisticGraph(dependencyGraph,traceOfTab){
+    const fmp=traceOfTab.timestamps.firstMeaningfulPaint;
+    if(!fmp){
+    throw new LHError(LHError.errors.NO_FMP);
+    }
+    
+    return LanternFirstContentfulPaint.getFirstPaintBasedGraph(
+    dependencyGraph,
+    fmp,
+    node=>node.hasRenderBlockingPriority(),
+    
+    node=>node.didPerformLayout());
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async compute_(data,context){
+    const fcpResult=await LanternFirstContentfulPaint.request(data,context);
+    const metricResult=await this.computeMetricWithGraphs(data,context);
+    metricResult.timing=Math.max(metricResult.timing,fcpResult.timing);
+    return metricResult;
+    }}
+    
+    
+    module.exports=makeComputedArtifact(LanternFirstMeaningfulPaint);
+    
+    },{"../../lib/lh-error.js":71,"../computed-artifact.js":8,"./lantern-first-contentful-paint.js":20,"./lantern-metric.js":25}],23:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('../computed-artifact.js');
+    const LanternMetric=require('./lantern-metric.js');
+    const BaseNode=require('../../lib/dependency-graph/base-node.js');
+    const NetworkRequest=require('../../lib/network-request.js');
+    const LanternFirstMeaningfulPaint=require('./lantern-first-meaningful-paint.js');
+    
+    
+    
+    
+    const CRITICAL_LONG_TASK_THRESHOLD=20;
+    
+    class LanternInteractive extends LanternMetric{
+    
+    
+    
+    static get COEFFICIENTS(){
+    return{
+    intercept:0,
+    optimistic:0.5,
+    pessimistic:0.5};
+    
+    }
+    
+    
+    
+    
+    
+    static getOptimisticGraph(dependencyGraph){
+    
+    const minimumCpuTaskDuration=CRITICAL_LONG_TASK_THRESHOLD*1000;
+    
+    return dependencyGraph.cloneWithRelationships(node=>{
+    
+    if(node.type===BaseNode.TYPES.CPU){
+    return node.event.dur>minimumCpuTaskDuration;
+    }
+    
+    
+    const isImage=node.record.resourceType===NetworkRequest.TYPES.Image;
+    const isScript=node.record.resourceType===NetworkRequest.TYPES.Script;
+    return(
+    !isImage&&(
+    isScript||
+    node.record.priority==='High'||
+    node.record.priority==='VeryHigh'));
+    
+    });
+    }
+    
+    
+    
+    
+    
+    static getPessimisticGraph(dependencyGraph){
+    return dependencyGraph;
+    }
+    
+    
+    
+    
+    
+    
+    static getEstimateFromSimulation(simulationResult,extras){
+    const lastTaskAt=LanternInteractive.getLastLongTaskEndTime(simulationResult.nodeTimings);
+    const minimumTime=extras.optimistic?
+    extras.fmpResult.optimisticEstimate.timeInMs:
+    extras.fmpResult.pessimisticEstimate.timeInMs;
+    return{
+    timeInMs:Math.max(minimumTime,lastTaskAt),
+    nodeTimings:simulationResult.nodeTimings};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async compute_(data,context){
+    const fmpResult=await LanternFirstMeaningfulPaint.request(data,context);
+    const metricResult=await this.computeMetricWithGraphs(data,context,{fmpResult});
+    metricResult.timing=Math.max(metricResult.timing,fmpResult.timing);
+    return metricResult;
+    }
+    
+    
+    
+    
+    
+    static getLastLongTaskEndTime(nodeTimings,duration=50){
+    return Array.from(nodeTimings.entries()).
+    filter(([node,timing])=>{
+    if(node.type!==BaseNode.TYPES.CPU)return false;
+    return timing.duration>duration;
+    }).
+    map(([_,timing])=>timing.endTime).
+    reduce((max,x)=>Math.max(max||0,x||0),0);
+    }}
+    
+    
+    module.exports=makeComputedArtifact(LanternInteractive);
+    
+    },{"../../lib/dependency-graph/base-node.js":57,"../../lib/network-request.js":75,"../computed-artifact.js":8,"./lantern-first-meaningful-paint.js":22,"./lantern-metric.js":25}],24:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('../computed-artifact.js');
+    const LanternMetricArtifact=require('./lantern-metric.js');
+    const BaseNode=require('../../lib/dependency-graph/base-node.js');
+    const LanternFirstContentfulPaint=require('./lantern-first-contentful-paint.js');
+    
+    
+    
+    class LanternMaxPotentialFID extends LanternMetricArtifact{
+    
+    
+    
+    static get COEFFICIENTS(){
+    return{
+    intercept:0,
+    optimistic:0.5,
+    pessimistic:0.5};
+    
+    }
+    
+    
+    
+    
+    
+    static getOptimisticGraph(dependencyGraph){
+    return dependencyGraph;
+    }
+    
+    
+    
+    
+    
+    static getPessimisticGraph(dependencyGraph){
+    return dependencyGraph;
+    }
+    
+    
+    
+    
+    
+    
+    static getEstimateFromSimulation(simulation,extras){
+    
+    
+    const fcpTimeInMs=extras.optimistic?
+    extras.fcpResult.pessimisticEstimate.timeInMs:
+    extras.fcpResult.optimisticEstimate.timeInMs;
+    
+    const timings=LanternMaxPotentialFID.getTimingsAfterFCP(
+    simulation.nodeTimings,
+    fcpTimeInMs);
+    
+    
+    return{
+    timeInMs:Math.max(...timings.map(timing=>timing.duration),16),
+    nodeTimings:simulation.nodeTimings};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async compute_(data,context){
+    const fcpResult=await LanternFirstContentfulPaint.request(data,context);
+    return super.computeMetricWithGraphs(data,context,{fcpResult});
+    }
+    
+    
+    
+    
+    
+    
+    static getTimingsAfterFCP(nodeTimings,fcpTimeInMs){
+    return Array.from(nodeTimings.entries()).
+    filter(([node,timing])=>node.type===BaseNode.TYPES.CPU&&timing.endTime>fcpTimeInMs).
+    map(([_,timing])=>timing);
+    }}
+    
+    
+    module.exports=makeComputedArtifact(LanternMaxPotentialFID);
+    
+    },{"../../lib/dependency-graph/base-node.js":57,"../computed-artifact.js":8,"./lantern-first-contentful-paint.js":20,"./lantern-metric.js":25}],25:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const BaseNode=require('../../lib/dependency-graph/base-node.js');
+    const NetworkRequest=require('../../lib/network-request.js');
+    const TraceOfTab=require('../trace-of-tab.js');
+    const PageDependencyGraph=require('../page-dependency-graph.js');
+    const LoadSimulator=require('../load-simulator.js');
+    
+    
+    
+    
+    
+    class LanternMetricArtifact{
+    
+    
+    
+    
+    
+    static getScriptUrls(dependencyGraph,condition){
+    
+    const scriptUrls=new Set();
+    
+    dependencyGraph.traverse(node=>{
+    if(node.type===BaseNode.TYPES.CPU)return;
+    if(node.record.resourceType!==NetworkRequest.TYPES.Script)return;
+    if(condition&&!condition(node))return;
+    scriptUrls.add(node.record.url);
+    });
+    
+    return scriptUrls;
+    }
+    
+    
+    
+    
+    static get COEFFICIENTS(){
+    throw new Error('COEFFICIENTS unimplemented!');
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static getScaledCoefficients(rttMs){
+    return this.COEFFICIENTS;
+    }
+    
+    
+    
+    
+    
+    
+    static getOptimisticGraph(dependencyGraph,traceOfTab){
+    throw new Error('Optimistic graph unimplemented!');
+    }
+    
+    
+    
+    
+    
+    
+    static getPessimisticGraph(dependencyGraph,traceOfTab){
+    throw new Error('Pessmistic graph unimplemented!');
+    }
+    
+    
+    
+    
+    
+    
+    static getEstimateFromSimulation(simulationResult,extras){
+    return simulationResult;
+    }
+    
+    
+    
+    
+    
+    
+    
+    static async computeMetricWithGraphs(data,context,extras){
+    const{trace,devtoolsLog,settings}=data;
+    const metricName=this.name.replace('Lantern','');
+    const graph=await PageDependencyGraph.request({trace,devtoolsLog},context);
+    const traceOfTab=await TraceOfTab.request(trace,context);
+    const simulator=data.simulator||(
+    await LoadSimulator.request({devtoolsLog,settings},context));
+    
+    const optimisticGraph=this.getOptimisticGraph(graph,traceOfTab);
+    const pessimisticGraph=this.getPessimisticGraph(graph,traceOfTab);
+    
+    
+    let simulateOptions={label:`optimistic${metricName}`};
+    const optimisticSimulation=simulator.simulate(optimisticGraph,simulateOptions);
+    
+    simulateOptions={label:`optimisticFlex${metricName}`,flexibleOrdering:true};
+    const optimisticFlexSimulation=simulator.simulate(optimisticGraph,simulateOptions);
+    
+    simulateOptions={label:`pessimistic${metricName}`};
+    const pessimisticSimulation=simulator.simulate(pessimisticGraph,simulateOptions);
+    
+    const optimisticEstimate=this.getEstimateFromSimulation(
+    optimisticSimulation.timeInMs<optimisticFlexSimulation.timeInMs?
+    optimisticSimulation:optimisticFlexSimulation,
+    Object.assign({},extras,{optimistic:true}));
+    
+    
+    const pessimisticEstimate=this.getEstimateFromSimulation(
+    pessimisticSimulation,
+    Object.assign({},extras,{optimistic:false}));
+    
+    
+    const coefficients=this.getScaledCoefficients(simulator.rtt);
+    
+    const interceptMultiplier=coefficients.intercept>0?
+    Math.min(1,optimisticEstimate.timeInMs/1000):1;
+    const timing=
+    coefficients.intercept*interceptMultiplier+
+    coefficients.optimistic*optimisticEstimate.timeInMs+
+    coefficients.pessimistic*pessimisticEstimate.timeInMs;
+    
+    return{
+    timing,
+    optimisticEstimate,
+    pessimisticEstimate,
+    optimisticGraph,
+    pessimisticGraph};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async compute_(data,context){
+    return this.computeMetricWithGraphs(data,context);
+    }}
+    
+    
+    module.exports=LanternMetricArtifact;
+    
+    },{"../../lib/dependency-graph/base-node.js":57,"../../lib/network-request.js":75,"../load-simulator.js":10,"../page-dependency-graph.js":35,"../trace-of-tab.js":39}],26:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('../computed-artifact.js');
+    const LanternMetric=require('./lantern-metric.js');
+    const BaseNode=require('../../lib/dependency-graph/base-node.js');
+    const Speedline=require('../speedline.js');
+    const LanternFirstContentfulPaint=require('./lantern-first-contentful-paint.js');
+    const defaultThrottling=require('../../config/constants.js').throttling;
+    
+    
+    
+    class LanternSpeedIndex extends LanternMetric{
+    
+    
+    
+    static get COEFFICIENTS(){
+    return{
+    
+    
+    
+    intercept:-250,
+    optimistic:1.4,
+    pessimistic:0.65};
+    
+    }
+    
+    
+    
+    
+    
+    static getScaledCoefficients(rttMs){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const defaultCoefficients=this.COEFFICIENTS;
+    const defaultRttExcess=defaultThrottling.mobileSlow4G.rttMs-30;
+    const multiplier=Math.max((rttMs-30)/defaultRttExcess,0);
+    
+    return{
+    intercept:defaultCoefficients.intercept*multiplier,
+    optimistic:0.5+(defaultCoefficients.optimistic-0.5)*multiplier,
+    pessimistic:0.5+(defaultCoefficients.pessimistic-0.5)*multiplier};
+    
+    }
+    
+    
+    
+    
+    
+    static getOptimisticGraph(dependencyGraph){
+    return dependencyGraph;
+    }
+    
+    
+    
+    
+    
+    static getPessimisticGraph(dependencyGraph){
+    return dependencyGraph;
+    }
+    
+    
+    
+    
+    
+    
+    static getEstimateFromSimulation(simulationResult,extras){
+    const fcpTimeInMs=extras.fcpResult.pessimisticEstimate.timeInMs;
+    const estimate=extras.optimistic?
+    extras.speedline.speedIndex:
+    LanternSpeedIndex.computeLayoutBasedSpeedIndex(simulationResult.nodeTimings,fcpTimeInMs);
+    return{
+    timeInMs:estimate,
+    nodeTimings:simulationResult.nodeTimings};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async compute_(data,context){
+    const speedline=await Speedline.request(data.trace,context);
+    const fcpResult=await LanternFirstContentfulPaint.request(data,context);
+    const metricResult=await this.computeMetricWithGraphs(data,context,{
+    speedline,
+    fcpResult});
+    
+    metricResult.timing=Math.max(metricResult.timing,fcpResult.timing);
+    return metricResult;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static computeLayoutBasedSpeedIndex(nodeTimings,fcpTimeInMs){
+    
+    const layoutWeights=[];
+    for(const[node,timing]of nodeTimings.entries()){
+    if(node.type!==BaseNode.TYPES.CPU)continue;
+    
+    if(node.childEvents.some(x=>x.name==='Layout')){
+    const timingWeight=Math.max(Math.log2(timing.endTime-timing.startTime),0);
+    layoutWeights.push({time:timing.endTime,weight:timingWeight});
+    }
+    }
+    
+    if(!layoutWeights.length){
+    return fcpTimeInMs;
+    }
+    
+    const totalWeightedTime=layoutWeights.
+    map(evt=>evt.weight*Math.max(evt.time,fcpTimeInMs)).
+    reduce((a,b)=>a+b,0);
+    const totalWeight=layoutWeights.map(evt=>evt.weight).reduce((a,b)=>a+b,0);
+    return totalWeightedTime/totalWeight;
+    }}
+    
+    
+    module.exports=makeComputedArtifact(LanternSpeedIndex);
+    
+    },{"../../config/constants.js":46,"../../lib/dependency-graph/base-node.js":57,"../computed-artifact.js":8,"../speedline.js":38,"./lantern-first-contentful-paint.js":20,"./lantern-metric.js":25}],27:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('../computed-artifact.js');
+    const LanternMetric=require('./lantern-metric.js');
+    const BaseNode=require('../../lib/dependency-graph/base-node.js');
+    const LanternFirstContentfulPaint=require('./lantern-first-contentful-paint.js');
+    const LanternInteractive=require('./lantern-interactive.js');
+    
+    
+    
+    class LanternTotalBlockingTime extends LanternMetric{
+    
+    
+    
+    static get COEFFICIENTS(){
+    return{
+    intercept:0,
+    optimistic:0.5,
+    pessimistic:0.5};
+    
+    }
+    
+    
+    
+    
+    
+    static getOptimisticGraph(dependencyGraph){
+    return dependencyGraph;
+    }
+    
+    
+    
+    
+    
+    static getPessimisticGraph(dependencyGraph){
+    return dependencyGraph;
+    }
+    
+    
+    
+    
+    
+    
+    static getEstimateFromSimulation(simulation,extras){
+    
+    
+    
+    
+    const fcpTimeInMs=extras.optimistic?
+    extras.fcpResult.pessimisticEstimate.timeInMs:
+    extras.fcpResult.optimisticEstimate.timeInMs;
+    
+    
+    
+    
+    
+    const interactiveTimeMs=extras.optimistic?
+    extras.interactiveResult.optimisticEstimate.timeInMs:
+    extras.interactiveResult.pessimisticEstimate.timeInMs;
+    
+    
+    const TotalBlockingTime=require('./total-blocking-time.js');
+    const minDurationMs=TotalBlockingTime.BLOCKING_TIME_THRESHOLD;
+    
+    const events=LanternTotalBlockingTime.getTopLevelEvents(
+    simulation.nodeTimings,
+    minDurationMs);
+    
+    
+    return{
+    timeInMs:TotalBlockingTime.calculateSumOfBlockingTime(
+    events,
+    fcpTimeInMs,
+    interactiveTimeMs),
+    
+    nodeTimings:simulation.nodeTimings};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async compute_(data,context){
+    const fcpResult=await LanternFirstContentfulPaint.request(data,context);
+    const interactiveResult=await LanternInteractive.request(data,context);
+    return this.computeMetricWithGraphs(data,context,{fcpResult,interactiveResult});
+    }
+    
+    
+    
+    
+    
+    static getTopLevelEvents(nodeTimings,minDurationMs){
+    
+    
+    const events=[];
+    
+    for(const[node,timing]of nodeTimings.entries()){
+    if(node.type!==BaseNode.TYPES.CPU)continue;
+    
+    if(timing.duration<minDurationMs)continue;
+    
+    events.push({
+    start:timing.startTime,
+    end:timing.endTime,
+    duration:timing.duration});
+    
+    }
+    
+    return events;
+    }}
+    
+    
+    module.exports=makeComputedArtifact(LanternTotalBlockingTime);
+    
+    },{"../../lib/dependency-graph/base-node.js":57,"../computed-artifact.js":8,"./lantern-first-contentful-paint.js":20,"./lantern-interactive.js":23,"./lantern-metric.js":25,"./total-blocking-time.js":32}],28:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('../computed-artifact.js');
+    const ComputedMetric=require('./metric.js');
+    const LHError=require('../../lib/lh-error.js');
+    
+    class LargestContentfulPaint extends ComputedMetric{
+    
+    
+    
+    
+    
+    
+    static computeSimulatedMetric(data,context){
+    throw new Error('Unimplemented');
+    }
+    
+    
+    
+    
+    
+    static async computeObservedMetric(data){
+    const{traceOfTab}=data;
+    if(!traceOfTab.timestamps.largestContentfulPaint){
+    throw new LHError(LHError.errors.NO_LCP);
+    }
+    
+    return{
+    
+    timing:traceOfTab.timings.largestContentfulPaint,
+    timestamp:traceOfTab.timestamps.largestContentfulPaint};
+    
+    }}
+    
+    
+    module.exports=makeComputedArtifact(LargestContentfulPaint);
+    
+    },{"../../lib/lh-error.js":71,"../computed-artifact.js":8,"./metric.js":30}],29:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('../computed-artifact.js');
+    const MetricArtifact=require('./metric.js');
+    const LanternMaxPotentialFID=require('./lantern-max-potential-fid.js');
+    const LHError=require('../../lib/lh-error.js');
+    const TracingProcessor=require('../../lib/tracehouse/trace-processor.js');
+    
+    class MaxPotentialFID extends MetricArtifact{
+    
+    
+    
+    
+    
+    static computeSimulatedMetric(data,context){
+    return LanternMaxPotentialFID.request(data,context);
+    }
+    
+    
+    
+    
+    
+    static computeObservedMetric(data){
+    const{firstContentfulPaint}=data.traceOfTab.timings;
+    if(!firstContentfulPaint){
+    throw new LHError(LHError.errors.NO_FCP);
+    }
+    
+    const events=TracingProcessor.getMainThreadTopLevelEvents(
+    data.traceOfTab,
+    firstContentfulPaint).
+    filter(evt=>evt.duration>=1);
+    
+    return Promise.resolve({
+    timing:Math.max(...events.map(evt=>evt.duration),16)});
+    
+    }}
+    
+    
+    module.exports=makeComputedArtifact(MaxPotentialFID);
+    
+    },{"../../lib/lh-error.js":71,"../../lib/tracehouse/trace-processor.js":85,"../computed-artifact.js":8,"./lantern-max-potential-fid.js":24,"./metric.js":30}],30:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const TracingProcessor=require('../../lib/tracehouse/trace-processor.js');
+    const TraceOfTab=require('../trace-of-tab.js');
+    const NetworkRecords=require('../network-records.js');
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    class ComputedMetric{
+    constructor(){}
+    
+    
+    
+    
+    
+    
+    static computeSimulatedMetric(data,context){
+    throw new Error('Unimplemented');
+    }
+    
+    
+    
+    
+    
+    
+    static computeObservedMetric(data,context){
+    throw new Error('Unimplemented');
+    }
+    
+    
+    
+    
+    
+    
+    static async compute_(data,context){
+    const{trace,devtoolsLog,settings}=data;
+    if(!trace||!devtoolsLog||!settings){
+    throw new Error('Did not provide necessary metric computation data');
+    }
+    
+    const augmentedData=Object.assign({
+    networkRecords:await NetworkRecords.request(devtoolsLog,context),
+    traceOfTab:await TraceOfTab.request(trace,context)},
+    data);
+    
+    TracingProcessor.assertHasToplevelEvents(augmentedData.traceOfTab.mainThreadEvents);
+    
+    switch(settings.throttlingMethod){
+    case'simulate':
+    return this.computeSimulatedMetric(augmentedData,context);
+    case'provided':
+    case'devtools':
+    return this.computeObservedMetric(augmentedData,context);
+    default:
+    throw new TypeError(`Unrecognized throttling method: ${settings.throttlingMethod}`);}
+    
+    }}
+    
+    
+    module.exports=ComputedMetric;
+    
+    },{"../../lib/tracehouse/trace-processor.js":85,"../network-records.js":34,"../trace-of-tab.js":39}],31:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('../computed-artifact.js');
+    const ComputedMetric=require('./metric.js');
+    const LanternSpeedIndex=require('./lantern-speed-index.js');
+    const Speedline=require('../speedline.js');
+    
+    class SpeedIndex extends ComputedMetric{
+    
+    
+    
+    
+    
+    static computeSimulatedMetric(data,context){
+    return LanternSpeedIndex.request(data,context);
+    }
+    
+    
+    
+    
+    
+    
+    static async computeObservedMetric(data,context){
+    const speedline=await Speedline.request(data.trace,context);
+    const timing=Math.round(speedline.speedIndex);
+    const timestamp=(timing+speedline.beginning)*1000;
+    return Promise.resolve({timing,timestamp});
+    }}
+    
+    
+    module.exports=makeComputedArtifact(SpeedIndex);
+    
+    },{"../computed-artifact.js":8,"../speedline.js":38,"./lantern-speed-index.js":26,"./metric.js":30}],32:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('../computed-artifact.js');
+    const ComputedMetric=require('./metric.js');
+    const LHError=require('../../lib/lh-error.js');
+    const TracingProcessor=require('../../lib/tracehouse/trace-processor.js');
+    const LanternTotalBlockingTime=require('./lantern-total-blocking-time.js');
+    const TimetoInteractive=require('./interactive.js');
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    class TotalBlockingTime extends ComputedMetric{
+    
+    
+    
+    static get BLOCKING_TIME_THRESHOLD(){
+    return 50;
+    }
+    
+    
+    
+    
+    
+    
+    static calculateSumOfBlockingTime(topLevelEvents,fcpTimeInMs,interactiveTimeMs){
+    if(interactiveTimeMs<=fcpTimeInMs)return 0;
+    
+    const threshold=TotalBlockingTime.BLOCKING_TIME_THRESHOLD;
+    let sumBlockingTime=0;
+    for(const event of topLevelEvents){
+    
+    if(event.duration<threshold)continue;
+    
+    
+    
+    
+    
+    if(event.end<fcpTimeInMs)continue;
+    
+    
+    
+    if(event.start>interactiveTimeMs)continue;
+    
+    
+    
+    
+    
+    
+    const clippedStart=Math.max(event.start,fcpTimeInMs);
+    const clippedEnd=Math.min(event.end,interactiveTimeMs);
+    const clippedDuration=clippedEnd-clippedStart;
+    if(clippedDuration<threshold)continue;
+    
+    
+    
+    
+    
+    sumBlockingTime+=clippedDuration-threshold;
+    }
+    
+    return sumBlockingTime;
+    }
+    
+    
+    
+    
+    
+    
+    static computeSimulatedMetric(data,context){
+    return LanternTotalBlockingTime.request(data,context);
+    }
+    
+    
+    
+    
+    
+    
+    static async computeObservedMetric(data,context){
+    const{firstContentfulPaint}=data.traceOfTab.timings;
+    if(!firstContentfulPaint){
+    throw new LHError(LHError.errors.NO_FCP);
+    }
+    
+    const interactiveTimeMs=(await TimetoInteractive.request(data,context)).timing;
+    
+    const events=TracingProcessor.getMainThreadTopLevelEvents(data.traceOfTab);
+    
+    return{
+    timing:TotalBlockingTime.calculateSumOfBlockingTime(
+    events,
+    firstContentfulPaint,
+    interactiveTimeMs)};
+    
+    
+    }}
+    
+    
+    module.exports=makeComputedArtifact(TotalBlockingTime);
+    
+    },{"../../lib/lh-error.js":71,"../../lib/tracehouse/trace-processor.js":85,"../computed-artifact.js":8,"./interactive.js":18,"./lantern-total-blocking-time.js":27,"./metric.js":30}],33:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('./computed-artifact.js');
+    const NetworkAnalyzer=require('../lib/dependency-graph/simulator/network-analyzer.js');
+    const NetworkRecords=require('./network-records.js');
+    
+    class NetworkAnalysis{
+    
+    
+    
+    
+    static computeRTTAndServerResponseTime(records){
+    
+    
+    const rttByOrigin=new Map();
+    for(const[origin,summary]of NetworkAnalyzer.estimateRTTByOrigin(records).entries()){
+    rttByOrigin.set(origin,summary.min);
+    }
+    
+    
+    
+    const minimumRtt=Math.min(...Array.from(rttByOrigin.values()));
+    
+    const responseTimeSummaries=NetworkAnalyzer.estimateServerResponseTimeByOrigin(records,{
+    rttByOrigin});
+    
+    
+    
+    const additionalRttByOrigin=new Map();
+    
+    const serverResponseTimeByOrigin=new Map();
+    for(const[origin,summary]of responseTimeSummaries.entries()){
+    
+    const rttForOrigin=rttByOrigin.get(origin)||minimumRtt;
+    additionalRttByOrigin.set(origin,rttForOrigin-minimumRtt);
+    serverResponseTimeByOrigin.set(origin,summary.median);
+    }
+    
+    return{
+    rtt:minimumRtt,
+    additionalRttByOrigin,
+    serverResponseTimeByOrigin};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async compute_(devtoolsLog,context){
+    const records=await NetworkRecords.request(devtoolsLog,context);
+    const throughput=NetworkAnalyzer.estimateThroughput(records);
+    const rttAndServerResponseTime=NetworkAnalysis.computeRTTAndServerResponseTime(records);
+    return{throughput,...rttAndServerResponseTime};
+    }}
+    
+    
+    module.exports=makeComputedArtifact(NetworkAnalysis);
+    
+    },{"../lib/dependency-graph/simulator/network-analyzer.js":62,"./computed-artifact.js":8,"./network-records.js":34}],34:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('./computed-artifact.js');
+    const NetworkRecorder=require('../lib/network-recorder.js');
+    
+    class NetworkRecords{
+    
+    
+    
+    
+    static async compute_(devtoolsLog){
+    return NetworkRecorder.recordsFromLogs(devtoolsLog);
+    }}
+    
+    
+    module.exports=makeComputedArtifact(NetworkRecords);
+    
+    },{"../lib/network-recorder.js":74,"./computed-artifact.js":8}],35:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('./computed-artifact.js');
+    const NetworkNode=require('../lib/dependency-graph/network-node.js');
+    const CPUNode=require('../lib/dependency-graph/cpu-node.js');
+    const NetworkAnalyzer=require('../lib/dependency-graph/simulator/network-analyzer.js');
+    const TracingProcessor=require('../lib/tracehouse/trace-processor.js');
+    const NetworkRequest=require('../lib/network-request.js');
+    const TraceOfTab=require('./trace-of-tab.js');
+    const NetworkRecords=require('./network-records.js');
+    
+    
+    
+    
+    const MINIMUM_TASK_DURATION_OF_INTEREST=10;
+    
+    
+    const IGNORED_MIME_TYPES_REGEX=/^video/;
+    
+    class PageDependencyGraph{
+    
+    
+    
+    
+    static getNetworkInitiators(record){
+    if(!record.initiator)return[];
+    if(record.initiator.url)return[record.initiator.url];
+    if(record.initiator.type==='script'){
+    
+    
+    
+    
+    const scriptURLs=new Set();
+    let stack=record.initiator.stack;
+    while(stack){
+    const callFrames=stack.callFrames||[];
+    for(const frame of callFrames){
+    if(frame.url)scriptURLs.add(frame.url);
+    }
+    
+    stack=stack.parent;
+    }
+    
+    return Array.from(scriptURLs);
+    }
+    
+    return[];
+    }
+    
+    
+    
+    
+    
+    static getNetworkNodeOutput(networkRecords){
+    
+    const nodes=[];
+    const idToNodeMap=new Map();
+    const urlToNodeMap=new Map();
+    
+    networkRecords.forEach(record=>{
+    if(IGNORED_MIME_TYPES_REGEX.test(record.mimeType))return;
+    
+    
+    
+    
+    
+    while(idToNodeMap.has(record.requestId)){
+    record.requestId+=':duplicate';
+    }
+    
+    const node=new NetworkNode(record);
+    nodes.push(node);
+    
+    const list=urlToNodeMap.get(record.url)||[];
+    list.push(node);
+    
+    idToNodeMap.set(record.requestId,node);
+    urlToNodeMap.set(record.url,list);
+    });
+    
+    return{nodes,idToNodeMap,urlToNodeMap};
+    }
+    
+    
+    
+    
+    
+    static getCPUNodes(traceOfTab){
+    
+    const nodes=[];
+    let i=0;
+    
+    TracingProcessor.assertHasToplevelEvents(traceOfTab.mainThreadEvents);
+    
+    const minimumEvtDur=MINIMUM_TASK_DURATION_OF_INTEREST*1000;
+    while(i<traceOfTab.mainThreadEvents.length){
+    const evt=traceOfTab.mainThreadEvents[i];
+    
+    
+    if(
+    !TracingProcessor.isScheduleableTask(evt)||
+    !evt.dur||
+    evt.dur<minimumEvtDur)
+    {
+    i++;
+    continue;
+    }
+    
+    
+    
+    const children=[];
+    i++;
+    for(
+    const endTime=evt.ts+evt.dur;
+    i<traceOfTab.mainThreadEvents.length&&traceOfTab.mainThreadEvents[i].ts<endTime;
+    i++)
+    {
+    children.push(traceOfTab.mainThreadEvents[i]);
+    }
+    
+    nodes.push(new CPUNode(evt,children));
+    }
+    
+    return nodes;
+    }
+    
+    
+    
+    
+    
+    static linkNetworkNodes(rootNode,networkNodeOutput){
+    networkNodeOutput.nodes.forEach(node=>{
+    const initiators=PageDependencyGraph.getNetworkInitiators(node.record);
+    if(initiators.length){
+    initiators.forEach(initiator=>{
+    const parentCandidates=networkNodeOutput.urlToNodeMap.get(initiator)||[rootNode];
+    
+    const parent=parentCandidates.length===1?parentCandidates[0]:rootNode;
+    node.addDependency(parent);
+    });
+    }else if(node!==rootNode){
+    rootNode.addDependent(node);
+    }
+    
+    if(!node.record.redirects)return;
+    
+    const redirects=[...node.record.redirects,node.record];
+    for(let i=1;i<redirects.length;i++){
+    const redirectNode=networkNodeOutput.idToNodeMap.get(redirects[i-1].requestId);
+    const actualNode=networkNodeOutput.idToNodeMap.get(redirects[i].requestId);
+    if(actualNode&&redirectNode){
+    actualNode.addDependency(redirectNode);
+    }
+    }
+    });
+    }
+    
+    
+    
+    
+    
+    
+    static linkCPUNodes(rootNode,networkNodeOutput,cpuNodes){
+    
+    function addDependentNetworkRequest(cpuNode,reqId){
+    const networkNode=networkNodeOutput.idToNodeMap.get(reqId);
+    if(!networkNode||
+    
+    networkNode.record.resourceType!==NetworkRequest.TYPES.XHR||
+    
+    
+    networkNode.startTime<=cpuNode.startTime)return;
+    cpuNode.addDependent(networkNode);
+    }
+    
+    
+    function addDependencyOnUrl(cpuNode,url){
+    if(!url)return;
+    
+    
+    const minimumAllowableTimeSinceNetworkNodeEnd=-100*1000;
+    const candidates=networkNodeOutput.urlToNodeMap.get(url)||[];
+    
+    let minCandidate=null;
+    let minDistance=Infinity;
+    
+    for(const candidate of candidates){
+    
+    
+    if(cpuNode.startTime<=candidate.startTime)return;
+    
+    const distance=cpuNode.startTime-candidate.endTime;
+    if(distance>=minimumAllowableTimeSinceNetworkNodeEnd&&distance<minDistance){
+    minCandidate=candidate;
+    minDistance=distance;
+    }
+    }
+    
+    if(!minCandidate)return;
+    cpuNode.addDependency(minCandidate);
+    }
+    
+    
+    const timers=new Map();
+    for(const node of cpuNodes){
+    for(const evt of node.childEvents){
+    if(!evt.args.data)continue;
+    
+    const argsUrl=evt.args.data.url;
+    const stackTraceUrls=(evt.args.data.stackTrace||[]).map(l=>l.url).filter(Boolean);
+    
+    switch(evt.name){
+    case'TimerInstall':
+    
+    timers.set(evt.args.data.timerId,node);
+    stackTraceUrls.forEach(url=>addDependencyOnUrl(node,url));
+    break;
+    case'TimerFire':{
+    
+    const installer=timers.get(evt.args.data.timerId);
+    if(!installer)break;
+    installer.addDependent(node);
+    break;
+    }
+    
+    case'InvalidateLayout':
+    case'ScheduleStyleRecalculation':
+    stackTraceUrls.forEach(url=>addDependencyOnUrl(node,url));
+    break;
+    
+    case'EvaluateScript':
+    
+    addDependencyOnUrl(node,argsUrl);
+    stackTraceUrls.forEach(url=>addDependencyOnUrl(node,url));
+    break;
+    
+    case'XHRReadyStateChange':
+    
+    
+    if(evt.args.data.readyState!==4)break;
+    
+    
+    addDependencyOnUrl(node,argsUrl);
+    stackTraceUrls.forEach(url=>addDependencyOnUrl(node,url));
+    break;
+    
+    case'FunctionCall':
+    case'v8.compile':
+    
+    addDependencyOnUrl(node,argsUrl);
+    break;
+    
+    case'ParseAuthorStyleSheet':
+    
+    addDependencyOnUrl(node,evt.args.data.styleSheetUrl);
+    break;
+    
+    case'ResourceSendRequest':
+    
+    addDependentNetworkRequest(node,evt.args.data.requestId);
+    stackTraceUrls.forEach(url=>addDependencyOnUrl(node,url));
+    break;}
+    
+    }
+    
+    if(node.getNumberOfDependencies()===0){
+    node.addDependency(rootNode);
+    }
+    }
+    }
+    
+    
+    
+    
+    
+    
+    static createGraph(traceOfTab,networkRecords){
+    const networkNodeOutput=PageDependencyGraph.getNetworkNodeOutput(networkRecords);
+    const cpuNodes=PageDependencyGraph.getCPUNodes(traceOfTab);
+    
+    
+    const rootRequest=networkRecords.reduce((min,r)=>r.startTime<min.startTime?r:min);
+    const rootNode=networkNodeOutput.idToNodeMap.get(rootRequest.requestId);
+    
+    
+    const mainDocumentRequest=NetworkAnalyzer.findMainDocument(networkRecords);
+    const mainDocumentNode=networkNodeOutput.idToNodeMap.get(mainDocumentRequest.requestId);
+    
+    if(!rootNode||!mainDocumentNode){
+    
+    throw new Error(`${rootNode?'mainDocument':'root'}Node not found.`);
+    }
+    
+    if(mainDocumentNode!==rootNode&&(
+    !mainDocumentNode.record.redirects||
+    !mainDocumentNode.record.redirects.includes(rootNode.record))){
+    throw new Error('Root node was not in redirect chain of mainDocument');
+    }
+    
+    PageDependencyGraph.linkNetworkNodes(rootNode,networkNodeOutput);
+    PageDependencyGraph.linkCPUNodes(rootNode,networkNodeOutput,cpuNodes);
+    mainDocumentNode.setIsMainDocument(true);
+    
+    if(NetworkNode.hasCycle(rootNode)){
+    throw new Error('Invalid dependency graph created, cycle detected');
+    }
+    
+    return rootNode;
+    }
+    
+    
+    
+    
+    
+    static printGraph(rootNode,widthInCharacters=100){
+    
+    function padRight(str,target,padChar=' '){
+    return str+padChar.repeat(Math.max(target-str.length,0));
+    }
+    
+    
+    const nodes=[];
+    rootNode.traverse(node=>nodes.push(node));
+    nodes.sort((a,b)=>a.startTime-b.startTime);
+    
+    const min=nodes[0].startTime;
+    const max=nodes.reduce((max,node)=>Math.max(max,node.endTime),0);
+    
+    const totalTime=max-min;
+    const timePerCharacter=totalTime/widthInCharacters;
+    nodes.forEach(node=>{
+    const offset=Math.round((node.startTime-min)/timePerCharacter);
+    const length=Math.ceil((node.endTime-node.startTime)/timePerCharacter);
+    const bar=padRight('',offset)+padRight('',length,'=');
+    
+    
+    const displayName=node.record?node.record.url:node.type;
+    
+    console.log(padRight(bar,widthInCharacters),`| ${displayName.slice(0,30)}`);
+    });
+    }
+    
+    
+    
+    
+    
+    
+    static async compute_(data,context){
+    const trace=data.trace;
+    const devtoolsLog=data.devtoolsLog;
+    const[traceOfTab,networkRecords]=await Promise.all([
+    TraceOfTab.request(trace,context),
+    NetworkRecords.request(devtoolsLog,context)]);
+    
+    
+    return PageDependencyGraph.createGraph(traceOfTab,networkRecords);
+    }}
+    
+    
+    module.exports=makeComputedArtifact(PageDependencyGraph);
+    
+    
+    
+    
+    
+    
+    
+    
+    },{"../lib/dependency-graph/cpu-node.js":58,"../lib/dependency-graph/network-node.js":59,"../lib/dependency-graph/simulator/network-analyzer.js":62,"../lib/network-request.js":75,"../lib/tracehouse/trace-processor.js":85,"./computed-artifact.js":8,"./network-records.js":34,"./trace-of-tab.js":39}],36:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('./computed-artifact.js');
+    const NetworkRecords=require('./network-records.js');
+    const MainResource=require('./main-resource.js');
+    const URL=require('../lib/url-shim.js');
+    
+    
+    class ResourceSummary{
+    
+    
+    
+    
+    static determineResourceType(record){
+    if(!record.resourceType)return'other';
+    
+    const requestToResourceType={
+    'Stylesheet':'stylesheet',
+    'Image':'image',
+    'Media':'media',
+    'Font':'font',
+    'Script':'script',
+    'Document':'document'};
+    
+    return requestToResourceType[record.resourceType]||'other';
+    }
+    
+    
+    
+    
+    
+    
+    static summarize(networkRecords,mainResourceURL){
+    
+    const resourceSummary={
+    'stylesheet':{count:0,size:0},
+    'image':{count:0,size:0},
+    'media':{count:0,size:0},
+    'font':{count:0,size:0},
+    'script':{count:0,size:0},
+    'document':{count:0,size:0},
+    'other':{count:0,size:0},
+    'total':{count:0,size:0},
+    'third-party':{count:0,size:0}};
+    
+    
+    for(const record of networkRecords){
+    const type=this.determineResourceType(record);
+    resourceSummary[type].count++;
+    resourceSummary[type].size+=record.transferSize;
+    
+    resourceSummary.total.count++;
+    resourceSummary.total.size+=record.transferSize;
+    
+    
+    if(!URL.rootDomainsMatch(record.url,mainResourceURL)){
+    resourceSummary['third-party'].count++;
+    resourceSummary['third-party'].size+=record.transferSize;
+    }
+    }
+    return resourceSummary;
+    }
+    
+    
+    
+    
+    
+    
+    static async compute_(data,context){
+    const[networkRecords,mainResource]=await Promise.all([
+    NetworkRecords.request(data.devtoolsLog,context),
+    MainResource.request(data,context)]);
+    
+    
+    return ResourceSummary.summarize(networkRecords,mainResource.url);
+    }}
+    
+    
+    module.exports=makeComputedArtifact(ResourceSummary);
+    
+    },{"../lib/url-shim.js":"url","./computed-artifact.js":8,"./main-resource.js":11,"./network-records.js":34}],37:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('./computed-artifact.js');
+    
+    const SCREENSHOT_TRACE_NAME='Screenshot';
+    
+    class Screenshots{
+    
+    
+    
+    
+    static async compute_(trace){
+    return trace.traceEvents.
+    filter(evt=>evt.name===SCREENSHOT_TRACE_NAME).
+    map(evt=>{
+    return{
+    timestamp:evt.ts,
+    datauri:`data:image/jpeg;base64,${evt.args.snapshot}`};
+    
+    });
+    }}
+    
+    
+    module.exports=makeComputedArtifact(Screenshots);
+    
+    },{"./computed-artifact.js":8}],38:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('./computed-artifact.js');
+    const speedline=require('speedline-core');
+    const LHError=require('../lib/lh-error.js');
+    const TraceOfTab=require('./trace-of-tab.js');
+    
+    class Speedline{
+    
+    
+    
+    
+    
+    static async compute_(trace,context){
+    
+    
+    return TraceOfTab.request(trace,context).then(traceOfTab=>{
+    
+    
+    const traceEvents=trace.traceEvents.slice();
+    
+    
+    const navStart=traceOfTab.timestamps.navigationStart;
+    return speedline(traceEvents,{
+    timeOrigin:navStart,
+    fastMode:true,
+    include:'speedIndex'});
+    
+    }).catch(err=>{
+    if(/No screenshots found in trace/.test(err.message)){
+    throw new LHError(LHError.errors.NO_SCREENSHOTS);
+    }
+    
+    throw err;
+    }).then(speedline=>{
+    if(speedline.frames.length===0){
+    throw new LHError(LHError.errors.NO_SPEEDLINE_FRAMES);
+    }
+    
+    if(speedline.speedIndex===0){
+    throw new LHError(LHError.errors.SPEEDINDEX_OF_ZERO);
+    }
+    
+    return speedline;
+    });
+    }}
+    
+    
+    module.exports=makeComputedArtifact(Speedline);
+    
+    },{"../lib/lh-error.js":71,"./computed-artifact.js":8,"./trace-of-tab.js":39,"speedline-core":181}],39:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('./computed-artifact.js');
+    const LHError=require('../lib/lh-error.js');
+    const TraceProcessor=require('../lib/tracehouse/trace-processor.js');
+    
+    
+    
+    class LHTraceProcessor extends TraceProcessor{
+    
+    
+    
+    static createNoNavstartError(){
+    return new LHError(LHError.errors.NO_NAVSTART);
+    }
+    
+    
+    
+    
+    static createNoTracingStartedError(){
+    return new LHError(LHError.errors.NO_TRACING_STARTED);
+    }}
+    
+    
+    
+    class TraceOfTab{
+    
+    
+    
+    
+    
+    
+    static async compute_(trace){
+    
+    
+    
+    const traceOfTab=await LHTraceProcessor.computeTraceOfTab(trace);
+    const{timings,timestamps,firstContentfulPaintEvt}=traceOfTab;
+    const{firstContentfulPaint:firstContentfulPaintTiming}=timings;
+    const{firstContentfulPaint:firstContentfulPaintTs}=timestamps;
+    if(
+    !firstContentfulPaintEvt||
+    firstContentfulPaintTiming===undefined||
+    firstContentfulPaintTs===undefined)
+    {
+    throw new LHError(LHError.errors.NO_FCP);
+    }
+    
+    
+    
+    return{
+    ...traceOfTab,
+    firstContentfulPaintEvt,
+    timings:{...timings,firstContentfulPaint:firstContentfulPaintTiming},
+    timestamps:{...timestamps,firstContentfulPaint:firstContentfulPaintTs}};
+    
+    }}
+    
+    
+    module.exports=makeComputedArtifact(TraceOfTab);
+    
+    },{"../lib/lh-error.js":71,"../lib/tracehouse/trace-processor.js":85,"./computed-artifact.js":8}],40:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const makeComputedArtifact=require('./computed-artifact.js');
+    const TraceOfTab=require('./trace-of-tab.js');
+    
+    
+    
+    
+    class UserTimings{
+    
+    
+    
+    
+    
+    static async compute_(trace,context){
+    const traceOfTab=await TraceOfTab.request(trace,context);
+    
+    const userTimings=[];
+    
+    const measuresStartTimes={};
+    
+    
+    
+    
+    
+    traceOfTab.processEvents.filter(evt=>{
+    if(!evt.cat.includes('blink.user_timing')){
+    return false;
+    }
+    
+    
+    
+    return evt.name!=='requestStart'&&
+    evt.name!=='navigationStart'&&
+    evt.name!=='paintNonDefaultBackgroundColor'&&
+    evt.args.frame===undefined;
+    }).
+    forEach(ut=>{
+    
+    if(ut.ph==='R'||ut.ph.toUpperCase()==='I'){
+    userTimings.push({
+    name:ut.name,
+    isMark:true,
+    args:ut.args,
+    startTime:ut.ts});
+    
+    
+    
+    }else if(ut.ph.toLowerCase()==='b'){
+    measuresStartTimes[ut.name]=ut.ts;
+    
+    
+    }else if(ut.ph.toLowerCase()==='e'){
+    userTimings.push({
+    name:ut.name,
+    isMark:false,
+    args:ut.args,
+    startTime:measuresStartTimes[ut.name],
+    endTime:ut.ts,
+    duration:ut.ts-measuresStartTimes[ut.name]});
+    
+    }
+    });
+    
+    
+    userTimings.forEach(ut=>{
+    ut.startTime=(ut.startTime-traceOfTab.navigationStartEvt.ts)/1000;
+    if(!ut.isMark){
+    ut.endTime=(ut.endTime-traceOfTab.navigationStartEvt.ts)/1000;
+    ut.duration=ut.duration/1000;
+    }
+    });
+    
+    return userTimings;
+    }}
+    
+    
+    module.exports=makeComputedArtifact(UserTimings);
+    
+    },{"./computed-artifact.js":8,"./trace-of-tab.js":39}],41:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Parser=require('metaviewport-parser');
+    
+    const makeComputedArtifact=require('./computed-artifact.js');
+    
+    class ViewportMeta{
+    
+    
+    
+    
+    static async compute_(MetaElements){
+    const viewportMeta=MetaElements.find(meta=>meta.name==='viewport');
+    
+    if(!viewportMeta){
+    return{
+    hasViewportTag:false,
+    isMobileOptimized:false,
+    parserWarnings:[]};
+    
+    }
+    
+    const warnings=[];
+    const parsedProps=Parser.parseMetaViewPortContent(viewportMeta.content||'');
+    
+    if(Object.keys(parsedProps.unknownProperties).length){
+    warnings.push(`Invalid properties found: ${JSON.stringify(parsedProps.unknownProperties)}`);
+    }
+    if(Object.keys(parsedProps.invalidValues).length){
+    warnings.push(`Invalid values found: ${JSON.stringify(parsedProps.invalidValues)}`);
+    }
+    
+    const viewportProps=parsedProps.validProperties;
+    const isMobileOptimized=Boolean(viewportProps.width||viewportProps['initial-scale']);
+    
+    return{
+    hasViewportTag:true,
+    isMobileOptimized,
+    parserWarnings:warnings};
+    
+    }}
+    
+    
+    module.exports=makeComputedArtifact(ViewportMeta);
+    
+    
+    
+    
+    
+    
+    
+    
+    },{"./computed-artifact.js":8,"metaviewport-parser":145}],42:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    function isArrayOfUnknownObjects(arr){
+    return Array.isArray(arr)&&arr.every(isObjectOfUnknownProperties);
+    }
+    
+    
+    
+    
+    
+    function isObjectOfUnknownProperties(val){
+    return typeof val==='object'&&val!==null&&!Array.isArray(val);
+    }
+    
+    
+    
+    
+    
+    
+    
+    function isNumber(val){
+    return typeof val==='number'&&!isNaN(val);
+    }
+    
+    class Budget{
+    
+    
+    
+    
+    
+    
+    static assertNoExcessProperties(obj,objectName){
+    const invalidKeys=Object.keys(obj);
+    if(invalidKeys.length>0){
+    const keys=invalidKeys.join(', ');
+    throw new Error(`${objectName} has unrecognized properties: [${keys}]`);
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    static assertNoDuplicateStrings(strings,arrayName){
+    const foundStrings=new Set();
+    for(const string of strings){
+    if(foundStrings.has(string)){
+    throw new Error(`${arrayName} has duplicate entry of type '${string}'`);
+    }
+    foundStrings.add(string);
+    }
+    }
+    
+    
+    
+    
+    
+    static validateResourceBudget(resourceBudget){
+    const{resourceType,budget,...invalidRest}=resourceBudget;
+    Budget.assertNoExcessProperties(invalidRest,'Resource Budget');
+    
+    
+    const validResourceTypes=[
+    'total',
+    'document',
+    'script',
+    'stylesheet',
+    'image',
+    'media',
+    'font',
+    'other',
+    'third-party'];
+    
+    
+    if(!validResourceTypes.includes(resourceType)){
+    throw new Error(`Invalid resource type: ${resourceType}. \n`+
+    `Valid resource types are: ${validResourceTypes.join(', ')}`);
+    }
+    if(!isNumber(budget)){
+    throw new Error(`Invalid budget: ${budget}`);
+    }
+    return{
+    resourceType:resourceType,
+    budget};
+    
+    }
+    
+    
+    
+    
+    
+    static throwInvalidPathError(path,error){
+    throw new Error(`Invalid path ${path}. ${error}\n`+
+    `'Path' should be specified using the 'robots.txt' format.\n`+
+    `Learn more about the 'robots.txt' format here:\n`+
+    `https://developers.google.com/search/reference/robots_txt#url-matching-based-on-path-values`);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    static validatePath(path){
+    if(path===undefined){
+    return undefined;
+    }else if(typeof path!=='string'){
+    this.throwInvalidPathError(path,`Path should be a string.`);
+    return;
+    }else if(!path.startsWith('/')){
+    this.throwInvalidPathError(path,`Path should start with '/'.`);
+    }else if((path.match(/\*/g)||[]).length>1){
+    this.throwInvalidPathError(path,`Path should only contain one '*'.`);
+    }else if((path.match(/\$/g)||[]).length>1){
+    this.throwInvalidPathError(path,`Path should only contain one '$' character.`);
+    }else if(path.includes('$')&&!path.endsWith('$')){
+    this.throwInvalidPathError(path,`'$' character should only occur at end of path.`);
+    }
+    return path;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static urlMatchesPattern(url,pattern='/'){
+    const urlObj=new URL(url);
+    const urlPath=urlObj.pathname+urlObj.search;
+    
+    const hasWildcard=pattern.includes('*');
+    const hasDollarSign=pattern.includes('$');
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    if(!hasWildcard&&!hasDollarSign){
+    return urlPath.startsWith(pattern);
+    
+    
+    
+    
+    
+    }else if(!hasWildcard&&hasDollarSign){
+    return urlPath===pattern.slice(0,-1);
+    
+    
+    
+    
+    
+    
+    }else if(hasWildcard&&!hasDollarSign){
+    const[beforeWildcard,afterWildcard]=pattern.split('*');
+    const remainingUrl=urlPath.slice(beforeWildcard.length);
+    return urlPath.startsWith(beforeWildcard)&&remainingUrl.includes(afterWildcard);
+    
+    
+    
+    
+    
+    
+    }else if(hasWildcard&&hasDollarSign){
+    const[beforeWildcard,afterWildcard]=pattern.split('*');
+    const urlEnd=urlPath.slice(beforeWildcard.length);
+    return urlPath.startsWith(beforeWildcard)&&urlEnd.endsWith(afterWildcard.slice(0,-1));
+    }
+    return false;
+    }
+    
+    
+    
+    
+    
+    static validateTimingBudget(timingBudget){
+    const{metric,budget,tolerance,...invalidRest}=timingBudget;
+    Budget.assertNoExcessProperties(invalidRest,'Timing Budget');
+    
+    
+    const validTimingMetrics=[
+    'first-contentful-paint',
+    'first-cpu-idle',
+    'interactive',
+    'first-meaningful-paint',
+    'max-potential-fid'];
+    
+    
+    if(!validTimingMetrics.includes(metric)){
+    throw new Error(`Invalid timing metric: ${metric}. \n`+
+    `Valid timing metrics are: ${validTimingMetrics.join(', ')}`);
+    }
+    if(!isNumber(budget)){
+    throw new Error(`Invalid budget: ${budget}`);
+    }
+    if(typeof tolerance!=='undefined'&&!isNumber(tolerance)){
+    throw new Error(`Invalid tolerance: ${tolerance}`);
+    }
+    return{
+    metric:metric,
+    budget,
+    tolerance};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    static initializeBudget(budgetJson){
+    
+    budgetJson=JSON.parse(JSON.stringify(budgetJson));
+    if(!isArrayOfUnknownObjects(budgetJson)){
+    throw new Error('Budget file is not defined as an array of budgets.');
+    }
+    
+    const budgets=budgetJson.map((b,index)=>{
+    
+    const budget={};
+    
+    const{path,resourceSizes,resourceCounts,timings,...invalidRest}=b;
+    Budget.assertNoExcessProperties(invalidRest,'Budget');
+    
+    budget.path=Budget.validatePath(path);
+    
+    if(isArrayOfUnknownObjects(resourceSizes)){
+    budget.resourceSizes=resourceSizes.map(Budget.validateResourceBudget);
+    Budget.assertNoDuplicateStrings(budget.resourceSizes.map(r=>r.resourceType),
+    `budgets[${index}].resourceSizes`);
+    }else if(resourceSizes!==undefined){
+    throw new Error(`Invalid resourceSizes entry in budget at index ${index}`);
+    }
+    
+    if(isArrayOfUnknownObjects(resourceCounts)){
+    budget.resourceCounts=resourceCounts.map(Budget.validateResourceBudget);
+    Budget.assertNoDuplicateStrings(budget.resourceCounts.map(r=>r.resourceType),
+    `budgets[${index}].resourceCounts`);
+    }else if(resourceCounts!==undefined){
+    throw new Error(`Invalid resourceCounts entry in budget at index ${index}`);
+    }
+    
+    if(isArrayOfUnknownObjects(timings)){
+    budget.timings=timings.map(Budget.validateTimingBudget);
+    Budget.assertNoDuplicateStrings(budget.timings.map(r=>r.metric),
+    `budgets[${index}].timings`);
+    }else if(timings!==undefined){
+    throw new Error(`Invalid timings entry in budget at index ${index}`);
+    }
+    
+    return budget;
+    });
+    
+    return budgets;
+    }}
+    
+    
+    module.exports=Budget;
+    
+    },{}],43:[function(require,module,exports){
+    (function(process,global,__dirname){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const path=require('path');
+    const Audit=require('../audits/audit.js');
+    const Runner=require('../runner.js');
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const mergeOptionsOfItems=function(items){
+    
+    const mergedItems=[];
+    
+    for(const item of items){
+    const existingItem=item.path&&mergedItems.find(candidate=>candidate.path===item.path);
+    if(!existingItem){
+    mergedItems.push(item);
+    continue;
+    }
+    
+    existingItem.options=Object.assign({},existingItem.options,item.options);
+    }
+    
+    return mergedItems;
+    };
+    
+    
+    
+    
+    
+    
+    function assertValidAudit(auditDefinition){
+    const{implementation,path:auditPath}=auditDefinition;
+    const auditName=auditPath||
+    implementation&&implementation.meta&&implementation.meta.id||
+    'Unknown audit';
+    
+    if(typeof implementation.audit!=='function'||implementation.audit===Audit.audit){
+    throw new Error(`${auditName} has no audit() method.`);
+    }
+    
+    if(typeof implementation.meta.id!=='string'){
+    throw new Error(`${auditName} has no meta.id property, or the property is not a string.`);
+    }
+    
+    if(typeof implementation.meta.title!=='string'){
+    throw new Error(`${auditName} has no meta.title property, or the property is not a string.`);
+    }
+    
+    
+    if(
+    typeof implementation.meta.failureTitle!=='string'&&
+    implementation.meta.scoreDisplayMode===Audit.SCORING_MODES.BINARY)
+    {
+    throw new Error(`${auditName} has no failureTitle and should.`);
+    }
+    
+    if(typeof implementation.meta.description!=='string'){
+    throw new Error(
+    `${auditName} has no meta.description property, or the property is not a string.`);
+    
+    }else if(implementation.meta.description===''){
+    throw new Error(
+    `${auditName} has an empty meta.description string. Please add a description for the UI.`);
+    
+    }
+    
+    if(!Array.isArray(implementation.meta.requiredArtifacts)){
+    throw new Error(
+    `${auditName} has no meta.requiredArtifacts property, or the property is not an array.`);
+    
+    }
+    }
+    
+    
+    
+    
+    
+    
+    function expandAuditShorthand(audits){
+    if(!audits){
+    return null;
+    }
+    
+    const newAudits=audits.map(audit=>{
+    if(typeof audit==='string'){
+    
+    return{path:audit,options:{}};
+    }else if('implementation'in audit&&typeof audit.implementation.audit==='function'){
+    
+    return audit;
+    }else if('path'in audit&&typeof audit.path==='string'){
+    
+    return audit;
+    }else if('audit'in audit&&typeof audit.audit==='function'){
+    
+    return{implementation:audit,options:{}};
+    }else{
+    throw new Error('Invalid Audit type '+JSON.stringify(audit));
+    }
+    });
+    
+    return newAudits;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function requireAudits(audits,configDir){
+    const expandedAudits=expandAuditShorthand(audits);
+    if(!expandedAudits){
+    return null;
+    }
+    
+    const coreList=Runner.getAuditList();
+    const auditDefns=expandedAudits.map(audit=>{
+    let implementation;
+    if('implementation'in audit){
+    implementation=audit.implementation;
+    }else{
+    
+    const auditPathJs=`${audit.path}.js`;
+    const coreAudit=coreList.find(a=>a===auditPathJs);
+    let requirePath=`../audits/${audit.path}`;
+    if(!coreAudit){
+    if(global.devtools){
+    requirePath=audit.path;
+    }else{
+    
+    const absolutePath=resolveModule(audit.path,configDir,'audit');
+    
+    requirePath=path.relative(__dirname,absolutePath);
+    }
+    }
+    implementation=require(requirePath);
+    }
+    
+    return{
+    implementation,
+    path:audit.path,
+    options:audit.options||{}};
+    
+    });
+    
+    const mergedAuditDefns=mergeOptionsOfItems(auditDefns);
+    mergedAuditDefns.forEach(audit=>assertValidAudit(audit));
+    return mergedAuditDefns;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function resolveModule(moduleIdentifier,configDir,category){
+    
+    
+    
+    
+    try{
+    return require.resolve(moduleIdentifier);
+    }catch(e){}
+    
+    
+    
+    
+    const cwdPath=path.resolve(process.cwd(),moduleIdentifier);
+    try{
+    return require.resolve(cwdPath);
+    }catch(e){}
+    
+    const errorString=
+    'Unable to locate '+(
+    category?`${category}: `:'')+
+    `${moduleIdentifier} (tried to require() from '${__dirname}' and load from '${cwdPath}'`;
+    
+    if(!configDir){
+    throw new Error(errorString+')');
+    }
+    
+    
+    
+    
+    const relativePath=path.resolve(configDir,moduleIdentifier);
+    try{
+    return require.resolve(relativePath);
+    }catch(requireError){}
+    
+    throw new Error(errorString+` and '${relativePath}')`);
+    }
+    
+    module.exports={
+    mergeOptionsOfItems,
+    requireAudits,
+    resolveModule};
+    
+    
+    }).call(this,require('_process'),typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{},"/lighthouse-core/config");
+    },{"../audits/audit.js":3,"../runner.js":89,"_process":158,"path":156}],44:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    function isArrayOfUnknownObjects(arr){
+    return Array.isArray(arr)&&arr.every(isObjectOfUnknownProperties);
+    }
+    
+    
+    
+    
+    
+    function isObjectOfUnknownProperties(val){
+    return typeof val==='object'&&val!==null&&!Array.isArray(val);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function assertNoExcessProperties(obj,pluginName,objectName=''){
+    if(objectName){
+    objectName+=' ';
+    }
+    
+    const invalidKeys=Object.keys(obj);
+    if(invalidKeys.length>0){
+    const keys=invalidKeys.join(', ');
+    throw new Error(`${pluginName} has unrecognized ${objectName}properties: [${keys}]`);
+    }
+    }
+    
+    
+    
+    
+    class ConfigPlugin{
+    
+    
+    
+    
+    
+    
+    
+    static _parseAuditsList(auditsJson,pluginName){
+    
+    if(auditsJson===undefined){
+    return undefined;
+    }else if(!isArrayOfUnknownObjects(auditsJson)){
+    throw new Error(`${pluginName} has an invalid audits array.`);
+    }
+    
+    return auditsJson.map(auditDefnJson=>{
+    const{path,...invalidRest}=auditDefnJson;
+    assertNoExcessProperties(invalidRest,pluginName,'audit');
+    
+    if(typeof path!=='string'){
+    throw new Error(`${pluginName} has a missing audit path.`);
+    }
+    return{
+    path};
+    
+    });
+    }
+    
+    
+    
+    
+    
+    
+    
+    static _parseAuditRefsList(auditRefsJson,pluginName){
+    if(!isArrayOfUnknownObjects(auditRefsJson)){
+    throw new Error(`${pluginName} has no valid auditsRefs.`);
+    }
+    
+    return auditRefsJson.map(auditRefJson=>{
+    const{id,weight,group,...invalidRest}=auditRefJson;
+    assertNoExcessProperties(invalidRest,pluginName,'auditRef');
+    
+    if(typeof id!=='string'){
+    throw new Error(`${pluginName} has an invalid auditRef id.`);
+    }
+    if(typeof weight!=='number'){
+    throw new Error(`${pluginName} has an invalid auditRef weight.`);
+    }
+    if(typeof group!=='string'&&typeof group!=='undefined'){
+    throw new Error(`${pluginName} has an invalid auditRef group.`);
+    }
+    
+    const prependedGroup=group?`${pluginName}-${group}`:group;
+    return{
+    id,
+    weight,
+    group:prependedGroup};
+    
+    });
+    }
+    
+    
+    
+    
+    
+    
+    
+    static _parseCategory(categoryJson,pluginName){
+    if(!isObjectOfUnknownProperties(categoryJson)){
+    throw new Error(`${pluginName} has no valid category.`);
+    }
+    
+    const{
+    title,
+    description,
+    manualDescription,
+    auditRefs:auditRefsJson,
+    ...invalidRest}=
+    categoryJson;
+    
+    assertNoExcessProperties(invalidRest,pluginName,'category');
+    
+    if(typeof title!=='string'){
+    throw new Error(`${pluginName} has an invalid category tile.`);
+    }
+    if(typeof description!=='string'&&typeof description!=='undefined'){
+    throw new Error(`${pluginName} has an invalid category description.`);
+    }
+    if(typeof manualDescription!=='string'&&typeof manualDescription!=='undefined'){
+    throw new Error(`${pluginName} has an invalid category manualDescription.`);
+    }
+    const auditRefs=ConfigPlugin._parseAuditRefsList(auditRefsJson,pluginName);
+    
+    return{
+    title,
+    auditRefs,
+    description:description,
+    manualDescription:manualDescription};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    static _parseGroups(groupsJson,pluginName){
+    if(groupsJson===undefined){
+    return undefined;
+    }
+    
+    if(!isObjectOfUnknownProperties(groupsJson)){
+    throw new Error(`${pluginName} groups json is not defined as an object.`);
+    }
+    
+    const groups=Object.entries(groupsJson);
+    
+    
+    const parsedGroupsJson={};
+    groups.forEach(([groupId,groupJson])=>{
+    if(!isObjectOfUnknownProperties(groupJson)){
+    throw new Error(`${pluginName} has a group not defined as an object.`);
+    }
+    const{title,description,...invalidRest}=groupJson;
+    assertNoExcessProperties(invalidRest,pluginName,'group');
+    
+    if(typeof title!=='string'){
+    throw new Error(`${pluginName} has an invalid group title.`);
+    }
+    if(typeof description!=='string'&&typeof description!=='undefined'){
+    throw new Error(`${pluginName} has an invalid group description.`);
+    }
+    parsedGroupsJson[`${pluginName}-${groupId}`]={
+    title,
+    description};
+    
+    });
+    return parsedGroupsJson;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    static parsePlugin(pluginJson,pluginName){
+    
+    pluginJson=JSON.parse(JSON.stringify(pluginJson));
+    if(!isObjectOfUnknownProperties(pluginJson)){
+    throw new Error(`${pluginName} is not defined as an object.`);
+    }
+    
+    const{
+    audits:pluginAuditsJson,
+    category:pluginCategoryJson,
+    groups:pluginGroupsJson,
+    ...invalidRest}=
+    pluginJson;
+    
+    assertNoExcessProperties(invalidRest,pluginName);
+    
+    return{
+    audits:ConfigPlugin._parseAuditsList(pluginAuditsJson,pluginName),
+    categories:{
+    [pluginName]:ConfigPlugin._parseCategory(pluginCategoryJson,pluginName)},
+    
+    groups:ConfigPlugin._parseGroups(pluginGroupsJson,pluginName)};
+    
+    }}
+    
+    
+    module.exports=ConfigPlugin;
+    
+    },{}],45:[function(require,module,exports){
+    (function(global,__dirname){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const defaultConfigPath='./default-config.js';
+    const defaultConfig=require('./default-config.js');
+    const constants=require('./constants.js');
+    const i18n=require('./../lib/i18n/i18n.js');
+    
+    const isDeepEqual=require('lodash.isequal');
+    const log=require('lighthouse-logger');
+    const path=require('path');
+    const Runner=require('../runner.js');
+    const ConfigPlugin=require('./config-plugin.js');
+    const Budget=require('./budget.js');
+    const{requireAudits,mergeOptionsOfItems,resolveModule}=require('./config-helpers.js');
+    
+    
+    
+    
+    
+    
+    
+    
+    const BASE_ARTIFACT_BLANKS={
+    fetchTime:'',
+    LighthouseRunWarnings:'',
+    TestedAsMobileDevice:'',
+    HostUserAgent:'',
+    NetworkUserAgent:'',
+    BenchmarkIndex:'',
+    WebAppManifest:'',
+    Stacks:'',
+    traces:'',
+    devtoolsLogs:'',
+    settings:'',
+    URL:'',
+    Timing:'',
+    PageLoadError:''};
+    
+    const BASE_ARTIFACT_NAMES=Object.keys(BASE_ARTIFACT_BLANKS);
+    
+    
+    
+    
+    
+    function assertValidPasses(passes,audits){
+    if(!Array.isArray(passes)){
+    return;
+    }
+    
+    const requiredGatherers=Config.getGatherersNeededByAudits(audits);
+    
+    const foundGatherers=new Set(BASE_ARTIFACT_NAMES);
+    
+    
+    passes.forEach(pass=>{
+    pass.gatherers.forEach(gathererDefn=>{
+    const gatherer=gathererDefn.instance;
+    foundGatherers.add(gatherer.name);
+    const isGatherRequiredByAudits=requiredGatherers.has(gatherer.name);
+    if(!isGatherRequiredByAudits){
+    const msg=`${gatherer.name} gatherer requested, however no audit requires it.`;
+    log.warn('config',msg);
+    }
+    });
+    });
+    
+    
+    for(const auditDefn of audits||[]){
+    const auditMeta=auditDefn.implementation.meta;
+    for(const requiredArtifact of auditMeta.requiredArtifacts){
+    if(!foundGatherers.has(requiredArtifact)){
+    throw new Error(`${requiredArtifact} gatherer, required by audit ${auditMeta.id}, `+
+    'was not found in config.');
+    }
+    }
+    }
+    
+    
+    const usedNames=new Set();
+    passes.forEach(pass=>{
+    const passName=pass.passName;
+    if(usedNames.has(passName)){
+    throw new Error(`Passes must have unique names (repeated passName: ${passName}.`);
+    }
+    usedNames.add(passName);
+    });
+    }
+    
+    
+    
+    
+    
+    
+    function assertValidCategories(categories,audits,groups){
+    if(!categories){
+    return;
+    }
+    
+    const auditsKeyedById=new Map((audits||[]).map(audit=>
+    
+    [audit.implementation.meta.id,audit]));
+    
+    
+    Object.keys(categories).forEach(categoryId=>{
+    categories[categoryId].auditRefs.forEach((auditRef,index)=>{
+    if(!auditRef.id){
+    throw new Error(`missing an audit id at ${categoryId}[${index}]`);
+    }
+    
+    const audit=auditsKeyedById.get(auditRef.id);
+    if(!audit){
+    throw new Error(`could not find ${auditRef.id} audit for category ${categoryId}`);
+    }
+    
+    const auditImpl=audit.implementation;
+    const isManual=auditImpl.meta.scoreDisplayMode==='manual';
+    if(categoryId==='accessibility'&&!auditRef.group&&!isManual){
+    throw new Error(`${auditRef.id} accessibility audit does not have a group`);
+    }
+    
+    if(auditRef.weight>0&&isManual){
+    throw new Error(`${auditRef.id} is manual but has a positive weight`);
+    }
+    
+    if(auditRef.group&&(!groups||!groups[auditRef.group])){
+    throw new Error(`${auditRef.id} references unknown group ${auditRef.group}`);
+    }
+    });
+    });
+    }
+    
+    
+    
+    
+    
+    function assertValidGatherer(gathererInstance,gathererName){
+    gathererName=gathererName||gathererInstance.name||'gatherer';
+    
+    if(typeof gathererInstance.beforePass!=='function'){
+    throw new Error(`${gathererName} has no beforePass() method.`);
+    }
+    
+    if(typeof gathererInstance.pass!=='function'){
+    throw new Error(`${gathererName} has no pass() method.`);
+    }
+    
+    if(typeof gathererInstance.afterPass!=='function'){
+    throw new Error(`${gathererName} has no afterPass() method.`);
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    function assertValidPluginName(configJSON,pluginName){
+    if(!pluginName.startsWith('lighthouse-plugin-')){
+    throw new Error(`plugin name '${pluginName}' does not start with 'lighthouse-plugin-'`);
+    }
+    
+    if(configJSON.categories&&configJSON.categories[pluginName]){
+    throw new Error(`plugin name '${pluginName}' not allowed because it is the id of a category already found in config`);
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    function cleanFlagsForSettings(flags={}){
+    
+    const settings={};
+    
+    for(const key of Object.keys(flags)){
+    if(key in constants.defaultSettings){
+    
+    settings[key]=flags[key];
+    }
+    }
+    
+    return settings;
+    }
+    
+    
+    
+    
+    
+    
+    
+    function _merge(base,extension,overwriteArrays=false){
+    
+    if(typeof base==='undefined'||base===null){
+    return extension;
+    }else if(typeof extension==='undefined'){
+    return base;
+    }else if(Array.isArray(extension)){
+    if(overwriteArrays)return extension;
+    if(!Array.isArray(base))throw new TypeError(`Expected array but got ${typeof base}`);
+    const merged=base.slice();
+    extension.forEach(item=>{
+    if(!merged.some(candidate=>isDeepEqual(candidate,item)))merged.push(item);
+    });
+    
+    return merged;
+    }else if(typeof extension==='object'){
+    if(typeof base!=='object')throw new TypeError(`Expected object but got ${typeof base}`);
+    if(Array.isArray(base))throw new TypeError('Expected object but got Array');
+    Object.keys(extension).forEach(key=>{
+    const localOverwriteArrays=overwriteArrays||
+    key==='settings'&&typeof base[key]==='object';
+    base[key]=_merge(base[key],extension[key],localOverwriteArrays);
+    });
+    return base;
+    }
+    
+    return extension;
+    }
+    
+    
+    
+    
+    
+    
+    const merge=_merge;
+    
+    
+    
+    
+    
+    
+    function cloneArrayWithPluginSafety(array){
+    return array.map(item=>{
+    if(typeof item==='object'){
+    
+    return Object.assign(
+    Object.create(
+    Object.getPrototypeOf(item)),
+    
+    item);
+    
+    }
+    
+    return item;
+    });
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function deepClone(json){
+    return JSON.parse(JSON.stringify(json));
+    }
+    
+    
+    
+    
+    
+    
+    
+    function deepCloneConfigJson(json){
+    const cloned=deepClone(json);
+    
+    
+    
+    if(Array.isArray(cloned.passes)&&Array.isArray(json.passes)){
+    for(let i=0;i<cloned.passes.length;i++){
+    const pass=cloned.passes[i];
+    pass.gatherers=cloneArrayWithPluginSafety(json.passes[i].gatherers||[]);
+    }
+    }
+    
+    if(Array.isArray(json.audits)){
+    cloned.audits=cloneArrayWithPluginSafety(json.audits);
+    }
+    
+    return cloned;
+    }
+    
+    class Config{
+    
+    
+    
+    
+    
+    
+    constructor(configJSON,flags){
+    const status={msg:'Create config',id:'lh:init:config'};
+    log.time(status,'verbose');
+    let configPath=flags&&flags.configPath;
+    
+    if(!configJSON){
+    configJSON=defaultConfig;
+    configPath=path.resolve(__dirname,defaultConfigPath);
+    }
+    
+    if(configPath&&!path.isAbsolute(configPath)){
+    throw new Error('configPath must be an absolute path.');
+    }
+    
+    
+    configJSON=deepCloneConfigJson(configJSON);
+    
+    
+    if(configJSON.extends){
+    configJSON=Config.extendConfigJSON(deepCloneConfigJson(defaultConfig),configJSON);
+    }
+    
+    
+    const configDir=configPath?path.dirname(configPath):undefined;
+    
+    
+    configJSON=Config.mergePlugins(configJSON,flags,configDir);
+    
+    const settings=Config.initSettings(configJSON.settings,flags);
+    
+    
+    const passesWithDefaults=Config.augmentPassesWithDefaults(configJSON.passes);
+    Config.adjustDefaultPassForThrottling(settings,passesWithDefaults);
+    const passes=Config.requireGatherers(passesWithDefaults,configDir);
+    
+    
+    this.settings=settings;
+    
+    this.passes=passes;
+    
+    this.audits=Config.requireAudits(configJSON.audits,configDir);
+    
+    this.categories=configJSON.categories||null;
+    
+    this.groups=configJSON.groups||null;
+    
+    Config.filterConfigIfNeeded(this);
+    
+    assertValidPasses(this.passes,this.audits);
+    assertValidCategories(this.categories,this.audits,this.groups);
+    
+    
+    
+    const configJson=this;
+    log.timeEnd(status);
+    }
+    
+    
+    
+    
+    
+    
+    getPrintString(){
+    const jsonConfig=deepClone(this);
+    
+    if(jsonConfig.passes){
+    for(const pass of jsonConfig.passes){
+    for(const gathererDefn of pass.gatherers){
+    gathererDefn.implementation=undefined;
+    
+    gathererDefn.instance=undefined;
+    if(Object.keys(gathererDefn.options).length===0){
+    
+    gathererDefn.options=undefined;
+    }
+    }
+    }
+    }
+    
+    if(jsonConfig.audits){
+    for(const auditDefn of jsonConfig.audits){
+    
+    auditDefn.implementation=undefined;
+    if(Object.keys(auditDefn.options).length===0){
+    
+    auditDefn.options=undefined;
+    }
+    }
+    }
+    
+    
+    i18n.replaceIcuMessageInstanceIds(jsonConfig,jsonConfig.settings.locale);
+    
+    return JSON.stringify(jsonConfig,null,2);
+    }
+    
+    
+    
+    
+    
+    
+    static extendConfigJSON(baseJSON,extendJSON){
+    if(extendJSON.passes&&baseJSON.passes){
+    for(const pass of extendJSON.passes){
+    
+    const passName=pass.passName||constants.defaultPassConfig.passName;
+    const basePass=baseJSON.passes.find(candidate=>candidate.passName===passName);
+    
+    if(!basePass){
+    baseJSON.passes.push(pass);
+    }else{
+    merge(basePass,pass);
+    }
+    }
+    
+    delete extendJSON.passes;
+    }
+    
+    return merge(baseJSON,extendJSON);
+    }
+    
+    
+    
+    
+    
+    
+    
+    static mergePlugins(configJSON,flags,configDir){
+    const configPlugins=configJSON.plugins||[];
+    const flagPlugins=flags&&flags.plugins||[];
+    const pluginNames=new Set([...configPlugins,...flagPlugins]);
+    
+    for(const pluginName of pluginNames){
+    assertValidPluginName(configJSON,pluginName);
+    
+    const pluginPath=global.devtools?
+    pluginName:
+    resolveModule(pluginName,configDir,'plugin');
+    const rawPluginJson=require(pluginPath);
+    const pluginJson=ConfigPlugin.parsePlugin(rawPluginJson,pluginName);
+    
+    configJSON=Config.extendConfigJSON(configJSON,pluginJson);
+    }
+    
+    return configJSON;
+    }
+    
+    
+    
+    
+    
+    static augmentPassesWithDefaults(passes){
+    if(!passes){
+    return null;
+    }
+    
+    const{defaultPassConfig}=constants;
+    return passes.map(pass=>merge(deepClone(defaultPassConfig),pass));
+    }
+    
+    
+    
+    
+    
+    
+    static initSettings(settingsJson={},flags){
+    
+    
+    
+    const locale=i18n.lookupLocale(flags&&flags.locale||settingsJson.locale);
+    
+    
+    const{defaultSettings}=constants;
+    const settingWithDefaults=merge(deepClone(defaultSettings),settingsJson,true);
+    
+    
+    const settingsWithFlags=merge(settingWithDefaults||{},cleanFlagsForSettings(flags),true);
+    
+    if(settingsWithFlags.budgets){
+    settingsWithFlags.budgets=Budget.initializeBudget(settingsWithFlags.budgets);
+    }
+    
+    settingsWithFlags.locale=locale;
+    
+    return settingsWithFlags;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static expandGathererShorthand(gatherers){
+    const expanded=gatherers.map(gatherer=>{
+    if(typeof gatherer==='string'){
+    
+    return{path:gatherer,options:{}};
+    }else if('implementation'in gatherer||'instance'in gatherer){
+    
+    return gatherer;
+    }else if('path'in gatherer){
+    
+    if(typeof gatherer.path!=='string'){
+    throw new Error('Invalid Gatherer type '+JSON.stringify(gatherer));
+    }
+    return gatherer;
+    }else if(typeof gatherer==='function'){
+    
+    return{implementation:gatherer,options:{}};
+    }else if(gatherer&&typeof gatherer.beforePass==='function'){
+    
+    return{instance:gatherer,options:{}};
+    }else{
+    throw new Error('Invalid Gatherer type '+JSON.stringify(gatherer));
+    }
+    });
+    
+    return expanded;
+    }
+    
+    
+    
+    
+    
+    
+    
+    static adjustDefaultPassForThrottling(settings,passes){
+    if(!passes||
+    settings.throttlingMethod!=='devtools'&&settings.throttlingMethod!=='provided'){
+    return;
+    }
+    
+    const defaultPass=passes.find(pass=>pass.passName==='defaultPass');
+    if(!defaultPass)return;
+    const overrides=constants.nonSimulatedPassConfigOverrides;
+    defaultPass.pauseAfterLoadMs=
+    Math.max(overrides.pauseAfterLoadMs,defaultPass.pauseAfterLoadMs);
+    defaultPass.cpuQuietThresholdMs=
+    Math.max(overrides.cpuQuietThresholdMs,defaultPass.cpuQuietThresholdMs);
+    defaultPass.networkQuietThresholdMs=
+    Math.max(overrides.networkQuietThresholdMs,defaultPass.networkQuietThresholdMs);
+    }
+    
+    
+    
+    
+    
+    static filterConfigIfNeeded(config){
+    const settings=config.settings;
+    if(!settings.onlyCategories&&!settings.onlyAudits&&!settings.skipAudits){
+    return;
+    }
+    
+    
+    const{categories,requestedAuditNames}=Config.filterCategoriesAndAudits(config.categories,
+    settings);
+    
+    
+    const audits=config.audits&&config.audits.filter(auditDefn=>
+    requestedAuditNames.has(auditDefn.implementation.meta.id));
+    
+    
+    const requiredGathererIds=Config.getGatherersNeededByAudits(audits);
+    
+    
+    const passes=Config.generatePassesNeededByGatherers(config.passes,requiredGathererIds);
+    
+    config.categories=categories;
+    config.audits=audits;
+    config.passes=passes;
+    }
+    
+    
+    
+    
+    
+    
+    
+    static filterCategoriesAndAudits(oldCategories,settings){
+    if(!oldCategories){
+    return{categories:null,requestedAuditNames:new Set()};
+    }
+    
+    if(settings.onlyAudits&&settings.skipAudits){
+    throw new Error('Cannot set both skipAudits and onlyAudits');
+    }
+    
+    
+    const categories={};
+    const filterByIncludedCategory=!!settings.onlyCategories;
+    const filterByIncludedAudit=!!settings.onlyAudits;
+    const categoryIds=settings.onlyCategories||[];
+    const auditIds=settings.onlyAudits||[];
+    const skipAuditIds=settings.skipAudits||[];
+    
+    
+    categoryIds.forEach(categoryId=>{
+    if(!oldCategories[categoryId]){
+    log.warn('config',`unrecognized category in 'onlyCategories': ${categoryId}`);
+    }
+    });
+    
+    
+    const auditsToValidate=new Set(auditIds.concat(skipAuditIds));
+    for(const auditId of auditsToValidate){
+    const foundCategory=Object.keys(oldCategories).find(categoryId=>{
+    const auditRefs=oldCategories[categoryId].auditRefs;
+    return!!auditRefs.find(candidate=>candidate.id===auditId);
+    });
+    
+    if(!foundCategory){
+    const parentKeyName=skipAuditIds.includes(auditId)?'skipAudits':'onlyAudits';
+    log.warn('config',`unrecognized audit in '${parentKeyName}': ${auditId}`);
+    }else if(auditIds.includes(auditId)&&categoryIds.includes(foundCategory)){
+    log.warn('config',`${auditId} in 'onlyAudits' is already included by `+
+    `${foundCategory} in 'onlyCategories'`);
+    }
+    }
+    
+    const includedAudits=new Set(auditIds);
+    skipAuditIds.forEach(id=>includedAudits.delete(id));
+    
+    Object.keys(oldCategories).forEach(categoryId=>{
+    const category=deepClone(oldCategories[categoryId]);
+    
+    if(filterByIncludedCategory&&filterByIncludedAudit){
+    
+    if(!categoryIds.includes(categoryId)){
+    category.auditRefs=category.auditRefs.filter(audit=>auditIds.includes(audit.id));
+    }
+    }else if(filterByIncludedCategory){
+    
+    if(!categoryIds.includes(categoryId)){
+    return;
+    }
+    }else if(filterByIncludedAudit){
+    category.auditRefs=category.auditRefs.filter(audit=>auditIds.includes(audit.id));
+    }
+    
+    
+    category.auditRefs=category.auditRefs.filter(audit=>!skipAuditIds.includes(audit.id));
+    
+    if(category.auditRefs.length){
+    categories[categoryId]=category;
+    category.auditRefs.forEach(audit=>includedAudits.add(audit.id));
+    }
+    });
+    
+    return{categories,requestedAuditNames:includedAudits};
+    }
+    
+    
+    
+    
+    
+    static getCategories(config){
+    const categories=config.categories;
+    if(!categories){
+    return[];
+    }
+    
+    return Object.keys(categories).map(id=>{
+    const title=categories[id].title;
+    return{id,title};
+    });
+    }
+    
+    
+    
+    
+    
+    
+    static getGatherersNeededByAudits(audits){
+    
+    
+    if(!audits){
+    return new Set();
+    }
+    
+    return audits.reduce((list,auditDefn)=>{
+    auditDefn.implementation.meta.requiredArtifacts.forEach(artifact=>list.add(artifact));
+    return list;
+    },new Set());
+    }
+    
+    
+    
+    
+    
+    
+    
+    static generatePassesNeededByGatherers(passes,requiredGatherers){
+    if(!passes){
+    return null;
+    }
+    
+    const auditsNeedTrace=requiredGatherers.has('traces');
+    const filteredPasses=passes.map(pass=>{
+    
+    pass.gatherers=pass.gatherers.filter(gathererDefn=>{
+    const gatherer=gathererDefn.instance;
+    return requiredGatherers.has(gatherer.name);
+    });
+    
+    
+    if(pass.recordTrace&&!auditsNeedTrace){
+    const passName=pass.passName||'unknown pass';
+    log.warn('config',`Trace not requested by an audit, dropping trace in ${passName}`);
+    pass.recordTrace=false;
+    }
+    
+    return pass;
+    }).filter(pass=>{
+    
+    if(pass.recordTrace)return true;
+    
+    if(pass.passName==='defaultPass')return true;
+    return pass.gatherers.length>0;
+    });
+    return filteredPasses;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static requireAudits(audits,configDir){
+    const status={msg:'Requiring audits',id:'lh:config:requireAudits'};
+    log.time(status,'verbose');
+    const auditDefns=requireAudits(audits,configDir);
+    log.timeEnd(status);
+    return auditDefns;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    static requireGathererFromPath(path,options,coreAuditList,configDir){
+    const coreGatherer=coreAuditList.find(a=>a===`${path}.js`);
+    
+    let requirePath=`../gather/gatherers/${path}`;
+    if(!coreGatherer){
+    
+    requirePath=resolveModule(path,configDir,'gatherer');
+    }
+    
+    const GathererClass=require(requirePath);
+    
+    return{
+    instance:new GathererClass(),
+    implementation:GathererClass,
+    path,
+    options:options||{}};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static requireGatherers(passes,configDir){
+    if(!passes){
+    return null;
+    }
+    const status={msg:'Requiring gatherers',id:'lh:config:requireGatherers'};
+    log.time(status,'verbose');
+    
+    const coreList=Runner.getGathererList();
+    const fullPasses=passes.map(pass=>{
+    const gathererDefns=Config.expandGathererShorthand(pass.gatherers).map(gathererDefn=>{
+    if(gathererDefn.instance){
+    return{
+    instance:gathererDefn.instance,
+    implementation:gathererDefn.implementation,
+    path:gathererDefn.path,
+    options:gathererDefn.options||{}};
+    
+    }else if(gathererDefn.implementation){
+    const GathererClass=gathererDefn.implementation;
+    return{
+    instance:new GathererClass(),
+    implementation:gathererDefn.implementation,
+    path:gathererDefn.path,
+    options:gathererDefn.options||{}};
+    
+    }else if(gathererDefn.path){
+    const path=gathererDefn.path;
+    const options=gathererDefn.options;
+    return Config.requireGathererFromPath(path,options,coreList,configDir);
+    }else{
+    throw new Error('Invalid expanded Gatherer: '+JSON.stringify(gathererDefn));
+    }
+    });
+    
+    const mergedDefns=mergeOptionsOfItems(gathererDefns);
+    mergedDefns.forEach(gatherer=>assertValidGatherer(gatherer.instance,gatherer.path));
+    
+    return Object.assign(pass,{gatherers:mergedDefns});
+    });
+    log.timeEnd(status);
+    return fullPasses;
+    }}
+    
+    
+    module.exports=Config;
+    
+    }).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{},"/lighthouse-core/config");
+    },{"../runner.js":89,"./../lib/i18n/i18n.js":66,"./budget.js":42,"./config-helpers.js":43,"./config-plugin.js":44,"./constants.js":46,"./default-config.js":47,"lighthouse-logger":125,"lodash.isequal":142,"path":156}],46:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    const DEVTOOLS_RTT_ADJUSTMENT_FACTOR=3.75;
+    const DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR=0.9;
+    
+    const throttling={
+    DEVTOOLS_RTT_ADJUSTMENT_FACTOR,
+    DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR,
+    
+    
+    mobileSlow4G:{
+    rttMs:150,
+    throughputKbps:1.6*1024,
+    requestLatencyMs:150*DEVTOOLS_RTT_ADJUSTMENT_FACTOR,
+    downloadThroughputKbps:1.6*1024*DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR,
+    uploadThroughputKbps:750*DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR,
+    cpuSlowdownMultiplier:4},
+    
+    
+    
+    
+    mobileRegluar3G:{
+    rttMs:300,
+    throughputKbps:700,
+    requestLatencyMs:300*DEVTOOLS_RTT_ADJUSTMENT_FACTOR,
+    downloadThroughputKbps:700*DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR,
+    uploadThroughputKbps:700*DEVTOOLS_THROUGHPUT_ADJUSTMENT_FACTOR,
+    cpuSlowdownMultiplier:4}};
+    
+    
+    
+    
+    const defaultSettings={
+    output:'json',
+    maxWaitForFcp:30*1000,
+    maxWaitForLoad:45*1000,
+    throttlingMethod:'simulate',
+    throttling:throttling.mobileSlow4G,
+    auditMode:false,
+    gatherMode:false,
+    disableStorageReset:false,
+    emulatedFormFactor:'mobile',
+    internalDisableDeviceScreenEmulation:false,
+    channel:'node',
+    
+    
+    
+    budgets:null,
+    locale:'en-US',
+    blockedUrlPatterns:null,
+    additionalTraceCategories:null,
+    extraHeaders:null,
+    precomputedLanternData:null,
+    onlyAudits:null,
+    onlyCategories:null,
+    skipAudits:null};
+    
+    
+    
+    const defaultPassConfig={
+    passName:'defaultPass',
+    recordTrace:false,
+    useThrottling:false,
+    pauseAfterLoadMs:0,
+    networkQuietThresholdMs:0,
+    cpuQuietThresholdMs:0,
+    blockedUrlPatterns:[],
+    blankPage:'about:blank',
+    gatherers:[]};
+    
+    
+    const nonSimulatedPassConfigOverrides={
+    pauseAfterLoadMs:5250,
+    networkQuietThresholdMs:5250,
+    cpuQuietThresholdMs:5250};
+    
+    
+    module.exports={
+    throttling,
+    defaultSettings,
+    defaultPassConfig,
+    nonSimulatedPassConfigOverrides};
+    
+    
+    },{}],47:[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    const constants=require('./constants.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    
+    const UIStrings={
+    
+    performanceCategoryTitle:'Performance',
+    
+    budgetsGroupTitle:'Budgets',
+    
+    budgetsGroupDescription:'Performance budgets set standards for the performance of your site.',
+    
+    metricGroupTitle:'Metrics',
+    
+    loadOpportunitiesGroupTitle:'Opportunities',
+    
+    loadOpportunitiesGroupDescription:'These suggestions can help your page load faster. They don\'t [directly affect](https://github.com/GoogleChrome/lighthouse/blob/d2ec9ffbb21de9ad1a0f86ed24575eda32c796f0/docs/scoring.md#how-are-the-scores-weighted) the Performance score.',
+    
+    firstPaintImprovementsGroupTitle:'First Paint Improvements',
+    
+    firstPaintImprovementsGroupDescription:'The most critical aspect of performance is how quickly pixels are rendered onscreen. Key metrics: First Contentful Paint, First Meaningful Paint',
+    
+    overallImprovementsGroupTitle:'Overall Improvements',
+    
+    overallImprovementsGroupDescription:'Enhance the overall loading experience, so the page is responsive and ready to use as soon as possible. Key metrics: Time to Interactive, Speed Index',
+    
+    diagnosticsGroupTitle:'Diagnostics',
+    
+    diagnosticsGroupDescription:'More information about the performance of your application. These numbers don\'t [directly affect](https://github.com/GoogleChrome/lighthouse/blob/d2ec9ffbb21de9ad1a0f86ed24575eda32c796f0/docs/scoring.md#how-are-the-scores-weighted) the Performance score.',
+    
+    a11yCategoryTitle:'Accessibility',
+    
+    a11yCategoryDescription:'These checks highlight opportunities to [improve the accessibility of your web app](https://developers.google.com/web/fundamentals/accessibility). Only a subset of accessibility issues can be automatically detected so manual testing is also encouraged.',
+    
+    a11yCategoryManualDescription:'These items address areas which an automated testing tool cannot cover. Learn more in our guide on [conducting an accessibility review](https://developers.google.com/web/fundamentals/accessibility/how-to-review).',
+    
+    a11yBestPracticesGroupTitle:'Best practices',
+    
+    a11yBestPracticesGroupDescription:'These items highlight common accessibility best practices.',
+    
+    a11yColorContrastGroupTitle:'Contrast',
+    
+    a11yColorContrastGroupDescription:'These are opportunities to improve the legibility of your content.',
+    
+    a11yNamesLabelsGroupTitle:'Names and labels',
+    
+    a11yNamesLabelsGroupDescription:'These are opportunities to improve the semantics of the controls in your application. This may enhance the experience for users of assistive technology, like a screen reader.',
+    
+    a11yNavigationGroupTitle:'Navigation',
+    
+    a11yNavigationGroupDescription:'These are opportunities to improve keyboard navigation in your application.',
+    
+    a11yAriaGroupTitle:'ARIA',
+    
+    a11yAriaGroupDescription:'These are opportunities to improve the usage of ARIA in your application which may enhance the experience for users of assistive technology, like a screen reader.',
+    
+    a11yLanguageGroupTitle:'Internationalization and localization',
+    
+    a11yLanguageGroupDescription:'These are opportunities to improve the interpretation of your content by users in different locales.',
+    
+    a11yAudioVideoGroupTitle:'Audio and video',
+    
+    a11yAudioVideoGroupDescription:'These are opportunities to provide alternative content for audio and video. This may improve the experience for users with hearing or vision impairments.',
+    
+    a11yTablesListsVideoGroupTitle:'Tables and lists',
+    
+    a11yTablesListsVideoGroupDescription:'These are opportunities to to improve the experience of reading tabular or list data using assistive technology, like a screen reader.',
+    
+    seoCategoryTitle:'SEO',
+    
+    seoCategoryDescription:'These checks ensure that your page is optimized for search engine results ranking. '+
+    'There are additional factors Lighthouse does not check that may affect your search ranking. '+
+    '[Learn more](https://support.google.com/webmasters/answer/35769).',
+    
+    seoCategoryManualDescription:'Run these additional validators on your site to check additional SEO best practices.',
+    
+    seoMobileGroupTitle:'Mobile Friendly',
+    
+    seoMobileGroupDescription:'Make sure your pages are mobile friendly so users don’t have to pinch or zoom '+
+    'in order to read the content pages. [Learn more](https://developers.google.com/search/mobile-sites/).',
+    
+    seoContentGroupTitle:'Content Best Practices',
+    
+    seoContentGroupDescription:'Format your HTML in a way that enables crawlers to better understand your app’s content.',
+    
+    seoCrawlingGroupTitle:'Crawling and Indexing',
+    
+    seoCrawlingGroupDescription:'To appear in search results, crawlers need access to your app.',
+    
+    pwaCategoryTitle:'Progressive Web App',
+    
+    pwaCategoryDescription:'These checks validate the aspects of a Progressive Web App. '+
+    '[Learn more](https://developers.google.com/web/progressive-web-apps/checklist).',
+    
+    pwaCategoryManualDescription:'These checks are required by the baseline '+
+    '[PWA Checklist](https://developers.google.com/web/progressive-web-apps/checklist) but are '+
+    'not automatically checked by Lighthouse. They do not affect your score but it\'s important that you verify them manually.',
+    
+    bestPracticesCategoryTitle:'Best Practices',
+    
+    pwaFastReliableGroupTitle:'Fast and reliable',
+    
+    pwaInstallableGroupTitle:'Installable',
+    
+    pwaOptimizedGroupTitle:'PWA Optimized'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    const defaultConfig={
+    settings:constants.defaultSettings,
+    passes:[{
+    passName:'defaultPass',
+    recordTrace:true,
+    useThrottling:true,
+    pauseAfterLoadMs:1000,
+    networkQuietThresholdMs:1000,
+    cpuQuietThresholdMs:1000,
+    gatherers:[
+    'css-usage',
+    'viewport-dimensions',
+    'runtime-exceptions',
+    'console-messages',
+    'anchor-elements',
+    'image-elements',
+    'link-elements',
+    'meta-elements',
+    'script-elements',
+    'iframe-elements',
+    'main-document-content',
+    'dobetterweb/appcache',
+    'dobetterweb/doctype',
+    'dobetterweb/domstats',
+    'dobetterweb/optimized-images',
+    'dobetterweb/password-inputs-with-prevented-paste',
+    'dobetterweb/response-compression',
+    'dobetterweb/tags-blocking-first-paint',
+    'seo/font-size',
+    'seo/embedded-content',
+    'seo/robots-txt',
+    'seo/tap-targets',
+    'accessibility']},
+    
+    
+    {
+    passName:'offlinePass',
+    gatherers:[
+    'service-worker',
+    'offline',
+    'start-url']},
+    
+    
+    {
+    passName:'redirectPass',
+    
+    blockedUrlPatterns:['*.css','*.jpg','*.jpeg','*.png','*.gif','*.svg','*.ttf','*.woff','*.woff2'],
+    gatherers:[
+    'http-redirect',
+    'html-without-javascript']}],
+    
+    
+    audits:[
+    'is-on-https',
+    'redirects-http',
+    'service-worker',
+    'works-offline',
+    'viewport',
+    'without-javascript',
+    'metrics/first-contentful-paint',
+    'metrics/first-meaningful-paint',
+    'load-fast-enough-for-pwa',
+    'metrics/speed-index',
+    'screenshot-thumbnails',
+    'final-screenshot',
+    'metrics/estimated-input-latency',
+    'metrics/total-blocking-time',
+    'metrics/max-potential-fid',
+    'errors-in-console',
+    'time-to-first-byte',
+    'metrics/first-cpu-idle',
+    'metrics/interactive',
+    'user-timings',
+    'critical-request-chains',
+    'redirects',
+    'installable-manifest',
+    'apple-touch-icon',
+    'splash-screen',
+    'themed-omnibox',
+    'content-width',
+    'image-aspect-ratio',
+    'deprecations',
+    'mainthread-work-breakdown',
+    'bootup-time',
+    'uses-rel-preload',
+    'uses-rel-preconnect',
+    'font-display',
+    'diagnostics',
+    'network-requests',
+    'network-rtt',
+    'network-server-latency',
+    'main-thread-tasks',
+    'metrics',
+    'offline-start-url',
+    'performance-budget',
+    'resource-summary',
+    'third-party-summary',
+    'manual/pwa-cross-browser',
+    'manual/pwa-page-transitions',
+    'manual/pwa-each-page-has-url',
+    'accessibility/accesskeys',
+    'accessibility/aria-allowed-attr',
+    'accessibility/aria-required-attr',
+    'accessibility/aria-required-children',
+    'accessibility/aria-required-parent',
+    'accessibility/aria-roles',
+    'accessibility/aria-valid-attr-value',
+    'accessibility/aria-valid-attr',
+    'accessibility/audio-caption',
+    'accessibility/button-name',
+    'accessibility/bypass',
+    'accessibility/color-contrast',
+    'accessibility/definition-list',
+    'accessibility/dlitem',
+    'accessibility/document-title',
+    'accessibility/duplicate-id',
+    'accessibility/frame-title',
+    'accessibility/html-has-lang',
+    'accessibility/html-lang-valid',
+    'accessibility/image-alt',
+    'accessibility/input-image-alt',
+    'accessibility/label',
+    'accessibility/layout-table',
+    'accessibility/link-name',
+    'accessibility/list',
+    'accessibility/listitem',
+    'accessibility/meta-refresh',
+    'accessibility/meta-viewport',
+    'accessibility/object-alt',
+    'accessibility/tabindex',
+    'accessibility/td-headers-attr',
+    'accessibility/th-has-data-cells',
+    'accessibility/valid-lang',
+    'accessibility/video-caption',
+    'accessibility/video-description',
+    'accessibility/manual/custom-controls-labels',
+    'accessibility/manual/custom-controls-roles',
+    'accessibility/manual/focus-traps',
+    'accessibility/manual/focusable-controls',
+    'accessibility/manual/heading-levels',
+    'accessibility/manual/interactive-element-affordance',
+    'accessibility/manual/logical-tab-order',
+    'accessibility/manual/managed-focus',
+    'accessibility/manual/offscreen-content-hidden',
+    'accessibility/manual/use-landmarks',
+    'accessibility/manual/visual-order-follows-dom',
+    'byte-efficiency/uses-long-cache-ttl',
+    'byte-efficiency/total-byte-weight',
+    'byte-efficiency/offscreen-images',
+    'byte-efficiency/render-blocking-resources',
+    'byte-efficiency/unminified-css',
+    'byte-efficiency/unminified-javascript',
+    'byte-efficiency/unused-css-rules',
+    'byte-efficiency/uses-webp-images',
+    'byte-efficiency/uses-optimized-images',
+    'byte-efficiency/uses-text-compression',
+    'byte-efficiency/uses-responsive-images',
+    'byte-efficiency/efficient-animated-content',
+    'dobetterweb/appcache-manifest',
+    'dobetterweb/doctype',
+    'dobetterweb/dom-size',
+    'dobetterweb/external-anchors-use-rel-noopener',
+    'dobetterweb/geolocation-on-start',
+    'dobetterweb/no-document-write',
+    'dobetterweb/no-vulnerable-libraries',
+    'dobetterweb/js-libraries',
+    'dobetterweb/notification-on-start',
+    'dobetterweb/password-inputs-can-be-pasted-into',
+    'dobetterweb/uses-http2',
+    'dobetterweb/uses-passive-event-listeners',
+    'seo/meta-description',
+    'seo/http-status-code',
+    'seo/font-size',
+    'seo/link-text',
+    'seo/is-crawlable',
+    'seo/robots-txt',
+    'seo/tap-targets',
+    'seo/hreflang',
+    'seo/plugins',
+    'seo/canonical',
+    'seo/manual/structured-data'],
+    
+    
+    groups:{
+    'metrics':{
+    title:str_(UIStrings.metricGroupTitle)},
+    
+    'load-opportunities':{
+    title:str_(UIStrings.loadOpportunitiesGroupTitle),
+    description:str_(UIStrings.loadOpportunitiesGroupDescription)},
+    
+    'budgets':{
+    title:str_(UIStrings.budgetsGroupTitle),
+    description:str_(UIStrings.budgetsGroupDescription)},
+    
+    'diagnostics':{
+    title:str_(UIStrings.diagnosticsGroupTitle),
+    description:str_(UIStrings.diagnosticsGroupDescription)},
+    
+    'pwa-fast-reliable':{
+    title:str_(UIStrings.pwaFastReliableGroupTitle)},
+    
+    'pwa-installable':{
+    title:str_(UIStrings.pwaInstallableGroupTitle)},
+    
+    'pwa-optimized':{
+    title:str_(UIStrings.pwaOptimizedGroupTitle)},
+    
+    'a11y-best-practices':{
+    title:str_(UIStrings.a11yBestPracticesGroupTitle),
+    description:str_(UIStrings.a11yBestPracticesGroupDescription)},
+    
+    'a11y-color-contrast':{
+    title:str_(UIStrings.a11yColorContrastGroupTitle),
+    description:str_(UIStrings.a11yColorContrastGroupDescription)},
+    
+    'a11y-names-labels':{
+    title:str_(UIStrings.a11yNamesLabelsGroupTitle),
+    description:str_(UIStrings.a11yNamesLabelsGroupDescription)},
+    
+    'a11y-navigation':{
+    title:str_(UIStrings.a11yNavigationGroupTitle),
+    description:str_(UIStrings.a11yNavigationGroupDescription)},
+    
+    'a11y-aria':{
+    title:str_(UIStrings.a11yAriaGroupTitle),
+    description:str_(UIStrings.a11yAriaGroupDescription)},
+    
+    'a11y-language':{
+    title:str_(UIStrings.a11yLanguageGroupTitle),
+    description:str_(UIStrings.a11yLanguageGroupDescription)},
+    
+    'a11y-audio-video':{
+    title:str_(UIStrings.a11yAudioVideoGroupTitle),
+    description:str_(UIStrings.a11yAudioVideoGroupDescription)},
+    
+    'a11y-tables-lists':{
+    title:str_(UIStrings.a11yTablesListsVideoGroupTitle),
+    description:str_(UIStrings.a11yTablesListsVideoGroupDescription)},
+    
+    'seo-mobile':{
+    title:str_(UIStrings.seoMobileGroupTitle),
+    description:str_(UIStrings.seoMobileGroupDescription)},
+    
+    'seo-content':{
+    title:str_(UIStrings.seoContentGroupTitle),
+    description:str_(UIStrings.seoContentGroupDescription)},
+    
+    'seo-crawl':{
+    title:str_(UIStrings.seoCrawlingGroupTitle),
+    description:str_(UIStrings.seoCrawlingGroupDescription)}},
+    
+    
+    categories:{
+    'performance':{
+    title:str_(UIStrings.performanceCategoryTitle),
+    auditRefs:[
+    {id:'first-contentful-paint',weight:3,group:'metrics'},
+    {id:'first-meaningful-paint',weight:1,group:'metrics'},
+    {id:'speed-index',weight:4,group:'metrics'},
+    {id:'interactive',weight:5,group:'metrics'},
+    {id:'first-cpu-idle',weight:2,group:'metrics'},
+    {id:'max-potential-fid',weight:0,group:'metrics'},
+    {id:'estimated-input-latency',weight:0},
+    {id:'total-blocking-time',weight:0},
+    {id:'render-blocking-resources',weight:0,group:'load-opportunities'},
+    {id:'uses-responsive-images',weight:0,group:'load-opportunities'},
+    {id:'offscreen-images',weight:0,group:'load-opportunities'},
+    {id:'unminified-css',weight:0,group:'load-opportunities'},
+    {id:'unminified-javascript',weight:0,group:'load-opportunities'},
+    {id:'unused-css-rules',weight:0,group:'load-opportunities'},
+    {id:'uses-optimized-images',weight:0,group:'load-opportunities'},
+    {id:'uses-webp-images',weight:0,group:'load-opportunities'},
+    {id:'uses-text-compression',weight:0,group:'load-opportunities'},
+    {id:'uses-rel-preconnect',weight:0,group:'load-opportunities'},
+    {id:'time-to-first-byte',weight:0,group:'load-opportunities'},
+    {id:'redirects',weight:0,group:'load-opportunities'},
+    {id:'uses-rel-preload',weight:0,group:'load-opportunities'},
+    {id:'efficient-animated-content',weight:0,group:'load-opportunities'},
+    {id:'total-byte-weight',weight:0,group:'diagnostics'},
+    {id:'uses-long-cache-ttl',weight:0,group:'diagnostics'},
+    {id:'dom-size',weight:0,group:'diagnostics'},
+    {id:'critical-request-chains',weight:0,group:'diagnostics'},
+    {id:'user-timings',weight:0,group:'diagnostics'},
+    {id:'bootup-time',weight:0,group:'diagnostics'},
+    {id:'mainthread-work-breakdown',weight:0,group:'diagnostics'},
+    {id:'font-display',weight:0,group:'diagnostics'},
+    {id:'performance-budget',weight:0,group:'budgets'},
+    {id:'resource-summary',weight:0,group:'diagnostics'},
+    {id:'third-party-summary',weight:0,group:'diagnostics'},
+    
+    {id:'network-requests',weight:0},
+    {id:'network-rtt',weight:0},
+    {id:'network-server-latency',weight:0},
+    {id:'main-thread-tasks',weight:0},
+    {id:'diagnostics',weight:0},
+    {id:'metrics',weight:0},
+    {id:'screenshot-thumbnails',weight:0},
+    {id:'final-screenshot',weight:0}]},
+    
+    
+    'accessibility':{
+    title:str_(UIStrings.a11yCategoryTitle),
+    description:str_(UIStrings.a11yCategoryDescription),
+    manualDescription:str_(UIStrings.a11yCategoryManualDescription),
+    
+    
+    
+    
+    auditRefs:[
+    {id:'accesskeys',weight:3,group:'a11y-navigation'},
+    {id:'aria-allowed-attr',weight:10,group:'a11y-aria'},
+    {id:'aria-required-attr',weight:10,group:'a11y-aria'},
+    {id:'aria-required-children',weight:10,group:'a11y-aria'},
+    {id:'aria-required-parent',weight:10,group:'a11y-aria'},
+    {id:'aria-roles',weight:10,group:'a11y-aria'},
+    {id:'aria-valid-attr-value',weight:10,group:'a11y-aria'},
+    {id:'aria-valid-attr',weight:10,group:'a11y-aria'},
+    {id:'audio-caption',weight:10,group:'a11y-audio-video'},
+    {id:'button-name',weight:10,group:'a11y-names-labels'},
+    {id:'bypass',weight:3,group:'a11y-navigation'},
+    {id:'color-contrast',weight:3,group:'a11y-color-contrast'},
+    {id:'definition-list',weight:3,group:'a11y-tables-lists'},
+    {id:'dlitem',weight:3,group:'a11y-tables-lists'},
+    {id:'document-title',weight:3,group:'a11y-names-labels'},
+    {id:'duplicate-id',weight:1,group:'a11y-best-practices'},
+    {id:'frame-title',weight:3,group:'a11y-names-labels'},
+    {id:'html-has-lang',weight:3,group:'a11y-language'},
+    {id:'html-lang-valid',weight:3,group:'a11y-language'},
+    {id:'image-alt',weight:10,group:'a11y-names-labels'},
+    {id:'input-image-alt',weight:10,group:'a11y-names-labels'},
+    {id:'label',weight:10,group:'a11y-names-labels'},
+    {id:'layout-table',weight:3,group:'a11y-tables-lists'},
+    {id:'link-name',weight:3,group:'a11y-names-labels'},
+    {id:'list',weight:3,group:'a11y-tables-lists'},
+    {id:'listitem',weight:3,group:'a11y-tables-lists'},
+    {id:'meta-refresh',weight:10,group:'a11y-best-practices'},
+    {id:'meta-viewport',weight:10,group:'a11y-best-practices'},
+    {id:'object-alt',weight:3,group:'a11y-names-labels'},
+    {id:'tabindex',weight:3,group:'a11y-navigation'},
+    {id:'td-headers-attr',weight:3,group:'a11y-tables-lists'},
+    {id:'th-has-data-cells',weight:3,group:'a11y-tables-lists'},
+    {id:'valid-lang',weight:3,group:'a11y-language'},
+    {id:'video-caption',weight:10,group:'a11y-audio-video'},
+    {id:'video-description',weight:10,group:'a11y-audio-video'},
+    
+    {id:'logical-tab-order',weight:0},
+    {id:'focusable-controls',weight:0},
+    {id:'interactive-element-affordance',weight:0},
+    {id:'managed-focus',weight:0},
+    {id:'focus-traps',weight:0},
+    {id:'custom-controls-labels',weight:0},
+    {id:'custom-controls-roles',weight:0},
+    {id:'visual-order-follows-dom',weight:0},
+    {id:'offscreen-content-hidden',weight:0},
+    {id:'heading-levels',weight:0},
+    {id:'use-landmarks',weight:0}]},
+    
+    
+    'best-practices':{
+    title:str_(UIStrings.bestPracticesCategoryTitle),
+    auditRefs:[
+    {id:'appcache-manifest',weight:1},
+    {id:'is-on-https',weight:1},
+    {id:'uses-http2',weight:1},
+    {id:'uses-passive-event-listeners',weight:1},
+    {id:'no-document-write',weight:1},
+    {id:'external-anchors-use-rel-noopener',weight:1},
+    {id:'geolocation-on-start',weight:1},
+    {id:'doctype',weight:1},
+    {id:'no-vulnerable-libraries',weight:1},
+    {id:'js-libraries',weight:0},
+    {id:'notification-on-start',weight:1},
+    {id:'deprecations',weight:1},
+    {id:'password-inputs-can-be-pasted-into',weight:1},
+    {id:'errors-in-console',weight:1},
+    {id:'image-aspect-ratio',weight:1}]},
+    
+    
+    'seo':{
+    title:str_(UIStrings.seoCategoryTitle),
+    description:str_(UIStrings.seoCategoryDescription),
+    manualDescription:str_(UIStrings.seoCategoryManualDescription),
+    auditRefs:[
+    {id:'viewport',weight:1,group:'seo-mobile'},
+    {id:'document-title',weight:1,group:'seo-content'},
+    {id:'meta-description',weight:1,group:'seo-content'},
+    {id:'http-status-code',weight:1,group:'seo-crawl'},
+    {id:'link-text',weight:1,group:'seo-content'},
+    {id:'is-crawlable',weight:1,group:'seo-crawl'},
+    {id:'robots-txt',weight:1,group:'seo-crawl'},
+    {id:'image-alt',weight:1,group:'seo-content'},
+    {id:'hreflang',weight:1,group:'seo-content'},
+    {id:'canonical',weight:1,group:'seo-content'},
+    {id:'font-size',weight:1,group:'seo-mobile'},
+    {id:'plugins',weight:1,group:'seo-content'},
+    {id:'tap-targets',weight:1,group:'seo-mobile'},
+    
+    {id:'structured-data',weight:0}]},
+    
+    
+    'pwa':{
+    title:str_(UIStrings.pwaCategoryTitle),
+    description:str_(UIStrings.pwaCategoryDescription),
+    manualDescription:str_(UIStrings.pwaCategoryManualDescription),
+    auditRefs:[
+    
+    {id:'load-fast-enough-for-pwa',weight:7,group:'pwa-fast-reliable'},
+    {id:'works-offline',weight:5,group:'pwa-fast-reliable'},
+    {id:'offline-start-url',weight:1,group:'pwa-fast-reliable'},
+    
+    {id:'is-on-https',weight:2,group:'pwa-installable'},
+    {id:'service-worker',weight:1,group:'pwa-installable'},
+    {id:'installable-manifest',weight:2,group:'pwa-installable'},
+    
+    {id:'redirects-http',weight:2,group:'pwa-optimized'},
+    {id:'splash-screen',weight:1,group:'pwa-optimized'},
+    {id:'themed-omnibox',weight:1,group:'pwa-optimized'},
+    {id:'content-width',weight:1,group:'pwa-optimized'},
+    {id:'viewport',weight:2,group:'pwa-optimized'},
+    {id:'without-javascript',weight:1,group:'pwa-optimized'},
+    {id:'apple-touch-icon',weight:1,group:'pwa-optimized'},
+    
+    {id:'pwa-cross-browser',weight:0},
+    {id:'pwa-page-transitions',weight:0},
+    {id:'pwa-each-page-has-url',weight:0}]}}};
+    
+    
+    
+    
+    
+    module.exports=defaultConfig;
+    
+    
+    Object.defineProperty(module.exports,'UIStrings',{
+    enumerable:false,
+    get:()=>UIStrings});
+    
+    
+    }).call(this,"/lighthouse-core/config/default-config.js");
+    },{"../lib/i18n/i18n.js":66,"./constants.js":46}],48:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const EventEmitter=require('events').EventEmitter;
+    const log=require('lighthouse-logger');
+    const LHError=require('../../lib/lh-error.js');
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    class Connection{
+    constructor(){
+    this._lastCommandId=0;
+    
+    this._callbacks=new Map();
+    
+    this._eventEmitter=new EventEmitter();
+    }
+    
+    
+    
+    
+    connect(){
+    return Promise.reject(new Error('Not implemented'));
+    }
+    
+    
+    
+    
+    disconnect(){
+    return Promise.reject(new Error('Not implemented'));
+    }
+    
+    
+    
+    
+    wsEndpoint(){
+    return Promise.reject(new Error('Not implemented'));
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    sendCommand(method,sessionId,...paramArgs){
+    
+    const params=paramArgs.length?paramArgs[0]:undefined;
+    
+    log.formatProtocol('method => browser',{method,params},'verbose');
+    const id=++this._lastCommandId;
+    const message=JSON.stringify({id,sessionId,method,params});
+    this.sendRawMessage(message);
+    
+    return new Promise(resolve=>{
+    this._callbacks.set(id,{method,resolve});
+    });
+    }
+    
+    
+    
+    
+    
+    
+    on(eventName,cb){
+    if(eventName!=='protocolevent'){
+    throw new Error('Only supports "protocolevent" events');
+    }
+    
+    if(!this._eventEmitter){
+    throw new Error('Attempted to add event listener after connection disposed.');
+    }
+    this._eventEmitter.on(eventName,cb);
+    }
+    
+    
+    
+    
+    
+    
+    
+    sendRawMessage(message){
+    throw new Error('Not implemented');
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    handleRawMessage(message){
+    const object=JSON.parse(message);
+    
+    
+    if(!('id'in object)){
+    log.formatProtocol('<= event',
+    {method:object.method,params:object.params},'verbose');
+    this.emitProtocolEvent(object);
+    return;
+    }
+    
+    const callback=this._callbacks.get(object.id);
+    if(callback){
+    this._callbacks.delete(object.id);
+    
+    callback.resolve(Promise.resolve().then(_=>{
+    if(object.error){
+    log.formatProtocol('method <= browser ERR',{method:callback.method},'error');
+    throw LHError.fromProtocolMessage(callback.method,object.error);
+    }
+    
+    log.formatProtocol('method <= browser OK',
+    {method:callback.method,params:object.result},'verbose');
+    return object.result;
+    }));
+    }else{
+    
+    
+    const error=object.error&&object.error.message;
+    log.formatProtocol(`disowned method <= browser ${error?'ERR':'OK'}`,
+    {method:'UNKNOWN',params:error||object.result},'verbose');
+    }
+    }
+    
+    
+    
+    
+    emitProtocolEvent(eventMessage){
+    if(!this._eventEmitter){
+    throw new Error('Attempted to emit event after connection disposed.');
+    }
+    
+    this._eventEmitter.emit('protocolevent',eventMessage);
+    }
+    
+    
+    
+    
+    dispose(){
+    if(this._eventEmitter){
+    this._eventEmitter.removeAllListeners();
+    this._eventEmitter=null;
+    }
+    }}
+    
+    
+    module.exports=Connection;
+    
+    },{"../../lib/lh-error.js":71,"events":108,"lighthouse-logger":125}],49:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Connection=require('./connection.js');
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    class RawConnection extends Connection{
+    
+    
+    
+    constructor(port){
+    super();
+    this._port=port;
+    this._port.on('message',this.handleRawMessage.bind(this));
+    this._port.on('close',this.dispose.bind(this));
+    }
+    
+    
+    
+    
+    
+    connect(){
+    return Promise.resolve();
+    }
+    
+    
+    
+    
+    disconnect(){
+    this._port.close();
+    return Promise.resolve();
+    }
+    
+    
+    
+    
+    
+    
+    sendRawMessage(message){
+    this._port.send(message);
+    }}
+    
+    
+    module.exports=RawConnection;
+    
+    },{"./connection.js":48}],50:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    class DevtoolsLog{
+    
+    
+    
+    constructor(regexFilter){
+    this._filter=regexFilter;
+    
+    
+    this._messages=[];
+    this._isRecording=false;
+    }
+    
+    
+    
+    
+    get messages(){
+    return this._messages;
+    }
+    
+    reset(){
+    this._messages=[];
+    }
+    
+    beginRecording(){
+    this._isRecording=true;
+    }
+    
+    endRecording(){
+    this._isRecording=false;
+    }
+    
+    
+    
+    
+    
+    record(message){
+    if(this._isRecording&&(!this._filter||this._filter.test(message.method))){
+    this._messages.push(message);
+    }
+    }}
+    
+    
+    module.exports=DevtoolsLog;
+    
+    },{}],51:[function(require,module,exports){
+    (function(Buffer){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const NetworkRecorder=require('../lib/network-recorder.js');
+    const emulation=require('../lib/emulation.js');
+    const LHElement=require('../lib/lh-element.js');
+    const LHError=require('../lib/lh-error.js');
+    const NetworkRequest=require('../lib/network-request.js');
+    const EventEmitter=require('events').EventEmitter;
+    const URL=require('../lib/url-shim.js');
+    const constants=require('../config/constants.js');
+    
+    const log=require('lighthouse-logger');
+    const DevtoolsLog=require('./devtools-log.js');
+    
+    const pageFunctions=require('../lib/page-functions.js');
+    
+    
+    
+    const Connection=require('./connections/connection.js');
+    
+    
+    const DEFAULT_PAUSE_AFTER_LOAD=0;
+    
+    const DEFAULT_NETWORK_QUIET_THRESHOLD=5000;
+    
+    const DEFAULT_CPU_QUIET_THRESHOLD=0;
+    
+    const DEFAULT_PROTOCOL_TIMEOUT=30000;
+    
+    
+    
+    
+    
+    class Driver{
+    
+    
+    
+    constructor(connection){
+    this._traceCategories=Driver.traceCategories;
+    
+    
+    
+    this._eventEmitter=new EventEmitter();
+    this._connection=connection;
+    
+    this._devtoolsLog=new DevtoolsLog(/^(Page|Network)\./);
+    this.online=true;
+    
+    this._domainEnabledCounts=new Map();
+    
+    this._isolatedExecutionContextId=undefined;
+    
+    
+    
+    
+    
+    
+    this._networkStatusMonitor=null;
+    
+    
+    
+    
+    
+    
+    this._monitoredUrl=null;
+    
+    this.on('Target.attachedToTarget',event=>{
+    this._handleTargetAttached(event).catch(this._handleEventError);
+    });
+    
+    
+    
+    this.on('Runtime.executionContextDestroyed',event=>{
+    if(event.executionContextId===this._isolatedExecutionContextId){
+    this._clearIsolatedContextId();
+    }
+    });
+    
+    this.on('Page.frameNavigated',()=>this._clearIsolatedContextId());
+    
+    connection.on('protocolevent',this._handleProtocolEvent.bind(this));
+    
+    
+    
+    
+    
+    this._nextProtocolTimeout=DEFAULT_PROTOCOL_TIMEOUT;
+    }
+    
+    static get traceCategories(){
+    return[
+    
+    '-*',
+    
+    
+    'disabled-by-default-lighthouse',
+    
+    
+    
+    'v8',
+    
+    
+    'v8.execute',
+    
+    
+    'blink.user_timing',
+    
+    
+    'blink.console',
+    
+    
+    'devtools.timeline',
+    'disabled-by-default-devtools.timeline',
+    
+    
+    'disabled-by-default-devtools.screenshot',
+    
+    
+    'disabled-by-default-devtools.timeline.stack'];
+    
+    
+    
+    
+    
+    }
+    
+    
+    
+    
+    async getBrowserVersion(){
+    const status={msg:'Getting browser version',id:'lh:gather:getVersion'};
+    log.time(status,'verbose');
+    const version=await this.sendCommand('Browser.getVersion');
+    const match=version.product.match(/\/(\d+)/);
+    const milestone=match?parseInt(match[1]):0;
+    log.timeEnd(status);
+    return Object.assign(version,{milestone});
+    }
+    
+    
+    
+    
+    
+    async getBenchmarkIndex(){
+    const status={msg:'Benchmarking machine',id:'lh:gather:getBenchmarkIndex'};
+    log.time(status);
+    const indexVal=await this.evaluateAsync(`(${pageFunctions.ultradumbBenchmarkString})()`);
+    log.timeEnd(status);
+    return indexVal;
+    }
+    
+    
+    
+    
+    async connect(){
+    const status={msg:'Connecting to browser',id:'lh:init:connect'};
+    log.time(status);
+    await this._connection.connect();
+    log.timeEnd(status);
+    }
+    
+    
+    
+    
+    disconnect(){
+    return this._connection.disconnect();
+    }
+    
+    
+    
+    
+    
+    
+    wsEndpoint(){
+    return this._connection.wsEndpoint();
+    }
+    
+    
+    
+    
+    
+    
+    
+    on(eventName,cb){
+    if(this._eventEmitter===null){
+    throw new Error('connect() must be called before attempting to listen to events.');
+    }
+    
+    
+    log.formatProtocol('listen for event =>',{method:eventName},'verbose');
+    this._eventEmitter.on(eventName,cb);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    once(eventName,cb){
+    if(this._eventEmitter===null){
+    throw new Error('connect() must be called before attempting to listen to events.');
+    }
+    
+    log.formatProtocol('listen once for event =>',{method:eventName},'verbose');
+    this._eventEmitter.once(eventName,cb);
+    }
+    
+    
+    
+    
+    
+    
+    
+    off(eventName,cb){
+    if(this._eventEmitter===null){
+    throw new Error('connect() must be called before attempting to remove an event listener.');
+    }
+    
+    this._eventEmitter.removeListener(eventName,cb);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    _shouldToggleDomain(domain,sessionId,enable){
+    const key=domain+(sessionId||'');
+    const enabledCount=this._domainEnabledCounts.get(key)||0;
+    const newCount=enabledCount+(enable?1:-1);
+    this._domainEnabledCounts.set(key,Math.max(0,newCount));
+    
+    
+    if(enable&&newCount===1||!enable&&newCount===0){
+    log.verbose('Driver',`${domain}.${enable?'enable':'disable'}`);
+    return true;
+    }else{
+    if(newCount<0){
+    log.error('Driver',`Attempted to disable domain '${domain}' when already disabled.`);
+    }
+    return false;
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    setNextProtocolTimeout(timeout){
+    this._nextProtocolTimeout=timeout;
+    }
+    
+    
+    
+    
+    _handleProtocolEvent(event){
+    this._devtoolsLog.record(event);
+    if(this._networkStatusMonitor){
+    this._networkStatusMonitor.dispatch(event);
+    }
+    
+    
+    
+    
+    this._eventEmitter.emit(event.method,event.params);
+    }
+    
+    
+    
+    
+    _handleEventError(error){
+    log.error('Driver','Unhandled event error',error.message);
+    }
+    
+    
+    
+    
+    async _handleTargetAttached(event){
+    
+    
+    if(event.targetInfo.type!=='iframe'){
+    
+    await this.sendCommandToSession('Runtime.runIfWaitingForDebugger',event.sessionId);
+    return;
+    }
+    
+    
+    
+    await this.sendCommandToSession('Network.enable',event.sessionId);
+    
+    
+    await this.sendCommandToSession('Target.setAutoAttach',event.sessionId,{
+    autoAttach:true,
+    flatten:true,
+    
+    waitForDebuggerOnStart:true});
+    
+    
+    
+    await this.sendCommandToSession('Runtime.runIfWaitingForDebugger',event.sessionId);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    sendCommandToSession(method,sessionId,...params){
+    const timeout=this._nextProtocolTimeout;
+    this._nextProtocolTimeout=DEFAULT_PROTOCOL_TIMEOUT;
+    return new Promise(async(resolve,reject)=>{
+    const asyncTimeout=setTimeout(()=>{
+    const err=new LHError(
+    LHError.errors.PROTOCOL_TIMEOUT,
+    {protocolMethod:method});
+    
+    reject(err);
+    },timeout);
+    try{
+    const result=await this._innerSendCommand(method,sessionId,...params);
+    resolve(result);
+    }catch(err){
+    reject(err);
+    }finally{
+    clearTimeout(asyncTimeout);
+    }
+    });
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    sendCommand(method,...params){
+    return this.sendCommandToSession(method,undefined,...params);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    _innerSendCommand(method,sessionId,...params){
+    const domainCommand=/^(\w+)\.(enable|disable)$/.exec(method);
+    if(domainCommand){
+    const enable=domainCommand[2]==='enable';
+    if(!this._shouldToggleDomain(domainCommand[1],sessionId,enable)){
+    return Promise.resolve();
+    }
+    }
+    return this._connection.sendCommand(method,sessionId,...params);
+    }
+    
+    
+    
+    
+    
+    
+    isDomainEnabled(domain){
+    
+    return!!this._domainEnabledCounts.get(domain);
+    }
+    
+    
+    
+    
+    
+    
+    evaluateScriptOnNewDocument(scriptSource){
+    return this.sendCommand('Page.addScriptToEvaluateOnLoad',{
+    scriptSource});
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    async evaluateAsync(expression,options={}){
+    const contextId=options.useIsolation?await this._getOrCreateIsolatedContextId():undefined;
+    
+    try{
+    
+    return await this._evaluateInContext(expression,contextId);
+    }catch(err){
+    
+    if(contextId&&err.message.includes('Cannot find context')){
+    this._clearIsolatedContextId();
+    const freshContextId=await this._getOrCreateIsolatedContextId();
+    return this._evaluateInContext(expression,freshContextId);
+    }
+    
+    throw err;
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    async _evaluateInContext(expression,contextId){
+    
+    
+    const timeout=this._nextProtocolTimeout===DEFAULT_PROTOCOL_TIMEOUT?
+    60000:this._nextProtocolTimeout;
+    const evaluationParams={
+    
+    
+    
+    
+    
+    expression:`(function wrapInNativePromise() {
+            const __nativePromise = window.__nativePromise || Promise;
+            const URL = window.__nativeURL || window.URL;
+            return new __nativePromise(function (resolve) {
+              return __nativePromise.resolve()
+                .then(_ => ${expression})
+                .catch(${pageFunctions.wrapRuntimeEvalErrorInBrowserString})
+                .then(resolve);
+            });
+          }())`,
+    includeCommandLineAPI:true,
+    awaitPromise:true,
+    returnByValue:true,
+    timeout,
+    contextId};
+    
+    
+    this.setNextProtocolTimeout(timeout);
+    const response=await this.sendCommand('Runtime.evaluate',evaluationParams);
+    if(response.exceptionDetails){
+    
+    
+    const errorMessage=response.exceptionDetails.exception?
+    response.exceptionDetails.exception.description:
+    response.exceptionDetails.text;
+    return Promise.reject(new Error(`Evaluation exception: ${errorMessage}`));
+    }
+    
+    if(response.result===undefined){
+    return Promise.reject(
+    new Error('Runtime.evaluate response did not contain a "result" object'));
+    }
+    const value=response.result.value;
+    if(value&&value.__failedInBrowser){
+    return Promise.reject(Object.assign(new Error(),value));
+    }else{
+    return value;
+    }
+    }
+    
+    
+    
+    
+    async getAppManifest(){
+    
+    
+    
+    
+    
+    
+    
+    this.setNextProtocolTimeout(10000);
+    let response;
+    try{
+    response=await this.sendCommand('Page.getAppManifest');
+    }catch(err){
+    if(err.code==='PROTOCOL_TIMEOUT'){
+    
+    
+    log.error('Driver','Failed fetching manifest',err);
+    return null;
+    }
+    
+    throw err;
+    }
+    
+    let data=response.data;
+    
+    
+    
+    
+    if(!data){
+    
+    return null;
+    }
+    
+    const BOM_LENGTH=3;
+    const BOM_FIRSTCHAR=65279;
+    const isBomEncoded=data.charCodeAt(0)===BOM_FIRSTCHAR;
+    
+    if(isBomEncoded){
+    data=Buffer.from(data).slice(BOM_LENGTH).toString();
+    }
+    
+    return{...response,data};
+    }
+    
+    
+    
+    
+    getServiceWorkerVersions(){
+    return new Promise((resolve,reject)=>{
+    
+    
+    
+    const versionUpdatedListener=data=>{
+    
+    
+    const activateCandidates=data.versions.filter(sw=>{
+    return sw.status!=='redundant';
+    });
+    const hasActiveServiceWorker=activateCandidates.find(sw=>{
+    return sw.status==='activated';
+    });
+    
+    if(!activateCandidates.length||hasActiveServiceWorker){
+    this.off('ServiceWorker.workerVersionUpdated',versionUpdatedListener);
+    this.sendCommand('ServiceWorker.disable').
+    then(_=>resolve(data),reject);
+    }
+    };
+    
+    this.on('ServiceWorker.workerVersionUpdated',versionUpdatedListener);
+    
+    this.sendCommand('ServiceWorker.enable').catch(reject);
+    });
+    }
+    
+    
+    
+    
+    getServiceWorkerRegistrations(){
+    return new Promise((resolve,reject)=>{
+    this.once('ServiceWorker.workerRegistrationUpdated',data=>{
+    this.sendCommand('ServiceWorker.disable').
+    then(_=>resolve(data),reject);
+    });
+    
+    this.sendCommand('ServiceWorker.enable').catch(reject);
+    });
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    assertNoSameOriginServiceWorkerClients(pageUrl){
+    
+    let registrations;
+    
+    let versions;
+    
+    return this.getServiceWorkerRegistrations().then(data=>{
+    registrations=data.registrations;
+    }).then(_=>this.getServiceWorkerVersions()).then(data=>{
+    versions=data.versions;
+    }).then(_=>{
+    const origin=new URL(pageUrl).origin;
+    
+    registrations.
+    filter(reg=>{
+    const swOrigin=new URL(reg.scopeURL).origin;
+    
+    return origin===swOrigin;
+    }).
+    forEach(reg=>{
+    versions.forEach(ver=>{
+    
+    if(ver.registrationId!==reg.registrationId){
+    return;
+    }
+    
+    
+    if(ver.controlledClients&&ver.controlledClients.length>0){
+    throw new Error('You probably have multiple tabs open to the same origin.');
+    }
+    });
+    });
+    });
+    }
+    
+    
+    
+    
+    
+    
+    
+    _waitForNothing(){
+    return{promise:Promise.resolve(),cancel(){}};
+    }
+    
+    
+    
+    
+    
+    _waitForFrameNavigated(){
+    return new Promise(resolve=>{
+    this.once('Page.frameNavigated',resolve);
+    });
+    }
+    
+    
+    
+    
+    
+    
+    _waitForFCP(maxWaitForFCPMs){
+    
+    let cancel=()=>{
+    throw new Error('_waitForFCP.cancel() called before it was defined');
+    };
+    
+    const promise=new Promise((resolve,reject)=>{
+    const maxWaitTimeout=setTimeout(()=>{
+    reject(new LHError(LHError.errors.NO_FCP));
+    },maxWaitForFCPMs);
+    
+    
+    const lifecycleListener=e=>{
+    if(e.name==='firstContentfulPaint'){
+    resolve();
+    cancel();
+    }
+    };
+    
+    this.on('Page.lifecycleEvent',lifecycleListener);
+    
+    let canceled=false;
+    cancel=()=>{
+    if(canceled)return;
+    canceled=true;
+    this.off('Page.lifecycleEvent',lifecycleListener);
+    maxWaitTimeout&&clearTimeout(maxWaitTimeout);
+    reject(new Error('Wait for FCP canceled'));
+    };
+    });
+    
+    return{
+    promise,
+    cancel};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    _waitForNetworkIdle(networkQuietThresholdMs){
+    let hasDCLFired=false;
+    
+    let idleTimeout;
+    
+    let cancel=()=>{
+    throw new Error('_waitForNetworkIdle.cancel() called before it was defined');
+    };
+    
+    
+    
+    if(!this._networkStatusMonitor){
+    throw new Error('Driver._waitForNetworkIdle called with no networkStatusMonitor');
+    }
+    const networkStatusMonitor=this._networkStatusMonitor;
+    
+    const promise=new Promise((resolve,reject)=>{
+    const onIdle=()=>{
+    
+    networkStatusMonitor.once('network-2-busy',onBusy);
+    idleTimeout=setTimeout(_=>{
+    cancel();
+    resolve();
+    },networkQuietThresholdMs);
+    };
+    
+    const onBusy=()=>{
+    networkStatusMonitor.once('network-2-idle',onIdle);
+    idleTimeout&&clearTimeout(idleTimeout);
+    };
+    
+    const domContentLoadedListener=()=>{
+    hasDCLFired=true;
+    if(networkStatusMonitor.is2Idle()){
+    onIdle();
+    }else{
+    onBusy();
+    }
+    };
+    
+    
+    
+    const logStatus=()=>{
+    if(!hasDCLFired){
+    log.verbose('Driver','Waiting on DomContentLoaded');
+    return;
+    }
+    
+    const inflightRecords=networkStatusMonitor.getInflightRecords();
+    
+    
+    if(inflightRecords.length<20){
+    for(const record of inflightRecords){
+    log.verbose('Driver',`Waiting on ${record.url.slice(0,120)} to finish`);
+    }
+    }
+    };
+    
+    networkStatusMonitor.on('requeststarted',logStatus);
+    networkStatusMonitor.on('requestloaded',logStatus);
+    networkStatusMonitor.on('network-2-busy',logStatus);
+    
+    this.once('Page.domContentEventFired',domContentLoadedListener);
+    let canceled=false;
+    cancel=()=>{
+    if(canceled)return;
+    canceled=true;
+    idleTimeout&&clearTimeout(idleTimeout);
+    this.off('Page.domContentEventFired',domContentLoadedListener);
+    networkStatusMonitor.removeListener('network-2-busy',onBusy);
+    networkStatusMonitor.removeListener('network-2-idle',onIdle);
+    networkStatusMonitor.removeListener('requeststarted',logStatus);
+    networkStatusMonitor.removeListener('requestloaded',logStatus);
+    networkStatusMonitor.removeListener('network-2-busy',logStatus);
+    };
+    });
+    
+    return{
+    promise,
+    cancel};
+    
+    }
+    
+    
+    
+    
+    
+    
+    _waitForCPUIdle(waitForCPUQuiet){
+    if(!waitForCPUQuiet){
+    return{
+    promise:Promise.resolve(),
+    cancel:()=>undefined};
+    
+    }
+    
+    
+    let lastTimeout;
+    let canceled=false;
+    
+    const checkForQuietExpression=`(${pageFunctions.checkTimeSinceLastLongTaskString})()`;
+    
+    
+    
+    
+    
+    async function checkForQuiet(driver,resolve){
+    if(canceled)return;
+    const timeSinceLongTask=await driver.evaluateAsync(checkForQuietExpression);
+    if(canceled)return;
+    
+    if(typeof timeSinceLongTask==='number'){
+    if(timeSinceLongTask>=waitForCPUQuiet){
+    log.verbose('Driver',`CPU has been idle for ${timeSinceLongTask} ms`);
+    resolve();
+    }else{
+    log.verbose('Driver',`CPU has been idle for ${timeSinceLongTask} ms`);
+    const timeToWait=waitForCPUQuiet-timeSinceLongTask;
+    lastTimeout=setTimeout(()=>checkForQuiet(driver,resolve),timeToWait);
+    }
+    }
+    }
+    
+    
+    let cancel=()=>{
+    throw new Error('_waitForCPUIdle.cancel() called before it was defined');
+    };
+    const promise=new Promise((resolve,reject)=>{
+    checkForQuiet(this,resolve).catch(reject);
+    cancel=()=>{
+    if(canceled)return;
+    canceled=true;
+    if(lastTimeout)clearTimeout(lastTimeout);
+    reject(new Error('Wait for CPU idle canceled'));
+    };
+    });
+    
+    return{
+    promise,
+    cancel};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    _waitForLoadEvent(pauseAfterLoadMs){
+    
+    let cancel=()=>{
+    throw new Error('_waitForLoadEvent.cancel() called before it was defined');
+    };
+    
+    const promise=new Promise((resolve,reject)=>{
+    
+    let loadTimeout;
+    const loadListener=function(){
+    loadTimeout=setTimeout(resolve,pauseAfterLoadMs);
+    };
+    this.once('Page.loadEventFired',loadListener);
+    
+    let canceled=false;
+    cancel=()=>{
+    if(canceled)return;
+    canceled=true;
+    this.off('Page.loadEventFired',loadListener);
+    loadTimeout&&clearTimeout(loadTimeout);
+    };
+    });
+    
+    return{
+    promise,
+    cancel};
+    
+    }
+    
+    
+    
+    
+    
+    async isPageHung(){
+    try{
+    this.setNextProtocolTimeout(1000);
+    await this.sendCommand('Runtime.evaluate',{
+    expression:'"ping"',
+    returnByValue:true,
+    timeout:1000});
+    
+    
+    return false;
+    }catch(err){
+    return true;
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    async _waitForFullyLoaded(pauseAfterLoadMs,networkQuietThresholdMs,cpuQuietThresholdMs,
+    maxWaitForLoadedMs,maxWaitForFCPMs){
+    
+    let maxTimeoutHandle;
+    
+    
+    const waitForFCP=maxWaitForFCPMs?this._waitForFCP(maxWaitForFCPMs):this._waitForNothing();
+    
+    const waitForLoadEvent=this._waitForLoadEvent(pauseAfterLoadMs);
+    
+    const waitForNetworkIdle=this._waitForNetworkIdle(networkQuietThresholdMs);
+    
+    let waitForCPUIdle=this._waitForNothing();
+    
+    
+    
+    const loadPromise=Promise.all([
+    waitForFCP.promise,
+    waitForLoadEvent.promise,
+    waitForNetworkIdle.promise]).
+    then(()=>{
+    waitForCPUIdle=this._waitForCPUIdle(cpuQuietThresholdMs);
+    return waitForCPUIdle.promise;
+    }).then(()=>{
+    return function(){
+    log.verbose('Driver','loadEventFired and network considered idle');
+    };
+    }).catch(err=>{
+    
+    return function(){
+    throw err;
+    };
+    });
+    
+    
+    
+    const maxTimeoutPromise=new Promise((resolve,reject)=>{
+    maxTimeoutHandle=setTimeout(resolve,maxWaitForLoadedMs);
+    }).then(_=>{
+    return async()=>{
+    log.warn('Driver','Timed out waiting for page load. Checking if page is hung...');
+    if(await this.isPageHung()){
+    log.warn('Driver','Page appears to be hung, killing JavaScript...');
+    await this.sendCommand('Emulation.setScriptExecutionDisabled',{value:true});
+    await this.sendCommand('Runtime.terminateExecution');
+    throw new LHError(LHError.errors.PAGE_HUNG);
+    }
+    };
+    });
+    
+    
+    const cleanupFn=await Promise.race([
+    loadPromise,
+    maxTimeoutPromise]);
+    
+    
+    maxTimeoutHandle&&clearTimeout(maxTimeoutHandle);
+    waitForFCP.cancel();
+    waitForLoadEvent.cancel();
+    waitForNetworkIdle.cancel();
+    waitForCPUIdle.cancel();
+    
+    await cleanupFn();
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    _beginNetworkStatusMonitoring(startingUrl){
+    this._networkStatusMonitor=new NetworkRecorder();
+    
+    
+    this._monitoredUrl=startingUrl;
+    
+    const requestLoadedListener=redirectRequest=>{
+    
+    if(!redirectRequest.redirectSource){
+    return;
+    }
+    const earlierRequest=redirectRequest.redirectSource;
+    if(earlierRequest.url===this._monitoredUrl){
+    this._monitoredUrl=redirectRequest.url;
+    }
+    };
+    this._networkStatusMonitor.on('requestloaded',requestLoadedListener);
+    
+    return this.sendCommand('Network.enable');
+    }
+    
+    
+    
+    
+    
+    
+    
+    _endNetworkStatusMonitoring(){
+    this._networkStatusMonitor=null;
+    const finalUrl=this._monitoredUrl;
+    this._monitoredUrl=null;
+    
+    if(!finalUrl){
+    throw new Error('Network Status Monitoring ended with an undefined finalUrl');
+    }
+    
+    return finalUrl;
+    }
+    
+    
+    
+    
+    
+    
+    
+    async _getOrCreateIsolatedContextId(){
+    if(typeof this._isolatedExecutionContextId==='number'){
+    return this._isolatedExecutionContextId;
+    }
+    
+    const resourceTreeResponse=await this.sendCommand('Page.getResourceTree');
+    const mainFrameId=resourceTreeResponse.frameTree.frame.id;
+    
+    const isolatedWorldResponse=await this.sendCommand('Page.createIsolatedWorld',{
+    frameId:mainFrameId,
+    worldName:'lighthouse_isolated_context'});
+    
+    
+    this._isolatedExecutionContextId=isolatedWorldResponse.executionContextId;
+    return isolatedWorldResponse.executionContextId;
+    }
+    
+    _clearIsolatedContextId(){
+    this._isolatedExecutionContextId=undefined;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    async gotoURL(url,options={}){
+    const waitForFCP=options.waitForFCP||false;
+    const waitForNavigated=options.waitForNavigated||false;
+    const waitForLoad=options.waitForLoad||false;
+    const passContext=options.passContext||{};
+    const disableJS=passContext.disableJavaScript||false;
+    
+    if(waitForNavigated&&(waitForFCP||waitForLoad)){
+    throw new Error('Cannot use both waitForNavigated and another event, pick just one');
+    }
+    
+    await this._beginNetworkStatusMonitoring(url);
+    await this._clearIsolatedContextId();
+    
+    
+    await this.sendCommand('Target.setAutoAttach',{
+    flatten:true,
+    autoAttach:true,
+    
+    waitForDebuggerOnStart:true});
+    
+    
+    await this.sendCommand('Page.enable');
+    await this.sendCommand('Page.setLifecycleEventsEnabled',{enabled:true});
+    await this.sendCommand('Emulation.setScriptExecutionDisabled',{value:disableJS});
+    
+    const waitforPageNavigateCmd=this._innerSendCommand('Page.navigate',undefined,{url});
+    
+    if(waitForNavigated){
+    await this._waitForFrameNavigated();
+    }else if(waitForLoad){
+    const passConfig=passContext.passConfig||{};
+    let{pauseAfterLoadMs,networkQuietThresholdMs,cpuQuietThresholdMs}=passConfig;
+    let maxWaitMs=passContext.settings&&passContext.settings.maxWaitForLoad;
+    let maxFCPMs=passContext.settings&&passContext.settings.maxWaitForFcp;
+    
+    
+    if(typeof pauseAfterLoadMs!=='number')pauseAfterLoadMs=DEFAULT_PAUSE_AFTER_LOAD;
+    if(typeof networkQuietThresholdMs!=='number')networkQuietThresholdMs=DEFAULT_NETWORK_QUIET_THRESHOLD;
+    if(typeof cpuQuietThresholdMs!=='number')cpuQuietThresholdMs=DEFAULT_CPU_QUIET_THRESHOLD;
+    if(typeof maxWaitMs!=='number')maxWaitMs=constants.defaultSettings.maxWaitForLoad;
+    if(typeof maxFCPMs!=='number')maxFCPMs=constants.defaultSettings.maxWaitForFcp;
+    
+    
+    if(!waitForFCP)maxFCPMs=undefined;
+    await this._waitForFullyLoaded(pauseAfterLoadMs,networkQuietThresholdMs,cpuQuietThresholdMs,
+    maxWaitMs,maxFCPMs);
+    }
+    
+    
+    await waitforPageNavigateCmd;
+    
+    return this._endNetworkStatusMonitoring();
+    }
+    
+    
+    
+    
+    
+    
+    async getObjectProperty(objectId,propName){
+    const propertiesResponse=await this.sendCommand('Runtime.getProperties',{
+    objectId,
+    accessorPropertiesOnly:true,
+    generatePreview:false,
+    ownProperties:false});
+    
+    
+    const propertyForName=propertiesResponse.result.
+    find(property=>property.name===propName);
+    
+    if(propertyForName&&propertyForName.value){
+    return propertyForName.value.value;
+    }else{
+    return null;
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    async getRequestContent(requestId,timeout=1000){
+    requestId=NetworkRequest.getRequestIdForBackend(requestId);
+    
+    
+    
+    this.setNextProtocolTimeout(timeout);
+    const result=await this.sendCommand('Network.getResponseBody',{requestId});
+    return result.body;
+    }
+    
+    
+    
+    
+    
+    
+    queryPermissionState(name){
+    const expressionToEval=`
+          navigator.permissions.query({name: '${name}'}).then(result => {
+            return result.state;
+          })
+        `;
+    
+    return this.evaluateAsync(expressionToEval);
+    }
+    
+    
+    
+    
+    
+    async querySelector(selector){
+    const documentResponse=await this.sendCommand('DOM.getDocument');
+    const rootNodeId=documentResponse.root.nodeId;
+    
+    const targetNode=await this.sendCommand('DOM.querySelector',{
+    nodeId:rootNodeId,
+    selector});
+    
+    
+    if(targetNode.nodeId===0){
+    return null;
+    }
+    return new LHElement(targetNode,this);
+    }
+    
+    
+    
+    
+    
+    async querySelectorAll(selector){
+    const documentResponse=await this.sendCommand('DOM.getDocument');
+    const rootNodeId=documentResponse.root.nodeId;
+    
+    const targetNodeList=await this.sendCommand('DOM.querySelectorAll',{
+    nodeId:rootNodeId,
+    selector});
+    
+    
+    
+    const elementList=[];
+    targetNodeList.nodeIds.forEach(nodeId=>{
+    if(nodeId!==0){
+    elementList.push(new LHElement({nodeId},this));
+    }
+    });
+    return elementList;
+    }
+    
+    
+    
+    
+    
+    
+    
+    getElementsInDocument(pierce=true){
+    return this.getNodesInDocument(pierce).
+    then(nodes=>nodes.
+    filter(node=>node.nodeType===1).
+    map(node=>new LHElement({nodeId:node.nodeId},this)));
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    async getNodesInDocument(pierce=true){
+    const flattenedDocument=await this.sendCommand('DOM.getFlattenedDocument',
+    {depth:-1,pierce});
+    
+    return flattenedDocument.nodes?flattenedDocument.nodes:[];
+    }
+    
+    
+    
+    
+    
+    scrollTo(position){
+    const scrollExpression=`window.scrollTo(${position.x}, ${position.y})`;
+    return this.evaluateAsync(scrollExpression,{useIsolation:true});
+    }
+    
+    
+    
+    
+    getScrollPosition(){
+    return this.evaluateAsync(`({x: window.scrollX, y: window.scrollY})`,{useIsolation:true});
+    }
+    
+    
+    
+    
+    
+    async beginTrace(settings){
+    const additionalCategories=settings&&settings.additionalTraceCategories&&
+    settings.additionalTraceCategories.split(',')||[];
+    const traceCategories=this._traceCategories.concat(additionalCategories);
+    
+    
+    
+    const milestone=(await this.getBrowserVersion()).milestone;
+    if(milestone<71){
+    const toplevelIndex=traceCategories.indexOf('disabled-by-default-lighthouse');
+    traceCategories[toplevelIndex]='toplevel';
+    }
+    
+    const uniqueCategories=Array.from(new Set(traceCategories));
+    
+    
+    if(this.isDomainEnabled('CSS')){
+    throw new Error('CSS domain enabled when starting trace');
+    }
+    if(this.isDomainEnabled('DOM')){
+    throw new Error('DOM domain enabled when starting trace');
+    }
+    
+    
+    return this.sendCommand('Page.enable').
+    then(_=>this.sendCommand('Tracing.start',{
+    categories:uniqueCategories.join(','),
+    options:'sampling-frequency=10000'}));
+    
+    }
+    
+    
+    
+    
+    endTrace(){
+    
+    const traceEvents=[];
+    
+    
+    
+    
+    
+    const dataListener=function(data){
+    traceEvents.push(...data.value);
+    };
+    this.on('Tracing.dataCollected',dataListener);
+    
+    return new Promise((resolve,reject)=>{
+    this.once('Tracing.tracingComplete',_=>{
+    this.off('Tracing.dataCollected',dataListener);
+    resolve({traceEvents});
+    });
+    
+    this.sendCommand('Tracing.end').catch(reject);
+    });
+    }
+    
+    
+    
+    
+    beginDevtoolsLog(){
+    this._devtoolsLog.reset();
+    this._devtoolsLog.beginRecording();
+    }
+    
+    
+    
+    
+    
+    endDevtoolsLog(){
+    this._devtoolsLog.endRecording();
+    return this._devtoolsLog.messages;
+    }
+    
+    
+    
+    
+    enableRuntimeEvents(){
+    return this.sendCommand('Runtime.enable');
+    }
+    
+    
+    
+    
+    
+    
+    
+    async enableAsyncStacks(){
+    await this.sendCommand('Debugger.enable');
+    await this.sendCommand('Debugger.setSkipAllPauses',{skip:true});
+    await this.sendCommand('Debugger.setAsyncCallStackDepth',{maxDepth:8});
+    }
+    
+    
+    
+    
+    
+    async beginEmulation(settings){
+    await emulation.emulate(this,settings);
+    await this.setThrottling(settings,{useThrottling:true});
+    }
+    
+    
+    
+    
+    
+    
+    async setThrottling(settings,passConfig){
+    if(settings.throttlingMethod!=='devtools'){
+    return emulation.clearAllNetworkEmulation(this);
+    }
+    
+    const cpuPromise=passConfig.useThrottling?
+    emulation.enableCPUThrottling(this,settings.throttling):
+    emulation.disableCPUThrottling(this);
+    const networkPromise=passConfig.useThrottling?
+    emulation.enableNetworkThrottling(this,settings.throttling):
+    emulation.clearAllNetworkEmulation(this);
+    
+    await Promise.all([cpuPromise,networkPromise]);
+    }
+    
+    
+    
+    
+    
+    async goOffline(){
+    await this.sendCommand('Network.enable');
+    await emulation.goOffline(this);
+    this.online=false;
+    }
+    
+    
+    
+    
+    
+    
+    async goOnline(options){
+    await this.setThrottling(options.settings,options.passConfig);
+    this.online=true;
+    }
+    
+    
+    
+    
+    
+    async cleanBrowserCaches(){
+    const status={msg:'Cleaning browser cache',id:'lh:driver:cleanBrowserCaches'};
+    log.time(status);
+    
+    
+    await this.sendCommand('Network.clearBrowserCache');
+    
+    await this.sendCommand('Network.setCacheDisabled',{cacheDisabled:true});
+    await this.sendCommand('Network.setCacheDisabled',{cacheDisabled:false});
+    
+    log.timeEnd(status);
+    }
+    
+    
+    
+    
+    
+    async setExtraHTTPHeaders(headers){
+    if(!headers){
+    return;
+    }
+    
+    return this.sendCommand('Network.setExtraHTTPHeaders',{headers});
+    }
+    
+    
+    
+    
+    
+    async clearDataForOrigin(url){
+    const origin=new URL(url).origin;
+    
+    
+    
+    const typesToClear=[
+    'appcache',
+    
+    'file_systems',
+    'indexeddb',
+    'local_storage',
+    'shader_cache',
+    'websql',
+    'service_workers',
+    'cache_storage'].
+    join(',');
+    
+    
+    
+    this.setNextProtocolTimeout(5000);
+    
+    try{
+    await this.sendCommand('Storage.clearDataForOrigin',{
+    origin:origin,
+    storageTypes:typesToClear});
+    
+    }catch(err){
+    if(err.code==='PROTOCOL_TIMEOUT'){
+    log.warn('Driver','clearDataForOrigin timed out');
+    }else{
+    throw err;
+    }
+    }
+    }
+    
+    
+    
+    
+    
+    
+    async cacheNatives(){
+    await this.evaluateScriptOnNewDocument(`
+            window.__nativePromise = Promise;
+            window.__nativeError = Error;
+            window.__nativeURL = URL;
+            window.__ElementMatches = Element.prototype.matches;
+            window.__perfNow = performance.now.bind(performance);
+        `);
+    }
+    
+    
+    
+    
+    
+    async registerPerformanceObserver(){
+    const scriptStr=`(${pageFunctions.registerPerformanceObserverInPageString})()`;
+    await this.evaluateScriptOnNewDocument(scriptStr);
+    }
+    
+    
+    
+    
+    
+    blockUrlPatterns(urls){
+    return this.sendCommand('Network.setBlockedURLs',{urls}).
+    catch(err=>{
+    
+    if(!/wasn't found/.test(err.message)){
+    throw err;
+    }
+    });
+    }
+    
+    
+    
+    
+    
+    
+    async dismissJavaScriptDialogs(){
+    this.on('Page.javascriptDialogOpening',data=>{
+    log.warn('Driver',`${data.type} dialog opened by the page automatically suppressed.`);
+    
+    this.sendCommand('Page.handleJavaScriptDialog',{
+    accept:true,
+    promptText:'Lighthouse prompt response'}).
+    catch(err=>log.warn('Driver',err));
+    });
+    
+    await this.sendCommand('Page.enable');
+    }}
+    
+    
+    module.exports=Driver;
+    
+    }).call(this,require("buffer").Buffer);
+    },{"../config/constants.js":46,"../lib/emulation.js":65,"../lib/lh-element.js":70,"../lib/lh-error.js":71,"../lib/network-recorder.js":74,"../lib/network-request.js":75,"../lib/page-functions.js":76,"../lib/url-shim.js":"url","./connections/connection.js":48,"./devtools-log.js":50,"buffer":102,"events":108,"lighthouse-logger":125}],52:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const log=require('lighthouse-logger');
+    const manifestParser=require('../lib/manifest-parser.js');
+    const stacksGatherer=require('../lib/stack-collector.js');
+    const LHError=require('../lib/lh-error.js');
+    const NetworkAnalyzer=require('../lib/dependency-graph/simulator/network-analyzer.js');
+    const NetworkRecorder=require('../lib/network-recorder.js');
+    const constants=require('../config/constants.js');
+    const i18n=require('../lib/i18n/i18n.js');
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    class GatherRunner{
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static async loadBlank(driver,url=constants.defaultPassConfig.blankPage){
+    const status={msg:'Resetting state with about:blank',id:'lh:gather:loadBlank'};
+    log.time(status);
+    await driver.gotoURL(url,{waitForNavigated:true});
+    log.timeEnd(status);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static async loadPage(driver,passContext){
+    const gatherers=passContext.passConfig.gatherers;
+    const status={
+    msg:'Loading page & waiting for onload',
+    id:`lh:gather:loadPage-${passContext.passConfig.passName}`,
+    args:[gatherers.map(g=>g.instance.name).join(', ')]};
+    
+    log.time(status);
+    try{
+    const finalUrl=await driver.gotoURL(passContext.url,{
+    waitForFCP:passContext.passConfig.recordTrace,
+    waitForLoad:true,
+    passContext});
+    
+    passContext.url=finalUrl;
+    }catch(err){
+    
+    if(err.code==='NO_FCP'||err.code==='PAGE_HUNG'){
+    return{navigationError:err};
+    }
+    
+    throw err;
+    }finally{
+    log.timeEnd(status);
+    }
+    
+    return{};
+    }
+    
+    
+    
+    
+    
+    
+    static async setupDriver(driver,options){
+    const status={msg:'Initializing…',id:'lh:gather:setupDriver'};
+    log.time(status);
+    const resetStorage=!options.settings.disableStorageReset;
+    await driver.assertNoSameOriginServiceWorkerClients(options.requestedUrl);
+    await driver.beginEmulation(options.settings);
+    await driver.enableRuntimeEvents();
+    await driver.enableAsyncStacks();
+    await driver.cacheNatives();
+    await driver.registerPerformanceObserver();
+    await driver.dismissJavaScriptDialogs();
+    if(resetStorage)await driver.clearDataForOrigin(options.requestedUrl);
+    log.timeEnd(status);
+    }
+    
+    
+    
+    
+    
+    
+    
+    static async disposeDriver(driver,options){
+    const status={msg:'Disconnecting from browser...',id:'lh:gather:disconnect'};
+    
+    log.time(status);
+    try{
+    
+    const resetStorage=!options.settings.disableStorageReset;
+    if(resetStorage)await driver.clearDataForOrigin(options.requestedUrl);
+    
+    await driver.disconnect();
+    }catch(err){
+    
+    
+    if(!/close\/.*status: (500|404)$/.test(err.message)){
+    log.error('GatherRunner disconnect',err.message);
+    }
+    }
+    log.timeEnd(status);
+    }
+    
+    
+    
+    
+    
+    
+    static getNetworkError(mainRecord){
+    if(!mainRecord){
+    return new LHError(LHError.errors.NO_DOCUMENT_REQUEST);
+    }else if(mainRecord.failed){
+    const netErr=mainRecord.localizedFailDescription;
+    
+    
+    if(
+    netErr==='net::ERR_NAME_NOT_RESOLVED'||
+    netErr==='net::ERR_NAME_RESOLUTION_FAILED'||
+    netErr.startsWith('net::ERR_DNS_'))
+    {
+    return new LHError(LHError.errors.DNS_FAILURE);
+    }else{
+    return new LHError(
+    LHError.errors.FAILED_DOCUMENT_REQUEST,
+    {errorDetails:netErr});
+    
+    }
+    }else if(mainRecord.hasErrorStatusCode()){
+    return new LHError(
+    LHError.errors.ERRORED_DOCUMENT_REQUEST,
+    {statusCode:`${mainRecord.statusCode}`});
+    
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    static getInterstitialError(mainRecord,networkRecords){
+    
+    if(!mainRecord)return undefined;
+    
+    const interstitialRequest=networkRecords.
+    find(record=>record.documentURL.startsWith('chrome-error://'));
+    
+    if(!interstitialRequest)return undefined;
+    
+    
+    
+    
+    if(!mainRecord.failed)return undefined;
+    
+    
+    if(mainRecord.localizedFailDescription.startsWith('net::ERR_CERT')){
+    return new LHError(LHError.errors.INSECURE_DOCUMENT_REQUEST,{securityMessages:
+    mainRecord.localizedFailDescription});
+    }
+    
+    
+    return new LHError(LHError.errors.CHROME_INTERSTITIAL_ERROR);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static getPageLoadError(passContext,loadData,navigationError){
+    const{networkRecords}=loadData;
+    
+    let mainRecord;
+    try{
+    mainRecord=NetworkAnalyzer.findMainDocument(networkRecords,passContext.url);
+    }catch(_){}
+    
+    const networkError=GatherRunner.getNetworkError(mainRecord);
+    const interstitialError=GatherRunner.getInterstitialError(mainRecord,networkRecords);
+    
+    
+    if(!passContext.driver.online)return;
+    
+    
+    if(interstitialError)return interstitialError;
+    
+    
+    
+    
+    if(networkError)return networkError;
+    
+    
+    
+    
+    return navigationError;
+    }
+    
+    
+    
+    
+    
+    
+    
+    static async setupPassNetwork(passContext){
+    const status={msg:'Setting up network for the pass trace',id:`lh:gather:setupPassNetwork`};
+    log.time(status);
+    
+    const passConfig=passContext.passConfig;
+    await passContext.driver.setThrottling(passContext.settings,passConfig);
+    
+    const blockedUrls=(passContext.passConfig.blockedUrlPatterns||[]).
+    concat(passContext.settings.blockedUrlPatterns||[]);
+    
+    
+    
+    
+    await passContext.driver.blockUrlPatterns(blockedUrls);
+    await passContext.driver.setExtraHTTPHeaders(passContext.settings.extraHeaders);
+    
+    log.timeEnd(status);
+    }
+    
+    
+    
+    
+    
+    
+    static async beginRecording(passContext){
+    const status={msg:'Beginning devtoolsLog and trace',id:'lh:gather:beginRecording'};
+    log.time(status);
+    
+    const{driver,passConfig,settings}=passContext;
+    
+    
+    await driver.beginDevtoolsLog();
+    
+    if(passConfig.recordTrace){
+    await driver.beginTrace(settings);
+    }
+    
+    log.timeEnd(status);
+    }
+    
+    
+    
+    
+    
+    
+    
+    static async endRecording(passContext){
+    const{driver,passConfig}=passContext;
+    
+    let trace;
+    if(passConfig.recordTrace){
+    const status={msg:'Gathering trace',id:`lh:gather:getTrace`};
+    log.time(status);
+    trace=await driver.endTrace();
+    log.timeEnd(status);
+    }
+    
+    const status={
+    msg:'Gathering devtoolsLog & network records',
+    id:`lh:gather:getDevtoolsLog`};
+    
+    log.time(status);
+    const devtoolsLog=driver.endDevtoolsLog();
+    const networkRecords=NetworkRecorder.recordsFromLogs(devtoolsLog);
+    log.timeEnd(status);
+    
+    return{
+    networkRecords,
+    devtoolsLog,
+    trace};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    static async beforePass(passContext,gathererResults){
+    const bpStatus={msg:`Running beforePass methods`,id:`lh:gather:beforePass`};
+    log.time(bpStatus,'verbose');
+    
+    for(const gathererDefn of passContext.passConfig.gatherers){
+    const gatherer=gathererDefn.instance;
+    
+    passContext.options=gathererDefn.options||{};
+    const status={
+    msg:`Gathering setup: ${gatherer.name}`,
+    id:`lh:gather:beforePass:${gatherer.name}`};
+    
+    log.time(status,'verbose');
+    const artifactPromise=Promise.resolve().then(_=>gatherer.beforePass(passContext));
+    gathererResults[gatherer.name]=[artifactPromise];
+    await artifactPromise.catch(()=>{});
+    log.timeEnd(status);
+    }
+    log.timeEnd(bpStatus);
+    }
+    
+    
+    
+    
+    
+    
+    
+    static async pass(passContext,gathererResults){
+    const config=passContext.passConfig;
+    const gatherers=config.gatherers;
+    
+    const pStatus={msg:`Running pass methods`,id:`lh:gather:pass`};
+    log.time(pStatus,'verbose');
+    
+    for(const gathererDefn of gatherers){
+    const gatherer=gathererDefn.instance;
+    
+    passContext.options=gathererDefn.options||{};
+    const status={
+    msg:`Gathering in-page: ${gatherer.name}`,
+    id:`lh:gather:pass:${gatherer.name}`};
+    
+    log.time(status);
+    const artifactPromise=Promise.resolve().then(_=>gatherer.pass(passContext));
+    
+    const gathererResult=gathererResults[gatherer.name]||[];
+    gathererResult.push(artifactPromise);
+    gathererResults[gatherer.name]=gathererResult;
+    await artifactPromise.catch(()=>{});
+    }
+    
+    log.timeEnd(pStatus);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    static async afterPass(passContext,loadData,gathererResults){
+    const driver=passContext.driver;
+    const config=passContext.passConfig;
+    const gatherers=config.gatherers;
+    
+    const apStatus={msg:`Running afterPass methods`,id:`lh:gather:afterPass`};
+    log.time(apStatus,'verbose');
+    
+    
+    
+    const scrollPosition=await driver.getScrollPosition();
+    
+    for(const gathererDefn of gatherers){
+    const gatherer=gathererDefn.instance;
+    const status={
+    msg:`Gathering: ${gatherer.name}`,
+    id:`lh:gather:afterPass:${gatherer.name}`};
+    
+    log.time(status);
+    
+    
+    passContext.options=gathererDefn.options||{};
+    const artifactPromise=Promise.resolve().
+    then(_=>gatherer.afterPass(passContext,loadData));
+    
+    const gathererResult=gathererResults[gatherer.name]||[];
+    gathererResult.push(artifactPromise);
+    gathererResults[gatherer.name]=gathererResult;
+    await artifactPromise.catch(()=>{});
+    await driver.scrollTo(scrollPosition);
+    log.timeEnd(status);
+    }
+    log.timeEnd(apStatus);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static async collectArtifacts(gathererResults){
+    
+    const gathererArtifacts={};
+    
+    const resultsEntries=Object.entries(gathererResults);
+    for(const[gathererName,phaseResultsPromises]of resultsEntries){
+    try{
+    const phaseResults=await Promise.all(phaseResultsPromises);
+    
+    const definedResults=phaseResults.filter(element=>element!==undefined);
+    const artifact=definedResults[definedResults.length-1];
+    
+    gathererArtifacts[gathererName]=artifact;
+    }catch(err){
+    
+    gathererArtifacts[gathererName]=err;
+    }
+    
+    if(gathererArtifacts[gathererName]===undefined){
+    throw new Error(`${gathererName} failed to provide an artifact.`);
+    }
+    }
+    
+    return{
+    artifacts:gathererArtifacts};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    static async initializeBaseArtifacts(options){
+    const hostUserAgent=(await options.driver.getBrowserVersion()).userAgent;
+    
+    const{emulatedFormFactor}=options.settings;
+    
+    const IsMobileHost=hostUserAgent.includes('Android')||hostUserAgent.includes('Mobile');
+    const TestedAsMobileDevice=emulatedFormFactor==='mobile'||
+    emulatedFormFactor!=='desktop'&&IsMobileHost;
+    
+    return{
+    fetchTime:new Date().toJSON(),
+    LighthouseRunWarnings:[],
+    TestedAsMobileDevice,
+    HostUserAgent:hostUserAgent,
+    NetworkUserAgent:'',
+    BenchmarkIndex:0,
+    WebAppManifest:null,
+    Stacks:[],
+    traces:{},
+    devtoolsLogs:{},
+    settings:options.settings,
+    URL:{requestedUrl:options.requestedUrl,finalUrl:options.requestedUrl},
+    Timing:[],
+    PageLoadError:null};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    static async populateBaseArtifacts(passContext){
+    const baseArtifacts=passContext.baseArtifacts;
+    
+    
+    baseArtifacts.URL.finalUrl=passContext.url;
+    
+    
+    baseArtifacts.WebAppManifest=await GatherRunner.getWebAppManifest(passContext);
+    
+    baseArtifacts.Stacks=await stacksGatherer(passContext);
+    
+    
+    const devtoolsLog=baseArtifacts.devtoolsLogs[passContext.passConfig.passName];
+    const userAgentEntry=devtoolsLog.find(entry=>
+    entry.method==='Network.requestWillBeSent'&&
+    !!entry.params.request.headers['User-Agent']);
+    
+    if(userAgentEntry){
+    
+    baseArtifacts.NetworkUserAgent=userAgentEntry.params.request.headers['User-Agent'];
+    }
+    }
+    
+    
+    
+    
+    
+    static finalizeBaseArtifacts(baseArtifacts){
+    
+    baseArtifacts.LighthouseRunWarnings=Array.from(new Set(baseArtifacts.LighthouseRunWarnings));
+    
+    
+    baseArtifacts.Timing=log.getTimeEntries();
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static async getWebAppManifest(passContext){
+    const response=await passContext.driver.getAppManifest();
+    if(!response)return null;
+    return manifestParser(response.data,response.url,passContext.url);
+    }
+    
+    
+    
+    
+    
+    
+    static async run(passConfigs,options){
+    const driver=options.driver;
+    
+    
+    const artifacts={};
+    
+    try{
+    await driver.connect();
+    
+    
+    await GatherRunner.loadBlank(driver);
+    
+    const baseArtifacts=await GatherRunner.initializeBaseArtifacts(options);
+    baseArtifacts.BenchmarkIndex=await options.driver.getBenchmarkIndex();
+    
+    await GatherRunner.setupDriver(driver,options);
+    
+    let isFirstPass=true;
+    for(const passConfig of passConfigs){
+    
+    const passContext={
+    driver,
+    url:options.requestedUrl,
+    settings:options.settings,
+    passConfig,
+    baseArtifacts,
+    LighthouseRunWarnings:baseArtifacts.LighthouseRunWarnings};
+    
+    const passResults=await GatherRunner.runPass(passContext);
+    Object.assign(artifacts,passResults.artifacts);
+    
+    
+    if(passResults.pageLoadError){
+    baseArtifacts.PageLoadError=passResults.pageLoadError;
+    break;
+    }
+    
+    if(isFirstPass){
+    await GatherRunner.populateBaseArtifacts(passContext);
+    isFirstPass=false;
+    }
+    }
+    
+    await GatherRunner.disposeDriver(driver,options);
+    GatherRunner.finalizeBaseArtifacts(baseArtifacts);
+    return{...baseArtifacts,...artifacts};
+    }catch(err){
+    
+    GatherRunner.disposeDriver(driver,options);
+    
+    throw err;
+    }
+    }
+    
+    
+    
+    
+    
+    
+    static isPerfPass(passContext){
+    const{settings,passConfig}=passContext;
+    return!settings.disableStorageReset&&passConfig.recordTrace&&passConfig.useThrottling;
+    }
+    
+    
+    
+    
+    
+    
+    
+    static _addLoadDataToBaseArtifacts(passContext,loadData,passName){
+    const baseArtifacts=passContext.baseArtifacts;
+    baseArtifacts.devtoolsLogs[passName]=loadData.devtoolsLog;
+    if(loadData.trace)baseArtifacts.traces[passName]=loadData.trace;
+    }
+    
+    
+    
+    
+    
+    
+    static async runPass(passContext){
+    
+    const gathererResults={};
+    const{driver,passConfig}=passContext;
+    
+    
+    await GatherRunner.loadBlank(driver,passConfig.blankPage);
+    await GatherRunner.setupPassNetwork(passContext);
+    const isPerfPass=GatherRunner.isPerfPass(passContext);
+    if(isPerfPass)await driver.cleanBrowserCaches();
+    await GatherRunner.beforePass(passContext,gathererResults);
+    
+    
+    await GatherRunner.beginRecording(passContext);
+    const{navigationError:possibleNavError}=await GatherRunner.loadPage(driver,passContext);
+    await GatherRunner.pass(passContext,gathererResults);
+    const loadData=await GatherRunner.endRecording(passContext);
+    
+    
+    await driver.setThrottling(passContext.settings,{useThrottling:false});
+    
+    
+    const pageLoadError=GatherRunner.getPageLoadError(passContext,loadData,possibleNavError);
+    if(pageLoadError){
+    const localizedMessage=i18n.getFormatted(pageLoadError.friendlyMessage,
+    passContext.settings.locale);
+    log.error('GatherRunner',localizedMessage,passContext.url);
+    
+    passContext.LighthouseRunWarnings.push(pageLoadError.friendlyMessage);
+    GatherRunner._addLoadDataToBaseArtifacts(passContext,loadData,
+    `pageLoadError-${passConfig.passName}`);
+    
+    return{artifacts:{},pageLoadError};
+    }
+    
+    
+    GatherRunner._addLoadDataToBaseArtifacts(passContext,loadData,passConfig.passName);
+    
+    
+    await GatherRunner.afterPass(passContext,loadData,gathererResults);
+    return GatherRunner.collectArtifacts(gathererResults);
+    }}
+    
+    
+    module.exports=GatherRunner;
+    
+    },{"../config/constants.js":46,"../lib/dependency-graph/simulator/network-analyzer.js":62,"../lib/i18n/i18n.js":66,"../lib/lh-error.js":71,"../lib/manifest-parser.js":72,"../lib/network-recorder.js":74,"../lib/stack-collector.js":79,"lighthouse-logger":125}],53:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    class Gatherer{
+    
+    
+    
+    get name(){
+    
+    return this.constructor.name;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    beforePass(passContext){}
+    
+    
+    
+    
+    
+    
+    
+    pass(passContext){}
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    afterPass(passContext,loadData){}}
+    
+    
+    
+    
+    module.exports=Gatherer;
+    
+    },{}],54:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Runner=require('./runner.js');
+    const log=require('lighthouse-logger');
+    const ChromeProtocol=require('./gather/connections/cri.js');
+    const Config=require('./config/config.js');
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    async function lighthouse(url,flags={},configJSON,connection){
+    
+    flags.logLevel=flags.logLevel||'error';
+    log.setLevel(flags.logLevel);
+    
+    const config=generateConfig(configJSON,flags);
+    
+    connection=connection||new ChromeProtocol(flags.port,flags.hostname);
+    
+    
+    return Runner.run(connection,{url,config});
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function generateConfig(configJson,flags){
+    return new Config(configJson,flags);
+    }
+    
+    lighthouse.generateConfig=generateConfig;
+    lighthouse.getAuditList=Runner.getAuditList;
+    lighthouse.traceCategories=require('./gather/driver.js').traceCategories;
+    lighthouse.Audit=require('./audits/audit.js');
+    lighthouse.Gatherer=require('./gather/gatherers/gatherer.js');
+    lighthouse.NetworkRecords=require('./computed/network-records.js');
+    
+    module.exports=lighthouse;
+    
+    },{"./audits/audit.js":3,"./computed/network-records.js":34,"./config/config.js":45,"./gather/connections/cri.js":101,"./gather/driver.js":51,"./gather/gatherers/gatherer.js":53,"./runner.js":89,"lighthouse-logger":125}],55:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const isEqual=require('lodash.isequal');
+    
+    
+    
+    
+    
+    
+    class ArbitraryEqualityMap{
+    constructor(){
+    this._equalsFn=ArbitraryEqualityMap.deepEquals;
+    
+    this._entries=[];
+    }
+    
+    
+    
+    
+    setEqualityFn(equalsFn){
+    this._equalsFn=equalsFn;
+    }
+    
+    
+    
+    
+    
+    has(key){
+    return this._findIndexOf(key)!==-1;
+    }
+    
+    
+    
+    
+    
+    get(key){
+    const entry=this._entries[this._findIndexOf(key)];
+    return entry&&entry.value;
+    }
+    
+    
+    
+    
+    
+    set(key,value){
+    let index=this._findIndexOf(key);
+    if(index===-1)index=this._entries.length;
+    this._entries[index]={key,value};
+    }
+    
+    
+    
+    
+    
+    _findIndexOf(key){
+    for(let i=0;i<this._entries.length;i++){
+    if(this._equalsFn(key,this._entries[i].key))return i;
+    }
+    
+    return-1;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static deepEquals(objA,objB){
+    return isEqual(objA,objB);
+    }}
+    
+    
+    module.exports=ArbitraryEqualityMap;
+    
+    },{"lodash.isequal":142}],56:[function(require,module,exports){
+    (function(process){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const fs=require('fs');
+    const path=require('path');
+    const log=require('lighthouse-logger');
+    const stream=require('stream');
+    const Simulator=require('./dependency-graph/simulator/simulator.js');
+    const lanternTraceSaver=require('./lantern-trace-saver.js');
+    const Metrics=require('./traces/pwmetrics-events.js');
+    const rimraf=require('rimraf');
+    const mkdirp=require('mkdirp');
+    const NetworkAnalysisComputed=require('../computed/network-analysis.js');
+    const LoadSimulatorComputed=require('../computed/load-simulator.js');
+    const LHError=require('../lib/lh-error.js');
+    
+    const artifactsFilename='artifacts.json';
+    const traceSuffix='.trace.json';
+    const devtoolsLogSuffix='.devtoolslog.json';
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function loadArtifacts(basePath){
+    log.log('Reading artifacts from disk:',basePath);
+    
+    if(!fs.existsSync(basePath)){
+    throw new Error('No saved artifacts found at '+basePath);
+    }
+    
+    
+    const artifactsStr=fs.readFileSync(path.join(basePath,artifactsFilename),'utf8');
+    
+    const artifacts=JSON.parse(artifactsStr,LHError.parseReviver);
+    
+    const filenames=fs.readdirSync(basePath);
+    
+    
+    artifacts.devtoolsLogs={};
+    filenames.filter(f=>f.endsWith(devtoolsLogSuffix)).forEach(filename=>{
+    const passName=filename.replace(devtoolsLogSuffix,'');
+    const devtoolsLog=JSON.parse(fs.readFileSync(path.join(basePath,filename),'utf8'));
+    artifacts.devtoolsLogs[passName]=devtoolsLog;
+    });
+    
+    
+    artifacts.traces={};
+    filenames.filter(f=>f.endsWith(traceSuffix)).forEach(filename=>{
+    const file=fs.readFileSync(path.join(basePath,filename),{encoding:'utf-8'});
+    const trace=JSON.parse(file);
+    const passName=filename.replace(traceSuffix,'');
+    artifacts.traces[passName]=Array.isArray(trace)?{traceEvents:trace}:trace;
+    });
+    
+    if(Array.isArray(artifacts.Timing)){
+    
+    
+    artifacts.Timing.forEach(entry=>entry.gather=true);
+    }
+    return artifacts;
+    }
+    
+    
+    
+    
+    
+    
+    
+    function stringifyReplacer(key,value){
+    
+    if(value instanceof Error){
+    return LHError.stringifyReplacer(value);
+    }
+    
+    return value;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    async function saveArtifacts(artifacts,basePath){
+    const status={msg:'Saving artifacts',id:'lh:assetSaver:saveArtifacts'};
+    log.time(status);
+    mkdirp.sync(basePath);
+    rimraf.sync(`${basePath}/*${traceSuffix}`);
+    rimraf.sync(`${basePath}/${artifactsFilename}`);
+    
+    const{traces,devtoolsLogs,...restArtifacts}=artifacts;
+    
+    
+    for(const[passName,trace]of Object.entries(traces)){
+    await saveTrace(trace,`${basePath}/${passName}${traceSuffix}`);
+    }
+    
+    
+    for(const[passName,devtoolsLog]of Object.entries(devtoolsLogs)){
+    const log=JSON.stringify(devtoolsLog);
+    fs.writeFileSync(`${basePath}/${passName}${devtoolsLogSuffix}`,log,'utf8');
+    }
+    
+    
+    const restArtifactsString=JSON.stringify(restArtifacts,stringifyReplacer,2);
+    fs.writeFileSync(`${basePath}/${artifactsFilename}`,restArtifactsString,'utf8');
+    log.log('Artifacts saved to disk in folder:',basePath);
+    log.timeEnd(status);
+    }
+    
+    
+    
+    
+    
+    
+    
+    async function prepareAssets(artifacts,audits){
+    const passNames=Object.keys(artifacts.traces);
+    
+    const assets=[];
+    
+    for(const passName of passNames){
+    const trace=artifacts.traces[passName];
+    const devtoolsLog=artifacts.devtoolsLogs[passName];
+    
+    const traceData=Object.assign({},trace);
+    if(audits){
+    const evts=new Metrics(traceData.traceEvents,audits).generateFakeEvents();
+    traceData.traceEvents=traceData.traceEvents.concat(evts);
+    }
+    
+    assets.push({
+    passName,
+    traceData,
+    devtoolsLog});
+    
+    }
+    
+    return assets;
+    }
+    
+    
+    
+    
+    
+    
+    
+    function*traceJsonGenerator(traceData){
+    const EVENTS_PER_ITERATION=500;
+    const keys=Object.keys(traceData);
+    
+    yield'{\n';
+    
+    
+    yield'"traceEvents": [\n';
+    if(traceData.traceEvents.length>0){
+    const eventsIterator=traceData.traceEvents[Symbol.iterator]();
+    
+    const firstEvent=eventsIterator.next().value;
+    yield`  ${JSON.stringify(firstEvent)}`;
+    
+    let eventsRemaining=EVENTS_PER_ITERATION;
+    let eventsJSON='';
+    for(const event of eventsIterator){
+    eventsJSON+=`,\n  ${JSON.stringify(event)}`;
+    eventsRemaining--;
+    if(eventsRemaining===0){
+    yield eventsJSON;
+    eventsRemaining=EVENTS_PER_ITERATION;
+    eventsJSON='';
+    }
+    }
+    yield eventsJSON;
+    }
+    yield'\n]';
+    
+    
+    if(keys.length>1){
+    for(const key of keys){
+    if(key==='traceEvents')continue;
+    
+    yield`,\n"${key}": ${JSON.stringify(traceData[key],null,2)}`;
+    }
+    }
+    
+    yield'}\n';
+    }
+    
+    
+    
+    
+    
+    
+    
+    function saveTrace(traceData,traceFilename){
+    return new Promise((resolve,reject)=>{
+    const traceIter=traceJsonGenerator(traceData);
+    
+    
+    const traceStream=new stream.Readable({
+    read(){
+    const next=traceIter.next();
+    this.push(next.done?null:next.value);
+    }});
+    
+    
+    const writeStream=fs.createWriteStream(traceFilename);
+    writeStream.on('finish',resolve);
+    writeStream.on('error',reject);
+    
+    traceStream.pipe(writeStream);
+    });
+    }
+    
+    
+    
+    
+    
+    async function saveLanternDebugTraces(pathWithBasename){
+    if(!process.env.LANTERN_DEBUG)return;
+    
+    for(const[label,nodeTimings]of Simulator.ALL_NODE_TIMINGS){
+    if(lanternTraceSaver.simulationNamesToIgnore.includes(label))continue;
+    
+    const traceFilename=`${pathWithBasename}-${label}${traceSuffix}`;
+    await saveTrace(lanternTraceSaver.convertNodeTimingsToTrace(nodeTimings),traceFilename);
+    log.log('saveAssets',`${label} lantern trace file streamed to disk: ${traceFilename}`);
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    async function saveAssets(artifacts,audits,pathWithBasename){
+    const allAssets=await prepareAssets(artifacts,audits);
+    const saveAll=allAssets.map(async(passAssets,index)=>{
+    const devtoolsLogFilename=`${pathWithBasename}-${index}${devtoolsLogSuffix}`;
+    fs.writeFileSync(devtoolsLogFilename,JSON.stringify(passAssets.devtoolsLog,null,2));
+    log.log('saveAssets','devtools log saved to disk: '+devtoolsLogFilename);
+    
+    const streamTraceFilename=`${pathWithBasename}-${index}${traceSuffix}`;
+    log.log('saveAssets','streaming trace file to disk: '+streamTraceFilename);
+    await saveTrace(passAssets.traceData,streamTraceFilename);
+    log.log('saveAssets','trace file streamed to disk: '+streamTraceFilename);
+    });
+    
+    await Promise.all(saveAll);
+    await saveLanternDebugTraces(pathWithBasename);
+    }
+    
+    
+    
+    
+    
+    
+    async function saveLanternNetworkData(devtoolsLog,outputPath){
+    const context={computedCache:new Map()};
+    const networkAnalysis=await NetworkAnalysisComputed.request(devtoolsLog,context);
+    const lanternData=LoadSimulatorComputed.convertAnalysisToSaveableLanternData(networkAnalysis);
+    
+    fs.writeFileSync(outputPath,JSON.stringify(lanternData));
+    }
+    
+    module.exports={
+    saveArtifacts,
+    loadArtifacts,
+    saveAssets,
+    prepareAssets,
+    saveTrace,
+    saveLanternNetworkData,
+    stringifyReplacer};
+    
+    
+    }).call(this,require('_process'));
+    },{"../computed/load-simulator.js":10,"../computed/network-analysis.js":33,"../lib/lh-error.js":71,"./dependency-graph/simulator/simulator.js":63,"./lantern-trace-saver.js":69,"./traces/pwmetrics-events.js":86,"_process":158,"fs":101,"lighthouse-logger":125,"mkdirp":101,"path":156,"rimraf":101,"stream":183}],57:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    class BaseNode{
+    
+    
+    
+    constructor(id){
+    this._id=id;
+    this._isMainDocument=false;
+    
+    this._dependents=[];
+    
+    this._dependencies=[];
+    }
+    
+    
+    
+    
+    get id(){
+    return this._id;
+    }
+    
+    
+    
+    
+    get type(){
+    throw new Error('Unimplemented');
+    }
+    
+    
+    
+    
+    get startTime(){
+    throw new Error('Unimplemented');
+    }
+    
+    
+    
+    
+    get endTime(){
+    throw new Error('Unimplemented');
+    }
+    
+    
+    
+    
+    setIsMainDocument(value){
+    this._isMainDocument=value;
+    }
+    
+    
+    
+    
+    isMainDocument(){
+    return this._isMainDocument;
+    }
+    
+    
+    
+    
+    getDependents(){
+    return this._dependents.slice();
+    }
+    
+    
+    
+    
+    getDependencies(){
+    return this._dependencies.slice();
+    }
+    
+    
+    
+    
+    getNumberOfDependencies(){
+    return this._dependencies.length;
+    }
+    
+    
+    
+    
+    getRootNode(){
+    let rootNode=this;
+    while(rootNode._dependencies.length){
+    rootNode=rootNode._dependencies[0];
+    }
+    
+    return rootNode;
+    }
+    
+    
+    
+    
+    addDependent(node){
+    node.addDependency(this);
+    }
+    
+    
+    
+    
+    addDependency(node){
+    if(this._dependencies.includes(node)){
+    return;
+    }
+    
+    node._dependents.push(this);
+    this._dependencies.push(node);
+    }
+    
+    
+    
+    
+    removeDependent(node){
+    node.removeDependency(this);
+    }
+    
+    
+    
+    
+    removeDependency(node){
+    if(!this._dependencies.includes(node)){
+    return;
+    }
+    
+    const thisIndex=node._dependents.indexOf(this);
+    node._dependents.splice(thisIndex,1);
+    this._dependencies.splice(this._dependencies.indexOf(node),1);
+    }
+    
+    removeAllDependencies(){
+    for(const node of this._dependencies.slice()){
+    this.removeDependency(node);
+    }
+    }
+    
+    
+    
+    
+    
+    cloneWithoutRelationships(){
+    const node=new BaseNode(this.id);
+    node.setIsMainDocument(this._isMainDocument);
+    return node;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    cloneWithRelationships(predicate){
+    const rootNode=this.getRootNode();
+    
+    
+    const idsToIncludedClones=new Map();
+    
+    
+    rootNode.traverse(node=>{
+    if(idsToIncludedClones.has(node.id))return;
+    
+    if(predicate===undefined){
+    
+    idsToIncludedClones.set(node.id,node.cloneWithoutRelationships());
+    return;
+    }
+    
+    if(predicate(node)){
+    
+    node.traverse(
+    node=>idsToIncludedClones.set(node.id,node.cloneWithoutRelationships()),
+    
+    node=>node._dependencies.filter(parent=>!idsToIncludedClones.has(parent.id)));
+    
+    }
+    });
+    
+    
+    rootNode.traverse(originalNode=>{
+    const clonedNode=idsToIncludedClones.get(originalNode.id);
+    if(!clonedNode)return;
+    
+    for(const dependency of originalNode._dependencies){
+    const clonedDependency=idsToIncludedClones.get(dependency.id);
+    if(!clonedDependency)throw new Error('Dependency somehow not cloned');
+    clonedNode.addDependency(clonedDependency);
+    }
+    });
+    
+    const clonedThisNode=idsToIncludedClones.get(this.id);
+    if(!clonedThisNode)throw new Error('Cloned graph missing node');
+    return clonedThisNode;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    traverse(callback,getNextNodes){
+    if(!getNextNodes){
+    getNextNodes=node=>node.getDependents();
+    }
+    
+    
+    
+    const queue=[[this]];
+    const visited=new Set([this.id]);
+    
+    while(queue.length){
+    
+    
+    const traversalPath=queue.shift();
+    const node=traversalPath[0];
+    callback(node,traversalPath);
+    
+    for(const nextNode of getNextNodes(node)){
+    if(visited.has(nextNode.id))continue;
+    visited.add(nextNode.id);
+    
+    queue.push([nextNode,...traversalPath]);
+    }
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    static hasCycle(node,direction='both'){
+    
+    if(direction==='both'){
+    return BaseNode.hasCycle(node,'dependents')||BaseNode.hasCycle(node,'dependencies');
+    }
+    
+    const visited=new Set();
+    
+    const currentPath=[];
+    const toVisit=[node];
+    const depthAdded=new Map([[node,0]]);
+    
+    
+    while(toVisit.length){
+    
+    
+    
+    const currentNode=toVisit.pop();
+    
+    
+    if(currentPath.includes(currentNode))return true;
+    
+    if(visited.has(currentNode))continue;
+    
+    
+    
+    while(currentPath.length>depthAdded.get(currentNode))currentPath.pop();
+    
+    
+    visited.add(currentNode);
+    currentPath.push(currentNode);
+    
+    
+    const nodesToExplore=direction==='dependents'?
+    currentNode._dependents:
+    currentNode._dependencies;
+    for(const nextNode of nodesToExplore){
+    if(toVisit.includes(nextNode))continue;
+    toVisit.push(nextNode);
+    depthAdded.set(nextNode,currentPath.length);
+    }
+    }
+    
+    return false;
+    }}
+    
+    
+    BaseNode.TYPES={
+    NETWORK:'network',
+    CPU:'cpu'};
+    
+    
+    module.exports=BaseNode;
+    
+    },{}],58:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const BaseNode=require('./base-node.js');
+    
+    class CPUNode extends BaseNode{
+    
+    
+    
+    
+    constructor(parentEvent,childEvents=[]){
+    const nodeId=`${parentEvent.tid}.${parentEvent.ts}`;
+    super(nodeId);
+    
+    this._event=parentEvent;
+    this._childEvents=childEvents;
+    }
+    
+    get type(){
+    return BaseNode.TYPES.CPU;
+    }
+    
+    
+    
+    
+    get startTime(){
+    return this._event.ts;
+    }
+    
+    
+    
+    
+    get endTime(){
+    return this._event.ts+this._event.dur;
+    }
+    
+    
+    
+    
+    get event(){
+    return this._event;
+    }
+    
+    
+    
+    
+    get childEvents(){
+    return this._childEvents;
+    }
+    
+    
+    
+    
+    
+    didPerformLayout(){
+    return this._childEvents.some(evt=>evt.name==='Layout');
+    }
+    
+    
+    
+    
+    getEvaluateScriptURLs(){
+    
+    const urls=new Set();
+    for(const event of this._childEvents){
+    if(event.name!=='EvaluateScript')continue;
+    if(!event.args.data||!event.args.data.url)continue;
+    urls.add(event.args.data.url);
+    }
+    
+    return urls;
+    }
+    
+    
+    
+    
+    cloneWithoutRelationships(){
+    return new CPUNode(this._event,this._childEvents);
+    }}
+    
+    
+    module.exports=CPUNode;
+    
+    },{"./base-node.js":57}],59:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const BaseNode=require('./base-node.js');
+    const NetworkRequest=require('../network-request.js');
+    
+    class NetworkNode extends BaseNode{
+    
+    
+    
+    constructor(networkRecord){
+    super(networkRecord.requestId);
+    
+    this._record=networkRecord;
+    }
+    
+    get type(){
+    return BaseNode.TYPES.NETWORK;
+    }
+    
+    
+    
+    
+    get startTime(){
+    return this._record.startTime*1000*1000;
+    }
+    
+    
+    
+    
+    get endTime(){
+    return this._record.endTime*1000*1000;
+    }
+    
+    
+    
+    
+    get record(){
+    return this._record;
+    }
+    
+    
+    
+    
+    get initiatorType(){
+    return this._record.initiator&&this._record.initiator.type;
+    }
+    
+    
+    
+    
+    get fromDiskCache(){
+    return!!this._record.fromDiskCache;
+    }
+    
+    
+    
+    
+    hasRenderBlockingPriority(){
+    const priority=this._record.priority;
+    const isScript=this._record.resourceType===NetworkRequest.TYPES.Script;
+    const isDocument=this._record.resourceType===NetworkRequest.TYPES.Document;
+    const isBlockingScript=priority==='High'&&isScript;
+    const isBlockingHtmlImport=priority==='High'&&isDocument;
+    return priority==='VeryHigh'||isBlockingScript||isBlockingHtmlImport;
+    }
+    
+    
+    
+    
+    cloneWithoutRelationships(){
+    const node=new NetworkNode(this._record);
+    node.setIsMainDocument(this._isMainDocument);
+    return node;
+    }}
+    
+    
+    module.exports=NetworkNode;
+    
+    },{"../network-request.js":75,"./base-node.js":57}],60:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const NetworkAnalyzer=require('./network-analyzer.js');
+    const TcpConnection=require('./tcp-connection.js');
+    
+    const DEFAULT_SERVER_RESPONSE_TIME=30;
+    const TLS_SCHEMES=['https','wss'];
+    
+    
+    
+    const CONNECTIONS_PER_ORIGIN=6;
+    
+    module.exports=class ConnectionPool{
+    
+    
+    
+    
+    constructor(records,options){
+    this._options=options;
+    
+    this._records=records;
+    
+    this._connectionsByOrigin=new Map();
+    
+    this._connectionsByRecord=new Map();
+    this._connectionsInUse=new Set();
+    this._connectionReusedByRequestId=NetworkAnalyzer.estimateIfConnectionWasReused(records,{
+    forceCoarseEstimates:true});
+    
+    
+    this._initializeConnections();
+    }
+    
+    
+    
+    
+    connectionsInUse(){
+    return Array.from(this._connectionsInUse);
+    }
+    
+    _initializeConnections(){
+    const connectionReused=this._connectionReusedByRequestId;
+    const additionalRttByOrigin=this._options.additionalRttByOrigin;
+    const serverResponseTimeByOrigin=this._options.serverResponseTimeByOrigin;
+    
+    const recordsByOrigin=NetworkAnalyzer.groupByOrigin(this._records);
+    for(const[origin,records]of recordsByOrigin.entries()){
+    const connections=[];
+    const additionalRtt=additionalRttByOrigin.get(origin)||0;
+    const responseTime=serverResponseTimeByOrigin.get(origin)||DEFAULT_SERVER_RESPONSE_TIME;
+    
+    for(const record of records){
+    if(connectionReused.get(record.requestId))continue;
+    
+    const isTLS=TLS_SCHEMES.includes(record.parsedURL.scheme);
+    const isH2=record.protocol==='h2';
+    const connection=new TcpConnection(
+    this._options.rtt+additionalRtt,
+    this._options.throughput,
+    responseTime,
+    isTLS,
+    isH2);
+    
+    
+    connections.push(connection);
+    }
+    
+    if(!connections.length){
+    throw new Error(`Could not find a connection for origin: ${origin}`);
+    }
+    
+    
+    while(connections.length<CONNECTIONS_PER_ORIGIN)connections.push(connections[0].clone());
+    
+    this._connectionsByOrigin.set(origin,connections);
+    }
+    }
+    
+    
+    
+    
+    
+    _findAvailableConnectionWithLargestCongestionWindow(connections,options){
+    const{ignoreConnectionReused,observedConnectionWasReused}=options;
+    
+    
+    let maxConnection=null;
+    for(let i=0;i<connections.length;i++){
+    const connection=connections[i];
+    
+    
+    
+    
+    
+    if(!ignoreConnectionReused&&connection._warmed!==observedConnectionWasReused){
+    continue;
+    }
+    
+    
+    if(this._connectionsInUse.has(connection)){
+    continue;
+    }
+    
+    
+    const currentMax=maxConnection&&maxConnection.congestionWindow||-Infinity;
+    if(connection.congestionWindow>currentMax)maxConnection=connection;
+    }
+    
+    return maxConnection;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    acquire(record,options={}){
+    if(this._connectionsByRecord.has(record))throw new Error('Record already has a connection');
+    
+    const origin=record.parsedURL.securityOrigin;
+    const observedConnectionWasReused=!!this._connectionReusedByRequestId.get(record.requestId);
+    const connections=this._connectionsByOrigin.get(origin)||[];
+    const connectionToUse=this._findAvailableConnectionWithLargestCongestionWindow(connections,{
+    ignoreConnectionReused:options.ignoreConnectionReused,
+    observedConnectionWasReused});
+    
+    
+    if(!connectionToUse)return null;
+    
+    this._connectionsInUse.add(connectionToUse);
+    this._connectionsByRecord.set(record,connectionToUse);
+    return connectionToUse;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    acquireActiveConnectionFromRecord(record){
+    const activeConnection=this._connectionsByRecord.get(record);
+    if(!activeConnection)throw new Error('Could not find an active connection for record');
+    
+    return activeConnection;
+    }
+    
+    
+    
+    
+    release(record){
+    const connection=this._connectionsByRecord.get(record);
+    this._connectionsByRecord.delete(record);
+    this._connectionsInUse.delete(connection);
+    }};
+    
+    
+    },{"./network-analyzer.js":62,"./tcp-connection.js":64}],61:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    const DNS_RESOLUTION_RTT_MULTIPLIER=2;
+    
+    class DNSCache{
+    
+    
+    
+    constructor({rtt}){
+    this._rtt=rtt;
+    
+    
+    this._resolvedDomainNames=new Map();
+    }
+    
+    
+    
+    
+    
+    
+    getTimeUntilResolution(request,options){
+    const{requestedAt=0,shouldUpdateCache=false}=options||{};
+    
+    const domain=request.parsedURL.host;
+    const cacheEntry=this._resolvedDomainNames.get(domain);
+    let timeUntilResolved=this._rtt*DNSCache.RTT_MULTIPLIER;
+    if(cacheEntry){
+    const timeUntilCachedIsResolved=Math.max(cacheEntry.resolvedAt-requestedAt,0);
+    timeUntilResolved=Math.min(timeUntilCachedIsResolved,timeUntilResolved);
+    }
+    
+    const resolvedAt=requestedAt+timeUntilResolved;
+    if(shouldUpdateCache)this._updateCacheResolvedAtIfNeeded(request,resolvedAt);
+    
+    return timeUntilResolved;
+    }
+    
+    
+    
+    
+    
+    _updateCacheResolvedAtIfNeeded(request,resolvedAt){
+    const domain=request.parsedURL.host;
+    const cacheEntry=this._resolvedDomainNames.get(domain)||{resolvedAt};
+    cacheEntry.resolvedAt=Math.min(cacheEntry.resolvedAt,resolvedAt);
+    this._resolvedDomainNames.set(domain,cacheEntry);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    setResolvedAt(domain,resolvedAt){
+    this._resolvedDomainNames.set(domain,{resolvedAt});
+    }}
+    
+    
+    DNSCache.RTT_MULTIPLIER=DNS_RESOLUTION_RTT_MULTIPLIER;
+    
+    module.exports=DNSCache;
+    
+    },{}],62:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const INITIAL_CWD=14*1024;
+    const NetworkRequest=require('../../network-request.js');
+    const URL=require('../../url-shim.js');
+    
+    
+    const DEFAULT_SERVER_RESPONSE_PERCENTAGE=0.4;
+    
+    
+    
+    
+    
+    
+    const SERVER_RESPONSE_PERCENTAGE_OF_TTFB={
+    Document:0.9,
+    XHR:0.9,
+    Fetch:0.9};
+    
+    
+    class NetworkAnalyzer{
+    
+    
+    
+    static get SUMMARY(){
+    return'__SUMMARY__';
+    }
+    
+    
+    
+    
+    
+    static groupByOrigin(records){
+    const grouped=new Map();
+    records.forEach(item=>{
+    const key=item.parsedURL.securityOrigin;
+    const group=grouped.get(key)||[];
+    group.push(item);
+    grouped.set(key,group);
+    });
+    return grouped;
+    }
+    
+    
+    
+    
+    
+    static getSummary(values){
+    values.sort((a,b)=>a-b);
+    
+    return{
+    min:values[0],
+    max:values[values.length-1],
+    avg:values.reduce((a,b)=>a+b,0)/values.length,
+    median:values[Math.floor((values.length-1)/2)]};
+    
+    }
+    
+    
+    
+    
+    
+    static summarize(values){
+    const summaryByKey=new Map();
+    const allEstimates=[];
+    for(const[key,estimates]of values){
+    summaryByKey.set(key,NetworkAnalyzer.getSummary(estimates));
+    allEstimates.push(...estimates);
+    }
+    
+    summaryByKey.set(NetworkAnalyzer.SUMMARY,NetworkAnalyzer.getSummary(allEstimates));
+    return summaryByKey;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    static _estimateValueByOrigin(records,iteratee){
+    const connectionWasReused=NetworkAnalyzer.estimateIfConnectionWasReused(records);
+    const groupedByOrigin=NetworkAnalyzer.groupByOrigin(records);
+    
+    const estimates=new Map();
+    for(const[origin,originRecords]of groupedByOrigin.entries()){
+    
+    let originEstimates=[];
+    
+    for(const record of originRecords){
+    const timing=record.timing;
+    if(!timing)continue;
+    
+    const value=iteratee({
+    record,
+    timing,
+    connectionReused:connectionWasReused.get(record.requestId)});
+    
+    if(typeof value!=='undefined'){
+    originEstimates=originEstimates.concat(value);
+    }
+    }
+    
+    if(!originEstimates.length)continue;
+    estimates.set(origin,originEstimates);
+    }
+    
+    return estimates;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    static _estimateRTTByOriginViaTCPTiming(records){
+    return NetworkAnalyzer._estimateValueByOrigin(records,({timing,connectionReused})=>{
+    if(connectionReused)return;
+    
+    
+    
+    if(timing.sslStart>0&&timing.sslEnd>0){
+    return[timing.connectEnd-timing.sslStart,timing.sslStart-timing.connectStart];
+    }else if(timing.connectStart>0&&timing.connectEnd>0){
+    return timing.connectEnd-timing.connectStart;
+    }
+    });
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static _estimateRTTByOriginViaDownloadTiming(records){
+    return NetworkAnalyzer._estimateValueByOrigin(records,({record,timing,connectionReused})=>{
+    if(connectionReused)return;
+    
+    if(record.transferSize<=INITIAL_CWD)return;
+    if(!Number.isFinite(timing.receiveHeadersEnd)||timing.receiveHeadersEnd<0)return;
+    
+    
+    const totalTime=(record.endTime-record.startTime)*1000;
+    const downloadTimeAfterFirstByte=totalTime-timing.receiveHeadersEnd;
+    const numberOfRoundTrips=Math.log2(record.transferSize/INITIAL_CWD);
+    
+    
+    
+    if(numberOfRoundTrips>5)return;
+    return downloadTimeAfterFirstByte/numberOfRoundTrips;
+    });
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static _estimateRTTByOriginViaSendStartTiming(records){
+    return NetworkAnalyzer._estimateValueByOrigin(records,({record,timing,connectionReused})=>{
+    if(connectionReused)return;
+    if(!Number.isFinite(timing.sendStart)||timing.sendStart<0)return;
+    
+    
+    
+    let roundTrips=2;
+    if(record.parsedURL.scheme==='https')roundTrips+=1;
+    return timing.sendStart/roundTrips;
+    });
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static _estimateRTTByOriginViaHeadersEndTiming(records){
+    return NetworkAnalyzer._estimateValueByOrigin(records,({record,timing,connectionReused})=>{
+    if(!Number.isFinite(timing.receiveHeadersEnd)||timing.receiveHeadersEnd<0)return;
+    if(!record.resourceType)return;
+    
+    const serverResponseTimePercentage=SERVER_RESPONSE_PERCENTAGE_OF_TTFB[record.resourceType]||
+    DEFAULT_SERVER_RESPONSE_PERCENTAGE;
+    const estimatedServerResponseTime=timing.receiveHeadersEnd*serverResponseTimePercentage;
+    
+    
+    
+    let roundTrips=1;
+    
+    
+    
+    if(!connectionReused){
+    roundTrips+=1;
+    if(record.parsedURL.scheme==='https')roundTrips+=1;
+    roundTrips+=1;
+    }
+    
+    
+    return Math.max((timing.receiveHeadersEnd-estimatedServerResponseTime)/roundTrips,3);
+    });
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    static _estimateResponseTimeByOrigin(records,rttByOrigin){
+    return NetworkAnalyzer._estimateValueByOrigin(records,({record,timing})=>{
+    if(!Number.isFinite(timing.receiveHeadersEnd)||timing.receiveHeadersEnd<0)return;
+    if(!Number.isFinite(timing.sendEnd)||timing.sendEnd<0)return;
+    
+    const ttfb=timing.receiveHeadersEnd-timing.sendEnd;
+    const origin=record.parsedURL.securityOrigin;
+    const rtt=rttByOrigin.get(origin)||rttByOrigin.get(NetworkAnalyzer.SUMMARY)||0;
+    return Math.max(ttfb-rtt,0);
+    });
+    }
+    
+    
+    
+    
+    
+    static canTrustConnectionInformation(records){
+    const connectionIdWasStarted=new Map();
+    for(const record of records){
+    const started=connectionIdWasStarted.get(record.connectionId)||!record.connectionReused;
+    connectionIdWasStarted.set(record.connectionId,started);
+    }
+    
+    
+    if(connectionIdWasStarted.size<=1)return false;
+    
+    return Array.from(connectionIdWasStarted.values()).every(started=>started);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static estimateIfConnectionWasReused(records,options){
+    const{forceCoarseEstimates=false}=options||{};
+    
+    
+    if(!forceCoarseEstimates&&NetworkAnalyzer.canTrustConnectionInformation(records)){
+    
+    return new Map(records.map(record=>[record.requestId,!!record.connectionReused]));
+    }
+    
+    
+    
+    
+    
+    const connectionWasReused=new Map();
+    const groupedByOrigin=NetworkAnalyzer.groupByOrigin(records);
+    for(const[_,originRecords]of groupedByOrigin.entries()){
+    const earliestReusePossible=originRecords.
+    map(record=>record.endTime).
+    reduce((a,b)=>Math.min(a,b),Infinity);
+    
+    for(const record of originRecords){
+    connectionWasReused.set(
+    record.requestId,
+    record.startTime>=earliestReusePossible||record.protocol==='h2');
+    
+    }
+    
+    const firstRecord=originRecords.reduce((a,b)=>a.startTime>b.startTime?b:a);
+    connectionWasReused.set(firstRecord.requestId,false);
+    }
+    
+    return connectionWasReused;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static estimateRTTByOrigin(records,options){
+    const{
+    forceCoarseEstimates=false,
+    
+    
+    coarseEstimateMultiplier=0.3,
+    useDownloadEstimates=true,
+    useSendStartEstimates=true,
+    useHeadersEndEstimates=true}=
+    options||{};
+    
+    let estimatesByOrigin=NetworkAnalyzer._estimateRTTByOriginViaTCPTiming(records);
+    if(!estimatesByOrigin.size||forceCoarseEstimates){
+    estimatesByOrigin=new Map();
+    const estimatesViaDownload=NetworkAnalyzer._estimateRTTByOriginViaDownloadTiming(records);
+    const estimatesViaSendStart=NetworkAnalyzer._estimateRTTByOriginViaSendStartTiming(records);
+    const estimatesViaTTFB=NetworkAnalyzer._estimateRTTByOriginViaHeadersEndTiming(records);
+    
+    for(const[origin,estimates]of estimatesViaDownload.entries()){
+    if(!useDownloadEstimates)continue;
+    estimatesByOrigin.set(origin,estimates);
+    }
+    
+    for(const[origin,estimates]of estimatesViaSendStart.entries()){
+    if(!useSendStartEstimates)continue;
+    const existing=estimatesByOrigin.get(origin)||[];
+    estimatesByOrigin.set(origin,existing.concat(estimates));
+    }
+    
+    for(const[origin,estimates]of estimatesViaTTFB.entries()){
+    if(!useHeadersEndEstimates)continue;
+    const existing=estimatesByOrigin.get(origin)||[];
+    estimatesByOrigin.set(origin,existing.concat(estimates));
+    }
+    
+    for(const estimates of estimatesByOrigin.values()){
+    estimates.forEach((x,i)=>estimates[i]=x*coarseEstimateMultiplier);
+    }
+    }
+    
+    if(!estimatesByOrigin.size)throw new Error('No timing information available');
+    return NetworkAnalyzer.summarize(estimatesByOrigin);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static estimateServerResponseTimeByOrigin(records,options){
+    let rttByOrigin=(options||{}).rttByOrigin;
+    if(!rttByOrigin){
+    
+    rttByOrigin=new Map();
+    
+    const rttSummaryByOrigin=NetworkAnalyzer.estimateRTTByOrigin(records,options);
+    for(const[origin,summary]of rttSummaryByOrigin.entries()){
+    rttByOrigin.set(origin,summary.min);
+    }
+    }
+    
+    const estimatesByOrigin=NetworkAnalyzer._estimateResponseTimeByOrigin(records,rttByOrigin);
+    return NetworkAnalyzer.summarize(estimatesByOrigin);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static estimateThroughput(networkRecords){
+    let totalBytes=0;
+    
+    
+    
+    
+    const timeBoundaries=networkRecords.reduce((boundaries,record)=>{
+    const scheme=record.parsedURL&&record.parsedURL.scheme;
+    
+    
+    if(scheme==='data'||record.failed||!record.finished||
+    record.statusCode>300||!record.transferSize){
+    return boundaries;
+    }
+    
+    
+    totalBytes+=record.transferSize;
+    boundaries.push({time:record.responseReceivedTime,isStart:true});
+    boundaries.push({time:record.endTime,isStart:false});
+    return boundaries;
+    },[]).sort((a,b)=>a.time-b.time);
+    
+    if(!timeBoundaries.length){
+    return Infinity;
+    }
+    
+    let inflight=0;
+    let currentStart=0;
+    let totalDuration=0;
+    
+    timeBoundaries.forEach(boundary=>{
+    if(boundary.isStart){
+    if(inflight===0){
+    
+    currentStart=boundary.time;
+    }
+    inflight++;
+    }else{
+    inflight--;
+    if(inflight===0){
+    
+    totalDuration+=boundary.time-currentStart;
+    }
+    }
+    });
+    
+    return totalBytes*8/totalDuration;
+    }
+    
+    
+    
+    
+    
+    
+    static findMainDocument(records,finalURL){
+    
+    if(finalURL){
+    
+    const mainResource=records.find(request=>finalURL.startsWith(request.url)&&
+    URL.equalWithExcludedFragments(request.url,finalURL));
+    if(mainResource)return mainResource;
+    
+    }
+    
+    const documentRequests=records.filter(record=>record.resourceType===
+    NetworkRequest.TYPES.Document);
+    if(!documentRequests.length)throw new Error('Unable to identify the main resource');
+    
+    return documentRequests.reduce((min,r)=>r.startTime<min.startTime?r:min);
+    }}
+    
+    
+    module.exports=NetworkAnalyzer;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    },{"../../network-request.js":75,"../../url-shim.js":"url"}],63:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const BaseNode=require('../base-node.js');
+    const TcpConnection=require('./tcp-connection.js');
+    const ConnectionPool=require('./connection-pool.js');
+    const DNSCache=require('./dns-cache.js');
+    const mobileSlow4G=require('../../../config/constants.js').throttling.mobileSlow4G;
+    
+    
+    
+    
+    
+    
+    const DEFAULT_MAXIMUM_CONCURRENT_REQUESTS=10;
+    
+    const DEFAULT_LAYOUT_TASK_MULTIPLIER=0.5;
+    
+    const DEFAULT_MAXIMUM_CPU_TASK_DURATION=10000;
+    
+    const NodeState={
+    NotReadyToStart:0,
+    ReadyToStart:1,
+    InProgress:2,
+    Complete:3};
+    
+    
+    
+    const ALL_SIMULATION_NODE_TIMINGS=new Map();
+    
+    class Simulator{
+    
+    
+    
+    constructor(options){
+    
+    this._options=Object.assign(
+    {
+    rtt:mobileSlow4G.rttMs,
+    throughput:mobileSlow4G.throughputKbps*1024,
+    maximumConcurrentRequests:DEFAULT_MAXIMUM_CONCURRENT_REQUESTS,
+    cpuSlowdownMultiplier:mobileSlow4G.cpuSlowdownMultiplier,
+    layoutTaskMultiplier:DEFAULT_LAYOUT_TASK_MULTIPLIER,
+    additionalRttByOrigin:new Map(),
+    serverResponseTimeByOrigin:new Map()},
+    
+    options);
+    
+    
+    this._rtt=this._options.rtt;
+    this._throughput=this._options.throughput;
+    this._maximumConcurrentRequests=Math.max(Math.min(
+    TcpConnection.maximumSaturatedConnections(this._rtt,this._throughput),
+    this._options.maximumConcurrentRequests),
+    1);
+    this._cpuSlowdownMultiplier=this._options.cpuSlowdownMultiplier;
+    this._layoutTaskMultiplier=this._cpuSlowdownMultiplier*this._options.layoutTaskMultiplier;
+    
+    this._cachedNodeListByStartTime=[];
+    
+    
+    this._flexibleOrdering=false;
+    
+    this._nodeTimings=new Map();
+    
+    this._numberInProgressByType=new Map();
+    
+    this._nodes={};
+    this._dns=new DNSCache({rtt:this._rtt});
+    
+    this._connectionPool=null;
+    }
+    
+    
+    get rtt(){
+    return this._rtt;
+    }
+    
+    
+    
+    
+    _initializeConnectionPool(graph){
+    
+    const records=[];
+    graph.getRootNode().traverse(node=>{
+    if(node.type===BaseNode.TYPES.NETWORK){
+    records.push(node.record);
+    }
+    });
+    
+    this._connectionPool=new ConnectionPool(records,this._options);
+    }
+    
+    
+    
+    
+    _initializeAuxiliaryData(){
+    this._nodeTimings=new Map();
+    this._numberInProgressByType=new Map();
+    
+    this._nodes={};
+    this._cachedNodeListByStartTime=[];
+    
+    
+    for(const state of Object.values(NodeState)){
+    this._nodes[state]=new Set();
+    }
+    }
+    
+    
+    
+    
+    
+    _numberInProgress(type){
+    return this._numberInProgressByType.get(type)||0;
+    }
+    
+    
+    
+    
+    
+    _setTimingData(node,values){
+    const timingData=this._nodeTimings.get(node)||{};
+    Object.assign(timingData,values);
+    this._nodeTimings.set(node,timingData);
+    }
+    
+    
+    
+    
+    
+    _getTimingData(node){
+    const timingData=this._nodeTimings.get(node);
+    if(!timingData)throw new Error(`Unable to get timing data for node ${node.id}`);
+    return timingData;
+    }
+    
+    
+    
+    
+    
+    _markNodeAsReadyToStart(node,queuedTime){
+    const firstNodeIndexWithGreaterStartTime=this._cachedNodeListByStartTime.
+    findIndex(candidate=>candidate.startTime>node.startTime);
+    const insertionIndex=firstNodeIndexWithGreaterStartTime===-1?
+    this._cachedNodeListByStartTime.length:firstNodeIndexWithGreaterStartTime;
+    this._cachedNodeListByStartTime.splice(insertionIndex,0,node);
+    
+    this._nodes[NodeState.ReadyToStart].add(node);
+    this._nodes[NodeState.NotReadyToStart].delete(node);
+    this._setTimingData(node,{queuedTime});
+    }
+    
+    
+    
+    
+    
+    _markNodeAsInProgress(node,startTime){
+    const indexOfNodeToStart=this._cachedNodeListByStartTime.indexOf(node);
+    this._cachedNodeListByStartTime.splice(indexOfNodeToStart,1);
+    
+    this._nodes[NodeState.InProgress].add(node);
+    this._nodes[NodeState.ReadyToStart].delete(node);
+    this._numberInProgressByType.set(node.type,this._numberInProgress(node.type)+1);
+    this._setTimingData(node,{startTime});
+    }
+    
+    
+    
+    
+    
+    _markNodeAsComplete(node,endTime){
+    this._nodes[NodeState.Complete].add(node);
+    this._nodes[NodeState.InProgress].delete(node);
+    this._numberInProgressByType.set(node.type,this._numberInProgress(node.type)-1);
+    this._setTimingData(node,{endTime});
+    
+    
+    for(const dependent of node.getDependents()){
+    
+    const dependencies=dependent.getDependencies();
+    if(dependencies.some(dep=>!this._nodes[NodeState.Complete].has(dep)))continue;
+    
+    
+    this._markNodeAsReadyToStart(dependent,endTime);
+    }
+    }
+    
+    
+    
+    
+    
+    _acquireConnection(record){
+    return this._connectionPool.acquire(record,{
+    ignoreConnectionReused:this._flexibleOrdering});
+    
+    }
+    
+    
+    
+    
+    _getNodesSortedByStartTime(){
+    
+    return Array.from(this._cachedNodeListByStartTime);
+    }
+    
+    
+    
+    
+    
+    _startNodeIfPossible(node,totalElapsedTime){
+    if(node.type===BaseNode.TYPES.CPU){
+    
+    if(this._numberInProgress(node.type)===0){
+    this._markNodeAsInProgress(node,totalElapsedTime);
+    this._setTimingData(node,{timeElapsed:0});
+    }
+    
+    return;
+    }
+    
+    if(node.type!==BaseNode.TYPES.NETWORK)throw new Error('Unsupported');
+    
+    
+    if(!node.fromDiskCache){
+    
+    const numberOfActiveRequests=this._numberInProgress(node.type);
+    if(numberOfActiveRequests>=this._maximumConcurrentRequests)return;
+    const connection=this._acquireConnection(node.record);
+    if(!connection)return;
+    }
+    
+    this._markNodeAsInProgress(node,totalElapsedTime);
+    this._setTimingData(node,{
+    timeElapsed:0,
+    timeElapsedOvershoot:0,
+    bytesDownloaded:0});
+    
+    }
+    
+    
+    
+    
+    
+    _updateNetworkCapacity(){
+    for(const connection of this._connectionPool.connectionsInUse()){
+    connection.setThroughput(this._throughput/this._nodes[NodeState.InProgress].size);
+    }
+    }
+    
+    
+    
+    
+    
+    
+    _estimateTimeRemaining(node){
+    if(node.type===BaseNode.TYPES.CPU){
+    return this._estimateCPUTimeRemaining(node);
+    }else if(node.type===BaseNode.TYPES.NETWORK){
+    return this._estimateNetworkTimeRemaining(node);
+    }else{
+    throw new Error('Unsupported');
+    }
+    }
+    
+    
+    
+    
+    
+    _estimateCPUTimeRemaining(cpuNode){
+    const timingData=this._getTimingData(cpuNode);
+    const multiplier=cpuNode.didPerformLayout()?
+    this._layoutTaskMultiplier:
+    this._cpuSlowdownMultiplier;
+    const totalDuration=Math.min(
+    Math.round(cpuNode.event.dur/1000*multiplier),
+    DEFAULT_MAXIMUM_CPU_TASK_DURATION);
+    
+    const estimatedTimeElapsed=totalDuration-timingData.timeElapsed;
+    this._setTimingData(cpuNode,{estimatedTimeElapsed});
+    return estimatedTimeElapsed;
+    }
+    
+    
+    
+    
+    
+    _estimateNetworkTimeRemaining(networkNode){
+    const record=networkNode.record;
+    const timingData=this._getTimingData(networkNode);
+    
+    let timeElapsed=0;
+    if(networkNode.fromDiskCache){
+    
+    
+    const sizeInMb=(record.resourceSize||0)/1024/1024;
+    timeElapsed=8+20*sizeInMb-timingData.timeElapsed;
+    }else{
+    const connection=this._connectionPool.acquireActiveConnectionFromRecord(record);
+    const dnsResolutionTime=this._dns.getTimeUntilResolution(record,{
+    requestedAt:timingData.startTime,
+    shouldUpdateCache:true});
+    
+    const timeAlreadyElapsed=timingData.timeElapsed;
+    const calculation=connection.simulateDownloadUntil(
+    record.transferSize-timingData.bytesDownloaded,
+    {timeAlreadyElapsed,dnsResolutionTime,maximumTimeToElapse:Infinity});
+    
+    
+    timeElapsed=calculation.timeElapsed;
+    }
+    
+    const estimatedTimeElapsed=timeElapsed+timingData.timeElapsedOvershoot;
+    this._setTimingData(networkNode,{estimatedTimeElapsed});
+    return estimatedTimeElapsed;
+    }
+    
+    
+    
+    
+    
+    _findNextNodeCompletionTime(){
+    let minimumTime=Infinity;
+    for(const node of this._nodes[NodeState.InProgress]){
+    minimumTime=Math.min(minimumTime,this._estimateTimeRemaining(node));
+    }
+    
+    return minimumTime;
+    }
+    
+    
+    
+    
+    
+    
+    
+    _updateProgressMadeInTimePeriod(node,timePeriodLength,totalElapsedTime){
+    const timingData=this._getTimingData(node);
+    const isFinished=timingData.estimatedTimeElapsed===timePeriodLength;
+    
+    if(node.type===BaseNode.TYPES.CPU||node.fromDiskCache){
+    return isFinished?
+    this._markNodeAsComplete(node,totalElapsedTime):
+    timingData.timeElapsed+=timePeriodLength;
+    }
+    
+    if(node.type!==BaseNode.TYPES.NETWORK)throw new Error('Unsupported');
+    
+    const record=node.record;
+    const connection=this._connectionPool.acquireActiveConnectionFromRecord(record);
+    const dnsResolutionTime=this._dns.getTimeUntilResolution(record,{
+    requestedAt:timingData.startTime,
+    shouldUpdateCache:true});
+    
+    const calculation=connection.simulateDownloadUntil(
+    record.transferSize-timingData.bytesDownloaded,
+    {
+    dnsResolutionTime,
+    timeAlreadyElapsed:timingData.timeElapsed,
+    maximumTimeToElapse:timePeriodLength-timingData.timeElapsedOvershoot});
+    
+    
+    
+    connection.setCongestionWindow(calculation.congestionWindow);
+    connection.setH2OverflowBytesDownloaded(calculation.extraBytesDownloaded);
+    
+    if(isFinished){
+    connection.setWarmed(true);
+    this._connectionPool.release(record);
+    this._markNodeAsComplete(node,totalElapsedTime);
+    }else{
+    timingData.timeElapsed+=calculation.timeElapsed;
+    timingData.timeElapsedOvershoot+=calculation.timeElapsed-timePeriodLength;
+    timingData.bytesDownloaded+=calculation.bytesDownloaded;
+    }
+    }
+    
+    
+    
+    
+    _computeFinalNodeTimings(){
+    
+    const nodeTimingEntries=[];
+    for(const[node,timing]of this._nodeTimings){
+    nodeTimingEntries.push([node,{
+    startTime:timing.startTime,
+    endTime:timing.endTime,
+    duration:timing.endTime-timing.startTime}]);
+    
+    }
+    
+    
+    nodeTimingEntries.sort((a,b)=>a[1].startTime-b[1].startTime);
+    return new Map(nodeTimingEntries);
+    }
+    
+    
+    
+    
+    getOptions(){
+    return this._options;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    simulate(graph,options){
+    if(BaseNode.hasCycle(graph)){
+    throw new Error('Cannot simulate graph with cycle');
+    }
+    
+    options=Object.assign({
+    label:undefined,
+    flexibleOrdering:false},
+    options);
+    
+    
+    this._flexibleOrdering=!!options.flexibleOrdering;
+    this._dns=new DNSCache({rtt:this._rtt});
+    this._initializeConnectionPool(graph);
+    this._initializeAuxiliaryData();
+    
+    const nodesNotReadyToStart=this._nodes[NodeState.NotReadyToStart];
+    const nodesReadyToStart=this._nodes[NodeState.ReadyToStart];
+    const nodesInProgress=this._nodes[NodeState.InProgress];
+    
+    const rootNode=graph.getRootNode();
+    rootNode.traverse(node=>nodesNotReadyToStart.add(node));
+    let totalElapsedTime=0;
+    let iteration=0;
+    
+    
+    this._markNodeAsReadyToStart(rootNode,totalElapsedTime);
+    
+    
+    while(nodesReadyToStart.size||nodesInProgress.size){
+    
+    for(const node of this._getNodesSortedByStartTime()){
+    this._startNodeIfPossible(node,totalElapsedTime);
+    }
+    
+    if(!nodesInProgress.size){
+    
+    
+    if(this._flexibleOrdering)throw new Error('Failed to start a node');
+    this._flexibleOrdering=true;
+    continue;
+    }
+    
+    
+    this._updateNetworkCapacity();
+    
+    
+    const minimumTime=this._findNextNodeCompletionTime();
+    totalElapsedTime+=minimumTime;
+    
+    
+    if(!Number.isFinite(minimumTime)||iteration>100000){
+    throw new Error('Graph creation failed, depth exceeded');
+    }
+    
+    iteration++;
+    
+    for(const node of nodesInProgress){
+    this._updateProgressMadeInTimePeriod(node,minimumTime,totalElapsedTime);
+    }
+    }
+    
+    const nodeTimings=this._computeFinalNodeTimings();
+    ALL_SIMULATION_NODE_TIMINGS.set(options.label||'unlabeled',nodeTimings);
+    
+    return{
+    timeInMs:totalElapsedTime,
+    nodeTimings};
+    
+    }
+    
+    
+    static get ALL_NODE_TIMINGS(){
+    return ALL_SIMULATION_NODE_TIMINGS;
+    }}
+    
+    
+    module.exports=Simulator;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    },{"../../../config/constants.js":46,"../base-node.js":57,"./connection-pool.js":60,"./dns-cache.js":61,"./tcp-connection.js":64}],64:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const INITIAL_CONGESTION_WINDOW=10;
+    const TCP_SEGMENT_SIZE=1460;
+    
+    class TcpConnection{
+    
+    
+    
+    
+    
+    
+    
+    constructor(rtt,throughput,serverLatency=0,ssl=true,h2=false){
+    this._warmed=false;
+    this._ssl=ssl;
+    this._h2=h2;
+    this._rtt=rtt;
+    this._throughput=throughput;
+    this._serverLatency=serverLatency;
+    this._congestionWindow=INITIAL_CONGESTION_WINDOW;
+    this._h2OverflowBytesDownloaded=0;
+    }
+    
+    
+    
+    
+    
+    
+    static maximumSaturatedConnections(rtt,availableThroughput){
+    const roundTripsPerSecond=1000/rtt;
+    const bytesPerRoundTrip=TCP_SEGMENT_SIZE;
+    const bytesPerSecond=roundTripsPerSecond*bytesPerRoundTrip;
+    const minimumThroughputRequiredPerRequest=bytesPerSecond*8;
+    return Math.floor(availableThroughput/minimumThroughputRequiredPerRequest);
+    }
+    
+    
+    
+    
+    _computeMaximumCongestionWindowInSegments(){
+    const bytesPerSecond=this._throughput/8;
+    const secondsPerRoundTrip=this._rtt/1000;
+    const bytesPerRoundTrip=bytesPerSecond*secondsPerRoundTrip;
+    return Math.floor(bytesPerRoundTrip/TCP_SEGMENT_SIZE);
+    }
+    
+    
+    
+    
+    setThroughput(throughput){
+    this._throughput=throughput;
+    }
+    
+    
+    
+    
+    setCongestionWindow(congestion){
+    this._congestionWindow=congestion;
+    }
+    
+    
+    
+    
+    setWarmed(warmed){
+    this._warmed=warmed;
+    }
+    
+    
+    
+    
+    isWarm(){
+    return this._warmed;
+    }
+    
+    
+    
+    
+    isH2(){
+    return this._h2;
+    }
+    
+    
+    
+    
+    get congestionWindow(){
+    return this._congestionWindow;
+    }
+    
+    
+    
+    
+    
+    
+    setH2OverflowBytesDownloaded(bytes){
+    if(!this._h2)return;
+    this._h2OverflowBytesDownloaded=bytes;
+    }
+    
+    
+    
+    
+    clone(){
+    return Object.assign(new TcpConnection(this._rtt,this._throughput),this);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    simulateDownloadUntil(bytesToDownload,options){
+    const{timeAlreadyElapsed=0,maximumTimeToElapse=Infinity,dnsResolutionTime=0}=
+    options||{};
+    
+    if(this._warmed&&this._h2){
+    bytesToDownload-=this._h2OverflowBytesDownloaded;
+    }
+    const twoWayLatency=this._rtt;
+    const oneWayLatency=twoWayLatency/2;
+    const maximumCongestionWindow=this._computeMaximumCongestionWindowInSegments();
+    
+    let handshakeAndRequest=oneWayLatency;
+    if(!this._warmed){
+    handshakeAndRequest=
+    
+    dnsResolutionTime+
+    
+    oneWayLatency+
+    
+    oneWayLatency+
+    
+    oneWayLatency+(
+    
+    this._ssl?twoWayLatency:0);
+    }
+    
+    let roundTrips=Math.ceil(handshakeAndRequest/twoWayLatency);
+    let timeToFirstByte=handshakeAndRequest+this._serverLatency+oneWayLatency;
+    if(this._warmed&&this._h2)timeToFirstByte=0;
+    
+    const timeElapsedForTTFB=Math.max(timeToFirstByte-timeAlreadyElapsed,0);
+    const maximumDownloadTimeToElapse=maximumTimeToElapse-timeElapsedForTTFB;
+    
+    let congestionWindow=Math.min(this._congestionWindow,maximumCongestionWindow);
+    let totalBytesDownloaded=0;
+    if(timeElapsedForTTFB>0){
+    totalBytesDownloaded=congestionWindow*TCP_SEGMENT_SIZE;
+    }else{
+    roundTrips=0;
+    }
+    
+    let downloadTimeElapsed=0;
+    let bytesRemaining=bytesToDownload-totalBytesDownloaded;
+    while(bytesRemaining>0&&downloadTimeElapsed<=maximumDownloadTimeToElapse){
+    roundTrips++;
+    downloadTimeElapsed+=twoWayLatency;
+    congestionWindow=Math.max(Math.min(maximumCongestionWindow,congestionWindow*2),1);
+    
+    const bytesDownloadedInWindow=congestionWindow*TCP_SEGMENT_SIZE;
+    totalBytesDownloaded+=bytesDownloadedInWindow;
+    bytesRemaining-=bytesDownloadedInWindow;
+    }
+    
+    const timeElapsed=timeElapsedForTTFB+downloadTimeElapsed;
+    const extraBytesDownloaded=this._h2?Math.max(totalBytesDownloaded-bytesToDownload,0):0;
+    const bytesDownloaded=Math.max(Math.min(totalBytesDownloaded,bytesToDownload),0);
+    
+    return{
+    roundTrips,
+    timeElapsed,
+    bytesDownloaded,
+    extraBytesDownloaded,
+    congestionWindow};
+    
+    }}
+    
+    
+    module.exports=TcpConnection;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    },{}],65:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    const NEXUS5X_EMULATION_METRICS={
+    mobile:true,
+    screenWidth:412,
+    screenHeight:660,
+    width:412,
+    height:660,
+    positionX:0,
+    positionY:0,
+    scale:1,
+    deviceScaleFactor:2.625,
+    screenOrientation:{
+    angle:0,
+    type:'portraitPrimary'}};
+    
+    
+    
+    
+    
+    
+    
+    const DESKTOP_EMULATION_METRICS={
+    mobile:false,
+    width:1350,
+    height:940,
+    deviceScaleFactor:1};
+    
+    
+    
+    const NEXUS5X_USERAGENT='Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3694.0 Mobile Safari/537.36 Chrome-Lighthouse';
+    
+    const DESKTOP_USERAGENT='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3694.0 Safari/537.36 Chrome-Lighthouse';
+    
+    const OFFLINE_METRICS={
+    offline:true,
+    
+    latency:0,
+    downloadThroughput:0,
+    uploadThroughput:0};
+    
+    
+    const NO_THROTTLING_METRICS={
+    latency:0,
+    downloadThroughput:0,
+    uploadThroughput:0,
+    offline:false};
+    
+    
+    const NO_CPU_THROTTLE_METRICS={
+    rate:1};
+    
+    
+    const emulationParams={
+    mobile:{
+    userAgent:NEXUS5X_USERAGENT,
+    metrics:NEXUS5X_EMULATION_METRICS,
+    touchEnabled:true},
+    
+    desktop:{
+    userAgent:DESKTOP_USERAGENT,
+    metrics:DESKTOP_EMULATION_METRICS,
+    touchEnabled:false}};
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    async function emulate(driver,settings){
+    if(!settings.emulatedFormFactor||settings.emulatedFormFactor==='none')return;
+    const params=emulationParams[settings.emulatedFormFactor];
+    
+    
+    
+    
+    
+    
+    await driver.sendCommand('Network.enable');
+    await driver.sendCommand('Network.setUserAgentOverride',{userAgent:params.userAgent});
+    
+    if(!settings.internalDisableDeviceScreenEmulation){
+    await driver.sendCommand('Emulation.setDeviceMetricsOverride',params.metrics);
+    await driver.sendCommand('Emulation.setTouchEmulationEnabled',{enabled:params.touchEnabled});
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    function enableNetworkThrottling(driver,throttlingSettings){
+    
+    const conditions={
+    offline:false,
+    latency:throttlingSettings.requestLatencyMs||0,
+    downloadThroughput:throttlingSettings.downloadThroughputKbps||0,
+    uploadThroughput:throttlingSettings.uploadThroughputKbps||0};
+    
+    
+    
+    conditions.downloadThroughput=Math.floor(conditions.downloadThroughput*1024/8);
+    conditions.uploadThroughput=Math.floor(conditions.uploadThroughput*1024/8);
+    return driver.sendCommand('Network.emulateNetworkConditions',conditions);
+    }
+    
+    
+    
+    
+    
+    function clearAllNetworkEmulation(driver){
+    return driver.sendCommand('Network.emulateNetworkConditions',NO_THROTTLING_METRICS);
+    }
+    
+    
+    
+    
+    
+    function goOffline(driver){
+    return driver.sendCommand('Network.emulateNetworkConditions',OFFLINE_METRICS);
+    }
+    
+    
+    
+    
+    
+    
+    function enableCPUThrottling(driver,throttlingSettings){
+    const rate=throttlingSettings.cpuSlowdownMultiplier;
+    return driver.sendCommand('Emulation.setCPUThrottlingRate',{rate});
+    }
+    
+    
+    
+    
+    
+    function disableCPUThrottling(driver){
+    return driver.sendCommand('Emulation.setCPUThrottlingRate',NO_CPU_THROTTLE_METRICS);
+    }
+    
+    module.exports={
+    emulate,
+    enableNetworkThrottling,
+    clearAllNetworkEmulation,
+    enableCPUThrottling,
+    disableCPUThrottling,
+    goOffline,
+    MOBILE_USERAGENT:NEXUS5X_USERAGENT,
+    DESKTOP_USERAGENT};
+    
+    
+    },{}],66:[function(require,module,exports){
+    (function(__filename,__dirname){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const path=require('path');
+    const isDeepEqual=require('lodash.isequal');
+    const log=require('lighthouse-logger');
+    const MessageFormat=require('intl-messageformat').default;
+    const lookupClosestLocale=require('lookup-closest-locale');
+    const LOCALES=require('./locales.js');
+    
+    
+    
+    
+    const LH_ROOT=path.join(__dirname,'../../../');
+    const MESSAGE_INSTANCE_ID_REGEX=/(.* \| .*) # (\d+)$/;
+    
+    const MESSAGE_INSTANCE_ID_QUICK_REGEX=/ # \d+$/;
+    
+    (()=>{
+    
+    
+    
+    
+    
+    require('intl-pluralrules');
+    
+    
+    const IntlPolyfill=require('intl');
+    
+    
+    if(!IntlPolyfill.NumberFormat)return;
+    
+    
+    const minimumLocales=['en','es','ru','zh'];
+    const supportedLocales=Intl.NumberFormat.supportedLocalesOf(minimumLocales);
+    
+    if(supportedLocales.length!==minimumLocales.length){
+    Intl.NumberFormat=IntlPolyfill.NumberFormat;
+    Intl.DateTimeFormat=IntlPolyfill.DateTimeFormat;
+    }
+    })();
+    
+    
+    const UIStrings={
+    
+    ms:'{timeInMs, number, milliseconds}\xa0ms',
+    
+    seconds:'{timeInMs, number, seconds}\xa0s',
+    
+    displayValueByteSavings:'Potential savings of {wastedBytes, number, bytes}\xa0KB',
+    
+    displayValueMsSavings:'Potential savings of {wastedMs, number, milliseconds}\xa0ms',
+    
+    columnURL:'URL',
+    
+    columnSize:'Size',
+    
+    columnCacheTTL:'Cache TTL',
+    
+    columnWastedBytes:'Potential Savings',
+    
+    columnWastedMs:'Potential Savings',
+    
+    columnTimeSpent:'Time Spent',
+    
+    columnLocation:'Location',
+    
+    columnResourceType:'Resource Type',
+    
+    columnRequests:'Requests',
+    
+    columnTransferSize:'Transfer Size',
+    
+    columnName:'Name',
+    
+    totalResourceType:'Total',
+    
+    documentResourceType:'Document',
+    
+    scriptResourceType:'Script',
+    
+    stylesheetResourceType:'Stylesheet',
+    
+    imageResourceType:'Image',
+    
+    mediaResourceType:'Media',
+    
+    fontResourceType:'Font',
+    
+    otherResourceType:'Other',
+    
+    thirdPartyResourceType:'Third-party'};
+    
+    
+    const formats={
+    number:{
+    bytes:{
+    maximumFractionDigits:0},
+    
+    milliseconds:{
+    maximumFractionDigits:0},
+    
+    seconds:{
+    
+    minimumFractionDigits:1,
+    maximumFractionDigits:1},
+    
+    extendedPercent:{
+    
+    maximumFractionDigits:2,
+    style:'percent'}}};
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function lookupLocale(locale){
+    
+    const canonicalLocale=Intl.getCanonicalLocales(locale)[0];
+    
+    const closestLocale=lookupClosestLocale(canonicalLocale,LOCALES);
+    return closestLocale||'en';
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function collectAllCustomElementsFromICU(icuElements,seenElementsById=new Map()){
+    for(const el of icuElements){
+    
+    if(el.type!=='argumentElement')continue;
+    
+    seenElementsById.set(el.id,el);
+    
+    
+    if(!el.format||el.format.type!=='pluralFormat')continue;
+    
+    for(const option of el.format.options){
+    
+    collectAllCustomElementsFromICU(option.value.elements,seenElementsById);
+    }
+    }
+    
+    return seenElementsById;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function _preformatValues(icuMessage,messageFormatter,values){
+    const elementMap=collectAllCustomElementsFromICU(messageFormatter.getAst().elements);
+    const argumentElements=[...elementMap.values()];
+    
+    
+    const formattedValues={};
+    
+    for(const{id,format}of argumentElements){
+    
+    if(id&&id in values===false){
+    throw new Error(`ICU Message "${icuMessage}" contains a value reference ("${id}") `+
+    `that wasn't provided`);
+    }
+    
+    const value=values[id];
+    
+    
+    if(!format||format.type!=='numberFormat'){
+    formattedValues[id]=value;
+    continue;
+    }
+    
+    if(typeof value!=='number'){
+    throw new Error(`ICU Message "${icuMessage}" contains a numeric reference ("${id}") `+
+    'but provided value was not a number');
+    }
+    
+    
+    if(format.style==='milliseconds'){
+    
+    formattedValues[id]=Math.round(value/10)*10;
+    }else if(format.style==='seconds'&&id==='timeInMs'){
+    
+    formattedValues[id]=Math.round(value/100)/10;
+    }else if(format.style==='bytes'){
+    
+    formattedValues[id]=value/1024;
+    }else{
+    
+    formattedValues[id]=value;
+    }
+    }
+    
+    
+    for(const valueId of Object.keys(values)){
+    if(valueId in formattedValues)continue;
+    
+    
+    if(valueId==='errorCode'){
+    formattedValues.errorCode=values.errorCode;
+    continue;
+    }
+    
+    throw new Error(`Provided value "${valueId}" does not match any placeholder in `+
+    `ICU message "${icuMessage}"`);
+    }
+    
+    return formattedValues;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const _icuMessageInstanceMap=new Map();
+    
+    const _ICUMsgNotFoundMsg='ICU message not found in destination locale';
+    
+    
+    
+    
+    
+    
+    
+    
+    function _formatIcuMessage(locale,icuMessageId,uiStringMessage,values={}){
+    const localeMessages=LOCALES[locale];
+    if(!localeMessages)throw new Error(`Unsupported locale '${locale}'`);
+    let localeMessage=localeMessages[icuMessageId]&&localeMessages[icuMessageId].message;
+    
+    
+    
+    if(!localeMessage&&uiStringMessage){
+    
+    localeMessage=uiStringMessage;
+    
+    
+    if(!LOCALES.en[icuMessageId]||localeMessage!==LOCALES.en[icuMessageId].message){
+    log.verbose('i18n',`Message "${icuMessageId}" does not match its 'en' counterpart. `+
+    `Run 'i18n' to update.`);
+    }
+    }
+    
+    if(!localeMessage){
+    throw new Error(_ICUMsgNotFoundMsg);
+    }
+    
+    
+    const localeForMessageFormat=locale==='en-XA'||locale==='en-XL'?'de-DE':locale;
+    
+    const formatter=new MessageFormat(localeMessage,localeForMessageFormat,formats);
+    
+    
+    const valuesForMessageFormat=_preformatValues(localeMessage,formatter,values);
+    
+    const formattedString=formatter.format(valuesForMessageFormat);
+    return{formattedString,icuMessage:localeMessage};
+    }
+    
+    
+    function _formatPathAsString(pathInLHR){
+    let pathAsString='';
+    for(const property of pathInLHR){
+    if(/^[a-z]+$/i.test(property)){
+    if(pathAsString.length)pathAsString+='.';
+    pathAsString+=property;
+    }else{
+    if(/]|"|'|\s/.test(property))throw new Error(`Cannot handle "${property}" in i18n`);
+    pathAsString+=`[${property}]`;
+    }
+    }
+    
+    return pathAsString;
+    }
+    
+    
+    
+    
+    
+    function getRendererFormattedStrings(locale){
+    const localeMessages=LOCALES[locale];
+    if(!localeMessages)throw new Error(`Unsupported locale '${locale}'`);
+    
+    const icuMessageIds=Object.keys(localeMessages).filter(f=>f.includes('core/report/html/'));
+    
+    const strings={};
+    for(const icuMessageId of icuMessageIds){
+    const[filename,varName]=icuMessageId.split(' | ');
+    if(!filename.endsWith('util.js'))throw new Error(`Unexpected message: ${icuMessageId}`);
+    strings[varName]=localeMessages[icuMessageId].message;
+    }
+    
+    return strings;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function createMessageInstanceIdFn(filename,fileStrings){
+    
+    const mergedStrings={...UIStrings,...fileStrings};
+    
+    
+    
+    
+    
+    
+    
+    
+    const getMessageInstanceIdFn=(icuMessage,values)=>{
+    const keyname=Object.keys(mergedStrings).find(key=>mergedStrings[key]===icuMessage);
+    if(!keyname)throw new Error(`Could not locate: ${icuMessage}`);
+    
+    const filenameToLookup=keyname in fileStrings?filename:__filename;
+    const unixStyleFilename=path.relative(LH_ROOT,filenameToLookup).replace(/\\/g,'/');
+    const icuMessageId=`${unixStyleFilename} | ${keyname}`;
+    const icuMessageInstances=_icuMessageInstanceMap.get(icuMessageId)||[];
+    
+    let indexOfInstance=icuMessageInstances.findIndex(inst=>isDeepEqual(inst.values,values));
+    if(indexOfInstance===-1){
+    icuMessageInstances.push({icuMessageId,icuMessage,values});
+    indexOfInstance=icuMessageInstances.length-1;
+    }
+    
+    _icuMessageInstanceMap.set(icuMessageId,icuMessageInstances);
+    
+    return`${icuMessageId} # ${indexOfInstance}`;
+    };
+    
+    return getMessageInstanceIdFn;
+    }
+    
+    
+    
+    
+    
+    
+    function isIcuMessage(icuMessageIdOrRawString){
+    return MESSAGE_INSTANCE_ID_QUICK_REGEX.test(icuMessageIdOrRawString)&&
+    MESSAGE_INSTANCE_ID_REGEX.test(icuMessageIdOrRawString);
+    }
+    
+    
+    
+    
+    
+    
+    function getFormatted(icuMessageIdOrRawString,locale){
+    if(isIcuMessage(icuMessageIdOrRawString)){
+    return _resolveIcuMessageInstanceId(icuMessageIdOrRawString,locale).formattedString;
+    }
+    
+    return icuMessageIdOrRawString;
+    }
+    
+    
+    
+    
+    
+    
+    
+    function getFormattedFromIdAndValues(locale,icuMessageId,values){
+    const icuMessageIdRegex=/(.* \| .*)$/;
+    if(!icuMessageIdRegex.test(icuMessageId))throw new Error('This is not an ICU message ID');
+    
+    const{formattedString}=_formatIcuMessage(locale,icuMessageId,undefined,values);
+    return formattedString;
+    }
+    
+    
+    
+    
+    
+    
+    function _resolveIcuMessageInstanceId(icuMessageInstanceId,locale){
+    const matches=icuMessageInstanceId.match(MESSAGE_INSTANCE_ID_REGEX);
+    if(!matches)throw new Error(`${icuMessageInstanceId} is not a valid message instance ID`);
+    
+    const[_,icuMessageId,icuMessageInstanceIndex]=matches;
+    const icuMessageInstances=_icuMessageInstanceMap.get(icuMessageId)||[];
+    const icuMessageInstance=icuMessageInstances[Number(icuMessageInstanceIndex)];
+    
+    const{formattedString}=_formatIcuMessage(locale,icuMessageId,
+    icuMessageInstance.icuMessage,icuMessageInstance.values);
+    
+    return{icuMessageInstance,formattedString};
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function replaceIcuMessageInstanceIds(inputObject,locale){
+    
+    
+    
+    
+    
+    function replaceInObject(subObject,icuMessagePaths,pathInLHR=[]){
+    if(typeof subObject!=='object'||!subObject)return;
+    
+    for(const[property,value]of Object.entries(subObject)){
+    const currentPathInLHR=pathInLHR.concat([property]);
+    
+    
+    if(typeof value==='string'&&isIcuMessage(value)){
+    const{icuMessageInstance,formattedString}=_resolveIcuMessageInstanceId(value,locale);
+    const messageInstancesInLHR=icuMessagePaths[icuMessageInstance.icuMessageId]||[];
+    const currentPathAsString=_formatPathAsString(currentPathInLHR);
+    
+    messageInstancesInLHR.push(
+    icuMessageInstance.values?
+    {values:icuMessageInstance.values,path:currentPathAsString}:
+    currentPathAsString);
+    
+    
+    subObject[property]=formattedString;
+    icuMessagePaths[icuMessageInstance.icuMessageId]=messageInstancesInLHR;
+    }else{
+    replaceInObject(value,icuMessagePaths,currentPathInLHR);
+    }
+    }
+    }
+    
+    
+    const icuMessagePaths={};
+    replaceInObject(inputObject,icuMessagePaths);
+    return icuMessagePaths;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function registerLocaleData(locale,lhlMessages){
+    LOCALES[locale]=lhlMessages;
+    }
+    
+    module.exports={
+    _formatPathAsString,
+    _ICUMsgNotFoundMsg,
+    UIStrings,
+    lookupLocale,
+    getRendererFormattedStrings,
+    createMessageInstanceIdFn,
+    getFormatted,
+    getFormattedFromIdAndValues,
+    replaceIcuMessageInstanceIds,
+    isIcuMessage,
+    collectAllCustomElementsFromICU,
+    registerLocaleData};
+    
+    
+    }).call(this,"/lighthouse-core/lib/i18n/i18n.js","/lighthouse-core/lib/i18n");
+    },{"./locales.js":67,"intl":101,"intl-messageformat":119,"intl-pluralrules":101,"lighthouse-logger":125,"lodash.isequal":142,"lookup-closest-locale":143,"path":156}],67:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const locales={
+    'en-US':require('./locales/en-US.json'),
+    'en':require('./locales/en-US.json'),
+    
+    
+    'en-AU':require('./locales/en-GB.json'),
+    'en-GB':require('./locales/en-GB.json'),
+    'en-IE':require('./locales/en-GB.json'),
+    'en-SG':require('./locales/en-GB.json'),
+    'en-ZA':require('./locales/en-GB.json'),
+    'en-IN':require('./locales/en-GB.json'),
+    
+    
+    'ar-XB':require('./locales/ar-XB.json'),
+    'ar':require('./locales/ar.json'),
+    'bg':require('./locales/bg.json'),
+    'bs':require('./locales/hr.json'),
+    'ca':require('./locales/ca.json'),
+    'cs':require('./locales/cs.json'),
+    'da':require('./locales/da.json'),
+    'de':require('./locales/de.json'),
+    'el':require('./locales/el.json'),
+    'en-XA':require('./locales/en-XA.json'),
+    'en-XL':require('./locales/en-XL.json'),
+    'es':require('./locales/es.json'),
+    'es-419':require('./locales/es-419.json'),
+    
+    'es-AR':require('./locales/es-419.json'),
+    'es-BO':require('./locales/es-419.json'),
+    'es-BR':require('./locales/es-419.json'),
+    'es-BZ':require('./locales/es-419.json'),
+    'es-CL':require('./locales/es-419.json'),
+    'es-CO':require('./locales/es-419.json'),
+    'es-CR':require('./locales/es-419.json'),
+    'es-CU':require('./locales/es-419.json'),
+    'es-DO':require('./locales/es-419.json'),
+    'es-EC':require('./locales/es-419.json'),
+    'es-GT':require('./locales/es-419.json'),
+    'es-HN':require('./locales/es-419.json'),
+    'es-MX':require('./locales/es-419.json'),
+    'es-NI':require('./locales/es-419.json'),
+    'es-PA':require('./locales/es-419.json'),
+    'es-PE':require('./locales/es-419.json'),
+    'es-PR':require('./locales/es-419.json'),
+    'es-PY':require('./locales/es-419.json'),
+    'es-SV':require('./locales/es-419.json'),
+    'es-US':require('./locales/es-419.json'),
+    'es-UY':require('./locales/es-419.json'),
+    'es-VE':require('./locales/es-419.json'),
+    
+    'fi':require('./locales/fi.json'),
+    'fil':require('./locales/fil.json'),
+    'fr':require('./locales/fr.json'),
+    'he':require('./locales/he.json'),
+    'hi':require('./locales/hi.json'),
+    'hr':require('./locales/hr.json'),
+    'hu':require('./locales/hu.json'),
+    'gsw':require('./locales/de.json'),
+    'id':require('./locales/id.json'),
+    'in':require('./locales/id.json'),
+    'it':require('./locales/it.json'),
+    'iw':require('./locales/he.json'),
+    'ja':require('./locales/ja.json'),
+    'ko':require('./locales/ko.json'),
+    'ln':require('./locales/fr.json'),
+    'lt':require('./locales/lt.json'),
+    'lv':require('./locales/lv.json'),
+    'mo':require('./locales/ro.json'),
+    'nl':require('./locales/nl.json'),
+    'nb':require('./locales/no.json'),
+    'no':require('./locales/no.json'),
+    'pl':require('./locales/pl.json'),
+    'pt':require('./locales/pt.json'),
+    'pt-PT':require('./locales/pt-PT.json'),
+    'ro':require('./locales/ro.json'),
+    'ru':require('./locales/ru.json'),
+    'sk':require('./locales/sk.json'),
+    'sl':require('./locales/sl.json'),
+    'sr':require('./locales/sr.json'),
+    'sr-Latn':require('./locales/sr-Latn.json'),
+    'sv':require('./locales/sv.json'),
+    'ta':require('./locales/ta.json'),
+    'te':require('./locales/te.json'),
+    'th':require('./locales/th.json'),
+    'tl':require('./locales/fil.json'),
+    'tr':require('./locales/tr.json'),
+    'uk':require('./locales/uk.json'),
+    'vi':require('./locales/vi.json'),
+    'zh':require('./locales/zh.json'),
+    'zh-HK':require('./locales/zh-HK.json'),
+    'zh-TW':require('./locales/zh-TW.json')};
+    
+    
+    module.exports=locales;
+    
+    },{"./locales/ar-XB.json":101,"./locales/ar.json":101,"./locales/bg.json":101,"./locales/ca.json":101,"./locales/cs.json":101,"./locales/da.json":101,"./locales/de.json":101,"./locales/el.json":101,"./locales/en-GB.json":101,"./locales/en-US.json":101,"./locales/en-XA.json":101,"./locales/en-XL.json":101,"./locales/es-419.json":101,"./locales/es.json":101,"./locales/fi.json":101,"./locales/fil.json":101,"./locales/fr.json":101,"./locales/he.json":101,"./locales/hi.json":101,"./locales/hr.json":101,"./locales/hu.json":101,"./locales/id.json":101,"./locales/it.json":101,"./locales/ja.json":101,"./locales/ko.json":101,"./locales/lt.json":101,"./locales/lv.json":101,"./locales/nl.json":101,"./locales/no.json":101,"./locales/pl.json":101,"./locales/pt-PT.json":101,"./locales/pt.json":101,"./locales/ro.json":101,"./locales/ru.json":101,"./locales/sk.json":101,"./locales/sl.json":101,"./locales/sr-Latn.json":101,"./locales/sr.json":101,"./locales/sv.json":101,"./locales/ta.json":101,"./locales/te.json":101,"./locales/th.json":101,"./locales/tr.json":101,"./locales/uk.json":101,"./locales/vi.json":101,"./locales/zh-HK.json":101,"./locales/zh-TW.json":101,"./locales/zh.json":101}],68:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const URL=require('./url-shim.js');
+    
+    
+    
+    
+    
+    function doExist(manifest){
+    if(!manifest||!manifest.icons){
+    return false;
+    }
+    if(manifest.icons.value.length===0){
+    return false;
+    }
+    return true;
+    }
+    
+    
+    
+    
+    
+    
+    function pngSizedAtLeast(sizeRequirement,manifest){
+    
+    
+    const iconValues=manifest.icons.value;
+    
+    const flattenedSizes=[];
+    iconValues.
+    filter(icon=>{
+    const typeHint=icon.value.type.value;
+    if(typeHint){
+    
+    return typeHint==='image/png';
+    }
+    
+    const src=icon.value.src.value;
+    return src&&new URL(src).pathname.endsWith('.png');
+    }).
+    forEach(icon=>{
+    
+    if(icon.value.sizes.value){
+    flattenedSizes.push(...icon.value.sizes.value);
+    }
+    });
+    
+    return flattenedSizes.
+    
+    filter(size=>/\d+x\d+/.test(size)).
+    filter(size=>{
+    
+    const sizeStrs=size.split(/x/i);
+    
+    const sizeNums=[parseFloat(sizeStrs[0]),parseFloat(sizeStrs[1])];
+    
+    const areIconsBigEnough=sizeNums[0]>=sizeRequirement&&sizeNums[1]>=sizeRequirement;
+    
+    const areIconsSquare=sizeNums[0]===sizeNums[1];
+    return areIconsBigEnough&&areIconsSquare;
+    });
+    }
+    
+    module.exports={
+    doExist,
+    pngSizedAtLeast};
+    
+    
+    },{"./url-shim.js":"url"}],69:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    function convertNodeTimingsToTrace(nodeTimings){
+    
+    const traceEvents=[];
+    const baseTs=1e9;
+    const baseEvent={pid:1,tid:1,cat:'devtools.timeline'};
+    const frame='A00001';
+    
+    const toMicroseconds=ms=>baseTs+ms*1000;
+    
+    traceEvents.push(createFakeTracingStartedEvent());
+    traceEvents.push({...createFakeTracingStartedEvent(),name:'TracingStartedInBrowser'});
+    
+    
+    let requestId=1;
+    let lastEventEndTime=0;
+    for(const[node,timing]of nodeTimings.entries()){
+    lastEventEndTime=Math.max(lastEventEndTime,timing.endTime);
+    if(node.type==='cpu'){
+    
+    const cpuNode=node;
+    traceEvents.push(...createFakeTaskEvents(cpuNode,timing));
+    }else{
+    const networkNode=node;
+    
+    if(/^data/.test(networkNode.record.url))continue;
+    traceEvents.push(...createFakeNetworkEvents(networkNode.record,timing));
+    }
+    }
+    
+    
+    traceEvents.push(
+    ...createFakeTaskEvents(
+    
+    {childEvents:[],event:{}},
+    {
+    startTime:lastEventEndTime+1000,
+    endTime:lastEventEndTime+1001}));
+    
+    
+    
+    
+    return{traceEvents};
+    
+    
+    
+    
+    function createFakeTracingStartedEvent(){
+    const argsData={
+    frameTreeNodeId:1,
+    sessionId:'1.1',
+    page:frame,
+    persistentIds:true,
+    frames:[{frame,url:'about:blank',name:'',processId:1}]};
+    
+    
+    return{
+    ...baseEvent,
+    ts:baseTs-1e5,
+    ph:'I',
+    s:'t',
+    cat:'disabled-by-default-devtools.timeline',
+    name:'TracingStartedInPage',
+    args:{data:argsData},
+    dur:0};
+    
+    }
+    
+    
+    
+    
+    
+    
+    function createFakeTaskEvents(cpuNode,timing){
+    const argsData={
+    url:'',
+    frame,
+    lineNumber:0,
+    columnNumber:0};
+    
+    
+    const eventTs=toMicroseconds(timing.startTime);
+    
+    
+    const events=[
+    {
+    ...baseEvent,
+    ph:'X',
+    name:'Task',
+    ts:eventTs,
+    dur:(timing.endTime-timing.startTime)*1000,
+    args:{data:argsData}}];
+    
+    
+    
+    const nestedBaseTs=cpuNode.event.ts||0;
+    const multiplier=(timing.endTime-timing.startTime)*1000/cpuNode.event.dur;
+    
+    const netReqEvents=new Set(['ResourceSendRequest','ResourceFinish',
+    'ResourceReceiveResponse','ResourceReceivedData']);
+    for(const event of cpuNode.childEvents){
+    if(netReqEvents.has(event.name))continue;
+    const ts=eventTs+(event.ts-nestedBaseTs)*multiplier;
+    const newEvent={...event,...{pid:baseEvent.pid,tid:baseEvent.tid},ts};
+    if(event.dur)newEvent.dur=event.dur*multiplier;
+    events.push(newEvent);
+    }
+    
+    return events;
+    }
+    
+    
+    
+    
+    
+    
+    function createFakeNetworkEvents(record,timing){
+    requestId++;
+    
+    
+    
+    let{startTime,endTime}=timing;
+    if(startTime===endTime)endTime+=0.3;
+    
+    const requestData={requestId:requestId.toString(),frame};
+    
+    const baseRequestEvent={...baseEvent,ph:'I',s:'t',dur:0};
+    
+    const sendRequestData={
+    ...requestData,
+    requestMethod:record.requestMethod,
+    url:record.url,
+    priority:record.priority};
+    
+    
+    const receiveResponseData={
+    ...requestData,
+    statusCode:record.statusCode,
+    mimeType:record.mimeType,
+    encodedDataLength:record.transferSize,
+    fromCache:record.fromDiskCache,
+    fromServiceWorker:record.fetchedViaServiceWorker};
+    
+    
+    const resourceFinishData={
+    ...requestData,
+    decodedBodyLength:record.resourceSize,
+    didFail:!!record.failed,
+    finishTime:endTime};
+    
+    
+    
+    const events=[
+    {
+    ...baseRequestEvent,
+    name:'ResourceSendRequest',
+    ts:toMicroseconds(startTime),
+    args:{data:sendRequestData}},
+    
+    {
+    ...baseRequestEvent,
+    name:'ResourceFinish',
+    ts:toMicroseconds(endTime),
+    args:{data:resourceFinishData}}];
+    
+    
+    
+    if(!record.failed){
+    events.push({
+    ...baseRequestEvent,
+    name:'ResourceReceiveResponse',
+    ts:toMicroseconds((startTime+endTime)/2),
+    args:{data:receiveResponseData}});
+    
+    }
+    
+    return events;
+    }
+    }
+    
+    module.exports={
+    simulationNamesToIgnore:[
+    'unlabeled',
+    
+    'optimisticFirstCPUIdle',
+    'optimisticFlexFirstCPUIdle',
+    'pessimisticFirstCPUIdle',
+    'optimisticSpeedIndex',
+    'optimisticFlexSpeedIndex',
+    'pessimisticSpeedIndex',
+    'optimisticEstimatedInputLatency',
+    'optimisticFlexEstimatedInputLatency',
+    'pessimisticEstimatedInputLatency'],
+    
+    convertNodeTimingsToTrace};
+    
+    
+    },{}],70:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Driver=require('../gather/driver.js');
+    
+    class LHElement{
+    
+    
+    
+    
+    constructor(element,driver){
+    if(!element||!driver){
+    throw Error('Driver and element required to create Element');
+    }
+    this.driver=driver;
+    this.element=element;
+    }
+    
+    
+    
+    
+    
+    getAttribute(name){
+    return this.driver.
+    sendCommand('DOM.getAttributes',{
+    nodeId:this.element.nodeId}).
+    
+    
+    
+    
+    then(resp=>{
+    const attrIndex=resp.attributes.indexOf(name);
+    if(attrIndex===-1){
+    return null;
+    }
+    
+    return resp.attributes[attrIndex+1];
+    });
+    }
+    
+    
+    
+    
+    getNodeId(){
+    return this.element.nodeId;
+    }
+    
+    
+    
+    
+    
+    getProperty(propName){
+    return this.driver.
+    sendCommand('DOM.resolveNode',{
+    nodeId:this.element.nodeId}).
+    
+    then(resp=>{
+    if(!resp.object.objectId){
+    return null;
+    }
+    return this.driver.getObjectProperty(resp.object.objectId,propName);
+    }).
+    catch(()=>null);
+    }}
+    
+    
+    module.exports=LHElement;
+    
+    },{"../gather/driver.js":51}],71:[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const i18n=require('./i18n/i18n.js');
+    
+    
+    const UIStrings={
+    
+    
+    
+    
+    didntCollectScreenshots:`Chrome didn't collect any screenshots during the page load. Please make sure there is content visible on the page, and then try re-running Lighthouse. ({errorCode})`,
+    
+    
+    
+    
+    badTraceRecording:'Something went wrong with recording the trace over your page load. Please run Lighthouse again. ({errorCode})',
+    
+    
+    
+    
+    pageLoadTookTooLong:'Your page took too long to load. Please follow the opportunities in the report to reduce your page load time, and then try re-running Lighthouse. ({errorCode})',
+    
+    pageLoadFailed:'Lighthouse was unable to reliably load the page you requested. Make sure you are testing the correct URL and that the server is properly responding to all requests.',
+    
+    
+    
+    
+    pageLoadFailedWithStatusCode:'Lighthouse was unable to reliably load the page you requested. Make sure you are testing the correct URL and that the server is properly responding to all requests. (Status code: {statusCode})',
+    
+    
+    
+    
+    pageLoadFailedWithDetails:'Lighthouse was unable to reliably load the page you requested. Make sure you are testing the correct URL and that the server is properly responding to all requests. (Details: {errorDetails})',
+    
+    
+    
+    
+    pageLoadFailedInsecure:'The URL you have provided does not have a valid security certificate. {securityMessages}',
+    
+    pageLoadFailedInterstitial:'Chrome prevented page load with an interstitial. Make sure you are testing the correct URL and that the server is properly responding to all requests.',
+    
+    internalChromeError:'An internal Chrome error occurred. Please restart Chrome and try re-running Lighthouse.',
+    
+    requestContentTimeout:'Fetching resource content has exceeded the allotted time',
+    
+    urlInvalid:'The URL you have provided appears to be invalid.',
+    
+    
+    
+    
+    protocolTimeout:'Waiting for DevTools protocol response has exceeded the allotted time. (Method: {protocolMethod})',
+    
+    dnsFailure:'DNS servers could not resolve the provided domain.',
+    
+    pageLoadFailedHung:'Lighthouse was unable to reliably load the URL you requested because the page stopped responding.',
+    
+    criTimeout:'Timeout waiting for initial Debugger Protocol connection.',
+    
+    
+    
+    
+    missingRequiredArtifact:'Required {artifactName} gatherer did not run.',
+    
+    
+    
+    
+    
+    erroredRequiredArtifact:'Required {artifactName} gatherer encountered an error: {errorMessage}'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const LHERROR_SENTINEL='__LighthouseErrorSentinel';
+    const ERROR_SENTINEL='__ErrorSentinel';
+    
+    
+    
+    
+    
+    class LighthouseError extends Error{
+    
+    
+    
+    
+    constructor(errorDefinition,properties){
+    super(errorDefinition.code);
+    this.name='LHError';
+    this.code=errorDefinition.code;
+    
+    
+    this.friendlyMessage=str_(errorDefinition.message,{errorCode:this.code,...properties});
+    this.lhrRuntimeError=!!errorDefinition.lhrRuntimeError;
+    if(properties)Object.assign(this,properties);
+    
+    Error.captureStackTrace(this,LighthouseError);
+    }
+    
+    
+    
+    
+    
+    
+    static fromProtocolMessage(method,protocolError){
+    
+    const protocolErrors=Object.values(LighthouseError.errors).filter(e=>e.pattern);
+    
+    const matchedErrorDefinition=protocolErrors.find(e=>e.pattern.test(protocolError.message));
+    if(matchedErrorDefinition){
+    return new LighthouseError(matchedErrorDefinition);
+    }
+    
+    
+    let errMsg=`(${method}): ${protocolError.message}`;
+    if(protocolError.data)errMsg+=` (${protocolError.data})`;
+    const error=new Error(`Protocol error ${errMsg}`);
+    return Object.assign(error,{protocolMethod:method,protocolError:protocolError.message});
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static stringifyReplacer(err){
+    if(err instanceof LighthouseError){
+    
+    
+    const{name,code,message,friendlyMessage,lhrRuntimeError,stack,...properties}=err;
+    
+    return{
+    sentinel:LHERROR_SENTINEL,
+    code,
+    stack,
+    ...properties};
+    
+    }
+    
+    
+    if(err instanceof Error){
+    const{message,stack}=err;
+    
+    const code=err.code;
+    return{
+    sentinel:ERROR_SENTINEL,
+    message,
+    code,
+    stack};
+    
+    }
+    
+    throw new Error('Invalid value for LHError stringification');
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static parseReviver(key,possibleError){
+    if(typeof possibleError==='object'&&possibleError!==null){
+    if(possibleError.sentinel===LHERROR_SENTINEL){
+    
+    
+    const{sentinel,code,stack,...properties}=possibleError;
+    const errorDefinition=LighthouseError.errors[code];
+    const lhError=new LighthouseError(errorDefinition,properties);
+    lhError.stack=stack;
+    
+    return lhError;
+    }
+    
+    if(possibleError.sentinel===ERROR_SENTINEL){
+    const{message,code,stack}=possibleError;
+    const error=new Error(message);
+    Object.assign(error,{code,stack});
+    return error;
+    }
+    }
+    
+    return possibleError;
+    }}
+    
+    
+    const ERRORS={
+    
+    NO_SPEEDLINE_FRAMES:{
+    code:'NO_SPEEDLINE_FRAMES',
+    message:UIStrings.didntCollectScreenshots,
+    lhrRuntimeError:true},
+    
+    SPEEDINDEX_OF_ZERO:{
+    code:'SPEEDINDEX_OF_ZERO',
+    message:UIStrings.didntCollectScreenshots,
+    lhrRuntimeError:true},
+    
+    NO_SCREENSHOTS:{
+    code:'NO_SCREENSHOTS',
+    message:UIStrings.didntCollectScreenshots,
+    lhrRuntimeError:true},
+    
+    INVALID_SPEEDLINE:{
+    code:'INVALID_SPEEDLINE',
+    message:UIStrings.didntCollectScreenshots,
+    lhrRuntimeError:true},
+    
+    
+    
+    NO_TRACING_STARTED:{
+    code:'NO_TRACING_STARTED',
+    message:UIStrings.badTraceRecording,
+    lhrRuntimeError:true},
+    
+    NO_NAVSTART:{
+    code:'NO_NAVSTART',
+    message:UIStrings.badTraceRecording,
+    lhrRuntimeError:true},
+    
+    NO_FCP:{
+    code:'NO_FCP',
+    message:UIStrings.badTraceRecording,
+    lhrRuntimeError:true},
+    
+    NO_DCL:{
+    code:'NO_DCL',
+    message:UIStrings.badTraceRecording,
+    lhrRuntimeError:true},
+    
+    NO_FMP:{
+    code:'NO_FMP',
+    message:UIStrings.badTraceRecording},
+    
+    NO_LCP:{
+    code:'NO_LCP',
+    message:UIStrings.badTraceRecording},
+    
+    
+    
+    FMP_TOO_LATE_FOR_FCPUI:{code:'FMP_TOO_LATE_FOR_FCPUI',message:UIStrings.pageLoadTookTooLong},
+    NO_FCPUI_IDLE_PERIOD:{code:'NO_FCPUI_IDLE_PERIOD',message:UIStrings.pageLoadTookTooLong},
+    NO_TTI_CPU_IDLE_PERIOD:{code:'NO_TTI_CPU_IDLE_PERIOD',message:UIStrings.pageLoadTookTooLong},
+    NO_TTI_NETWORK_IDLE_PERIOD:{
+    code:'NO_TTI_NETWORK_IDLE_PERIOD',
+    message:UIStrings.pageLoadTookTooLong},
+    
+    
+    
+    NO_DOCUMENT_REQUEST:{
+    code:'NO_DOCUMENT_REQUEST',
+    message:UIStrings.pageLoadFailed,
+    lhrRuntimeError:true},
+    
+    
+    
+    
+    FAILED_DOCUMENT_REQUEST:{
+    code:'FAILED_DOCUMENT_REQUEST',
+    message:UIStrings.pageLoadFailedWithDetails,
+    lhrRuntimeError:true},
+    
+    
+    
+    
+    ERRORED_DOCUMENT_REQUEST:{
+    code:'ERRORED_DOCUMENT_REQUEST',
+    message:UIStrings.pageLoadFailedWithStatusCode,
+    lhrRuntimeError:true},
+    
+    
+    
+    
+    INSECURE_DOCUMENT_REQUEST:{
+    code:'INSECURE_DOCUMENT_REQUEST',
+    message:UIStrings.pageLoadFailedInsecure,
+    lhrRuntimeError:true},
+    
+    
+    
+    CHROME_INTERSTITIAL_ERROR:{
+    code:'CHROME_INTERSTITIAL_ERROR',
+    message:UIStrings.pageLoadFailedInterstitial,
+    lhrRuntimeError:true},
+    
+    
+    PAGE_HUNG:{
+    code:'PAGE_HUNG',
+    message:UIStrings.pageLoadFailedHung,
+    lhrRuntimeError:true},
+    
+    
+    
+    TRACING_ALREADY_STARTED:{
+    code:'TRACING_ALREADY_STARTED',
+    message:UIStrings.internalChromeError,
+    pattern:/Tracing.*started/,
+    lhrRuntimeError:true},
+    
+    PARSING_PROBLEM:{
+    code:'PARSING_PROBLEM',
+    message:UIStrings.internalChromeError,
+    pattern:/Parsing problem/,
+    lhrRuntimeError:true},
+    
+    READ_FAILED:{
+    code:'READ_FAILED',
+    message:UIStrings.internalChromeError,
+    pattern:/Read failed/,
+    lhrRuntimeError:true},
+    
+    
+    
+    INVALID_URL:{
+    code:'INVALID_URL',
+    message:UIStrings.urlInvalid},
+    
+    
+    
+    
+    
+    PROTOCOL_TIMEOUT:{
+    code:'PROTOCOL_TIMEOUT',
+    message:UIStrings.protocolTimeout,
+    lhrRuntimeError:true},
+    
+    
+    
+    DNS_FAILURE:{
+    code:'DNS_FAILURE',
+    message:UIStrings.dnsFailure,
+    lhrRuntimeError:true},
+    
+    
+    
+    CRI_TIMEOUT:{
+    code:'CRI_TIMEOUT',
+    message:UIStrings.criTimeout,
+    lhrRuntimeError:true},
+    
+    
+    
+    
+    
+    
+    MISSING_REQUIRED_ARTIFACT:{
+    code:'MISSING_REQUIRED_ARTIFACT',
+    message:UIStrings.missingRequiredArtifact},
+    
+    
+    
+    
+    
+    
+    ERRORED_REQUIRED_ARTIFACT:{
+    code:'ERRORED_REQUIRED_ARTIFACT',
+    message:UIStrings.erroredRequiredArtifact}};
+    
+    
+    
+    
+    
+    
+    LighthouseError.errors=ERRORS;
+    LighthouseError.NO_ERROR='NO_ERROR';
+    LighthouseError.UNKNOWN_ERROR='UNKNOWN_ERROR';
+    module.exports=LighthouseError;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/lighthouse-core/lib/lh-error.js");
+    },{"./i18n/i18n.js":66}],72:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const URL=require('./url-shim.js');
+    const cssParsers=require('cssstyle/lib/parsers');
+    
+    const ALLOWED_DISPLAY_VALUES=[
+    'fullscreen',
+    'standalone',
+    'minimal-ui',
+    'browser'];
+    
+    
+    
+    
+    
+    const DEFAULT_DISPLAY_MODE='browser';
+    
+    const ALLOWED_ORIENTATION_VALUES=[
+    'any',
+    'natural',
+    'landscape',
+    'portrait',
+    'portrait-primary',
+    'portrait-secondary',
+    'landscape-primary',
+    'landscape-secondary'];
+    
+    
+    
+    
+    
+    
+    function isValidColor(color){
+    return cssParsers.valueType(color)===cssParsers.TYPES.COLOR;
+    }
+    
+    
+    
+    
+    
+    function parseString(raw,trim){
+    let value;
+    let warning;
+    
+    if(typeof raw==='string'){
+    value=trim?raw.trim():raw;
+    }else{
+    if(raw!==undefined){
+    warning='ERROR: expected a string.';
+    }
+    value=undefined;
+    }
+    
+    return{
+    raw,
+    value,
+    warning};
+    
+    }
+    
+    
+    
+    
+    function parseColor(raw){
+    const color=parseString(raw);
+    
+    
+    if(color.value===undefined){
+    return color;
+    }
+    
+    
+    if(!isValidColor(color.raw)){
+    color.value=undefined;
+    color.warning='ERROR: color parsing failed.';
+    }
+    
+    return color;
+    }
+    
+    
+    
+    
+    function parseName(jsonInput){
+    return parseString(jsonInput.name,true);
+    }
+    
+    
+    
+    
+    function parseShortName(jsonInput){
+    return parseString(jsonInput.short_name,true);
+    }
+    
+    
+    
+    
+    
+    
+    
+    function checkSameOrigin(url1,url2){
+    const parsed1=new URL(url1);
+    const parsed2=new URL(url2);
+    
+    return parsed1.origin===parsed2.origin;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function parseStartUrl(jsonInput,manifestUrl,documentUrl){
+    const raw=jsonInput.start_url;
+    
+    
+    if(raw===''){
+    return{
+    raw,
+    value:documentUrl,
+    warning:'ERROR: start_url string empty'};
+    
+    }
+    if(raw===undefined){
+    return{
+    raw,
+    value:documentUrl};
+    
+    }
+    if(typeof raw!=='string'){
+    return{
+    raw,
+    value:documentUrl,
+    warning:'ERROR: expected a string.'};
+    
+    }
+    
+    
+    let startUrl;
+    try{
+    startUrl=new URL(raw,manifestUrl).href;
+    }catch(e){
+    
+    return{
+    raw,
+    value:documentUrl,
+    warning:`ERROR: invalid start_url relative to ${manifestUrl}`};
+    
+    }
+    
+    
+    if(!checkSameOrigin(startUrl,documentUrl)){
+    return{
+    raw,
+    value:documentUrl,
+    warning:'ERROR: start_url must be same-origin as document'};
+    
+    }
+    
+    return{
+    raw,
+    value:startUrl};
+    
+    }
+    
+    
+    
+    
+    function parseDisplay(jsonInput){
+    const parsedString=parseString(jsonInput.display,true);
+    const stringValue=parsedString.value;
+    
+    if(!stringValue){
+    return{
+    raw:jsonInput,
+    value:DEFAULT_DISPLAY_MODE,
+    warning:parsedString.warning};
+    
+    }
+    
+    const displayValue=stringValue.toLowerCase();
+    if(!ALLOWED_DISPLAY_VALUES.includes(displayValue)){
+    return{
+    raw:jsonInput,
+    value:DEFAULT_DISPLAY_MODE,
+    warning:'ERROR: \'display\' has invalid value '+displayValue+
+    `. will fall back to ${DEFAULT_DISPLAY_MODE}.`};
+    
+    }
+    
+    return{
+    raw:jsonInput,
+    value:displayValue,
+    warning:undefined};
+    
+    }
+    
+    
+    
+    
+    function parseOrientation(jsonInput){
+    const orientation=parseString(jsonInput.orientation,true);
+    
+    if(orientation.value&&
+    !ALLOWED_ORIENTATION_VALUES.includes(orientation.value.toLowerCase())){
+    orientation.value=undefined;
+    orientation.warning='ERROR: \'orientation\' has an invalid value, will be ignored.';
+    }
+    
+    return orientation;
+    }
+    
+    
+    
+    
+    
+    
+    function parseIcon(raw,manifestUrl){
+    
+    const src=parseString(raw.src,true);
+    
+    if(src.value===''){
+    src.value=undefined;
+    }
+    if(src.value){
+    try{
+    
+    src.value=new URL(src.value,manifestUrl).href;
+    }catch(_){
+    
+    src.warning=`ERROR: invalid icon url will be ignored: '${raw.src}'`;
+    src.value=undefined;
+    }
+    }
+    
+    const type=parseString(raw.type,true);
+    
+    const density={
+    raw:raw.density,
+    value:1,
+    
+    warning:undefined};
+    
+    if(density.raw!==undefined){
+    density.value=parseFloat(density.raw);
+    if(isNaN(density.value)||!isFinite(density.value)||density.value<=0){
+    density.value=1;
+    density.warning='ERROR: icon density cannot be NaN, +∞, or less than or equal to +0.';
+    }
+    }
+    
+    let sizes;
+    const parsedSizes=parseString(raw.sizes);
+    if(parsedSizes.value!==undefined){
+    
+    const set=new Set();
+    parsedSizes.value.trim().split(/\s+/).forEach(size=>set.add(size.toLowerCase()));
+    sizes={
+    raw:raw.sizes,
+    value:set.size>0?Array.from(set):undefined,
+    warning:undefined};
+    
+    }else{
+    sizes={...parsedSizes,value:undefined};
+    }
+    
+    return{
+    raw,
+    value:{
+    src,
+    type,
+    density,
+    sizes},
+    
+    warning:undefined};
+    
+    }
+    
+    
+    
+    
+    
+    function parseIcons(jsonInput,manifestUrl){
+    const raw=jsonInput.icons;
+    
+    if(raw===undefined){
+    return{
+    raw,
+    
+    value:[],
+    warning:undefined};
+    
+    }
+    
+    if(!Array.isArray(raw)){
+    return{
+    raw,
+    
+    value:[],
+    warning:'ERROR: \'icons\' expected to be an array but is not.'};
+    
+    }
+    
+    const parsedIcons=raw.
+    
+    filter(icon=>icon.src!==undefined).
+    
+    map(icon=>parseIcon(icon,manifestUrl));
+    
+    
+    
+    const ignoredIconsWithWarnings=parsedIcons.
+    filter(icon=>{
+    const possibleWarnings=[icon.warning,icon.value.type.warning,icon.value.src.warning,
+    icon.value.sizes.warning,icon.value.density.warning].filter(Boolean);
+    const hasSrc=!!icon.value.src.value;
+    return!!possibleWarnings.length&&!hasSrc;
+    });
+    
+    const value=parsedIcons.
+    
+    filter(parsedIcon=>parsedIcon.value.src.value!==undefined);
+    
+    return{
+    raw,
+    value,
+    warning:ignoredIconsWithWarnings.length?
+    'WARNING: Some icons were ignored due to warnings.':undefined};
+    
+    }
+    
+    
+    
+    
+    function parseApplication(raw){
+    const platform=parseString(raw.platform,true);
+    const id=parseString(raw.id,true);
+    
+    
+    const appUrl=parseString(raw.url,true);
+    if(appUrl.value){
+    try{
+    
+    appUrl.value=new URL(appUrl.value).href;
+    }catch(e){
+    appUrl.value=undefined;
+    appUrl.warning=`ERROR: invalid application URL ${raw.url}`;
+    }
+    }
+    
+    return{
+    raw,
+    value:{
+    platform,
+    id,
+    url:appUrl},
+    
+    warning:undefined};
+    
+    }
+    
+    
+    
+    
+    function parseRelatedApplications(jsonInput){
+    const raw=jsonInput.related_applications;
+    
+    if(raw===undefined){
+    return{
+    raw,
+    value:undefined,
+    warning:undefined};
+    
+    }
+    
+    if(!Array.isArray(raw)){
+    return{
+    raw,
+    value:undefined,
+    warning:'ERROR: \'related_applications\' expected to be an array but is not.'};
+    
+    }
+    
+    
+    
+    const value=raw.
+    filter(application=>!!application.platform).
+    map(parseApplication).
+    filter(parsedApp=>!!parsedApp.value.id.value||!!parsedApp.value.url.value);
+    
+    return{
+    raw,
+    value,
+    warning:undefined};
+    
+    }
+    
+    
+    
+    
+    function parsePreferRelatedApplications(jsonInput){
+    const raw=jsonInput.prefer_related_applications;
+    let value;
+    let warning;
+    
+    if(typeof raw==='boolean'){
+    value=raw;
+    }else{
+    if(raw!==undefined){
+    warning='ERROR: \'prefer_related_applications\' expected to be a boolean.';
+    }
+    value=undefined;
+    }
+    
+    return{
+    raw,
+    value,
+    warning};
+    
+    }
+    
+    
+    
+    
+    function parseThemeColor(jsonInput){
+    return parseColor(jsonInput.theme_color);
+    }
+    
+    
+    
+    
+    function parseBackgroundColor(jsonInput){
+    return parseColor(jsonInput.background_color);
+    }
+    
+    
+    
+    
+    
+    
+    
+    function parse(string,manifestUrl,documentUrl){
+    if(manifestUrl===undefined||documentUrl===undefined){
+    throw new Error('Manifest and document URLs required for manifest parsing.');
+    }
+    
+    let jsonInput;
+    
+    try{
+    jsonInput=JSON.parse(string);
+    }catch(e){
+    return{
+    raw:string,
+    value:undefined,
+    warning:'ERROR: file isn\'t valid JSON: '+e};
+    
+    }
+    
+    
+    const manifest={
+    name:parseName(jsonInput),
+    short_name:parseShortName(jsonInput),
+    start_url:parseStartUrl(jsonInput,manifestUrl,documentUrl),
+    display:parseDisplay(jsonInput),
+    orientation:parseOrientation(jsonInput),
+    icons:parseIcons(jsonInput,manifestUrl),
+    related_applications:parseRelatedApplications(jsonInput),
+    prefer_related_applications:parsePreferRelatedApplications(jsonInput),
+    theme_color:parseThemeColor(jsonInput),
+    background_color:parseBackgroundColor(jsonInput)};
+    
+    
+    
+    
+    let manifestUrlWarning;
+    try{
+    const manifestUrlParsed=new URL(manifestUrl);
+    if(!manifestUrlParsed.protocol.startsWith('http')){
+    manifestUrlWarning=`WARNING: manifest URL not available over a valid network protocol`;
+    }
+    }catch(_){
+    manifestUrlWarning=`ERROR: invalid manifest URL: '${manifestUrl}'`;
+    }
+    
+    return{
+    raw:string,
+    value:manifest,
+    warning:manifestUrlWarning};
+    
+    }
+    
+    module.exports=parse;
+    
+    },{"./url-shim.js":"url","cssstyle/lib/parsers":105}],73:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    const PUNCTUATOR_REGEX=/(return|{|\(|\[|\.\.\.|;|,|<|>|<=|>=|==|!=|===|!==|\+|-|\*|%|\*\*|\+\+|--|<<|>>|>>>|&|\||\^|!|~|&&|\|\||\?|:|=|\+=|-=|\*=|%=|\*\*=|<<=|>>=|>>>=|&=|\|=|\^=|=>|\/|\/=|\})$/;
+    const WHITESPACE_REGEX=/( |\n|\t)+$/;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function hasPunctuatorBefore(content,startPosition){
+    for(let i=startPosition;i>0;i--){
+    
+    const sliceStart=Math.max(0,i-6);
+    const precedingCharacters=content.slice(sliceStart,i);
+    
+    if(WHITESPACE_REGEX.test(precedingCharacters))continue;
+    
+    return PUNCTUATOR_REGEX.test(precedingCharacters);
+    }
+    
+    
+    
+    return true;
+    }
+    
+    
+    
+    
+    
+    
+    
+    function computeTokenLength(content,features){
+    let totalTokenLength=0;
+    let isInSinglelineComment=false;
+    let isInMultilineComment=false;
+    let isInLicenseComment=false;
+    let isInString=false;
+    let isInRegex=false;
+    let isInRegexCharacterClass=false;
+    let stringOpenChar=null;
+    
+    for(let i=0;i<content.length;i++){
+    const twoChars=content.substr(i,2);
+    const char=twoChars.charAt(0);
+    
+    const isWhitespace=char===' '||char==='\n'||char==='\t';
+    const isAStringOpenChar=char===`'`||char==='"'||char==='`';
+    
+    if(isInSinglelineComment){
+    if(char==='\n'){
+    
+    isInSinglelineComment=false;
+    }
+    }else if(isInMultilineComment){
+    
+    if(isInLicenseComment)totalTokenLength++;
+    
+    if(twoChars==='*/'){
+    
+    if(isInLicenseComment)totalTokenLength++;
+    
+    isInMultilineComment=false;
+    
+    i++;
+    }
+    }else if(isInString){
+    
+    totalTokenLength++;
+    
+    if(char==='\\'){
+    
+    totalTokenLength++;
+    i++;
+    }else if(char===stringOpenChar){
+    
+    isInString=false;
+    
+    }
+    }else if(isInRegex){
+    
+    totalTokenLength++;
+    
+    if(char==='\\'){
+    
+    totalTokenLength++;
+    i++;
+    }else if(char==='['){
+    
+    isInRegexCharacterClass=true;
+    }else if(char===']'&&isInRegexCharacterClass){
+    
+    isInRegexCharacterClass=false;
+    }else if(char==='/'&&!isInRegexCharacterClass){
+    
+    isInRegex=false;
+    
+    }
+    }else{
+    
+    if(twoChars==='/*'){
+    
+    isInMultilineComment=true;
+    
+    isInLicenseComment=content.charAt(i+2)==='!';
+    
+    if(isInLicenseComment)totalTokenLength+=2;
+    
+    i++;
+    }else if(twoChars==='//'&&features.singlelineComments){
+    
+    isInSinglelineComment=true;
+    isInMultilineComment=false;
+    isInLicenseComment=false;
+    
+    i++;
+    }else if(char==='/'&&features.regex&&hasPunctuatorBefore(content,i)){
+    
+    isInRegex=true;
+    
+    totalTokenLength++;
+    }else if(isAStringOpenChar){
+    
+    isInString=true;
+    
+    stringOpenChar=char;
+    
+    totalTokenLength++;
+    }else if(!isWhitespace){
+    
+    totalTokenLength++;
+    }
+    }
+    }
+    
+    
+    
+    if(isInMultilineComment||isInString){
+    return content.length;
+    }
+    
+    return totalTokenLength;
+    }
+    
+    
+    
+    
+    function computeJSTokenLength(content){
+    return computeTokenLength(content,{singlelineComments:true,regex:true});
+    }
+    
+    
+    
+    
+    function computeCSSTokenLength(content){
+    return computeTokenLength(content,{singlelineComments:false,regex:false});
+    }
+    
+    module.exports={computeJSTokenLength,computeCSSTokenLength};
+    
+    },{}],74:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const NetworkRequest=require('./network-request.js');
+    const EventEmitter=require('events').EventEmitter;
+    const log=require('lighthouse-logger');
+    
+    const IGNORED_NETWORK_SCHEMES=['data','ws'];
+    
+    
+    
+    class NetworkRecorder extends EventEmitter{
+    
+    
+    
+    constructor(){
+    super();
+    
+    
+    this._records=[];
+    
+    this._recordsById=new Map();
+    }
+    
+    
+    
+    
+    getInflightRecords(){
+    return this._records.filter(record=>!record.finished);
+    }
+    
+    getRecords(){
+    return Array.from(this._records);
+    }
+    
+    
+    
+    
+    
+    on(event,listener){
+    return super.on(event,listener);
+    }
+    
+    
+    
+    
+    
+    once(event,listener){
+    return super.once(event,listener);
+    }
+    
+    isIdle(){
+    return this._isActiveIdlePeriod(0);
+    }
+    
+    is2Idle(){
+    return this._isActiveIdlePeriod(2);
+    }
+    
+    
+    
+    
+    
+    
+    
+    _isActiveIdlePeriod(allowedRequests){
+    let inflightRequests=0;
+    
+    for(let i=0;i<this._records.length;i++){
+    const record=this._records[i];
+    if(record.finished)continue;
+    if(IGNORED_NETWORK_SCHEMES.includes(record.parsedURL.scheme))continue;
+    inflightRequests++;
+    }
+    
+    return inflightRequests<=allowedRequests;
+    }
+    
+    _emitNetworkStatus(){
+    const zeroQuiet=this.isIdle();
+    const twoQuiet=this.is2Idle();
+    
+    if(twoQuiet&&zeroQuiet){
+    log.verbose('NetworkRecorder','network fully-quiet');
+    this.emit('network-2-idle');
+    this.emit('networkidle');
+    }else if(twoQuiet&&!zeroQuiet){
+    log.verbose('NetworkRecorder','network semi-quiet');
+    this.emit('network-2-idle');
+    this.emit('networkbusy');
+    }else{
+    log.verbose('NetworkRecorder','network busy');
+    this.emit('network-2-busy');
+    this.emit('networkbusy');
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static findNetworkQuietPeriods(networkRecords,allowedConcurrentRequests,endTime=Infinity){
+    
+    
+    let timeBoundaries=[];
+    networkRecords.forEach(record=>{
+    const scheme=record.parsedURL&&record.parsedURL.scheme;
+    if(IGNORED_NETWORK_SCHEMES.includes(scheme)){
+    return;
+    }
+    
+    
+    timeBoundaries.push({time:record.startTime*1000,isStart:true});
+    if(record.finished){
+    timeBoundaries.push({time:record.endTime*1000,isStart:false});
+    }
+    });
+    
+    timeBoundaries=timeBoundaries.
+    filter(boundary=>boundary.time<=endTime).
+    sort((a,b)=>a.time-b.time);
+    
+    let numInflightRequests=0;
+    let quietPeriodStart=0;
+    
+    const quietPeriods=[];
+    timeBoundaries.forEach(boundary=>{
+    if(boundary.isStart){
+    
+    if(numInflightRequests===allowedConcurrentRequests){
+    quietPeriods.push({start:quietPeriodStart,end:boundary.time});
+    }
+    numInflightRequests++;
+    }else{
+    numInflightRequests--;
+    
+    if(numInflightRequests===allowedConcurrentRequests){
+    quietPeriodStart=boundary.time;
+    }
+    }
+    });
+    
+    
+    if(numInflightRequests<=allowedConcurrentRequests){
+    quietPeriods.push({start:quietPeriodStart,end:endTime});
+    }
+    
+    return quietPeriods.filter(period=>period.start!==period.end);
+    }
+    
+    
+    
+    
+    
+    
+    
+    onRequestStarted(request){
+    this._records.push(request);
+    this._recordsById.set(request.requestId,request);
+    
+    this.emit('requeststarted',request);
+    this._emitNetworkStatus();
+    }
+    
+    
+    
+    
+    
+    
+    
+    onRequestFinished(request){
+    this.emit('requestloaded',request);
+    this._emitNetworkStatus();
+    }
+    
+    
+    
+    
+    
+    
+    
+    onRequestWillBeSent(event){
+    const data=event.params;
+    const originalRequest=this._findRealRequestAndSetSession(data.requestId,event.sessionId);
+    
+    if(!originalRequest){
+    const request=new NetworkRequest();
+    request.onRequestWillBeSent(data);
+    request.sessionId=event.sessionId;
+    this.onRequestStarted(request);
+    return;
+    }
+    
+    
+    if(!data.redirectResponse){
+    return;
+    }
+    
+    
+    
+    const modifiedData={
+    ...data,
+    
+    initiator:originalRequest.initiator,
+    requestId:`${originalRequest.requestId}:redirect`};
+    
+    const redirectedRequest=new NetworkRequest();
+    
+    redirectedRequest.onRequestWillBeSent(modifiedData);
+    originalRequest.onRedirectResponse(data);
+    
+    originalRequest.redirectDestination=redirectedRequest;
+    redirectedRequest.redirectSource=originalRequest;
+    
+    
+    this.onRequestStarted(redirectedRequest);
+    this.onRequestFinished(originalRequest);
+    }
+    
+    
+    
+    
+    onRequestServedFromCache(event){
+    const data=event.params;
+    const request=this._findRealRequestAndSetSession(data.requestId,event.sessionId);
+    if(!request)return;
+    request.onRequestServedFromCache();
+    }
+    
+    
+    
+    
+    onResponseReceived(event){
+    const data=event.params;
+    const request=this._findRealRequestAndSetSession(data.requestId,event.sessionId);
+    if(!request)return;
+    request.onResponseReceived(data);
+    }
+    
+    
+    
+    
+    onDataReceived(event){
+    const data=event.params;
+    const request=this._findRealRequestAndSetSession(data.requestId,event.sessionId);
+    if(!request)return;
+    request.onDataReceived(data);
+    }
+    
+    
+    
+    
+    onLoadingFinished(event){
+    const data=event.params;
+    const request=this._findRealRequestAndSetSession(data.requestId,event.sessionId);
+    if(!request)return;
+    request.onLoadingFinished(data);
+    this.onRequestFinished(request);
+    }
+    
+    
+    
+    
+    onLoadingFailed(event){
+    const data=event.params;
+    const request=this._findRealRequestAndSetSession(data.requestId,event.sessionId);
+    if(!request)return;
+    request.onLoadingFailed(data);
+    this.onRequestFinished(request);
+    }
+    
+    
+    
+    
+    onResourceChangedPriority(event){
+    const data=event.params;
+    const request=this._findRealRequestAndSetSession(data.requestId,event.sessionId);
+    if(!request)return;
+    request.onResourceChangedPriority(data);
+    }
+    
+    
+    
+    
+    
+    dispatch(event){
+    switch(event.method){
+    case'Network.requestWillBeSent':return this.onRequestWillBeSent(event);
+    case'Network.requestServedFromCache':return this.onRequestServedFromCache(event);
+    case'Network.responseReceived':return this.onResponseReceived(event);
+    case'Network.dataReceived':return this.onDataReceived(event);
+    case'Network.loadingFinished':return this.onLoadingFinished(event);
+    case'Network.loadingFailed':return this.onLoadingFailed(event);
+    case'Network.resourceChangedPriority':return this.onResourceChangedPriority(event);
+    default:return;}
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    _findRealRequestAndSetSession(requestId,sessionId){
+    let request=this._recordsById.get(requestId);
+    if(!request||!request.isValid)return undefined;
+    
+    while(request.redirectDestination){
+    request=request.redirectDestination;
+    }
+    
+    request.setSession(sessionId);
+    
+    return request;
+    }
+    
+    
+    
+    
+    
+    
+    static recordsFromLogs(devtoolsLog){
+    const networkRecorder=new NetworkRecorder();
+    
+    devtoolsLog.forEach(message=>networkRecorder.dispatch(message));
+    
+    
+    const records=networkRecorder.getRecords().filter(record=>record.isValid);
+    
+    
+    const recordsByURL=new Map();
+    for(const record of records){
+    if(recordsByURL.has(record.url))continue;
+    recordsByURL.set(record.url,record);
+    }
+    
+    
+    for(const record of records){
+    const stackFrames=record.initiator.stack&&record.initiator.stack.callFrames||[];
+    const initiatorURL=record.initiator.url||stackFrames[0]&&stackFrames[0].url;
+    
+    
+    const initiator=record.redirectSource||recordsByURL.get(initiatorURL);
+    if(initiator){
+    record.setInitiatorRequest(initiator);
+    }
+    
+    let finalRecord=record;
+    while(finalRecord.redirectDestination)finalRecord=finalRecord.redirectDestination;
+    if(finalRecord===record||finalRecord.redirects)continue;
+    
+    const redirects=[];
+    for(
+    let redirect=finalRecord.redirectSource;
+    redirect;
+    redirect=redirect.redirectSource)
+    {
+    redirects.unshift(redirect);
+    }
+    
+    finalRecord.redirects=redirects;
+    }
+    
+    return records;
+    }}
+    
+    
+    module.exports=NetworkRecorder;
+    
+    },{"./network-request.js":75,"events":108,"lighthouse-logger":125}],75:[function(require,module,exports){
+    (function(global){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    const URL=require('./url-shim.js');
+    
+    const SECURE_SCHEMES=['data','https','wss','blob','chrome','chrome-extension','about'];
+    
+    
+    
+    const HEADER_TCP='X-TCPMs';
+    const HEADER_SSL='X-SSLMs';
+    const HEADER_REQ='X-RequestMs';
+    const HEADER_RES='X-ResponseMs';
+    const HEADER_TOTAL='X-TotalMs';
+    const HEADER_FETCHED_SIZE='X-TotalFetchedSize';
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const RESOURCE_TYPES={
+    XHR:'XHR',
+    Fetch:'Fetch',
+    EventSource:'EventSource',
+    Script:'Script',
+    Stylesheet:'Stylesheet',
+    Image:'Image',
+    Media:'Media',
+    Font:'Font',
+    Document:'Document',
+    TextTrack:'TextTrack',
+    WebSocket:'WebSocket',
+    Other:'Other',
+    Manifest:'Manifest',
+    SignedExchange:'SignedExchange',
+    Ping:'Ping',
+    CSPViolationReport:'CSPViolationReport'};
+    
+    
+    class NetworkRequest{
+    constructor(){
+    this.requestId='';
+    this.connectionId='0';
+    this.connectionReused=false;
+    
+    this.url='';
+    this.protocol='';
+    this.isSecure=false;
+    this.isValid=false;
+    this.parsedURL={scheme:''};
+    this.documentURL='';
+    
+    this.startTime=-1;
+    
+    this.endTime=-1;
+    
+    this.responseReceivedTime=-1;
+    
+    
+    this.transferSize=0;
+    this.resourceSize=0;
+    this.fromDiskCache=false;
+    this.fromMemoryCache=false;
+    
+    
+    this.lrStatistics=undefined;
+    
+    this.finished=false;
+    this.requestMethod='';
+    this.statusCode=-1;
+    
+    this.redirectSource=undefined;
+    
+    this.redirectDestination=undefined;
+    
+    this.redirects=undefined;
+    this.failed=false;
+    this.localizedFailDescription='';
+    
+    this.initiator={type:'other'};
+    
+    this.timing=undefined;
+    
+    this.resourceType=undefined;
+    this.mimeType='';
+    
+    this.priority='Low';
+    
+    this.initiatorRequest=undefined;
+    
+    this.responseHeaders=[];
+    
+    this.responseHeadersText='';
+    
+    this.fetchedViaServiceWorker=false;
+    
+    this.frameId='';
+    
+    
+    
+    
+    
+    this.sessionId=undefined;
+    this.isLinkPreload=false;
+    }
+    
+    
+    
+    
+    hasErrorStatusCode(){
+    return this.statusCode>=400;
+    }
+    
+    
+    
+    
+    setInitiatorRequest(initiator){
+    this.initiatorRequest=initiator;
+    }
+    
+    
+    
+    
+    onRequestWillBeSent(data){
+    this.requestId=data.requestId;
+    let url;
+    try{
+    
+    url=new URL(data.request.url);
+    }catch(e){
+    
+    return;
+    }
+    this.url=data.request.url;
+    this.documentURL=data.documentURL;
+    this.parsedURL={
+    scheme:url.protocol.split(':')[0],
+    
+    host:url.hostname,
+    securityOrigin:url.origin};
+    
+    this.isSecure=SECURE_SCHEMES.includes(this.parsedURL.scheme);
+    
+    this.startTime=data.timestamp;
+    
+    this.requestMethod=data.request.method;
+    
+    this.initiator=data.initiator;
+    this.resourceType=data.type&&RESOURCE_TYPES[data.type];
+    this.priority=data.request.initialPriority;
+    
+    this.frameId=data.frameId;
+    this.isLinkPreload=data.initiator.type==='preload'||!!data.request.isLinkPreload;
+    this.isValid=true;
+    }
+    
+    onRequestServedFromCache(){
+    this.fromMemoryCache=true;
+    }
+    
+    
+    
+    
+    onResponseReceived(data){
+    this._onResponse(data.response,data.timestamp,data.type);
+    this.frameId=data.frameId;
+    }
+    
+    
+    
+    
+    onDataReceived(data){
+    this.resourceSize+=data.dataLength;
+    if(data.encodedDataLength!==-1){
+    this.transferSize+=data.encodedDataLength;
+    }
+    }
+    
+    
+    
+    
+    onLoadingFinished(data){
+    
+    if(this.finished)return;
+    
+    this.finished=true;
+    this.endTime=data.timestamp;
+    if(data.encodedDataLength>=0){
+    this.transferSize=data.encodedDataLength;
+    }
+    
+    this._updateResponseReceivedTimeIfNecessary();
+    this._updateTransferSizeForLightrider();
+    this._updateTimingsForLightrider();
+    }
+    
+    
+    
+    
+    onLoadingFailed(data){
+    
+    if(this.finished)return;
+    
+    this.finished=true;
+    this.endTime=data.timestamp;
+    
+    this.failed=true;
+    this.resourceType=data.type&&RESOURCE_TYPES[data.type];
+    this.localizedFailDescription=data.errorText;
+    
+    this._updateResponseReceivedTimeIfNecessary();
+    this._updateTransferSizeForLightrider();
+    this._updateTimingsForLightrider();
+    }
+    
+    
+    
+    
+    onResourceChangedPriority(data){
+    this.priority=data.newPriority;
+    }
+    
+    
+    
+    
+    onRedirectResponse(data){
+    if(!data.redirectResponse)throw new Error('Missing redirectResponse data');
+    this._onResponse(data.redirectResponse,data.timestamp,data.type);
+    this.resourceType=undefined;
+    this.finished=true;
+    this.endTime=data.timestamp;
+    
+    this._updateResponseReceivedTimeIfNecessary();
+    }
+    
+    
+    
+    
+    setSession(sessionId){
+    this.sessionId=sessionId;
+    }
+    
+    
+    
+    
+    
+    
+    _onResponse(response,timestamp,resourceType){
+    this.url=response.url;
+    
+    this.connectionId=String(response.connectionId);
+    this.connectionReused=response.connectionReused;
+    
+    if(response.protocol)this.protocol=response.protocol;
+    
+    this.responseReceivedTime=timestamp;
+    
+    this.transferSize=response.encodedDataLength;
+    if(typeof response.fromDiskCache==='boolean')this.fromDiskCache=response.fromDiskCache;
+    
+    this.statusCode=response.status;
+    
+    this.timing=response.timing;
+    if(resourceType)this.resourceType=RESOURCE_TYPES[resourceType];
+    this.mimeType=response.mimeType;
+    this.responseHeadersText=response.headersText||'';
+    this.responseHeaders=NetworkRequest._headersDictToHeadersArray(response.headers);
+    
+    this.fetchedViaServiceWorker=!!response.fromServiceWorker;
+    
+    if(this.fromMemoryCache)this.timing=undefined;
+    if(this.timing)this._recomputeTimesWithResourceTiming(this.timing);
+    }
+    
+    
+    
+    
+    
+    
+    _recomputeTimesWithResourceTiming(timing){
+    
+    
+    if(timing.requestTime===0||timing.receiveHeadersEnd===-1)return;
+    
+    
+    this.startTime=timing.requestTime;
+    const headersReceivedTime=timing.requestTime+timing.receiveHeadersEnd/1000;
+    if(!this.responseReceivedTime||this.responseReceivedTime<0){
+    this.responseReceivedTime=headersReceivedTime;
+    }
+    
+    this.responseReceivedTime=Math.min(this.responseReceivedTime,headersReceivedTime);
+    this.responseReceivedTime=Math.max(this.responseReceivedTime,this.startTime);
+    
+    
+    this.endTime=Math.max(this.endTime,this.responseReceivedTime);
+    }
+    
+    
+    
+    
+    
+    _updateResponseReceivedTimeIfNecessary(){
+    this.responseReceivedTime=Math.min(this.endTime,this.responseReceivedTime);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    _updateTransferSizeForLightrider(){
+    
+    if(!global.isLightrider)return;
+    
+    const totalFetchedSize=this.responseHeaders.find(item=>item.name===HEADER_FETCHED_SIZE);
+    
+    if(!totalFetchedSize)return;
+    const floatValue=parseFloat(totalFetchedSize.value);
+    
+    if(isNaN(floatValue))return;
+    this.transferSize=floatValue;
+    }
+    
+    
+    
+    
+    
+    _updateTimingsForLightrider(){
+    
+    if(!global.isLightrider)return;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const totalHeader=this.responseHeaders.find(item=>item.name===HEADER_TOTAL);
+    
+    if(!totalHeader)return;
+    
+    const totalMs=parseInt(totalHeader.value);
+    const TCPMsHeader=this.responseHeaders.find(item=>item.name===HEADER_TCP);
+    const SSLMsHeader=this.responseHeaders.find(item=>item.name===HEADER_SSL);
+    const requestMsHeader=this.responseHeaders.find(item=>item.name===HEADER_REQ);
+    const responseMsHeader=this.responseHeaders.find(item=>item.name===HEADER_RES);
+    
+    
+    const TCPMs=TCPMsHeader?Math.max(0,parseInt(TCPMsHeader.value)):0;
+    const SSLMs=SSLMsHeader?Math.max(0,parseInt(SSLMsHeader.value)):0;
+    const requestMs=requestMsHeader?Math.max(0,parseInt(requestMsHeader.value)):0;
+    const responseMs=responseMsHeader?Math.max(0,parseInt(responseMsHeader.value)):0;
+    
+    
+    if(TCPMs+requestMs+responseMs!==totalMs){
+    return;
+    }
+    
+    
+    if(SSLMs>TCPMs){
+    return;
+    }
+    
+    this.lrStatistics={
+    endTimeDeltaMs:(this.endTime-(this.startTime+totalMs/1000))*1000,
+    TCPMs:TCPMs,
+    requestMs:requestMs,
+    responseMs:responseMs};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    static getRequestIdForBackend(requestId){
+    return requestId.replace(/(:redirect)+$/,'');
+    }
+    
+    
+    
+    
+    
+    
+    
+    static _headersDictToHeadersArray(headersDict){
+    const result=[];
+    for(const name of Object.keys(headersDict)){
+    const values=headersDict[name].split('\n');
+    for(let i=0;i<values.length;++i){
+    result.push({name:name,value:values[i]});
+    }
+    }
+    return result;
+    }
+    
+    static get TYPES(){
+    return RESOURCE_TYPES;
+    }}
+    
+    
+    NetworkRequest.HEADER_TCP=HEADER_TCP;
+    NetworkRequest.HEADER_SSL=HEADER_SSL;
+    NetworkRequest.HEADER_REQ=HEADER_REQ;
+    NetworkRequest.HEADER_RES=HEADER_RES;
+    NetworkRequest.HEADER_TOTAL=HEADER_TOTAL;
+    NetworkRequest.HEADER_FETCHED_SIZE=HEADER_FETCHED_SIZE;
+    
+    module.exports=NetworkRequest;
+    
+    }).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
+    },{"./url-shim.js":"url"}],76:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function wrapRuntimeEvalErrorInBrowser(err){
+    err=err||new Error();
+    const fallbackMessage=typeof err==='string'?err:'unknown error';
+    
+    return{
+    __failedInBrowser:true,
+    name:err.name||'Error',
+    message:err.message||fallbackMessage,
+    stack:err.stack||new Error().stack};
+    
+    }
+    
+    
+    
+    
+    
+    
+    function registerPerformanceObserverInPage(){
+    window.____lastLongTask=window.__perfNow();
+    const observer=new window.PerformanceObserver(entryList=>{
+    const entries=entryList.getEntries();
+    for(const entry of entries){
+    if(entry.entryType==='longtask'){
+    const taskEnd=entry.startTime+entry.duration;
+    window.____lastLongTask=Math.max(window.____lastLongTask,taskEnd);
+    }
+    }
+    });
+    
+    observer.observe({entryTypes:['longtask']});
+    
+    
+    
+    
+    
+    window.____lhPerformanceObserver=observer;
+    }
+    
+    
+    
+    
+    
+    function checkTimeSinceLastLongTask(){
+    
+    
+    return new window.__nativePromise(resolve=>{
+    const timeoutRequested=window.__perfNow()+50;
+    
+    setTimeout(()=>{
+    
+    const timeoutFired=window.__perfNow();
+    const timeSinceLongTask=timeoutFired-timeoutRequested<50?
+    timeoutFired-window.____lastLongTask:0;
+    resolve(timeSinceLongTask);
+    },50);
+    });
+    }
+    
+    
+    
+    
+    
+    
+    
+    function getElementsInDocument(selector){
+    const realMatchesFn=window.__ElementMatches||window.Element.prototype.matches;
+    
+    const results=[];
+    
+    
+    const _findAllElements=nodes=>{
+    for(let i=0,el;el=nodes[i];++i){
+    if(!selector||realMatchesFn.call(el,selector)){
+    results.push(el);
+    }
+    
+    if(el.shadowRoot){
+    _findAllElements(el.shadowRoot.querySelectorAll('*'));
+    }
+    }
+    };
+    _findAllElements(document.querySelectorAll('*'));
+    
+    return results;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function getOuterHTMLSnippet(element,ignoreAttrs=[]){
+    try{
+    
+    if(element instanceof ShadowRoot){
+    element=element.host;
+    }
+    
+    const clone=element.cloneNode();
+    ignoreAttrs.forEach(attribute=>{
+    clone.removeAttribute(attribute);
+    });
+    const reOpeningTag=/^[\s\S]*?>/;
+    const match=clone.outerHTML.match(reOpeningTag);
+    return match&&match[0]||'';
+    }catch(_){
+    
+    return`<${element.localName}>`;
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function ultradumbBenchmark(){
+    const start=Date.now();
+    let iterations=0;
+    
+    while(Date.now()-start<500){
+    let s='';
+    for(let j=0;j<100000;j++)s+='a';
+    
+    iterations++;
+    }
+    
+    const durationInSeconds=(Date.now()-start)/1000;
+    return Math.round(iterations/durationInSeconds);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function getNodePath(node){
+    
+    function getNodeIndex(node){
+    let index=0;
+    let prevNode;
+    while(prevNode=node.previousSibling){
+    node=prevNode;
+    
+    if(node.nodeType===Node.TEXT_NODE&&node.nodeValue.trim().length===0)continue;
+    index++;
+    }
+    return index;
+    }
+    
+    const path=[];
+    while(node&&node.parentNode){
+    const index=getNodeIndex(node);
+    path.push([index,node.nodeName]);
+    node=node.parentNode;
+    }
+    path.reverse();
+    return path.join(',');
+    }
+    
+    
+    
+    
+    
+    
+    function getNodeSelector(node){
+    
+    
+    
+    function getSelectorPart(node){
+    let part=node.tagName.toLowerCase();
+    if(node.id){
+    part+='#'+node.id;
+    }else if(node.classList.length>0){
+    part+='.'+node.classList[0];
+    }
+    return part;
+    }
+    
+    const parts=[];
+    while(parts.length<4){
+    parts.unshift(getSelectorPart(node));
+    if(!node.parentElement){
+    break;
+    }
+    node=node.parentElement;
+    if(node.tagName==='HTML'){
+    break;
+    }
+    }
+    return parts.join(' > ');
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function isPositionFixed(element){
+    
+    
+    
+    
+    
+    function getStyleAttrValue(element,attr){
+    
+    return element.style[attr]||window.getComputedStyle(element)[attr];
+    }
+    
+    
+    const htmlEl=document.querySelector('html');
+    if(htmlEl.scrollHeight<=htmlEl.clientHeight||
+    !['scroll','auto','visible'].includes(getStyleAttrValue(htmlEl,'overflowY'))){
+    return false;
+    }
+    
+    let currentEl=element;
+    while(currentEl){
+    const position=getStyleAttrValue(currentEl,'position');
+    if(position==='fixed'||position==='sticky'){
+    return true;
+    }
+    currentEl=currentEl.parentElement;
+    }
+    return false;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function getNodeLabel(node){
+    
+    
+    
+    
+    
+    
+    
+    function truncate(str,maxLength){
+    if(str.length<=maxLength){
+    return str;
+    }
+    return str.slice(0,maxLength-1)+'…';
+    }
+    
+    const tagName=node.tagName.toLowerCase();
+    
+    if(tagName!=='html'&&tagName!=='body'){
+    const nodeLabel=node.innerText||node.getAttribute('alt')||node.getAttribute('aria-label');
+    if(nodeLabel){
+    return truncate(nodeLabel,80);
+    }else{
+    
+    
+    const nodeToUseForLabel=node.querySelector('[alt], [aria-label]');
+    if(nodeToUseForLabel){
+    return getNodeLabel(nodeToUseForLabel);
+    }
+    }
+    }
+    return tagName;
+    }
+    
+    module.exports={
+    wrapRuntimeEvalErrorInBrowserString:wrapRuntimeEvalErrorInBrowser.toString(),
+    registerPerformanceObserverInPageString:registerPerformanceObserverInPage.toString(),
+    checkTimeSinceLastLongTaskString:checkTimeSinceLastLongTask.toString(),
+    getElementsInDocumentString:getElementsInDocument.toString(),
+    getOuterHTMLSnippetString:getOuterHTMLSnippet.toString(),
+    getOuterHTMLSnippet:getOuterHTMLSnippet,
+    ultradumbBenchmark:ultradumbBenchmark,
+    ultradumbBenchmarkString:ultradumbBenchmark.toString(),
+    getNodePathString:getNodePath.toString(),
+    getNodeSelectorString:getNodeSelector.toString(),
+    getNodeSelector:getNodeSelector,
+    getNodeLabel:getNodeLabel,
+    getNodeLabelString:getNodeLabel.toString(),
+    isPositionFixedString:isPositionFixed.toString()};
+    
+    
+    },{}],77:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    function rectContainsPoint(rect,{x,y}){
+    return rect.left<=x&&rect.right>=x&&rect.top<=y&&rect.bottom>=y;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function rectContains(rect1,rect2){
+    return rect2.top>=rect1.top&&
+    rect2.right<=rect1.right&&
+    rect2.bottom<=rect1.bottom&&
+    rect2.left>=rect1.left;
+    }
+    
+    
+    
+    
+    
+    function filterOutTinyRects(rects){
+    return rects.filter(
+    rect=>rect.width>1&&rect.height>1);
+    
+    }
+    
+    
+    
+    
+    
+    function filterOutRectsContainedByOthers(rects){
+    const rectsToKeep=new Set(rects);
+    
+    for(const rect of rects){
+    for(const possiblyContainingRect of rects){
+    if(rect===possiblyContainingRect)continue;
+    if(!rectsToKeep.has(possiblyContainingRect))continue;
+    if(rectContains(possiblyContainingRect,rect)){
+    rectsToKeep.delete(rect);
+    break;
+    }
+    }
+    }
+    
+    return Array.from(rectsToKeep);
+    }
+    
+    
+    
+    
+    
+    function getRectCenterPoint(rect){
+    return{
+    x:rect.left+rect.width/2,
+    y:rect.top+rect.height/2};
+    
+    }
+    
+    
+    
+    
+    
+    
+    function rectsTouchOrOverlap(rectA,rectB){
+    
+    return(
+    rectA.left<=rectB.right&&
+    rectB.left<=rectA.right&&
+    rectA.top<=rectB.bottom&&
+    rectB.top<=rectA.bottom);
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function getBoundingRectWithPadding(rects,padding){
+    if(rects.length===0){
+    throw new Error('No rects to take bounds of');
+    }
+    
+    let left=Number.MAX_VALUE;
+    let right=-Number.MAX_VALUE;
+    let top=Number.MAX_VALUE;
+    let bottom=-Number.MAX_VALUE;
+    for(const rect of rects){
+    left=Math.min(left,rect.left);
+    right=Math.max(right,rect.right);
+    top=Math.min(top,rect.top);
+    bottom=Math.max(bottom,rect.bottom);
+    }
+    
+    
+    const halfMinSize=padding/2;
+    left-=halfMinSize;
+    right+=halfMinSize;
+    top-=halfMinSize;
+    bottom+=halfMinSize;
+    
+    return{
+    left,
+    right,
+    top,
+    bottom,
+    width:right-left,
+    height:bottom-top};
+    
+    }
+    
+    
+    
+    
+    function getBoundingRect(rects){
+    return getBoundingRectWithPadding(rects,0);
+    }
+    
+    
+    
+    
+    
+    function addRectWidthAndHeight({left,top,right,bottom}){
+    return{
+    left,
+    top,
+    right,
+    bottom,
+    width:right-left,
+    height:bottom-top};
+    
+    }
+    
+    
+    
+    
+    
+    function addRectTopAndBottom({x,y,width,height}){
+    return{
+    left:x,
+    top:y,
+    right:x+width,
+    bottom:y+height,
+    width,
+    height};
+    
+    }
+    
+    
+    
+    
+    
+    function getRectOverlapArea(rect1,rect2){
+    
+    const rectYOverlap=Math.min(rect1.bottom,rect2.bottom)-Math.max(rect1.top,rect2.top);
+    if(rectYOverlap<=0)return 0;
+    
+    const rectXOverlap=Math.min(rect1.right,rect2.right)-Math.max(rect1.left,rect2.left);
+    if(rectXOverlap<=0)return 0;
+    
+    return rectXOverlap*rectYOverlap;
+    }
+    
+    
+    
+    
+    
+    function getRectAtCenter(rect,centerRectSize){
+    return addRectWidthAndHeight({
+    left:rect.left+rect.width/2-centerRectSize/2,
+    top:rect.top+rect.height/2-centerRectSize/2,
+    right:rect.right-rect.width/2+centerRectSize/2,
+    bottom:rect.bottom-rect.height/2+centerRectSize/2});
+    
+    }
+    
+    
+    
+    
+    
+    function getRectArea(rect){
+    return rect.width*rect.height;
+    }
+    
+    
+    
+    
+    
+    function getLargestRect(rects){
+    let largestRect=rects[0];
+    for(const rect of rects){
+    if(getRectArea(rect)>getRectArea(largestRect)){
+    largestRect=rect;
+    }
+    }
+    return largestRect;
+    }
+    
+    
+    
+    
+    
+    
+    function allRectsContainedWithinEachOther(rectListA,rectListB){
+    for(const rectA of rectListA){
+    for(const rectB of rectListB){
+    if(!rectContains(rectA,rectB)&&!rectContains(rectB,rectA)){
+    return false;
+    }
+    }
+    }
+    return true;
+    }
+    
+    module.exports={
+    rectContainsPoint,
+    rectContains,
+    addRectWidthAndHeight,
+    addRectTopAndBottom,
+    getRectOverlapArea,
+    getRectAtCenter,
+    getLargestRect,
+    getRectArea,
+    getRectCenterPoint,
+    getBoundingRect,
+    getBoundingRectWithPadding,
+    rectsTouchOrOverlap,
+    allRectsContainedWithinEachOther,
+    filterOutRectsContainedByOthers,
+    filterOutTinyRects};
+    
+    
+    },{}],78:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const log=require('lighthouse-logger');
+    
+    
+    
+    
+    const SENTRY_URL='https://a6bb0da87ee048cc9ae2a345fc09ab2e:63a7029f46f74265981b7e005e0f69f8@sentry.io/174697';
+    
+    
+    const SAMPLE_RATE=0.01;
+    
+    
+    const SAMPLED_ERRORS=[];
+    
+    
+    
+    
+    const noop=()=>{};
+    
+    
+    
+    
+    
+    const sentryDelegate={
+    init,
+    
+    captureMessage:noop,
+    
+    captureBreadcrumb:noop,
+    
+    getContext:noop,
+    
+    captureException:async()=>{},
+    _shouldSample(){
+    return SAMPLE_RATE>=Math.random();
+    }};
+    
+    
+    
+    
+    
+    
+    function init(opts){
+    
+    if(!opts.flags.enableErrorReporting){
+    return;
+    }
+    
+    
+    if(!sentryDelegate._shouldSample()){
+    return;
+    }
+    
+    try{
+    const Sentry=require('raven');
+    const sentryConfig=Object.assign({},opts.environmentData,
+    {captureUnhandledRejections:true});
+    Sentry.config(SENTRY_URL,sentryConfig).install();
+    
+    
+    sentryDelegate.captureMessage=(...args)=>Sentry.captureMessage(...args);
+    sentryDelegate.captureBreadcrumb=(...args)=>Sentry.captureBreadcrumb(...args);
+    sentryDelegate.getContext=()=>Sentry.getContext();
+    
+    
+    const sentryExceptionCache=new Map();
+    
+    sentryDelegate.captureException=async(err,opts={})=>{
+    
+    if(!err)return;
+    
+    
+    
+    if(err.expected)return;
+    
+    const tags=opts.tags||{};
+    if(tags.audit){
+    const key=`audit-${tags.audit}-${err.message}`;
+    if(sentryExceptionCache.has(key))return;
+    sentryExceptionCache.set(key,true);
+    }
+    
+    if(tags.gatherer){
+    const key=`gatherer-${tags.gatherer}-${err.message}`;
+    if(sentryExceptionCache.has(key))return;
+    sentryExceptionCache.set(key,true);
+    }
+    
+    
+    const sampledErrorMatch=SAMPLED_ERRORS.find(sample=>sample.pattern.test(err.message));
+    if(sampledErrorMatch&&sampledErrorMatch.rate<=Math.random())return;
+    
+    
+    
+    if(err.protocolMethod){
+    
+    opts.fingerprint=['{{ default }}',err.protocolMethod,err.protocolError];
+    }
+    
+    return new Promise(resolve=>{
+    Sentry.captureException(err,opts,()=>resolve());
+    });
+    };
+    
+    const context=Object.assign({
+    url:opts.url,
+    emulatedFormFactor:opts.flags.emulatedFormFactor,
+    throttlingMethod:opts.flags.throttlingMethod},
+    opts.flags.throttling);
+    Sentry.mergeContext({extra:Object.assign({},opts.environmentData.extra,context)});
+    }catch(e){
+    log.warn(
+    'sentry',
+    'Could not load raven library, errors will not be reported.');
+    
+    }
+    }
+    
+    module.exports=sentryDelegate;
+    
+    },{"lighthouse-logger":125,"raven":101}],79:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    const libDetectorSource="var UNKNOWN_VERSION = null;\nvar d41d8cd98f00b204e9800998ecf8427e_LibraryDetectorTests = {\n\n    'GWT': {\n        icon: 'gwt',\n        url: 'http://www.gwtproject.org/',\n        test: function(win) {\n            // pretty complicated, many possible tell tales\n            var doc = win.document,\n                hasHistFrame = doc.getElementById('__gwt_historyFrame'),\n                hasGwtUid = doc.gwt_uid,\n                hasBodyListener = doc.body.__listener,\n                hasBodyEventBits = doc.body.__eventBits,\n                hasModules = win.__gwt_activeModules,\n                hasJsonP = win.__gwt_jsonp__,\n                hasRootWinApp = win.__gwt_scriptsLoaded || win.__gwt_stylesLoaded || win.__gwt_activeModules;\n\n            // use the many possible indicators\n            if(hasHistFrame || hasGwtUid || hasBodyListener || hasBodyEventBits || hasModules || hasJsonP || hasRootWinApp) {\n\n                // carefully look at frames, but only if certain is GWT frame\n                var frames = doc.getElementsByTagName('iframe'),\n                    gwtVersion = UNKNOWN_VERSION;\n                for(var n=0; n<frames.length; n++) {\n                    // catch security access errors\n                    try {\n                        var hasNegativeTabIndex = frames[n].tabIndex < 0; // on for GWT\n                        if(hasNegativeTabIndex && frames[n].contentWindow && frames[n].contentWindow.$gwt_version) {\n                            gwtVersion = frames[n].contentWindow.$gwt_version;\n                            break;\n                        }\n                    }\n                    catch(e) {}\n                }\n\n                if(gwtVersion=='0.0.999') {\n                  gwtVersion = 'Google Internal';\n                }\n\n                return { version: gwtVersion };\n            }\n            return false;\n        }\n    },\n\n    'Ink': {\n        icon: 'ink',\n        url: 'http://ink.sapo.pt/',\n        test: function(win) {\n            if (win.Ink && win.Ink.createModule) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Vaadin': {\n        icon: 'vaadin',\n        url: 'https://vaadin.com/',\n        test: function(win) {\n            if (win.vaadin && win.vaadin.registerWidgetset) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Bootstrap': {\n        icon: 'bootstrap',\n        url: 'http://getbootstrap.com/',\n        npm: 'bootstrap',\n        // look for a function Boostrap has added to jQuery - regex for BS 2 & 3\n        test: function(win) {\n            var jQueryAvailable = win.$ && win.$.fn,\n                RE_PREFIX_V2 = '\\\\$this\\\\.data\\\\((?:\\'|\")',\n                RE_PREFIX_V3 = '\\\\$this\\\\.data\\\\((?:\\'|\")(?:bs\\\\.){1}',\n                bootstrapComponents = [\n                    'affix', 'alert', 'button', 'carousel', 'collapse', 'dropdown',\n                    'modal', 'popover', 'scrollspy', 'tab', 'tooltip'\n                ];\n\n            if(jQueryAvailable) {\n                var bootstrapVersion;\n\n                bootstrapComponents.some(function(component) {\n                    if(win.$.fn[component]) {\n                        // Bootstrap >= 3.2.0 detection\n                        if(win.$.fn[component].Constructor && win.$.fn[component].Constructor.VERSION) {\n                            bootstrapVersion = win.$.fn[component].Constructor.VERSION;\n                            return true;\n                        // Bootstrap >= 2.0.0 and <= 3.1.0 detection\n                        } else if(new RegExp(RE_PREFIX_V3 + component).test(win.$.fn[component].toString())) {\n                            bootstrapVersion = '>= 3.0.0 & <= 3.1.1';\n                            return true;\n                        // Bootstrap < 3.1.0 detection\n                        } else if(new RegExp(RE_PREFIX_V2 + component).test(win.$.fn[component].toString())) {\n                            bootstrapVersion = '>= 2.0.0 & <= 2.3.2';\n                            return true;\n                        }\n                    }\n\n                    return false;\n                });\n\n                if (bootstrapVersion) {\n                    return { version: bootstrapVersion };\n                }\n            }\n\n            return false;\n        }\n    },\n\n    'Zurb': {\n        icon: 'zurb',\n        url: 'https://foundation.zurb.com/',\n        npm: 'foundation-sites',\n        test: function(win) {\n            if(win.Foundation && win.Foundation.Toggler) {\n                return { version: win.Foundation.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Polymer': {\n        icon: 'polymer',\n        url: 'https://www.polymer-project.org/',\n        npm: '@polymer/polymer',\n        test: function(win) {\n            if(win.Polymer && win.Polymer.dom) {\n                return { version: win.Polymer.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Highcharts': {\n        icon: 'highcharts',\n        url: 'http://www.highcharts.com',\n        npm: 'highcharts',\n        test: function(win) {\n            if(win.Highcharts && win.Highcharts.Point) {\n                return { version: win.Highcharts.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'InfoVis': {\n        icon: 'jit',\n        url: 'http://philogb.github.com/jit/',\n        test: function test(win) {\n            if(win.$jit && win.$jit.PieChart) {\n                return { version: win.$jit.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'FlotCharts': {\n        icon: 'flotcharts',\n        url: 'http://www.flotcharts.org/',\n        npm: 'flot',\n        test: function(win) {\n            if(win.$ && win.$.plot) {\n                return { version: win.$.plot.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'CreateJS': {\n        icon: 'createjs',\n        url: 'https://createjs.com/',\n        npm: 'createjs',\n        test: function(win) {\n            if(win.createjs && win.createjs.promote) {\n                return { version: UNKNOWN_VERSION}; // no version info available\n            }\n            return false;\n        }\n    },\n\n    'Google Maps': {\n        icon: 'gmaps',\n        url: 'https://developers.google.com/maps/',\n        test: function(win) {\n            if (win.google && win.google.maps) {\n                return { version: win.google.maps.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'jQuery': {\n        icon: 'jquery',\n        url: 'http://jquery.com',\n        npm: 'jquery',\n        test: function(win) {\n            var jq = win.jQuery || win.$;\n            if (jq && jq.fn && jq.fn.jquery) {\n                return { version: jq.fn.jquery.replace(/[^\\d+\\.+]/g, '') || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'jQuery (Fast path)': {\n        icon: 'jquery',\n        url: 'http://jquery.com',\n        npm: 'jquery',\n        test: function (win) {\n            var jq = win.jQuery || win.$;\n            if (jq && jq.fn) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'jQuery UI': {\n        icon: 'jquery_ui',\n        url: 'http://jqueryui.com',\n        npm: 'jquery-ui',\n        test: function(win) {\n            var jq = win.jQuery || win.$ || win.$jq || win.$j;\n            if(jq && jq.fn && jq.fn.jquery && jq.ui) {\n                var plugins = 'accordion,datepicker,dialog,draggable,droppable,progressbar,resizable,selectable,slider,menu,grid,tabs'.split(','), concat = [];\n                for (var i=0; i < plugins.length; i++) { if(jq.ui[plugins[i]]) concat.push(plugins[i].substr(0,1).toUpperCase() + plugins[i].substr(1)); }\n                return { version: jq.ui.version || UNKNOWN_VERSION, details: concat.length ? 'Plugins used: '+concat.join(',') : '' };\n            }\n            return false;\n        }\n    },\n\n    'Dojo': {\n        icon: 'dojo',\n        url: 'http://dojotoolkit.org',\n        npm: 'dojo',\n        test: function(win) {\n            if(win.dojo && win.dojo.delegate) {\n                var version = win.dojo.version ? win.dojo.version.toString() : UNKNOWN_VERSION;\n                return { version: version, details: 'Details: '+(win.dijit ? 'Uses Dijit' : 'none') };\n            }\n            return false;\n        }\n    },\n\n    'Prototype': {\n        icon: 'prototype',\n        url: 'http://prototypejs.org',\n        test: function(win) {\n            if(win.Prototype && win.Prototype.BrowserFeatures) {\n                return { version: win.Prototype.Version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Scriptaculous': {\n        icon: 'scriptaculous',\n        url: 'http://script.aculo.us',\n        test: function(win) {\n            if(win.Scriptaculous && win.Scriptaculous.load) {\n                return { version: win.Scriptaculous.Version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'MooTools': {\n        icon: 'mootools',\n        url: 'https://mootools.net/',\n        test: function(win) {\n            if(win.MooTools && win.MooTools.build) {\n                return { version: win.MooTools.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Spry': {\n        icon: 'spry',\n        url: 'http://labs.adobe.com/technologies/spry',\n        test: function(win) {\n            if (win.Spry && win.Spry.Data) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'YUI 2': {\n        icon: 'yui',\n        url: 'http://developer.yahoo.com/yui/2/',\n        test: function(win) {\n            if (win.YAHOO && win.YAHOO.util) {\n                return { version: win.YAHOO.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'YUI 3': {\n        icon: 'yui3',\n        url: 'https://yuilibrary.com/',\n        npm: 'yui',\n        test: function(win) {\n            if (win.YUI && win.YUI.Env) {\n                return { version: win.YUI.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Qooxdoo': {\n        icon: 'qooxdoo',\n        url: 'http://www.qooxdoo.org/',\n        npm: 'qooxdoo',\n        test: function(win) {\n            if(win.qx && win.qx.Bootstrap) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Ext JS': {\n        icon: 'extjs',\n        url: 'https://www.sencha.com/products/extjs/',\n        test: function(win) {\n            if (win.Ext && win.Ext.versions) {\n                return { version: win.Ext.versions.core.version };\n            }\n            else if(win.Ext) {\n                return { version: win.Ext.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'base2': {\n        icon: 'base2',\n        url: 'http://code.google.com/p/base2',\n        test: function(win) {\n            if(win.base2 && win.base2.dom) {\n                return { version: win.base2.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Closure Library': {\n        icon: 'closure',\n        url: 'https://developers.google.com/closure/library/',\n        npm: 'google-closure-library',\n        test: function(win) {\n            if(win.goog && win.goog.provide) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Rapha&euml;l': {\n        icon: 'raphael',\n        url: 'http://dmitrybaranovskiy.github.io/raphael/',\n        test: function(win) {\n            if (win.Raphael && win.Raphael.circle) {\n                return { version: win.Raphael.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'React': {\n        icon: 'react',\n        url: 'https://reactjs.org/',\n        npm: 'react',\n        test: function(win) {\n            function isMatch(node) {\n                return node!=null && node._reactRootContainer!=null;\n            }\n            function nodeFilter(node) {\n                return isMatch(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;\n            }\n            var reactRoot = document.getElementById('react-root');\n            var altHasReact = document.querySelector('*[data-reactroot]');\n            var bodyReactRoot = isMatch(document.body) || isMatch(document.body.firstElementChild);\n            var hasReactRoot = bodyReactRoot|| document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT, nodeFilter).nextNode() != null;\n            if (hasReactRoot || reactRoot && reactRoot.innerText.length > 0 || altHasReact || win.React && win.React.Component) {\n                return { version: win.React && win.React.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'React (Fast path)': {\n        icon: 'react',\n        url: 'https://reactjs.org/',\n        npm: 'react',\n        test: function (win) {\n            function isMatch(node) {\n                return node != null && node._reactRootContainer != null;\n            }\n            var reactRoot = document.getElementById('react-root');\n            var altHasReact = document.querySelector('*[data-reactroot]');\n            var hasReactRoot = isMatch(document.body) || isMatch(document.body.firstElementChild);\n            if (hasReactRoot || reactRoot || altHasReact || win.React) {\n                return { version: win.React && win.React.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Next.js': {\n        icon: 'next',\n        url: 'https://nextjs.org/',\n        npm: 'next',\n        test: function(win) {\n            if (win.__NEXT_DATA__ && win.__NEXT_DATA__.buildId) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Next.js (Fast path)': {\n        icon: 'next',\n        url: 'https://nextjs.org/',\n        npm: 'next',\n        test: function (win) {\n            if (win.__NEXT_DATA__) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Preact': {\n        icon: 'preact',\n        url: 'https://preactjs.com/',\n        npm: 'preact',\n        test: function(win) {\n            var expando = typeof Symbol!='undefined' && Symbol.for && Symbol.for('preactattr');\n            function isMatch(node) {\n                return node._component!=null || node.__preactattr_!=null || expando && node[expando]!=null;\n            }\n            function getMatch(node) {\n                return node!=null && isMatch(node) && node;\n            }\n            function nodeFilter(node) {\n                return isMatch(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;\n            }\n            var preactRoot = getMatch(document.body) || getMatch(document.body.firstElementChild);\n            if (!preactRoot) {\n                preactRoot = document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT, nodeFilter).nextNode();\n            }\n            if (preactRoot || win.preact) {\n                var version = UNKNOWN_VERSION;\n                if (expando && preactRoot && preactRoot[expando]!=null) {\n                    version = '7';\n                }\n                return { version: version };\n            }\n            return false;\n        }\n    },\n\n    'Preact (Fast path)': {\n        icon: 'preact',\n        url: 'https://preactjs.com/',\n        npm: 'preact',\n        test: function (win) {\n            function isMatch(node) {\n                return node._component != null || node.__preactattr_ != null;\n            }\n            function getMatch(node) {\n                return node != null && isMatch(node);\n            }\n            var preactRoot = getMatch(document.body) || getMatch(document.body.firstElementChild);\n            if (preactRoot || win.preact) {\n                var version = UNKNOWN_VERSION;\n                return { version: version };\n            }\n            return false;\n        }\n    },\n\n    'Modernizr': {\n        icon: 'modernizr',\n        url: 'https://modernizr.com/',\n        npm: 'modernizr',\n        test: function(win) {\n            if (win.Modernizr && win.Modernizr.addTest) {\n                return { version: win.Modernizr._version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Processing.js': {\n        icon: 'processingjs',\n        url: 'http://processingjs.org',\n        npm: 'processing-js',\n        test: function(win) {\n            if(win.Processing && win.Processing.box) {\n                return { version: Processing.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Backbone': {\n        icon: 'backbone',\n        url: 'http://backbonejs.org/',\n        npm: 'backbone',\n        test: function(win) {\n            if (win.Backbone && win.Backbone.Model.extend) {\n                return {version: win.Backbone.VERSION || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Leaflet': {\n        icon: 'leaflet',\n        url: 'http://leafletjs.com',\n        npm: 'leaflet',\n        test: function(win) {\n            // Leaflet 3.1 uses L.Marker and L.VERSION; later versions use L.marker and L.version\n            if (win.L && win.L.GeoJSON && (win.L.marker || win.L.Marker)) {\n                return { version: win.L.version || win.L.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Mapbox': {\n        icon: 'mapbox',\n        url: 'https://www.mapbox.com/',\n        npm: 'mapbox-gl',\n        test: function(win) {\n            if (win.L && win.L.mapbox && win.L.mapbox.geocoder) {\n                return { version: win.L.mapbox.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Lo-Dash': {\n        icon: 'lodash',\n        url: 'https://lodash.com/',\n        npm: 'lodash',\n        test: function(win) {\n            var _ = typeof (_ = win._) == 'function' && _,\n                chain = typeof (chain = _ && _.chain) == 'function' && chain,\n                wrapper = (chain || _ || function() { return {}; })(1);\n\n            if (_ && wrapper.__wrapped__) {\n                return { version: _.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Underscore': {\n        icon: 'underscore',\n        url: 'http://underscorejs.org/',\n        npm: 'underscore',\n        test: function(win) {\n            if (win._ && typeof win._.tap === 'function' &&\n                !d41d8cd98f00b204e9800998ecf8427e_LibraryDetectorTests['Lo-Dash'].test(win)) {\n                return {version: win._.VERSION || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Sammy': {\n        icon: 'sammy',\n        url: 'http://sammyjs.org',\n        test: function(win) {\n            if (win.Sammy && win.Sammy.Application.curry) {\n                return {version: win.Sammy.VERSION || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Rico': {\n        icon: 'rico',\n        url: 'http://openrico.sourceforge.net/examples/index.html',\n        test:  function(win) {\n            if (win.Rico && window.Rico.checkIfComplete) {\n                return {version: win.Rico.Version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'MochiKit': {\n        icon: 'mochikit',\n        url: 'https://mochi.github.io/mochikit/',\n        test: function(win) {\n            if (win.MochiKit && win.MochiKit.Base.module) {\n                return {version: MochiKit.VERSION || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'gRapha&euml;l': {\n        icon: 'graphael',\n        url: 'https://github.com/DmitryBaranovskiy/g.raphael',\n        test: function(win) {\n            if (win.Raphael && win.Raphael.fn.g) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Glow': {\n        icon: 'glow',\n        url: 'http://www.bbc.co.uk/glow/',\n        test: function(win) {\n            if (win.gloader && win.gloader.getRequests) {\n                return {version: UNKNOWN_VERSION};\n            }\n            else if (win.glow && win.glow.dom) {\n                return {version: win.glow.VERSION || UNKNOWN_VERSION};\n            }\n            else if (win.Glow) {\n                return {version: win.Glow.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Socket.IO': {\n        icon: 'socketio', // currently has no icon\n        url: 'https://socket.io/',\n        npm: 'socket.io',\n        test: function(win) {\n            // version 0.6.2 uses only io.Socket; more recent versions also have io.sockets\n            if (win.io && (win.io.sockets || win.io.Socket)) {\n                return {version: win.io.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Mustache': {\n        icon: 'mustache',\n        url: 'http://mustache.github.io/',\n        npm: 'mustache',\n        test: function(win) {\n            if (win.Mustache && win.Mustache.to_html) {\n                return {version: win.Mustache.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Fabric.js': {\n        icon: 'icon38', // currently has no icon\n        url: 'http://fabricjs.com/',\n        npm: 'fabric',\n        test: function(win) {\n            if (win.fabric && win.fabric.util) {\n                return {version: win.fabric.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'FuseJS': {\n        icon: 'fusejs',\n        url: 'http://fusejs.io/',\n        npm: 'fuse.js',\n        test: function(win) {\n            if (win.Fuse) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Tween.js': {\n        icon: 'icon38', // currently has no icon\n        url: 'https://github.com/tweenjs/tween.js',\n        npm: 'tween.js',\n        test: function(win) {\n            if (win.TWEEN && win.TWEEN.Easing) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'SproutCore': {\n       icon: 'sproutcore',\n       url: 'http://sproutcore.com/',\n       test: function(win) {\n           if (win.SC && win.SC.Application) {\n               return {version: UNKNOWN_VERSION};\n           }\n           return false;\n       }\n    },\n\n    'Zepto.js': {\n       icon: 'zepto',\n       url: 'http://zeptojs.com',\n       npm: 'zepto',\n       test: function(win) {\n           if (win.Zepto && win.Zepto.fn) {\n               return {version: UNKNOWN_VERSION};\n           }\n           return false;\n       }\n    },\n\n    'three.js': {\n       icon: 'icon38', // currently has no icon\n       url: 'https://threejs.org/',\n       npm: 'three',\n       test: function(win) {\n           if (win.THREE && win.THREE.REVISION) {\n               return {version: 'r' + win.THREE.REVISION};\n           }\n           else if (win.THREE) {\n               return {version: UNKNOWN_VERSION};\n           }\n           return false;\n       }\n    },\n\n    'PhiloGL': {\n       icon: 'philogl',\n       url: 'http://www.senchalabs.org/philogl/',\n       npm: 'philogl',\n       test: function(win) {\n           if (win.PhiloGL && win.PhiloGL.Camera) {\n               return {version: win.PhiloGL.version || UNKNOWN_VERSION};\n           }\n           return false;\n       }\n    },\n\n    'CamanJS': {\n        icon: 'camanjs',\n        url: 'http://camanjs.com/',\n        npm: 'caman',\n        test: function(win) {\n            if (win.Caman && win.Caman.version) {\n                return {version: win.Caman.version.release};\n            }\n            else if (win.Caman) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'yepnope': {\n        icon: 'yepnope',\n        url: 'http://yepnopejs.com/',\n        test: function(win) {\n            if (win.yepnope && win.yepnope.injectJs) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'LABjs': {\n        icon: 'icon38',\n        url: 'https://github.com/getify/LABjs',\n        test: function(win) {\n            if (win.$LAB && win.$LAB.setOptions) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'Head JS': {\n        icon: 'headjs',\n        url: 'http://headjs.com/',\n        npm: 'headjs',\n        test: function(win) {\n            if (win.head && win.head.js) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'ControlJS': {\n        icon: 'icon38',\n        url: 'http://stevesouders.com/controljs/',\n        test: function(win) {\n            if (win.CJS && win.CJS.start) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'RequireJS': {\n        icon: 'requirejs',\n        url: 'http://requirejs.org/',\n        npm: 'requirejs',\n        test: function(win) {\n            var req = win.require || win.requirejs;\n            if (req && (req.load || (req.s && req.s.contexts && req.s.contexts._ && (req.s.contexts._.loaded || req.s.contexts._.load)))) {\n                return { version: req.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'RightJS': {\n        icon: 'rightjs',\n        url: 'http://rightjs.org/',\n        test: function(win) {\n            if (win.RightJS && win.RightJS.isNode) {\n                return { version: win.RightJS.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'jQuery Tools': {\n       icon: 'jquerytools',\n       url: 'http://jquerytools.github.io/',\n       test: function(win) {\n            var jq = win.jQuery || win.$;\n            if(jq && jq.tools) {\n               return { version: jq.tools.version || UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'Pusher': {\n       icon: 'pusher',\n       url: 'https://pusher.com/docs/',\n       npm: 'pusher-js',\n       test: function(win) {\n            if(win.Pusher && win.Pusher.Channel) {\n               return { version: win.Pusher.VERSION || UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'Paper.js': {\n       icon: 'paperjs',\n       url: 'http://paperjs.org/',\n       npm: 'paper',\n       test: function(win) {\n            if(win.paper && win.paper.Point) {\n               return { version: win.paper.version || UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'Swiffy': {\n       icon: 'icon38',\n       url: 'https://developers.google.com/swiffy/',\n       test: function(win) {\n            if(win.swiffy && win.swiffy.Stage) {\n               return { version: UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'Move': {\n       icon: 'move',\n       url: 'https://github.com/rsms/move',\n       npm: 'move',\n       test: function(win) {\n            if(win.move && win.move.compile) {\n               return { version: win.move.version() || UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'AmplifyJS': {\n       icon: 'amplifyjs',\n       url: 'http://amplifyjs.com/',\n       npm: 'amplifyjs',\n       test: function(win) {\n            if(win.amplify && win.amplify.publish) {\n               return { version: UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'Popcorn.js': {\n       icon: 'popcornjs',\n       url: 'https://github.com/mozilla/popcorn-js/',\n       test: function(win) {\n            if (win.Popcorn && win.Popcorn.Events) {\n               return { version: win.Popcorn.version || UNKNOWN_VERSION };\n           }\n           return false;\n       }\n    },\n\n    'D3': {\n        icon: 'd3',\n        url: 'https://d3js.org/',\n        npm: 'd3',\n        test: function(win) {\n            if (win.d3 && win.d3.select) {\n                return { version: win.d3.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Handlebars': {\n        icon: 'handlebars',\n        url: 'http://handlebarsjs.com/',\n        npm: 'handlebars',\n        test: function(win) {\n            if(win.Handlebars && win.Handlebars.compile) {\n                return { version: win.Handlebars.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Knockout': {\n        icon: 'knockout',\n        url: 'http://knockoutjs.com/',\n        npm: 'knockout',\n        test: function(win) {\n            if (win.ko && win.ko.applyBindings) {\n                return { version: win.ko.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Spine': {\n        icon: 'icon38',\n        url: 'http://spine.github.io/',\n        test: function(win) {\n            if (win.Spine && win.Spine.Controller) {\n                return {version: win.Spine.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n\n    'jQuery Mobile': {\n        icon: 'jquery_mobile',\n        url: 'http://jquerymobile.com/',\n        npm: 'jquery-mobile',\n        test: function(win) {\n            var jq = win.jQuery || win.$ || win.$jq || win.$j;\n            if(jq && jq.fn && jq.fn.jquery && jq.mobile) {\n                return { version: jq.mobile.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'WebFont Loader': {\n        icon: 'icon38',\n        url: 'https://github.com/typekit/webfontloader',\n        npm: 'webfontloader',\n        test: function(win) {\n            if(win.WebFont && win.WebFont.load) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Angular': {\n        icon: 'angular',\n        url: 'https://angular.io/',\n        npm: '@angular/core',\n        test: function(win) {\n            var ngVersion = win.document.querySelector('[ng-version]');\n            if (ngVersion) {\n                return { version: ngVersion.getAttribute('ng-version') || UNKNOWN_VERSION };\n            }\n            else if (win.ng && win.ng.probe instanceof Function) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'AngularJS': {\n        icon: 'angularjs',\n        url: 'https://angularjs.org/',\n        npm: 'angular',\n        test: function(win) {\n            var ng = win.angular;\n            if(ng && ng.version && ng.version.full) {\n                return { version: ng.version.full };\n            }\n            else if (ng) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Ember.js': {\n        icon: 'emberjs',\n        url: 'https://emberjs.com/',\n        npm: 'ember-source',\n        test: function(win) {\n            var ember = win.Ember || win.Em;\n            if (ember && ember.GUID_KEY) {\n                return { version: ember.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Ember.js (Fast path)': {\n        icon: 'emberjs',\n        url: 'https://emberjs.com/',\n        npm: 'ember-source',\n        test: function (win) {\n            var ember = win.Ember || win.Em;\n            if (ember) {\n                return { version: ember.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Hammer.js': {\n        icon: 'hammerjs',\n        url: 'http://eightmedia.github.io/hammer.js/',\n        npm: 'hammerjs',\n        test: function(win) {\n            if(win.Hammer && win.Hammer.Pinch) {\n                // Hammer.VERSION available in 1.0.10+\n                return { version: win.Hammer.VERSION || \"&lt; 1.0.10\" };\n            }\n            return false;\n        }\n    },\n\n    'Visibility.js': {\n        icon: 'icon38',\n        url: 'https://github.com/ai/visibilityjs',\n        npm: 'visibilityjs',\n        test: function(win) {\n            if(win.Visibility && win.Visibility.every) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'Velocity.js': {\n        icon: 'icon38',\n        url: 'http://velocityjs.org/',\n        npm: 'velocity-animate',\n        test: function(win) {\n            var jq = win.jQuery || win.$,\n                velocity = jq ? jq.Velocity : win.Velocity;\n\n            if(velocity && velocity.RegisterEffect && velocity.version) {\n                return {\n                    version:\n                        velocity.version.major + \".\" +\n                        velocity.version.minor + \".\" +\n                        velocity.version.patch\n                };\n            }\n            else if (velocity && velocity.RegisterEffect) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n\n    'IfVisible.js': {\n        icon: 'icon38',\n        url: 'http://serkanyersen.github.io/ifvisible.js/',\n        npm: 'ifvisible.js',\n        test: function(win) {\n            var iv = win.ifvisible;\n            if(iv && iv.__ceGUID === \"ifvisible.object.event.identifier\") {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Pixi.js': {\n        icon: 'pixi',\n        url: 'http://www.pixijs.com/',\n        npm: 'pixi.js',\n        test: function(win) {\n            var px = win.PIXI;\n            if(px && px.WebGLRenderer && px.VERSION) {\n                // version 4.4.3 returns simply \"4.4.3\"; version 1.5.2 returns \"v1.5.2\"\n                return { version: px.VERSION.replace('v', '') || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'DC.js': {\n        icon: 'dcjs',\n        url: 'http://dc-js.github.io/dc.js/',\n        npm: 'dc',\n        test: function(win) {\n            var dc = win.dc;\n            if(dc && dc.registerChart) {\n                return { version: dc.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'GreenSock JS': {\n        icon: 'greensock',\n        url: 'https://greensock.com/gsap',\n        npm: 'gsap',\n        test: function(win) {\n            if (win.TweenMax && win.TweenMax.pauseAll) {\n                return { version: win.TweenMax.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'FastClick': {\n        icon: 'fastclick',\n        url: 'https://github.com/ftlabs/fastclick',\n        npm: 'fastclick',\n        test: function(win) {\n            if(win.FastClick && win.FastClick.notNeeded) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Isotope': {\n        icon: 'isotope',\n        url: 'https://isotope.metafizzy.co/',\n        npm: 'isotope-layout',\n        test: function(win) {\n            if(win.Isotope || (win.$ != null && win.$.Isotope)) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Marionette': {\n        icon: 'marionette',\n        url: 'https://marionettejs.com/',\n        npm: 'backbone.marionette',\n        test: function(win) {\n            if(win.Marionette && win.Marionette.Application) {\n                return { version: win.Marionette.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Can': {\n        icon: 'canjs',\n        url: 'https://canjs.com/',\n        npm: 'can',\n        test: function (win) {\n            if (win.can && win.can.Construct) {\n                return { version: win.can.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Vue': {\n        icon: 'vue',\n        url: 'https://vuejs.org/',\n        npm: 'vue',\n        test: function(win) {\n            function isVueNode(node) {\n                return node.__vue__ != null ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;\n            }\n            var hasVueNode = document.createTreeWalker(document.body, NodeFilter.SHOW_ELEMENT, isVueNode).nextNode() !== null;\n            if (hasVueNode) {\n                return { version: win.Vue && win.Vue.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Vue (Fast path)': {\n        icon: 'vue',\n        url: 'https://vuejs.org/',\n        npm: 'vue',\n        test: function (win) {\n            if (win.Vue) {\n                return { version: win.Vue && win.Vue.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Nuxt.js': {\n        icon: 'nuxt',\n        url: 'https://nuxtjs.org/',\n        npm: 'nuxt',\n        test: function(win) {\n            if ((win.__NUXT__ && win.__NUXT__.data != null) || win.$nuxt) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Nuxt.js (Fast path)': {\n        icon: 'nuxt',\n        url: 'https://nuxtjs.org/',\n        npm: 'nuxt',\n        test: function (win) {\n            if (win.__NUXT__  || win.$nuxt) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Two': {\n        icon: 'two',\n        url: 'https://two.js.org/',\n        npm: 'two.js',\n        test: function(win) {\n            if (win.Two && win.Two.Utils) {\n                return { version: win.Two.Version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Brewser': {\n        icon: 'brewser',\n        url: 'https://robertpataki.github.io/brewser/',\n        npm: 'brewser',\n        test: function(win) {\n            if(win.BREWSER && win.BREWSER.ua) {\n                return { version: BREWSER.VERSION || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Material Design Lite': {\n        icon: 'mdl',\n        url: 'https://getmdl.io/',\n        npm: 'material-design-lite',\n        test: function(win) {\n            if(win.componentHandler && win.componentHandler.upgradeElement) {\n                return { version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n    'Kendo UI': {\n        icon: 'kendoui',\n        url: 'https://github.com/telerik/kendo-ui-core',\n        npm: 'kendo-ui-core',\n        test: function(win) {\n            if (win.kendo && win.kendo.View && win.kendo.View.extend) {\n                return {version: win.kendo.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n    'Matter.js': {\n        icon: 'matter-js',\n        url: 'http://brm.io/matter-js/',\n        npm: 'matter-js',\n        test: function(win) {\n            if (win.Matter && win.Matter.Engine) {\n                return {version: UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n    'Riot': {\n        icon: 'riot',\n        url: 'http://riotjs.com/',\n        npm: 'riot',\n        test: function(win) {\n            if (win.riot && win.riot.mixin) {\n                return { version: win.riot.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Sea.js': {\n        icon: 'icon38',\n        url: 'https://seajs.github.io/seajs/docs/',\n        npm: 'seajs',\n        test: function(win) {\n            if(win.seajs && win.seajs.use) {\n                return { version: win.seajs.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Moment.js': {\n        icon: 'momentjs',\n        url: 'http://momentjs.com/',\n        npm: 'moment',\n        test: function(win) {\n            if(win.moment && (win.moment.isMoment || win.moment.lang)) {\n                // version 1.0.0 has neither \"isMoment\" nor \"version\"\n                return { version: win.moment.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Moment Timezone': {\n        icon: 'momentjs',\n        url: 'http://momentjs.com/timezone/',\n        npm: 'moment-timezone',\n        test: function(win) {\n            if (win.moment && win.moment.tz) {\n                return { version: win.moment.tz.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'ScrollMagic': {\n        icon: 'scrollmagic',\n        url: 'http://scrollmagic.io/',\n        npm: 'scrollmagic',\n        test: function(win) {\n            if (win.ScrollMagic && win.ScrollMagic.Controller) {\n                return {version: ScrollMagic.version || UNKNOWN_VERSION};\n            }\n            return false;\n        }\n    },\n    'SWFObject': {\n        icon: 'icon38', // currently has no icon\n        url: 'https://github.com/swfobject/swfobject',\n        test: function(win) {\n            if (win.swfobject && win.swfobject.embedSWF) {\n                // 2.x - exact version only for 2.3\n                return { version: win.swfobject.version || UNKNOWN_VERSION };\n            } else if(win.deconcept && win.deconcept.SWFObject) {\n                // 1.x\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'FlexSlider': {\n        icon: 'icon38', // currently has no icon\n        url: 'https://woocommerce.com/flexslider/',\n        npm: 'flexslider',\n        test: function(win) {\n            var jq = win.jQuery || win.$ || win.$jq || win.$j;\n            if (jq && jq.fn && jq.fn.jquery && jq.flexslider){\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'SPF': {\n        icon: 'icon38', // currently has no icon\n        url: 'https://youtube.github.io/spfjs/',\n        npm: 'spf',\n        test: function(win) {\n            if (win.spf && win.spf.init) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Numeral.js': {\n        icon: 'icon38', // currently has no icon\n        url: 'http://numeraljs.com/',\n        npm: 'numeraljs',\n        test: function(win) {\n            if (win.numeral && win.isNumeral) {\n                return { version: win.numeral.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'boomerang.js': {\n        icon: 'icon38', // currently has no icon\n        url: 'https://soasta.github.io/boomerang/',\n        npm: 'boomerangjs',\n        test: function(win) {\n            if (win.BOOMR && win.BOOMR.utils && win.BOOMR.init) {\n                return { version: win.BOOMR.version || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Framer': {\n        icon: 'framer',\n        url: 'https://framer.com/',\n        npm: 'framerjs',\n        test: function(win) {\n            if (win.Framer && win.Framer.Layer) {\n                return { version: win.Framer.Version.build || UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Marko': {\n        icon: 'marko',\n        url: 'https://markojs.com/',\n        npm: 'marko',\n        test: function (win) {\n            var selector = '[data-marko-key], [data-marko]';\n            var markoElement = document.querySelector(selector);\n            if (markoElement) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'AMP': {\n        icon: 'amp',\n        url: 'https://ampproject.org/',\n        npm: null,\n        test: function (win) {\n            var version = win.document.documentElement.getAttribute(\"amp-version\");\n            return version ? { version: version } : false;\n        }\n    },\n    'Gatsby': {\n        icon: 'gatsby',\n        url: 'https://www.gatsbyjs.org/',\n        npm: 'gatsby',\n        test: function (win) {\n            if (document.getElementById('___gatsby')) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Shopify': {\n        icon: 'shopify',\n        url: 'https://www.shopify.com/',\n        npm: null,\n        test: function (win) {\n            if (win.Shopify && win.Shopify.shop) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Magento': {\n        icon: 'magento',\n        url: 'https://magento.com/',\n        npm: null,\n        test: function (win) {\n            // Same detecton used in Magento 2 DevTools: https://github.com/magento/m2-devtools\n            const reRequireScript = /\\/static(?:\\/version\\d+)?\\/frontend\\/.+\\/.+\\/requirejs\\/require(?:\\.min)?\\.js/;\n            const scripts = Array.from(document.querySelectorAll('script[src]') || []);\n            if (scripts.some(s => reRequireScript.test(s.src))) {\n                return { version: 2 }; // Magento 1 is no longer supported and this only verifies version 2\n            }\n            \n            return false;\n        }\n    },\n    'WordPress': {\n        icon: 'wordpress',\n        url: 'https://wordpress.org/',\n        npm: null,\n        test: function (win) {\n            const hasAPILinkElem = !!document.querySelector('link[rel=\"https://api.w.org/\"]');\n            const hasWPIncludes = !!document.querySelectorAll('link[href*=\"wp-includes\"], script[src*=\"wp-includes\"]').length;\n\n            if (!hasAPILinkElem && !hasWPIncludes) return false;\n\n            const generatorMeta = document.querySelector('meta[name=generator][content^=\"WordPress\"]');\n            const version = generatorMeta ? generatorMeta.getAttribute(\"content\").replace(/^\\w+\\s/,'') : UNKNOWN_VERSION;\n            return { version };\n        }\n    },\n    'Wix': {\n        icon: 'wix',\n        url: 'https://www.wix.com/',\n        npm: null,\n        test: function (win) {\n            if (win.wixBiSession) {\n                return { version: UNKNOWN_VERSION };\n            }\n            return false;\n        }\n    },\n    'Workbox': {\n      icon: 'workbox',\n      url: 'https://developers.google.com/web/tools/workbox/',\n      npm: 'workbox-sw',\n      test: async function (win) {\n        var nav = win.navigator;\n        // Service Workers not supported\n        if (!('serviceWorker' in nav)) {\n          return false;\n        }\n        return nav.serviceWorker.getRegistration()\n        .then(function(registration) {\n          var scriptURL = nav.serviceWorker.controller.scriptURL;\n          return fetch(scriptURL, { credentials: 'include',\n            headers: { 'service-worker': 'script' }\n          })\n          .then(function(response) {\n            return response.text();\n          })\n          .then(function(scriptContent) {\n            var workboxRegExp = /new Workbox|new workbox|workbox\\.precaching\\.|workbox\\.strategies/gm;\n            if (workboxRegExp.test(scriptContent)) {\n              // Adapted from\n              // https://github.com/semver/semver/issues/232#issue-48635632\n              var semVerRegExp = /workbox.*?\\b((0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(-(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\\+[0-9a-zA-Z-]+(\\.[0-9a-zA-Z-]+)*)?)\\b/gim;\n              var matches = semVerRegExp.exec(scriptContent);\n              var version = UNKNOWN_VERSION;\n              if (Array.isArray(matches) && matches.length > 1 && matches[1]) {\n                version = matches[1];\n              }\n              return { version: version };\n            }\n            return false;\n          });\n        }).catch(function(exception) {\n          return false;\n        });\n      }\n    }\n};\n";
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    async function detectLibraries(){
+    
+    const libraries=[];
+    
+    
+    
+    
+    
+    const libraryDetectorTests=d41d8cd98f00b204e9800998ecf8427e_LibraryDetectorTests;
+    
+    for(const[name,lib]of Object.entries(libraryDetectorTests)){
+    try{
+    const result=await lib.test(window);
+    if(result){
+    libraries.push({
+    name:name,
+    icon:lib.icon,
+    version:result.version,
+    npm:lib.npm});
+    
+    }
+    }catch(e){}
+    }
+    
+    return libraries;
+    }
+    
+    
+    
+    
+    
+    async function collectStacks(passContext){
+    const expression=`(function () {
+        ${libDetectorSource};
+        return (${detectLibraries.toString()}());
+      })()`;
+    
+    
+    const jsLibraries=await passContext.driver.evaluateAsync(expression);
+    
+    return jsLibraries.map(lib=>({
+    detector:'js',
+    id:lib.npm||lib.icon,
+    name:lib.name,
+    version:lib.version||undefined,
+    npm:lib.npm||undefined}));
+    
+    }
+    
+    module.exports=collectStacks;
+    
+    },{}],80:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const stackPacks=require('../../stack-packs/index.js');
+    const log=require('lighthouse-logger');
+    
+    
+    
+    
+    
+    
+    const stackPacksToInclude=[
+    {
+    packId:'wordpress',
+    requiredStacks:['js:wordpress']},
+    
+    {
+    packId:'react',
+    requiredStacks:['js:react']},
+    
+    {
+    packId:'angular',
+    requiredStacks:['js:@angular/core']},
+    
+    {
+    packId:'amp',
+    requiredStacks:['js:amp']},
+    
+    {
+    packId:'magento',
+    requiredStacks:['js:magento']}];
+    
+    
+    
+    
+    
+    
+    
+    
+    function getStackPacks(pageStacks){
+    
+    const packs=[];
+    
+    for(const pageStack of pageStacks){
+    const stackPackToIncl=stackPacksToInclude.find(stackPackToIncl=>
+    stackPackToIncl.requiredStacks.includes(`${pageStack.detector}:${pageStack.id}`));
+    if(!stackPackToIncl){
+    continue;
+    }
+    
+    
+    const matchedPack=stackPacks.find(pack=>pack.id===stackPackToIncl.packId);
+    if(!matchedPack){
+    log.warn('StackPacks',
+    `'${stackPackToIncl.packId}' stack pack was matched but is not found in stack-packs lib`);
+    continue;
+    }
+    
+    packs.push({
+    id:matchedPack.id,
+    title:matchedPack.title,
+    iconDataURL:matchedPack.iconDataURL,
+    descriptions:matchedPack.descriptions});
+    
+    }
+    
+    return packs;
+    }
+    
+    module.exports={
+    getStackPacks};
+    
+    
+    },{"../../stack-packs/index.js":193,"lighthouse-logger":125}],81:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    
+    function erf(x){
+    
+    const sign=Math.sign(x);
+    x=Math.abs(x);
+    
+    const a1=0.254829592;
+    const a2=-0.284496736;
+    const a3=1.421413741;
+    const a4=-1.453152027;
+    const a5=1.061405429;
+    const p=0.3275911;
+    const t=1/(1+p*x);
+    const y=t*(a1+t*(a2+t*(a3+t*(a4+t*a5))));
+    return sign*(1-y*Math.exp(-x*x));
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function getLogNormalDistribution(median,falloff){
+    const location=Math.log(median);
+    
+    
+    
+    
+    const logRatio=Math.log(falloff/median);
+    const shape=Math.sqrt(1-3*logRatio-Math.sqrt((logRatio-3)*(logRatio-3)-8))/2;
+    
+    return{
+    computeComplementaryPercentile(x){
+    const standardizedX=(Math.log(x)-location)/(Math.SQRT2*shape);
+    return(1-erf(standardizedX))/2;
+    }};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function linearInterpolation(x0,y0,x1,y1,x){
+    const slope=(y1-y0)/(x1-x0);
+    return y0+(x-x0)*slope;
+    }
+    
+    module.exports={
+    linearInterpolation,
+    getLogNormalDistribution};
+    
+    
+    },{}],82:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const{
+    filterOutRectsContainedByOthers,
+    filterOutTinyRects,
+    rectsTouchOrOverlap,
+    rectContainsPoint,
+    getBoundingRect,
+    getRectCenterPoint}=
+    require('./rect-helpers.js');
+    
+    
+    
+    
+    
+    
+    
+    function getTappableRectsFromClientRects(clientRects){
+    
+    
+    clientRects=filterOutTinyRects(clientRects);
+    clientRects=filterOutRectsContainedByOthers(clientRects);
+    clientRects=mergeTouchingClientRects(clientRects);
+    return clientRects;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function almostEqual(a,b){
+    return Math.abs(a-b)<=10;
+    }
+    
+    
+    
+    
+    
+    
+    function mergeTouchingClientRects(clientRects){
+    for(let i=0;i<clientRects.length;i++){
+    for(let j=i+1;j<clientRects.length;j++){
+    const crA=clientRects[i];
+    const crB=clientRects[j];
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const rectsLineUpHorizontally=
+    almostEqual(crA.top,crB.top)||almostEqual(crA.bottom,crB.bottom);
+    const rectsLineUpVertically=
+    almostEqual(crA.left,crB.left)||almostEqual(crA.right,crB.right);
+    const canMerge=
+    rectsTouchOrOverlap(crA,crB)&&(
+    rectsLineUpHorizontally||rectsLineUpVertically);
+    
+    if(canMerge){
+    const replacementClientRect=getBoundingRect([crA,crB]);
+    const mergedRectCenter=getRectCenterPoint(replacementClientRect);
+    
+    if(
+    !(
+    rectContainsPoint(crA,mergedRectCenter)||
+    rectContainsPoint(crB,mergedRectCenter)))
+    
+    {
+    
+    
+    
+    continue;
+    }
+    
+    
+    clientRects=clientRects.filter(cr=>cr!==crA&&cr!==crB);
+    clientRects.push(replacementClientRect);
+    
+    
+    
+    return mergeTouchingClientRects(clientRects);
+    }
+    }
+    }
+    
+    return clientRects;
+    }
+    
+    module.exports={
+    getTappableRectsFromClientRects};
+    
+    
+    },{"./rect-helpers.js":77}],83:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const{taskGroups,taskNameToGroup}=require('./task-groups.js');
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    class MainThreadTasks{
+    
+    
+    
+    
+    
+    static _createNewTaskNode(event,endEvent){
+    const isCompleteEvent=event.ph==='X'&&!endEvent;
+    const isStartEndEventPair=event.ph==='B'&&endEvent&&endEvent.ph==='E';
+    if(!isCompleteEvent&&!isStartEndEventPair){
+    throw new Error('Invalid parameters for _createNewTaskNode');
+    }
+    
+    const startTime=event.ts;
+    const endTime=endEvent?endEvent.ts:event.ts+Number(event.dur||0);
+    
+    const newTask={
+    event,
+    startTime,
+    endTime,
+    duration:endTime-startTime,
+    
+    
+    unbounded:false,
+    parent:undefined,
+    children:[],
+    attributableURLs:[],
+    group:taskGroups.other,
+    selfTime:NaN};
+    
+    
+    return newTask;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    static _assignAllTimersUntilTs(
+    currentTask,
+    stopTs,
+    priorTaskData,
+    reverseEventsQueue)
+    {
+    while(reverseEventsQueue.length){
+    const nextTimerInstallEvent=reverseEventsQueue.pop();
+    
+    if(!nextTimerInstallEvent)break;
+    
+    
+    if(nextTimerInstallEvent.ts>stopTs){
+    reverseEventsQueue.push(nextTimerInstallEvent);
+    break;
+    }
+    
+    
+    if(nextTimerInstallEvent.ts<currentTask.startTime){
+    continue;
+    }
+    
+    
+    
+    
+    const timerId=nextTimerInstallEvent.args.data.timerId;
+    priorTaskData.timers.set(timerId,currentTask);
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static _createTasksFromStartAndEndEvents(taskStartEvents,taskEndEvents,traceEndTs){
+    
+    const tasks=[];
+    
+    
+    
+    const taskEndEventsReverseQueue=taskEndEvents.slice().reverse();
+    
+    for(let i=0;i<taskStartEvents.length;i++){
+    const taskStartEvent=taskStartEvents[i];
+    if(taskStartEvent.ph==='X'){
+    
+    tasks.push(MainThreadTasks._createNewTaskNode(taskStartEvent));
+    continue;
+    }
+    
+    
+    let matchedEventIndex=-1;
+    let matchingNestedEventCount=0;
+    let matchingNestedEventIndex=i+1;
+    
+    
+    
+    
+    
+    for(let j=taskEndEventsReverseQueue.length-1;j>=0;j--){
+    const endEvent=taskEndEventsReverseQueue[j];
+    
+    for(;matchingNestedEventIndex<taskStartEvents.length;matchingNestedEventIndex++){
+    if(taskStartEvents[matchingNestedEventIndex].ts>=endEvent.ts)break;
+    
+    if(taskStartEvents[matchingNestedEventIndex].name===taskStartEvent.name){
+    matchingNestedEventCount++;
+    }
+    }
+    
+    
+    if(endEvent.name!==taskStartEvent.name)continue;
+    
+    if(endEvent.ts<taskStartEvent.ts)continue;
+    
+    
+    if(matchingNestedEventCount>0){
+    
+    matchingNestedEventCount--;
+    continue;
+    }
+    
+    
+    matchedEventIndex=j;
+    break;
+    }
+    
+    
+    let taskEndEvent;
+    let unbounded=false;
+    if(matchedEventIndex===-1){
+    
+    
+    taskEndEvent={ph:'E',ts:traceEndTs};
+    unbounded=true;
+    }else if(matchedEventIndex===taskEndEventsReverseQueue.length-1){
+    
+    
+    taskEndEvent=taskEndEventsReverseQueue.pop();
+    }else{
+    taskEndEvent=taskEndEventsReverseQueue.splice(matchedEventIndex,1)[0];
+    }
+    
+    const task=MainThreadTasks._createNewTaskNode(taskStartEvent,taskEndEvent);
+    task.unbounded=unbounded;
+    tasks.push(task);
+    }
+    
+    if(taskEndEventsReverseQueue.length){
+    throw new Error(
+    `Fatal trace logic error - ${taskEndEventsReverseQueue.length} unmatched end events`);
+    
+    }
+    
+    return tasks;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static _createTaskRelationships(sortedTasks,timerInstallEvents,priorTaskData){
+    
+    let currentTask;
+    
+    const timerInstallEventsReverseQueue=timerInstallEvents.slice().reverse();
+    
+    for(let i=0;i<sortedTasks.length;i++){
+    let nextTask=sortedTasks[i];
+    
+    
+    
+    
+    
+    while(
+    currentTask&&
+    Number.isFinite(currentTask.endTime)&&
+    currentTask.endTime<=nextTask.startTime)
+    {
+    MainThreadTasks._assignAllTimersUntilTs(
+    currentTask,
+    currentTask.endTime,
+    priorTaskData,
+    timerInstallEventsReverseQueue);
+    
+    currentTask=currentTask.parent;
+    }
+    
+    
+    
+    if(currentTask){
+    if(nextTask.endTime>currentTask.endTime){
+    const timeDelta=nextTask.endTime-currentTask.endTime;
+    
+    
+    if(timeDelta<1000){
+    
+    currentTask.endTime=nextTask.endTime;
+    currentTask.duration+=timeDelta;
+    }else if(nextTask.unbounded){
+    
+    nextTask.endTime=currentTask.endTime;
+    nextTask.duration=nextTask.endTime-nextTask.startTime;
+    }else if(
+    nextTask.startTime-currentTask.startTime<1000&&
+    !currentTask.children.length)
+    {
+    
+    
+    
+    
+    
+    
+    
+    
+    const actualParentTask=nextTask;
+    const actualChildTask=currentTask;
+    
+    
+    
+    const grandparentTask=currentTask.parent;
+    if(grandparentTask){
+    const lastGrandparentChildIndex=grandparentTask.children.length-1;
+    if(grandparentTask.children[lastGrandparentChildIndex]!==actualChildTask){
+    
+    
+    throw new Error('Fatal trace logic error - impossible children');
+    }
+    
+    grandparentTask.children.pop();
+    grandparentTask.children.push(actualParentTask);
+    }
+    
+    actualParentTask.parent=grandparentTask;
+    actualParentTask.startTime=actualChildTask.startTime;
+    actualParentTask.duration=actualParentTask.endTime-actualParentTask.startTime;
+    currentTask=actualParentTask;
+    nextTask=actualChildTask;
+    }else{
+    
+    
+    
+    
+    
+    
+    
+    const error=new Error('Fatal trace logic error - child cannot end after parent');
+    error.timeDelta=timeDelta;
+    error.nextTaskEvent=nextTask.event;
+    error.nextTaskEndTime=nextTask.endTime;
+    error.currentTaskEvent=currentTask.event;
+    error.currentTaskEndTime=currentTask.endTime;
+    throw error;
+    }
+    }
+    
+    nextTask.parent=currentTask;
+    currentTask.children.push(nextTask);
+    MainThreadTasks._assignAllTimersUntilTs(
+    currentTask,
+    nextTask.startTime,
+    priorTaskData,
+    timerInstallEventsReverseQueue);
+    
+    }
+    
+    currentTask=nextTask;
+    }
+    
+    if(currentTask){
+    MainThreadTasks._assignAllTimersUntilTs(
+    currentTask,
+    currentTask.endTime,
+    priorTaskData,
+    timerInstallEventsReverseQueue);
+    
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static _createTasksFromEvents(mainThreadEvents,priorTaskData,traceEndTs){
+    
+    const taskStartEvents=[];
+    
+    const taskEndEvents=[];
+    
+    const timerInstallEvents=[];
+    
+    
+    for(const event of mainThreadEvents){
+    if(event.ph==='X'||event.ph==='B')taskStartEvents.push(event);
+    if(event.ph==='E')taskEndEvents.push(event);
+    if(event.name==='TimerInstall')timerInstallEvents.push(event);
+    }
+    
+    
+    const tasks=MainThreadTasks._createTasksFromStartAndEndEvents(
+    taskStartEvents,
+    taskEndEvents,
+    traceEndTs);
+    
+    
+    
+    const sortedTasks=tasks.sort(
+    (taskA,taskB)=>taskA.startTime-taskB.startTime||taskB.duration-taskA.duration);
+    
+    
+    
+    MainThreadTasks._createTaskRelationships(sortedTasks,timerInstallEvents,priorTaskData);
+    
+    
+    return sortedTasks.sort(
+    (taskA,taskB)=>taskA.startTime-taskB.startTime||taskB.duration-taskA.duration);
+    
+    }
+    
+    
+    
+    
+    
+    
+    static _computeRecursiveSelfTime(task,parent){
+    if(parent&&task.endTime>parent.endTime){
+    throw new Error('Fatal trace logic error - child cannot end after parent');
+    }
+    
+    const childTime=task.children.
+    map(child=>MainThreadTasks._computeRecursiveSelfTime(child,task)).
+    reduce((sum,child)=>sum+child,0);
+    task.selfTime=task.duration-childTime;
+    return task.duration;
+    }
+    
+    
+    
+    
+    
+    
+    static _computeRecursiveAttributableURLs(task,parentURLs,priorTaskData){
+    const argsData=task.event.args.data||{};
+    const stackFrameURLs=(argsData.stackTrace||[]).map(entry=>entry.url);
+    
+    
+    let taskURLs=[];
+    switch(task.event.name){
+    
+    
+    
+    
+    
+    case'v8.compile':
+    case'EvaluateScript':
+    case'FunctionCall':
+    taskURLs=[argsData.url].concat(stackFrameURLs);
+    break;
+    case'v8.compileModule':
+    taskURLs=[task.event.args.fileName].concat(stackFrameURLs);
+    break;
+    case'TimerFire':{
+    
+    
+    const timerId=task.event.args.data.timerId;
+    const timerInstallerTaskNode=priorTaskData.timers.get(timerId);
+    if(!timerInstallerTaskNode)break;
+    taskURLs=timerInstallerTaskNode.attributableURLs.concat(stackFrameURLs);
+    break;
+    }
+    default:
+    taskURLs=stackFrameURLs;
+    break;}
+    
+    
+    
+    const attributableURLs=Array.from(parentURLs);
+    for(const url of taskURLs){
+    
+    if(!url)continue;
+    
+    if(attributableURLs[attributableURLs.length-1]===url)continue;
+    attributableURLs.push(url);
+    }
+    
+    task.attributableURLs=attributableURLs;
+    task.children.forEach(child=>
+    MainThreadTasks._computeRecursiveAttributableURLs(child,attributableURLs,priorTaskData));
+    
+    }
+    
+    
+    
+    
+    
+    static _computeRecursiveTaskGroup(task,parentGroup){
+    const group=taskNameToGroup[task.event.name];
+    task.group=group||parentGroup||taskGroups.other;
+    task.children.forEach(child=>MainThreadTasks._computeRecursiveTaskGroup(child,task.group));
+    }
+    
+    
+    
+    
+    
+    
+    static getMainThreadTasks(mainThreadEvents,traceEndTs){
+    const timers=new Map();
+    const priorTaskData={timers};
+    const tasks=MainThreadTasks._createTasksFromEvents(
+    mainThreadEvents,
+    priorTaskData,
+    traceEndTs);
+    
+    
+    
+    for(const task of tasks){
+    if(task.parent)continue;
+    
+    MainThreadTasks._computeRecursiveSelfTime(task,undefined);
+    MainThreadTasks._computeRecursiveAttributableURLs(task,[],priorTaskData);
+    MainThreadTasks._computeRecursiveTaskGroup(task);
+    }
+    
+    
+    const firstTs=(tasks[0]||{startTime:0}).startTime;
+    for(const task of tasks){
+    task.startTime=(task.startTime-firstTs)/1000;
+    task.endTime=(task.endTime-firstTs)/1000;
+    task.duration/=1000;
+    task.selfTime/=1000;
+    
+    
+    if(!Number.isFinite(task.selfTime)){
+    throw new Error('Invalid task timing data');
+    }
+    }
+    
+    return tasks;
+    }}
+    
+    
+    module.exports=MainThreadTasks;
+    
+    },{"./task-groups.js":84}],84:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const taskGroups={
+    parseHTML:{
+    id:'parseHTML',
+    label:'Parse HTML & CSS',
+    traceEventNames:['ParseHTML','ParseAuthorStyleSheet']},
+    
+    styleLayout:{
+    id:'styleLayout',
+    label:'Style & Layout',
+    traceEventNames:[
+    'ScheduleStyleRecalculation',
+    'UpdateLayoutTree',
+    'InvalidateLayout',
+    'Layout']},
+    
+    
+    paintCompositeRender:{
+    id:'paintCompositeRender',
+    label:'Rendering',
+    traceEventNames:[
+    'Animation',
+    'HitTest',
+    'PaintSetup',
+    'Paint',
+    'PaintImage',
+    'RasterTask',
+    'ScrollLayer',
+    'UpdateLayer',
+    'UpdateLayerTree',
+    'CompositeLayers']},
+    
+    
+    scriptParseCompile:{
+    id:'scriptParseCompile',
+    label:'Script Parsing & Compilation',
+    traceEventNames:['v8.compile','v8.compileModule','v8.parseOnBackground']},
+    
+    scriptEvaluation:{
+    id:'scriptEvaluation',
+    label:'Script Evaluation',
+    traceEventNames:[
+    'EventDispatch',
+    'EvaluateScript',
+    'v8.evaluateModule',
+    'FunctionCall',
+    'TimerFire',
+    'FireIdleCallback',
+    'FireAnimationFrame',
+    'RunMicrotasks',
+    'V8.Execute']},
+    
+    
+    garbageCollection:{
+    id:'garbageCollection',
+    label:'Garbage Collection',
+    traceEventNames:[
+    'MinorGC',
+    'MajorGC',
+    'BlinkGC.AtomicPhase',
+    
+    
+    'ThreadState::performIdleLazySweep',
+    'ThreadState::completeSweep',
+    'BlinkGCMarking']},
+    
+    
+    other:{
+    id:'other',
+    label:'Other',
+    traceEventNames:[
+    'MessageLoop::RunTask',
+    'TaskQueueManager::ProcessTaskFromWorkQueue',
+    'ThreadControllerImpl::DoWork']}};
+    
+    
+    
+    
+    
+    const taskNameToGroup={};
+    for(const group of Object.values(taskGroups)){
+    for(const traceEventName of group.traceEventNames){
+    taskNameToGroup[traceEventName]=group;
+    }
+    }
+    
+    module.exports={
+    taskGroups,
+    taskNameToGroup};
+    
+    
+    },{}],85:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const log=require('lighthouse-logger');
+    
+    const ACCEPTABLE_NAVIGATION_URL_REGEX=/^(chrome|https?):/;
+    
+    
+    
+    const BASE_RESPONSE_LATENCY=16;
+    
+    const SCHEDULABLE_TASK_TITLE_LH='RunTask';
+    
+    const SCHEDULABLE_TASK_TITLE_ALT1='ThreadControllerImpl::RunTask';
+    
+    const SCHEDULABLE_TASK_TITLE_ALT2='ThreadControllerImpl::DoWork';
+    
+    const SCHEDULABLE_TASK_TITLE_ALT3='TaskQueueManager::ProcessTaskFromWorkQueue';
+    
+    class TraceProcessor{
+    
+    
+    
+    static createNoNavstartError(){
+    return new Error('No navigationStart event found');
+    }
+    
+    
+    
+    
+    static createNoTracingStartedError(){
+    return new Error('No tracingStartedInBrowser event found');
+    }
+    
+    
+    
+    
+    
+    
+    static _isNavigationStartOfInterest(event){
+    return event.name==='navigationStart'&&(
+    !event.args.data||!event.args.data.documentLoaderURL||
+    ACCEPTABLE_NAVIGATION_URL_REGEX.test(event.args.data.documentLoaderURL));
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static _sortTimestampEventGroup(
+    tsGroupIndices,
+    timestampSortedIndices,
+    indexOfTsGroupIndicesStart,
+    traceEvents)
+    {
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const lookupArrayIndexByTsIndex=i=>timestampSortedIndices[i];
+    
+    const lookupEventByTsIndex=i=>traceEvents[lookupArrayIndexByTsIndex(i)];
+    
+    
+    const eEventIndices=[];
+    
+    const bxEventIndices=[];
+    
+    const otherEventIndices=[];
+    
+    for(const tsIndex of tsGroupIndices){
+    
+    const arrayIndex=lookupArrayIndexByTsIndex(tsIndex);
+    const event=lookupEventByTsIndex(tsIndex);
+    if(event.ph==='E')eEventIndices.push(arrayIndex);else
+    if(event.ph==='X'||event.ph==='B')bxEventIndices.push(arrayIndex);else
+    otherEventIndices.push(arrayIndex);
+    }
+    
+    
+    const effectiveDuration=new Map();
+    for(const index of bxEventIndices){
+    const event=traceEvents[index];
+    if(event.ph==='X'){
+    effectiveDuration.set(index,event.dur);
+    }else{
+    
+    let duration=Number.MAX_SAFE_INTEGER;
+    
+    let additionalNestedEventsWithSameName=0;
+    const startIndex=indexOfTsGroupIndicesStart+tsGroupIndices.length;
+    for(let j=startIndex;j<timestampSortedIndices.length;j++){
+    const potentialMatchingEvent=lookupEventByTsIndex(j);
+    const eventMatches=potentialMatchingEvent.name===event.name&&
+    potentialMatchingEvent.pid===event.pid&&
+    potentialMatchingEvent.tid===event.tid;
+    
+    
+    if(!eventMatches)continue;
+    
+    if(potentialMatchingEvent.ph==='E'&&additionalNestedEventsWithSameName===0){
+    
+    duration=potentialMatchingEvent.ts-event.ts;
+    break;
+    }else if(potentialMatchingEvent.ph==='E'){
+    
+    additionalNestedEventsWithSameName--;
+    }else if(potentialMatchingEvent.ph==='B'){
+    
+    additionalNestedEventsWithSameName++;
+    }
+    }
+    
+    effectiveDuration.set(index,duration);
+    }
+    }
+    
+    bxEventIndices.sort((indexA,indexB)=>(effectiveDuration.get(indexB)||0)-(
+    effectiveDuration.get(indexA)||0)||indexA-indexB);
+    
+    otherEventIndices.sort((indexA,indexB)=>indexA-indexB);
+    
+    return[...eEventIndices,...bxEventIndices,...otherEventIndices];
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    static filteredTraceSort(traceEvents,filter){
+    
+    const indices=[];
+    for(let srcIndex=0;srcIndex<traceEvents.length;srcIndex++){
+    if(filter(traceEvents[srcIndex])){
+    indices.push(srcIndex);
+    }
+    }
+    
+    
+    indices.sort((indexA,indexB)=>traceEvents[indexA].ts-traceEvents[indexB].ts);
+    
+    
+    for(let i=0;i<indices.length-1;i++){
+    const ts=traceEvents[indices[i]].ts;
+    const tsGroupIndices=[i];
+    for(let j=i+1;j<indices.length;j++){
+    if(traceEvents[indices[j]].ts!==ts)break;
+    tsGroupIndices.push(j);
+    }
+    
+    
+    if(tsGroupIndices.length===1)continue;
+    
+    
+    const finalIndexOrder=TraceProcessor._sortTimestampEventGroup(
+    tsGroupIndices,
+    indices,
+    i,
+    traceEvents);
+    
+    indices.splice(i,finalIndexOrder.length,...finalIndexOrder);
+    
+    
+    i+=tsGroupIndices.length-1;
+    }
+    
+    
+    const sorted=[];
+    for(let i=0;i<indices.length;i++){
+    sorted.push(traceEvents[indices[i]]);
+    }
+    
+    return sorted;
+    }
+    
+    
+    
+    
+    
+    
+    
+    static assertHasToplevelEvents(events){
+    const hasToplevelTask=events.some(this.isScheduleableTask);
+    if(!hasToplevelTask){
+    throw new Error('Could not find any top level events');
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static _riskPercentiles(durations,totalTime,percentiles,clippedLength=0){
+    let busyTime=0;
+    for(let i=0;i<durations.length;i++){
+    busyTime+=durations[i];
+    }
+    busyTime-=clippedLength;
+    
+    
+    let completedTime=totalTime-busyTime;
+    let duration=0;
+    let cdfTime=completedTime;
+    const results=[];
+    
+    let durationIndex=-1;
+    let remainingCount=durations.length+1;
+    if(clippedLength>0){
+    
+    remainingCount--;
+    }
+    
+    
+    for(const percentile of percentiles){
+    
+    
+    const percentileTime=percentile*totalTime;
+    while(cdfTime<percentileTime&&durationIndex<durations.length-1){
+    completedTime+=duration;
+    remainingCount-=duration<0?-1:1;
+    
+    if(clippedLength>0&&clippedLength<durations[durationIndex+1]){
+    duration=-clippedLength;
+    clippedLength=0;
+    }else{
+    durationIndex++;
+    duration=durations[durationIndex];
+    }
+    
+    
+    cdfTime=completedTime+Math.abs(duration)*remainingCount;
+    }
+    
+    
+    results.push({
+    percentile,
+    time:Math.max(0,(percentileTime-completedTime)/remainingCount)+
+    BASE_RESPONSE_LATENCY});
+    
+    }
+    
+    return results;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static getRiskToResponsiveness(
+    events,
+    startTime,
+    endTime,
+    percentiles=[0.5,0.75,0.9,0.99,1])
+    {
+    const totalTime=endTime-startTime;
+    percentiles.sort((a,b)=>a-b);
+    
+    const ret=this.getMainThreadTopLevelEventDurations(events,startTime,endTime);
+    return this._riskPercentiles(ret.durations,totalTime,percentiles,
+    ret.clippedLength);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    static getMainThreadTopLevelEventDurations(topLevelEvents,startTime=0,endTime=Infinity){
+    
+    
+    const durations=[];
+    let clippedLength=0;
+    
+    for(const event of topLevelEvents){
+    if(event.end<startTime||event.start>endTime){
+    continue;
+    }
+    
+    let duration=event.duration;
+    let eventStart=event.start;
+    if(eventStart<startTime){
+    
+    eventStart=startTime;
+    duration=event.end-startTime;
+    }
+    
+    if(event.end>endTime){
+    
+    clippedLength=duration-(endTime-eventStart);
+    }
+    
+    durations.push(duration);
+    }
+    durations.sort((a,b)=>a-b);
+    
+    return{
+    durations,
+    clippedLength};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static getMainThreadTopLevelEvents(tabTrace,startTime=0,endTime=Infinity){
+    const topLevelEvents=[];
+    
+    for(const event of tabTrace.mainThreadEvents){
+    if(!this.isScheduleableTask(event)||!event.dur)continue;
+    
+    const start=(event.ts-tabTrace.navigationStartEvt.ts)/1000;
+    const end=(event.ts+event.dur-tabTrace.navigationStartEvt.ts)/1000;
+    if(start>endTime||end<startTime)continue;
+    
+    topLevelEvents.push({
+    start,
+    end,
+    duration:event.dur/1000});
+    
+    }
+    
+    return topLevelEvents;
+    }
+    
+    
+    
+    
+    
+    static findMainFrameIds(events){
+    
+    const startedInBrowserEvt=events.find(e=>e.name==='TracingStartedInBrowser');
+    if(startedInBrowserEvt&&startedInBrowserEvt.args.data&&
+    startedInBrowserEvt.args.data.frames){
+    const mainFrame=startedInBrowserEvt.args.data.frames.find(frame=>!frame.parent);
+    const frameId=mainFrame&&mainFrame.frame;
+    const pid=mainFrame&&mainFrame.processId;
+    
+    const threadNameEvt=events.find(e=>e.pid===pid&&e.ph==='M'&&
+    e.cat==='__metadata'&&e.name==='thread_name'&&e.args.name==='CrRendererMain');
+    const tid=threadNameEvt&&threadNameEvt.tid;
+    
+    if(pid&&tid&&frameId){
+    return{
+    pid,
+    tid,
+    frameId};
+    
+    }
+    }
+    
+    
+    
+    
+    const startedInPageEvt=events.find(e=>e.name==='TracingStartedInPage');
+    if(startedInPageEvt&&startedInPageEvt.args&&startedInPageEvt.args.data){
+    const frameId=startedInPageEvt.args.data.page;
+    if(frameId){
+    return{
+    pid:startedInPageEvt.pid,
+    tid:startedInPageEvt.tid,
+    frameId};
+    
+    }
+    }
+    
+    
+    
+    
+    
+    const navStartEvt=events.find(e=>Boolean(e.name==='navigationStart'&&e.args&&
+    e.args.data&&e.args.data.isLoadingMainFrame&&e.args.data.documentLoaderURL));
+    
+    const firstResourceSendEvt=events.find(e=>e.name==='ResourceSendRequest');
+    
+    if(navStartEvt&&navStartEvt.args&&navStartEvt.args.data&&
+    firstResourceSendEvt&&
+    firstResourceSendEvt.pid===navStartEvt.pid&&
+    firstResourceSendEvt.tid===navStartEvt.tid){
+    const frameId=navStartEvt.args.frame;
+    if(frameId){
+    return{
+    pid:navStartEvt.pid,
+    tid:navStartEvt.tid,
+    frameId};
+    
+    }
+    }
+    
+    throw this.createNoTracingStartedError();
+    }
+    
+    
+    
+    
+    
+    static isScheduleableTask(evt){
+    return evt.name===SCHEDULABLE_TASK_TITLE_LH||
+    evt.name===SCHEDULABLE_TASK_TITLE_ALT1||
+    evt.name===SCHEDULABLE_TASK_TITLE_ALT2||
+    evt.name===SCHEDULABLE_TASK_TITLE_ALT3;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    static computeTraceOfTab(trace){
+    
+    
+    const keyEvents=this.filteredTraceSort(trace.traceEvents,e=>{
+    return e.cat.includes('blink.user_timing')||
+    e.cat.includes('loading')||
+    e.cat.includes('devtools.timeline')||
+    e.cat==='__metadata';
+    });
+    
+    
+    const mainFrameIds=this.findMainFrameIds(keyEvents);
+    
+    
+    const frameEvents=keyEvents.filter(e=>e.args.frame===mainFrameIds.frameId);
+    
+    
+    const navigationStart=frameEvents.filter(this._isNavigationStartOfInterest).pop();
+    if(!navigationStart)throw this.createNoNavstartError();
+    
+    
+    const firstPaint=frameEvents.find(e=>e.name==='firstPaint'&&e.ts>navigationStart.ts);
+    
+    
+    const firstContentfulPaint=frameEvents.find(
+    e=>e.name==='firstContentfulPaint'&&e.ts>navigationStart.ts);
+    
+    
+    
+    let firstMeaningfulPaint=frameEvents.find(
+    e=>e.name==='firstMeaningfulPaint'&&e.ts>navigationStart.ts);
+    
+    let fmpFellBack=false;
+    
+    
+    
+    
+    
+    if(!firstMeaningfulPaint){
+    const fmpCand='firstMeaningfulPaintCandidate';
+    fmpFellBack=true;
+    log.verbose('trace-of-tab',`No firstMeaningfulPaint found, falling back to last ${fmpCand}`);
+    const lastCandidate=frameEvents.filter(e=>e.name===fmpCand).pop();
+    if(!lastCandidate){
+    log.verbose('trace-of-tab','No `firstMeaningfulPaintCandidate` events found in trace');
+    }
+    firstMeaningfulPaint=lastCandidate;
+    }
+    
+    
+    
+    
+    let largestContentfulPaint;
+    let lcpInvalidated=false;
+    
+    for(let i=frameEvents.length-1;i>=0;i--){
+    const e=frameEvents[i];
+    
+    if(e.ts<=navigationStart.ts)break;
+    
+    if(e.name==='largestContentfulPaint::Invalidate'){
+    lcpInvalidated=true;
+    break;
+    }
+    
+    if(e.name!=='largestContentfulPaint::Candidate')continue;
+    
+    largestContentfulPaint=e;
+    break;
+    }
+    
+    const load=frameEvents.find(e=>e.name==='loadEventEnd'&&e.ts>navigationStart.ts);
+    const domContentLoaded=frameEvents.find(
+    e=>e.name==='domContentLoadedEventEnd'&&e.ts>navigationStart.ts);
+    
+    
+    
+    
+    const processEvents=TraceProcessor.
+    filteredTraceSort(trace.traceEvents,e=>e.pid===mainFrameIds.pid);
+    
+    const mainThreadEvents=processEvents.
+    filter(e=>e.tid===mainFrameIds.tid);
+    
+    
+    const traceEnd=trace.traceEvents.reduce((max,evt)=>{
+    return max.ts>evt.ts?max:evt;
+    });
+    const fakeEndOfTraceEvt={ts:traceEnd.ts+(traceEnd.dur||0)};
+    
+    
+    const getTimestamp=event=>event&&event.ts;
+    
+    const timestamps={
+    navigationStart:navigationStart.ts,
+    firstPaint:getTimestamp(firstPaint),
+    firstContentfulPaint:getTimestamp(firstContentfulPaint),
+    firstMeaningfulPaint:getTimestamp(firstMeaningfulPaint),
+    largestContentfulPaint:getTimestamp(largestContentfulPaint),
+    traceEnd:fakeEndOfTraceEvt.ts,
+    load:getTimestamp(load),
+    domContentLoaded:getTimestamp(domContentLoaded)};
+    
+    
+    
+    const getTiming=ts=>(ts-navigationStart.ts)/1000;
+    
+    const maybeGetTiming=ts=>ts===undefined?undefined:getTiming(ts);
+    
+    const timings={
+    navigationStart:0,
+    firstPaint:maybeGetTiming(timestamps.firstPaint),
+    firstContentfulPaint:maybeGetTiming(timestamps.firstContentfulPaint),
+    firstMeaningfulPaint:maybeGetTiming(timestamps.firstMeaningfulPaint),
+    largestContentfulPaint:maybeGetTiming(timestamps.largestContentfulPaint),
+    traceEnd:getTiming(timestamps.traceEnd),
+    load:maybeGetTiming(timestamps.load),
+    domContentLoaded:maybeGetTiming(timestamps.domContentLoaded)};
+    
+    
+    return{
+    timings,
+    timestamps,
+    processEvents,
+    mainThreadEvents,
+    mainFrameIds,
+    navigationStartEvt:navigationStart,
+    firstPaintEvt:firstPaint,
+    firstContentfulPaintEvt:firstContentfulPaint,
+    firstMeaningfulPaintEvt:firstMeaningfulPaint,
+    largestContentfulPaintEvt:largestContentfulPaint,
+    loadEvt:load,
+    domContentLoadedEvt:domContentLoaded,
+    fmpFellBack,
+    lcpInvalidated};
+    
+    }}
+    
+    
+    module.exports=TraceProcessor;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    },{"lighthouse-logger":125}],86:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const log=require('lighthouse-logger');
+    
+    
+    
+    
+    
+    
+    
+    function getUberMetrics(auditResults){
+    const metricsAudit=auditResults.metrics;
+    if(!metricsAudit||!metricsAudit.details||!('items'in metricsAudit.details))return;
+    
+    return metricsAudit.details.items[0];
+    }
+    
+    class Metrics{
+    
+    
+    
+    
+    constructor(traceEvents,auditResults){
+    this._traceEvents=traceEvents;
+    this._auditResults=auditResults;
+    }
+    
+    
+    
+    
+    
+    static get metricsDefinitions(){
+    return[
+    {
+    name:'Navigation Start',
+    id:'navstart',
+    tsKey:'observedNavigationStartTs'},
+    
+    {
+    name:'First Contentful Paint',
+    id:'ttfcp',
+    tsKey:'observedFirstContentfulPaintTs'},
+    
+    {
+    name:'First Meaningful Paint',
+    id:'ttfmp',
+    tsKey:'observedFirstMeaningfulPaintTs'},
+    
+    {
+    name:'Speed Index',
+    id:'si',
+    tsKey:'observedSpeedIndexTs'},
+    
+    {
+    name:'First Visual Change',
+    id:'fv',
+    tsKey:'observedFirstVisualChangeTs'},
+    
+    {
+    name:'Visually Complete 100%',
+    id:'vc100',
+    tsKey:'observedLastVisualChangeTs'},
+    
+    {
+    name:'First CPU Idle',
+    id:'ttfi',
+    tsKey:'firstCPUIdleTs'},
+    
+    {
+    name:'Interactive',
+    id:'tti',
+    tsKey:'interactiveTs'},
+    
+    {
+    name:'End of Trace',
+    id:'eot',
+    tsKey:'observedTraceEndTs'},
+    
+    {
+    name:'On Load',
+    id:'onload',
+    tsKey:'observedLoadTs'},
+    
+    {
+    name:'DOM Content Loaded',
+    id:'dcl',
+    tsKey:'observedDomContentLoadedTs'}];
+    
+    
+    }
+    
+    
+    
+    
+    
+    gatherMetrics(){
+    const uberMetrics=getUberMetrics(this._auditResults);
+    if(!uberMetrics){
+    return[];
+    }
+    
+    
+    const resolvedMetrics=[];
+    Metrics.metricsDefinitions.forEach(metric=>{
+    
+    const ts=uberMetrics[metric.tsKey];
+    if(ts===undefined){
+    log.error('pwmetrics-events',`${metric.name} timestamp not found`);
+    return;
+    }
+    
+    resolvedMetrics.push({
+    id:metric.id,
+    name:metric.name,
+    ts});
+    
+    });
+    
+    return resolvedMetrics;
+    }
+    
+    
+    
+    
+    
+    
+    getNavigationStartEvt(metrics){
+    const navStartMetric=metrics.find(e=>e.id==='navstart');
+    if(!navStartMetric)return;
+    return this._traceEvents.find(
+    e=>e.name==='navigationStart'&&e.ts===navStartMetric.ts);
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    synthesizeEventPair(metric,navigationStartEvt){
+    
+    const eventBase={
+    pid:navigationStartEvt.pid,
+    tid:navigationStartEvt.tid,
+    cat:'blink.user_timing',
+    name:metric.name,
+    args:{},
+    
+    id:`0x${(Math.random()*1000000|0).toString(16)}`};
+    
+    const fakeMeasureStartEvent=Object.assign({},eventBase,{
+    ts:navigationStartEvt.ts,
+    ph:'b'});
+    
+    const fakeMeasureEndEvent=Object.assign({},eventBase,{
+    ts:metric.ts,
+    ph:'e'});
+    
+    return[fakeMeasureStartEvent,fakeMeasureEndEvent];
+    }
+    
+    
+    
+    
+    generateFakeEvents(){
+    const metrics=this.gatherMetrics();
+    if(metrics.length===0){
+    log.error('metrics-events','Metrics collection had errors, not synthetizing trace events');
+    return[];
+    }
+    
+    const navigationStartEvt=this.getNavigationStartEvt(metrics);
+    if(!navigationStartEvt){
+    log.error('pwmetrics-events','Reference navigationStart not found');
+    return[];
+    }
+    
+    
+    const fakeEvents=[];
+    metrics.forEach(metric=>{
+    if(metric.id==='navstart'){
+    return;
+    }
+    if(!metric.ts){
+    log.error('pwmetrics-events',`(${metric.name}) missing timestamp. Skipping…`);
+    return;
+    }
+    log.verbose('pwmetrics-events',`Sythesizing trace events for ${metric.name}`);
+    fakeEvents.push(...this.synthesizeEventPair(metric,navigationStartEvt));
+    });
+    return fakeEvents;
+    }}
+    
+    
+    module.exports=Metrics;
+    
+    },{"lighthouse-logger":125}],87:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    const ELLIPSIS='\u2026';
+    const NBSP='\xa0';
+    const PASS_THRESHOLD=0.9;
+    const SCREENSHOT_PREFIX='data:image/jpeg;base64,';
+    
+    const RATINGS={
+    PASS:{label:'pass',minScore:PASS_THRESHOLD},
+    AVERAGE:{label:'average',minScore:0.5},
+    FAIL:{label:'fail'},
+    ERROR:{label:'error'}};
+    
+    
+    
+    
+    
+    const listOfTlds=[
+    'com','co','gov','edu','ac','org','go','gob','or','net','in','ne','nic','gouv',
+    'web','spb','blog','jus','kiev','mil','wi','qc','ca','bel','on'];
+    
+    
+    class Util{
+    static get PASS_THRESHOLD(){
+    return PASS_THRESHOLD;
+    }
+    
+    static get MS_DISPLAY_VALUE(){
+    return`%10d${NBSP}ms`;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static prepareReportResult(result){
+    
+    const clone=JSON.parse(JSON.stringify(result));
+    
+    
+    if(!clone.configSettings.locale){
+    clone.configSettings.locale='en';
+    }
+    
+    for(const audit of Object.values(clone.audits)){
+    
+    
+    
+    
+    if(audit.scoreDisplayMode==='not_applicable'||audit.scoreDisplayMode==='not-applicable'){
+    audit.scoreDisplayMode='notApplicable';
+    }
+    
+    if(audit.details){
+    
+    
+    
+    if(audit.details.type===undefined||audit.details.type==='diagnostic'){
+    audit.details.type='debugdata';
+    }
+    
+    
+    if(audit.details.type==='filmstrip'){
+    for(const screenshot of audit.details.items){
+    if(!screenshot.data.startsWith(SCREENSHOT_PREFIX)){
+    screenshot.data=SCREENSHOT_PREFIX+screenshot.data;
+    }
+    }
+    }
+    }
+    }
+    
+    
+    Util.setNumberDateLocale(clone.configSettings.locale);
+    if(clone.i18n&&clone.i18n.rendererFormattedStrings){
+    Util.updateAllUIStrings(clone.i18n.rendererFormattedStrings);
+    }
+    
+    
+    if(typeof clone.categories!=='object')throw new Error('No categories provided.');
+    for(const category of Object.values(clone.categories)){
+    category.auditRefs.forEach(auditRef=>{
+    const result=clone.audits[auditRef.id];
+    auditRef.result=result;
+    
+    
+    if(clone.stackPacks){
+    clone.stackPacks.forEach(pack=>{
+    if(pack.descriptions[auditRef.id]){
+    auditRef.stackPacks=auditRef.stackPacks||[];
+    auditRef.stackPacks.push({
+    title:pack.title,
+    iconDataURL:pack.iconDataURL,
+    description:pack.descriptions[auditRef.id]});
+    
+    }
+    });
+    }
+    });
+    }
+    
+    return clone;
+    }
+    
+    
+    
+    
+    
+    static updateAllUIStrings(rendererFormattedStrings){
+    
+    for(const[key,value]of Object.entries(rendererFormattedStrings)){
+    Util.UIStrings[key]=value;
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    static showAsPassed(audit){
+    switch(audit.scoreDisplayMode){
+    case'manual':
+    case'notApplicable':
+    return true;
+    case'error':
+    case'informative':
+    return false;
+    case'numeric':
+    case'binary':
+    default:
+    return Number(audit.score)>=RATINGS.PASS.minScore;}
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    static calculateRating(score,scoreDisplayMode){
+    
+    if(scoreDisplayMode==='manual'||scoreDisplayMode==='notApplicable'){
+    return RATINGS.PASS.label;
+    }else if(scoreDisplayMode==='error'){
+    return RATINGS.ERROR.label;
+    }else if(score===null){
+    return RATINGS.FAIL.label;
+    }
+    
+    
+    let rating=RATINGS.FAIL.label;
+    if(score>=RATINGS.PASS.minScore){
+    rating=RATINGS.PASS.label;
+    }else if(score>=RATINGS.AVERAGE.minScore){
+    rating=RATINGS.AVERAGE.label;
+    }
+    return rating;
+    }
+    
+    
+    
+    
+    
+    
+    
+    static formatNumber(number,granularity=0.1){
+    const coarseValue=Math.round(number/granularity)*granularity;
+    return Util.numberFormatter.format(coarseValue);
+    }
+    
+    
+    
+    
+    
+    
+    static formatBytesToKB(size,granularity=0.1){
+    const kbs=Util.numberFormatter.format(Math.round(size/1024/granularity)*granularity);
+    return`${kbs}${NBSP}KB`;
+    }
+    
+    
+    
+    
+    
+    
+    static formatMilliseconds(ms,granularity=10){
+    const coarseTime=Math.round(ms/granularity)*granularity;
+    return`${Util.numberFormatter.format(coarseTime)}${NBSP}ms`;
+    }
+    
+    
+    
+    
+    
+    
+    static formatSeconds(ms,granularity=0.1){
+    const coarseTime=Math.round(ms/1000/granularity)*granularity;
+    return`${Util.numberFormatter.format(coarseTime)}${NBSP}s`;
+    }
+    
+    
+    
+    
+    
+    
+    static formatDateTime(date){
+    
+    const options={
+    month:'short',day:'numeric',year:'numeric',
+    hour:'numeric',minute:'numeric',timeZoneName:'short'};
+    
+    let formatter=new Intl.DateTimeFormat(Util.numberDateLocale,options);
+    
+    
+    
+    const tz=formatter.resolvedOptions().timeZone;
+    if(!tz||tz.toLowerCase()==='etc/unknown'){
+    options.timeZone='UTC';
+    formatter=new Intl.DateTimeFormat(Util.numberDateLocale,options);
+    }
+    return formatter.format(new Date(date));
+    }
+    
+    
+    
+    
+    
+    static formatDuration(timeInMilliseconds){
+    let timeInSeconds=timeInMilliseconds/1000;
+    if(Math.round(timeInSeconds)===0){
+    return'None';
+    }
+    
+    
+    const parts=[];
+    const unitLabels={
+    d:60*60*24,
+    h:60*60,
+    m:60,
+    s:1};
+    
+    
+    Object.keys(unitLabels).forEach(label=>{
+    const unit=unitLabels[label];
+    const numberOfUnits=Math.floor(timeInSeconds/unit);
+    if(numberOfUnits>0){
+    timeInSeconds-=numberOfUnits*unit;
+    parts.push(`${numberOfUnits}\xa0${label}`);
+    }
+    });
+    
+    return parts.join(' ');
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    static splitMarkdownCodeSpans(text){
+    
+    const segments=[];
+    
+    
+    const parts=text.split(/`(.*?)`/g);
+    for(let i=0;i<parts.length;i++){
+    const text=parts[i];
+    
+    
+    if(!text)continue;
+    
+    
+    const isCode=i%2!==0;
+    segments.push({
+    isCode,
+    text});
+    
+    }
+    
+    return segments;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static splitMarkdownLink(text){
+    
+    const segments=[];
+    
+    const parts=text.split(/\[([^\]]+?)\]\((https?:\/\/.*?)\)/g);
+    while(parts.length){
+    
+    const[preambleText,linkText,linkHref]=parts.splice(0,3);
+    
+    if(preambleText){
+    segments.push({
+    isLink:false,
+    text:preambleText});
+    
+    }
+    
+    
+    if(linkText&&linkHref){
+    segments.push({
+    isLink:true,
+    text:linkText,
+    linkHref});
+    
+    }
+    }
+    
+    return segments;
+    }
+    
+    
+    
+    
+    
+    
+    static getURLDisplayName(parsedUrl,options){
+    
+    options=options||{numPathParts:undefined,preserveQuery:undefined,
+    preserveHost:undefined};
+    const numPathParts=options.numPathParts!==undefined?options.numPathParts:2;
+    const preserveQuery=options.preserveQuery!==undefined?options.preserveQuery:true;
+    const preserveHost=options.preserveHost||false;
+    
+    let name;
+    
+    if(parsedUrl.protocol==='about:'||parsedUrl.protocol==='data:'){
+    
+    name=parsedUrl.href;
+    }else{
+    name=parsedUrl.pathname;
+    const parts=name.split('/').filter(part=>part.length);
+    if(numPathParts&&parts.length>numPathParts){
+    name=ELLIPSIS+parts.slice(-1*numPathParts).join('/');
+    }
+    
+    if(preserveHost){
+    name=`${parsedUrl.host}/${name.replace(/^\//,'')}`;
+    }
+    if(preserveQuery){
+    name=`${name}${parsedUrl.search}`;
+    }
+    }
+    
+    const MAX_LENGTH=64;
+    
+    name=name.replace(/([a-f0-9]{7})[a-f0-9]{13}[a-f0-9]*/g,`$1${ELLIPSIS}`);
+    
+    name=name.replace(/([a-zA-Z0-9-_]{9})(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])[a-zA-Z0-9-_]{10,}/g,
+    `$1${ELLIPSIS}`);
+    
+    name=name.replace(/(\d{3})\d{6,}/g,`$1${ELLIPSIS}`);
+    
+    name=name.replace(/\u2026+/g,ELLIPSIS);
+    
+    
+    if(name.length>MAX_LENGTH&&name.includes('?')){
+    
+    name=name.replace(/\?([^=]*)(=)?.*/,`?$1$2${ELLIPSIS}`);
+    
+    
+    if(name.length>MAX_LENGTH){
+    name=name.replace(/\?.*/,`?${ELLIPSIS}`);
+    }
+    }
+    
+    
+    if(name.length>MAX_LENGTH){
+    const dotIndex=name.lastIndexOf('.');
+    if(dotIndex>=0){
+    name=name.slice(0,MAX_LENGTH-1-(name.length-dotIndex))+
+    
+    `${ELLIPSIS}${name.slice(dotIndex)}`;
+    }else{
+    name=name.slice(0,MAX_LENGTH-1)+ELLIPSIS;
+    }
+    }
+    
+    return name;
+    }
+    
+    
+    
+    
+    
+    
+    static parseURL(url){
+    const parsedUrl=new URL(url);
+    return{
+    file:Util.getURLDisplayName(parsedUrl),
+    hostname:parsedUrl.hostname,
+    origin:parsedUrl.origin};
+    
+    }
+    
+    
+    
+    
+    
+    static createOrReturnURL(value){
+    if(value instanceof URL){
+    return value;
+    }
+    
+    return new URL(value);
+    }
+    
+    
+    
+    
+    
+    
+    
+    static getTld(hostname){
+    const tlds=hostname.split('.').slice(-2);
+    
+    if(!listOfTlds.includes(tlds[0])){
+    return`.${tlds[tlds.length-1]}`;
+    }
+    
+    return`.${tlds.join('.')}`;
+    }
+    
+    
+    
+    
+    
+    
+    static getRootDomain(url){
+    const hostname=Util.createOrReturnURL(url).hostname;
+    const tld=Util.getTld(hostname);
+    
+    
+    
+    const splitTld=tld.split('.');
+    
+    
+    return hostname.split('.').slice(-splitTld.length).join('.');
+    }
+    
+    
+    
+    
+    
+    static getEnvironmentDisplayValues(settings){
+    const emulationDesc=Util.getEmulationDescriptions(settings);
+    
+    return[
+    {
+    name:'Device',
+    description:emulationDesc.deviceEmulation},
+    
+    {
+    name:'Network throttling',
+    description:emulationDesc.networkThrottling},
+    
+    {
+    name:'CPU throttling',
+    description:emulationDesc.cpuThrottling}];
+    
+    
+    }
+    
+    
+    
+    
+    
+    static getEmulationDescriptions(settings){
+    let cpuThrottling;
+    let networkThrottling;
+    let summary;
+    
+    const throttling=settings.throttling;
+    
+    switch(settings.throttlingMethod){
+    case'provided':
+    cpuThrottling='Provided by environment';
+    networkThrottling='Provided by environment';
+    summary='No throttling applied';
+    break;
+    case'devtools':{
+    const{cpuSlowdownMultiplier,requestLatencyMs}=throttling;
+    cpuThrottling=`${Util.formatNumber(cpuSlowdownMultiplier)}x slowdown (DevTools)`;
+    networkThrottling=`${Util.formatNumber(requestLatencyMs)}${NBSP}ms HTTP RTT, `+
+    `${Util.formatNumber(throttling.downloadThroughputKbps)}${NBSP}Kbps down, `+
+    `${Util.formatNumber(throttling.uploadThroughputKbps)}${NBSP}Kbps up (DevTools)`;
+    summary='Throttled Slow 4G network';
+    break;
+    }
+    case'simulate':{
+    const{cpuSlowdownMultiplier,rttMs,throughputKbps}=throttling;
+    cpuThrottling=`${Util.formatNumber(cpuSlowdownMultiplier)}x slowdown (Simulated)`;
+    networkThrottling=`${Util.formatNumber(rttMs)}${NBSP}ms TCP RTT, `+
+    `${Util.formatNumber(throughputKbps)}${NBSP}Kbps throughput (Simulated)`;
+    summary='Simulated Slow 4G network';
+    break;
+    }
+    default:
+    cpuThrottling='Unknown';
+    networkThrottling='Unknown';
+    summary='Unknown';}
+    
+    
+    let deviceEmulation='No emulation';
+    if(settings.emulatedFormFactor==='mobile')deviceEmulation='Emulated Nexus 5X';
+    if(settings.emulatedFormFactor==='desktop')deviceEmulation='Emulated Desktop';
+    
+    return{
+    deviceEmulation,
+    cpuThrottling,
+    networkThrottling,
+    summary:`${deviceEmulation}, ${summary}`};
+    
+    }
+    
+    
+    
+    
+    
+    static setNumberDateLocale(locale){
+    
+    if(locale==='en-XA')locale='de';
+    
+    Util.numberDateLocale=locale;
+    Util.numberFormatter=new Intl.NumberFormat(locale);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static filterRelevantLines(lines,lineMessages,surroundingLineCount){
+    if(lineMessages.length===0){
+    
+    return lines.slice(0,surroundingLineCount*2+1);
+    }
+    
+    const minGapSize=3;
+    const lineNumbersToKeep=new Set();
+    
+    
+    lineMessages=lineMessages.sort((a,b)=>(a.lineNumber||0)-(b.lineNumber||0));
+    lineMessages.forEach(({lineNumber})=>{
+    let firstSurroundingLineNumber=lineNumber-surroundingLineCount;
+    let lastSurroundingLineNumber=lineNumber+surroundingLineCount;
+    
+    while(firstSurroundingLineNumber<1){
+    
+    firstSurroundingLineNumber++;
+    lastSurroundingLineNumber++;
+    }
+    
+    
+    if(lineNumbersToKeep.has(firstSurroundingLineNumber-minGapSize-1)){
+    firstSurroundingLineNumber-=minGapSize;
+    }
+    for(let i=firstSurroundingLineNumber;i<=lastSurroundingLineNumber;i++){
+    const surroundingLineNumber=i;
+    lineNumbersToKeep.add(surroundingLineNumber);
+    }
+    });
+    
+    return lines.filter(line=>lineNumbersToKeep.has(line.lineNumber));
+    }
+    
+    
+    
+    
+    static isPluginCategory(categoryId){
+    return categoryId.startsWith('lighthouse-plugin-');
+    }}
+    
+    
+    
+    
+    
+    
+    Util.numberDateLocale='en';
+    
+    
+    
+    
+    
+    Util.numberFormatter=new Intl.NumberFormat(Util.numberDateLocale);
+    
+    
+    
+    
+    
+    Util.UIStrings={
+    
+    varianceDisclaimer:'Values are estimated and may vary. The performance score is [based only on these metrics](https://github.com/GoogleChrome/lighthouse/blob/d2ec9ffbb21de9ad1a0f86ed24575eda32c796f0/docs/scoring.md#how-are-the-scores-weighted).',
+    
+    opportunityResourceColumnLabel:'Opportunity',
+    
+    opportunitySavingsColumnLabel:'Estimated Savings',
+    
+    
+    errorMissingAuditInfo:'Report error: no audit information',
+    
+    errorLabel:'Error!',
+    
+    warningHeader:'Warnings: ',
+    
+    auditGroupExpandTooltip:'Show audits',
+    
+    warningAuditsGroupTitle:'Passed audits but with warnings',
+    
+    passedAuditsGroupTitle:'Passed audits',
+    
+    notApplicableAuditsGroupTitle:'Not applicable',
+    
+    manualAuditsGroupTitle:'Additional items to manually check',
+    
+    
+    toplevelWarningsMessage:'There were issues affecting this run of Lighthouse:',
+    
+    
+    crcInitialNavigation:'Initial Navigation',
+    
+    crcLongestDurationLabel:'Maximum critical path latency:',
+    
+    
+    snippetExpandButtonLabel:'Expand snippet',
+    
+    snippetCollapseButtonLabel:'Collapse snippet',
+    
+    
+    lsPerformanceCategoryDescription:'[Lighthouse](https://developers.google.com/web/tools/lighthouse/) analysis of the current page on an emulated mobile network. Values are estimated and may vary.',
+    
+    labDataTitle:'Lab Data',
+    
+    
+    thirdPartyResourcesLabel:'Show 3rd-party resources'};
+    
+    
+    if(typeof module!=='undefined'&&module.exports){
+    module.exports=Util;
+    }else{
+    self.Util=Util;
+    }
+    
+    },{}],88:[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const htmlReportAssets=require('./html/html-report-assets.js');
+    
+    class ReportGenerator{
+    
+    
+    
+    
+    
+    
+    static replaceStrings(source,replacements){
+    if(replacements.length===0){
+    return source;
+    }
+    
+    const firstReplacement=replacements[0];
+    const nextReplacements=replacements.slice(1);
+    return source.
+    split(firstReplacement.search).
+    map(part=>ReportGenerator.replaceStrings(part,nextReplacements)).
+    join(firstReplacement.replacement);
+    }
+    
+    
+    
+    
+    
+    
+    static generateReportHtml(lhr){
+    const sanitizedJson=JSON.stringify(lhr).
+    replace(/</g,'\\u003c').
+    replace(/\u2028/g,'\\u2028').
+    replace(/\u2029/g,'\\u2029');
+    const sanitizedJavascript=htmlReportAssets.REPORT_JAVASCRIPT.replace(/<\//g,'\\u003c/');
+    
+    return ReportGenerator.replaceStrings(htmlReportAssets.REPORT_TEMPLATE,[
+    {search:'%%LIGHTHOUSE_JSON%%',replacement:sanitizedJson},
+    {search:'%%LIGHTHOUSE_JAVASCRIPT%%',replacement:sanitizedJavascript},
+    {search:'/*%%LIGHTHOUSE_CSS%%*/',replacement:htmlReportAssets.REPORT_CSS},
+    {search:'%%LIGHTHOUSE_TEMPLATES%%',replacement:htmlReportAssets.REPORT_TEMPLATES}]);
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static generateReportCSV(lhr){
+    
+    
+    const CRLF='\r\n';
+    const separator=',';
+    
+    const escape=value=>`"${value.replace(/"/g,'""')}"`;
+    
+    
+    const header=['category','name','title','type','score'];
+    const table=Object.values(lhr.categories).map(category=>{
+    return category.auditRefs.map(auditRef=>{
+    const audit=lhr.audits[auditRef.id];
+    
+    const numericScore=audit.score===null?-1:audit.score;
+    return[category.title,audit.id,audit.title,audit.scoreDisplayMode,numericScore].
+    map(value=>value.toString()).
+    map(escape);
+    });
+    });
+    
+    return[header].concat(...table).
+    map(row=>row.join(separator)).join(CRLF);
+    }
+    
+    
+    
+    
+    
+    
+    
+    static generateReport(lhr,outputModes){
+    const outputAsArray=Array.isArray(outputModes);
+    if(typeof outputModes==='string')outputModes=[outputModes];
+    
+    const output=outputModes.map(outputMode=>{
+    
+    if(outputMode==='html'){
+    return ReportGenerator.generateReportHtml(lhr);
+    }
+    
+    if(outputMode==='csv'){
+    return ReportGenerator.generateReportCSV(lhr);
+    }
+    
+    if(outputMode==='json'){
+    return JSON.stringify(lhr,null,2);
+    }
+    
+    throw new Error('Invalid output mode: '+outputMode);
+    });
+    
+    return outputAsArray?output:output[0];
+    }}
+    
+    
+    module.exports=ReportGenerator;
+    
+    },{"./html/html-report-assets.js":101}],89:[function(require,module,exports){
+    (function(process){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const isDeepEqual=require('lodash.isequal');
+    const Driver=require('./gather/driver.js');
+    const GatherRunner=require('./gather/gather-runner.js');
+    const ReportScoring=require('./scoring.js');
+    const Audit=require('./audits/audit.js');
+    const log=require('lighthouse-logger');
+    const i18n=require('./lib/i18n/i18n.js');
+    const stackPacks=require('./lib/stack-packs.js');
+    const assetSaver=require('./lib/asset-saver.js');
+    
+    const path=require('path');
+    const URL=require('./lib/url-shim.js');
+    const Sentry=require('./lib/sentry.js');
+    const generateReport=require('./report/report-generator.js').generateReport;
+    const LHError=require('./lib/lh-error.js');
+    
+    
+    
+    
+    class Runner{
+    
+    
+    
+    
+    
+    static async run(connection,runOpts){
+    const settings=runOpts.config.settings;
+    try{
+    const runnerStatus={msg:'Runner setup',id:'lh:runner:run'};
+    log.time(runnerStatus,'verbose');
+    
+    
+    
+    
+    
+    const lighthouseRunWarnings=[];
+    
+    const sentryContext=Sentry.getContext();
+    Sentry.captureBreadcrumb({
+    message:'Run started',
+    category:'lifecycle',
+    data:sentryContext&&sentryContext.extra});
+    
+    
+    
+    
+    
+    
+    
+    
+    let artifacts;
+    let requestedUrl;
+    if(settings.auditMode&&!settings.gatherMode){
+    
+    const path=Runner._getArtifactsPath(settings);
+    artifacts=assetSaver.loadArtifacts(path);
+    requestedUrl=artifacts.URL.requestedUrl;
+    
+    if(!requestedUrl){
+    throw new Error('Cannot run audit mode on empty URL');
+    }
+    if(runOpts.url&&!URL.equalWithExcludedFragments(runOpts.url,requestedUrl)){
+    throw new Error('Cannot run audit mode on different URL');
+    }
+    }else{
+    
+    if(runOpts.url&&URL.isValid(runOpts.url)&&URL.isProtocolAllowed(runOpts.url)){
+    
+    requestedUrl=new URL(runOpts.url).href;
+    }else{
+    throw new LHError(LHError.errors.INVALID_URL);
+    }
+    
+    artifacts=await Runner._gatherArtifactsFromBrowser(requestedUrl,runOpts,connection);
+    
+    if(settings.gatherMode){
+    const path=Runner._getArtifactsPath(settings);
+    await assetSaver.saveArtifacts(artifacts,path);
+    }
+    }
+    
+    
+    if(settings.gatherMode&&!settings.auditMode)return;
+    
+    
+    if(!runOpts.config.audits){
+    throw new Error('No audits to evaluate.');
+    }
+    const auditResults=await Runner._runAudits(settings,runOpts.config.audits,artifacts,
+    lighthouseRunWarnings);
+    
+    
+    const resultsStatus={msg:'Generating results...',id:'lh:runner:generate'};
+    log.time(resultsStatus);
+    
+    if(artifacts.LighthouseRunWarnings){
+    lighthouseRunWarnings.push(...artifacts.LighthouseRunWarnings);
+    }
+    
+    
+    const lighthouseVersion=require('../package.json').version;
+    
+    
+    const resultsById={};
+    for(const audit of auditResults){
+    resultsById[audit.id]=audit;
+    }
+    
+    
+    let categories={};
+    if(runOpts.config.categories){
+    categories=ReportScoring.scoreAllCategories(runOpts.config.categories,resultsById);
+    }
+    
+    log.timeEnd(resultsStatus);
+    log.timeEnd(runnerStatus);
+    
+    
+    const lhr={
+    userAgent:artifacts.HostUserAgent,
+    environment:{
+    networkUserAgent:artifacts.NetworkUserAgent,
+    hostUserAgent:artifacts.HostUserAgent,
+    benchmarkIndex:artifacts.BenchmarkIndex},
+    
+    lighthouseVersion,
+    fetchTime:artifacts.fetchTime,
+    requestedUrl:requestedUrl,
+    finalUrl:artifacts.URL.finalUrl,
+    runWarnings:lighthouseRunWarnings,
+    runtimeError:Runner.getArtifactRuntimeError(artifacts),
+    audits:resultsById,
+    configSettings:settings,
+    categories,
+    categoryGroups:runOpts.config.groups||undefined,
+    timing:this._getTiming(artifacts),
+    i18n:{
+    rendererFormattedStrings:i18n.getRendererFormattedStrings(settings.locale),
+    icuMessagePaths:{}},
+    
+    stackPacks:stackPacks.getStackPacks(artifacts.Stacks)};
+    
+    
+    
+    lhr.i18n.icuMessagePaths=i18n.replaceIcuMessageInstanceIds(lhr,settings.locale);
+    
+    
+    const report=generateReport(lhr,settings.output);
+    
+    return{lhr,artifacts,report};
+    }catch(err){
+    
+    err.friendlyMessage=i18n.getFormatted(err.friendlyMessage,settings.locale);
+    await Sentry.captureException(err,{level:'fatal'});
+    throw err;
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    static _getTiming(artifacts){
+    const timingEntriesFromArtifacts=artifacts.Timing||[];
+    const timingEntriesFromRunner=log.takeTimeEntries();
+    const timingEntriesKeyValues=[
+    ...timingEntriesFromArtifacts,
+    ...timingEntriesFromRunner].
+    
+    map(entry=>[entry.startTime,entry]);
+    const timingEntries=Array.from(new Map(timingEntriesKeyValues).values()).
+    
+    
+    map(entry=>{
+    return{
+    
+    
+    startTime:parseFloat(entry.startTime.toFixed(2)),
+    name:entry.name,
+    duration:parseFloat(entry.duration.toFixed(2)),
+    entryType:entry.entryType};
+    
+    });
+    const runnerEntry=timingEntries.find(e=>e.name==='lh:runner:run');
+    return{entries:timingEntries,total:runnerEntry&&runnerEntry.duration||0};
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    static async _gatherArtifactsFromBrowser(requestedUrl,runnerOpts,connection){
+    if(!runnerOpts.config.passes){
+    throw new Error('No browser artifacts are either provided or requested.');
+    }
+    const driver=runnerOpts.driverMock||new Driver(connection);
+    const gatherOpts={
+    driver,
+    requestedUrl,
+    settings:runnerOpts.config.settings};
+    
+    const artifacts=await GatherRunner.run(runnerOpts.config.passes,gatherOpts);
+    return artifacts;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static async _runAudits(settings,audits,artifacts,runWarnings){
+    const status={msg:'Analyzing and running audits...',id:'lh:runner:auditing'};
+    log.time(status);
+    
+    if(artifacts.settings){
+    const overrides={
+    locale:undefined,
+    gatherMode:undefined,
+    auditMode:undefined,
+    output:undefined,
+    channel:undefined,
+    budgets:undefined};
+    
+    const normalizedGatherSettings=Object.assign({},artifacts.settings,overrides);
+    const normalizedAuditSettings=Object.assign({},settings,overrides);
+    
+    if(!isDeepEqual(normalizedGatherSettings,normalizedAuditSettings)){
+    throw new Error('Cannot change settings between gathering and auditing');
+    }
+    }
+    
+    
+    const sharedAuditContext={
+    settings,
+    LighthouseRunWarnings:runWarnings,
+    computedCache:new Map()};
+    
+    
+    
+    const auditResults=[];
+    for(const auditDefn of audits){
+    const auditResult=await Runner._runAudit(auditDefn,artifacts,sharedAuditContext);
+    auditResults.push(auditResult);
+    }
+    
+    log.timeEnd(status);
+    return auditResults;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    static async _runAudit(auditDefn,artifacts,sharedAuditContext){
+    const audit=auditDefn.implementation;
+    const status={
+    msg:`Auditing: ${i18n.getFormatted(audit.meta.title,'en-US')}`,
+    id:`lh:audit:${audit.meta.id}`};
+    
+    log.time(status);
+    
+    let auditResult;
+    try{
+    
+    for(const artifactName of audit.meta.requiredArtifacts){
+    const noArtifact=artifacts[artifactName]===undefined;
+    
+    
+    
+    const noRequiredTrace=artifactName==='traces'&&!artifacts.traces[Audit.DEFAULT_PASS];
+    const noRequiredDevtoolsLog=artifactName==='devtoolsLogs'&&
+    !artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    
+    if(noArtifact||noRequiredTrace||noRequiredDevtoolsLog){
+    log.warn('Runner',
+    `${artifactName} gatherer, required by audit ${audit.meta.id}, did not run.`);
+    throw new LHError(LHError.errors.MISSING_REQUIRED_ARTIFACT,{artifactName});
+    }
+    
+    
+    if(artifacts[artifactName]instanceof Error){
+    
+    
+    const artifactError=artifacts[artifactName];
+    
+    Sentry.captureException(artifactError,{
+    tags:{gatherer:artifactName},
+    level:'error'});
+    
+    
+    log.warn('Runner',`${artifactName} gatherer, required by audit ${audit.meta.id},`+
+    ` encountered an error: ${artifactError.message}`);
+    
+    
+    const error=new LHError(LHError.errors.ERRORED_REQUIRED_ARTIFACT,
+    {artifactName,errorMessage:artifactError.message});
+    
+    error.expected=true;
+    throw error;
+    }
+    }
+    
+    
+    const auditOptions=Object.assign({},audit.defaultOptions,auditDefn.options);
+    const auditContext={
+    options:auditOptions,
+    ...sharedAuditContext};
+    
+    
+    
+    
+    
+    const requiredArtifacts=audit.meta.requiredArtifacts.
+    reduce((requiredArtifacts,artifactName)=>{
+    const requiredArtifact=artifacts[artifactName];
+    
+    requiredArtifacts[artifactName]=requiredArtifact;
+    return requiredArtifacts;
+    },{});
+    const product=await audit.audit(requiredArtifacts,auditContext);
+    auditResult=Audit.generateAuditResult(audit,product);
+    }catch(err){
+    
+    if(err.code!=='MISSING_REQUIRED_ARTIFACT'&&err.code!=='ERRORED_REQUIRED_ARTIFACT'){
+    log.warn(audit.meta.id,`Caught exception: ${err.message}`);
+    }
+    
+    Sentry.captureException(err,{tags:{audit:audit.meta.id},level:'error'});
+    
+    const errorMessage=err.friendlyMessage?err.friendlyMessage:err.message;
+    auditResult=Audit.generateErrorAuditResult(audit,errorMessage);
+    }
+    
+    log.timeEnd(status);
+    return auditResult;
+    }
+    
+    
+    
+    
+    
+    
+    
+    static getArtifactRuntimeError(artifacts){
+    const possibleErrorArtifacts=[
+    artifacts.PageLoadError,
+    ...Object.values(artifacts)];
+    
+    
+    for(const possibleErrorArtifact of possibleErrorArtifacts){
+    if(possibleErrorArtifact instanceof LHError&&possibleErrorArtifact.lhrRuntimeError){
+    const errorMessage=possibleErrorArtifact.friendlyMessage||possibleErrorArtifact.message;
+    
+    return{
+    code:possibleErrorArtifact.code,
+    message:errorMessage};
+    
+    }
+    }
+    
+    return undefined;
+    }
+    
+    
+    
+    
+    
+    static getAuditList(){
+    const ignoredFiles=[
+    'audit.js',
+    'violation-audit.js',
+    'accessibility/axe-audit.js',
+    'multi-check-audit.js',
+    'byte-efficiency/byte-efficiency-audit.js',
+    'manual/manual-audit.js'];
+    
+    
+    const fileList=[
+    ...["accessibility","apple-touch-icon.js","audit.js","bootup-time.js","byte-efficiency","content-width.js","critical-request-chains.js","deprecations.js","diagnostics.js","dobetterweb","errors-in-console.js","final-screenshot.js","font-display.js","image-aspect-ratio.js","installable-manifest.js","is-on-https.js","load-fast-enough-for-pwa.js","main-thread-tasks.js","mainthread-work-breakdown.js","manual","metrics","metrics.js","mixed-content.js","multi-check-audit.js","network-requests.js","network-rtt.js","network-server-latency.js","offline-start-url.js","performance-budget.js","predictive-perf.js","redirects-http.js","redirects.js","resource-summary.js","screenshot-thumbnails.js","seo","service-worker.js","splash-screen.js","themed-omnibox.js","third-party-summary.js","time-to-first-byte.js","user-timings.js","uses-rel-preconnect.js","uses-rel-preload.js","viewport.js","violation-audit.js","without-javascript.js","works-offline.js"],
+    ...["appcache-manifest.js","doctype.js","dom-size.js","external-anchors-use-rel-noopener.js","geolocation-on-start.js","js-libraries.js","no-document-write.js","no-vulnerable-libraries.js","notification-on-start.js","password-inputs-can-be-pasted-into.js","uses-http2.js","uses-passive-event-listeners.js"].map(f=>`dobetterweb/${f}`),
+    ...["estimated-input-latency.js","first-contentful-paint-3g.js","first-contentful-paint.js","first-cpu-idle.js","first-meaningful-paint.js","interactive.js","max-potential-fid.js","speed-index.js","total-blocking-time.js"].map(f=>`metrics/${f}`),
+    ...["canonical.js","font-size.js","hreflang.js","http-status-code.js","is-crawlable.js","link-text.js","manual","meta-description.js","plugins.js","robots-txt.js","tap-targets.js"].map(f=>`seo/${f}`),
+    ...["structured-data.js"].map(f=>`seo/manual/${f}`),
+    ...["accesskeys.js","aria-allowed-attr.js","aria-required-attr.js","aria-required-children.js","aria-required-parent.js","aria-roles.js","aria-valid-attr-value.js","aria-valid-attr.js","audio-caption.js","axe-audit.js","button-name.js","bypass.js","color-contrast.js","definition-list.js","dlitem.js","document-title.js","duplicate-id.js","frame-title.js","html-has-lang.js","html-lang-valid.js","image-alt.js","input-image-alt.js","label.js","layout-table.js","link-name.js","list.js","listitem.js","manual","meta-refresh.js","meta-viewport.js","object-alt.js","tabindex.js","td-headers-attr.js","th-has-data-cells.js","valid-lang.js","video-caption.js","video-description.js"].
+    map(f=>`accessibility/${f}`),
+    ...["custom-controls-labels.js","custom-controls-roles.js","focus-traps.js","focusable-controls.js","heading-levels.js","interactive-element-affordance.js","logical-tab-order.js","managed-focus.js","offscreen-content-hidden.js","use-landmarks.js","visual-order-follows-dom.js"].
+    map(f=>`accessibility/manual/${f}`),
+    ...["byte-efficiency-audit.js","efficient-animated-content.js","offscreen-images.js","render-blocking-resources.js","total-byte-weight.js","unminified-css.js","unminified-javascript.js","unused-css-rules.js","unused-javascript.js","uses-long-cache-ttl.js","uses-optimized-images.js","uses-responsive-images.js","uses-text-compression.js","uses-webp-images.js"].
+    map(f=>`byte-efficiency/${f}`),
+    ...["manual-audit.js","pwa-cross-browser.js","pwa-each-page-has-url.js","pwa-page-transitions.js"].map(f=>`manual/${f}`)];
+    
+    return fileList.filter(f=>{
+    return /\.js$/.test(f)&&!ignoredFiles.includes(f);
+    }).sort();
+    }
+    
+    
+    
+    
+    
+    static getGathererList(){
+    const fileList=[
+    ...["accessibility.js","anchor-elements.js","cache-contents.js","console-messages.js","css-usage.js","dobetterweb","gatherer.js","html-without-javascript.js","http-redirect.js","iframe-elements.js","image-elements.js","js-usage.js","link-elements.js","main-document-content.js","meta-elements.js","mixed-content.js","offline.js","runtime-exceptions.js","script-elements.js","seo","service-worker.js","source-maps.js","start-url.js","viewport-dimensions.js"],
+    ...["embedded-content.js","font-size.js","robots-txt.js","tap-targets.js"].map(f=>`seo/${f}`),
+    ...["appcache.js","doctype.js","domstats.js","optimized-images.js","password-inputs-with-prevented-paste.js","response-compression.js","tags-blocking-first-paint.js"].
+    map(f=>`dobetterweb/${f}`)];
+    
+    return fileList.filter(f=>/\.js$/.test(f)&&f!=='gatherer.js').sort();
+    }
+    
+    
+    
+    
+    
+    
+    static _getArtifactsPath(settings){
+    const{auditMode,gatherMode}=settings;
+    
+    
+    if(typeof auditMode==='string')return path.resolve(process.cwd(),auditMode);
+    if(typeof gatherMode==='string')return path.resolve(process.cwd(),gatherMode);
+    
+    return path.join(process.cwd(),'latest-run');
+    }}
+    
+    
+    module.exports=Runner;
+    
+    }).call(this,require('_process'));
+    },{"../package.json":192,"./audits/audit.js":3,"./gather/driver.js":51,"./gather/gather-runner.js":52,"./lib/asset-saver.js":56,"./lib/i18n/i18n.js":66,"./lib/lh-error.js":71,"./lib/sentry.js":78,"./lib/stack-packs.js":80,"./lib/url-shim.js":"url","./report/report-generator.js":88,"./scoring.js":90,"_process":158,"lighthouse-logger":125,"lodash.isequal":142,"path":156}],90:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const Audit=require('./audits/audit.js');
+    
+    
+    
+    
+    
+    
+    const clampTo2Decimals=val=>Math.round(val*100)/100;
+    
+    class ReportScoring{
+    
+    
+    
+    
+    
+    static arithmeticMean(items){
+    
+    items=items.filter(item=>item.weight>0);
+    
+    if(items.some(item=>item.score===null))return null;
+    
+    const results=items.reduce(
+    (result,item)=>{
+    const score=item.score;
+    const weight=item.weight;
+    
+    return{
+    weight:result.weight+weight,
+    sum:result.sum+score*weight};
+    
+    },
+    {weight:0,sum:0});
+    
+    
+    return clampTo2Decimals(results.sum/results.weight||0);
+    }
+    
+    
+    
+    
+    
+    
+    
+    static scoreAllCategories(configCategories,resultsByAuditId){
+    
+    const scoredCategories={};
+    
+    for(const[categoryId,configCategory]of Object.entries(configCategories)){
+    
+    const auditRefs=configCategory.auditRefs.map(configMember=>{
+    const member={...configMember};
+    
+    
+    
+    
+    
+    const result=resultsByAuditId[member.id];
+    if(result.scoreDisplayMode===Audit.SCORING_MODES.NOT_APPLICABLE||
+    result.scoreDisplayMode===Audit.SCORING_MODES.INFORMATIVE||
+    result.scoreDisplayMode===Audit.SCORING_MODES.MANUAL){
+    member.weight=0;
+    }
+    
+    return member;
+    });
+    
+    const scores=auditRefs.map(auditRef=>({
+    score:resultsByAuditId[auditRef.id].score,
+    weight:auditRef.weight}));
+    
+    const score=ReportScoring.arithmeticMean(scores);
+    
+    scoredCategories[categoryId]={
+    ...configCategory,
+    auditRefs,
+    id:categoryId,
+    score};
+    
+    }
+    
+    return scoredCategories;
+    }}
+    
+    
+    module.exports=ReportScoring;
+    
+    },{"./audits/audit.js":3}],91:[function(require,module,exports){
+    const HEADER_REGEXP=/([a-zA-Z][a-zA-Z_-]*)\s*(?:=(?:"([^"]*)"|([^ \t",;]*)))?/g;
+    
+    const STRINGS={
+    maxAge:'max-age',
+    sharedMaxAge:'s-maxage',
+    maxStale:'max-stale',
+    minFresh:'min-fresh',
+    immutable:'immutable',
+    mustRevalidate:'must-revalidate',
+    noCache:'no-cache',
+    noStore:'no-store',
+    noTransform:'no-transform',
+    onlyIfCached:'only-if-cached',
+    private:'private',
+    proxyRevalidate:'proxy-revalidate',
+    public:'public'};
+    
+    
+    function parseBooleanOnly(value){
+    return value===null;
+    }
+    
+    function parseDuration(value){
+    if(!value){
+    return null;
+    }
+    
+    const duration=parseInt(value,10);
+    
+    if(!Number.isFinite(duration)||duration<0){
+    return null;
+    }
+    
+    return duration;
+    }
+    
+    class CacheControl{
+    constructor(){
+    this.maxAge=null;
+    this.sharedMaxAge=null;
+    this.maxStale=null;
+    this.maxStaleDuration=null;
+    this.minFresh=null;
+    this.immutable=null;
+    this.mustRevalidate=null;
+    this.noCache=null;
+    this.noStore=null;
+    this.noTransform=null;
+    this.onlyIfCached=null;
+    this.private=null;
+    this.proxyRevalidate=null;
+    this.public=null;
+    }
+    
+    parse(header){
+    if(!header||header.length===0){
+    return this;
+    }
+    
+    const values={};
+    const matches=header.match(HEADER_REGEXP)||[];
+    
+    Array.prototype.forEach.call(matches,match=>{
+    const tokens=match.split('=',2);
+    
+    const[key]=tokens;
+    let value=null;
+    
+    if(tokens.length>1){
+    value=tokens[1].trim();
+    }
+    
+    values[key.toLowerCase()]=value;
+    });
+    
+    this.maxAge=parseDuration(values[STRINGS.maxAge]);
+    this.sharedMaxAge=parseDuration(values[STRINGS.sharedMaxAge]);
+    
+    this.maxStale=parseBooleanOnly(values[STRINGS.maxStale]);
+    this.maxStaleDuration=parseDuration(values[STRINGS.maxStale]);
+    if(this.maxStaleDuration){
+    this.maxStale=true;
+    }
+    
+    this.minFresh=parseDuration(values[STRINGS.minFresh]);
+    
+    this.immutable=parseBooleanOnly(values[STRINGS.immutable]);
+    this.mustRevalidate=parseBooleanOnly(values[STRINGS.mustRevalidate]);
+    this.noCache=parseBooleanOnly(values[STRINGS.noCache]);
+    this.noStore=parseBooleanOnly(values[STRINGS.noStore]);
+    this.noTransform=parseBooleanOnly(values[STRINGS.noTransform]);
+    this.onlyIfCached=parseBooleanOnly(values[STRINGS.onlyIfCached]);
+    this.private=parseBooleanOnly(values[STRINGS.private]);
+    this.proxyRevalidate=parseBooleanOnly(values[STRINGS.proxyRevalidate]);
+    this.public=parseBooleanOnly(values[STRINGS.public]);
+    
+    return this;
+    }
+    
+    format(){
+    const tokens=[];
+    
+    if(this.maxAge){
+    tokens.push(`${STRINGS.maxAge}=${this.maxAge}`);
+    }
+    
+    if(this.sharedMaxAge){
+    tokens.push(`${STRINGS.sharedMaxAge}=${this.sharedMaxAge}`);
+    }
+    
+    if(this.maxStale){
+    if(this.maxStaleDuration){
+    tokens.push(`${STRINGS.maxStale}=${this.maxStaleDuration}`);
+    }else{
+    tokens.push(STRINGS.maxStale);
+    }
+    }
+    
+    if(this.minFresh){
+    tokens.push(`${STRINGS.minFresh}=${this.minFresh}`);
+    }
+    
+    if(this.immutable){
+    tokens.push(STRINGS.immutable);
+    }
+    
+    if(this.mustRevalidate){
+    tokens.push(STRINGS.mustRevalidate);
+    }
+    
+    if(this.noCache){
+    tokens.push(STRINGS.noCache);
+    }
+    
+    if(this.noStore){
+    tokens.push(STRINGS.noStore);
+    }
+    
+    if(this.noTransform){
+    tokens.push(STRINGS.noTransform);
+    }
+    
+    if(this.onlyIfCached){
+    tokens.push(STRINGS.onlyIfCached);
+    }
+    
+    if(this.private){
+    tokens.push(STRINGS.private);
+    }
+    
+    if(this.proxyRevalidate){
+    tokens.push(STRINGS.proxyRevalidate);
+    }
+    
+    if(this.public){
+    tokens.push(STRINGS.public);
+    }
+    
+    return tokens.join(', ');
+    }}
+    
+    
+    function parse(header){
+    const cc=new CacheControl();
+    return cc.parse(header);
+    }
+    
+    function format(cc){
+    if(!(cc instanceof CacheControl)){
+    return CacheControl.prototype.format.call(cc);
+    }
+    
+    return cc.format();
+    }
+    
+    module.exports={
+    CacheControl,
+    parse,
+    format};
+    
+    
+    },{}],92:[function(require,module,exports){
+    (function(global){
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function compare(a,b){
+    if(a===b){
+    return 0;
+    }
+    
+    var x=a.length;
+    var y=b.length;
+    
+    for(var i=0,len=Math.min(x,y);i<len;++i){
+    if(a[i]!==b[i]){
+    x=a[i];
+    y=b[i];
+    break;
+    }
+    }
+    
+    if(x<y){
+    return-1;
+    }
+    if(y<x){
+    return 1;
+    }
+    return 0;
+    }
+    function isBuffer(b){
+    if(global.Buffer&&typeof global.Buffer.isBuffer==='function'){
+    return global.Buffer.isBuffer(b);
+    }
+    return!!(b!=null&&b._isBuffer);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    var util=require('util/');
+    var hasOwn=Object.prototype.hasOwnProperty;
+    var pSlice=Array.prototype.slice;
+    var functionsHaveNames=function(){
+    return function foo(){}.name==='foo';
+    }();
+    function pToString(obj){
+    return Object.prototype.toString.call(obj);
+    }
+    function isView(arrbuf){
+    if(isBuffer(arrbuf)){
+    return false;
+    }
+    if(typeof global.ArrayBuffer!=='function'){
+    return false;
+    }
+    if(typeof ArrayBuffer.isView==='function'){
+    return ArrayBuffer.isView(arrbuf);
+    }
+    if(!arrbuf){
+    return false;
+    }
+    if(arrbuf instanceof DataView){
+    return true;
+    }
+    if(arrbuf.buffer&&arrbuf.buffer instanceof ArrayBuffer){
+    return true;
+    }
+    return false;
+    }
+    
+    
+    
+    
+    var assert=module.exports=ok;
+    
+    
+    
+    
+    
+    
+    var regex=/\s*function\s+([^\(\s]*)\s*/;
+    
+    function getName(func){
+    if(!util.isFunction(func)){
+    return;
+    }
+    if(functionsHaveNames){
+    return func.name;
+    }
+    var str=func.toString();
+    var match=str.match(regex);
+    return match&&match[1];
+    }
+    assert.AssertionError=function AssertionError(options){
+    this.name='AssertionError';
+    this.actual=options.actual;
+    this.expected=options.expected;
+    this.operator=options.operator;
+    if(options.message){
+    this.message=options.message;
+    this.generatedMessage=false;
+    }else{
+    this.message=getMessage(this);
+    this.generatedMessage=true;
+    }
+    var stackStartFunction=options.stackStartFunction||fail;
+    if(Error.captureStackTrace){
+    Error.captureStackTrace(this,stackStartFunction);
+    }else{
+    
+    var err=new Error();
+    if(err.stack){
+    var out=err.stack;
+    
+    
+    var fn_name=getName(stackStartFunction);
+    var idx=out.indexOf('\n'+fn_name);
+    if(idx>=0){
+    
+    
+    var next_line=out.indexOf('\n',idx+1);
+    out=out.substring(next_line+1);
+    }
+    
+    this.stack=out;
+    }
+    }
+    };
+    
+    
+    util.inherits(assert.AssertionError,Error);
+    
+    function truncate(s,n){
+    if(typeof s==='string'){
+    return s.length<n?s:s.slice(0,n);
+    }else{
+    return s;
+    }
+    }
+    function inspect(something){
+    if(functionsHaveNames||!util.isFunction(something)){
+    return util.inspect(something);
+    }
+    var rawname=getName(something);
+    var name=rawname?': '+rawname:'';
+    return'[Function'+name+']';
+    }
+    function getMessage(self){
+    return truncate(inspect(self.actual),128)+' '+
+    self.operator+' '+
+    truncate(inspect(self.expected),128);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function fail(actual,expected,message,operator,stackStartFunction){
+    throw new assert.AssertionError({
+    message:message,
+    actual:actual,
+    expected:expected,
+    operator:operator,
+    stackStartFunction:stackStartFunction});
+    
+    }
+    
+    
+    assert.fail=fail;
+    
+    
+    
+    
+    
+    
+    
+    
+    function ok(value,message){
+    if(!value)fail(value,true,message,'==',assert.ok);
+    }
+    assert.ok=ok;
+    
+    
+    
+    
+    
+    assert.equal=function equal(actual,expected,message){
+    if(actual!=expected)fail(actual,expected,message,'==',assert.equal);
+    };
+    
+    
+    
+    
+    assert.notEqual=function notEqual(actual,expected,message){
+    if(actual==expected){
+    fail(actual,expected,message,'!=',assert.notEqual);
+    }
+    };
+    
+    
+    
+    
+    assert.deepEqual=function deepEqual(actual,expected,message){
+    if(!_deepEqual(actual,expected,false)){
+    fail(actual,expected,message,'deepEqual',assert.deepEqual);
+    }
+    };
+    
+    assert.deepStrictEqual=function deepStrictEqual(actual,expected,message){
+    if(!_deepEqual(actual,expected,true)){
+    fail(actual,expected,message,'deepStrictEqual',assert.deepStrictEqual);
+    }
+    };
+    
+    function _deepEqual(actual,expected,strict,memos){
+    
+    if(actual===expected){
+    return true;
+    }else if(isBuffer(actual)&&isBuffer(expected)){
+    return compare(actual,expected)===0;
+    
+    
+    
+    }else if(util.isDate(actual)&&util.isDate(expected)){
+    return actual.getTime()===expected.getTime();
+    
+    
+    
+    
+    }else if(util.isRegExp(actual)&&util.isRegExp(expected)){
+    return actual.source===expected.source&&
+    actual.global===expected.global&&
+    actual.multiline===expected.multiline&&
+    actual.lastIndex===expected.lastIndex&&
+    actual.ignoreCase===expected.ignoreCase;
+    
+    
+    
+    }else if((actual===null||typeof actual!=='object')&&(
+    expected===null||typeof expected!=='object')){
+    return strict?actual===expected:actual==expected;
+    
+    
+    
+    
+    
+    
+    
+    }else if(isView(actual)&&isView(expected)&&
+    pToString(actual)===pToString(expected)&&
+    !(actual instanceof Float32Array||
+    actual instanceof Float64Array)){
+    return compare(new Uint8Array(actual.buffer),
+    new Uint8Array(expected.buffer))===0;
+    
+    
+    
+    
+    
+    
+    
+    }else if(isBuffer(actual)!==isBuffer(expected)){
+    return false;
+    }else{
+    memos=memos||{actual:[],expected:[]};
+    
+    var actualIndex=memos.actual.indexOf(actual);
+    if(actualIndex!==-1){
+    if(actualIndex===memos.expected.indexOf(expected)){
+    return true;
+    }
+    }
+    
+    memos.actual.push(actual);
+    memos.expected.push(expected);
+    
+    return objEquiv(actual,expected,strict,memos);
+    }
+    }
+    
+    function isArguments(object){
+    return Object.prototype.toString.call(object)=='[object Arguments]';
+    }
+    
+    function objEquiv(a,b,strict,actualVisitedObjects){
+    if(a===null||a===undefined||b===null||b===undefined)
+    return false;
+    
+    if(util.isPrimitive(a)||util.isPrimitive(b))
+    return a===b;
+    if(strict&&Object.getPrototypeOf(a)!==Object.getPrototypeOf(b))
+    return false;
+    var aIsArgs=isArguments(a);
+    var bIsArgs=isArguments(b);
+    if(aIsArgs&&!bIsArgs||!aIsArgs&&bIsArgs)
+    return false;
+    if(aIsArgs){
+    a=pSlice.call(a);
+    b=pSlice.call(b);
+    return _deepEqual(a,b,strict);
+    }
+    var ka=objectKeys(a);
+    var kb=objectKeys(b);
+    var key,i;
+    
+    
+    if(ka.length!==kb.length)
+    return false;
+    
+    ka.sort();
+    kb.sort();
+    
+    for(i=ka.length-1;i>=0;i--){
+    if(ka[i]!==kb[i])
+    return false;
+    }
+    
+    
+    for(i=ka.length-1;i>=0;i--){
+    key=ka[i];
+    if(!_deepEqual(a[key],b[key],strict,actualVisitedObjects))
+    return false;
+    }
+    return true;
+    }
+    
+    
+    
+    
+    assert.notDeepEqual=function notDeepEqual(actual,expected,message){
+    if(_deepEqual(actual,expected,false)){
+    fail(actual,expected,message,'notDeepEqual',assert.notDeepEqual);
+    }
+    };
+    
+    assert.notDeepStrictEqual=notDeepStrictEqual;
+    function notDeepStrictEqual(actual,expected,message){
+    if(_deepEqual(actual,expected,true)){
+    fail(actual,expected,message,'notDeepStrictEqual',notDeepStrictEqual);
+    }
+    }
+    
+    
+    
+    
+    
+    assert.strictEqual=function strictEqual(actual,expected,message){
+    if(actual!==expected){
+    fail(actual,expected,message,'===',assert.strictEqual);
+    }
+    };
+    
+    
+    
+    
+    assert.notStrictEqual=function notStrictEqual(actual,expected,message){
+    if(actual===expected){
+    fail(actual,expected,message,'!==',assert.notStrictEqual);
+    }
+    };
+    
+    function expectedException(actual,expected){
+    if(!actual||!expected){
+    return false;
+    }
+    
+    if(Object.prototype.toString.call(expected)=='[object RegExp]'){
+    return expected.test(actual);
+    }
+    
+    try{
+    if(actual instanceof expected){
+    return true;
+    }
+    }catch(e){
+    
+    }
+    
+    if(Error.isPrototypeOf(expected)){
+    return false;
+    }
+    
+    return expected.call({},actual)===true;
+    }
+    
+    function _tryBlock(block){
+    var error;
+    try{
+    block();
+    }catch(e){
+    error=e;
+    }
+    return error;
+    }
+    
+    function _throws(shouldThrow,block,expected,message){
+    var actual;
+    
+    if(typeof block!=='function'){
+    throw new TypeError('"block" argument must be a function');
+    }
+    
+    if(typeof expected==='string'){
+    message=expected;
+    expected=null;
+    }
+    
+    actual=_tryBlock(block);
+    
+    message=(expected&&expected.name?' ('+expected.name+').':'.')+(
+    message?' '+message:'.');
+    
+    if(shouldThrow&&!actual){
+    fail(actual,expected,'Missing expected exception'+message);
+    }
+    
+    var userProvidedMessage=typeof message==='string';
+    var isUnwantedException=!shouldThrow&&util.isError(actual);
+    var isUnexpectedException=!shouldThrow&&actual&&!expected;
+    
+    if(isUnwantedException&&
+    userProvidedMessage&&
+    expectedException(actual,expected)||
+    isUnexpectedException){
+    fail(actual,expected,'Got unwanted exception'+message);
+    }
+    
+    if(shouldThrow&&actual&&expected&&
+    !expectedException(actual,expected)||!shouldThrow&&actual){
+    throw actual;
+    }
+    }
+    
+    
+    
+    
+    assert.throws=function(block,error,message){
+    _throws(true,block,error,message);
+    };
+    
+    
+    assert.doesNotThrow=function(block,error,message){
+    _throws(false,block,error,message);
+    };
+    
+    assert.ifError=function(err){if(err)throw err;};
+    
+    var objectKeys=Object.keys||function(obj){
+    var keys=[];
+    for(var key in obj){
+    if(hasOwn.call(obj,key))keys.push(key);
+    }
+    return keys;
+    };
+    
+    }).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
+    },{"util/":95}],93:[function(require,module,exports){
+    if(typeof Object.create==='function'){
+    
+    module.exports=function inherits(ctor,superCtor){
+    ctor.super_=superCtor;
+    ctor.prototype=Object.create(superCtor.prototype,{
+    constructor:{
+    value:ctor,
+    enumerable:false,
+    writable:true,
+    configurable:true}});
+    
+    
+    };
+    }else{
+    
+    module.exports=function inherits(ctor,superCtor){
+    ctor.super_=superCtor;
+    var TempCtor=function(){};
+    TempCtor.prototype=superCtor.prototype;
+    ctor.prototype=new TempCtor();
+    ctor.prototype.constructor=ctor;
+    };
+    }
+    
+    },{}],94:[function(require,module,exports){
+    module.exports=function isBuffer(arg){
+    return arg&&typeof arg==='object'&&
+    typeof arg.copy==='function'&&
+    typeof arg.fill==='function'&&
+    typeof arg.readUInt8==='function';
+    };
+    },{}],95:[function(require,module,exports){
+    (function(process,global){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    var formatRegExp=/%[sdj%]/g;
+    exports.format=function(f){
+    if(!isString(f)){
+    var objects=[];
+    for(var i=0;i<arguments.length;i++){
+    objects.push(inspect(arguments[i]));
+    }
+    return objects.join(' ');
+    }
+    
+    var i=1;
+    var args=arguments;
+    var len=args.length;
+    var str=String(f).replace(formatRegExp,function(x){
+    if(x==='%%')return'%';
+    if(i>=len)return x;
+    switch(x){
+    case'%s':return String(args[i++]);
+    case'%d':return Number(args[i++]);
+    case'%j':
+    try{
+    return JSON.stringify(args[i++]);
+    }catch(_){
+    return'[Circular]';
+    }
+    default:
+    return x;}
+    
+    });
+    for(var x=args[i];i<len;x=args[++i]){
+    if(isNull(x)||!isObject(x)){
+    str+=' '+x;
+    }else{
+    str+=' '+inspect(x);
+    }
+    }
+    return str;
+    };
+    
+    
+    
+    
+    
+    exports.deprecate=function(fn,msg){
+    
+    if(isUndefined(global.process)){
+    return function(){
+    return exports.deprecate(fn,msg).apply(this,arguments);
+    };
+    }
+    
+    if(process.noDeprecation===true){
+    return fn;
+    }
+    
+    var warned=false;
+    function deprecated(){
+    if(!warned){
+    if(process.throwDeprecation){
+    throw new Error(msg);
+    }else if(process.traceDeprecation){
+    console.trace(msg);
+    }else{
+    console.error(msg);
+    }
+    warned=true;
+    }
+    return fn.apply(this,arguments);
+    }
+    
+    return deprecated;
+    };
+    
+    
+    var debugs={};
+    var debugEnviron;
+    exports.debuglog=function(set){
+    if(isUndefined(debugEnviron))
+    debugEnviron=process.env.NODE_DEBUG||'';
+    set=set.toUpperCase();
+    if(!debugs[set]){
+    if(new RegExp('\\b'+set+'\\b','i').test(debugEnviron)){
+    var pid=process.pid;
+    debugs[set]=function(){
+    var msg=exports.format.apply(exports,arguments);
+    console.error('%s %d: %s',set,pid,msg);
+    };
+    }else{
+    debugs[set]=function(){};
+    }
+    }
+    return debugs[set];
+    };
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function inspect(obj,opts){
+    
+    var ctx={
+    seen:[],
+    stylize:stylizeNoColor};
+    
+    
+    if(arguments.length>=3)ctx.depth=arguments[2];
+    if(arguments.length>=4)ctx.colors=arguments[3];
+    if(isBoolean(opts)){
+    
+    ctx.showHidden=opts;
+    }else if(opts){
+    
+    exports._extend(ctx,opts);
+    }
+    
+    if(isUndefined(ctx.showHidden))ctx.showHidden=false;
+    if(isUndefined(ctx.depth))ctx.depth=2;
+    if(isUndefined(ctx.colors))ctx.colors=false;
+    if(isUndefined(ctx.customInspect))ctx.customInspect=true;
+    if(ctx.colors)ctx.stylize=stylizeWithColor;
+    return formatValue(ctx,obj,ctx.depth);
+    }
+    exports.inspect=inspect;
+    
+    
+    
+    inspect.colors={
+    'bold':[1,22],
+    'italic':[3,23],
+    'underline':[4,24],
+    'inverse':[7,27],
+    'white':[37,39],
+    'grey':[90,39],
+    'black':[30,39],
+    'blue':[34,39],
+    'cyan':[36,39],
+    'green':[32,39],
+    'magenta':[35,39],
+    'red':[31,39],
+    'yellow':[33,39]};
+    
+    
+    
+    inspect.styles={
+    'special':'cyan',
+    'number':'yellow',
+    'boolean':'yellow',
+    'undefined':'grey',
+    'null':'bold',
+    'string':'green',
+    'date':'magenta',
+    
+    'regexp':'red'};
+    
+    
+    
+    function stylizeWithColor(str,styleType){
+    var style=inspect.styles[styleType];
+    
+    if(style){
+    return'\u001b['+inspect.colors[style][0]+'m'+str+
+    '\u001b['+inspect.colors[style][1]+'m';
+    }else{
+    return str;
+    }
+    }
+    
+    
+    function stylizeNoColor(str,styleType){
+    return str;
+    }
+    
+    
+    function arrayToHash(array){
+    var hash={};
+    
+    array.forEach(function(val,idx){
+    hash[val]=true;
+    });
+    
+    return hash;
+    }
+    
+    
+    function formatValue(ctx,value,recurseTimes){
+    
+    
+    if(ctx.customInspect&&
+    value&&
+    isFunction(value.inspect)&&
+    
+    value.inspect!==exports.inspect&&
+    
+    !(value.constructor&&value.constructor.prototype===value)){
+    var ret=value.inspect(recurseTimes,ctx);
+    if(!isString(ret)){
+    ret=formatValue(ctx,ret,recurseTimes);
+    }
+    return ret;
+    }
+    
+    
+    var primitive=formatPrimitive(ctx,value);
+    if(primitive){
+    return primitive;
+    }
+    
+    
+    var keys=Object.keys(value);
+    var visibleKeys=arrayToHash(keys);
+    
+    if(ctx.showHidden){
+    keys=Object.getOwnPropertyNames(value);
+    }
+    
+    
+    
+    if(isError(value)&&(
+    keys.indexOf('message')>=0||keys.indexOf('description')>=0)){
+    return formatError(value);
+    }
+    
+    
+    if(keys.length===0){
+    if(isFunction(value)){
+    var name=value.name?': '+value.name:'';
+    return ctx.stylize('[Function'+name+']','special');
+    }
+    if(isRegExp(value)){
+    return ctx.stylize(RegExp.prototype.toString.call(value),'regexp');
+    }
+    if(isDate(value)){
+    return ctx.stylize(Date.prototype.toString.call(value),'date');
+    }
+    if(isError(value)){
+    return formatError(value);
+    }
+    }
+    
+    var base='',array=false,braces=['{','}'];
+    
+    
+    if(isArray(value)){
+    array=true;
+    braces=['[',']'];
+    }
+    
+    
+    if(isFunction(value)){
+    var n=value.name?': '+value.name:'';
+    base=' [Function'+n+']';
+    }
+    
+    
+    if(isRegExp(value)){
+    base=' '+RegExp.prototype.toString.call(value);
+    }
+    
+    
+    if(isDate(value)){
+    base=' '+Date.prototype.toUTCString.call(value);
+    }
+    
+    
+    if(isError(value)){
+    base=' '+formatError(value);
+    }
+    
+    if(keys.length===0&&(!array||value.length==0)){
+    return braces[0]+base+braces[1];
+    }
+    
+    if(recurseTimes<0){
+    if(isRegExp(value)){
+    return ctx.stylize(RegExp.prototype.toString.call(value),'regexp');
+    }else{
+    return ctx.stylize('[Object]','special');
+    }
+    }
+    
+    ctx.seen.push(value);
+    
+    var output;
+    if(array){
+    output=formatArray(ctx,value,recurseTimes,visibleKeys,keys);
+    }else{
+    output=keys.map(function(key){
+    return formatProperty(ctx,value,recurseTimes,visibleKeys,key,array);
+    });
+    }
+    
+    ctx.seen.pop();
+    
+    return reduceToSingleString(output,base,braces);
+    }
+    
+    
+    function formatPrimitive(ctx,value){
+    if(isUndefined(value))
+    return ctx.stylize('undefined','undefined');
+    if(isString(value)){
+    var simple='\''+JSON.stringify(value).replace(/^"|"$/g,'').
+    replace(/'/g,"\\'").
+    replace(/\\"/g,'"')+'\'';
+    return ctx.stylize(simple,'string');
+    }
+    if(isNumber(value))
+    return ctx.stylize(''+value,'number');
+    if(isBoolean(value))
+    return ctx.stylize(''+value,'boolean');
+    
+    if(isNull(value))
+    return ctx.stylize('null','null');
+    }
+    
+    
+    function formatError(value){
+    return'['+Error.prototype.toString.call(value)+']';
+    }
+    
+    
+    function formatArray(ctx,value,recurseTimes,visibleKeys,keys){
+    var output=[];
+    for(var i=0,l=value.length;i<l;++i){
+    if(hasOwnProperty(value,String(i))){
+    output.push(formatProperty(ctx,value,recurseTimes,visibleKeys,
+    String(i),true));
+    }else{
+    output.push('');
+    }
+    }
+    keys.forEach(function(key){
+    if(!key.match(/^\d+$/)){
+    output.push(formatProperty(ctx,value,recurseTimes,visibleKeys,
+    key,true));
+    }
+    });
+    return output;
+    }
+    
+    
+    function formatProperty(ctx,value,recurseTimes,visibleKeys,key,array){
+    var name,str,desc;
+    desc=Object.getOwnPropertyDescriptor(value,key)||{value:value[key]};
+    if(desc.get){
+    if(desc.set){
+    str=ctx.stylize('[Getter/Setter]','special');
+    }else{
+    str=ctx.stylize('[Getter]','special');
+    }
+    }else{
+    if(desc.set){
+    str=ctx.stylize('[Setter]','special');
+    }
+    }
+    if(!hasOwnProperty(visibleKeys,key)){
+    name='['+key+']';
+    }
+    if(!str){
+    if(ctx.seen.indexOf(desc.value)<0){
+    if(isNull(recurseTimes)){
+    str=formatValue(ctx,desc.value,null);
+    }else{
+    str=formatValue(ctx,desc.value,recurseTimes-1);
+    }
+    if(str.indexOf('\n')>-1){
+    if(array){
+    str=str.split('\n').map(function(line){
+    return'  '+line;
+    }).join('\n').substr(2);
+    }else{
+    str='\n'+str.split('\n').map(function(line){
+    return'   '+line;
+    }).join('\n');
+    }
+    }
+    }else{
+    str=ctx.stylize('[Circular]','special');
+    }
+    }
+    if(isUndefined(name)){
+    if(array&&key.match(/^\d+$/)){
+    return str;
+    }
+    name=JSON.stringify(''+key);
+    if(name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)){
+    name=name.substr(1,name.length-2);
+    name=ctx.stylize(name,'name');
+    }else{
+    name=name.replace(/'/g,"\\'").
+    replace(/\\"/g,'"').
+    replace(/(^"|"$)/g,"'");
+    name=ctx.stylize(name,'string');
+    }
+    }
+    
+    return name+': '+str;
+    }
+    
+    
+    function reduceToSingleString(output,base,braces){
+    var numLinesEst=0;
+    var length=output.reduce(function(prev,cur){
+    numLinesEst++;
+    if(cur.indexOf('\n')>=0)numLinesEst++;
+    return prev+cur.replace(/\u001b\[\d\d?m/g,'').length+1;
+    },0);
+    
+    if(length>60){
+    return braces[0]+(
+    base===''?'':base+'\n ')+
+    ' '+
+    output.join(',\n  ')+
+    ' '+
+    braces[1];
+    }
+    
+    return braces[0]+base+' '+output.join(', ')+' '+braces[1];
+    }
+    
+    
+    
+    
+    function isArray(ar){
+    return Array.isArray(ar);
+    }
+    exports.isArray=isArray;
+    
+    function isBoolean(arg){
+    return typeof arg==='boolean';
+    }
+    exports.isBoolean=isBoolean;
+    
+    function isNull(arg){
+    return arg===null;
+    }
+    exports.isNull=isNull;
+    
+    function isNullOrUndefined(arg){
+    return arg==null;
+    }
+    exports.isNullOrUndefined=isNullOrUndefined;
+    
+    function isNumber(arg){
+    return typeof arg==='number';
+    }
+    exports.isNumber=isNumber;
+    
+    function isString(arg){
+    return typeof arg==='string';
+    }
+    exports.isString=isString;
+    
+    function isSymbol(arg){
+    return typeof arg==='symbol';
+    }
+    exports.isSymbol=isSymbol;
+    
+    function isUndefined(arg){
+    return arg===void 0;
+    }
+    exports.isUndefined=isUndefined;
+    
+    function isRegExp(re){
+    return isObject(re)&&objectToString(re)==='[object RegExp]';
+    }
+    exports.isRegExp=isRegExp;
+    
+    function isObject(arg){
+    return typeof arg==='object'&&arg!==null;
+    }
+    exports.isObject=isObject;
+    
+    function isDate(d){
+    return isObject(d)&&objectToString(d)==='[object Date]';
+    }
+    exports.isDate=isDate;
+    
+    function isError(e){
+    return isObject(e)&&(
+    objectToString(e)==='[object Error]'||e instanceof Error);
+    }
+    exports.isError=isError;
+    
+    function isFunction(arg){
+    return typeof arg==='function';
+    }
+    exports.isFunction=isFunction;
+    
+    function isPrimitive(arg){
+    return arg===null||
+    typeof arg==='boolean'||
+    typeof arg==='number'||
+    typeof arg==='string'||
+    typeof arg==='symbol'||
+    typeof arg==='undefined';
+    }
+    exports.isPrimitive=isPrimitive;
+    
+    exports.isBuffer=require('./support/isBuffer');
+    
+    function objectToString(o){
+    return Object.prototype.toString.call(o);
+    }
+    
+    
+    function pad(n){
+    return n<10?'0'+n.toString(10):n.toString(10);
+    }
+    
+    
+    var months=['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep',
+    'Oct','Nov','Dec'];
+    
+    
+    function timestamp(){
+    var d=new Date();
+    var time=[pad(d.getHours()),
+    pad(d.getMinutes()),
+    pad(d.getSeconds())].join(':');
+    return[d.getDate(),months[d.getMonth()],time].join(' ');
+    }
+    
+    
+    
+    exports.log=function(){
+    console.log('%s - %s',timestamp(),exports.format.apply(exports,arguments));
+    };
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    exports.inherits=require('inherits');
+    
+    exports._extend=function(origin,add){
+    
+    if(!add||!isObject(add))return origin;
+    
+    var keys=Object.keys(add);
+    var i=keys.length;
+    while(i--){
+    origin[keys[i]]=add[keys[i]];
+    }
+    return origin;
+    };
+    
+    function hasOwnProperty(obj,prop){
+    return Object.prototype.hasOwnProperty.call(obj,prop);
+    }
+    
+    }).call(this,require('_process'),typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
+    },{"./support/isBuffer":94,"_process":158,"inherits":93}],96:[function(require,module,exports){
+    
+    const langs=[
+    'aa',
+    'ab',
+    'ae',
+    'af',
+    'ak',
+    'am',
+    'an',
+    'ar',
+    'as',
+    'av',
+    'ay',
+    'az',
+    'ba',
+    'be',
+    'bg',
+    'bh',
+    'bi',
+    'bm',
+    'bn',
+    'bo',
+    'br',
+    'bs',
+    'ca',
+    'ce',
+    'ch',
+    'co',
+    'cr',
+    'cs',
+    'cu',
+    'cv',
+    'cy',
+    'da',
+    'de',
+    'dv',
+    'dz',
+    'ee',
+    'el',
+    'en',
+    'eo',
+    'es',
+    'et',
+    'eu',
+    'fa',
+    'ff',
+    'fi',
+    'fj',
+    'fo',
+    'fr',
+    'fy',
+    'ga',
+    'gd',
+    'gl',
+    'gn',
+    'gu',
+    'gv',
+    'ha',
+    'he',
+    'hi',
+    'ho',
+    'hr',
+    'ht',
+    'hu',
+    'hy',
+    'hz',
+    'ia',
+    'id',
+    'ie',
+    'ig',
+    'ii',
+    'ik',
+    'in',
+    'io',
+    'is',
+    'it',
+    'iu',
+    'iw',
+    'ja',
+    'ji',
+    'jv',
+    'jw',
+    'ka',
+    'kg',
+    'ki',
+    'kj',
+    'kk',
+    'kl',
+    'km',
+    'kn',
+    'ko',
+    'kr',
+    'ks',
+    'ku',
+    'kv',
+    'kw',
+    'ky',
+    'la',
+    'lb',
+    'lg',
+    'li',
+    'ln',
+    'lo',
+    'lt',
+    'lu',
+    'lv',
+    'mg',
+    'mh',
+    'mi',
+    'mk',
+    'ml',
+    'mn',
+    'mo',
+    'mr',
+    'ms',
+    'mt',
+    'my',
+    'na',
+    'nb',
+    'nd',
+    'ne',
+    'ng',
+    'nl',
+    'nn',
+    'no',
+    'nr',
+    'nv',
+    'ny',
+    'oc',
+    'oj',
+    'om',
+    'or',
+    'os',
+    'pa',
+    'pi',
+    'pl',
+    'ps',
+    'pt',
+    'qu',
+    'rm',
+    'rn',
+    'ro',
+    'ru',
+    'rw',
+    'sa',
+    'sc',
+    'sd',
+    'se',
+    'sg',
+    'sh',
+    'si',
+    'sk',
+    'sl',
+    'sm',
+    'sn',
+    'so',
+    'sq',
+    'sr',
+    'ss',
+    'st',
+    'su',
+    'sv',
+    'sw',
+    'ta',
+    'te',
+    'tg',
+    'th',
+    'ti',
+    'tk',
+    'tl',
+    'tn',
+    'to',
+    'tr',
+    'ts',
+    'tt',
+    'tw',
+    'ty',
+    'ug',
+    'uk',
+    'ur',
+    'uz',
+    've',
+    'vi',
+    'vo',
+    'wa',
+    'wo',
+    'xh',
+    'yi',
+    'yo',
+    'za',
+    'zh',
+    'zu',
+    'aaa',
+    'aab',
+    'aac',
+    'aad',
+    'aae',
+    'aaf',
+    'aag',
+    'aah',
+    'aai',
+    'aak',
+    'aal',
+    'aam',
+    'aan',
+    'aao',
+    'aap',
+    'aaq',
+    'aas',
+    'aat',
+    'aau',
+    'aav',
+    'aaw',
+    'aax',
+    'aaz',
+    'aba',
+    'abb',
+    'abc',
+    'abd',
+    'abe',
+    'abf',
+    'abg',
+    'abh',
+    'abi',
+    'abj',
+    'abl',
+    'abm',
+    'abn',
+    'abo',
+    'abp',
+    'abq',
+    'abr',
+    'abs',
+    'abt',
+    'abu',
+    'abv',
+    'abw',
+    'abx',
+    'aby',
+    'abz',
+    'aca',
+    'acb',
+    'acd',
+    'ace',
+    'acf',
+    'ach',
+    'aci',
+    'ack',
+    'acl',
+    'acm',
+    'acn',
+    'acp',
+    'acq',
+    'acr',
+    'acs',
+    'act',
+    'acu',
+    'acv',
+    'acw',
+    'acx',
+    'acy',
+    'acz',
+    'ada',
+    'adb',
+    'add',
+    'ade',
+    'adf',
+    'adg',
+    'adh',
+    'adi',
+    'adj',
+    'adl',
+    'adn',
+    'ado',
+    'adp',
+    'adq',
+    'adr',
+    'ads',
+    'adt',
+    'adu',
+    'adw',
+    'adx',
+    'ady',
+    'adz',
+    'aea',
+    'aeb',
+    'aec',
+    'aed',
+    'aee',
+    'aek',
+    'ael',
+    'aem',
+    'aen',
+    'aeq',
+    'aer',
+    'aes',
+    'aeu',
+    'aew',
+    'aey',
+    'aez',
+    'afa',
+    'afb',
+    'afd',
+    'afe',
+    'afg',
+    'afh',
+    'afi',
+    'afk',
+    'afn',
+    'afo',
+    'afp',
+    'afs',
+    'aft',
+    'afu',
+    'afz',
+    'aga',
+    'agb',
+    'agc',
+    'agd',
+    'age',
+    'agf',
+    'agg',
+    'agh',
+    'agi',
+    'agj',
+    'agk',
+    'agl',
+    'agm',
+    'agn',
+    'ago',
+    'agp',
+    'agq',
+    'agr',
+    'ags',
+    'agt',
+    'agu',
+    'agv',
+    'agw',
+    'agx',
+    'agy',
+    'agz',
+    'aha',
+    'ahb',
+    'ahg',
+    'ahh',
+    'ahi',
+    'ahk',
+    'ahl',
+    'ahm',
+    'ahn',
+    'aho',
+    'ahp',
+    'ahr',
+    'ahs',
+    'aht',
+    'aia',
+    'aib',
+    'aic',
+    'aid',
+    'aie',
+    'aif',
+    'aig',
+    'aih',
+    'aii',
+    'aij',
+    'aik',
+    'ail',
+    'aim',
+    'ain',
+    'aio',
+    'aip',
+    'aiq',
+    'air',
+    'ais',
+    'ait',
+    'aiw',
+    'aix',
+    'aiy',
+    'aja',
+    'ajg',
+    'aji',
+    'ajn',
+    'ajp',
+    'ajt',
+    'aju',
+    'ajw',
+    'ajz',
+    'akb',
+    'akc',
+    'akd',
+    'ake',
+    'akf',
+    'akg',
+    'akh',
+    'aki',
+    'akj',
+    'akk',
+    'akl',
+    'akm',
+    'ako',
+    'akp',
+    'akq',
+    'akr',
+    'aks',
+    'akt',
+    'aku',
+    'akv',
+    'akw',
+    'akx',
+    'aky',
+    'akz',
+    'ala',
+    'alc',
+    'ald',
+    'ale',
+    'alf',
+    'alg',
+    'alh',
+    'ali',
+    'alj',
+    'alk',
+    'all',
+    'alm',
+    'aln',
+    'alo',
+    'alp',
+    'alq',
+    'alr',
+    'als',
+    'alt',
+    'alu',
+    'alv',
+    'alw',
+    'alx',
+    'aly',
+    'alz',
+    'ama',
+    'amb',
+    'amc',
+    'ame',
+    'amf',
+    'amg',
+    'ami',
+    'amj',
+    'amk',
+    'aml',
+    'amm',
+    'amn',
+    'amo',
+    'amp',
+    'amq',
+    'amr',
+    'ams',
+    'amt',
+    'amu',
+    'amv',
+    'amw',
+    'amx',
+    'amy',
+    'amz',
+    'ana',
+    'anb',
+    'anc',
+    'and',
+    'ane',
+    'anf',
+    'ang',
+    'anh',
+    'ani',
+    'anj',
+    'ank',
+    'anl',
+    'anm',
+    'ann',
+    'ano',
+    'anp',
+    'anq',
+    'anr',
+    'ans',
+    'ant',
+    'anu',
+    'anv',
+    'anw',
+    'anx',
+    'any',
+    'anz',
+    'aoa',
+    'aob',
+    'aoc',
+    'aod',
+    'aoe',
+    'aof',
+    'aog',
+    'aoh',
+    'aoi',
+    'aoj',
+    'aok',
+    'aol',
+    'aom',
+    'aon',
+    'aor',
+    'aos',
+    'aot',
+    'aou',
+    'aox',
+    'aoz',
+    'apa',
+    'apb',
+    'apc',
+    'apd',
+    'ape',
+    'apf',
+    'apg',
+    'aph',
+    'api',
+    'apj',
+    'apk',
+    'apl',
+    'apm',
+    'apn',
+    'apo',
+    'app',
+    'apq',
+    'apr',
+    'aps',
+    'apt',
+    'apu',
+    'apv',
+    'apw',
+    'apx',
+    'apy',
+    'apz',
+    'aqa',
+    'aqc',
+    'aqd',
+    'aqg',
+    'aql',
+    'aqm',
+    'aqn',
+    'aqp',
+    'aqr',
+    'aqt',
+    'aqz',
+    'arb',
+    'arc',
+    'ard',
+    'are',
+    'arh',
+    'ari',
+    'arj',
+    'ark',
+    'arl',
+    'arn',
+    'aro',
+    'arp',
+    'arq',
+    'arr',
+    'ars',
+    'art',
+    'aru',
+    'arv',
+    'arw',
+    'arx',
+    'ary',
+    'arz',
+    'asa',
+    'asb',
+    'asc',
+    'asd',
+    'ase',
+    'asf',
+    'asg',
+    'ash',
+    'asi',
+    'asj',
+    'ask',
+    'asl',
+    'asn',
+    'aso',
+    'asp',
+    'asq',
+    'asr',
+    'ass',
+    'ast',
+    'asu',
+    'asv',
+    'asw',
+    'asx',
+    'asy',
+    'asz',
+    'ata',
+    'atb',
+    'atc',
+    'atd',
+    'ate',
+    'atg',
+    'ath',
+    'ati',
+    'atj',
+    'atk',
+    'atl',
+    'atm',
+    'atn',
+    'ato',
+    'atp',
+    'atq',
+    'atr',
+    'ats',
+    'att',
+    'atu',
+    'atv',
+    'atw',
+    'atx',
+    'aty',
+    'atz',
+    'aua',
+    'aub',
+    'auc',
+    'aud',
+    'aue',
+    'auf',
+    'aug',
+    'auh',
+    'aui',
+    'auj',
+    'auk',
+    'aul',
+    'aum',
+    'aun',
+    'auo',
+    'aup',
+    'auq',
+    'aur',
+    'aus',
+    'aut',
+    'auu',
+    'auw',
+    'aux',
+    'auy',
+    'auz',
+    'avb',
+    'avd',
+    'avi',
+    'avk',
+    'avl',
+    'avm',
+    'avn',
+    'avo',
+    'avs',
+    'avt',
+    'avu',
+    'avv',
+    'awa',
+    'awb',
+    'awc',
+    'awd',
+    'awe',
+    'awg',
+    'awh',
+    'awi',
+    'awk',
+    'awm',
+    'awn',
+    'awo',
+    'awr',
+    'aws',
+    'awt',
+    'awu',
+    'awv',
+    'aww',
+    'awx',
+    'awy',
+    'axb',
+    'axe',
+    'axg',
+    'axk',
+    'axl',
+    'axm',
+    'axx',
+    'aya',
+    'ayb',
+    'ayc',
+    'ayd',
+    'aye',
+    'ayg',
+    'ayh',
+    'ayi',
+    'ayk',
+    'ayl',
+    'ayn',
+    'ayo',
+    'ayp',
+    'ayq',
+    'ayr',
+    'ays',
+    'ayt',
+    'ayu',
+    'ayx',
+    'ayy',
+    'ayz',
+    'aza',
+    'azb',
+    'azc',
+    'azd',
+    'azg',
+    'azj',
+    'azm',
+    'azn',
+    'azo',
+    'azt',
+    'azz',
+    'baa',
+    'bab',
+    'bac',
+    'bad',
+    'bae',
+    'baf',
+    'bag',
+    'bah',
+    'bai',
+    'baj',
+    'bal',
+    'ban',
+    'bao',
+    'bap',
+    'bar',
+    'bas',
+    'bat',
+    'bau',
+    'bav',
+    'baw',
+    'bax',
+    'bay',
+    'baz',
+    'bba',
+    'bbb',
+    'bbc',
+    'bbd',
+    'bbe',
+    'bbf',
+    'bbg',
+    'bbh',
+    'bbi',
+    'bbj',
+    'bbk',
+    'bbl',
+    'bbm',
+    'bbn',
+    'bbo',
+    'bbp',
+    'bbq',
+    'bbr',
+    'bbs',
+    'bbt',
+    'bbu',
+    'bbv',
+    'bbw',
+    'bbx',
+    'bby',
+    'bbz',
+    'bca',
+    'bcb',
+    'bcc',
+    'bcd',
+    'bce',
+    'bcf',
+    'bcg',
+    'bch',
+    'bci',
+    'bcj',
+    'bck',
+    'bcl',
+    'bcm',
+    'bcn',
+    'bco',
+    'bcp',
+    'bcq',
+    'bcr',
+    'bcs',
+    'bct',
+    'bcu',
+    'bcv',
+    'bcw',
+    'bcy',
+    'bcz',
+    'bda',
+    'bdb',
+    'bdc',
+    'bdd',
+    'bde',
+    'bdf',
+    'bdg',
+    'bdh',
+    'bdi',
+    'bdj',
+    'bdk',
+    'bdl',
+    'bdm',
+    'bdn',
+    'bdo',
+    'bdp',
+    'bdq',
+    'bdr',
+    'bds',
+    'bdt',
+    'bdu',
+    'bdv',
+    'bdw',
+    'bdx',
+    'bdy',
+    'bdz',
+    'bea',
+    'beb',
+    'bec',
+    'bed',
+    'bee',
+    'bef',
+    'beg',
+    'beh',
+    'bei',
+    'bej',
+    'bek',
+    'bem',
+    'beo',
+    'bep',
+    'beq',
+    'ber',
+    'bes',
+    'bet',
+    'beu',
+    'bev',
+    'bew',
+    'bex',
+    'bey',
+    'bez',
+    'bfa',
+    'bfb',
+    'bfc',
+    'bfd',
+    'bfe',
+    'bff',
+    'bfg',
+    'bfh',
+    'bfi',
+    'bfj',
+    'bfk',
+    'bfl',
+    'bfm',
+    'bfn',
+    'bfo',
+    'bfp',
+    'bfq',
+    'bfr',
+    'bfs',
+    'bft',
+    'bfu',
+    'bfw',
+    'bfx',
+    'bfy',
+    'bfz',
+    'bga',
+    'bgb',
+    'bgc',
+    'bgd',
+    'bge',
+    'bgf',
+    'bgg',
+    'bgi',
+    'bgj',
+    'bgk',
+    'bgl',
+    'bgm',
+    'bgn',
+    'bgo',
+    'bgp',
+    'bgq',
+    'bgr',
+    'bgs',
+    'bgt',
+    'bgu',
+    'bgv',
+    'bgw',
+    'bgx',
+    'bgy',
+    'bgz',
+    'bha',
+    'bhb',
+    'bhc',
+    'bhd',
+    'bhe',
+    'bhf',
+    'bhg',
+    'bhh',
+    'bhi',
+    'bhj',
+    'bhk',
+    'bhl',
+    'bhm',
+    'bhn',
+    'bho',
+    'bhp',
+    'bhq',
+    'bhr',
+    'bhs',
+    'bht',
+    'bhu',
+    'bhv',
+    'bhw',
+    'bhx',
+    'bhy',
+    'bhz',
+    'bia',
+    'bib',
+    'bic',
+    'bid',
+    'bie',
+    'bif',
+    'big',
+    'bij',
+    'bik',
+    'bil',
+    'bim',
+    'bin',
+    'bio',
+    'bip',
+    'biq',
+    'bir',
+    'bit',
+    'biu',
+    'biv',
+    'biw',
+    'bix',
+    'biy',
+    'biz',
+    'bja',
+    'bjb',
+    'bjc',
+    'bjd',
+    'bje',
+    'bjf',
+    'bjg',
+    'bjh',
+    'bji',
+    'bjj',
+    'bjk',
+    'bjl',
+    'bjm',
+    'bjn',
+    'bjo',
+    'bjp',
+    'bjq',
+    'bjr',
+    'bjs',
+    'bjt',
+    'bju',
+    'bjv',
+    'bjw',
+    'bjx',
+    'bjy',
+    'bjz',
+    'bka',
+    'bkb',
+    'bkc',
+    'bkd',
+    'bkf',
+    'bkg',
+    'bkh',
+    'bki',
+    'bkj',
+    'bkk',
+    'bkl',
+    'bkm',
+    'bkn',
+    'bko',
+    'bkp',
+    'bkq',
+    'bkr',
+    'bks',
+    'bkt',
+    'bku',
+    'bkv',
+    'bkw',
+    'bkx',
+    'bky',
+    'bkz',
+    'bla',
+    'blb',
+    'blc',
+    'bld',
+    'ble',
+    'blf',
+    'blg',
+    'blh',
+    'bli',
+    'blj',
+    'blk',
+    'bll',
+    'blm',
+    'bln',
+    'blo',
+    'blp',
+    'blq',
+    'blr',
+    'bls',
+    'blt',
+    'blv',
+    'blw',
+    'blx',
+    'bly',
+    'blz',
+    'bma',
+    'bmb',
+    'bmc',
+    'bmd',
+    'bme',
+    'bmf',
+    'bmg',
+    'bmh',
+    'bmi',
+    'bmj',
+    'bmk',
+    'bml',
+    'bmm',
+    'bmn',
+    'bmo',
+    'bmp',
+    'bmq',
+    'bmr',
+    'bms',
+    'bmt',
+    'bmu',
+    'bmv',
+    'bmw',
+    'bmx',
+    'bmy',
+    'bmz',
+    'bna',
+    'bnb',
+    'bnc',
+    'bnd',
+    'bne',
+    'bnf',
+    'bng',
+    'bni',
+    'bnj',
+    'bnk',
+    'bnl',
+    'bnm',
+    'bnn',
+    'bno',
+    'bnp',
+    'bnq',
+    'bnr',
+    'bns',
+    'bnt',
+    'bnu',
+    'bnv',
+    'bnw',
+    'bnx',
+    'bny',
+    'bnz',
+    'boa',
+    'bob',
+    'boe',
+    'bof',
+    'bog',
+    'boh',
+    'boi',
+    'boj',
+    'bok',
+    'bol',
+    'bom',
+    'bon',
+    'boo',
+    'bop',
+    'boq',
+    'bor',
+    'bot',
+    'bou',
+    'bov',
+    'bow',
+    'box',
+    'boy',
+    'boz',
+    'bpa',
+    'bpb',
+    'bpd',
+    'bpg',
+    'bph',
+    'bpi',
+    'bpj',
+    'bpk',
+    'bpl',
+    'bpm',
+    'bpn',
+    'bpo',
+    'bpp',
+    'bpq',
+    'bpr',
+    'bps',
+    'bpt',
+    'bpu',
+    'bpv',
+    'bpw',
+    'bpx',
+    'bpy',
+    'bpz',
+    'bqa',
+    'bqb',
+    'bqc',
+    'bqd',
+    'bqf',
+    'bqg',
+    'bqh',
+    'bqi',
+    'bqj',
+    'bqk',
+    'bql',
+    'bqm',
+    'bqn',
+    'bqo',
+    'bqp',
+    'bqq',
+    'bqr',
+    'bqs',
+    'bqt',
+    'bqu',
+    'bqv',
+    'bqw',
+    'bqx',
+    'bqy',
+    'bqz',
+    'bra',
+    'brb',
+    'brc',
+    'brd',
+    'brf',
+    'brg',
+    'brh',
+    'bri',
+    'brj',
+    'brk',
+    'brl',
+    'brm',
+    'brn',
+    'bro',
+    'brp',
+    'brq',
+    'brr',
+    'brs',
+    'brt',
+    'bru',
+    'brv',
+    'brw',
+    'brx',
+    'bry',
+    'brz',
+    'bsa',
+    'bsb',
+    'bsc',
+    'bse',
+    'bsf',
+    'bsg',
+    'bsh',
+    'bsi',
+    'bsj',
+    'bsk',
+    'bsl',
+    'bsm',
+    'bsn',
+    'bso',
+    'bsp',
+    'bsq',
+    'bsr',
+    'bss',
+    'bst',
+    'bsu',
+    'bsv',
+    'bsw',
+    'bsx',
+    'bsy',
+    'bta',
+    'btb',
+    'btc',
+    'btd',
+    'bte',
+    'btf',
+    'btg',
+    'bth',
+    'bti',
+    'btj',
+    'btk',
+    'btl',
+    'btm',
+    'btn',
+    'bto',
+    'btp',
+    'btq',
+    'btr',
+    'bts',
+    'btt',
+    'btu',
+    'btv',
+    'btw',
+    'btx',
+    'bty',
+    'btz',
+    'bua',
+    'bub',
+    'buc',
+    'bud',
+    'bue',
+    'buf',
+    'bug',
+    'buh',
+    'bui',
+    'buj',
+    'buk',
+    'bum',
+    'bun',
+    'buo',
+    'bup',
+    'buq',
+    'bus',
+    'but',
+    'buu',
+    'buv',
+    'buw',
+    'bux',
+    'buy',
+    'buz',
+    'bva',
+    'bvb',
+    'bvc',
+    'bvd',
+    'bve',
+    'bvf',
+    'bvg',
+    'bvh',
+    'bvi',
+    'bvj',
+    'bvk',
+    'bvl',
+    'bvm',
+    'bvn',
+    'bvo',
+    'bvp',
+    'bvq',
+    'bvr',
+    'bvt',
+    'bvu',
+    'bvv',
+    'bvw',
+    'bvx',
+    'bvy',
+    'bvz',
+    'bwa',
+    'bwb',
+    'bwc',
+    'bwd',
+    'bwe',
+    'bwf',
+    'bwg',
+    'bwh',
+    'bwi',
+    'bwj',
+    'bwk',
+    'bwl',
+    'bwm',
+    'bwn',
+    'bwo',
+    'bwp',
+    'bwq',
+    'bwr',
+    'bws',
+    'bwt',
+    'bwu',
+    'bww',
+    'bwx',
+    'bwy',
+    'bwz',
+    'bxa',
+    'bxb',
+    'bxc',
+    'bxd',
+    'bxe',
+    'bxf',
+    'bxg',
+    'bxh',
+    'bxi',
+    'bxj',
+    'bxk',
+    'bxl',
+    'bxm',
+    'bxn',
+    'bxo',
+    'bxp',
+    'bxq',
+    'bxr',
+    'bxs',
+    'bxu',
+    'bxv',
+    'bxw',
+    'bxx',
+    'bxz',
+    'bya',
+    'byb',
+    'byc',
+    'byd',
+    'bye',
+    'byf',
+    'byg',
+    'byh',
+    'byi',
+    'byj',
+    'byk',
+    'byl',
+    'bym',
+    'byn',
+    'byo',
+    'byp',
+    'byq',
+    'byr',
+    'bys',
+    'byt',
+    'byv',
+    'byw',
+    'byx',
+    'byy',
+    'byz',
+    'bza',
+    'bzb',
+    'bzc',
+    'bzd',
+    'bze',
+    'bzf',
+    'bzg',
+    'bzh',
+    'bzi',
+    'bzj',
+    'bzk',
+    'bzl',
+    'bzm',
+    'bzn',
+    'bzo',
+    'bzp',
+    'bzq',
+    'bzr',
+    'bzs',
+    'bzt',
+    'bzu',
+    'bzv',
+    'bzw',
+    'bzx',
+    'bzy',
+    'bzz',
+    'caa',
+    'cab',
+    'cac',
+    'cad',
+    'cae',
+    'caf',
+    'cag',
+    'cah',
+    'cai',
+    'caj',
+    'cak',
+    'cal',
+    'cam',
+    'can',
+    'cao',
+    'cap',
+    'caq',
+    'car',
+    'cas',
+    'cau',
+    'cav',
+    'caw',
+    'cax',
+    'cay',
+    'caz',
+    'cba',
+    'cbb',
+    'cbc',
+    'cbd',
+    'cbe',
+    'cbg',
+    'cbh',
+    'cbi',
+    'cbj',
+    'cbk',
+    'cbl',
+    'cbn',
+    'cbo',
+    'cbq',
+    'cbr',
+    'cbs',
+    'cbt',
+    'cbu',
+    'cbv',
+    'cbw',
+    'cby',
+    'cca',
+    'ccc',
+    'ccd',
+    'cce',
+    'ccg',
+    'cch',
+    'ccj',
+    'ccl',
+    'ccm',
+    'ccn',
+    'cco',
+    'ccp',
+    'ccq',
+    'ccr',
+    'ccs',
+    'cda',
+    'cdc',
+    'cdd',
+    'cde',
+    'cdf',
+    'cdg',
+    'cdh',
+    'cdi',
+    'cdj',
+    'cdm',
+    'cdn',
+    'cdo',
+    'cdr',
+    'cds',
+    'cdy',
+    'cdz',
+    'cea',
+    'ceb',
+    'ceg',
+    'cek',
+    'cel',
+    'cen',
+    'cet',
+    'cfa',
+    'cfd',
+    'cfg',
+    'cfm',
+    'cga',
+    'cgc',
+    'cgg',
+    'cgk',
+    'chb',
+    'chc',
+    'chd',
+    'chf',
+    'chg',
+    'chh',
+    'chj',
+    'chk',
+    'chl',
+    'chm',
+    'chn',
+    'cho',
+    'chp',
+    'chq',
+    'chr',
+    'cht',
+    'chw',
+    'chx',
+    'chy',
+    'chz',
+    'cia',
+    'cib',
+    'cic',
+    'cid',
+    'cie',
+    'cih',
+    'cik',
+    'cim',
+    'cin',
+    'cip',
+    'cir',
+    'ciw',
+    'ciy',
+    'cja',
+    'cje',
+    'cjh',
+    'cji',
+    'cjk',
+    'cjm',
+    'cjn',
+    'cjo',
+    'cjp',
+    'cjr',
+    'cjs',
+    'cjv',
+    'cjy',
+    'cka',
+    'ckb',
+    'ckh',
+    'ckl',
+    'ckn',
+    'cko',
+    'ckq',
+    'ckr',
+    'cks',
+    'ckt',
+    'cku',
+    'ckv',
+    'ckx',
+    'cky',
+    'ckz',
+    'cla',
+    'clc',
+    'cld',
+    'cle',
+    'clh',
+    'cli',
+    'clj',
+    'clk',
+    'cll',
+    'clm',
+    'clo',
+    'clt',
+    'clu',
+    'clw',
+    'cly',
+    'cma',
+    'cmc',
+    'cme',
+    'cmg',
+    'cmi',
+    'cmk',
+    'cml',
+    'cmm',
+    'cmn',
+    'cmo',
+    'cmr',
+    'cms',
+    'cmt',
+    'cna',
+    'cnb',
+    'cnc',
+    'cng',
+    'cnh',
+    'cni',
+    'cnk',
+    'cnl',
+    'cno',
+    'cnr',
+    'cns',
+    'cnt',
+    'cnu',
+    'cnw',
+    'cnx',
+    'coa',
+    'cob',
+    'coc',
+    'cod',
+    'coe',
+    'cof',
+    'cog',
+    'coh',
+    'coj',
+    'cok',
+    'col',
+    'com',
+    'con',
+    'coo',
+    'cop',
+    'coq',
+    'cot',
+    'cou',
+    'cov',
+    'cow',
+    'cox',
+    'coy',
+    'coz',
+    'cpa',
+    'cpb',
+    'cpc',
+    'cpe',
+    'cpf',
+    'cpg',
+    'cpi',
+    'cpn',
+    'cpo',
+    'cpp',
+    'cps',
+    'cpu',
+    'cpx',
+    'cpy',
+    'cqd',
+    'cqu',
+    'cra',
+    'crb',
+    'crc',
+    'crd',
+    'crf',
+    'crg',
+    'crh',
+    'cri',
+    'crj',
+    'crk',
+    'crl',
+    'crm',
+    'crn',
+    'cro',
+    'crp',
+    'crq',
+    'crr',
+    'crs',
+    'crt',
+    'crv',
+    'crw',
+    'crx',
+    'cry',
+    'crz',
+    'csa',
+    'csb',
+    'csc',
+    'csd',
+    'cse',
+    'csf',
+    'csg',
+    'csh',
+    'csi',
+    'csj',
+    'csk',
+    'csl',
+    'csm',
+    'csn',
+    'cso',
+    'csq',
+    'csr',
+    'css',
+    'cst',
+    'csu',
+    'csv',
+    'csw',
+    'csy',
+    'csz',
+    'cta',
+    'ctc',
+    'ctd',
+    'cte',
+    'ctg',
+    'cth',
+    'ctl',
+    'ctm',
+    'ctn',
+    'cto',
+    'ctp',
+    'cts',
+    'ctt',
+    'ctu',
+    'ctz',
+    'cua',
+    'cub',
+    'cuc',
+    'cug',
+    'cuh',
+    'cui',
+    'cuj',
+    'cuk',
+    'cul',
+    'cum',
+    'cuo',
+    'cup',
+    'cuq',
+    'cur',
+    'cus',
+    'cut',
+    'cuu',
+    'cuv',
+    'cuw',
+    'cux',
+    'cuy',
+    'cvg',
+    'cvn',
+    'cwa',
+    'cwb',
+    'cwd',
+    'cwe',
+    'cwg',
+    'cwt',
+    'cya',
+    'cyb',
+    'cyo',
+    'czh',
+    'czk',
+    'czn',
+    'czo',
+    'czt',
+    'daa',
+    'dac',
+    'dad',
+    'dae',
+    'daf',
+    'dag',
+    'dah',
+    'dai',
+    'daj',
+    'dak',
+    'dal',
+    'dam',
+    'dao',
+    'dap',
+    'daq',
+    'dar',
+    'das',
+    'dau',
+    'dav',
+    'daw',
+    'dax',
+    'day',
+    'daz',
+    'dba',
+    'dbb',
+    'dbd',
+    'dbe',
+    'dbf',
+    'dbg',
+    'dbi',
+    'dbj',
+    'dbl',
+    'dbm',
+    'dbn',
+    'dbo',
+    'dbp',
+    'dbq',
+    'dbr',
+    'dbt',
+    'dbu',
+    'dbv',
+    'dbw',
+    'dby',
+    'dcc',
+    'dcr',
+    'dda',
+    'ddd',
+    'dde',
+    'ddg',
+    'ddi',
+    'ddj',
+    'ddn',
+    'ddo',
+    'ddr',
+    'dds',
+    'ddw',
+    'dec',
+    'ded',
+    'dee',
+    'def',
+    'deg',
+    'deh',
+    'dei',
+    'dek',
+    'del',
+    'dem',
+    'den',
+    'dep',
+    'deq',
+    'der',
+    'des',
+    'dev',
+    'dez',
+    'dga',
+    'dgb',
+    'dgc',
+    'dgd',
+    'dge',
+    'dgg',
+    'dgh',
+    'dgi',
+    'dgk',
+    'dgl',
+    'dgn',
+    'dgo',
+    'dgr',
+    'dgs',
+    'dgt',
+    'dgu',
+    'dgw',
+    'dgx',
+    'dgz',
+    'dha',
+    'dhd',
+    'dhg',
+    'dhi',
+    'dhl',
+    'dhm',
+    'dhn',
+    'dho',
+    'dhr',
+    'dhs',
+    'dhu',
+    'dhv',
+    'dhw',
+    'dhx',
+    'dia',
+    'dib',
+    'dic',
+    'did',
+    'dif',
+    'dig',
+    'dih',
+    'dii',
+    'dij',
+    'dik',
+    'dil',
+    'dim',
+    'din',
+    'dio',
+    'dip',
+    'diq',
+    'dir',
+    'dis',
+    'dit',
+    'diu',
+    'diw',
+    'dix',
+    'diy',
+    'diz',
+    'dja',
+    'djb',
+    'djc',
+    'djd',
+    'dje',
+    'djf',
+    'dji',
+    'djj',
+    'djk',
+    'djl',
+    'djm',
+    'djn',
+    'djo',
+    'djr',
+    'dju',
+    'djw',
+    'dka',
+    'dkk',
+    'dkl',
+    'dkr',
+    'dks',
+    'dkx',
+    'dlg',
+    'dlk',
+    'dlm',
+    'dln',
+    'dma',
+    'dmb',
+    'dmc',
+    'dmd',
+    'dme',
+    'dmg',
+    'dmk',
+    'dml',
+    'dmm',
+    'dmn',
+    'dmo',
+    'dmr',
+    'dms',
+    'dmu',
+    'dmv',
+    'dmw',
+    'dmx',
+    'dmy',
+    'dna',
+    'dnd',
+    'dne',
+    'dng',
+    'dni',
+    'dnj',
+    'dnk',
+    'dnn',
+    'dnr',
+    'dnt',
+    'dnu',
+    'dnv',
+    'dnw',
+    'dny',
+    'doa',
+    'dob',
+    'doc',
+    'doe',
+    'dof',
+    'doh',
+    'doi',
+    'dok',
+    'dol',
+    'don',
+    'doo',
+    'dop',
+    'doq',
+    'dor',
+    'dos',
+    'dot',
+    'dov',
+    'dow',
+    'dox',
+    'doy',
+    'doz',
+    'dpp',
+    'dra',
+    'drb',
+    'drc',
+    'drd',
+    'dre',
+    'drg',
+    'drh',
+    'dri',
+    'drl',
+    'drn',
+    'dro',
+    'drq',
+    'drr',
+    'drs',
+    'drt',
+    'dru',
+    'drw',
+    'dry',
+    'dsb',
+    'dse',
+    'dsh',
+    'dsi',
+    'dsl',
+    'dsn',
+    'dso',
+    'dsq',
+    'dta',
+    'dtb',
+    'dtd',
+    'dth',
+    'dti',
+    'dtk',
+    'dtm',
+    'dtn',
+    'dto',
+    'dtp',
+    'dtr',
+    'dts',
+    'dtt',
+    'dtu',
+    'dty',
+    'dua',
+    'dub',
+    'duc',
+    'dud',
+    'due',
+    'duf',
+    'dug',
+    'duh',
+    'dui',
+    'duj',
+    'duk',
+    'dul',
+    'dum',
+    'dun',
+    'duo',
+    'dup',
+    'duq',
+    'dur',
+    'dus',
+    'duu',
+    'duv',
+    'duw',
+    'dux',
+    'duy',
+    'duz',
+    'dva',
+    'dwa',
+    'dwl',
+    'dwr',
+    'dws',
+    'dwu',
+    'dww',
+    'dwy',
+    'dya',
+    'dyb',
+    'dyd',
+    'dyg',
+    'dyi',
+    'dym',
+    'dyn',
+    'dyo',
+    'dyu',
+    'dyy',
+    'dza',
+    'dzd',
+    'dze',
+    'dzg',
+    'dzl',
+    'dzn',
+    'eaa',
+    'ebg',
+    'ebk',
+    'ebo',
+    'ebr',
+    'ebu',
+    'ecr',
+    'ecs',
+    'ecy',
+    'eee',
+    'efa',
+    'efe',
+    'efi',
+    'ega',
+    'egl',
+    'ego',
+    'egx',
+    'egy',
+    'ehu',
+    'eip',
+    'eit',
+    'eiv',
+    'eja',
+    'eka',
+    'ekc',
+    'eke',
+    'ekg',
+    'eki',
+    'ekk',
+    'ekl',
+    'ekm',
+    'eko',
+    'ekp',
+    'ekr',
+    'eky',
+    'ele',
+    'elh',
+    'eli',
+    'elk',
+    'elm',
+    'elo',
+    'elp',
+    'elu',
+    'elx',
+    'ema',
+    'emb',
+    'eme',
+    'emg',
+    'emi',
+    'emk',
+    'emm',
+    'emn',
+    'emo',
+    'emp',
+    'ems',
+    'emu',
+    'emw',
+    'emx',
+    'emy',
+    'ena',
+    'enb',
+    'enc',
+    'end',
+    'enf',
+    'enh',
+    'enl',
+    'enm',
+    'enn',
+    'eno',
+    'enq',
+    'enr',
+    'enu',
+    'env',
+    'enw',
+    'enx',
+    'eot',
+    'epi',
+    'era',
+    'erg',
+    'erh',
+    'eri',
+    'erk',
+    'ero',
+    'err',
+    'ers',
+    'ert',
+    'erw',
+    'ese',
+    'esg',
+    'esh',
+    'esi',
+    'esk',
+    'esl',
+    'esm',
+    'esn',
+    'eso',
+    'esq',
+    'ess',
+    'esu',
+    'esx',
+    'esy',
+    'etb',
+    'etc',
+    'eth',
+    'etn',
+    'eto',
+    'etr',
+    'ets',
+    'ett',
+    'etu',
+    'etx',
+    'etz',
+    'euq',
+    'eve',
+    'evh',
+    'evn',
+    'ewo',
+    'ext',
+    'eya',
+    'eyo',
+    'eza',
+    'eze',
+    'faa',
+    'fab',
+    'fad',
+    'faf',
+    'fag',
+    'fah',
+    'fai',
+    'faj',
+    'fak',
+    'fal',
+    'fam',
+    'fan',
+    'fap',
+    'far',
+    'fat',
+    'fau',
+    'fax',
+    'fay',
+    'faz',
+    'fbl',
+    'fcs',
+    'fer',
+    'ffi',
+    'ffm',
+    'fgr',
+    'fia',
+    'fie',
+    'fil',
+    'fip',
+    'fir',
+    'fit',
+    'fiu',
+    'fiw',
+    'fkk',
+    'fkv',
+    'fla',
+    'flh',
+    'fli',
+    'fll',
+    'fln',
+    'flr',
+    'fly',
+    'fmp',
+    'fmu',
+    'fnb',
+    'fng',
+    'fni',
+    'fod',
+    'foi',
+    'fom',
+    'fon',
+    'for',
+    'fos',
+    'fox',
+    'fpe',
+    'fqs',
+    'frc',
+    'frd',
+    'frk',
+    'frm',
+    'fro',
+    'frp',
+    'frq',
+    'frr',
+    'frs',
+    'frt',
+    'fse',
+    'fsl',
+    'fss',
+    'fub',
+    'fuc',
+    'fud',
+    'fue',
+    'fuf',
+    'fuh',
+    'fui',
+    'fuj',
+    'fum',
+    'fun',
+    'fuq',
+    'fur',
+    'fut',
+    'fuu',
+    'fuv',
+    'fuy',
+    'fvr',
+    'fwa',
+    'fwe',
+    'gaa',
+    'gab',
+    'gac',
+    'gad',
+    'gae',
+    'gaf',
+    'gag',
+    'gah',
+    'gai',
+    'gaj',
+    'gak',
+    'gal',
+    'gam',
+    'gan',
+    'gao',
+    'gap',
+    'gaq',
+    'gar',
+    'gas',
+    'gat',
+    'gau',
+    'gav',
+    'gaw',
+    'gax',
+    'gay',
+    'gaz',
+    'gba',
+    'gbb',
+    'gbc',
+    'gbd',
+    'gbe',
+    'gbf',
+    'gbg',
+    'gbh',
+    'gbi',
+    'gbj',
+    'gbk',
+    'gbl',
+    'gbm',
+    'gbn',
+    'gbo',
+    'gbp',
+    'gbq',
+    'gbr',
+    'gbs',
+    'gbu',
+    'gbv',
+    'gbw',
+    'gbx',
+    'gby',
+    'gbz',
+    'gcc',
+    'gcd',
+    'gce',
+    'gcf',
+    'gcl',
+    'gcn',
+    'gcr',
+    'gct',
+    'gda',
+    'gdb',
+    'gdc',
+    'gdd',
+    'gde',
+    'gdf',
+    'gdg',
+    'gdh',
+    'gdi',
+    'gdj',
+    'gdk',
+    'gdl',
+    'gdm',
+    'gdn',
+    'gdo',
+    'gdq',
+    'gdr',
+    'gds',
+    'gdt',
+    'gdu',
+    'gdx',
+    'gea',
+    'geb',
+    'gec',
+    'ged',
+    'geg',
+    'geh',
+    'gei',
+    'gej',
+    'gek',
+    'gel',
+    'gem',
+    'geq',
+    'ges',
+    'gev',
+    'gew',
+    'gex',
+    'gey',
+    'gez',
+    'gfk',
+    'gft',
+    'gfx',
+    'gga',
+    'ggb',
+    'ggd',
+    'gge',
+    'ggg',
+    'ggk',
+    'ggl',
+    'ggn',
+    'ggo',
+    'ggr',
+    'ggt',
+    'ggu',
+    'ggw',
+    'gha',
+    'ghc',
+    'ghe',
+    'ghh',
+    'ghk',
+    'ghl',
+    'ghn',
+    'gho',
+    'ghr',
+    'ghs',
+    'ght',
+    'gia',
+    'gib',
+    'gic',
+    'gid',
+    'gie',
+    'gig',
+    'gih',
+    'gil',
+    'gim',
+    'gin',
+    'gio',
+    'gip',
+    'giq',
+    'gir',
+    'gis',
+    'git',
+    'giu',
+    'giw',
+    'gix',
+    'giy',
+    'giz',
+    'gji',
+    'gjk',
+    'gjm',
+    'gjn',
+    'gjr',
+    'gju',
+    'gka',
+    'gkd',
+    'gke',
+    'gkn',
+    'gko',
+    'gkp',
+    'gku',
+    'glc',
+    'gld',
+    'glh',
+    'gli',
+    'glj',
+    'glk',
+    'gll',
+    'glo',
+    'glr',
+    'glu',
+    'glw',
+    'gly',
+    'gma',
+    'gmb',
+    'gmd',
+    'gme',
+    'gmg',
+    'gmh',
+    'gml',
+    'gmm',
+    'gmn',
+    'gmq',
+    'gmu',
+    'gmv',
+    'gmw',
+    'gmx',
+    'gmy',
+    'gmz',
+    'gna',
+    'gnb',
+    'gnc',
+    'gnd',
+    'gne',
+    'gng',
+    'gnh',
+    'gni',
+    'gnj',
+    'gnk',
+    'gnl',
+    'gnm',
+    'gnn',
+    'gno',
+    'gnq',
+    'gnr',
+    'gnt',
+    'gnu',
+    'gnw',
+    'gnz',
+    'goa',
+    'gob',
+    'goc',
+    'god',
+    'goe',
+    'gof',
+    'gog',
+    'goh',
+    'goi',
+    'goj',
+    'gok',
+    'gol',
+    'gom',
+    'gon',
+    'goo',
+    'gop',
+    'goq',
+    'gor',
+    'gos',
+    'got',
+    'gou',
+    'gow',
+    'gox',
+    'goy',
+    'goz',
+    'gpa',
+    'gpe',
+    'gpn',
+    'gqa',
+    'gqi',
+    'gqn',
+    'gqr',
+    'gqu',
+    'gra',
+    'grb',
+    'grc',
+    'grd',
+    'grg',
+    'grh',
+    'gri',
+    'grj',
+    'grk',
+    'grm',
+    'gro',
+    'grq',
+    'grr',
+    'grs',
+    'grt',
+    'gru',
+    'grv',
+    'grw',
+    'grx',
+    'gry',
+    'grz',
+    'gse',
+    'gsg',
+    'gsl',
+    'gsm',
+    'gsn',
+    'gso',
+    'gsp',
+    'gss',
+    'gsw',
+    'gta',
+    'gti',
+    'gtu',
+    'gua',
+    'gub',
+    'guc',
+    'gud',
+    'gue',
+    'guf',
+    'gug',
+    'guh',
+    'gui',
+    'guk',
+    'gul',
+    'gum',
+    'gun',
+    'guo',
+    'gup',
+    'guq',
+    'gur',
+    'gus',
+    'gut',
+    'guu',
+    'guv',
+    'guw',
+    'gux',
+    'guz',
+    'gva',
+    'gvc',
+    'gve',
+    'gvf',
+    'gvj',
+    'gvl',
+    'gvm',
+    'gvn',
+    'gvo',
+    'gvp',
+    'gvr',
+    'gvs',
+    'gvy',
+    'gwa',
+    'gwb',
+    'gwc',
+    'gwd',
+    'gwe',
+    'gwf',
+    'gwg',
+    'gwi',
+    'gwj',
+    'gwm',
+    'gwn',
+    'gwr',
+    'gwt',
+    'gwu',
+    'gww',
+    'gwx',
+    'gxx',
+    'gya',
+    'gyb',
+    'gyd',
+    'gye',
+    'gyf',
+    'gyg',
+    'gyi',
+    'gyl',
+    'gym',
+    'gyn',
+    'gyo',
+    'gyr',
+    'gyy',
+    'gza',
+    'gzi',
+    'gzn',
+    'haa',
+    'hab',
+    'hac',
+    'had',
+    'hae',
+    'haf',
+    'hag',
+    'hah',
+    'hai',
+    'haj',
+    'hak',
+    'hal',
+    'ham',
+    'han',
+    'hao',
+    'hap',
+    'haq',
+    'har',
+    'has',
+    'hav',
+    'haw',
+    'hax',
+    'hay',
+    'haz',
+    'hba',
+    'hbb',
+    'hbn',
+    'hbo',
+    'hbu',
+    'hca',
+    'hch',
+    'hdn',
+    'hds',
+    'hdy',
+    'hea',
+    'hed',
+    'heg',
+    'heh',
+    'hei',
+    'hem',
+    'hgm',
+    'hgw',
+    'hhi',
+    'hhr',
+    'hhy',
+    'hia',
+    'hib',
+    'hid',
+    'hif',
+    'hig',
+    'hih',
+    'hii',
+    'hij',
+    'hik',
+    'hil',
+    'him',
+    'hio',
+    'hir',
+    'hit',
+    'hiw',
+    'hix',
+    'hji',
+    'hka',
+    'hke',
+    'hkk',
+    'hkn',
+    'hks',
+    'hla',
+    'hlb',
+    'hld',
+    'hle',
+    'hlt',
+    'hlu',
+    'hma',
+    'hmb',
+    'hmc',
+    'hmd',
+    'hme',
+    'hmf',
+    'hmg',
+    'hmh',
+    'hmi',
+    'hmj',
+    'hmk',
+    'hml',
+    'hmm',
+    'hmn',
+    'hmp',
+    'hmq',
+    'hmr',
+    'hms',
+    'hmt',
+    'hmu',
+    'hmv',
+    'hmw',
+    'hmx',
+    'hmy',
+    'hmz',
+    'hna',
+    'hnd',
+    'hne',
+    'hnh',
+    'hni',
+    'hnj',
+    'hnn',
+    'hno',
+    'hns',
+    'hnu',
+    'hoa',
+    'hob',
+    'hoc',
+    'hod',
+    'hoe',
+    'hoh',
+    'hoi',
+    'hoj',
+    'hok',
+    'hol',
+    'hom',
+    'hoo',
+    'hop',
+    'hor',
+    'hos',
+    'hot',
+    'hov',
+    'how',
+    'hoy',
+    'hoz',
+    'hpo',
+    'hps',
+    'hra',
+    'hrc',
+    'hre',
+    'hrk',
+    'hrm',
+    'hro',
+    'hrp',
+    'hrr',
+    'hrt',
+    'hru',
+    'hrw',
+    'hrx',
+    'hrz',
+    'hsb',
+    'hsh',
+    'hsl',
+    'hsn',
+    'hss',
+    'hti',
+    'hto',
+    'hts',
+    'htu',
+    'htx',
+    'hub',
+    'huc',
+    'hud',
+    'hue',
+    'huf',
+    'hug',
+    'huh',
+    'hui',
+    'huj',
+    'huk',
+    'hul',
+    'hum',
+    'huo',
+    'hup',
+    'huq',
+    'hur',
+    'hus',
+    'hut',
+    'huu',
+    'huv',
+    'huw',
+    'hux',
+    'huy',
+    'huz',
+    'hvc',
+    'hve',
+    'hvk',
+    'hvn',
+    'hvv',
+    'hwa',
+    'hwc',
+    'hwo',
+    'hya',
+    'hyw',
+    'hyx',
+    'iai',
+    'ian',
+    'iap',
+    'iar',
+    'iba',
+    'ibb',
+    'ibd',
+    'ibe',
+    'ibg',
+    'ibh',
+    'ibi',
+    'ibl',
+    'ibm',
+    'ibn',
+    'ibr',
+    'ibu',
+    'iby',
+    'ica',
+    'ich',
+    'icl',
+    'icr',
+    'ida',
+    'idb',
+    'idc',
+    'idd',
+    'ide',
+    'idi',
+    'idr',
+    'ids',
+    'idt',
+    'idu',
+    'ifa',
+    'ifb',
+    'ife',
+    'iff',
+    'ifk',
+    'ifm',
+    'ifu',
+    'ify',
+    'igb',
+    'ige',
+    'igg',
+    'igl',
+    'igm',
+    'ign',
+    'igo',
+    'igs',
+    'igw',
+    'ihb',
+    'ihi',
+    'ihp',
+    'ihw',
+    'iin',
+    'iir',
+    'ijc',
+    'ije',
+    'ijj',
+    'ijn',
+    'ijo',
+    'ijs',
+    'ike',
+    'iki',
+    'ikk',
+    'ikl',
+    'iko',
+    'ikp',
+    'ikr',
+    'iks',
+    'ikt',
+    'ikv',
+    'ikw',
+    'ikx',
+    'ikz',
+    'ila',
+    'ilb',
+    'ilg',
+    'ili',
+    'ilk',
+    'ill',
+    'ilm',
+    'ilo',
+    'ilp',
+    'ils',
+    'ilu',
+    'ilv',
+    'ilw',
+    'ima',
+    'ime',
+    'imi',
+    'iml',
+    'imn',
+    'imo',
+    'imr',
+    'ims',
+    'imy',
+    'inb',
+    'inc',
+    'ine',
+    'ing',
+    'inh',
+    'inj',
+    'inl',
+    'inm',
+    'inn',
+    'ino',
+    'inp',
+    'ins',
+    'int',
+    'inz',
+    'ior',
+    'iou',
+    'iow',
+    'ipi',
+    'ipo',
+    'iqu',
+    'iqw',
+    'ira',
+    'ire',
+    'irh',
+    'iri',
+    'irk',
+    'irn',
+    'iro',
+    'irr',
+    'iru',
+    'irx',
+    'iry',
+    'isa',
+    'isc',
+    'isd',
+    'ise',
+    'isg',
+    'ish',
+    'isi',
+    'isk',
+    'ism',
+    'isn',
+    'iso',
+    'isr',
+    'ist',
+    'isu',
+    'itb',
+    'itc',
+    'itd',
+    'ite',
+    'iti',
+    'itk',
+    'itl',
+    'itm',
+    'ito',
+    'itr',
+    'its',
+    'itt',
+    'itv',
+    'itw',
+    'itx',
+    'ity',
+    'itz',
+    'ium',
+    'ivb',
+    'ivv',
+    'iwk',
+    'iwm',
+    'iwo',
+    'iws',
+    'ixc',
+    'ixl',
+    'iya',
+    'iyo',
+    'iyx',
+    'izh',
+    'izi',
+    'izr',
+    'izz',
+    'jaa',
+    'jab',
+    'jac',
+    'jad',
+    'jae',
+    'jaf',
+    'jah',
+    'jaj',
+    'jak',
+    'jal',
+    'jam',
+    'jan',
+    'jao',
+    'jaq',
+    'jar',
+    'jas',
+    'jat',
+    'jau',
+    'jax',
+    'jay',
+    'jaz',
+    'jbe',
+    'jbi',
+    'jbj',
+    'jbk',
+    'jbn',
+    'jbo',
+    'jbr',
+    'jbt',
+    'jbu',
+    'jbw',
+    'jcs',
+    'jct',
+    'jda',
+    'jdg',
+    'jdt',
+    'jeb',
+    'jee',
+    'jeg',
+    'jeh',
+    'jei',
+    'jek',
+    'jel',
+    'jen',
+    'jer',
+    'jet',
+    'jeu',
+    'jgb',
+    'jge',
+    'jgk',
+    'jgo',
+    'jhi',
+    'jhs',
+    'jia',
+    'jib',
+    'jic',
+    'jid',
+    'jie',
+    'jig',
+    'jih',
+    'jii',
+    'jil',
+    'jim',
+    'jio',
+    'jiq',
+    'jit',
+    'jiu',
+    'jiv',
+    'jiy',
+    'jje',
+    'jjr',
+    'jka',
+    'jkm',
+    'jko',
+    'jkp',
+    'jkr',
+    'jku',
+    'jle',
+    'jls',
+    'jma',
+    'jmb',
+    'jmc',
+    'jmd',
+    'jmi',
+    'jml',
+    'jmn',
+    'jmr',
+    'jms',
+    'jmw',
+    'jmx',
+    'jna',
+    'jnd',
+    'jng',
+    'jni',
+    'jnj',
+    'jnl',
+    'jns',
+    'job',
+    'jod',
+    'jog',
+    'jor',
+    'jos',
+    'jow',
+    'jpa',
+    'jpr',
+    'jpx',
+    'jqr',
+    'jra',
+    'jrb',
+    'jrr',
+    'jrt',
+    'jru',
+    'jsl',
+    'jua',
+    'jub',
+    'juc',
+    'jud',
+    'juh',
+    'jui',
+    'juk',
+    'jul',
+    'jum',
+    'jun',
+    'juo',
+    'jup',
+    'jur',
+    'jus',
+    'jut',
+    'juu',
+    'juw',
+    'juy',
+    'jvd',
+    'jvn',
+    'jwi',
+    'jya',
+    'jye',
+    'jyy',
+    'kaa',
+    'kab',
+    'kac',
+    'kad',
+    'kae',
+    'kaf',
+    'kag',
+    'kah',
+    'kai',
+    'kaj',
+    'kak',
+    'kam',
+    'kao',
+    'kap',
+    'kaq',
+    'kar',
+    'kav',
+    'kaw',
+    'kax',
+    'kay',
+    'kba',
+    'kbb',
+    'kbc',
+    'kbd',
+    'kbe',
+    'kbf',
+    'kbg',
+    'kbh',
+    'kbi',
+    'kbj',
+    'kbk',
+    'kbl',
+    'kbm',
+    'kbn',
+    'kbo',
+    'kbp',
+    'kbq',
+    'kbr',
+    'kbs',
+    'kbt',
+    'kbu',
+    'kbv',
+    'kbw',
+    'kbx',
+    'kby',
+    'kbz',
+    'kca',
+    'kcb',
+    'kcc',
+    'kcd',
+    'kce',
+    'kcf',
+    'kcg',
+    'kch',
+    'kci',
+    'kcj',
+    'kck',
+    'kcl',
+    'kcm',
+    'kcn',
+    'kco',
+    'kcp',
+    'kcq',
+    'kcr',
+    'kcs',
+    'kct',
+    'kcu',
+    'kcv',
+    'kcw',
+    'kcx',
+    'kcy',
+    'kcz',
+    'kda',
+    'kdc',
+    'kdd',
+    'kde',
+    'kdf',
+    'kdg',
+    'kdh',
+    'kdi',
+    'kdj',
+    'kdk',
+    'kdl',
+    'kdm',
+    'kdn',
+    'kdo',
+    'kdp',
+    'kdq',
+    'kdr',
+    'kdt',
+    'kdu',
+    'kdv',
+    'kdw',
+    'kdx',
+    'kdy',
+    'kdz',
+    'kea',
+    'keb',
+    'kec',
+    'ked',
+    'kee',
+    'kef',
+    'keg',
+    'keh',
+    'kei',
+    'kej',
+    'kek',
+    'kel',
+    'kem',
+    'ken',
+    'keo',
+    'kep',
+    'keq',
+    'ker',
+    'kes',
+    'ket',
+    'keu',
+    'kev',
+    'kew',
+    'kex',
+    'key',
+    'kez',
+    'kfa',
+    'kfb',
+    'kfc',
+    'kfd',
+    'kfe',
+    'kff',
+    'kfg',
+    'kfh',
+    'kfi',
+    'kfj',
+    'kfk',
+    'kfl',
+    'kfm',
+    'kfn',
+    'kfo',
+    'kfp',
+    'kfq',
+    'kfr',
+    'kfs',
+    'kft',
+    'kfu',
+    'kfv',
+    'kfw',
+    'kfx',
+    'kfy',
+    'kfz',
+    'kga',
+    'kgb',
+    'kgc',
+    'kgd',
+    'kge',
+    'kgf',
+    'kgg',
+    'kgh',
+    'kgi',
+    'kgj',
+    'kgk',
+    'kgl',
+    'kgm',
+    'kgn',
+    'kgo',
+    'kgp',
+    'kgq',
+    'kgr',
+    'kgs',
+    'kgt',
+    'kgu',
+    'kgv',
+    'kgw',
+    'kgx',
+    'kgy',
+    'kha',
+    'khb',
+    'khc',
+    'khd',
+    'khe',
+    'khf',
+    'khg',
+    'khh',
+    'khi',
+    'khj',
+    'khk',
+    'khl',
+    'khn',
+    'kho',
+    'khp',
+    'khq',
+    'khr',
+    'khs',
+    'kht',
+    'khu',
+    'khv',
+    'khw',
+    'khx',
+    'khy',
+    'khz',
+    'kia',
+    'kib',
+    'kic',
+    'kid',
+    'kie',
+    'kif',
+    'kig',
+    'kih',
+    'kii',
+    'kij',
+    'kil',
+    'kim',
+    'kio',
+    'kip',
+    'kiq',
+    'kis',
+    'kit',
+    'kiu',
+    'kiv',
+    'kiw',
+    'kix',
+    'kiy',
+    'kiz',
+    'kja',
+    'kjb',
+    'kjc',
+    'kjd',
+    'kje',
+    'kjf',
+    'kjg',
+    'kjh',
+    'kji',
+    'kjj',
+    'kjk',
+    'kjl',
+    'kjm',
+    'kjn',
+    'kjo',
+    'kjp',
+    'kjq',
+    'kjr',
+    'kjs',
+    'kjt',
+    'kju',
+    'kjv',
+    'kjx',
+    'kjy',
+    'kjz',
+    'kka',
+    'kkb',
+    'kkc',
+    'kkd',
+    'kke',
+    'kkf',
+    'kkg',
+    'kkh',
+    'kki',
+    'kkj',
+    'kkk',
+    'kkl',
+    'kkm',
+    'kkn',
+    'kko',
+    'kkp',
+    'kkq',
+    'kkr',
+    'kks',
+    'kkt',
+    'kku',
+    'kkv',
+    'kkw',
+    'kkx',
+    'kky',
+    'kkz',
+    'kla',
+    'klb',
+    'klc',
+    'kld',
+    'kle',
+    'klf',
+    'klg',
+    'klh',
+    'kli',
+    'klj',
+    'klk',
+    'kll',
+    'klm',
+    'kln',
+    'klo',
+    'klp',
+    'klq',
+    'klr',
+    'kls',
+    'klt',
+    'klu',
+    'klv',
+    'klw',
+    'klx',
+    'kly',
+    'klz',
+    'kma',
+    'kmb',
+    'kmc',
+    'kmd',
+    'kme',
+    'kmf',
+    'kmg',
+    'kmh',
+    'kmi',
+    'kmj',
+    'kmk',
+    'kml',
+    'kmm',
+    'kmn',
+    'kmo',
+    'kmp',
+    'kmq',
+    'kmr',
+    'kms',
+    'kmt',
+    'kmu',
+    'kmv',
+    'kmw',
+    'kmx',
+    'kmy',
+    'kmz',
+    'kna',
+    'knb',
+    'knc',
+    'knd',
+    'kne',
+    'knf',
+    'kng',
+    'kni',
+    'knj',
+    'knk',
+    'knl',
+    'knm',
+    'knn',
+    'kno',
+    'knp',
+    'knq',
+    'knr',
+    'kns',
+    'knt',
+    'knu',
+    'knv',
+    'knw',
+    'knx',
+    'kny',
+    'knz',
+    'koa',
+    'koc',
+    'kod',
+    'koe',
+    'kof',
+    'kog',
+    'koh',
+    'koi',
+    'koj',
+    'kok',
+    'kol',
+    'koo',
+    'kop',
+    'koq',
+    'kos',
+    'kot',
+    'kou',
+    'kov',
+    'kow',
+    'kox',
+    'koy',
+    'koz',
+    'kpa',
+    'kpb',
+    'kpc',
+    'kpd',
+    'kpe',
+    'kpf',
+    'kpg',
+    'kph',
+    'kpi',
+    'kpj',
+    'kpk',
+    'kpl',
+    'kpm',
+    'kpn',
+    'kpo',
+    'kpp',
+    'kpq',
+    'kpr',
+    'kps',
+    'kpt',
+    'kpu',
+    'kpv',
+    'kpw',
+    'kpx',
+    'kpy',
+    'kpz',
+    'kqa',
+    'kqb',
+    'kqc',
+    'kqd',
+    'kqe',
+    'kqf',
+    'kqg',
+    'kqh',
+    'kqi',
+    'kqj',
+    'kqk',
+    'kql',
+    'kqm',
+    'kqn',
+    'kqo',
+    'kqp',
+    'kqq',
+    'kqr',
+    'kqs',
+    'kqt',
+    'kqu',
+    'kqv',
+    'kqw',
+    'kqx',
+    'kqy',
+    'kqz',
+    'kra',
+    'krb',
+    'krc',
+    'krd',
+    'kre',
+    'krf',
+    'krh',
+    'kri',
+    'krj',
+    'krk',
+    'krl',
+    'krm',
+    'krn',
+    'kro',
+    'krp',
+    'krr',
+    'krs',
+    'krt',
+    'kru',
+    'krv',
+    'krw',
+    'krx',
+    'kry',
+    'krz',
+    'ksa',
+    'ksb',
+    'ksc',
+    'ksd',
+    'kse',
+    'ksf',
+    'ksg',
+    'ksh',
+    'ksi',
+    'ksj',
+    'ksk',
+    'ksl',
+    'ksm',
+    'ksn',
+    'kso',
+    'ksp',
+    'ksq',
+    'ksr',
+    'kss',
+    'kst',
+    'ksu',
+    'ksv',
+    'ksw',
+    'ksx',
+    'ksy',
+    'ksz',
+    'kta',
+    'ktb',
+    'ktc',
+    'ktd',
+    'kte',
+    'ktf',
+    'ktg',
+    'kth',
+    'kti',
+    'ktj',
+    'ktk',
+    'ktl',
+    'ktm',
+    'ktn',
+    'kto',
+    'ktp',
+    'ktq',
+    'ktr',
+    'kts',
+    'ktt',
+    'ktu',
+    'ktv',
+    'ktw',
+    'ktx',
+    'kty',
+    'ktz',
+    'kub',
+    'kuc',
+    'kud',
+    'kue',
+    'kuf',
+    'kug',
+    'kuh',
+    'kui',
+    'kuj',
+    'kuk',
+    'kul',
+    'kum',
+    'kun',
+    'kuo',
+    'kup',
+    'kuq',
+    'kus',
+    'kut',
+    'kuu',
+    'kuv',
+    'kuw',
+    'kux',
+    'kuy',
+    'kuz',
+    'kva',
+    'kvb',
+    'kvc',
+    'kvd',
+    'kve',
+    'kvf',
+    'kvg',
+    'kvh',
+    'kvi',
+    'kvj',
+    'kvk',
+    'kvl',
+    'kvm',
+    'kvn',
+    'kvo',
+    'kvp',
+    'kvq',
+    'kvr',
+    'kvs',
+    'kvt',
+    'kvu',
+    'kvv',
+    'kvw',
+    'kvx',
+    'kvy',
+    'kvz',
+    'kwa',
+    'kwb',
+    'kwc',
+    'kwd',
+    'kwe',
+    'kwf',
+    'kwg',
+    'kwh',
+    'kwi',
+    'kwj',
+    'kwk',
+    'kwl',
+    'kwm',
+    'kwn',
+    'kwo',
+    'kwp',
+    'kwq',
+    'kwr',
+    'kws',
+    'kwt',
+    'kwu',
+    'kwv',
+    'kww',
+    'kwx',
+    'kwy',
+    'kwz',
+    'kxa',
+    'kxb',
+    'kxc',
+    'kxd',
+    'kxe',
+    'kxf',
+    'kxh',
+    'kxi',
+    'kxj',
+    'kxk',
+    'kxl',
+    'kxm',
+    'kxn',
+    'kxo',
+    'kxp',
+    'kxq',
+    'kxr',
+    'kxs',
+    'kxt',
+    'kxu',
+    'kxv',
+    'kxw',
+    'kxx',
+    'kxy',
+    'kxz',
+    'kya',
+    'kyb',
+    'kyc',
+    'kyd',
+    'kye',
+    'kyf',
+    'kyg',
+    'kyh',
+    'kyi',
+    'kyj',
+    'kyk',
+    'kyl',
+    'kym',
+    'kyn',
+    'kyo',
+    'kyp',
+    'kyq',
+    'kyr',
+    'kys',
+    'kyt',
+    'kyu',
+    'kyv',
+    'kyw',
+    'kyx',
+    'kyy',
+    'kyz',
+    'kza',
+    'kzb',
+    'kzc',
+    'kzd',
+    'kze',
+    'kzf',
+    'kzg',
+    'kzh',
+    'kzi',
+    'kzj',
+    'kzk',
+    'kzl',
+    'kzm',
+    'kzn',
+    'kzo',
+    'kzp',
+    'kzq',
+    'kzr',
+    'kzs',
+    'kzt',
+    'kzu',
+    'kzv',
+    'kzw',
+    'kzx',
+    'kzy',
+    'kzz',
+    'laa',
+    'lab',
+    'lac',
+    'lad',
+    'lae',
+    'laf',
+    'lag',
+    'lah',
+    'lai',
+    'laj',
+    'lak',
+    'lal',
+    'lam',
+    'lan',
+    'lap',
+    'laq',
+    'lar',
+    'las',
+    'lau',
+    'law',
+    'lax',
+    'lay',
+    'laz',
+    'lba',
+    'lbb',
+    'lbc',
+    'lbe',
+    'lbf',
+    'lbg',
+    'lbi',
+    'lbj',
+    'lbk',
+    'lbl',
+    'lbm',
+    'lbn',
+    'lbo',
+    'lbq',
+    'lbr',
+    'lbs',
+    'lbt',
+    'lbu',
+    'lbv',
+    'lbw',
+    'lbx',
+    'lby',
+    'lbz',
+    'lcc',
+    'lcd',
+    'lce',
+    'lcf',
+    'lch',
+    'lcl',
+    'lcm',
+    'lcp',
+    'lcq',
+    'lcs',
+    'lda',
+    'ldb',
+    'ldd',
+    'ldg',
+    'ldh',
+    'ldi',
+    'ldj',
+    'ldk',
+    'ldl',
+    'ldm',
+    'ldn',
+    'ldo',
+    'ldp',
+    'ldq',
+    'lea',
+    'leb',
+    'lec',
+    'led',
+    'lee',
+    'lef',
+    'leg',
+    'leh',
+    'lei',
+    'lej',
+    'lek',
+    'lel',
+    'lem',
+    'len',
+    'leo',
+    'lep',
+    'leq',
+    'ler',
+    'les',
+    'let',
+    'leu',
+    'lev',
+    'lew',
+    'lex',
+    'ley',
+    'lez',
+    'lfa',
+    'lfn',
+    'lga',
+    'lgb',
+    'lgg',
+    'lgh',
+    'lgi',
+    'lgk',
+    'lgl',
+    'lgm',
+    'lgn',
+    'lgq',
+    'lgr',
+    'lgt',
+    'lgu',
+    'lgz',
+    'lha',
+    'lhh',
+    'lhi',
+    'lhl',
+    'lhm',
+    'lhn',
+    'lhp',
+    'lhs',
+    'lht',
+    'lhu',
+    'lia',
+    'lib',
+    'lic',
+    'lid',
+    'lie',
+    'lif',
+    'lig',
+    'lih',
+    'lii',
+    'lij',
+    'lik',
+    'lil',
+    'lio',
+    'lip',
+    'liq',
+    'lir',
+    'lis',
+    'liu',
+    'liv',
+    'liw',
+    'lix',
+    'liy',
+    'liz',
+    'lja',
+    'lje',
+    'lji',
+    'ljl',
+    'ljp',
+    'ljw',
+    'ljx',
+    'lka',
+    'lkb',
+    'lkc',
+    'lkd',
+    'lke',
+    'lkh',
+    'lki',
+    'lkj',
+    'lkl',
+    'lkm',
+    'lkn',
+    'lko',
+    'lkr',
+    'lks',
+    'lkt',
+    'lku',
+    'lky',
+    'lla',
+    'llb',
+    'llc',
+    'lld',
+    'lle',
+    'llf',
+    'llg',
+    'llh',
+    'lli',
+    'llj',
+    'llk',
+    'lll',
+    'llm',
+    'lln',
+    'llo',
+    'llp',
+    'llq',
+    'lls',
+    'llu',
+    'llx',
+    'lma',
+    'lmb',
+    'lmc',
+    'lmd',
+    'lme',
+    'lmf',
+    'lmg',
+    'lmh',
+    'lmi',
+    'lmj',
+    'lmk',
+    'lml',
+    'lmm',
+    'lmn',
+    'lmo',
+    'lmp',
+    'lmq',
+    'lmr',
+    'lmu',
+    'lmv',
+    'lmw',
+    'lmx',
+    'lmy',
+    'lmz',
+    'lna',
+    'lnb',
+    'lnd',
+    'lng',
+    'lnh',
+    'lni',
+    'lnj',
+    'lnl',
+    'lnm',
+    'lnn',
+    'lno',
+    'lns',
+    'lnu',
+    'lnw',
+    'lnz',
+    'loa',
+    'lob',
+    'loc',
+    'loe',
+    'lof',
+    'log',
+    'loh',
+    'loi',
+    'loj',
+    'lok',
+    'lol',
+    'lom',
+    'lon',
+    'loo',
+    'lop',
+    'loq',
+    'lor',
+    'los',
+    'lot',
+    'lou',
+    'lov',
+    'low',
+    'lox',
+    'loy',
+    'loz',
+    'lpa',
+    'lpe',
+    'lpn',
+    'lpo',
+    'lpx',
+    'lra',
+    'lrc',
+    'lre',
+    'lrg',
+    'lri',
+    'lrk',
+    'lrl',
+    'lrm',
+    'lrn',
+    'lro',
+    'lrr',
+    'lrt',
+    'lrv',
+    'lrz',
+    'lsa',
+    'lsd',
+    'lse',
+    'lsg',
+    'lsh',
+    'lsi',
+    'lsl',
+    'lsm',
+    'lso',
+    'lsp',
+    'lsr',
+    'lss',
+    'lst',
+    'lsy',
+    'ltc',
+    'ltg',
+    'lth',
+    'lti',
+    'ltn',
+    'lto',
+    'lts',
+    'ltu',
+    'lua',
+    'luc',
+    'lud',
+    'lue',
+    'luf',
+    'lui',
+    'luj',
+    'luk',
+    'lul',
+    'lum',
+    'lun',
+    'luo',
+    'lup',
+    'luq',
+    'lur',
+    'lus',
+    'lut',
+    'luu',
+    'luv',
+    'luw',
+    'luy',
+    'luz',
+    'lva',
+    'lvk',
+    'lvs',
+    'lvu',
+    'lwa',
+    'lwe',
+    'lwg',
+    'lwh',
+    'lwl',
+    'lwm',
+    'lwo',
+    'lws',
+    'lwt',
+    'lwu',
+    'lww',
+    'lya',
+    'lyg',
+    'lyn',
+    'lzh',
+    'lzl',
+    'lzn',
+    'lzz',
+    'maa',
+    'mab',
+    'mad',
+    'mae',
+    'maf',
+    'mag',
+    'mai',
+    'maj',
+    'mak',
+    'mam',
+    'man',
+    'map',
+    'maq',
+    'mas',
+    'mat',
+    'mau',
+    'mav',
+    'maw',
+    'max',
+    'maz',
+    'mba',
+    'mbb',
+    'mbc',
+    'mbd',
+    'mbe',
+    'mbf',
+    'mbh',
+    'mbi',
+    'mbj',
+    'mbk',
+    'mbl',
+    'mbm',
+    'mbn',
+    'mbo',
+    'mbp',
+    'mbq',
+    'mbr',
+    'mbs',
+    'mbt',
+    'mbu',
+    'mbv',
+    'mbw',
+    'mbx',
+    'mby',
+    'mbz',
+    'mca',
+    'mcb',
+    'mcc',
+    'mcd',
+    'mce',
+    'mcf',
+    'mcg',
+    'mch',
+    'mci',
+    'mcj',
+    'mck',
+    'mcl',
+    'mcm',
+    'mcn',
+    'mco',
+    'mcp',
+    'mcq',
+    'mcr',
+    'mcs',
+    'mct',
+    'mcu',
+    'mcv',
+    'mcw',
+    'mcx',
+    'mcy',
+    'mcz',
+    'mda',
+    'mdb',
+    'mdc',
+    'mdd',
+    'mde',
+    'mdf',
+    'mdg',
+    'mdh',
+    'mdi',
+    'mdj',
+    'mdk',
+    'mdl',
+    'mdm',
+    'mdn',
+    'mdp',
+    'mdq',
+    'mdr',
+    'mds',
+    'mdt',
+    'mdu',
+    'mdv',
+    'mdw',
+    'mdx',
+    'mdy',
+    'mdz',
+    'mea',
+    'meb',
+    'mec',
+    'med',
+    'mee',
+    'mef',
+    'meg',
+    'meh',
+    'mei',
+    'mej',
+    'mek',
+    'mel',
+    'mem',
+    'men',
+    'meo',
+    'mep',
+    'meq',
+    'mer',
+    'mes',
+    'met',
+    'meu',
+    'mev',
+    'mew',
+    'mey',
+    'mez',
+    'mfa',
+    'mfb',
+    'mfc',
+    'mfd',
+    'mfe',
+    'mff',
+    'mfg',
+    'mfh',
+    'mfi',
+    'mfj',
+    'mfk',
+    'mfl',
+    'mfm',
+    'mfn',
+    'mfo',
+    'mfp',
+    'mfq',
+    'mfr',
+    'mfs',
+    'mft',
+    'mfu',
+    'mfv',
+    'mfw',
+    'mfx',
+    'mfy',
+    'mfz',
+    'mga',
+    'mgb',
+    'mgc',
+    'mgd',
+    'mge',
+    'mgf',
+    'mgg',
+    'mgh',
+    'mgi',
+    'mgj',
+    'mgk',
+    'mgl',
+    'mgm',
+    'mgn',
+    'mgo',
+    'mgp',
+    'mgq',
+    'mgr',
+    'mgs',
+    'mgt',
+    'mgu',
+    'mgv',
+    'mgw',
+    'mgx',
+    'mgy',
+    'mgz',
+    'mha',
+    'mhb',
+    'mhc',
+    'mhd',
+    'mhe',
+    'mhf',
+    'mhg',
+    'mhh',
+    'mhi',
+    'mhj',
+    'mhk',
+    'mhl',
+    'mhm',
+    'mhn',
+    'mho',
+    'mhp',
+    'mhq',
+    'mhr',
+    'mhs',
+    'mht',
+    'mhu',
+    'mhw',
+    'mhx',
+    'mhy',
+    'mhz',
+    'mia',
+    'mib',
+    'mic',
+    'mid',
+    'mie',
+    'mif',
+    'mig',
+    'mih',
+    'mii',
+    'mij',
+    'mik',
+    'mil',
+    'mim',
+    'min',
+    'mio',
+    'mip',
+    'miq',
+    'mir',
+    'mis',
+    'mit',
+    'miu',
+    'miw',
+    'mix',
+    'miy',
+    'miz',
+    'mja',
+    'mjb',
+    'mjc',
+    'mjd',
+    'mje',
+    'mjg',
+    'mjh',
+    'mji',
+    'mjj',
+    'mjk',
+    'mjl',
+    'mjm',
+    'mjn',
+    'mjo',
+    'mjp',
+    'mjq',
+    'mjr',
+    'mjs',
+    'mjt',
+    'mju',
+    'mjv',
+    'mjw',
+    'mjx',
+    'mjy',
+    'mjz',
+    'mka',
+    'mkb',
+    'mkc',
+    'mke',
+    'mkf',
+    'mkg',
+    'mkh',
+    'mki',
+    'mkj',
+    'mkk',
+    'mkl',
+    'mkm',
+    'mkn',
+    'mko',
+    'mkp',
+    'mkq',
+    'mkr',
+    'mks',
+    'mkt',
+    'mku',
+    'mkv',
+    'mkw',
+    'mkx',
+    'mky',
+    'mkz',
+    'mla',
+    'mlb',
+    'mlc',
+    'mld',
+    'mle',
+    'mlf',
+    'mlh',
+    'mli',
+    'mlj',
+    'mlk',
+    'mll',
+    'mlm',
+    'mln',
+    'mlo',
+    'mlp',
+    'mlq',
+    'mlr',
+    'mls',
+    'mlu',
+    'mlv',
+    'mlw',
+    'mlx',
+    'mlz',
+    'mma',
+    'mmb',
+    'mmc',
+    'mmd',
+    'mme',
+    'mmf',
+    'mmg',
+    'mmh',
+    'mmi',
+    'mmj',
+    'mmk',
+    'mml',
+    'mmm',
+    'mmn',
+    'mmo',
+    'mmp',
+    'mmq',
+    'mmr',
+    'mmt',
+    'mmu',
+    'mmv',
+    'mmw',
+    'mmx',
+    'mmy',
+    'mmz',
+    'mna',
+    'mnb',
+    'mnc',
+    'mnd',
+    'mne',
+    'mnf',
+    'mng',
+    'mnh',
+    'mni',
+    'mnj',
+    'mnk',
+    'mnl',
+    'mnm',
+    'mnn',
+    'mno',
+    'mnp',
+    'mnq',
+    'mnr',
+    'mns',
+    'mnt',
+    'mnu',
+    'mnv',
+    'mnw',
+    'mnx',
+    'mny',
+    'mnz',
+    'moa',
+    'moc',
+    'mod',
+    'moe',
+    'mof',
+    'mog',
+    'moh',
+    'moi',
+    'moj',
+    'mok',
+    'mom',
+    'moo',
+    'mop',
+    'moq',
+    'mor',
+    'mos',
+    'mot',
+    'mou',
+    'mov',
+    'mow',
+    'mox',
+    'moy',
+    'moz',
+    'mpa',
+    'mpb',
+    'mpc',
+    'mpd',
+    'mpe',
+    'mpg',
+    'mph',
+    'mpi',
+    'mpj',
+    'mpk',
+    'mpl',
+    'mpm',
+    'mpn',
+    'mpo',
+    'mpp',
+    'mpq',
+    'mpr',
+    'mps',
+    'mpt',
+    'mpu',
+    'mpv',
+    'mpw',
+    'mpx',
+    'mpy',
+    'mpz',
+    'mqa',
+    'mqb',
+    'mqc',
+    'mqe',
+    'mqf',
+    'mqg',
+    'mqh',
+    'mqi',
+    'mqj',
+    'mqk',
+    'mql',
+    'mqm',
+    'mqn',
+    'mqo',
+    'mqp',
+    'mqq',
+    'mqr',
+    'mqs',
+    'mqt',
+    'mqu',
+    'mqv',
+    'mqw',
+    'mqx',
+    'mqy',
+    'mqz',
+    'mra',
+    'mrb',
+    'mrc',
+    'mrd',
+    'mre',
+    'mrf',
+    'mrg',
+    'mrh',
+    'mrj',
+    'mrk',
+    'mrl',
+    'mrm',
+    'mrn',
+    'mro',
+    'mrp',
+    'mrq',
+    'mrr',
+    'mrs',
+    'mrt',
+    'mru',
+    'mrv',
+    'mrw',
+    'mrx',
+    'mry',
+    'mrz',
+    'msb',
+    'msc',
+    'msd',
+    'mse',
+    'msf',
+    'msg',
+    'msh',
+    'msi',
+    'msj',
+    'msk',
+    'msl',
+    'msm',
+    'msn',
+    'mso',
+    'msp',
+    'msq',
+    'msr',
+    'mss',
+    'mst',
+    'msu',
+    'msv',
+    'msw',
+    'msx',
+    'msy',
+    'msz',
+    'mta',
+    'mtb',
+    'mtc',
+    'mtd',
+    'mte',
+    'mtf',
+    'mtg',
+    'mth',
+    'mti',
+    'mtj',
+    'mtk',
+    'mtl',
+    'mtm',
+    'mtn',
+    'mto',
+    'mtp',
+    'mtq',
+    'mtr',
+    'mts',
+    'mtt',
+    'mtu',
+    'mtv',
+    'mtw',
+    'mtx',
+    'mty',
+    'mua',
+    'mub',
+    'muc',
+    'mud',
+    'mue',
+    'mug',
+    'muh',
+    'mui',
+    'muj',
+    'muk',
+    'mul',
+    'mum',
+    'mun',
+    'muo',
+    'mup',
+    'muq',
+    'mur',
+    'mus',
+    'mut',
+    'muu',
+    'muv',
+    'mux',
+    'muy',
+    'muz',
+    'mva',
+    'mvb',
+    'mvd',
+    'mve',
+    'mvf',
+    'mvg',
+    'mvh',
+    'mvi',
+    'mvk',
+    'mvl',
+    'mvm',
+    'mvn',
+    'mvo',
+    'mvp',
+    'mvq',
+    'mvr',
+    'mvs',
+    'mvt',
+    'mvu',
+    'mvv',
+    'mvw',
+    'mvx',
+    'mvy',
+    'mvz',
+    'mwa',
+    'mwb',
+    'mwc',
+    'mwd',
+    'mwe',
+    'mwf',
+    'mwg',
+    'mwh',
+    'mwi',
+    'mwj',
+    'mwk',
+    'mwl',
+    'mwm',
+    'mwn',
+    'mwo',
+    'mwp',
+    'mwq',
+    'mwr',
+    'mws',
+    'mwt',
+    'mwu',
+    'mwv',
+    'mww',
+    'mwx',
+    'mwy',
+    'mwz',
+    'mxa',
+    'mxb',
+    'mxc',
+    'mxd',
+    'mxe',
+    'mxf',
+    'mxg',
+    'mxh',
+    'mxi',
+    'mxj',
+    'mxk',
+    'mxl',
+    'mxm',
+    'mxn',
+    'mxo',
+    'mxp',
+    'mxq',
+    'mxr',
+    'mxs',
+    'mxt',
+    'mxu',
+    'mxv',
+    'mxw',
+    'mxx',
+    'mxy',
+    'mxz',
+    'myb',
+    'myc',
+    'myd',
+    'mye',
+    'myf',
+    'myg',
+    'myh',
+    'myi',
+    'myj',
+    'myk',
+    'myl',
+    'mym',
+    'myn',
+    'myo',
+    'myp',
+    'myq',
+    'myr',
+    'mys',
+    'myt',
+    'myu',
+    'myv',
+    'myw',
+    'myx',
+    'myy',
+    'myz',
+    'mza',
+    'mzb',
+    'mzc',
+    'mzd',
+    'mze',
+    'mzg',
+    'mzh',
+    'mzi',
+    'mzj',
+    'mzk',
+    'mzl',
+    'mzm',
+    'mzn',
+    'mzo',
+    'mzp',
+    'mzq',
+    'mzr',
+    'mzs',
+    'mzt',
+    'mzu',
+    'mzv',
+    'mzw',
+    'mzx',
+    'mzy',
+    'mzz',
+    'naa',
+    'nab',
+    'nac',
+    'nad',
+    'nae',
+    'naf',
+    'nag',
+    'nah',
+    'nai',
+    'naj',
+    'nak',
+    'nal',
+    'nam',
+    'nan',
+    'nao',
+    'nap',
+    'naq',
+    'nar',
+    'nas',
+    'nat',
+    'naw',
+    'nax',
+    'nay',
+    'naz',
+    'nba',
+    'nbb',
+    'nbc',
+    'nbd',
+    'nbe',
+    'nbf',
+    'nbg',
+    'nbh',
+    'nbi',
+    'nbj',
+    'nbk',
+    'nbm',
+    'nbn',
+    'nbo',
+    'nbp',
+    'nbq',
+    'nbr',
+    'nbs',
+    'nbt',
+    'nbu',
+    'nbv',
+    'nbw',
+    'nbx',
+    'nby',
+    'nca',
+    'ncb',
+    'ncc',
+    'ncd',
+    'nce',
+    'ncf',
+    'ncg',
+    'nch',
+    'nci',
+    'ncj',
+    'nck',
+    'ncl',
+    'ncm',
+    'ncn',
+    'nco',
+    'ncp',
+    'ncq',
+    'ncr',
+    'ncs',
+    'nct',
+    'ncu',
+    'ncx',
+    'ncz',
+    'nda',
+    'ndb',
+    'ndc',
+    'ndd',
+    'ndf',
+    'ndg',
+    'ndh',
+    'ndi',
+    'ndj',
+    'ndk',
+    'ndl',
+    'ndm',
+    'ndn',
+    'ndp',
+    'ndq',
+    'ndr',
+    'nds',
+    'ndt',
+    'ndu',
+    'ndv',
+    'ndw',
+    'ndx',
+    'ndy',
+    'ndz',
+    'nea',
+    'neb',
+    'nec',
+    'ned',
+    'nee',
+    'nef',
+    'neg',
+    'neh',
+    'nei',
+    'nej',
+    'nek',
+    'nem',
+    'nen',
+    'neo',
+    'neq',
+    'ner',
+    'nes',
+    'net',
+    'neu',
+    'nev',
+    'new',
+    'nex',
+    'ney',
+    'nez',
+    'nfa',
+    'nfd',
+    'nfl',
+    'nfr',
+    'nfu',
+    'nga',
+    'ngb',
+    'ngc',
+    'ngd',
+    'nge',
+    'ngf',
+    'ngg',
+    'ngh',
+    'ngi',
+    'ngj',
+    'ngk',
+    'ngl',
+    'ngm',
+    'ngn',
+    'ngo',
+    'ngp',
+    'ngq',
+    'ngr',
+    'ngs',
+    'ngt',
+    'ngu',
+    'ngv',
+    'ngw',
+    'ngx',
+    'ngy',
+    'ngz',
+    'nha',
+    'nhb',
+    'nhc',
+    'nhd',
+    'nhe',
+    'nhf',
+    'nhg',
+    'nhh',
+    'nhi',
+    'nhk',
+    'nhm',
+    'nhn',
+    'nho',
+    'nhp',
+    'nhq',
+    'nhr',
+    'nht',
+    'nhu',
+    'nhv',
+    'nhw',
+    'nhx',
+    'nhy',
+    'nhz',
+    'nia',
+    'nib',
+    'nic',
+    'nid',
+    'nie',
+    'nif',
+    'nig',
+    'nih',
+    'nii',
+    'nij',
+    'nik',
+    'nil',
+    'nim',
+    'nin',
+    'nio',
+    'niq',
+    'nir',
+    'nis',
+    'nit',
+    'niu',
+    'niv',
+    'niw',
+    'nix',
+    'niy',
+    'niz',
+    'nja',
+    'njb',
+    'njd',
+    'njh',
+    'nji',
+    'njj',
+    'njl',
+    'njm',
+    'njn',
+    'njo',
+    'njr',
+    'njs',
+    'njt',
+    'nju',
+    'njx',
+    'njy',
+    'njz',
+    'nka',
+    'nkb',
+    'nkc',
+    'nkd',
+    'nke',
+    'nkf',
+    'nkg',
+    'nkh',
+    'nki',
+    'nkj',
+    'nkk',
+    'nkm',
+    'nkn',
+    'nko',
+    'nkp',
+    'nkq',
+    'nkr',
+    'nks',
+    'nkt',
+    'nku',
+    'nkv',
+    'nkw',
+    'nkx',
+    'nkz',
+    'nla',
+    'nlc',
+    'nle',
+    'nlg',
+    'nli',
+    'nlj',
+    'nlk',
+    'nll',
+    'nlm',
+    'nln',
+    'nlo',
+    'nlq',
+    'nlr',
+    'nlu',
+    'nlv',
+    'nlw',
+    'nlx',
+    'nly',
+    'nlz',
+    'nma',
+    'nmb',
+    'nmc',
+    'nmd',
+    'nme',
+    'nmf',
+    'nmg',
+    'nmh',
+    'nmi',
+    'nmj',
+    'nmk',
+    'nml',
+    'nmm',
+    'nmn',
+    'nmo',
+    'nmp',
+    'nmq',
+    'nmr',
+    'nms',
+    'nmt',
+    'nmu',
+    'nmv',
+    'nmw',
+    'nmx',
+    'nmy',
+    'nmz',
+    'nna',
+    'nnb',
+    'nnc',
+    'nnd',
+    'nne',
+    'nnf',
+    'nng',
+    'nnh',
+    'nni',
+    'nnj',
+    'nnk',
+    'nnl',
+    'nnm',
+    'nnn',
+    'nnp',
+    'nnq',
+    'nnr',
+    'nns',
+    'nnt',
+    'nnu',
+    'nnv',
+    'nnw',
+    'nnx',
+    'nny',
+    'nnz',
+    'noa',
+    'noc',
+    'nod',
+    'noe',
+    'nof',
+    'nog',
+    'noh',
+    'noi',
+    'noj',
+    'nok',
+    'nol',
+    'nom',
+    'non',
+    'noo',
+    'nop',
+    'noq',
+    'nos',
+    'not',
+    'nou',
+    'nov',
+    'now',
+    'noy',
+    'noz',
+    'npa',
+    'npb',
+    'npg',
+    'nph',
+    'npi',
+    'npl',
+    'npn',
+    'npo',
+    'nps',
+    'npu',
+    'npx',
+    'npy',
+    'nqg',
+    'nqk',
+    'nql',
+    'nqm',
+    'nqn',
+    'nqo',
+    'nqq',
+    'nqy',
+    'nra',
+    'nrb',
+    'nrc',
+    'nre',
+    'nrf',
+    'nrg',
+    'nri',
+    'nrk',
+    'nrl',
+    'nrm',
+    'nrn',
+    'nrp',
+    'nrr',
+    'nrt',
+    'nru',
+    'nrx',
+    'nrz',
+    'nsa',
+    'nsc',
+    'nsd',
+    'nse',
+    'nsf',
+    'nsg',
+    'nsh',
+    'nsi',
+    'nsk',
+    'nsl',
+    'nsm',
+    'nsn',
+    'nso',
+    'nsp',
+    'nsq',
+    'nsr',
+    'nss',
+    'nst',
+    'nsu',
+    'nsv',
+    'nsw',
+    'nsx',
+    'nsy',
+    'nsz',
+    'ntd',
+    'nte',
+    'ntg',
+    'nti',
+    'ntj',
+    'ntk',
+    'ntm',
+    'nto',
+    'ntp',
+    'ntr',
+    'nts',
+    'ntu',
+    'ntw',
+    'ntx',
+    'nty',
+    'ntz',
+    'nua',
+    'nub',
+    'nuc',
+    'nud',
+    'nue',
+    'nuf',
+    'nug',
+    'nuh',
+    'nui',
+    'nuj',
+    'nuk',
+    'nul',
+    'num',
+    'nun',
+    'nuo',
+    'nup',
+    'nuq',
+    'nur',
+    'nus',
+    'nut',
+    'nuu',
+    'nuv',
+    'nuw',
+    'nux',
+    'nuy',
+    'nuz',
+    'nvh',
+    'nvm',
+    'nvo',
+    'nwa',
+    'nwb',
+    'nwc',
+    'nwe',
+    'nwg',
+    'nwi',
+    'nwm',
+    'nwo',
+    'nwr',
+    'nwx',
+    'nwy',
+    'nxa',
+    'nxd',
+    'nxe',
+    'nxg',
+    'nxi',
+    'nxk',
+    'nxl',
+    'nxm',
+    'nxn',
+    'nxo',
+    'nxq',
+    'nxr',
+    'nxu',
+    'nxx',
+    'nyb',
+    'nyc',
+    'nyd',
+    'nye',
+    'nyf',
+    'nyg',
+    'nyh',
+    'nyi',
+    'nyj',
+    'nyk',
+    'nyl',
+    'nym',
+    'nyn',
+    'nyo',
+    'nyp',
+    'nyq',
+    'nyr',
+    'nys',
+    'nyt',
+    'nyu',
+    'nyv',
+    'nyw',
+    'nyx',
+    'nyy',
+    'nza',
+    'nzb',
+    'nzd',
+    'nzi',
+    'nzk',
+    'nzm',
+    'nzs',
+    'nzu',
+    'nzy',
+    'nzz',
+    'oaa',
+    'oac',
+    'oar',
+    'oav',
+    'obi',
+    'obk',
+    'obl',
+    'obm',
+    'obo',
+    'obr',
+    'obt',
+    'obu',
+    'oca',
+    'och',
+    'oco',
+    'ocu',
+    'oda',
+    'odk',
+    'odt',
+    'odu',
+    'ofo',
+    'ofs',
+    'ofu',
+    'ogb',
+    'ogc',
+    'oge',
+    'ogg',
+    'ogo',
+    'ogu',
+    'oht',
+    'ohu',
+    'oia',
+    'oin',
+    'ojb',
+    'ojc',
+    'ojg',
+    'ojp',
+    'ojs',
+    'ojv',
+    'ojw',
+    'oka',
+    'okb',
+    'okd',
+    'oke',
+    'okg',
+    'okh',
+    'oki',
+    'okj',
+    'okk',
+    'okl',
+    'okm',
+    'okn',
+    'oko',
+    'okr',
+    'oks',
+    'oku',
+    'okv',
+    'okx',
+    'ola',
+    'old',
+    'ole',
+    'olk',
+    'olm',
+    'olo',
+    'olr',
+    'olt',
+    'olu',
+    'oma',
+    'omb',
+    'omc',
+    'ome',
+    'omg',
+    'omi',
+    'omk',
+    'oml',
+    'omn',
+    'omo',
+    'omp',
+    'omq',
+    'omr',
+    'omt',
+    'omu',
+    'omv',
+    'omw',
+    'omx',
+    'ona',
+    'onb',
+    'one',
+    'ong',
+    'oni',
+    'onj',
+    'onk',
+    'onn',
+    'ono',
+    'onp',
+    'onr',
+    'ons',
+    'ont',
+    'onu',
+    'onw',
+    'onx',
+    'ood',
+    'oog',
+    'oon',
+    'oor',
+    'oos',
+    'opa',
+    'opk',
+    'opm',
+    'opo',
+    'opt',
+    'opy',
+    'ora',
+    'orc',
+    'ore',
+    'org',
+    'orh',
+    'orn',
+    'oro',
+    'orr',
+    'ors',
+    'ort',
+    'oru',
+    'orv',
+    'orw',
+    'orx',
+    'ory',
+    'orz',
+    'osa',
+    'osc',
+    'osi',
+    'oso',
+    'osp',
+    'ost',
+    'osu',
+    'osx',
+    'ota',
+    'otb',
+    'otd',
+    'ote',
+    'oti',
+    'otk',
+    'otl',
+    'otm',
+    'otn',
+    'oto',
+    'otq',
+    'otr',
+    'ots',
+    'ott',
+    'otu',
+    'otw',
+    'otx',
+    'oty',
+    'otz',
+    'oua',
+    'oub',
+    'oue',
+    'oui',
+    'oum',
+    'oun',
+    'ovd',
+    'owi',
+    'owl',
+    'oyb',
+    'oyd',
+    'oym',
+    'oyy',
+    'ozm',
+    'paa',
+    'pab',
+    'pac',
+    'pad',
+    'pae',
+    'paf',
+    'pag',
+    'pah',
+    'pai',
+    'pak',
+    'pal',
+    'pam',
+    'pao',
+    'pap',
+    'paq',
+    'par',
+    'pas',
+    'pat',
+    'pau',
+    'pav',
+    'paw',
+    'pax',
+    'pay',
+    'paz',
+    'pbb',
+    'pbc',
+    'pbe',
+    'pbf',
+    'pbg',
+    'pbh',
+    'pbi',
+    'pbl',
+    'pbm',
+    'pbn',
+    'pbo',
+    'pbp',
+    'pbr',
+    'pbs',
+    'pbt',
+    'pbu',
+    'pbv',
+    'pby',
+    'pbz',
+    'pca',
+    'pcb',
+    'pcc',
+    'pcd',
+    'pce',
+    'pcf',
+    'pcg',
+    'pch',
+    'pci',
+    'pcj',
+    'pck',
+    'pcl',
+    'pcm',
+    'pcn',
+    'pcp',
+    'pcr',
+    'pcw',
+    'pda',
+    'pdc',
+    'pdi',
+    'pdn',
+    'pdo',
+    'pdt',
+    'pdu',
+    'pea',
+    'peb',
+    'ped',
+    'pee',
+    'pef',
+    'peg',
+    'peh',
+    'pei',
+    'pej',
+    'pek',
+    'pel',
+    'pem',
+    'peo',
+    'pep',
+    'peq',
+    'pes',
+    'pev',
+    'pex',
+    'pey',
+    'pez',
+    'pfa',
+    'pfe',
+    'pfl',
+    'pga',
+    'pgd',
+    'pgg',
+    'pgi',
+    'pgk',
+    'pgl',
+    'pgn',
+    'pgs',
+    'pgu',
+    'pgy',
+    'pgz',
+    'pha',
+    'phd',
+    'phg',
+    'phh',
+    'phi',
+    'phk',
+    'phl',
+    'phm',
+    'phn',
+    'pho',
+    'phq',
+    'phr',
+    'pht',
+    'phu',
+    'phv',
+    'phw',
+    'pia',
+    'pib',
+    'pic',
+    'pid',
+    'pie',
+    'pif',
+    'pig',
+    'pih',
+    'pii',
+    'pij',
+    'pil',
+    'pim',
+    'pin',
+    'pio',
+    'pip',
+    'pir',
+    'pis',
+    'pit',
+    'piu',
+    'piv',
+    'piw',
+    'pix',
+    'piy',
+    'piz',
+    'pjt',
+    'pka',
+    'pkb',
+    'pkc',
+    'pkg',
+    'pkh',
+    'pkn',
+    'pko',
+    'pkp',
+    'pkr',
+    'pks',
+    'pkt',
+    'pku',
+    'pla',
+    'plb',
+    'plc',
+    'pld',
+    'ple',
+    'plf',
+    'plg',
+    'plh',
+    'plj',
+    'plk',
+    'pll',
+    'pln',
+    'plo',
+    'plp',
+    'plq',
+    'plr',
+    'pls',
+    'plt',
+    'plu',
+    'plv',
+    'plw',
+    'ply',
+    'plz',
+    'pma',
+    'pmb',
+    'pmc',
+    'pmd',
+    'pme',
+    'pmf',
+    'pmh',
+    'pmi',
+    'pmj',
+    'pmk',
+    'pml',
+    'pmm',
+    'pmn',
+    'pmo',
+    'pmq',
+    'pmr',
+    'pms',
+    'pmt',
+    'pmu',
+    'pmw',
+    'pmx',
+    'pmy',
+    'pmz',
+    'pna',
+    'pnb',
+    'pnc',
+    'pne',
+    'png',
+    'pnh',
+    'pni',
+    'pnj',
+    'pnk',
+    'pnl',
+    'pnm',
+    'pnn',
+    'pno',
+    'pnp',
+    'pnq',
+    'pnr',
+    'pns',
+    'pnt',
+    'pnu',
+    'pnv',
+    'pnw',
+    'pnx',
+    'pny',
+    'pnz',
+    'poc',
+    'pod',
+    'poe',
+    'pof',
+    'pog',
+    'poh',
+    'poi',
+    'pok',
+    'pom',
+    'pon',
+    'poo',
+    'pop',
+    'poq',
+    'pos',
+    'pot',
+    'pov',
+    'pow',
+    'pox',
+    'poy',
+    'poz',
+    'ppa',
+    'ppe',
+    'ppi',
+    'ppk',
+    'ppl',
+    'ppm',
+    'ppn',
+    'ppo',
+    'ppp',
+    'ppq',
+    'ppr',
+    'pps',
+    'ppt',
+    'ppu',
+    'pqa',
+    'pqe',
+    'pqm',
+    'pqw',
+    'pra',
+    'prb',
+    'prc',
+    'prd',
+    'pre',
+    'prf',
+    'prg',
+    'prh',
+    'pri',
+    'prk',
+    'prl',
+    'prm',
+    'prn',
+    'pro',
+    'prp',
+    'prq',
+    'prr',
+    'prs',
+    'prt',
+    'pru',
+    'prw',
+    'prx',
+    'pry',
+    'prz',
+    'psa',
+    'psc',
+    'psd',
+    'pse',
+    'psg',
+    'psh',
+    'psi',
+    'psl',
+    'psm',
+    'psn',
+    'pso',
+    'psp',
+    'psq',
+    'psr',
+    'pss',
+    'pst',
+    'psu',
+    'psw',
+    'psy',
+    'pta',
+    'pth',
+    'pti',
+    'ptn',
+    'pto',
+    'ptp',
+    'ptq',
+    'ptr',
+    'ptt',
+    'ptu',
+    'ptv',
+    'ptw',
+    'pty',
+    'pua',
+    'pub',
+    'puc',
+    'pud',
+    'pue',
+    'puf',
+    'pug',
+    'pui',
+    'puj',
+    'puk',
+    'pum',
+    'puo',
+    'pup',
+    'puq',
+    'pur',
+    'put',
+    'puu',
+    'puw',
+    'pux',
+    'puy',
+    'puz',
+    'pwa',
+    'pwb',
+    'pwg',
+    'pwi',
+    'pwm',
+    'pwn',
+    'pwo',
+    'pwr',
+    'pww',
+    'pxm',
+    'pye',
+    'pym',
+    'pyn',
+    'pys',
+    'pyu',
+    'pyx',
+    'pyy',
+    'pzn',
+    'qaa..qtz',
+    'qua',
+    'qub',
+    'quc',
+    'qud',
+    'quf',
+    'qug',
+    'quh',
+    'qui',
+    'quk',
+    'qul',
+    'qum',
+    'qun',
+    'qup',
+    'quq',
+    'qur',
+    'qus',
+    'quv',
+    'quw',
+    'qux',
+    'quy',
+    'quz',
+    'qva',
+    'qvc',
+    'qve',
+    'qvh',
+    'qvi',
+    'qvj',
+    'qvl',
+    'qvm',
+    'qvn',
+    'qvo',
+    'qvp',
+    'qvs',
+    'qvw',
+    'qvy',
+    'qvz',
+    'qwa',
+    'qwc',
+    'qwe',
+    'qwh',
+    'qwm',
+    'qws',
+    'qwt',
+    'qxa',
+    'qxc',
+    'qxh',
+    'qxl',
+    'qxn',
+    'qxo',
+    'qxp',
+    'qxq',
+    'qxr',
+    'qxs',
+    'qxt',
+    'qxu',
+    'qxw',
+    'qya',
+    'qyp',
+    'raa',
+    'rab',
+    'rac',
+    'rad',
+    'raf',
+    'rag',
+    'rah',
+    'rai',
+    'raj',
+    'rak',
+    'ral',
+    'ram',
+    'ran',
+    'rao',
+    'rap',
+    'raq',
+    'rar',
+    'ras',
+    'rat',
+    'rau',
+    'rav',
+    'raw',
+    'rax',
+    'ray',
+    'raz',
+    'rbb',
+    'rbk',
+    'rbl',
+    'rbp',
+    'rcf',
+    'rdb',
+    'rea',
+    'reb',
+    'ree',
+    'reg',
+    'rei',
+    'rej',
+    'rel',
+    'rem',
+    'ren',
+    'rer',
+    'res',
+    'ret',
+    'rey',
+    'rga',
+    'rge',
+    'rgk',
+    'rgn',
+    'rgr',
+    'rgs',
+    'rgu',
+    'rhg',
+    'rhp',
+    'ria',
+    'rie',
+    'rif',
+    'ril',
+    'rim',
+    'rin',
+    'rir',
+    'rit',
+    'riu',
+    'rjg',
+    'rji',
+    'rjs',
+    'rka',
+    'rkb',
+    'rkh',
+    'rki',
+    'rkm',
+    'rkt',
+    'rkw',
+    'rma',
+    'rmb',
+    'rmc',
+    'rmd',
+    'rme',
+    'rmf',
+    'rmg',
+    'rmh',
+    'rmi',
+    'rmk',
+    'rml',
+    'rmm',
+    'rmn',
+    'rmo',
+    'rmp',
+    'rmq',
+    'rmr',
+    'rms',
+    'rmt',
+    'rmu',
+    'rmv',
+    'rmw',
+    'rmx',
+    'rmy',
+    'rmz',
+    'rna',
+    'rnd',
+    'rng',
+    'rnl',
+    'rnn',
+    'rnp',
+    'rnr',
+    'rnw',
+    'roa',
+    'rob',
+    'roc',
+    'rod',
+    'roe',
+    'rof',
+    'rog',
+    'rol',
+    'rom',
+    'roo',
+    'rop',
+    'ror',
+    'rou',
+    'row',
+    'rpn',
+    'rpt',
+    'rri',
+    'rro',
+    'rrt',
+    'rsb',
+    'rsi',
+    'rsl',
+    'rsm',
+    'rtc',
+    'rth',
+    'rtm',
+    'rts',
+    'rtw',
+    'rub',
+    'ruc',
+    'rue',
+    'ruf',
+    'rug',
+    'ruh',
+    'rui',
+    'ruk',
+    'ruo',
+    'rup',
+    'ruq',
+    'rut',
+    'ruu',
+    'ruy',
+    'ruz',
+    'rwa',
+    'rwk',
+    'rwm',
+    'rwo',
+    'rwr',
+    'rxd',
+    'rxw',
+    'ryn',
+    'rys',
+    'ryu',
+    'rzh',
+    'saa',
+    'sab',
+    'sac',
+    'sad',
+    'sae',
+    'saf',
+    'sah',
+    'sai',
+    'saj',
+    'sak',
+    'sal',
+    'sam',
+    'sao',
+    'sap',
+    'saq',
+    'sar',
+    'sas',
+    'sat',
+    'sau',
+    'sav',
+    'saw',
+    'sax',
+    'say',
+    'saz',
+    'sba',
+    'sbb',
+    'sbc',
+    'sbd',
+    'sbe',
+    'sbf',
+    'sbg',
+    'sbh',
+    'sbi',
+    'sbj',
+    'sbk',
+    'sbl',
+    'sbm',
+    'sbn',
+    'sbo',
+    'sbp',
+    'sbq',
+    'sbr',
+    'sbs',
+    'sbt',
+    'sbu',
+    'sbv',
+    'sbw',
+    'sbx',
+    'sby',
+    'sbz',
+    'sca',
+    'scb',
+    'sce',
+    'scf',
+    'scg',
+    'sch',
+    'sci',
+    'sck',
+    'scl',
+    'scn',
+    'sco',
+    'scp',
+    'scq',
+    'scs',
+    'sct',
+    'scu',
+    'scv',
+    'scw',
+    'scx',
+    'sda',
+    'sdb',
+    'sdc',
+    'sde',
+    'sdf',
+    'sdg',
+    'sdh',
+    'sdj',
+    'sdk',
+    'sdl',
+    'sdm',
+    'sdn',
+    'sdo',
+    'sdp',
+    'sdr',
+    'sds',
+    'sdt',
+    'sdu',
+    'sdv',
+    'sdx',
+    'sdz',
+    'sea',
+    'seb',
+    'sec',
+    'sed',
+    'see',
+    'sef',
+    'seg',
+    'seh',
+    'sei',
+    'sej',
+    'sek',
+    'sel',
+    'sem',
+    'sen',
+    'seo',
+    'sep',
+    'seq',
+    'ser',
+    'ses',
+    'set',
+    'seu',
+    'sev',
+    'sew',
+    'sey',
+    'sez',
+    'sfb',
+    'sfe',
+    'sfm',
+    'sfs',
+    'sfw',
+    'sga',
+    'sgb',
+    'sgc',
+    'sgd',
+    'sge',
+    'sgg',
+    'sgh',
+    'sgi',
+    'sgj',
+    'sgk',
+    'sgl',
+    'sgm',
+    'sgn',
+    'sgo',
+    'sgp',
+    'sgr',
+    'sgs',
+    'sgt',
+    'sgu',
+    'sgw',
+    'sgx',
+    'sgy',
+    'sgz',
+    'sha',
+    'shb',
+    'shc',
+    'shd',
+    'she',
+    'shg',
+    'shh',
+    'shi',
+    'shj',
+    'shk',
+    'shl',
+    'shm',
+    'shn',
+    'sho',
+    'shp',
+    'shq',
+    'shr',
+    'shs',
+    'sht',
+    'shu',
+    'shv',
+    'shw',
+    'shx',
+    'shy',
+    'shz',
+    'sia',
+    'sib',
+    'sid',
+    'sie',
+    'sif',
+    'sig',
+    'sih',
+    'sii',
+    'sij',
+    'sik',
+    'sil',
+    'sim',
+    'sio',
+    'sip',
+    'siq',
+    'sir',
+    'sis',
+    'sit',
+    'siu',
+    'siv',
+    'siw',
+    'six',
+    'siy',
+    'siz',
+    'sja',
+    'sjb',
+    'sjd',
+    'sje',
+    'sjg',
+    'sjk',
+    'sjl',
+    'sjm',
+    'sjn',
+    'sjo',
+    'sjp',
+    'sjr',
+    'sjs',
+    'sjt',
+    'sju',
+    'sjw',
+    'ska',
+    'skb',
+    'skc',
+    'skd',
+    'ske',
+    'skf',
+    'skg',
+    'skh',
+    'ski',
+    'skj',
+    'skk',
+    'skm',
+    'skn',
+    'sko',
+    'skp',
+    'skq',
+    'skr',
+    'sks',
+    'skt',
+    'sku',
+    'skv',
+    'skw',
+    'skx',
+    'sky',
+    'skz',
+    'sla',
+    'slc',
+    'sld',
+    'sle',
+    'slf',
+    'slg',
+    'slh',
+    'sli',
+    'slj',
+    'sll',
+    'slm',
+    'sln',
+    'slp',
+    'slq',
+    'slr',
+    'sls',
+    'slt',
+    'slu',
+    'slw',
+    'slx',
+    'sly',
+    'slz',
+    'sma',
+    'smb',
+    'smc',
+    'smd',
+    'smf',
+    'smg',
+    'smh',
+    'smi',
+    'smj',
+    'smk',
+    'sml',
+    'smm',
+    'smn',
+    'smp',
+    'smq',
+    'smr',
+    'sms',
+    'smt',
+    'smu',
+    'smv',
+    'smw',
+    'smx',
+    'smy',
+    'smz',
+    'snb',
+    'snc',
+    'sne',
+    'snf',
+    'sng',
+    'snh',
+    'sni',
+    'snj',
+    'snk',
+    'snl',
+    'snm',
+    'snn',
+    'sno',
+    'snp',
+    'snq',
+    'snr',
+    'sns',
+    'snu',
+    'snv',
+    'snw',
+    'snx',
+    'sny',
+    'snz',
+    'soa',
+    'sob',
+    'soc',
+    'sod',
+    'soe',
+    'sog',
+    'soh',
+    'soi',
+    'soj',
+    'sok',
+    'sol',
+    'son',
+    'soo',
+    'sop',
+    'soq',
+    'sor',
+    'sos',
+    'sou',
+    'sov',
+    'sow',
+    'sox',
+    'soy',
+    'soz',
+    'spb',
+    'spc',
+    'spd',
+    'spe',
+    'spg',
+    'spi',
+    'spk',
+    'spl',
+    'spm',
+    'spn',
+    'spo',
+    'spp',
+    'spq',
+    'spr',
+    'sps',
+    'spt',
+    'spu',
+    'spv',
+    'spx',
+    'spy',
+    'sqa',
+    'sqh',
+    'sqj',
+    'sqk',
+    'sqm',
+    'sqn',
+    'sqo',
+    'sqq',
+    'sqr',
+    'sqs',
+    'sqt',
+    'squ',
+    'sra',
+    'srb',
+    'src',
+    'sre',
+    'srf',
+    'srg',
+    'srh',
+    'sri',
+    'srk',
+    'srl',
+    'srm',
+    'srn',
+    'sro',
+    'srq',
+    'srr',
+    'srs',
+    'srt',
+    'sru',
+    'srv',
+    'srw',
+    'srx',
+    'sry',
+    'srz',
+    'ssa',
+    'ssb',
+    'ssc',
+    'ssd',
+    'sse',
+    'ssf',
+    'ssg',
+    'ssh',
+    'ssi',
+    'ssj',
+    'ssk',
+    'ssl',
+    'ssm',
+    'ssn',
+    'sso',
+    'ssp',
+    'ssq',
+    'ssr',
+    'sss',
+    'sst',
+    'ssu',
+    'ssv',
+    'ssx',
+    'ssy',
+    'ssz',
+    'sta',
+    'stb',
+    'std',
+    'ste',
+    'stf',
+    'stg',
+    'sth',
+    'sti',
+    'stj',
+    'stk',
+    'stl',
+    'stm',
+    'stn',
+    'sto',
+    'stp',
+    'stq',
+    'str',
+    'sts',
+    'stt',
+    'stu',
+    'stv',
+    'stw',
+    'sty',
+    'sua',
+    'sub',
+    'suc',
+    'sue',
+    'sug',
+    'sui',
+    'suj',
+    'suk',
+    'sul',
+    'sum',
+    'suq',
+    'sur',
+    'sus',
+    'sut',
+    'suv',
+    'suw',
+    'sux',
+    'suy',
+    'suz',
+    'sva',
+    'svb',
+    'svc',
+    'sve',
+    'svk',
+    'svm',
+    'svr',
+    'svs',
+    'svx',
+    'swb',
+    'swc',
+    'swf',
+    'swg',
+    'swh',
+    'swi',
+    'swj',
+    'swk',
+    'swl',
+    'swm',
+    'swn',
+    'swo',
+    'swp',
+    'swq',
+    'swr',
+    'sws',
+    'swt',
+    'swu',
+    'swv',
+    'sww',
+    'swx',
+    'swy',
+    'sxb',
+    'sxc',
+    'sxe',
+    'sxg',
+    'sxk',
+    'sxl',
+    'sxm',
+    'sxn',
+    'sxo',
+    'sxr',
+    'sxs',
+    'sxu',
+    'sxw',
+    'sya',
+    'syb',
+    'syc',
+    'syd',
+    'syi',
+    'syk',
+    'syl',
+    'sym',
+    'syn',
+    'syo',
+    'syr',
+    'sys',
+    'syw',
+    'syx',
+    'syy',
+    'sza',
+    'szb',
+    'szc',
+    'szd',
+    'sze',
+    'szg',
+    'szl',
+    'szn',
+    'szp',
+    'szs',
+    'szv',
+    'szw',
+    'taa',
+    'tab',
+    'tac',
+    'tad',
+    'tae',
+    'taf',
+    'tag',
+    'tai',
+    'taj',
+    'tak',
+    'tal',
+    'tan',
+    'tao',
+    'tap',
+    'taq',
+    'tar',
+    'tas',
+    'tau',
+    'tav',
+    'taw',
+    'tax',
+    'tay',
+    'taz',
+    'tba',
+    'tbb',
+    'tbc',
+    'tbd',
+    'tbe',
+    'tbf',
+    'tbg',
+    'tbh',
+    'tbi',
+    'tbj',
+    'tbk',
+    'tbl',
+    'tbm',
+    'tbn',
+    'tbo',
+    'tbp',
+    'tbq',
+    'tbr',
+    'tbs',
+    'tbt',
+    'tbu',
+    'tbv',
+    'tbw',
+    'tbx',
+    'tby',
+    'tbz',
+    'tca',
+    'tcb',
+    'tcc',
+    'tcd',
+    'tce',
+    'tcf',
+    'tcg',
+    'tch',
+    'tci',
+    'tck',
+    'tcl',
+    'tcm',
+    'tcn',
+    'tco',
+    'tcp',
+    'tcq',
+    'tcs',
+    'tct',
+    'tcu',
+    'tcw',
+    'tcx',
+    'tcy',
+    'tcz',
+    'tda',
+    'tdb',
+    'tdc',
+    'tdd',
+    'tde',
+    'tdf',
+    'tdg',
+    'tdh',
+    'tdi',
+    'tdj',
+    'tdk',
+    'tdl',
+    'tdm',
+    'tdn',
+    'tdo',
+    'tdq',
+    'tdr',
+    'tds',
+    'tdt',
+    'tdu',
+    'tdv',
+    'tdx',
+    'tdy',
+    'tea',
+    'teb',
+    'tec',
+    'ted',
+    'tee',
+    'tef',
+    'teg',
+    'teh',
+    'tei',
+    'tek',
+    'tem',
+    'ten',
+    'teo',
+    'tep',
+    'teq',
+    'ter',
+    'tes',
+    'tet',
+    'teu',
+    'tev',
+    'tew',
+    'tex',
+    'tey',
+    'tez',
+    'tfi',
+    'tfn',
+    'tfo',
+    'tfr',
+    'tft',
+    'tga',
+    'tgb',
+    'tgc',
+    'tgd',
+    'tge',
+    'tgf',
+    'tgg',
+    'tgh',
+    'tgi',
+    'tgj',
+    'tgn',
+    'tgo',
+    'tgp',
+    'tgq',
+    'tgr',
+    'tgs',
+    'tgt',
+    'tgu',
+    'tgv',
+    'tgw',
+    'tgx',
+    'tgy',
+    'tgz',
+    'thc',
+    'thd',
+    'the',
+    'thf',
+    'thh',
+    'thi',
+    'thk',
+    'thl',
+    'thm',
+    'thn',
+    'thp',
+    'thq',
+    'thr',
+    'ths',
+    'tht',
+    'thu',
+    'thv',
+    'thw',
+    'thx',
+    'thy',
+    'thz',
+    'tia',
+    'tic',
+    'tid',
+    'tie',
+    'tif',
+    'tig',
+    'tih',
+    'tii',
+    'tij',
+    'tik',
+    'til',
+    'tim',
+    'tin',
+    'tio',
+    'tip',
+    'tiq',
+    'tis',
+    'tit',
+    'tiu',
+    'tiv',
+    'tiw',
+    'tix',
+    'tiy',
+    'tiz',
+    'tja',
+    'tjg',
+    'tji',
+    'tjl',
+    'tjm',
+    'tjn',
+    'tjo',
+    'tjs',
+    'tju',
+    'tjw',
+    'tka',
+    'tkb',
+    'tkd',
+    'tke',
+    'tkf',
+    'tkg',
+    'tkk',
+    'tkl',
+    'tkm',
+    'tkn',
+    'tkp',
+    'tkq',
+    'tkr',
+    'tks',
+    'tkt',
+    'tku',
+    'tkv',
+    'tkw',
+    'tkx',
+    'tkz',
+    'tla',
+    'tlb',
+    'tlc',
+    'tld',
+    'tlf',
+    'tlg',
+    'tlh',
+    'tli',
+    'tlj',
+    'tlk',
+    'tll',
+    'tlm',
+    'tln',
+    'tlo',
+    'tlp',
+    'tlq',
+    'tlr',
+    'tls',
+    'tlt',
+    'tlu',
+    'tlv',
+    'tlw',
+    'tlx',
+    'tly',
+    'tma',
+    'tmb',
+    'tmc',
+    'tmd',
+    'tme',
+    'tmf',
+    'tmg',
+    'tmh',
+    'tmi',
+    'tmj',
+    'tmk',
+    'tml',
+    'tmm',
+    'tmn',
+    'tmo',
+    'tmp',
+    'tmq',
+    'tmr',
+    'tms',
+    'tmt',
+    'tmu',
+    'tmv',
+    'tmw',
+    'tmy',
+    'tmz',
+    'tna',
+    'tnb',
+    'tnc',
+    'tnd',
+    'tne',
+    'tnf',
+    'tng',
+    'tnh',
+    'tni',
+    'tnk',
+    'tnl',
+    'tnm',
+    'tnn',
+    'tno',
+    'tnp',
+    'tnq',
+    'tnr',
+    'tns',
+    'tnt',
+    'tnu',
+    'tnv',
+    'tnw',
+    'tnx',
+    'tny',
+    'tnz',
+    'tob',
+    'toc',
+    'tod',
+    'toe',
+    'tof',
+    'tog',
+    'toh',
+    'toi',
+    'toj',
+    'tol',
+    'tom',
+    'too',
+    'top',
+    'toq',
+    'tor',
+    'tos',
+    'tou',
+    'tov',
+    'tow',
+    'tox',
+    'toy',
+    'toz',
+    'tpa',
+    'tpc',
+    'tpe',
+    'tpf',
+    'tpg',
+    'tpi',
+    'tpj',
+    'tpk',
+    'tpl',
+    'tpm',
+    'tpn',
+    'tpo',
+    'tpp',
+    'tpq',
+    'tpr',
+    'tpt',
+    'tpu',
+    'tpv',
+    'tpw',
+    'tpx',
+    'tpy',
+    'tpz',
+    'tqb',
+    'tql',
+    'tqm',
+    'tqn',
+    'tqo',
+    'tqp',
+    'tqq',
+    'tqr',
+    'tqt',
+    'tqu',
+    'tqw',
+    'tra',
+    'trb',
+    'trc',
+    'trd',
+    'tre',
+    'trf',
+    'trg',
+    'trh',
+    'tri',
+    'trj',
+    'trk',
+    'trl',
+    'trm',
+    'trn',
+    'tro',
+    'trp',
+    'trq',
+    'trr',
+    'trs',
+    'trt',
+    'tru',
+    'trv',
+    'trw',
+    'trx',
+    'try',
+    'trz',
+    'tsa',
+    'tsb',
+    'tsc',
+    'tsd',
+    'tse',
+    'tsf',
+    'tsg',
+    'tsh',
+    'tsi',
+    'tsj',
+    'tsk',
+    'tsl',
+    'tsm',
+    'tsp',
+    'tsq',
+    'tsr',
+    'tss',
+    'tst',
+    'tsu',
+    'tsv',
+    'tsw',
+    'tsx',
+    'tsy',
+    'tsz',
+    'tta',
+    'ttb',
+    'ttc',
+    'ttd',
+    'tte',
+    'ttf',
+    'ttg',
+    'tth',
+    'tti',
+    'ttj',
+    'ttk',
+    'ttl',
+    'ttm',
+    'ttn',
+    'tto',
+    'ttp',
+    'ttq',
+    'ttr',
+    'tts',
+    'ttt',
+    'ttu',
+    'ttv',
+    'ttw',
+    'tty',
+    'ttz',
+    'tua',
+    'tub',
+    'tuc',
+    'tud',
+    'tue',
+    'tuf',
+    'tug',
+    'tuh',
+    'tui',
+    'tuj',
+    'tul',
+    'tum',
+    'tun',
+    'tuo',
+    'tup',
+    'tuq',
+    'tus',
+    'tut',
+    'tuu',
+    'tuv',
+    'tuw',
+    'tux',
+    'tuy',
+    'tuz',
+    'tva',
+    'tvd',
+    'tve',
+    'tvk',
+    'tvl',
+    'tvm',
+    'tvn',
+    'tvo',
+    'tvs',
+    'tvt',
+    'tvu',
+    'tvw',
+    'tvy',
+    'twa',
+    'twb',
+    'twc',
+    'twd',
+    'twe',
+    'twf',
+    'twg',
+    'twh',
+    'twl',
+    'twm',
+    'twn',
+    'two',
+    'twp',
+    'twq',
+    'twr',
+    'twt',
+    'twu',
+    'tww',
+    'twx',
+    'twy',
+    'txa',
+    'txb',
+    'txc',
+    'txe',
+    'txg',
+    'txh',
+    'txi',
+    'txj',
+    'txm',
+    'txn',
+    'txo',
+    'txq',
+    'txr',
+    'txs',
+    'txt',
+    'txu',
+    'txx',
+    'txy',
+    'tya',
+    'tye',
+    'tyh',
+    'tyi',
+    'tyj',
+    'tyl',
+    'tyn',
+    'typ',
+    'tyr',
+    'tys',
+    'tyt',
+    'tyu',
+    'tyv',
+    'tyx',
+    'tyz',
+    'tza',
+    'tzh',
+    'tzj',
+    'tzl',
+    'tzm',
+    'tzn',
+    'tzo',
+    'tzx',
+    'uam',
+    'uan',
+    'uar',
+    'uba',
+    'ubi',
+    'ubl',
+    'ubr',
+    'ubu',
+    'uby',
+    'uda',
+    'ude',
+    'udg',
+    'udi',
+    'udj',
+    'udl',
+    'udm',
+    'udu',
+    'ues',
+    'ufi',
+    'uga',
+    'ugb',
+    'uge',
+    'ugn',
+    'ugo',
+    'ugy',
+    'uha',
+    'uhn',
+    'uis',
+    'uiv',
+    'uji',
+    'uka',
+    'ukg',
+    'ukh',
+    'ukk',
+    'ukl',
+    'ukp',
+    'ukq',
+    'uks',
+    'uku',
+    'ukw',
+    'uky',
+    'ula',
+    'ulb',
+    'ulc',
+    'ule',
+    'ulf',
+    'uli',
+    'ulk',
+    'ull',
+    'ulm',
+    'uln',
+    'ulu',
+    'ulw',
+    'uma',
+    'umb',
+    'umc',
+    'umd',
+    'umg',
+    'umi',
+    'umm',
+    'umn',
+    'umo',
+    'ump',
+    'umr',
+    'ums',
+    'umu',
+    'una',
+    'und',
+    'une',
+    'ung',
+    'unk',
+    'unm',
+    'unn',
+    'unp',
+    'unr',
+    'unu',
+    'unx',
+    'unz',
+    'uok',
+    'upi',
+    'upv',
+    'ura',
+    'urb',
+    'urc',
+    'ure',
+    'urf',
+    'urg',
+    'urh',
+    'uri',
+    'urj',
+    'urk',
+    'url',
+    'urm',
+    'urn',
+    'uro',
+    'urp',
+    'urr',
+    'urt',
+    'uru',
+    'urv',
+    'urw',
+    'urx',
+    'ury',
+    'urz',
+    'usa',
+    'ush',
+    'usi',
+    'usk',
+    'usp',
+    'usu',
+    'uta',
+    'ute',
+    'utp',
+    'utr',
+    'utu',
+    'uum',
+    'uun',
+    'uur',
+    'uuu',
+    'uve',
+    'uvh',
+    'uvl',
+    'uwa',
+    'uya',
+    'uzn',
+    'uzs',
+    'vaa',
+    'vae',
+    'vaf',
+    'vag',
+    'vah',
+    'vai',
+    'vaj',
+    'val',
+    'vam',
+    'van',
+    'vao',
+    'vap',
+    'var',
+    'vas',
+    'vau',
+    'vav',
+    'vay',
+    'vbb',
+    'vbk',
+    'vec',
+    'ved',
+    'vel',
+    'vem',
+    'veo',
+    'vep',
+    'ver',
+    'vgr',
+    'vgt',
+    'vic',
+    'vid',
+    'vif',
+    'vig',
+    'vil',
+    'vin',
+    'vis',
+    'vit',
+    'viv',
+    'vka',
+    'vki',
+    'vkj',
+    'vkk',
+    'vkl',
+    'vkm',
+    'vko',
+    'vkp',
+    'vkt',
+    'vku',
+    'vlp',
+    'vls',
+    'vma',
+    'vmb',
+    'vmc',
+    'vmd',
+    'vme',
+    'vmf',
+    'vmg',
+    'vmh',
+    'vmi',
+    'vmj',
+    'vmk',
+    'vml',
+    'vmm',
+    'vmp',
+    'vmq',
+    'vmr',
+    'vms',
+    'vmu',
+    'vmv',
+    'vmw',
+    'vmx',
+    'vmy',
+    'vmz',
+    'vnk',
+    'vnm',
+    'vnp',
+    'vor',
+    'vot',
+    'vra',
+    'vro',
+    'vrs',
+    'vrt',
+    'vsi',
+    'vsl',
+    'vsv',
+    'vto',
+    'vum',
+    'vun',
+    'vut',
+    'vwa',
+    'waa',
+    'wab',
+    'wac',
+    'wad',
+    'wae',
+    'waf',
+    'wag',
+    'wah',
+    'wai',
+    'waj',
+    'wak',
+    'wal',
+    'wam',
+    'wan',
+    'wao',
+    'wap',
+    'waq',
+    'war',
+    'was',
+    'wat',
+    'wau',
+    'wav',
+    'waw',
+    'wax',
+    'way',
+    'waz',
+    'wba',
+    'wbb',
+    'wbe',
+    'wbf',
+    'wbh',
+    'wbi',
+    'wbj',
+    'wbk',
+    'wbl',
+    'wbm',
+    'wbp',
+    'wbq',
+    'wbr',
+    'wbs',
+    'wbt',
+    'wbv',
+    'wbw',
+    'wca',
+    'wci',
+    'wdd',
+    'wdg',
+    'wdj',
+    'wdk',
+    'wdu',
+    'wdy',
+    'wea',
+    'wec',
+    'wed',
+    'weg',
+    'weh',
+    'wei',
+    'wem',
+    'wen',
+    'weo',
+    'wep',
+    'wer',
+    'wes',
+    'wet',
+    'weu',
+    'wew',
+    'wfg',
+    'wga',
+    'wgb',
+    'wgg',
+    'wgi',
+    'wgo',
+    'wgu',
+    'wgw',
+    'wgy',
+    'wha',
+    'whg',
+    'whk',
+    'whu',
+    'wib',
+    'wic',
+    'wie',
+    'wif',
+    'wig',
+    'wih',
+    'wii',
+    'wij',
+    'wik',
+    'wil',
+    'wim',
+    'win',
+    'wir',
+    'wit',
+    'wiu',
+    'wiv',
+    'wiw',
+    'wiy',
+    'wja',
+    'wji',
+    'wka',
+    'wkb',
+    'wkd',
+    'wkl',
+    'wku',
+    'wkw',
+    'wky',
+    'wla',
+    'wlc',
+    'wle',
+    'wlg',
+    'wli',
+    'wlk',
+    'wll',
+    'wlm',
+    'wlo',
+    'wlr',
+    'wls',
+    'wlu',
+    'wlv',
+    'wlw',
+    'wlx',
+    'wly',
+    'wma',
+    'wmb',
+    'wmc',
+    'wmd',
+    'wme',
+    'wmh',
+    'wmi',
+    'wmm',
+    'wmn',
+    'wmo',
+    'wms',
+    'wmt',
+    'wmw',
+    'wmx',
+    'wnb',
+    'wnc',
+    'wnd',
+    'wne',
+    'wng',
+    'wni',
+    'wnk',
+    'wnm',
+    'wnn',
+    'wno',
+    'wnp',
+    'wnu',
+    'wnw',
+    'wny',
+    'woa',
+    'wob',
+    'woc',
+    'wod',
+    'woe',
+    'wof',
+    'wog',
+    'woi',
+    'wok',
+    'wom',
+    'won',
+    'woo',
+    'wor',
+    'wos',
+    'wow',
+    'woy',
+    'wpc',
+    'wra',
+    'wrb',
+    'wrd',
+    'wrg',
+    'wrh',
+    'wri',
+    'wrk',
+    'wrl',
+    'wrm',
+    'wrn',
+    'wro',
+    'wrp',
+    'wrr',
+    'wrs',
+    'wru',
+    'wrv',
+    'wrw',
+    'wrx',
+    'wry',
+    'wrz',
+    'wsa',
+    'wsg',
+    'wsi',
+    'wsk',
+    'wsr',
+    'wss',
+    'wsu',
+    'wsv',
+    'wtf',
+    'wth',
+    'wti',
+    'wtk',
+    'wtm',
+    'wtw',
+    'wua',
+    'wub',
+    'wud',
+    'wuh',
+    'wul',
+    'wum',
+    'wun',
+    'wur',
+    'wut',
+    'wuu',
+    'wuv',
+    'wux',
+    'wuy',
+    'wwa',
+    'wwb',
+    'wwo',
+    'wwr',
+    'www',
+    'wxa',
+    'wxw',
+    'wya',
+    'wyb',
+    'wyi',
+    'wym',
+    'wyr',
+    'wyy',
+    'xaa',
+    'xab',
+    'xac',
+    'xad',
+    'xae',
+    'xag',
+    'xai',
+    'xaj',
+    'xak',
+    'xal',
+    'xam',
+    'xan',
+    'xao',
+    'xap',
+    'xaq',
+    'xar',
+    'xas',
+    'xat',
+    'xau',
+    'xav',
+    'xaw',
+    'xay',
+    'xba',
+    'xbb',
+    'xbc',
+    'xbd',
+    'xbe',
+    'xbg',
+    'xbi',
+    'xbj',
+    'xbm',
+    'xbn',
+    'xbo',
+    'xbp',
+    'xbr',
+    'xbw',
+    'xbx',
+    'xby',
+    'xcb',
+    'xcc',
+    'xce',
+    'xcg',
+    'xch',
+    'xcl',
+    'xcm',
+    'xcn',
+    'xco',
+    'xcr',
+    'xct',
+    'xcu',
+    'xcv',
+    'xcw',
+    'xcy',
+    'xda',
+    'xdc',
+    'xdk',
+    'xdm',
+    'xdo',
+    'xdy',
+    'xeb',
+    'xed',
+    'xeg',
+    'xel',
+    'xem',
+    'xep',
+    'xer',
+    'xes',
+    'xet',
+    'xeu',
+    'xfa',
+    'xga',
+    'xgb',
+    'xgd',
+    'xgf',
+    'xgg',
+    'xgi',
+    'xgl',
+    'xgm',
+    'xgn',
+    'xgr',
+    'xgu',
+    'xgw',
+    'xha',
+    'xhc',
+    'xhd',
+    'xhe',
+    'xhr',
+    'xht',
+    'xhu',
+    'xhv',
+    'xia',
+    'xib',
+    'xii',
+    'xil',
+    'xin',
+    'xip',
+    'xir',
+    'xis',
+    'xiv',
+    'xiy',
+    'xjb',
+    'xjt',
+    'xka',
+    'xkb',
+    'xkc',
+    'xkd',
+    'xke',
+    'xkf',
+    'xkg',
+    'xkh',
+    'xki',
+    'xkj',
+    'xkk',
+    'xkl',
+    'xkn',
+    'xko',
+    'xkp',
+    'xkq',
+    'xkr',
+    'xks',
+    'xkt',
+    'xku',
+    'xkv',
+    'xkw',
+    'xkx',
+    'xky',
+    'xkz',
+    'xla',
+    'xlb',
+    'xlc',
+    'xld',
+    'xle',
+    'xlg',
+    'xli',
+    'xln',
+    'xlo',
+    'xlp',
+    'xls',
+    'xlu',
+    'xly',
+    'xma',
+    'xmb',
+    'xmc',
+    'xmd',
+    'xme',
+    'xmf',
+    'xmg',
+    'xmh',
+    'xmj',
+    'xmk',
+    'xml',
+    'xmm',
+    'xmn',
+    'xmo',
+    'xmp',
+    'xmq',
+    'xmr',
+    'xms',
+    'xmt',
+    'xmu',
+    'xmv',
+    'xmw',
+    'xmx',
+    'xmy',
+    'xmz',
+    'xna',
+    'xnb',
+    'xnd',
+    'xng',
+    'xnh',
+    'xni',
+    'xnk',
+    'xnn',
+    'xno',
+    'xnr',
+    'xns',
+    'xnt',
+    'xnu',
+    'xny',
+    'xnz',
+    'xoc',
+    'xod',
+    'xog',
+    'xoi',
+    'xok',
+    'xom',
+    'xon',
+    'xoo',
+    'xop',
+    'xor',
+    'xow',
+    'xpa',
+    'xpc',
+    'xpe',
+    'xpg',
+    'xpi',
+    'xpj',
+    'xpk',
+    'xpm',
+    'xpn',
+    'xpo',
+    'xpp',
+    'xpq',
+    'xpr',
+    'xps',
+    'xpt',
+    'xpu',
+    'xpy',
+    'xqa',
+    'xqt',
+    'xra',
+    'xrb',
+    'xrd',
+    'xre',
+    'xrg',
+    'xri',
+    'xrm',
+    'xrn',
+    'xrq',
+    'xrr',
+    'xrt',
+    'xru',
+    'xrw',
+    'xsa',
+    'xsb',
+    'xsc',
+    'xsd',
+    'xse',
+    'xsh',
+    'xsi',
+    'xsj',
+    'xsl',
+    'xsm',
+    'xsn',
+    'xso',
+    'xsp',
+    'xsq',
+    'xsr',
+    'xss',
+    'xsu',
+    'xsv',
+    'xsy',
+    'xta',
+    'xtb',
+    'xtc',
+    'xtd',
+    'xte',
+    'xtg',
+    'xth',
+    'xti',
+    'xtj',
+    'xtl',
+    'xtm',
+    'xtn',
+    'xto',
+    'xtp',
+    'xtq',
+    'xtr',
+    'xts',
+    'xtt',
+    'xtu',
+    'xtv',
+    'xtw',
+    'xty',
+    'xtz',
+    'xua',
+    'xub',
+    'xud',
+    'xug',
+    'xuj',
+    'xul',
+    'xum',
+    'xun',
+    'xuo',
+    'xup',
+    'xur',
+    'xut',
+    'xuu',
+    'xve',
+    'xvi',
+    'xvn',
+    'xvo',
+    'xvs',
+    'xwa',
+    'xwc',
+    'xwd',
+    'xwe',
+    'xwg',
+    'xwj',
+    'xwk',
+    'xwl',
+    'xwo',
+    'xwr',
+    'xwt',
+    'xww',
+    'xxb',
+    'xxk',
+    'xxm',
+    'xxr',
+    'xxt',
+    'xya',
+    'xyb',
+    'xyj',
+    'xyk',
+    'xyl',
+    'xyt',
+    'xyy',
+    'xzh',
+    'xzm',
+    'xzp',
+    'yaa',
+    'yab',
+    'yac',
+    'yad',
+    'yae',
+    'yaf',
+    'yag',
+    'yah',
+    'yai',
+    'yaj',
+    'yak',
+    'yal',
+    'yam',
+    'yan',
+    'yao',
+    'yap',
+    'yaq',
+    'yar',
+    'yas',
+    'yat',
+    'yau',
+    'yav',
+    'yaw',
+    'yax',
+    'yay',
+    'yaz',
+    'yba',
+    'ybb',
+    'ybd',
+    'ybe',
+    'ybh',
+    'ybi',
+    'ybj',
+    'ybk',
+    'ybl',
+    'ybm',
+    'ybn',
+    'ybo',
+    'ybx',
+    'yby',
+    'ych',
+    'ycl',
+    'ycn',
+    'ycp',
+    'yda',
+    'ydd',
+    'yde',
+    'ydg',
+    'ydk',
+    'yds',
+    'yea',
+    'yec',
+    'yee',
+    'yei',
+    'yej',
+    'yel',
+    'yen',
+    'yer',
+    'yes',
+    'yet',
+    'yeu',
+    'yev',
+    'yey',
+    'yga',
+    'ygi',
+    'ygl',
+    'ygm',
+    'ygp',
+    'ygr',
+    'ygs',
+    'ygu',
+    'ygw',
+    'yha',
+    'yhd',
+    'yhl',
+    'yhs',
+    'yia',
+    'yif',
+    'yig',
+    'yih',
+    'yii',
+    'yij',
+    'yik',
+    'yil',
+    'yim',
+    'yin',
+    'yip',
+    'yiq',
+    'yir',
+    'yis',
+    'yit',
+    'yiu',
+    'yiv',
+    'yix',
+    'yiy',
+    'yiz',
+    'yka',
+    'ykg',
+    'yki',
+    'ykk',
+    'ykl',
+    'ykm',
+    'ykn',
+    'yko',
+    'ykr',
+    'ykt',
+    'yku',
+    'yky',
+    'yla',
+    'ylb',
+    'yle',
+    'ylg',
+    'yli',
+    'yll',
+    'ylm',
+    'yln',
+    'ylo',
+    'ylr',
+    'ylu',
+    'yly',
+    'yma',
+    'ymb',
+    'ymc',
+    'ymd',
+    'yme',
+    'ymg',
+    'ymh',
+    'ymi',
+    'ymk',
+    'yml',
+    'ymm',
+    'ymn',
+    'ymo',
+    'ymp',
+    'ymq',
+    'ymr',
+    'yms',
+    'ymt',
+    'ymx',
+    'ymz',
+    'yna',
+    'ynd',
+    'yne',
+    'yng',
+    'ynh',
+    'ynk',
+    'ynl',
+    'ynn',
+    'yno',
+    'ynq',
+    'yns',
+    'ynu',
+    'yob',
+    'yog',
+    'yoi',
+    'yok',
+    'yol',
+    'yom',
+    'yon',
+    'yos',
+    'yot',
+    'yox',
+    'yoy',
+    'ypa',
+    'ypb',
+    'ypg',
+    'yph',
+    'ypk',
+    'ypm',
+    'ypn',
+    'ypo',
+    'ypp',
+    'ypz',
+    'yra',
+    'yrb',
+    'yre',
+    'yri',
+    'yrk',
+    'yrl',
+    'yrm',
+    'yrn',
+    'yro',
+    'yrs',
+    'yrw',
+    'yry',
+    'ysc',
+    'ysd',
+    'ysg',
+    'ysl',
+    'ysn',
+    'yso',
+    'ysp',
+    'ysr',
+    'yss',
+    'ysy',
+    'yta',
+    'ytl',
+    'ytp',
+    'ytw',
+    'yty',
+    'yua',
+    'yub',
+    'yuc',
+    'yud',
+    'yue',
+    'yuf',
+    'yug',
+    'yui',
+    'yuj',
+    'yuk',
+    'yul',
+    'yum',
+    'yun',
+    'yup',
+    'yuq',
+    'yur',
+    'yut',
+    'yuu',
+    'yuw',
+    'yux',
+    'yuy',
+    'yuz',
+    'yva',
+    'yvt',
+    'ywa',
+    'ywg',
+    'ywl',
+    'ywn',
+    'ywq',
+    'ywr',
+    'ywt',
+    'ywu',
+    'yww',
+    'yxa',
+    'yxg',
+    'yxl',
+    'yxm',
+    'yxu',
+    'yxy',
+    'yyr',
+    'yyu',
+    'yyz',
+    'yzg',
+    'yzk',
+    'zaa',
+    'zab',
+    'zac',
+    'zad',
+    'zae',
+    'zaf',
+    'zag',
+    'zah',
+    'zai',
+    'zaj',
+    'zak',
+    'zal',
+    'zam',
+    'zao',
+    'zap',
+    'zaq',
+    'zar',
+    'zas',
+    'zat',
+    'zau',
+    'zav',
+    'zaw',
+    'zax',
+    'zay',
+    'zaz',
+    'zbc',
+    'zbe',
+    'zbl',
+    'zbt',
+    'zbw',
+    'zca',
+    'zch',
+    'zdj',
+    'zea',
+    'zeg',
+    'zeh',
+    'zen',
+    'zga',
+    'zgb',
+    'zgh',
+    'zgm',
+    'zgn',
+    'zgr',
+    'zhb',
+    'zhd',
+    'zhi',
+    'zhn',
+    'zhw',
+    'zhx',
+    'zia',
+    'zib',
+    'zik',
+    'zil',
+    'zim',
+    'zin',
+    'zir',
+    'ziw',
+    'ziz',
+    'zka',
+    'zkb',
+    'zkd',
+    'zkg',
+    'zkh',
+    'zkk',
+    'zkn',
+    'zko',
+    'zkp',
+    'zkr',
+    'zkt',
+    'zku',
+    'zkv',
+    'zkz',
+    'zle',
+    'zlj',
+    'zlm',
+    'zln',
+    'zlq',
+    'zls',
+    'zlw',
+    'zma',
+    'zmb',
+    'zmc',
+    'zmd',
+    'zme',
+    'zmf',
+    'zmg',
+    'zmh',
+    'zmi',
+    'zmj',
+    'zmk',
+    'zml',
+    'zmm',
+    'zmn',
+    'zmo',
+    'zmp',
+    'zmq',
+    'zmr',
+    'zms',
+    'zmt',
+    'zmu',
+    'zmv',
+    'zmw',
+    'zmx',
+    'zmy',
+    'zmz',
+    'zna',
+    'znd',
+    'zne',
+    'zng',
+    'znk',
+    'zns',
+    'zoc',
+    'zoh',
+    'zom',
+    'zoo',
+    'zoq',
+    'zor',
+    'zos',
+    'zpa',
+    'zpb',
+    'zpc',
+    'zpd',
+    'zpe',
+    'zpf',
+    'zpg',
+    'zph',
+    'zpi',
+    'zpj',
+    'zpk',
+    'zpl',
+    'zpm',
+    'zpn',
+    'zpo',
+    'zpp',
+    'zpq',
+    'zpr',
+    'zps',
+    'zpt',
+    'zpu',
+    'zpv',
+    'zpw',
+    'zpx',
+    'zpy',
+    'zpz',
+    'zqe',
+    'zra',
+    'zrg',
+    'zrn',
+    'zro',
+    'zrp',
+    'zrs',
+    'zsa',
+    'zsk',
+    'zsl',
+    'zsm',
+    'zsr',
+    'zsu',
+    'zte',
+    'ztg',
+    'ztl',
+    'ztm',
+    'ztn',
+    'ztp',
+    'ztq',
+    'zts',
+    'ztt',
+    'ztu',
+    'ztx',
+    'zty',
+    'zua',
+    'zuh',
+    'zum',
+    'zun',
+    'zuy',
+    'zwa',
+    'zxx',
+    'zyb',
+    'zyg',
+    'zyj',
+    'zyn',
+    'zyp',
+    'zza',
+    'zzj'];
+    
+    
+    
+    
+    
+    
+    
+    
+    axe.utils.validLangs=function(){
+    'use strict';
+    return langs;
+    };
+    
+    },{}],97:[function(require,module,exports){
+    'use strict';
+    
+    exports.byteLength=byteLength;
+    exports.toByteArray=toByteArray;
+    exports.fromByteArray=fromByteArray;
+    
+    var lookup=[];
+    var revLookup=[];
+    var Arr=typeof Uint8Array!=='undefined'?Uint8Array:Array;
+    
+    var code='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
+    for(var i=0,len=code.length;i<len;++i){
+    lookup[i]=code[i];
+    revLookup[code.charCodeAt(i)]=i;
+    }
+    
+    
+    
+    revLookup['-'.charCodeAt(0)]=62;
+    revLookup['_'.charCodeAt(0)]=63;
+    
+    function getLens(b64){
+    var len=b64.length;
+    
+    if(len%4>0){
+    throw new Error('Invalid string. Length must be a multiple of 4');
+    }
+    
+    
+    
+    var validLen=b64.indexOf('=');
+    if(validLen===-1)validLen=len;
+    
+    var placeHoldersLen=validLen===len?
+    0:
+    4-validLen%4;
+    
+    return[validLen,placeHoldersLen];
+    }
+    
+    
+    function byteLength(b64){
+    var lens=getLens(b64);
+    var validLen=lens[0];
+    var placeHoldersLen=lens[1];
+    return(validLen+placeHoldersLen)*3/4-placeHoldersLen;
+    }
+    
+    function _byteLength(b64,validLen,placeHoldersLen){
+    return(validLen+placeHoldersLen)*3/4-placeHoldersLen;
+    }
+    
+    function toByteArray(b64){
+    var tmp;
+    var lens=getLens(b64);
+    var validLen=lens[0];
+    var placeHoldersLen=lens[1];
+    
+    var arr=new Arr(_byteLength(b64,validLen,placeHoldersLen));
+    
+    var curByte=0;
+    
+    
+    var len=placeHoldersLen>0?
+    validLen-4:
+    validLen;
+    
+    for(var i=0;i<len;i+=4){
+    tmp=
+    revLookup[b64.charCodeAt(i)]<<18|
+    revLookup[b64.charCodeAt(i+1)]<<12|
+    revLookup[b64.charCodeAt(i+2)]<<6|
+    revLookup[b64.charCodeAt(i+3)];
+    arr[curByte++]=tmp>>16&0xFF;
+    arr[curByte++]=tmp>>8&0xFF;
+    arr[curByte++]=tmp&0xFF;
+    }
+    
+    if(placeHoldersLen===2){
+    tmp=
+    revLookup[b64.charCodeAt(i)]<<2|
+    revLookup[b64.charCodeAt(i+1)]>>4;
+    arr[curByte++]=tmp&0xFF;
+    }
+    
+    if(placeHoldersLen===1){
+    tmp=
+    revLookup[b64.charCodeAt(i)]<<10|
+    revLookup[b64.charCodeAt(i+1)]<<4|
+    revLookup[b64.charCodeAt(i+2)]>>2;
+    arr[curByte++]=tmp>>8&0xFF;
+    arr[curByte++]=tmp&0xFF;
+    }
+    
+    return arr;
+    }
+    
+    function tripletToBase64(num){
+    return lookup[num>>18&0x3F]+
+    lookup[num>>12&0x3F]+
+    lookup[num>>6&0x3F]+
+    lookup[num&0x3F];
+    }
+    
+    function encodeChunk(uint8,start,end){
+    var tmp;
+    var output=[];
+    for(var i=start;i<end;i+=3){
+    tmp=
+    (uint8[i]<<16&0xFF0000)+(
+    uint8[i+1]<<8&0xFF00)+(
+    uint8[i+2]&0xFF);
+    output.push(tripletToBase64(tmp));
+    }
+    return output.join('');
+    }
+    
+    function fromByteArray(uint8){
+    var tmp;
+    var len=uint8.length;
+    var extraBytes=len%3;
+    var parts=[];
+    var maxChunkLength=16383;
+    
+    
+    for(var i=0,len2=len-extraBytes;i<len2;i+=maxChunkLength){
+    parts.push(encodeChunk(
+    uint8,i,i+maxChunkLength>len2?len2:i+maxChunkLength));
+    
+    }
+    
+    
+    if(extraBytes===1){
+    tmp=uint8[len-1];
+    parts.push(
+    lookup[tmp>>2]+
+    lookup[tmp<<4&0x3F]+
+    '==');
+    
+    }else if(extraBytes===2){
+    tmp=(uint8[len-2]<<8)+uint8[len-1];
+    parts.push(
+    lookup[tmp>>10]+
+    lookup[tmp>>4&0x3F]+
+    lookup[tmp<<2&0x3F]+
+    '=');
+    
+    }
+    
+    return parts.join('');
+    }
+    
+    },{}],98:[function(require,module,exports){
+    
+    },{}],99:[function(require,module,exports){
+    (function(process,Buffer){
+    'use strict';
+    
+    
+    var assert=require('assert');
+    
+    var Zstream=require('pako/lib/zlib/zstream');
+    var zlib_deflate=require('pako/lib/zlib/deflate.js');
+    var zlib_inflate=require('pako/lib/zlib/inflate.js');
+    var constants=require('pako/lib/zlib/constants');
+    
+    for(var key in constants){
+    exports[key]=constants[key];
+    }
+    
+    
+    exports.NONE=0;
+    exports.DEFLATE=1;
+    exports.INFLATE=2;
+    exports.GZIP=3;
+    exports.GUNZIP=4;
+    exports.DEFLATERAW=5;
+    exports.INFLATERAW=6;
+    exports.UNZIP=7;
+    
+    var GZIP_HEADER_ID1=0x1f;
+    var GZIP_HEADER_ID2=0x8b;
+    
+    
+    
+    
+    function Zlib(mode){
+    if(typeof mode!=='number'||mode<exports.DEFLATE||mode>exports.UNZIP){
+    throw new TypeError('Bad argument');
+    }
+    
+    this.dictionary=null;
+    this.err=0;
+    this.flush=0;
+    this.init_done=false;
+    this.level=0;
+    this.memLevel=0;
+    this.mode=mode;
+    this.strategy=0;
+    this.windowBits=0;
+    this.write_in_progress=false;
+    this.pending_close=false;
+    this.gzip_id_bytes_read=0;
+    }
+    
+    Zlib.prototype.close=function(){
+    if(this.write_in_progress){
+    this.pending_close=true;
+    return;
+    }
+    
+    this.pending_close=false;
+    
+    assert(this.init_done,'close before init');
+    assert(this.mode<=exports.UNZIP);
+    
+    if(this.mode===exports.DEFLATE||this.mode===exports.GZIP||this.mode===exports.DEFLATERAW){
+    zlib_deflate.deflateEnd(this.strm);
+    }else if(this.mode===exports.INFLATE||this.mode===exports.GUNZIP||this.mode===exports.INFLATERAW||this.mode===exports.UNZIP){
+    zlib_inflate.inflateEnd(this.strm);
+    }
+    
+    this.mode=exports.NONE;
+    
+    this.dictionary=null;
+    };
+    
+    Zlib.prototype.write=function(flush,input,in_off,in_len,out,out_off,out_len){
+    return this._write(true,flush,input,in_off,in_len,out,out_off,out_len);
+    };
+    
+    Zlib.prototype.writeSync=function(flush,input,in_off,in_len,out,out_off,out_len){
+    return this._write(false,flush,input,in_off,in_len,out,out_off,out_len);
+    };
+    
+    Zlib.prototype._write=function(async,flush,input,in_off,in_len,out,out_off,out_len){
+    assert.equal(arguments.length,8);
+    
+    assert(this.init_done,'write before init');
+    assert(this.mode!==exports.NONE,'already finalized');
+    assert.equal(false,this.write_in_progress,'write already in progress');
+    assert.equal(false,this.pending_close,'close is pending');
+    
+    this.write_in_progress=true;
+    
+    assert.equal(false,flush===undefined,'must provide flush value');
+    
+    this.write_in_progress=true;
+    
+    if(flush!==exports.Z_NO_FLUSH&&flush!==exports.Z_PARTIAL_FLUSH&&flush!==exports.Z_SYNC_FLUSH&&flush!==exports.Z_FULL_FLUSH&&flush!==exports.Z_FINISH&&flush!==exports.Z_BLOCK){
+    throw new Error('Invalid flush value');
+    }
+    
+    if(input==null){
+    input=Buffer.alloc(0);
+    in_len=0;
+    in_off=0;
+    }
+    
+    this.strm.avail_in=in_len;
+    this.strm.input=input;
+    this.strm.next_in=in_off;
+    this.strm.avail_out=out_len;
+    this.strm.output=out;
+    this.strm.next_out=out_off;
+    this.flush=flush;
+    
+    if(!async){
+    
+    this._process();
+    
+    if(this._checkError()){
+    return this._afterSync();
+    }
+    return;
+    }
+    
+    
+    var self=this;
+    process.nextTick(function(){
+    self._process();
+    self._after();
+    });
+    
+    return this;
+    };
+    
+    Zlib.prototype._afterSync=function(){
+    var avail_out=this.strm.avail_out;
+    var avail_in=this.strm.avail_in;
+    
+    this.write_in_progress=false;
+    
+    return[avail_in,avail_out];
+    };
+    
+    Zlib.prototype._process=function(){
+    var next_expected_header_byte=null;
+    
+    
+    
+    
+    switch(this.mode){
+    case exports.DEFLATE:
+    case exports.GZIP:
+    case exports.DEFLATERAW:
+    this.err=zlib_deflate.deflate(this.strm,this.flush);
+    break;
+    case exports.UNZIP:
+    if(this.strm.avail_in>0){
+    next_expected_header_byte=this.strm.next_in;
+    }
+    
+    switch(this.gzip_id_bytes_read){
+    case 0:
+    if(next_expected_header_byte===null){
+    break;
+    }
+    
+    if(this.strm.input[next_expected_header_byte]===GZIP_HEADER_ID1){
+    this.gzip_id_bytes_read=1;
+    next_expected_header_byte++;
+    
+    if(this.strm.avail_in===1){
+    
+    break;
+    }
+    }else{
+    this.mode=exports.INFLATE;
+    break;
+    }
+    
+    
+    case 1:
+    if(next_expected_header_byte===null){
+    break;
+    }
+    
+    if(this.strm.input[next_expected_header_byte]===GZIP_HEADER_ID2){
+    this.gzip_id_bytes_read=2;
+    this.mode=exports.GUNZIP;
+    }else{
+    
+    
+    this.mode=exports.INFLATE;
+    }
+    
+    break;
+    default:
+    throw new Error('invalid number of gzip magic number bytes read');}
+    
+    
+    
+    case exports.INFLATE:
+    case exports.GUNZIP:
+    case exports.INFLATERAW:
+    this.err=zlib_inflate.inflate(this.strm,this.flush);
+    
+    
+    if(this.err===exports.Z_NEED_DICT&&this.dictionary){
+    
+    this.err=zlib_inflate.inflateSetDictionary(this.strm,this.dictionary);
+    if(this.err===exports.Z_OK){
+    
+    this.err=zlib_inflate.inflate(this.strm,this.flush);
+    }else if(this.err===exports.Z_DATA_ERROR){
+    
+    
+    
+    this.err=exports.Z_NEED_DICT;
+    }
+    }
+    while(this.strm.avail_in>0&&this.mode===exports.GUNZIP&&this.err===exports.Z_STREAM_END&&this.strm.next_in[0]!==0x00){
+    
+    
+    
+    
+    
+    this.reset();
+    this.err=zlib_inflate.inflate(this.strm,this.flush);
+    }
+    break;
+    default:
+    throw new Error('Unknown mode '+this.mode);}
+    
+    };
+    
+    Zlib.prototype._checkError=function(){
+    
+    switch(this.err){
+    case exports.Z_OK:
+    case exports.Z_BUF_ERROR:
+    if(this.strm.avail_out!==0&&this.flush===exports.Z_FINISH){
+    this._error('unexpected end of file');
+    return false;
+    }
+    break;
+    case exports.Z_STREAM_END:
+    
+    break;
+    case exports.Z_NEED_DICT:
+    if(this.dictionary==null){
+    this._error('Missing dictionary');
+    }else{
+    this._error('Bad dictionary');
+    }
+    return false;
+    default:
+    
+    this._error('Zlib error');
+    return false;}
+    
+    
+    return true;
+    };
+    
+    Zlib.prototype._after=function(){
+    if(!this._checkError()){
+    return;
+    }
+    
+    var avail_out=this.strm.avail_out;
+    var avail_in=this.strm.avail_in;
+    
+    this.write_in_progress=false;
+    
+    
+    this.callback(avail_in,avail_out);
+    
+    if(this.pending_close){
+    this.close();
+    }
+    };
+    
+    Zlib.prototype._error=function(message){
+    if(this.strm.msg){
+    message=this.strm.msg;
+    }
+    this.onerror(message,this.err);
+    
+    
+    this.write_in_progress=false;
+    if(this.pending_close){
+    this.close();
+    }
+    };
+    
+    Zlib.prototype.init=function(windowBits,level,memLevel,strategy,dictionary){
+    assert(arguments.length===4||arguments.length===5,'init(windowBits, level, memLevel, strategy, [dictionary])');
+    
+    assert(windowBits>=8&&windowBits<=15,'invalid windowBits');
+    assert(level>=-1&&level<=9,'invalid compression level');
+    
+    assert(memLevel>=1&&memLevel<=9,'invalid memlevel');
+    
+    assert(strategy===exports.Z_FILTERED||strategy===exports.Z_HUFFMAN_ONLY||strategy===exports.Z_RLE||strategy===exports.Z_FIXED||strategy===exports.Z_DEFAULT_STRATEGY,'invalid strategy');
+    
+    this._init(level,windowBits,memLevel,strategy,dictionary);
+    this._setDictionary();
+    };
+    
+    Zlib.prototype.params=function(){
+    throw new Error('deflateParams Not supported');
+    };
+    
+    Zlib.prototype.reset=function(){
+    this._reset();
+    this._setDictionary();
+    };
+    
+    Zlib.prototype._init=function(level,windowBits,memLevel,strategy,dictionary){
+    this.level=level;
+    this.windowBits=windowBits;
+    this.memLevel=memLevel;
+    this.strategy=strategy;
+    
+    this.flush=exports.Z_NO_FLUSH;
+    
+    this.err=exports.Z_OK;
+    
+    if(this.mode===exports.GZIP||this.mode===exports.GUNZIP){
+    this.windowBits+=16;
+    }
+    
+    if(this.mode===exports.UNZIP){
+    this.windowBits+=32;
+    }
+    
+    if(this.mode===exports.DEFLATERAW||this.mode===exports.INFLATERAW){
+    this.windowBits=-1*this.windowBits;
+    }
+    
+    this.strm=new Zstream();
+    
+    switch(this.mode){
+    case exports.DEFLATE:
+    case exports.GZIP:
+    case exports.DEFLATERAW:
+    this.err=zlib_deflate.deflateInit2(this.strm,this.level,exports.Z_DEFLATED,this.windowBits,this.memLevel,this.strategy);
+    break;
+    case exports.INFLATE:
+    case exports.GUNZIP:
+    case exports.INFLATERAW:
+    case exports.UNZIP:
+    this.err=zlib_inflate.inflateInit2(this.strm,this.windowBits);
+    break;
+    default:
+    throw new Error('Unknown mode '+this.mode);}
+    
+    
+    if(this.err!==exports.Z_OK){
+    this._error('Init error');
+    }
+    
+    this.dictionary=dictionary;
+    
+    this.write_in_progress=false;
+    this.init_done=true;
+    };
+    
+    Zlib.prototype._setDictionary=function(){
+    if(this.dictionary==null){
+    return;
+    }
+    
+    this.err=exports.Z_OK;
+    
+    switch(this.mode){
+    case exports.DEFLATE:
+    case exports.DEFLATERAW:
+    this.err=zlib_deflate.deflateSetDictionary(this.strm,this.dictionary);
+    break;
+    default:
+    break;}
+    
+    
+    if(this.err!==exports.Z_OK){
+    this._error('Failed to set dictionary');
+    }
+    };
+    
+    Zlib.prototype._reset=function(){
+    this.err=exports.Z_OK;
+    
+    switch(this.mode){
+    case exports.DEFLATE:
+    case exports.DEFLATERAW:
+    case exports.GZIP:
+    this.err=zlib_deflate.deflateReset(this.strm);
+    break;
+    case exports.INFLATE:
+    case exports.INFLATERAW:
+    case exports.GUNZIP:
+    this.err=zlib_inflate.inflateReset(this.strm);
+    break;
+    default:
+    break;}
+    
+    
+    if(this.err!==exports.Z_OK){
+    this._error('Failed to reset stream');
+    }
+    };
+    
+    exports.Zlib=Zlib;
+    }).call(this,require('_process'),require("buffer").Buffer);
+    },{"_process":158,"assert":92,"buffer":102,"pako/lib/zlib/constants":149,"pako/lib/zlib/deflate.js":151,"pako/lib/zlib/inflate.js":101,"pako/lib/zlib/zstream":154}],100:[function(require,module,exports){
+    (function(process){
+    'use strict';
+    
+    var Buffer=require('buffer').Buffer;
+    var Transform=require('stream').Transform;
+    var binding=require('./binding');
+    var util=require('util');
+    var assert=require('assert').ok;
+    var kMaxLength=require('buffer').kMaxLength;
+    var kRangeErrorMessage='Cannot create final Buffer. It would be larger '+'than 0x'+kMaxLength.toString(16)+' bytes';
+    
+    
+    
+    binding.Z_MIN_WINDOWBITS=8;
+    binding.Z_MAX_WINDOWBITS=15;
+    binding.Z_DEFAULT_WINDOWBITS=15;
+    
+    
+    
+    
+    binding.Z_MIN_CHUNK=64;
+    binding.Z_MAX_CHUNK=Infinity;
+    binding.Z_DEFAULT_CHUNK=16*1024;
+    
+    binding.Z_MIN_MEMLEVEL=1;
+    binding.Z_MAX_MEMLEVEL=9;
+    binding.Z_DEFAULT_MEMLEVEL=8;
+    
+    binding.Z_MIN_LEVEL=-1;
+    binding.Z_MAX_LEVEL=9;
+    binding.Z_DEFAULT_LEVEL=binding.Z_DEFAULT_COMPRESSION;
+    
+    
+    var bkeys=Object.keys(binding);
+    for(var bk=0;bk<bkeys.length;bk++){
+    var bkey=bkeys[bk];
+    if(bkey.match(/^Z/)){
+    Object.defineProperty(exports,bkey,{
+    enumerable:true,value:binding[bkey],writable:false});
+    
+    }
+    }
+    
+    
+    var codes={
+    Z_OK:binding.Z_OK,
+    Z_STREAM_END:binding.Z_STREAM_END,
+    Z_NEED_DICT:binding.Z_NEED_DICT,
+    Z_ERRNO:binding.Z_ERRNO,
+    Z_STREAM_ERROR:binding.Z_STREAM_ERROR,
+    Z_DATA_ERROR:binding.Z_DATA_ERROR,
+    Z_MEM_ERROR:binding.Z_MEM_ERROR,
+    Z_BUF_ERROR:binding.Z_BUF_ERROR,
+    Z_VERSION_ERROR:binding.Z_VERSION_ERROR};
+    
+    
+    var ckeys=Object.keys(codes);
+    for(var ck=0;ck<ckeys.length;ck++){
+    var ckey=ckeys[ck];
+    codes[codes[ckey]]=ckey;
+    }
+    
+    Object.defineProperty(exports,'codes',{
+    enumerable:true,value:Object.freeze(codes),writable:false});
+    
+    
+    exports.Deflate=Deflate;
+    exports.Inflate=Inflate;
+    exports.Gzip=Gzip;
+    exports.Gunzip=Gunzip;
+    exports.DeflateRaw=DeflateRaw;
+    exports.InflateRaw=InflateRaw;
+    exports.Unzip=Unzip;
+    
+    exports.createDeflate=function(o){
+    return new Deflate(o);
+    };
+    
+    exports.createInflate=function(o){
+    return new Inflate(o);
+    };
+    
+    exports.createDeflateRaw=function(o){
+    return new DeflateRaw(o);
+    };
+    
+    exports.createInflateRaw=function(o){
+    return new InflateRaw(o);
+    };
+    
+    exports.createGzip=function(o){
+    return new Gzip(o);
+    };
+    
+    exports.createGunzip=function(o){
+    return new Gunzip(o);
+    };
+    
+    exports.createUnzip=function(o){
+    return new Unzip(o);
+    };
+    
+    
+    
+    exports.deflate=function(buffer,opts,callback){
+    if(typeof opts==='function'){
+    callback=opts;
+    opts={};
+    }
+    return zlibBuffer(new Deflate(opts),buffer,callback);
+    };
+    
+    exports.deflateSync=function(buffer,opts){
+    return zlibBufferSync(new Deflate(opts),buffer);
+    };
+    
+    exports.gzip=function(buffer,opts,callback){
+    if(typeof opts==='function'){
+    callback=opts;
+    opts={};
+    }
+    return zlibBuffer(new Gzip(opts),buffer,callback);
+    };
+    
+    exports.gzipSync=function(buffer,opts){
+    return zlibBufferSync(new Gzip(opts),buffer);
+    };
+    
+    exports.deflateRaw=function(buffer,opts,callback){
+    if(typeof opts==='function'){
+    callback=opts;
+    opts={};
+    }
+    return zlibBuffer(new DeflateRaw(opts),buffer,callback);
+    };
+    
+    exports.deflateRawSync=function(buffer,opts){
+    return zlibBufferSync(new DeflateRaw(opts),buffer);
+    };
+    
+    exports.unzip=function(buffer,opts,callback){
+    if(typeof opts==='function'){
+    callback=opts;
+    opts={};
+    }
+    return zlibBuffer(new Unzip(opts),buffer,callback);
+    };
+    
+    exports.unzipSync=function(buffer,opts){
+    return zlibBufferSync(new Unzip(opts),buffer);
+    };
+    
+    exports.inflate=function(buffer,opts,callback){
+    if(typeof opts==='function'){
+    callback=opts;
+    opts={};
+    }
+    return zlibBuffer(new Inflate(opts),buffer,callback);
+    };
+    
+    exports.inflateSync=function(buffer,opts){
+    return zlibBufferSync(new Inflate(opts),buffer);
+    };
+    
+    exports.gunzip=function(buffer,opts,callback){
+    if(typeof opts==='function'){
+    callback=opts;
+    opts={};
+    }
+    return zlibBuffer(new Gunzip(opts),buffer,callback);
+    };
+    
+    exports.gunzipSync=function(buffer,opts){
+    return zlibBufferSync(new Gunzip(opts),buffer);
+    };
+    
+    exports.inflateRaw=function(buffer,opts,callback){
+    if(typeof opts==='function'){
+    callback=opts;
+    opts={};
+    }
+    return zlibBuffer(new InflateRaw(opts),buffer,callback);
+    };
+    
+    exports.inflateRawSync=function(buffer,opts){
+    return zlibBufferSync(new InflateRaw(opts),buffer);
+    };
+    
+    function zlibBuffer(engine,buffer,callback){
+    var buffers=[];
+    var nread=0;
+    
+    engine.on('error',onError);
+    engine.on('end',onEnd);
+    
+    engine.end(buffer);
+    flow();
+    
+    function flow(){
+    var chunk;
+    while(null!==(chunk=engine.read())){
+    buffers.push(chunk);
+    nread+=chunk.length;
+    }
+    engine.once('readable',flow);
+    }
+    
+    function onError(err){
+    engine.removeListener('end',onEnd);
+    engine.removeListener('readable',flow);
+    callback(err);
+    }
+    
+    function onEnd(){
+    var buf;
+    var err=null;
+    
+    if(nread>=kMaxLength){
+    err=new RangeError(kRangeErrorMessage);
+    }else{
+    buf=Buffer.concat(buffers,nread);
+    }
+    
+    buffers=[];
+    engine.close();
+    callback(err,buf);
+    }
+    }
+    
+    function zlibBufferSync(engine,buffer){
+    if(typeof buffer==='string')buffer=Buffer.from(buffer);
+    
+    if(!Buffer.isBuffer(buffer))throw new TypeError('Not a string or buffer');
+    
+    var flushFlag=engine._finishFlushFlag;
+    
+    return engine._processChunk(buffer,flushFlag);
+    }
+    
+    
+    
+    function Deflate(opts){
+    if(!(this instanceof Deflate))return new Deflate(opts);
+    Zlib.call(this,opts,binding.DEFLATE);
+    }
+    
+    function Inflate(opts){
+    if(!(this instanceof Inflate))return new Inflate(opts);
+    Zlib.call(this,opts,binding.INFLATE);
+    }
+    
+    
+    function Gzip(opts){
+    if(!(this instanceof Gzip))return new Gzip(opts);
+    Zlib.call(this,opts,binding.GZIP);
+    }
+    
+    function Gunzip(opts){
+    if(!(this instanceof Gunzip))return new Gunzip(opts);
+    Zlib.call(this,opts,binding.GUNZIP);
+    }
+    
+    
+    function DeflateRaw(opts){
+    if(!(this instanceof DeflateRaw))return new DeflateRaw(opts);
+    Zlib.call(this,opts,binding.DEFLATERAW);
+    }
+    
+    function InflateRaw(opts){
+    if(!(this instanceof InflateRaw))return new InflateRaw(opts);
+    Zlib.call(this,opts,binding.INFLATERAW);
+    }
+    
+    
+    function Unzip(opts){
+    if(!(this instanceof Unzip))return new Unzip(opts);
+    Zlib.call(this,opts,binding.UNZIP);
+    }
+    
+    function isValidFlushFlag(flag){
+    return flag===binding.Z_NO_FLUSH||flag===binding.Z_PARTIAL_FLUSH||flag===binding.Z_SYNC_FLUSH||flag===binding.Z_FULL_FLUSH||flag===binding.Z_FINISH||flag===binding.Z_BLOCK;
+    }
+    
+    
+    
+    
+    
+    
+    function Zlib(opts,mode){
+    var _this=this;
+    
+    this._opts=opts=opts||{};
+    this._chunkSize=opts.chunkSize||exports.Z_DEFAULT_CHUNK;
+    
+    Transform.call(this,opts);
+    
+    if(opts.flush&&!isValidFlushFlag(opts.flush)){
+    throw new Error('Invalid flush flag: '+opts.flush);
+    }
+    if(opts.finishFlush&&!isValidFlushFlag(opts.finishFlush)){
+    throw new Error('Invalid flush flag: '+opts.finishFlush);
+    }
+    
+    this._flushFlag=opts.flush||binding.Z_NO_FLUSH;
+    this._finishFlushFlag=typeof opts.finishFlush!=='undefined'?opts.finishFlush:binding.Z_FINISH;
+    
+    if(opts.chunkSize){
+    if(opts.chunkSize<exports.Z_MIN_CHUNK||opts.chunkSize>exports.Z_MAX_CHUNK){
+    throw new Error('Invalid chunk size: '+opts.chunkSize);
+    }
+    }
+    
+    if(opts.windowBits){
+    if(opts.windowBits<exports.Z_MIN_WINDOWBITS||opts.windowBits>exports.Z_MAX_WINDOWBITS){
+    throw new Error('Invalid windowBits: '+opts.windowBits);
+    }
+    }
+    
+    if(opts.level){
+    if(opts.level<exports.Z_MIN_LEVEL||opts.level>exports.Z_MAX_LEVEL){
+    throw new Error('Invalid compression level: '+opts.level);
+    }
+    }
+    
+    if(opts.memLevel){
+    if(opts.memLevel<exports.Z_MIN_MEMLEVEL||opts.memLevel>exports.Z_MAX_MEMLEVEL){
+    throw new Error('Invalid memLevel: '+opts.memLevel);
+    }
+    }
+    
+    if(opts.strategy){
+    if(opts.strategy!=exports.Z_FILTERED&&opts.strategy!=exports.Z_HUFFMAN_ONLY&&opts.strategy!=exports.Z_RLE&&opts.strategy!=exports.Z_FIXED&&opts.strategy!=exports.Z_DEFAULT_STRATEGY){
+    throw new Error('Invalid strategy: '+opts.strategy);
+    }
+    }
+    
+    if(opts.dictionary){
+    if(!Buffer.isBuffer(opts.dictionary)){
+    throw new Error('Invalid dictionary: it should be a Buffer instance');
+    }
+    }
+    
+    this._handle=new binding.Zlib(mode);
+    
+    var self=this;
+    this._hadError=false;
+    this._handle.onerror=function(message,errno){
+    
+    
+    _close(self);
+    self._hadError=true;
+    
+    var error=new Error(message);
+    error.errno=errno;
+    error.code=exports.codes[errno];
+    self.emit('error',error);
+    };
+    
+    var level=exports.Z_DEFAULT_COMPRESSION;
+    if(typeof opts.level==='number')level=opts.level;
+    
+    var strategy=exports.Z_DEFAULT_STRATEGY;
+    if(typeof opts.strategy==='number')strategy=opts.strategy;
+    
+    this._handle.init(opts.windowBits||exports.Z_DEFAULT_WINDOWBITS,level,opts.memLevel||exports.Z_DEFAULT_MEMLEVEL,strategy,opts.dictionary);
+    
+    this._buffer=Buffer.allocUnsafe(this._chunkSize);
+    this._offset=0;
+    this._level=level;
+    this._strategy=strategy;
+    
+    this.once('end',this.close);
+    
+    Object.defineProperty(this,'_closed',{
+    get:function(){
+    return!_this._handle;
+    },
+    configurable:true,
+    enumerable:true});
+    
+    }
+    
+    util.inherits(Zlib,Transform);
+    
+    Zlib.prototype.params=function(level,strategy,callback){
+    if(level<exports.Z_MIN_LEVEL||level>exports.Z_MAX_LEVEL){
+    throw new RangeError('Invalid compression level: '+level);
+    }
+    if(strategy!=exports.Z_FILTERED&&strategy!=exports.Z_HUFFMAN_ONLY&&strategy!=exports.Z_RLE&&strategy!=exports.Z_FIXED&&strategy!=exports.Z_DEFAULT_STRATEGY){
+    throw new TypeError('Invalid strategy: '+strategy);
+    }
+    
+    if(this._level!==level||this._strategy!==strategy){
+    var self=this;
+    this.flush(binding.Z_SYNC_FLUSH,function(){
+    assert(self._handle,'zlib binding closed');
+    self._handle.params(level,strategy);
+    if(!self._hadError){
+    self._level=level;
+    self._strategy=strategy;
+    if(callback)callback();
+    }
+    });
+    }else{
+    process.nextTick(callback);
+    }
+    };
+    
+    Zlib.prototype.reset=function(){
+    assert(this._handle,'zlib binding closed');
+    return this._handle.reset();
+    };
+    
+    
+    
+    Zlib.prototype._flush=function(callback){
+    this._transform(Buffer.alloc(0),'',callback);
+    };
+    
+    Zlib.prototype.flush=function(kind,callback){
+    var _this2=this;
+    
+    var ws=this._writableState;
+    
+    if(typeof kind==='function'||kind===undefined&&!callback){
+    callback=kind;
+    kind=binding.Z_FULL_FLUSH;
+    }
+    
+    if(ws.ended){
+    if(callback)process.nextTick(callback);
+    }else if(ws.ending){
+    if(callback)this.once('end',callback);
+    }else if(ws.needDrain){
+    if(callback){
+    this.once('drain',function(){
+    return _this2.flush(kind,callback);
+    });
+    }
+    }else{
+    this._flushFlag=kind;
+    this.write(Buffer.alloc(0),'',callback);
+    }
+    };
+    
+    Zlib.prototype.close=function(callback){
+    _close(this,callback);
+    process.nextTick(emitCloseNT,this);
+    };
+    
+    function _close(engine,callback){
+    if(callback)process.nextTick(callback);
+    
+    
+    if(!engine._handle)return;
+    
+    engine._handle.close();
+    engine._handle=null;
+    }
+    
+    function emitCloseNT(self){
+    self.emit('close');
+    }
+    
+    Zlib.prototype._transform=function(chunk,encoding,cb){
+    var flushFlag;
+    var ws=this._writableState;
+    var ending=ws.ending||ws.ended;
+    var last=ending&&(!chunk||ws.length===chunk.length);
+    
+    if(chunk!==null&&!Buffer.isBuffer(chunk))return cb(new Error('invalid input'));
+    
+    if(!this._handle)return cb(new Error('zlib binding closed'));
+    
+    
+    
+    
+    
+    
+    if(last)flushFlag=this._finishFlushFlag;else{
+    flushFlag=this._flushFlag;
+    
+    
+    if(chunk.length>=ws.length){
+    this._flushFlag=this._opts.flush||binding.Z_NO_FLUSH;
+    }
+    }
+    
+    this._processChunk(chunk,flushFlag,cb);
+    };
+    
+    Zlib.prototype._processChunk=function(chunk,flushFlag,cb){
+    var availInBefore=chunk&&chunk.length;
+    var availOutBefore=this._chunkSize-this._offset;
+    var inOff=0;
+    
+    var self=this;
+    
+    var async=typeof cb==='function';
+    
+    if(!async){
+    var buffers=[];
+    var nread=0;
+    
+    var error;
+    this.on('error',function(er){
+    error=er;
+    });
+    
+    assert(this._handle,'zlib binding closed');
+    do{
+    var res=this._handle.writeSync(flushFlag,chunk,
+    inOff,
+    availInBefore,
+    this._buffer,
+    this._offset,
+    availOutBefore);
+    }while(!this._hadError&&callback(res[0],res[1]));
+    
+    if(this._hadError){
+    throw error;
+    }
+    
+    if(nread>=kMaxLength){
+    _close(this);
+    throw new RangeError(kRangeErrorMessage);
+    }
+    
+    var buf=Buffer.concat(buffers,nread);
+    _close(this);
+    
+    return buf;
+    }
+    
+    assert(this._handle,'zlib binding closed');
+    var req=this._handle.write(flushFlag,chunk,
+    inOff,
+    availInBefore,
+    this._buffer,
+    this._offset,
+    availOutBefore);
+    
+    req.buffer=chunk;
+    req.callback=callback;
+    
+    function callback(availInAfter,availOutAfter){
+    
+    
+    
+    
+    
+    if(this){
+    this.buffer=null;
+    this.callback=null;
+    }
+    
+    if(self._hadError)return;
+    
+    var have=availOutBefore-availOutAfter;
+    assert(have>=0,'have should not go down');
+    
+    if(have>0){
+    var out=self._buffer.slice(self._offset,self._offset+have);
+    self._offset+=have;
+    
+    if(async){
+    self.push(out);
+    }else{
+    buffers.push(out);
+    nread+=out.length;
+    }
+    }
+    
+    
+    if(availOutAfter===0||self._offset>=self._chunkSize){
+    availOutBefore=self._chunkSize;
+    self._offset=0;
+    self._buffer=Buffer.allocUnsafe(self._chunkSize);
+    }
+    
+    if(availOutAfter===0){
+    
+    
+    
+    
+    inOff+=availInBefore-availInAfter;
+    availInBefore=availInAfter;
+    
+    if(!async)return true;
+    
+    var newReq=self._handle.write(flushFlag,chunk,inOff,availInBefore,self._buffer,self._offset,self._chunkSize);
+    newReq.callback=callback;
+    newReq.buffer=chunk;
+    return;
+    }
+    
+    if(!async)return false;
+    
+    
+    cb();
+    }
+    };
+    
+    util.inherits(Deflate,Zlib);
+    util.inherits(Inflate,Zlib);
+    util.inherits(Gzip,Zlib);
+    util.inherits(Gunzip,Zlib);
+    util.inherits(DeflateRaw,Zlib);
+    util.inherits(InflateRaw,Zlib);
+    util.inherits(Unzip,Zlib);
+    }).call(this,require('_process'));
+    },{"./binding":99,"_process":158,"assert":92,"buffer":102,"stream":183,"util":191}],101:[function(require,module,exports){
+    arguments[4][98][0].apply(exports,arguments);
+    },{"dup":98}],102:[function(require,module,exports){
+    (function(Buffer){
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    var base64=require('base64-js');
+    var ieee754=require('ieee754');
+    
+    exports.Buffer=Buffer;
+    exports.SlowBuffer=SlowBuffer;
+    exports.INSPECT_MAX_BYTES=50;
+    
+    var K_MAX_LENGTH=0x7fffffff;
+    exports.kMaxLength=K_MAX_LENGTH;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    Buffer.TYPED_ARRAY_SUPPORT=typedArraySupport();
+    
+    if(!Buffer.TYPED_ARRAY_SUPPORT&&typeof console!=='undefined'&&
+    typeof console.error==='function'){
+    console.error(
+    'This browser lacks typed array (Uint8Array) support which is required by '+
+    '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.');
+    
+    }
+    
+    function typedArraySupport(){
+    
+    try{
+    var arr=new Uint8Array(1);
+    arr.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42;}};
+    return arr.foo()===42;
+    }catch(e){
+    return false;
+    }
+    }
+    
+    Object.defineProperty(Buffer.prototype,'parent',{
+    enumerable:true,
+    get:function(){
+    if(!Buffer.isBuffer(this))return undefined;
+    return this.buffer;
+    }});
+    
+    
+    Object.defineProperty(Buffer.prototype,'offset',{
+    enumerable:true,
+    get:function(){
+    if(!Buffer.isBuffer(this))return undefined;
+    return this.byteOffset;
+    }});
+    
+    
+    function createBuffer(length){
+    if(length>K_MAX_LENGTH){
+    throw new RangeError('The value "'+length+'" is invalid for option "size"');
+    }
+    
+    var buf=new Uint8Array(length);
+    buf.__proto__=Buffer.prototype;
+    return buf;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function Buffer(arg,encodingOrOffset,length){
+    
+    if(typeof arg==='number'){
+    if(typeof encodingOrOffset==='string'){
+    throw new TypeError(
+    'The "string" argument must be of type string. Received type number');
+    
+    }
+    return allocUnsafe(arg);
+    }
+    return from(arg,encodingOrOffset,length);
+    }
+    
+    
+    if(typeof Symbol!=='undefined'&&Symbol.species!=null&&
+    Buffer[Symbol.species]===Buffer){
+    Object.defineProperty(Buffer,Symbol.species,{
+    value:null,
+    configurable:true,
+    enumerable:false,
+    writable:false});
+    
+    }
+    
+    Buffer.poolSize=8192;
+    
+    function from(value,encodingOrOffset,length){
+    if(typeof value==='string'){
+    return fromString(value,encodingOrOffset);
+    }
+    
+    if(ArrayBuffer.isView(value)){
+    return fromArrayLike(value);
+    }
+    
+    if(value==null){
+    throw TypeError(
+    'The first argument must be one of type string, Buffer, ArrayBuffer, Array, '+
+    'or Array-like Object. Received type '+typeof value);
+    
+    }
+    
+    if(isInstance(value,ArrayBuffer)||
+    value&&isInstance(value.buffer,ArrayBuffer)){
+    return fromArrayBuffer(value,encodingOrOffset,length);
+    }
+    
+    if(typeof value==='number'){
+    throw new TypeError(
+    'The "value" argument must not be of type number. Received type number');
+    
+    }
+    
+    var valueOf=value.valueOf&&value.valueOf();
+    if(valueOf!=null&&valueOf!==value){
+    return Buffer.from(valueOf,encodingOrOffset,length);
+    }
+    
+    var b=fromObject(value);
+    if(b)return b;
+    
+    if(typeof Symbol!=='undefined'&&Symbol.toPrimitive!=null&&
+    typeof value[Symbol.toPrimitive]==='function'){
+    return Buffer.from(
+    value[Symbol.toPrimitive]('string'),encodingOrOffset,length);
+    
+    }
+    
+    throw new TypeError(
+    'The first argument must be one of type string, Buffer, ArrayBuffer, Array, '+
+    'or Array-like Object. Received type '+typeof value);
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    Buffer.from=function(value,encodingOrOffset,length){
+    return from(value,encodingOrOffset,length);
+    };
+    
+    
+    
+    Buffer.prototype.__proto__=Uint8Array.prototype;
+    Buffer.__proto__=Uint8Array;
+    
+    function assertSize(size){
+    if(typeof size!=='number'){
+    throw new TypeError('"size" argument must be of type number');
+    }else if(size<0){
+    throw new RangeError('The value "'+size+'" is invalid for option "size"');
+    }
+    }
+    
+    function alloc(size,fill,encoding){
+    assertSize(size);
+    if(size<=0){
+    return createBuffer(size);
+    }
+    if(fill!==undefined){
+    
+    
+    
+    return typeof encoding==='string'?
+    createBuffer(size).fill(fill,encoding):
+    createBuffer(size).fill(fill);
+    }
+    return createBuffer(size);
+    }
+    
+    
+    
+    
+    
+    Buffer.alloc=function(size,fill,encoding){
+    return alloc(size,fill,encoding);
+    };
+    
+    function allocUnsafe(size){
+    assertSize(size);
+    return createBuffer(size<0?0:checked(size)|0);
+    }
+    
+    
+    
+    
+    Buffer.allocUnsafe=function(size){
+    return allocUnsafe(size);
+    };
+    
+    
+    
+    Buffer.allocUnsafeSlow=function(size){
+    return allocUnsafe(size);
+    };
+    
+    function fromString(string,encoding){
+    if(typeof encoding!=='string'||encoding===''){
+    encoding='utf8';
+    }
+    
+    if(!Buffer.isEncoding(encoding)){
+    throw new TypeError('Unknown encoding: '+encoding);
+    }
+    
+    var length=byteLength(string,encoding)|0;
+    var buf=createBuffer(length);
+    
+    var actual=buf.write(string,encoding);
+    
+    if(actual!==length){
+    
+    
+    
+    buf=buf.slice(0,actual);
+    }
+    
+    return buf;
+    }
+    
+    function fromArrayLike(array){
+    var length=array.length<0?0:checked(array.length)|0;
+    var buf=createBuffer(length);
+    for(var i=0;i<length;i+=1){
+    buf[i]=array[i]&255;
+    }
+    return buf;
+    }
+    
+    function fromArrayBuffer(array,byteOffset,length){
+    if(byteOffset<0||array.byteLength<byteOffset){
+    throw new RangeError('"offset" is outside of buffer bounds');
+    }
+    
+    if(array.byteLength<byteOffset+(length||0)){
+    throw new RangeError('"length" is outside of buffer bounds');
+    }
+    
+    var buf;
+    if(byteOffset===undefined&&length===undefined){
+    buf=new Uint8Array(array);
+    }else if(length===undefined){
+    buf=new Uint8Array(array,byteOffset);
+    }else{
+    buf=new Uint8Array(array,byteOffset,length);
+    }
+    
+    
+    buf.__proto__=Buffer.prototype;
+    return buf;
+    }
+    
+    function fromObject(obj){
+    if(Buffer.isBuffer(obj)){
+    var len=checked(obj.length)|0;
+    var buf=createBuffer(len);
+    
+    if(buf.length===0){
+    return buf;
+    }
+    
+    obj.copy(buf,0,0,len);
+    return buf;
+    }
+    
+    if(obj.length!==undefined){
+    if(typeof obj.length!=='number'||numberIsNaN(obj.length)){
+    return createBuffer(0);
+    }
+    return fromArrayLike(obj);
+    }
+    
+    if(obj.type==='Buffer'&&Array.isArray(obj.data)){
+    return fromArrayLike(obj.data);
+    }
+    }
+    
+    function checked(length){
+    
+    
+    if(length>=K_MAX_LENGTH){
+    throw new RangeError('Attempt to allocate Buffer larger than maximum '+
+    'size: 0x'+K_MAX_LENGTH.toString(16)+' bytes');
+    }
+    return length|0;
+    }
+    
+    function SlowBuffer(length){
+    if(+length!=length){
+    length=0;
+    }
+    return Buffer.alloc(+length);
+    }
+    
+    Buffer.isBuffer=function isBuffer(b){
+    return b!=null&&b._isBuffer===true&&
+    b!==Buffer.prototype;
+    };
+    
+    Buffer.compare=function compare(a,b){
+    if(isInstance(a,Uint8Array))a=Buffer.from(a,a.offset,a.byteLength);
+    if(isInstance(b,Uint8Array))b=Buffer.from(b,b.offset,b.byteLength);
+    if(!Buffer.isBuffer(a)||!Buffer.isBuffer(b)){
+    throw new TypeError(
+    'The "buf1", "buf2" arguments must be one of type Buffer or Uint8Array');
+    
+    }
+    
+    if(a===b)return 0;
+    
+    var x=a.length;
+    var y=b.length;
+    
+    for(var i=0,len=Math.min(x,y);i<len;++i){
+    if(a[i]!==b[i]){
+    x=a[i];
+    y=b[i];
+    break;
+    }
+    }
+    
+    if(x<y)return-1;
+    if(y<x)return 1;
+    return 0;
+    };
+    
+    Buffer.isEncoding=function isEncoding(encoding){
+    switch(String(encoding).toLowerCase()){
+    case'hex':
+    case'utf8':
+    case'utf-8':
+    case'ascii':
+    case'latin1':
+    case'binary':
+    case'base64':
+    case'ucs2':
+    case'ucs-2':
+    case'utf16le':
+    case'utf-16le':
+    return true;
+    default:
+    return false;}
+    
+    };
+    
+    Buffer.concat=function concat(list,length){
+    if(!Array.isArray(list)){
+    throw new TypeError('"list" argument must be an Array of Buffers');
+    }
+    
+    if(list.length===0){
+    return Buffer.alloc(0);
+    }
+    
+    var i;
+    if(length===undefined){
+    length=0;
+    for(i=0;i<list.length;++i){
+    length+=list[i].length;
+    }
+    }
+    
+    var buffer=Buffer.allocUnsafe(length);
+    var pos=0;
+    for(i=0;i<list.length;++i){
+    var buf=list[i];
+    if(isInstance(buf,Uint8Array)){
+    buf=Buffer.from(buf);
+    }
+    if(!Buffer.isBuffer(buf)){
+    throw new TypeError('"list" argument must be an Array of Buffers');
+    }
+    buf.copy(buffer,pos);
+    pos+=buf.length;
+    }
+    return buffer;
+    };
+    
+    function byteLength(string,encoding){
+    if(Buffer.isBuffer(string)){
+    return string.length;
+    }
+    if(ArrayBuffer.isView(string)||isInstance(string,ArrayBuffer)){
+    return string.byteLength;
+    }
+    if(typeof string!=='string'){
+    throw new TypeError(
+    'The "string" argument must be one of type string, Buffer, or ArrayBuffer. '+
+    'Received type '+typeof string);
+    
+    }
+    
+    var len=string.length;
+    var mustMatch=arguments.length>2&&arguments[2]===true;
+    if(!mustMatch&&len===0)return 0;
+    
+    
+    var loweredCase=false;
+    for(;;){
+    switch(encoding){
+    case'ascii':
+    case'latin1':
+    case'binary':
+    return len;
+    case'utf8':
+    case'utf-8':
+    return utf8ToBytes(string).length;
+    case'ucs2':
+    case'ucs-2':
+    case'utf16le':
+    case'utf-16le':
+    return len*2;
+    case'hex':
+    return len>>>1;
+    case'base64':
+    return base64ToBytes(string).length;
+    default:
+    if(loweredCase){
+    return mustMatch?-1:utf8ToBytes(string).length;
+    }
+    encoding=(''+encoding).toLowerCase();
+    loweredCase=true;}
+    
+    }
+    }
+    Buffer.byteLength=byteLength;
+    
+    function slowToString(encoding,start,end){
+    var loweredCase=false;
+    
+    
+    
+    
+    
+    
+    
+    
+    if(start===undefined||start<0){
+    start=0;
+    }
+    
+    
+    if(start>this.length){
+    return'';
+    }
+    
+    if(end===undefined||end>this.length){
+    end=this.length;
+    }
+    
+    if(end<=0){
+    return'';
+    }
+    
+    
+    end>>>=0;
+    start>>>=0;
+    
+    if(end<=start){
+    return'';
+    }
+    
+    if(!encoding)encoding='utf8';
+    
+    while(true){
+    switch(encoding){
+    case'hex':
+    return hexSlice(this,start,end);
+    
+    case'utf8':
+    case'utf-8':
+    return utf8Slice(this,start,end);
+    
+    case'ascii':
+    return asciiSlice(this,start,end);
+    
+    case'latin1':
+    case'binary':
+    return latin1Slice(this,start,end);
+    
+    case'base64':
+    return base64Slice(this,start,end);
+    
+    case'ucs2':
+    case'ucs-2':
+    case'utf16le':
+    case'utf-16le':
+    return utf16leSlice(this,start,end);
+    
+    default:
+    if(loweredCase)throw new TypeError('Unknown encoding: '+encoding);
+    encoding=(encoding+'').toLowerCase();
+    loweredCase=true;}
+    
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    Buffer.prototype._isBuffer=true;
+    
+    function swap(b,n,m){
+    var i=b[n];
+    b[n]=b[m];
+    b[m]=i;
+    }
+    
+    Buffer.prototype.swap16=function swap16(){
+    var len=this.length;
+    if(len%2!==0){
+    throw new RangeError('Buffer size must be a multiple of 16-bits');
+    }
+    for(var i=0;i<len;i+=2){
+    swap(this,i,i+1);
+    }
+    return this;
+    };
+    
+    Buffer.prototype.swap32=function swap32(){
+    var len=this.length;
+    if(len%4!==0){
+    throw new RangeError('Buffer size must be a multiple of 32-bits');
+    }
+    for(var i=0;i<len;i+=4){
+    swap(this,i,i+3);
+    swap(this,i+1,i+2);
+    }
+    return this;
+    };
+    
+    Buffer.prototype.swap64=function swap64(){
+    var len=this.length;
+    if(len%8!==0){
+    throw new RangeError('Buffer size must be a multiple of 64-bits');
+    }
+    for(var i=0;i<len;i+=8){
+    swap(this,i,i+7);
+    swap(this,i+1,i+6);
+    swap(this,i+2,i+5);
+    swap(this,i+3,i+4);
+    }
+    return this;
+    };
+    
+    Buffer.prototype.toString=function toString(){
+    var length=this.length;
+    if(length===0)return'';
+    if(arguments.length===0)return utf8Slice(this,0,length);
+    return slowToString.apply(this,arguments);
+    };
+    
+    Buffer.prototype.toLocaleString=Buffer.prototype.toString;
+    
+    Buffer.prototype.equals=function equals(b){
+    if(!Buffer.isBuffer(b))throw new TypeError('Argument must be a Buffer');
+    if(this===b)return true;
+    return Buffer.compare(this,b)===0;
+    };
+    
+    Buffer.prototype.inspect=function inspect(){
+    var str='';
+    var max=exports.INSPECT_MAX_BYTES;
+    str=this.toString('hex',0,max).replace(/(.{2})/g,'$1 ').trim();
+    if(this.length>max)str+=' ... ';
+    return'<Buffer '+str+'>';
+    };
+    
+    Buffer.prototype.compare=function compare(target,start,end,thisStart,thisEnd){
+    if(isInstance(target,Uint8Array)){
+    target=Buffer.from(target,target.offset,target.byteLength);
+    }
+    if(!Buffer.isBuffer(target)){
+    throw new TypeError(
+    'The "target" argument must be one of type Buffer or Uint8Array. '+
+    'Received type '+typeof target);
+    
+    }
+    
+    if(start===undefined){
+    start=0;
+    }
+    if(end===undefined){
+    end=target?target.length:0;
+    }
+    if(thisStart===undefined){
+    thisStart=0;
+    }
+    if(thisEnd===undefined){
+    thisEnd=this.length;
+    }
+    
+    if(start<0||end>target.length||thisStart<0||thisEnd>this.length){
+    throw new RangeError('out of range index');
+    }
+    
+    if(thisStart>=thisEnd&&start>=end){
+    return 0;
+    }
+    if(thisStart>=thisEnd){
+    return-1;
+    }
+    if(start>=end){
+    return 1;
+    }
+    
+    start>>>=0;
+    end>>>=0;
+    thisStart>>>=0;
+    thisEnd>>>=0;
+    
+    if(this===target)return 0;
+    
+    var x=thisEnd-thisStart;
+    var y=end-start;
+    var len=Math.min(x,y);
+    
+    var thisCopy=this.slice(thisStart,thisEnd);
+    var targetCopy=target.slice(start,end);
+    
+    for(var i=0;i<len;++i){
+    if(thisCopy[i]!==targetCopy[i]){
+    x=thisCopy[i];
+    y=targetCopy[i];
+    break;
+    }
+    }
+    
+    if(x<y)return-1;
+    if(y<x)return 1;
+    return 0;
+    };
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function bidirectionalIndexOf(buffer,val,byteOffset,encoding,dir){
+    
+    if(buffer.length===0)return-1;
+    
+    
+    if(typeof byteOffset==='string'){
+    encoding=byteOffset;
+    byteOffset=0;
+    }else if(byteOffset>0x7fffffff){
+    byteOffset=0x7fffffff;
+    }else if(byteOffset<-0x80000000){
+    byteOffset=-0x80000000;
+    }
+    byteOffset=+byteOffset;
+    if(numberIsNaN(byteOffset)){
+    
+    byteOffset=dir?0:buffer.length-1;
+    }
+    
+    
+    if(byteOffset<0)byteOffset=buffer.length+byteOffset;
+    if(byteOffset>=buffer.length){
+    if(dir)return-1;else
+    byteOffset=buffer.length-1;
+    }else if(byteOffset<0){
+    if(dir)byteOffset=0;else
+    return-1;
+    }
+    
+    
+    if(typeof val==='string'){
+    val=Buffer.from(val,encoding);
+    }
+    
+    
+    if(Buffer.isBuffer(val)){
+    
+    if(val.length===0){
+    return-1;
+    }
+    return arrayIndexOf(buffer,val,byteOffset,encoding,dir);
+    }else if(typeof val==='number'){
+    val=val&0xFF;
+    if(typeof Uint8Array.prototype.indexOf==='function'){
+    if(dir){
+    return Uint8Array.prototype.indexOf.call(buffer,val,byteOffset);
+    }else{
+    return Uint8Array.prototype.lastIndexOf.call(buffer,val,byteOffset);
+    }
+    }
+    return arrayIndexOf(buffer,[val],byteOffset,encoding,dir);
+    }
+    
+    throw new TypeError('val must be string, number or Buffer');
+    }
+    
+    function arrayIndexOf(arr,val,byteOffset,encoding,dir){
+    var indexSize=1;
+    var arrLength=arr.length;
+    var valLength=val.length;
+    
+    if(encoding!==undefined){
+    encoding=String(encoding).toLowerCase();
+    if(encoding==='ucs2'||encoding==='ucs-2'||
+    encoding==='utf16le'||encoding==='utf-16le'){
+    if(arr.length<2||val.length<2){
+    return-1;
+    }
+    indexSize=2;
+    arrLength/=2;
+    valLength/=2;
+    byteOffset/=2;
+    }
+    }
+    
+    function read(buf,i){
+    if(indexSize===1){
+    return buf[i];
+    }else{
+    return buf.readUInt16BE(i*indexSize);
+    }
+    }
+    
+    var i;
+    if(dir){
+    var foundIndex=-1;
+    for(i=byteOffset;i<arrLength;i++){
+    if(read(arr,i)===read(val,foundIndex===-1?0:i-foundIndex)){
+    if(foundIndex===-1)foundIndex=i;
+    if(i-foundIndex+1===valLength)return foundIndex*indexSize;
+    }else{
+    if(foundIndex!==-1)i-=i-foundIndex;
+    foundIndex=-1;
+    }
+    }
+    }else{
+    if(byteOffset+valLength>arrLength)byteOffset=arrLength-valLength;
+    for(i=byteOffset;i>=0;i--){
+    var found=true;
+    for(var j=0;j<valLength;j++){
+    if(read(arr,i+j)!==read(val,j)){
+    found=false;
+    break;
+    }
+    }
+    if(found)return i;
+    }
+    }
+    
+    return-1;
+    }
+    
+    Buffer.prototype.includes=function includes(val,byteOffset,encoding){
+    return this.indexOf(val,byteOffset,encoding)!==-1;
+    };
+    
+    Buffer.prototype.indexOf=function indexOf(val,byteOffset,encoding){
+    return bidirectionalIndexOf(this,val,byteOffset,encoding,true);
+    };
+    
+    Buffer.prototype.lastIndexOf=function lastIndexOf(val,byteOffset,encoding){
+    return bidirectionalIndexOf(this,val,byteOffset,encoding,false);
+    };
+    
+    function hexWrite(buf,string,offset,length){
+    offset=Number(offset)||0;
+    var remaining=buf.length-offset;
+    if(!length){
+    length=remaining;
+    }else{
+    length=Number(length);
+    if(length>remaining){
+    length=remaining;
+    }
+    }
+    
+    var strLen=string.length;
+    
+    if(length>strLen/2){
+    length=strLen/2;
+    }
+    for(var i=0;i<length;++i){
+    var parsed=parseInt(string.substr(i*2,2),16);
+    if(numberIsNaN(parsed))return i;
+    buf[offset+i]=parsed;
+    }
+    return i;
+    }
+    
+    function utf8Write(buf,string,offset,length){
+    return blitBuffer(utf8ToBytes(string,buf.length-offset),buf,offset,length);
+    }
+    
+    function asciiWrite(buf,string,offset,length){
+    return blitBuffer(asciiToBytes(string),buf,offset,length);
+    }
+    
+    function latin1Write(buf,string,offset,length){
+    return asciiWrite(buf,string,offset,length);
+    }
+    
+    function base64Write(buf,string,offset,length){
+    return blitBuffer(base64ToBytes(string),buf,offset,length);
+    }
+    
+    function ucs2Write(buf,string,offset,length){
+    return blitBuffer(utf16leToBytes(string,buf.length-offset),buf,offset,length);
+    }
+    
+    Buffer.prototype.write=function write(string,offset,length,encoding){
+    
+    if(offset===undefined){
+    encoding='utf8';
+    length=this.length;
+    offset=0;
+    
+    }else if(length===undefined&&typeof offset==='string'){
+    encoding=offset;
+    length=this.length;
+    offset=0;
+    
+    }else if(isFinite(offset)){
+    offset=offset>>>0;
+    if(isFinite(length)){
+    length=length>>>0;
+    if(encoding===undefined)encoding='utf8';
+    }else{
+    encoding=length;
+    length=undefined;
+    }
+    }else{
+    throw new Error(
+    'Buffer.write(string, encoding, offset[, length]) is no longer supported');
+    
+    }
+    
+    var remaining=this.length-offset;
+    if(length===undefined||length>remaining)length=remaining;
+    
+    if(string.length>0&&(length<0||offset<0)||offset>this.length){
+    throw new RangeError('Attempt to write outside buffer bounds');
+    }
+    
+    if(!encoding)encoding='utf8';
+    
+    var loweredCase=false;
+    for(;;){
+    switch(encoding){
+    case'hex':
+    return hexWrite(this,string,offset,length);
+    
+    case'utf8':
+    case'utf-8':
+    return utf8Write(this,string,offset,length);
+    
+    case'ascii':
+    return asciiWrite(this,string,offset,length);
+    
+    case'latin1':
+    case'binary':
+    return latin1Write(this,string,offset,length);
+    
+    case'base64':
+    
+    return base64Write(this,string,offset,length);
+    
+    case'ucs2':
+    case'ucs-2':
+    case'utf16le':
+    case'utf-16le':
+    return ucs2Write(this,string,offset,length);
+    
+    default:
+    if(loweredCase)throw new TypeError('Unknown encoding: '+encoding);
+    encoding=(''+encoding).toLowerCase();
+    loweredCase=true;}
+    
+    }
+    };
+    
+    Buffer.prototype.toJSON=function toJSON(){
+    return{
+    type:'Buffer',
+    data:Array.prototype.slice.call(this._arr||this,0)};
+    
+    };
+    
+    function base64Slice(buf,start,end){
+    if(start===0&&end===buf.length){
+    return base64.fromByteArray(buf);
+    }else{
+    return base64.fromByteArray(buf.slice(start,end));
+    }
+    }
+    
+    function utf8Slice(buf,start,end){
+    end=Math.min(buf.length,end);
+    var res=[];
+    
+    var i=start;
+    while(i<end){
+    var firstByte=buf[i];
+    var codePoint=null;
+    var bytesPerSequence=firstByte>0xEF?4:
+    firstByte>0xDF?3:
+    firstByte>0xBF?2:
+    1;
+    
+    if(i+bytesPerSequence<=end){
+    var secondByte,thirdByte,fourthByte,tempCodePoint;
+    
+    switch(bytesPerSequence){
+    case 1:
+    if(firstByte<0x80){
+    codePoint=firstByte;
+    }
+    break;
+    case 2:
+    secondByte=buf[i+1];
+    if((secondByte&0xC0)===0x80){
+    tempCodePoint=(firstByte&0x1F)<<0x6|secondByte&0x3F;
+    if(tempCodePoint>0x7F){
+    codePoint=tempCodePoint;
+    }
+    }
+    break;
+    case 3:
+    secondByte=buf[i+1];
+    thirdByte=buf[i+2];
+    if((secondByte&0xC0)===0x80&&(thirdByte&0xC0)===0x80){
+    tempCodePoint=(firstByte&0xF)<<0xC|(secondByte&0x3F)<<0x6|thirdByte&0x3F;
+    if(tempCodePoint>0x7FF&&(tempCodePoint<0xD800||tempCodePoint>0xDFFF)){
+    codePoint=tempCodePoint;
+    }
+    }
+    break;
+    case 4:
+    secondByte=buf[i+1];
+    thirdByte=buf[i+2];
+    fourthByte=buf[i+3];
+    if((secondByte&0xC0)===0x80&&(thirdByte&0xC0)===0x80&&(fourthByte&0xC0)===0x80){
+    tempCodePoint=(firstByte&0xF)<<0x12|(secondByte&0x3F)<<0xC|(thirdByte&0x3F)<<0x6|fourthByte&0x3F;
+    if(tempCodePoint>0xFFFF&&tempCodePoint<0x110000){
+    codePoint=tempCodePoint;
+    }
+    }}
+    
+    }
+    
+    if(codePoint===null){
+    
+    
+    codePoint=0xFFFD;
+    bytesPerSequence=1;
+    }else if(codePoint>0xFFFF){
+    
+    codePoint-=0x10000;
+    res.push(codePoint>>>10&0x3FF|0xD800);
+    codePoint=0xDC00|codePoint&0x3FF;
+    }
+    
+    res.push(codePoint);
+    i+=bytesPerSequence;
+    }
+    
+    return decodeCodePointsArray(res);
+    }
+    
+    
+    
+    
+    var MAX_ARGUMENTS_LENGTH=0x1000;
+    
+    function decodeCodePointsArray(codePoints){
+    var len=codePoints.length;
+    if(len<=MAX_ARGUMENTS_LENGTH){
+    return String.fromCharCode.apply(String,codePoints);
+    }
+    
+    
+    var res='';
+    var i=0;
+    while(i<len){
+    res+=String.fromCharCode.apply(
+    String,
+    codePoints.slice(i,i+=MAX_ARGUMENTS_LENGTH));
+    
+    }
+    return res;
+    }
+    
+    function asciiSlice(buf,start,end){
+    var ret='';
+    end=Math.min(buf.length,end);
+    
+    for(var i=start;i<end;++i){
+    ret+=String.fromCharCode(buf[i]&0x7F);
+    }
+    return ret;
+    }
+    
+    function latin1Slice(buf,start,end){
+    var ret='';
+    end=Math.min(buf.length,end);
+    
+    for(var i=start;i<end;++i){
+    ret+=String.fromCharCode(buf[i]);
+    }
+    return ret;
+    }
+    
+    function hexSlice(buf,start,end){
+    var len=buf.length;
+    
+    if(!start||start<0)start=0;
+    if(!end||end<0||end>len)end=len;
+    
+    var out='';
+    for(var i=start;i<end;++i){
+    out+=toHex(buf[i]);
+    }
+    return out;
+    }
+    
+    function utf16leSlice(buf,start,end){
+    var bytes=buf.slice(start,end);
+    var res='';
+    for(var i=0;i<bytes.length;i+=2){
+    res+=String.fromCharCode(bytes[i]+bytes[i+1]*256);
+    }
+    return res;
+    }
+    
+    Buffer.prototype.slice=function slice(start,end){
+    var len=this.length;
+    start=~~start;
+    end=end===undefined?len:~~end;
+    
+    if(start<0){
+    start+=len;
+    if(start<0)start=0;
+    }else if(start>len){
+    start=len;
+    }
+    
+    if(end<0){
+    end+=len;
+    if(end<0)end=0;
+    }else if(end>len){
+    end=len;
+    }
+    
+    if(end<start)end=start;
+    
+    var newBuf=this.subarray(start,end);
+    
+    newBuf.__proto__=Buffer.prototype;
+    return newBuf;
+    };
+    
+    
+    
+    
+    function checkOffset(offset,ext,length){
+    if(offset%1!==0||offset<0)throw new RangeError('offset is not uint');
+    if(offset+ext>length)throw new RangeError('Trying to access beyond buffer length');
+    }
+    
+    Buffer.prototype.readUIntLE=function readUIntLE(offset,byteLength,noAssert){
+    offset=offset>>>0;
+    byteLength=byteLength>>>0;
+    if(!noAssert)checkOffset(offset,byteLength,this.length);
+    
+    var val=this[offset];
+    var mul=1;
+    var i=0;
+    while(++i<byteLength&&(mul*=0x100)){
+    val+=this[offset+i]*mul;
+    }
+    
+    return val;
+    };
+    
+    Buffer.prototype.readUIntBE=function readUIntBE(offset,byteLength,noAssert){
+    offset=offset>>>0;
+    byteLength=byteLength>>>0;
+    if(!noAssert){
+    checkOffset(offset,byteLength,this.length);
+    }
+    
+    var val=this[offset+--byteLength];
+    var mul=1;
+    while(byteLength>0&&(mul*=0x100)){
+    val+=this[offset+--byteLength]*mul;
+    }
+    
+    return val;
+    };
+    
+    Buffer.prototype.readUInt8=function readUInt8(offset,noAssert){
+    offset=offset>>>0;
+    if(!noAssert)checkOffset(offset,1,this.length);
+    return this[offset];
+    };
+    
+    Buffer.prototype.readUInt16LE=function readUInt16LE(offset,noAssert){
+    offset=offset>>>0;
+    if(!noAssert)checkOffset(offset,2,this.length);
+    return this[offset]|this[offset+1]<<8;
+    };
+    
+    Buffer.prototype.readUInt16BE=function readUInt16BE(offset,noAssert){
+    offset=offset>>>0;
+    if(!noAssert)checkOffset(offset,2,this.length);
+    return this[offset]<<8|this[offset+1];
+    };
+    
+    Buffer.prototype.readUInt32LE=function readUInt32LE(offset,noAssert){
+    offset=offset>>>0;
+    if(!noAssert)checkOffset(offset,4,this.length);
+    
+    return(this[offset]|
+    this[offset+1]<<8|
+    this[offset+2]<<16)+
+    this[offset+3]*0x1000000;
+    };
+    
+    Buffer.prototype.readUInt32BE=function readUInt32BE(offset,noAssert){
+    offset=offset>>>0;
+    if(!noAssert)checkOffset(offset,4,this.length);
+    
+    return this[offset]*0x1000000+(
+    this[offset+1]<<16|
+    this[offset+2]<<8|
+    this[offset+3]);
+    };
+    
+    Buffer.prototype.readIntLE=function readIntLE(offset,byteLength,noAssert){
+    offset=offset>>>0;
+    byteLength=byteLength>>>0;
+    if(!noAssert)checkOffset(offset,byteLength,this.length);
+    
+    var val=this[offset];
+    var mul=1;
+    var i=0;
+    while(++i<byteLength&&(mul*=0x100)){
+    val+=this[offset+i]*mul;
+    }
+    mul*=0x80;
+    
+    if(val>=mul)val-=Math.pow(2,8*byteLength);
+    
+    return val;
+    };
+    
+    Buffer.prototype.readIntBE=function readIntBE(offset,byteLength,noAssert){
+    offset=offset>>>0;
+    byteLength=byteLength>>>0;
+    if(!noAssert)checkOffset(offset,byteLength,this.length);
+    
+    var i=byteLength;
+    var mul=1;
+    var val=this[offset+--i];
+    while(i>0&&(mul*=0x100)){
+    val+=this[offset+--i]*mul;
+    }
+    mul*=0x80;
+    
+    if(val>=mul)val-=Math.pow(2,8*byteLength);
+    
+    return val;
+    };
+    
+    Buffer.prototype.readInt8=function readInt8(offset,noAssert){
+    offset=offset>>>0;
+    if(!noAssert)checkOffset(offset,1,this.length);
+    if(!(this[offset]&0x80))return this[offset];
+    return(0xff-this[offset]+1)*-1;
+    };
+    
+    Buffer.prototype.readInt16LE=function readInt16LE(offset,noAssert){
+    offset=offset>>>0;
+    if(!noAssert)checkOffset(offset,2,this.length);
+    var val=this[offset]|this[offset+1]<<8;
+    return val&0x8000?val|0xFFFF0000:val;
+    };
+    
+    Buffer.prototype.readInt16BE=function readInt16BE(offset,noAssert){
+    offset=offset>>>0;
+    if(!noAssert)checkOffset(offset,2,this.length);
+    var val=this[offset+1]|this[offset]<<8;
+    return val&0x8000?val|0xFFFF0000:val;
+    };
+    
+    Buffer.prototype.readInt32LE=function readInt32LE(offset,noAssert){
+    offset=offset>>>0;
+    if(!noAssert)checkOffset(offset,4,this.length);
+    
+    return this[offset]|
+    this[offset+1]<<8|
+    this[offset+2]<<16|
+    this[offset+3]<<24;
+    };
+    
+    Buffer.prototype.readInt32BE=function readInt32BE(offset,noAssert){
+    offset=offset>>>0;
+    if(!noAssert)checkOffset(offset,4,this.length);
+    
+    return this[offset]<<24|
+    this[offset+1]<<16|
+    this[offset+2]<<8|
+    this[offset+3];
+    };
+    
+    Buffer.prototype.readFloatLE=function readFloatLE(offset,noAssert){
+    offset=offset>>>0;
+    if(!noAssert)checkOffset(offset,4,this.length);
+    return ieee754.read(this,offset,true,23,4);
+    };
+    
+    Buffer.prototype.readFloatBE=function readFloatBE(offset,noAssert){
+    offset=offset>>>0;
+    if(!noAssert)checkOffset(offset,4,this.length);
+    return ieee754.read(this,offset,false,23,4);
+    };
+    
+    Buffer.prototype.readDoubleLE=function readDoubleLE(offset,noAssert){
+    offset=offset>>>0;
+    if(!noAssert)checkOffset(offset,8,this.length);
+    return ieee754.read(this,offset,true,52,8);
+    };
+    
+    Buffer.prototype.readDoubleBE=function readDoubleBE(offset,noAssert){
+    offset=offset>>>0;
+    if(!noAssert)checkOffset(offset,8,this.length);
+    return ieee754.read(this,offset,false,52,8);
+    };
+    
+    function checkInt(buf,value,offset,ext,max,min){
+    if(!Buffer.isBuffer(buf))throw new TypeError('"buffer" argument must be a Buffer instance');
+    if(value>max||value<min)throw new RangeError('"value" argument is out of bounds');
+    if(offset+ext>buf.length)throw new RangeError('Index out of range');
+    }
+    
+    Buffer.prototype.writeUIntLE=function writeUIntLE(value,offset,byteLength,noAssert){
+    value=+value;
+    offset=offset>>>0;
+    byteLength=byteLength>>>0;
+    if(!noAssert){
+    var maxBytes=Math.pow(2,8*byteLength)-1;
+    checkInt(this,value,offset,byteLength,maxBytes,0);
+    }
+    
+    var mul=1;
+    var i=0;
+    this[offset]=value&0xFF;
+    while(++i<byteLength&&(mul*=0x100)){
+    this[offset+i]=value/mul&0xFF;
+    }
+    
+    return offset+byteLength;
+    };
+    
+    Buffer.prototype.writeUIntBE=function writeUIntBE(value,offset,byteLength,noAssert){
+    value=+value;
+    offset=offset>>>0;
+    byteLength=byteLength>>>0;
+    if(!noAssert){
+    var maxBytes=Math.pow(2,8*byteLength)-1;
+    checkInt(this,value,offset,byteLength,maxBytes,0);
+    }
+    
+    var i=byteLength-1;
+    var mul=1;
+    this[offset+i]=value&0xFF;
+    while(--i>=0&&(mul*=0x100)){
+    this[offset+i]=value/mul&0xFF;
+    }
+    
+    return offset+byteLength;
+    };
+    
+    Buffer.prototype.writeUInt8=function writeUInt8(value,offset,noAssert){
+    value=+value;
+    offset=offset>>>0;
+    if(!noAssert)checkInt(this,value,offset,1,0xff,0);
+    this[offset]=value&0xff;
+    return offset+1;
+    };
+    
+    Buffer.prototype.writeUInt16LE=function writeUInt16LE(value,offset,noAssert){
+    value=+value;
+    offset=offset>>>0;
+    if(!noAssert)checkInt(this,value,offset,2,0xffff,0);
+    this[offset]=value&0xff;
+    this[offset+1]=value>>>8;
+    return offset+2;
+    };
+    
+    Buffer.prototype.writeUInt16BE=function writeUInt16BE(value,offset,noAssert){
+    value=+value;
+    offset=offset>>>0;
+    if(!noAssert)checkInt(this,value,offset,2,0xffff,0);
+    this[offset]=value>>>8;
+    this[offset+1]=value&0xff;
+    return offset+2;
+    };
+    
+    Buffer.prototype.writeUInt32LE=function writeUInt32LE(value,offset,noAssert){
+    value=+value;
+    offset=offset>>>0;
+    if(!noAssert)checkInt(this,value,offset,4,0xffffffff,0);
+    this[offset+3]=value>>>24;
+    this[offset+2]=value>>>16;
+    this[offset+1]=value>>>8;
+    this[offset]=value&0xff;
+    return offset+4;
+    };
+    
+    Buffer.prototype.writeUInt32BE=function writeUInt32BE(value,offset,noAssert){
+    value=+value;
+    offset=offset>>>0;
+    if(!noAssert)checkInt(this,value,offset,4,0xffffffff,0);
+    this[offset]=value>>>24;
+    this[offset+1]=value>>>16;
+    this[offset+2]=value>>>8;
+    this[offset+3]=value&0xff;
+    return offset+4;
+    };
+    
+    Buffer.prototype.writeIntLE=function writeIntLE(value,offset,byteLength,noAssert){
+    value=+value;
+    offset=offset>>>0;
+    if(!noAssert){
+    var limit=Math.pow(2,8*byteLength-1);
+    
+    checkInt(this,value,offset,byteLength,limit-1,-limit);
+    }
+    
+    var i=0;
+    var mul=1;
+    var sub=0;
+    this[offset]=value&0xFF;
+    while(++i<byteLength&&(mul*=0x100)){
+    if(value<0&&sub===0&&this[offset+i-1]!==0){
+    sub=1;
+    }
+    this[offset+i]=(value/mul>>0)-sub&0xFF;
+    }
+    
+    return offset+byteLength;
+    };
+    
+    Buffer.prototype.writeIntBE=function writeIntBE(value,offset,byteLength,noAssert){
+    value=+value;
+    offset=offset>>>0;
+    if(!noAssert){
+    var limit=Math.pow(2,8*byteLength-1);
+    
+    checkInt(this,value,offset,byteLength,limit-1,-limit);
+    }
+    
+    var i=byteLength-1;
+    var mul=1;
+    var sub=0;
+    this[offset+i]=value&0xFF;
+    while(--i>=0&&(mul*=0x100)){
+    if(value<0&&sub===0&&this[offset+i+1]!==0){
+    sub=1;
+    }
+    this[offset+i]=(value/mul>>0)-sub&0xFF;
+    }
+    
+    return offset+byteLength;
+    };
+    
+    Buffer.prototype.writeInt8=function writeInt8(value,offset,noAssert){
+    value=+value;
+    offset=offset>>>0;
+    if(!noAssert)checkInt(this,value,offset,1,0x7f,-0x80);
+    if(value<0)value=0xff+value+1;
+    this[offset]=value&0xff;
+    return offset+1;
+    };
+    
+    Buffer.prototype.writeInt16LE=function writeInt16LE(value,offset,noAssert){
+    value=+value;
+    offset=offset>>>0;
+    if(!noAssert)checkInt(this,value,offset,2,0x7fff,-0x8000);
+    this[offset]=value&0xff;
+    this[offset+1]=value>>>8;
+    return offset+2;
+    };
+    
+    Buffer.prototype.writeInt16BE=function writeInt16BE(value,offset,noAssert){
+    value=+value;
+    offset=offset>>>0;
+    if(!noAssert)checkInt(this,value,offset,2,0x7fff,-0x8000);
+    this[offset]=value>>>8;
+    this[offset+1]=value&0xff;
+    return offset+2;
+    };
+    
+    Buffer.prototype.writeInt32LE=function writeInt32LE(value,offset,noAssert){
+    value=+value;
+    offset=offset>>>0;
+    if(!noAssert)checkInt(this,value,offset,4,0x7fffffff,-0x80000000);
+    this[offset]=value&0xff;
+    this[offset+1]=value>>>8;
+    this[offset+2]=value>>>16;
+    this[offset+3]=value>>>24;
+    return offset+4;
+    };
+    
+    Buffer.prototype.writeInt32BE=function writeInt32BE(value,offset,noAssert){
+    value=+value;
+    offset=offset>>>0;
+    if(!noAssert)checkInt(this,value,offset,4,0x7fffffff,-0x80000000);
+    if(value<0)value=0xffffffff+value+1;
+    this[offset]=value>>>24;
+    this[offset+1]=value>>>16;
+    this[offset+2]=value>>>8;
+    this[offset+3]=value&0xff;
+    return offset+4;
+    };
+    
+    function checkIEEE754(buf,value,offset,ext,max,min){
+    if(offset+ext>buf.length)throw new RangeError('Index out of range');
+    if(offset<0)throw new RangeError('Index out of range');
+    }
+    
+    function writeFloat(buf,value,offset,littleEndian,noAssert){
+    value=+value;
+    offset=offset>>>0;
+    if(!noAssert){
+    checkIEEE754(buf,value,offset,4,3.4028234663852886e+38,-3.4028234663852886e+38);
+    }
+    ieee754.write(buf,value,offset,littleEndian,23,4);
+    return offset+4;
+    }
+    
+    Buffer.prototype.writeFloatLE=function writeFloatLE(value,offset,noAssert){
+    return writeFloat(this,value,offset,true,noAssert);
+    };
+    
+    Buffer.prototype.writeFloatBE=function writeFloatBE(value,offset,noAssert){
+    return writeFloat(this,value,offset,false,noAssert);
+    };
+    
+    function writeDouble(buf,value,offset,littleEndian,noAssert){
+    value=+value;
+    offset=offset>>>0;
+    if(!noAssert){
+    checkIEEE754(buf,value,offset,8,1.7976931348623157E+308,-1.7976931348623157E+308);
+    }
+    ieee754.write(buf,value,offset,littleEndian,52,8);
+    return offset+8;
+    }
+    
+    Buffer.prototype.writeDoubleLE=function writeDoubleLE(value,offset,noAssert){
+    return writeDouble(this,value,offset,true,noAssert);
+    };
+    
+    Buffer.prototype.writeDoubleBE=function writeDoubleBE(value,offset,noAssert){
+    return writeDouble(this,value,offset,false,noAssert);
+    };
+    
+    
+    Buffer.prototype.copy=function copy(target,targetStart,start,end){
+    if(!Buffer.isBuffer(target))throw new TypeError('argument should be a Buffer');
+    if(!start)start=0;
+    if(!end&&end!==0)end=this.length;
+    if(targetStart>=target.length)targetStart=target.length;
+    if(!targetStart)targetStart=0;
+    if(end>0&&end<start)end=start;
+    
+    
+    if(end===start)return 0;
+    if(target.length===0||this.length===0)return 0;
+    
+    
+    if(targetStart<0){
+    throw new RangeError('targetStart out of bounds');
+    }
+    if(start<0||start>=this.length)throw new RangeError('Index out of range');
+    if(end<0)throw new RangeError('sourceEnd out of bounds');
+    
+    
+    if(end>this.length)end=this.length;
+    if(target.length-targetStart<end-start){
+    end=target.length-targetStart+start;
+    }
+    
+    var len=end-start;
+    
+    if(this===target&&typeof Uint8Array.prototype.copyWithin==='function'){
+    
+    this.copyWithin(targetStart,start,end);
+    }else if(this===target&&start<targetStart&&targetStart<end){
+    
+    for(var i=len-1;i>=0;--i){
+    target[i+targetStart]=this[i+start];
+    }
+    }else{
+    Uint8Array.prototype.set.call(
+    target,
+    this.subarray(start,end),
+    targetStart);
+    
+    }
+    
+    return len;
+    };
+    
+    
+    
+    
+    
+    Buffer.prototype.fill=function fill(val,start,end,encoding){
+    
+    if(typeof val==='string'){
+    if(typeof start==='string'){
+    encoding=start;
+    start=0;
+    end=this.length;
+    }else if(typeof end==='string'){
+    encoding=end;
+    end=this.length;
+    }
+    if(encoding!==undefined&&typeof encoding!=='string'){
+    throw new TypeError('encoding must be a string');
+    }
+    if(typeof encoding==='string'&&!Buffer.isEncoding(encoding)){
+    throw new TypeError('Unknown encoding: '+encoding);
+    }
+    if(val.length===1){
+    var code=val.charCodeAt(0);
+    if(encoding==='utf8'&&code<128||
+    encoding==='latin1'){
+    
+    val=code;
+    }
+    }
+    }else if(typeof val==='number'){
+    val=val&255;
+    }
+    
+    
+    if(start<0||this.length<start||this.length<end){
+    throw new RangeError('Out of range index');
+    }
+    
+    if(end<=start){
+    return this;
+    }
+    
+    start=start>>>0;
+    end=end===undefined?this.length:end>>>0;
+    
+    if(!val)val=0;
+    
+    var i;
+    if(typeof val==='number'){
+    for(i=start;i<end;++i){
+    this[i]=val;
+    }
+    }else{
+    var bytes=Buffer.isBuffer(val)?
+    val:
+    Buffer.from(val,encoding);
+    var len=bytes.length;
+    if(len===0){
+    throw new TypeError('The value "'+val+
+    '" is invalid for argument "value"');
+    }
+    for(i=0;i<end-start;++i){
+    this[i+start]=bytes[i%len];
+    }
+    }
+    
+    return this;
+    };
+    
+    
+    
+    
+    var INVALID_BASE64_RE=/[^+/0-9A-Za-z-_]/g;
+    
+    function base64clean(str){
+    
+    str=str.split('=')[0];
+    
+    str=str.trim().replace(INVALID_BASE64_RE,'');
+    
+    if(str.length<2)return'';
+    
+    while(str.length%4!==0){
+    str=str+'=';
+    }
+    return str;
+    }
+    
+    function toHex(n){
+    if(n<16)return'0'+n.toString(16);
+    return n.toString(16);
+    }
+    
+    function utf8ToBytes(string,units){
+    units=units||Infinity;
+    var codePoint;
+    var length=string.length;
+    var leadSurrogate=null;
+    var bytes=[];
+    
+    for(var i=0;i<length;++i){
+    codePoint=string.charCodeAt(i);
+    
+    
+    if(codePoint>0xD7FF&&codePoint<0xE000){
+    
+    if(!leadSurrogate){
+    
+    if(codePoint>0xDBFF){
+    
+    if((units-=3)>-1)bytes.push(0xEF,0xBF,0xBD);
+    continue;
+    }else if(i+1===length){
+    
+    if((units-=3)>-1)bytes.push(0xEF,0xBF,0xBD);
+    continue;
+    }
+    
+    
+    leadSurrogate=codePoint;
+    
+    continue;
+    }
+    
+    
+    if(codePoint<0xDC00){
+    if((units-=3)>-1)bytes.push(0xEF,0xBF,0xBD);
+    leadSurrogate=codePoint;
+    continue;
+    }
+    
+    
+    codePoint=(leadSurrogate-0xD800<<10|codePoint-0xDC00)+0x10000;
+    }else if(leadSurrogate){
+    
+    if((units-=3)>-1)bytes.push(0xEF,0xBF,0xBD);
+    }
+    
+    leadSurrogate=null;
+    
+    
+    if(codePoint<0x80){
+    if((units-=1)<0)break;
+    bytes.push(codePoint);
+    }else if(codePoint<0x800){
+    if((units-=2)<0)break;
+    bytes.push(
+    codePoint>>0x6|0xC0,
+    codePoint&0x3F|0x80);
+    
+    }else if(codePoint<0x10000){
+    if((units-=3)<0)break;
+    bytes.push(
+    codePoint>>0xC|0xE0,
+    codePoint>>0x6&0x3F|0x80,
+    codePoint&0x3F|0x80);
+    
+    }else if(codePoint<0x110000){
+    if((units-=4)<0)break;
+    bytes.push(
+    codePoint>>0x12|0xF0,
+    codePoint>>0xC&0x3F|0x80,
+    codePoint>>0x6&0x3F|0x80,
+    codePoint&0x3F|0x80);
+    
+    }else{
+    throw new Error('Invalid code point');
+    }
+    }
+    
+    return bytes;
+    }
+    
+    function asciiToBytes(str){
+    var byteArray=[];
+    for(var i=0;i<str.length;++i){
+    
+    byteArray.push(str.charCodeAt(i)&0xFF);
+    }
+    return byteArray;
+    }
+    
+    function utf16leToBytes(str,units){
+    var c,hi,lo;
+    var byteArray=[];
+    for(var i=0;i<str.length;++i){
+    if((units-=2)<0)break;
+    
+    c=str.charCodeAt(i);
+    hi=c>>8;
+    lo=c%256;
+    byteArray.push(lo);
+    byteArray.push(hi);
+    }
+    
+    return byteArray;
+    }
+    
+    function base64ToBytes(str){
+    return base64.toByteArray(base64clean(str));
+    }
+    
+    function blitBuffer(src,dst,offset,length){
+    for(var i=0;i<length;++i){
+    if(i+offset>=dst.length||i>=src.length)break;
+    dst[i+offset]=src[i];
+    }
+    return i;
+    }
+    
+    
+    
+    
+    function isInstance(obj,type){
+    return obj instanceof type||
+    obj!=null&&obj.constructor!=null&&obj.constructor.name!=null&&
+    obj.constructor.name===type.name;
+    }
+    function numberIsNaN(obj){
+    
+    return obj!==obj;
+    }
+    
+    }).call(this,require("buffer").Buffer);
+    },{"base64-js":97,"buffer":102,"ieee754":111}],103:[function(require,module,exports){
+    (function(Buffer){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function isArray(arg){
+    if(Array.isArray){
+    return Array.isArray(arg);
+    }
+    return objectToString(arg)==='[object Array]';
+    }
+    exports.isArray=isArray;
+    
+    function isBoolean(arg){
+    return typeof arg==='boolean';
+    }
+    exports.isBoolean=isBoolean;
+    
+    function isNull(arg){
+    return arg===null;
+    }
+    exports.isNull=isNull;
+    
+    function isNullOrUndefined(arg){
+    return arg==null;
+    }
+    exports.isNullOrUndefined=isNullOrUndefined;
+    
+    function isNumber(arg){
+    return typeof arg==='number';
+    }
+    exports.isNumber=isNumber;
+    
+    function isString(arg){
+    return typeof arg==='string';
+    }
+    exports.isString=isString;
+    
+    function isSymbol(arg){
+    return typeof arg==='symbol';
+    }
+    exports.isSymbol=isSymbol;
+    
+    function isUndefined(arg){
+    return arg===void 0;
+    }
+    exports.isUndefined=isUndefined;
+    
+    function isRegExp(re){
+    return objectToString(re)==='[object RegExp]';
+    }
+    exports.isRegExp=isRegExp;
+    
+    function isObject(arg){
+    return typeof arg==='object'&&arg!==null;
+    }
+    exports.isObject=isObject;
+    
+    function isDate(d){
+    return objectToString(d)==='[object Date]';
+    }
+    exports.isDate=isDate;
+    
+    function isError(e){
+    return objectToString(e)==='[object Error]'||e instanceof Error;
+    }
+    exports.isError=isError;
+    
+    function isFunction(arg){
+    return typeof arg==='function';
+    }
+    exports.isFunction=isFunction;
+    
+    function isPrimitive(arg){
+    return arg===null||
+    typeof arg==='boolean'||
+    typeof arg==='number'||
+    typeof arg==='string'||
+    typeof arg==='symbol'||
+    typeof arg==='undefined';
+    }
+    exports.isPrimitive=isPrimitive;
+    
+    exports.isBuffer=Buffer.isBuffer;
+    
+    function objectToString(o){
+    return Object.prototype.toString.call(o);
+    }
+    
+    }).call(this,{"isBuffer":require("../../is-buffer/index.js")});
+    },{"../../is-buffer/index.js":120}],104:[function(require,module,exports){
+    module.exports=[
+    "aliceblue",
+    "antiquewhite",
+    "aqua",
+    "aquamarine",
+    "azure",
+    "beige",
+    "bisque",
+    "black",
+    "blanchedalmond",
+    "blue",
+    "blueviolet",
+    "brown",
+    "burlywood",
+    "cadetblue",
+    "chartreuse",
+    "chocolate",
+    "coral",
+    "cornflowerblue",
+    "cornsilk",
+    "crimson",
+    "cyan",
+    "darkblue",
+    "darkcyan",
+    "darkgoldenrod",
+    "darkgray",
+    "darkgreen",
+    "darkgrey",
+    "darkkhaki",
+    "darkmagenta",
+    "darkolivegreen",
+    "darkorange",
+    "darkorchid",
+    "darkred",
+    "darksalmon",
+    "darkseagreen",
+    "darkslateblue",
+    "darkslategray",
+    "darkslategrey",
+    "darkturquoise",
+    "darkviolet",
+    "deeppink",
+    "deepskyblue",
+    "dimgray",
+    "dimgrey",
+    "dodgerblue",
+    "firebrick",
+    "floralwhite",
+    "forestgreen",
+    "fuchsia",
+    "gainsboro",
+    "ghostwhite",
+    "gold",
+    "goldenrod",
+    "gray",
+    "green",
+    "greenyellow",
+    "grey",
+    "honeydew",
+    "hotpink",
+    "indianred",
+    "indigo",
+    "ivory",
+    "khaki",
+    "lavender",
+    "lavenderblush",
+    "lawngreen",
+    "lemonchiffon",
+    "lightblue",
+    "lightcoral",
+    "lightcyan",
+    "lightgoldenrodyellow",
+    "lightgray",
+    "lightgreen",
+    "lightgrey",
+    "lightpink",
+    "lightsalmon",
+    "lightseagreen",
+    "lightskyblue",
+    "lightslategray",
+    "lightslategrey",
+    "lightsteelblue",
+    "lightyellow",
+    "lime",
+    "limegreen",
+    "linen",
+    "magenta",
+    "maroon",
+    "mediumaquamarine",
+    "mediumblue",
+    "mediumorchid",
+    "mediumpurple",
+    "mediumseagreen",
+    "mediumslateblue",
+    "mediumspringgreen",
+    "mediumturquoise",
+    "mediumvioletred",
+    "midnightblue",
+    "mintcream",
+    "mistyrose",
+    "moccasin",
+    "navajowhite",
+    "navy",
+    "oldlace",
+    "olive",
+    "olivedrab",
+    "orange",
+    "orangered",
+    "orchid",
+    "palegoldenrod",
+    "palegreen",
+    "paleturquoise",
+    "palevioletred",
+    "papayawhip",
+    "peachpuff",
+    "peru",
+    "pink",
+    "plum",
+    "powderblue",
+    "purple",
+    "rebeccapurple",
+    "red",
+    "rosybrown",
+    "royalblue",
+    "saddlebrown",
+    "salmon",
+    "sandybrown",
+    "seagreen",
+    "seashell",
+    "sienna",
+    "silver",
+    "skyblue",
+    "slateblue",
+    "slategray",
+    "slategrey",
+    "snow",
+    "springgreen",
+    "steelblue",
+    "tan",
+    "teal",
+    "thistle",
+    "tomato",
+    "turquoise",
+    "violet",
+    "wheat",
+    "white",
+    "whitesmoke",
+    "yellow",
+    "yellowgreen"];
+    
+    
+    },{}],105:[function(require,module,exports){
+    
+    
+    
+    
+    'use strict';
+    
+    const namedColors=require('./named_colors.json');
+    
+    exports.TYPES={
+    INTEGER:1,
+    NUMBER:2,
+    LENGTH:3,
+    PERCENT:4,
+    URL:5,
+    COLOR:6,
+    STRING:7,
+    ANGLE:8,
+    KEYWORD:9,
+    NULL_OR_EMPTY_STR:10};
+    
+    
+    
+    var integerRegEx=/^[-+]?[0-9]+$/;
+    var numberRegEx=/^[-+]?[0-9]*\.[0-9]+$/;
+    var lengthRegEx=/^(0|[-+]?[0-9]*\.?[0-9]+(in|cm|em|mm|pt|pc|px|ex|rem|vh|vw))$/;
+    var percentRegEx=/^[-+]?[0-9]*\.?[0-9]+%$/;
+    var urlRegEx=/^url\(\s*([^)]*)\s*\)$/;
+    var stringRegEx=/^("[^"]*"|'[^']*')$/;
+    var colorRegEx1=/^#[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]([0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])?$/;
+    var colorRegEx2=/^rgb\(([^)]*)\)$/;
+    var colorRegEx3=/^rgba\(([^)]*)\)$/;
+    var colorRegEx4=/^hsla?\(\s*(-?\d+|-?\d*.\d+)\s*,\s*(-?\d+|-?\d*.\d+)%\s*,\s*(-?\d+|-?\d*.\d+)%\s*(,\s*(-?\d+|-?\d*.\d+)\s*)?\)/;
+    var angleRegEx=/^([-+]?[0-9]*\.?[0-9]+)(deg|grad|rad)$/;
+    
+    
+    exports.valueType=function valueType(val){
+    if(val===''||val===null){
+    return exports.TYPES.NULL_OR_EMPTY_STR;
+    }
+    if(typeof val==='number'){
+    val=val.toString();
+    }
+    
+    if(typeof val!=='string'){
+    return undefined;
+    }
+    
+    if(integerRegEx.test(val)){
+    return exports.TYPES.INTEGER;
+    }
+    if(numberRegEx.test(val)){
+    return exports.TYPES.NUMBER;
+    }
+    if(lengthRegEx.test(val)){
+    return exports.TYPES.LENGTH;
+    }
+    if(percentRegEx.test(val)){
+    return exports.TYPES.PERCENT;
+    }
+    if(urlRegEx.test(val)){
+    return exports.TYPES.URL;
+    }
+    if(stringRegEx.test(val)){
+    return exports.TYPES.STRING;
+    }
+    if(angleRegEx.test(val)){
+    return exports.TYPES.ANGLE;
+    }
+    if(colorRegEx1.test(val)){
+    return exports.TYPES.COLOR;
+    }
+    var res=colorRegEx2.exec(val);
+    var parts;
+    if(res!==null){
+    parts=res[1].split(/\s*,\s*/);
+    if(parts.length!==3){
+    return undefined;
+    }
+    if(
+    parts.every(percentRegEx.test.bind(percentRegEx))||
+    parts.every(integerRegEx.test.bind(integerRegEx)))
+    {
+    return exports.TYPES.COLOR;
+    }
+    return undefined;
+    }
+    res=colorRegEx3.exec(val);
+    if(res!==null){
+    parts=res[1].split(/\s*,\s*/);
+    if(parts.length!==4){
+    return undefined;
+    }
+    if(
+    parts.slice(0,3).every(percentRegEx.test.bind(percentRegEx))||
+    parts.every(integerRegEx.test.bind(integerRegEx)))
+    {
+    if(numberRegEx.test(parts[3])){
+    return exports.TYPES.COLOR;
+    }
+    }
+    return undefined;
+    }
+    
+    if(colorRegEx4.test(val)){
+    return exports.TYPES.COLOR;
+    }
+    
+    
+    val=val.toLowerCase();
+    
+    if(namedColors.includes(val)){
+    return exports.TYPES.COLOR;
+    }
+    
+    switch(val){
+    
+    case'activeborder':
+    case'activecaption':
+    case'appworkspace':
+    case'background':
+    case'buttonface':
+    case'buttonhighlight':
+    case'buttonshadow':
+    case'buttontext':
+    case'captiontext':
+    case'graytext':
+    case'highlight':
+    case'highlighttext':
+    case'inactiveborder':
+    case'inactivecaption':
+    case'inactivecaptiontext':
+    case'infobackground':
+    case'infotext':
+    case'menu':
+    case'menutext':
+    case'scrollbar':
+    case'threeddarkshadow':
+    case'threedface':
+    case'threedhighlight':
+    case'threedlightshadow':
+    case'threedshadow':
+    case'window':
+    case'windowframe':
+    case'windowtext':
+    return exports.TYPES.COLOR;
+    default:
+    return exports.TYPES.KEYWORD;}
+    
+    };
+    
+    exports.parseInteger=function parseInteger(val){
+    var type=exports.valueType(val);
+    if(type===exports.TYPES.NULL_OR_EMPTY_STR){
+    return val;
+    }
+    if(type!==exports.TYPES.INTEGER){
+    return undefined;
+    }
+    return String(parseInt(val,10));
+    };
+    
+    exports.parseNumber=function parseNumber(val){
+    var type=exports.valueType(val);
+    if(type===exports.TYPES.NULL_OR_EMPTY_STR){
+    return val;
+    }
+    if(type!==exports.TYPES.NUMBER&&type!==exports.TYPES.INTEGER){
+    return undefined;
+    }
+    return String(parseFloat(val));
+    };
+    
+    exports.parseLength=function parseLength(val){
+    if(val===0||val==='0'){
+    return'0px';
+    }
+    var type=exports.valueType(val);
+    if(type===exports.TYPES.NULL_OR_EMPTY_STR){
+    return val;
+    }
+    if(type!==exports.TYPES.LENGTH){
+    return undefined;
+    }
+    return val;
+    };
+    
+    exports.parsePercent=function parsePercent(val){
+    if(val===0||val==='0'){
+    return'0%';
+    }
+    var type=exports.valueType(val);
+    if(type===exports.TYPES.NULL_OR_EMPTY_STR){
+    return val;
+    }
+    if(type!==exports.TYPES.PERCENT){
+    return undefined;
+    }
+    return val;
+    };
+    
+    
+    exports.parseMeasurement=function parseMeasurement(val){
+    var length=exports.parseLength(val);
+    if(length!==undefined){
+    return length;
+    }
+    return exports.parsePercent(val);
+    };
+    
+    exports.parseUrl=function parseUrl(val){
+    var type=exports.valueType(val);
+    if(type===exports.TYPES.NULL_OR_EMPTY_STR){
+    return val;
+    }
+    var res=urlRegEx.exec(val);
+    
+    if(!res){
+    return undefined;
+    }
+    var str=res[1];
+    
+    if((str[0]==='"'||str[0]==="'")&&str[0]!==str[str.length-1]){
+    return undefined;
+    }
+    if(str[0]==='"'||str[0]==="'"){
+    str=str.substr(1,str.length-2);
+    }
+    
+    var i;
+    for(i=0;i<str.length;i++){
+    switch(str[i]){
+    case'(':
+    case')':
+    case' ':
+    case'\t':
+    case'\n':
+    case"'":
+    case'"':
+    return undefined;
+    case'\\':
+    i++;
+    break;}
+    
+    }
+    
+    return'url('+str+')';
+    };
+    
+    exports.parseString=function parseString(val){
+    var type=exports.valueType(val);
+    if(type===exports.TYPES.NULL_OR_EMPTY_STR){
+    return val;
+    }
+    if(type!==exports.TYPES.STRING){
+    return undefined;
+    }
+    var i;
+    for(i=1;i<val.length-1;i++){
+    switch(val[i]){
+    case val[0]:
+    return undefined;
+    case'\\':
+    i++;
+    while(i<val.length-1&&/[0-9A-Fa-f]/.test(val[i])){
+    i++;
+    }
+    break;}
+    
+    }
+    if(i>=val.length){
+    return undefined;
+    }
+    return val;
+    };
+    
+    exports.parseColor=function parseColor(val){
+    var type=exports.valueType(val);
+    if(type===exports.TYPES.NULL_OR_EMPTY_STR){
+    return val;
+    }
+    var red,
+    green,
+    blue,
+    hue,
+    saturation,
+    lightness,
+    alpha=1;
+    var parts;
+    var res=colorRegEx1.exec(val);
+    
+    if(res){
+    var hex=val.substr(1);
+    if(hex.length===3){
+    hex=hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2];
+    }
+    red=parseInt(hex.substr(0,2),16);
+    green=parseInt(hex.substr(2,2),16);
+    blue=parseInt(hex.substr(4,2),16);
+    return'rgb('+red+', '+green+', '+blue+')';
+    }
+    
+    res=colorRegEx2.exec(val);
+    if(res){
+    parts=res[1].split(/\s*,\s*/);
+    if(parts.length!==3){
+    return undefined;
+    }
+    if(parts.every(percentRegEx.test.bind(percentRegEx))){
+    red=Math.floor(parseFloat(parts[0].slice(0,-1))*255/100);
+    green=Math.floor(parseFloat(parts[1].slice(0,-1))*255/100);
+    blue=Math.floor(parseFloat(parts[2].slice(0,-1))*255/100);
+    }else if(parts.every(integerRegEx.test.bind(integerRegEx))){
+    red=parseInt(parts[0],10);
+    green=parseInt(parts[1],10);
+    blue=parseInt(parts[2],10);
+    }else{
+    return undefined;
+    }
+    red=Math.min(255,Math.max(0,red));
+    green=Math.min(255,Math.max(0,green));
+    blue=Math.min(255,Math.max(0,blue));
+    return'rgb('+red+', '+green+', '+blue+')';
+    }
+    
+    res=colorRegEx3.exec(val);
+    if(res){
+    parts=res[1].split(/\s*,\s*/);
+    if(parts.length!==4){
+    return undefined;
+    }
+    if(parts.slice(0,3).every(percentRegEx.test.bind(percentRegEx))){
+    red=Math.floor(parseFloat(parts[0].slice(0,-1))*255/100);
+    green=Math.floor(parseFloat(parts[1].slice(0,-1))*255/100);
+    blue=Math.floor(parseFloat(parts[2].slice(0,-1))*255/100);
+    alpha=parseFloat(parts[3]);
+    }else if(parts.slice(0,3).every(integerRegEx.test.bind(integerRegEx))){
+    red=parseInt(parts[0],10);
+    green=parseInt(parts[1],10);
+    blue=parseInt(parts[2],10);
+    alpha=parseFloat(parts[3]);
+    }else{
+    return undefined;
+    }
+    if(isNaN(alpha)){
+    alpha=1;
+    }
+    red=Math.min(255,Math.max(0,red));
+    green=Math.min(255,Math.max(0,green));
+    blue=Math.min(255,Math.max(0,blue));
+    alpha=Math.min(1,Math.max(0,alpha));
+    if(alpha===1){
+    return'rgb('+red+', '+green+', '+blue+')';
+    }
+    return'rgba('+red+', '+green+', '+blue+', '+alpha+')';
+    }
+    
+    res=colorRegEx4.exec(val);
+    if(res){
+    const[,_hue,_saturation,_lightness,_alphaString='']=res;
+    const _alpha=parseFloat(_alphaString.replace(',','').trim());
+    if(!_hue||!_saturation||!_lightness){
+    return undefined;
+    }
+    hue=parseFloat(_hue);
+    saturation=parseInt(_saturation,10);
+    lightness=parseInt(_lightness,10);
+    if(_alpha&&numberRegEx.test(_alpha)){
+    alpha=parseFloat(_alpha);
+    }
+    if(!_alphaString||alpha===1){
+    return'hsl('+hue+', '+saturation+'%, '+lightness+'%)';
+    }
+    return'hsla('+hue+', '+saturation+'%, '+lightness+'%, '+alpha+')';
+    }
+    
+    if(type===exports.TYPES.COLOR){
+    return val;
+    }
+    return undefined;
+    };
+    
+    exports.parseAngle=function parseAngle(val){
+    var type=exports.valueType(val);
+    if(type===exports.TYPES.NULL_OR_EMPTY_STR){
+    return val;
+    }
+    if(type!==exports.TYPES.ANGLE){
+    return undefined;
+    }
+    var res=angleRegEx.exec(val);
+    var flt=parseFloat(res[1]);
+    if(res[2]==='rad'){
+    flt*=180/Math.PI;
+    }else if(res[2]==='grad'){
+    flt*=360/400;
+    }
+    
+    while(flt<0){
+    flt+=360;
+    }
+    while(flt>360){
+    flt-=360;
+    }
+    return flt+'deg';
+    };
+    
+    exports.parseKeyword=function parseKeyword(val,valid_keywords){
+    var type=exports.valueType(val);
+    if(type===exports.TYPES.NULL_OR_EMPTY_STR){
+    return val;
+    }
+    if(type!==exports.TYPES.KEYWORD){
+    return undefined;
+    }
+    val=val.toString().toLowerCase();
+    var i;
+    for(i=0;i<valid_keywords.length;i++){
+    if(valid_keywords[i].toLowerCase()===val){
+    return valid_keywords[i];
+    }
+    }
+    return undefined;
+    };
+    
+    
+    var dashedToCamelCase=function(dashed){
+    var i;
+    var camel='';
+    var nextCap=false;
+    for(i=0;i<dashed.length;i++){
+    if(dashed[i]!=='-'){
+    camel+=nextCap?dashed[i].toUpperCase():dashed[i];
+    nextCap=false;
+    }else{
+    nextCap=true;
+    }
+    }
+    return camel;
+    };
+    exports.dashedToCamelCase=dashedToCamelCase;
+    
+    var is_space=/\s/;
+    var opening_deliminators=['"',"'",'('];
+    var closing_deliminators=['"',"'",')'];
+    
+    var getParts=function(str){
+    var deliminator_stack=[];
+    var length=str.length;
+    var i;
+    var parts=[];
+    var current_part='';
+    var opening_index;
+    var closing_index;
+    for(i=0;i<length;i++){
+    opening_index=opening_deliminators.indexOf(str[i]);
+    closing_index=closing_deliminators.indexOf(str[i]);
+    if(is_space.test(str[i])){
+    if(deliminator_stack.length===0){
+    if(current_part!==''){
+    parts.push(current_part);
+    }
+    current_part='';
+    }else{
+    current_part+=str[i];
+    }
+    }else{
+    if(str[i]==='\\'){
+    i++;
+    current_part+=str[i];
+    }else{
+    current_part+=str[i];
+    if(
+    closing_index!==-1&&
+    closing_index===deliminator_stack[deliminator_stack.length-1])
+    {
+    deliminator_stack.pop();
+    }else if(opening_index!==-1){
+    deliminator_stack.push(opening_index);
+    }
+    }
+    }
+    }
+    if(current_part!==''){
+    parts.push(current_part);
+    }
+    return parts;
+    };
+    
+    
+    
+    
+    
+    
+    
+    exports.shorthandParser=function parse(v,shorthand_for){
+    var obj={};
+    var type=exports.valueType(v);
+    if(type===exports.TYPES.NULL_OR_EMPTY_STR){
+    Object.keys(shorthand_for).forEach(function(property){
+    obj[property]='';
+    });
+    return obj;
+    }
+    
+    if(typeof v==='number'){
+    v=v.toString();
+    }
+    
+    if(typeof v!=='string'){
+    return undefined;
+    }
+    
+    if(v.toLowerCase()==='inherit'){
+    return{};
+    }
+    var parts=getParts(v);
+    var valid=true;
+    parts.forEach(function(part,i){
+    var part_valid=false;
+    Object.keys(shorthand_for).forEach(function(property){
+    if(shorthand_for[property].isValid(part,i)){
+    part_valid=true;
+    obj[property]=part;
+    }
+    });
+    valid=valid&&part_valid;
+    });
+    if(!valid){
+    return undefined;
+    }
+    return obj;
+    };
+    
+    exports.shorthandSetter=function(property,shorthand_for){
+    return function(v){
+    var obj=exports.shorthandParser(v,shorthand_for);
+    if(obj===undefined){
+    return;
+    }
+    
+    Object.keys(obj).forEach(function(subprop){
+    
+    
+    var camel=dashedToCamelCase(subprop);
+    this[camel]=obj[subprop];
+    
+    obj[subprop]=this[camel];
+    this.removeProperty(subprop);
+    
+    if(obj[subprop]!==''){
+    this._values[subprop]=obj[subprop];
+    }
+    },this);
+    Object.keys(shorthand_for).forEach(function(subprop){
+    if(!obj.hasOwnProperty(subprop)){
+    this.removeProperty(subprop);
+    delete this._values[subprop];
+    }
+    },this);
+    
+    
+    
+    
+    this.removeProperty(property);
+    var calculated=exports.shorthandGetter(property,shorthand_for).call(this);
+    if(calculated!==''){
+    this._setProperty(property,calculated);
+    }
+    };
+    };
+    
+    exports.shorthandGetter=function(property,shorthand_for){
+    return function(){
+    if(this._values[property]!==undefined){
+    return this.getPropertyValue(property);
+    }
+    return Object.keys(shorthand_for).
+    map(function(subprop){
+    return this.getPropertyValue(subprop);
+    },this).
+    filter(function(value){
+    return value!=='';
+    }).
+    join(' ');
+    };
+    };
+    
+    
+    
+    
+    
+    
+    exports.implicitSetter=function(property_before,property_after,isValid,parser){
+    property_after=property_after||'';
+    if(property_after!==''){
+    property_after='-'+property_after;
+    }
+    var part_names=['top','right','bottom','left'];
+    
+    return function(v){
+    if(typeof v==='number'){
+    v=v.toString();
+    }
+    if(typeof v!=='string'){
+    return undefined;
+    }
+    var parts;
+    if(v.toLowerCase()==='inherit'||v===''){
+    parts=[v];
+    }else{
+    parts=getParts(v);
+    }
+    if(parts.length<1||parts.length>4){
+    return undefined;
+    }
+    
+    if(!parts.every(isValid)){
+    return undefined;
+    }
+    
+    parts=parts.map(function(part){
+    return parser(part);
+    });
+    this._setProperty(property_before+property_after,parts.join(' '));
+    if(parts.length===1){
+    parts[1]=parts[0];
+    }
+    if(parts.length===2){
+    parts[2]=parts[0];
+    }
+    if(parts.length===3){
+    parts[3]=parts[1];
+    }
+    
+    for(var i=0;i<4;i++){
+    var property=property_before+'-'+part_names[i]+property_after;
+    this.removeProperty(property);
+    if(parts[i]!==''){
+    this._values[property]=parts[i];
+    }
+    }
+    return v;
+    };
+    };
+    
+    
+    
+    
+    
+    
+    
+    exports.subImplicitSetter=function(prefix,part,isValid,parser){
+    var property=prefix+'-'+part;
+    var subparts=[prefix+'-top',prefix+'-right',prefix+'-bottom',prefix+'-left'];
+    
+    return function(v){
+    if(typeof v==='number'){
+    v=v.toString();
+    }
+    if(typeof v!=='string'){
+    return undefined;
+    }
+    if(!isValid(v)){
+    return undefined;
+    }
+    v=parser(v);
+    this._setProperty(property,v);
+    var parts=[];
+    for(var i=0;i<4;i++){
+    if(this._values[subparts[i]]==null||this._values[subparts[i]]===''){
+    break;
+    }
+    parts.push(this._values[subparts[i]]);
+    }
+    if(parts.length===4){
+    for(i=0;i<4;i++){
+    this.removeProperty(subparts[i]);
+    this._values[subparts[i]]=parts[i];
+    }
+    this._setProperty(prefix,parts.join(' '));
+    }
+    return v;
+    };
+    };
+    
+    var camel_to_dashed=/[A-Z]/g;
+    var first_segment=/^\([^-]\)-/;
+    var vendor_prefixes=['o','moz','ms','webkit'];
+    exports.camelToDashed=function(camel_case){
+    var match;
+    var dashed=camel_case.replace(camel_to_dashed,'-$&').toLowerCase();
+    match=dashed.match(first_segment);
+    if(match&&vendor_prefixes.indexOf(match[1])!==-1){
+    dashed='-'+dashed;
+    }
+    return dashed;
+    };
+    
+    },{"./named_colors.json":104}],106:[function(require,module,exports){
+    (function(process){
+    
+    
+    
+    
+    
+    
+    exports=module.exports=require('./debug');
+    exports.log=log;
+    exports.formatArgs=formatArgs;
+    exports.save=save;
+    exports.load=load;
+    exports.useColors=useColors;
+    exports.storage='undefined'!=typeof chrome&&
+    'undefined'!=typeof chrome.storage?
+    chrome.storage.local:
+    localstorage();
+    
+    
+    
+    
+    
+    exports.colors=[
+    'lightseagreen',
+    'forestgreen',
+    'goldenrod',
+    'dodgerblue',
+    'darkorchid',
+    'crimson'];
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function useColors(){
+    
+    
+    
+    if(typeof window!=='undefined'&&window.process&&window.process.type==='renderer'){
+    return true;
+    }
+    
+    
+    
+    return typeof document!=='undefined'&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||
+    
+    typeof window!=='undefined'&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||
+    
+    
+    typeof navigator!=='undefined'&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||
+    
+    typeof navigator!=='undefined'&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/);
+    }
+    
+    
+    
+    
+    
+    exports.formatters.j=function(v){
+    try{
+    return JSON.stringify(v);
+    }catch(err){
+    return'[UnexpectedJSONParseError]: '+err.message;
+    }
+    };
+    
+    
+    
+    
+    
+    
+    
+    
+    function formatArgs(args){
+    var useColors=this.useColors;
+    
+    args[0]=(useColors?'%c':'')+
+    this.namespace+(
+    useColors?' %c':' ')+
+    args[0]+(
+    useColors?'%c ':' ')+
+    '+'+exports.humanize(this.diff);
+    
+    if(!useColors)return;
+    
+    var c='color: '+this.color;
+    args.splice(1,0,c,'color: inherit');
+    
+    
+    
+    
+    var index=0;
+    var lastC=0;
+    args[0].replace(/%[a-zA-Z%]/g,function(match){
+    if('%%'===match)return;
+    index++;
+    if('%c'===match){
+    
+    
+    lastC=index;
+    }
+    });
+    
+    args.splice(lastC,0,c);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function log(){
+    
+    
+    return'object'===typeof console&&
+    console.log&&
+    Function.prototype.apply.call(console.log,console,arguments);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function save(namespaces){
+    try{
+    if(null==namespaces){
+    exports.storage.removeItem('debug');
+    }else{
+    exports.storage.debug=namespaces;
+    }
+    }catch(e){}
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function load(){
+    var r;
+    try{
+    r=exports.storage.debug;
+    }catch(e){}
+    
+    
+    if(!r&&typeof process!=='undefined'&&'env'in process){
+    r=process.env.DEBUG;
+    }
+    
+    return r;
+    }
+    
+    
+    
+    
+    
+    exports.enable(load());
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function localstorage(){
+    try{
+    return window.localStorage;
+    }catch(e){}
+    }
+    
+    }).call(this,require('_process'));
+    },{"./debug":107,"_process":158}],107:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    exports=module.exports=createDebug.debug=createDebug['default']=createDebug;
+    exports.coerce=coerce;
+    exports.disable=disable;
+    exports.enable=enable;
+    exports.enabled=enabled;
+    exports.humanize=require('ms');
+    
+    
+    
+    
+    
+    exports.names=[];
+    exports.skips=[];
+    
+    
+    
+    
+    
+    
+    
+    exports.formatters={};
+    
+    
+    
+    
+    
+    var prevTime;
+    
+    
+    
+    
+    
+    
+    
+    
+    function selectColor(namespace){
+    var hash=0,i;
+    
+    for(i in namespace){
+    hash=(hash<<5)-hash+namespace.charCodeAt(i);
+    hash|=0;
+    }
+    
+    return exports.colors[Math.abs(hash)%exports.colors.length];
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function createDebug(namespace){
+    
+    function debug(){
+    
+    if(!debug.enabled)return;
+    
+    var self=debug;
+    
+    
+    var curr=+new Date();
+    var ms=curr-(prevTime||curr);
+    self.diff=ms;
+    self.prev=prevTime;
+    self.curr=curr;
+    prevTime=curr;
+    
+    
+    var args=new Array(arguments.length);
+    for(var i=0;i<args.length;i++){
+    args[i]=arguments[i];
+    }
+    
+    args[0]=exports.coerce(args[0]);
+    
+    if('string'!==typeof args[0]){
+    
+    args.unshift('%O');
+    }
+    
+    
+    var index=0;
+    args[0]=args[0].replace(/%([a-zA-Z%])/g,function(match,format){
+    
+    if(match==='%%')return match;
+    index++;
+    var formatter=exports.formatters[format];
+    if('function'===typeof formatter){
+    var val=args[index];
+    match=formatter.call(self,val);
+    
+    
+    args.splice(index,1);
+    index--;
+    }
+    return match;
+    });
+    
+    
+    exports.formatArgs.call(self,args);
+    
+    var logFn=debug.log||exports.log||console.log.bind(console);
+    logFn.apply(self,args);
+    }
+    
+    debug.namespace=namespace;
+    debug.enabled=exports.enabled(namespace);
+    debug.useColors=exports.useColors();
+    debug.color=selectColor(namespace);
+    
+    
+    if('function'===typeof exports.init){
+    exports.init(debug);
+    }
+    
+    return debug;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function enable(namespaces){
+    exports.save(namespaces);
+    
+    exports.names=[];
+    exports.skips=[];
+    
+    var split=(typeof namespaces==='string'?namespaces:'').split(/[\s,]+/);
+    var len=split.length;
+    
+    for(var i=0;i<len;i++){
+    if(!split[i])continue;
+    namespaces=split[i].replace(/\*/g,'.*?');
+    if(namespaces[0]==='-'){
+    exports.skips.push(new RegExp('^'+namespaces.substr(1)+'$'));
+    }else{
+    exports.names.push(new RegExp('^'+namespaces+'$'));
+    }
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    function disable(){
+    exports.enable('');
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function enabled(name){
+    var i,len;
+    for(i=0,len=exports.skips.length;i<len;i++){
+    if(exports.skips[i].test(name)){
+    return false;
+    }
+    }
+    for(i=0,len=exports.names.length;i<len;i++){
+    if(exports.names[i].test(name)){
+    return true;
+    }
+    }
+    return false;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function coerce(val){
+    if(val instanceof Error)return val.stack||val.message;
+    return val;
+    }
+    
+    },{"ms":146}],108:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    var objectCreate=Object.create||objectCreatePolyfill;
+    var objectKeys=Object.keys||objectKeysPolyfill;
+    var bind=Function.prototype.bind||functionBindPolyfill;
+    
+    function EventEmitter(){
+    if(!this._events||!Object.prototype.hasOwnProperty.call(this,'_events')){
+    this._events=objectCreate(null);
+    this._eventsCount=0;
+    }
+    
+    this._maxListeners=this._maxListeners||undefined;
+    }
+    module.exports=EventEmitter;
+    
+    
+    EventEmitter.EventEmitter=EventEmitter;
+    
+    EventEmitter.prototype._events=undefined;
+    EventEmitter.prototype._maxListeners=undefined;
+    
+    
+    
+    var defaultMaxListeners=10;
+    
+    var hasDefineProperty;
+    try{
+    var o={};
+    if(Object.defineProperty)Object.defineProperty(o,'x',{value:0});
+    hasDefineProperty=o.x===0;
+    }catch(err){hasDefineProperty=false;}
+    if(hasDefineProperty){
+    Object.defineProperty(EventEmitter,'defaultMaxListeners',{
+    enumerable:true,
+    get:function(){
+    return defaultMaxListeners;
+    },
+    set:function(arg){
+    
+    
+    if(typeof arg!=='number'||arg<0||arg!==arg)
+    throw new TypeError('"defaultMaxListeners" must be a positive number');
+    defaultMaxListeners=arg;
+    }});
+    
+    }else{
+    EventEmitter.defaultMaxListeners=defaultMaxListeners;
+    }
+    
+    
+    
+    EventEmitter.prototype.setMaxListeners=function setMaxListeners(n){
+    if(typeof n!=='number'||n<0||isNaN(n))
+    throw new TypeError('"n" argument must be a positive number');
+    this._maxListeners=n;
+    return this;
+    };
+    
+    function $getMaxListeners(that){
+    if(that._maxListeners===undefined)
+    return EventEmitter.defaultMaxListeners;
+    return that._maxListeners;
+    }
+    
+    EventEmitter.prototype.getMaxListeners=function getMaxListeners(){
+    return $getMaxListeners(this);
+    };
+    
+    
+    
+    
+    
+    
+    function emitNone(handler,isFn,self){
+    if(isFn)
+    handler.call(self);else
+    {
+    var len=handler.length;
+    var listeners=arrayClone(handler,len);
+    for(var i=0;i<len;++i)
+    listeners[i].call(self);
+    }
+    }
+    function emitOne(handler,isFn,self,arg1){
+    if(isFn)
+    handler.call(self,arg1);else
+    {
+    var len=handler.length;
+    var listeners=arrayClone(handler,len);
+    for(var i=0;i<len;++i)
+    listeners[i].call(self,arg1);
+    }
+    }
+    function emitTwo(handler,isFn,self,arg1,arg2){
+    if(isFn)
+    handler.call(self,arg1,arg2);else
+    {
+    var len=handler.length;
+    var listeners=arrayClone(handler,len);
+    for(var i=0;i<len;++i)
+    listeners[i].call(self,arg1,arg2);
+    }
+    }
+    function emitThree(handler,isFn,self,arg1,arg2,arg3){
+    if(isFn)
+    handler.call(self,arg1,arg2,arg3);else
+    {
+    var len=handler.length;
+    var listeners=arrayClone(handler,len);
+    for(var i=0;i<len;++i)
+    listeners[i].call(self,arg1,arg2,arg3);
+    }
+    }
+    
+    function emitMany(handler,isFn,self,args){
+    if(isFn)
+    handler.apply(self,args);else
+    {
+    var len=handler.length;
+    var listeners=arrayClone(handler,len);
+    for(var i=0;i<len;++i)
+    listeners[i].apply(self,args);
+    }
+    }
+    
+    EventEmitter.prototype.emit=function emit(type){
+    var er,handler,len,args,i,events;
+    var doError=type==='error';
+    
+    events=this._events;
+    if(events)
+    doError=doError&&events.error==null;else
+    if(!doError)
+    return false;
+    
+    
+    if(doError){
+    if(arguments.length>1)
+    er=arguments[1];
+    if(er instanceof Error){
+    throw er;
+    }else{
+    
+    var err=new Error('Unhandled "error" event. ('+er+')');
+    err.context=er;
+    throw err;
+    }
+    return false;
+    }
+    
+    handler=events[type];
+    
+    if(!handler)
+    return false;
+    
+    var isFn=typeof handler==='function';
+    len=arguments.length;
+    switch(len){
+    
+    case 1:
+    emitNone(handler,isFn,this);
+    break;
+    case 2:
+    emitOne(handler,isFn,this,arguments[1]);
+    break;
+    case 3:
+    emitTwo(handler,isFn,this,arguments[1],arguments[2]);
+    break;
+    case 4:
+    emitThree(handler,isFn,this,arguments[1],arguments[2],arguments[3]);
+    break;
+    
+    default:
+    args=new Array(len-1);
+    for(i=1;i<len;i++)
+    args[i-1]=arguments[i];
+    emitMany(handler,isFn,this,args);}
+    
+    
+    return true;
+    };
+    
+    function _addListener(target,type,listener,prepend){
+    var m;
+    var events;
+    var existing;
+    
+    if(typeof listener!=='function')
+    throw new TypeError('"listener" argument must be a function');
+    
+    events=target._events;
+    if(!events){
+    events=target._events=objectCreate(null);
+    target._eventsCount=0;
+    }else{
+    
+    
+    if(events.newListener){
+    target.emit('newListener',type,
+    listener.listener?listener.listener:listener);
+    
+    
+    
+    events=target._events;
+    }
+    existing=events[type];
+    }
+    
+    if(!existing){
+    
+    existing=events[type]=listener;
+    ++target._eventsCount;
+    }else{
+    if(typeof existing==='function'){
+    
+    existing=events[type]=
+    prepend?[listener,existing]:[existing,listener];
+    }else{
+    
+    if(prepend){
+    existing.unshift(listener);
+    }else{
+    existing.push(listener);
+    }
+    }
+    
+    
+    if(!existing.warned){
+    m=$getMaxListeners(target);
+    if(m&&m>0&&existing.length>m){
+    existing.warned=true;
+    var w=new Error('Possible EventEmitter memory leak detected. '+
+    existing.length+' "'+String(type)+'" listeners '+
+    'added. Use emitter.setMaxListeners() to '+
+    'increase limit.');
+    w.name='MaxListenersExceededWarning';
+    w.emitter=target;
+    w.type=type;
+    w.count=existing.length;
+    if(typeof console==='object'&&console.warn){
+    console.warn('%s: %s',w.name,w.message);
+    }
+    }
+    }
+    }
+    
+    return target;
+    }
+    
+    EventEmitter.prototype.addListener=function addListener(type,listener){
+    return _addListener(this,type,listener,false);
+    };
+    
+    EventEmitter.prototype.on=EventEmitter.prototype.addListener;
+    
+    EventEmitter.prototype.prependListener=
+    function prependListener(type,listener){
+    return _addListener(this,type,listener,true);
+    };
+    
+    function onceWrapper(){
+    if(!this.fired){
+    this.target.removeListener(this.type,this.wrapFn);
+    this.fired=true;
+    switch(arguments.length){
+    case 0:
+    return this.listener.call(this.target);
+    case 1:
+    return this.listener.call(this.target,arguments[0]);
+    case 2:
+    return this.listener.call(this.target,arguments[0],arguments[1]);
+    case 3:
+    return this.listener.call(this.target,arguments[0],arguments[1],
+    arguments[2]);
+    default:
+    var args=new Array(arguments.length);
+    for(var i=0;i<args.length;++i)
+    args[i]=arguments[i];
+    this.listener.apply(this.target,args);}
+    
+    }
+    }
+    
+    function _onceWrap(target,type,listener){
+    var state={fired:false,wrapFn:undefined,target:target,type:type,listener:listener};
+    var wrapped=bind.call(onceWrapper,state);
+    wrapped.listener=listener;
+    state.wrapFn=wrapped;
+    return wrapped;
+    }
+    
+    EventEmitter.prototype.once=function once(type,listener){
+    if(typeof listener!=='function')
+    throw new TypeError('"listener" argument must be a function');
+    this.on(type,_onceWrap(this,type,listener));
+    return this;
+    };
+    
+    EventEmitter.prototype.prependOnceListener=
+    function prependOnceListener(type,listener){
+    if(typeof listener!=='function')
+    throw new TypeError('"listener" argument must be a function');
+    this.prependListener(type,_onceWrap(this,type,listener));
+    return this;
+    };
+    
+    
+    EventEmitter.prototype.removeListener=
+    function removeListener(type,listener){
+    var list,events,position,i,originalListener;
+    
+    if(typeof listener!=='function')
+    throw new TypeError('"listener" argument must be a function');
+    
+    events=this._events;
+    if(!events)
+    return this;
+    
+    list=events[type];
+    if(!list)
+    return this;
+    
+    if(list===listener||list.listener===listener){
+    if(--this._eventsCount===0)
+    this._events=objectCreate(null);else
+    {
+    delete events[type];
+    if(events.removeListener)
+    this.emit('removeListener',type,list.listener||listener);
+    }
+    }else if(typeof list!=='function'){
+    position=-1;
+    
+    for(i=list.length-1;i>=0;i--){
+    if(list[i]===listener||list[i].listener===listener){
+    originalListener=list[i].listener;
+    position=i;
+    break;
+    }
+    }
+    
+    if(position<0)
+    return this;
+    
+    if(position===0)
+    list.shift();else
+    
+    spliceOne(list,position);
+    
+    if(list.length===1)
+    events[type]=list[0];
+    
+    if(events.removeListener)
+    this.emit('removeListener',type,originalListener||listener);
+    }
+    
+    return this;
+    };
+    
+    EventEmitter.prototype.removeAllListeners=
+    function removeAllListeners(type){
+    var listeners,events,i;
+    
+    events=this._events;
+    if(!events)
+    return this;
+    
+    
+    if(!events.removeListener){
+    if(arguments.length===0){
+    this._events=objectCreate(null);
+    this._eventsCount=0;
+    }else if(events[type]){
+    if(--this._eventsCount===0)
+    this._events=objectCreate(null);else
+    
+    delete events[type];
+    }
+    return this;
+    }
+    
+    
+    if(arguments.length===0){
+    var keys=objectKeys(events);
+    var key;
+    for(i=0;i<keys.length;++i){
+    key=keys[i];
+    if(key==='removeListener')continue;
+    this.removeAllListeners(key);
+    }
+    this.removeAllListeners('removeListener');
+    this._events=objectCreate(null);
+    this._eventsCount=0;
+    return this;
+    }
+    
+    listeners=events[type];
+    
+    if(typeof listeners==='function'){
+    this.removeListener(type,listeners);
+    }else if(listeners){
+    
+    for(i=listeners.length-1;i>=0;i--){
+    this.removeListener(type,listeners[i]);
+    }
+    }
+    
+    return this;
+    };
+    
+    function _listeners(target,type,unwrap){
+    var events=target._events;
+    
+    if(!events)
+    return[];
+    
+    var evlistener=events[type];
+    if(!evlistener)
+    return[];
+    
+    if(typeof evlistener==='function')
+    return unwrap?[evlistener.listener||evlistener]:[evlistener];
+    
+    return unwrap?unwrapListeners(evlistener):arrayClone(evlistener,evlistener.length);
+    }
+    
+    EventEmitter.prototype.listeners=function listeners(type){
+    return _listeners(this,type,true);
+    };
+    
+    EventEmitter.prototype.rawListeners=function rawListeners(type){
+    return _listeners(this,type,false);
+    };
+    
+    EventEmitter.listenerCount=function(emitter,type){
+    if(typeof emitter.listenerCount==='function'){
+    return emitter.listenerCount(type);
+    }else{
+    return listenerCount.call(emitter,type);
+    }
+    };
+    
+    EventEmitter.prototype.listenerCount=listenerCount;
+    function listenerCount(type){
+    var events=this._events;
+    
+    if(events){
+    var evlistener=events[type];
+    
+    if(typeof evlistener==='function'){
+    return 1;
+    }else if(evlistener){
+    return evlistener.length;
+    }
+    }
+    
+    return 0;
+    }
+    
+    EventEmitter.prototype.eventNames=function eventNames(){
+    return this._eventsCount>0?Reflect.ownKeys(this._events):[];
+    };
+    
+    
+    function spliceOne(list,index){
+    for(var i=index,k=i+1,n=list.length;k<n;i+=1,k+=1)
+    list[i]=list[k];
+    list.pop();
+    }
+    
+    function arrayClone(arr,n){
+    var copy=new Array(n);
+    for(var i=0;i<n;++i)
+    copy[i]=arr[i];
+    return copy;
+    }
+    
+    function unwrapListeners(arr){
+    var ret=new Array(arr.length);
+    for(var i=0;i<ret.length;++i){
+    ret[i]=arr[i].listener||arr[i];
+    }
+    return ret;
+    }
+    
+    function objectCreatePolyfill(proto){
+    var F=function(){};
+    F.prototype=proto;
+    return new F();
+    }
+    function objectKeysPolyfill(obj){
+    var keys=[];
+    for(var k in obj)if(Object.prototype.hasOwnProperty.call(obj,k)){
+    keys.push(k);
+    }
+    return k;
+    }
+    function functionBindPolyfill(context){
+    var fn=this;
+    return function(){
+    return fn.apply(context,arguments);
+    };
+    }
+    
+    },{}],109:[function(require,module,exports){
+    (function(Buffer){
+    var querystring=require('querystring');
+    var trim=require('./trim');
+    
+    
+    
+    
+    
+    
+    function Link(value){
+    
+    if(!(this instanceof Link)){
+    return new Link(value);
+    }
+    
+    
+    this.refs=[];
+    
+    }
+    
+    
+    
+    
+    
+    Link.pattern=/(?:\<([^\>]+)\>)((\s*;\s*([a-z\*]+)=(("[^"]+")|('[^']+')|([^\,\;]+)))*)(\s*,\s*|$)/gi;
+    
+    
+    
+    
+    
+    Link.attrPattern=/([a-z\*]+)=(?:(?:"([^"]+)")|(?:'([^']+)')|([^\,\;]+))/gi;
+    
+    
+    
+    
+    
+    
+    
+    Link.isCompatibleEncoding=function(value){
+    return /^utf-?8|ascii|utf-?16-?le|ucs-?2|base-?64|latin-?1$/i.test(value);
+    };
+    
+    
+    
+    
+    
+    
+    
+    Link.formatExtendedAttribute=function(attr,data){
+    
+    var encoding=(data.encoding||'utf-8').toUpperCase();
+    var language=data.language||'en';
+    
+    var encodedValue='';
+    
+    if(Buffer.isBuffer(data.value)&&Link.isCompatibleEncoding(encoding)){
+    encodedValue=data.value.toString(encoding);
+    }else if(Buffer.isBuffer(data.value)){
+    encodedValue=data.value.toString('hex').
+    replace(/[0-9a-f]{2}/gi,'%$1');
+    }else{
+    encodedValue=querystring.escape(data.value);
+    }
+    
+    return attr+'='+encoding+'\''+
+    language+'\''+encodedValue;
+    
+    };
+    
+    
+    
+    
+    
+    
+    
+    Link.formatAttribute=function(attr,value){
+    
+    
+    if(/\*$/.test(attr)||typeof value!=='string')
+    return Link.formatExtendedAttribute(attr,value);
+    
+    
+    
+    var needsQuotes=/[^a-z]/i.test(value);
+    
+    if(needsQuotes){
+    
+    value=querystring.escape(value).
+    replace(/%20/g,' ').
+    replace(/%2C/g,',').
+    replace(/%3B/g,';');
+    
+    value='"'+value+'"';
+    }
+    
+    return attr+'='+value;
+    
+    };
+    
+    
+    
+    
+    
+    
+    
+    Link.parseExtendedValue=function(value){
+    var parts=/([^']+)?(?:'([^']+)')?(.+)/.exec(value);
+    return{
+    language:parts[2].toLowerCase(),
+    encoding:Link.isCompatibleEncoding(parts[1])?
+    null:parts[1].toLowerCase(),
+    value:Link.isCompatibleEncoding(parts[1])?
+    querystring.unescape(parts[3]):parts[3]};
+    
+    };
+    
+    
+    
+    
+    
+    
+    
+    Link.setAttr=function(link,attr,value){
+    
+    
+    
+    if(attr==='rel'&&link[attr]!=null)
+    return link;
+    
+    if(Array.isArray(link[attr])){
+    link[attr].push(value);
+    }else if(link[attr]!=null){
+    link[attr]=[link[attr],value];
+    }else{
+    link[attr]=value;
+    }
+    
+    return link;
+    
+    };
+    
+    
+    
+    
+    Link.parseParams=function(link,uri){
+    
+    var kvs={};
+    var params=/(.+)\?(.+)/gi.exec(uri);
+    
+    if(!params){
+    return link;
+    }
+    
+    params=params[2].split('&');
+    
+    for(var i=0;i<params.length;i++){
+    var param=params[i].split('=');
+    kvs[param[0]]=param[1];
+    }
+    
+    Link.setAttr(link,'params',kvs);
+    
+    return link;
+    
+    };
+    
+    
+    
+    
+    
+    
+    
+    
+    Link.parseAttrs=function(link,parts){
+    
+    var match=null;
+    var attr='';
+    var value='';
+    var attrs='';
+    
+    var uriAttrs=/<(.*)>;\s*(.*)/gi.exec(parts);
+    if(uriAttrs){
+    attrs=uriAttrs[2];
+    link=Link.parseParams(link,uriAttrs[1]);
+    }
+    
+    while(match=Link.attrPattern.exec(attrs)){
+    attr=match[1].toLowerCase();
+    value=match[4]||match[3]||match[2];
+    if(/\*$/.test(attr)){
+    Link.setAttr(link,attr,Link.parseExtendedValue(value));
+    }else if(/%/.test(value)){
+    Link.setAttr(link,attr,querystring.unescape(value));
+    }else{
+    Link.setAttr(link,attr,value);
+    }
+    }
+    
+    return link;
+    
+    };
+    
+    Link.parse=function(value){
+    return new Link().parse(value);
+    };
+    
+    
+    
+    
+    
+    Link.prototype={
+    
+    constructor:Link,
+    
+    
+    
+    
+    
+    
+    rel:function(value){
+    
+    var links=[];
+    
+    for(var i=0;i<this.refs.length;i++){
+    if(this.refs[i].rel===value){
+    links.push(this.refs[i]);
+    }
+    }
+    
+    return links;
+    
+    },
+    
+    
+    
+    
+    
+    
+    
+    get:function(attr,value){
+    
+    attr=attr.toLowerCase();
+    
+    var links=[];
+    
+    for(var i=0;i<this.refs.length;i++){
+    if(this.refs[i][attr]===value){
+    links.push(this.refs[i]);
+    }
+    }
+    
+    return links;
+    
+    },
+    
+    set:function(link){
+    this.refs.push(link);
+    return this;
+    },
+    
+    has:function(attr,value){
+    return this.get(attr,value)!=null;
+    },
+    
+    parse:function(value){
+    
+    
+    value=trim(value).
+    replace(/\r?\n[\x20\x09]+/g,'');
+    
+    var match=null;
+    
+    while(match=Link.pattern.exec(value)){
+    var link=Link.parseAttrs({uri:match[1]},match[0]);
+    this.refs.push(link);
+    }
+    
+    return this;
+    
+    },
+    
+    toString:function(){
+    
+    var refs=[];
+    var link='';
+    var ref=null;
+    
+    for(var i=0;i<this.refs.length;i++){
+    ref=this.refs[i];
+    link=Object.keys(this.refs[i]).reduce(function(link,attr){
+    if(attr==='uri')return link;
+    return link+'; '+Link.formatAttribute(attr,ref[attr]);
+    },'<'+ref.uri+'>');
+    refs.push(link);
+    }
+    
+    return refs.join(', ');
+    
+    }};
+    
+    
+    
+    
+    module.exports=Link;
+    
+    }).call(this,{"isBuffer":require("../../is-buffer/index.js")});
+    },{"../../is-buffer/index.js":120,"./trim":110,"querystring":161}],110:[function(require,module,exports){
+    module.exports=function trim(value){
+    return value.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,'');
+    };
+    
+    },{}],111:[function(require,module,exports){
+    exports.read=function(buffer,offset,isLE,mLen,nBytes){
+    var e,m;
+    var eLen=nBytes*8-mLen-1;
+    var eMax=(1<<eLen)-1;
+    var eBias=eMax>>1;
+    var nBits=-7;
+    var i=isLE?nBytes-1:0;
+    var d=isLE?-1:1;
+    var s=buffer[offset+i];
+    
+    i+=d;
+    
+    e=s&(1<<-nBits)-1;
+    s>>=-nBits;
+    nBits+=eLen;
+    for(;nBits>0;e=e*256+buffer[offset+i],i+=d,nBits-=8){}
+    
+    m=e&(1<<-nBits)-1;
+    e>>=-nBits;
+    nBits+=mLen;
+    for(;nBits>0;m=m*256+buffer[offset+i],i+=d,nBits-=8){}
+    
+    if(e===0){
+    e=1-eBias;
+    }else if(e===eMax){
+    return m?NaN:(s?-1:1)*Infinity;
+    }else{
+    m=m+Math.pow(2,mLen);
+    e=e-eBias;
+    }
+    return(s?-1:1)*m*Math.pow(2,e-mLen);
+    };
+    
+    exports.write=function(buffer,value,offset,isLE,mLen,nBytes){
+    var e,m,c;
+    var eLen=nBytes*8-mLen-1;
+    var eMax=(1<<eLen)-1;
+    var eBias=eMax>>1;
+    var rt=mLen===23?Math.pow(2,-24)-Math.pow(2,-77):0;
+    var i=isLE?0:nBytes-1;
+    var d=isLE?1:-1;
+    var s=value<0||value===0&&1/value<0?1:0;
+    
+    value=Math.abs(value);
+    
+    if(isNaN(value)||value===Infinity){
+    m=isNaN(value)?1:0;
+    e=eMax;
+    }else{
+    e=Math.floor(Math.log(value)/Math.LN2);
+    if(value*(c=Math.pow(2,-e))<1){
+    e--;
+    c*=2;
+    }
+    if(e+eBias>=1){
+    value+=rt/c;
+    }else{
+    value+=rt*Math.pow(2,1-eBias);
+    }
+    if(value*c>=2){
+    e++;
+    c/=2;
+    }
+    
+    if(e+eBias>=eMax){
+    m=0;
+    e=eMax;
+    }else if(e+eBias>=1){
+    m=(value*c-1)*Math.pow(2,mLen);
+    e=e+eBias;
+    }else{
+    m=value*Math.pow(2,eBias-1)*Math.pow(2,mLen);
+    e=0;
+    }
+    }
+    
+    for(;mLen>=8;buffer[offset+i]=m&0xff,i+=d,m/=256,mLen-=8){}
+    
+    e=e<<mLen|m;
+    eLen+=mLen;
+    for(;eLen>0;buffer[offset+i]=e&0xff,i+=d,e/=256,eLen-=8){}
+    
+    buffer[offset+i-d]|=s*128;
+    };
+    
+    },{}],112:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    var ImageSSIM;
+    (function(ImageSSIM){
+    'use strict';
+    
+    
+    
+    (function(Channels){
+    Channels[Channels["Grey"]=1]="Grey";
+    Channels[Channels["GreyAlpha"]=2]="GreyAlpha";
+    Channels[Channels["RGB"]=3]="RGB";
+    Channels[Channels["RGBAlpha"]=4]="RGBAlpha";
+    })(ImageSSIM.Channels||(ImageSSIM.Channels={}));
+    var Channels=ImageSSIM.Channels;
+    
+    
+    
+    
+    function compare(image1,image2,windowSize,K1,K2,luminance,bitsPerComponent){
+    if(windowSize===void 0){windowSize=8;}
+    if(K1===void 0){K1=0.01;}
+    if(K2===void 0){K2=0.03;}
+    if(luminance===void 0){luminance=true;}
+    if(bitsPerComponent===void 0){bitsPerComponent=8;}
+    if(image1.width!==image2.width||image1.height!==image2.height){
+    throw new Error('Images have different sizes!');
+    }
+    
+    var L=(1<<bitsPerComponent)-1;
+    
+    var c1=Math.pow(K1*L,2),c2=Math.pow(K2*L,2),numWindows=0,mssim=0.0;
+    var mcs=0.0;
+    function iteration(lumaValues1,lumaValues2,averageLumaValue1,averageLumaValue2){
+    
+    var sigxy,sigsqx,sigsqy;
+    sigxy=sigsqx=sigsqy=0.0;
+    for(var i=0;i<lumaValues1.length;i++){
+    sigsqx+=Math.pow(lumaValues1[i]-averageLumaValue1,2);
+    sigsqy+=Math.pow(lumaValues2[i]-averageLumaValue2,2);
+    sigxy+=(lumaValues1[i]-averageLumaValue1)*(lumaValues2[i]-averageLumaValue2);
+    }
+    var numPixelsInWin=lumaValues1.length-1;
+    sigsqx/=numPixelsInWin;
+    sigsqy/=numPixelsInWin;
+    sigxy/=numPixelsInWin;
+    
+    var numerator=(2*averageLumaValue1*averageLumaValue2+c1)*(2*sigxy+c2);
+    var denominator=(Math.pow(averageLumaValue1,2)+Math.pow(averageLumaValue2,2)+c1)*(sigsqx+sigsqy+c2);
+    mssim+=numerator/denominator;
+    mcs+=(2*sigxy+c2)/(sigsqx+sigsqy+c2);
+    numWindows++;
+    }
+    
+    Internals._iterate(image1,image2,windowSize,luminance,iteration);
+    return{ssim:mssim/numWindows,mcs:mcs/numWindows};
+    }
+    ImageSSIM.compare=compare;
+    
+    
+    
+    var Internals;
+    (function(Internals){
+    function _iterate(image1,image2,windowSize,luminance,callback){
+    var width=image1.width,height=image1.height;
+    for(var y=0;y<height;y+=windowSize){
+    for(var x=0;x<width;x+=windowSize){
+    
+    var windowWidth=Math.min(windowSize,width-x),windowHeight=Math.min(windowSize,height-y);
+    var lumaValues1=_lumaValuesForWindow(image1,x,y,windowWidth,windowHeight,luminance),lumaValues2=_lumaValuesForWindow(image2,x,y,windowWidth,windowHeight,luminance),averageLuma1=_averageLuma(lumaValues1),averageLuma2=_averageLuma(lumaValues2);
+    callback(lumaValues1,lumaValues2,averageLuma1,averageLuma2);
+    }
+    }
+    }
+    Internals._iterate=_iterate;
+    function _lumaValuesForWindow(image,x,y,width,height,luminance){
+    var array=image.data,lumaValues=new Float32Array(new ArrayBuffer(width*height*4)),counter=0;
+    var maxj=y+height;
+    for(var j=y;j<maxj;j++){
+    var offset=j*image.width;
+    var i=(offset+x)*image.channels;
+    var maxi=(offset+x+width)*image.channels;
+    switch(image.channels){
+    case 1:
+    while(i<maxi){
+    
+    lumaValues[counter++]=array[i++];
+    }
+    break;
+    case 2:
+    while(i<maxi){
+    lumaValues[counter++]=array[i++]*(array[i++]/255);
+    }
+    break;
+    case 3:
+    if(luminance){
+    while(i<maxi){
+    lumaValues[counter++]=array[i++]*0.212655+array[i++]*0.715158+array[i++]*0.072187;
+    }
+    }else
+    {
+    while(i<maxi){
+    lumaValues[counter++]=array[i++]+array[i++]+array[i++];
+    }
+    }
+    break;
+    case 4:
+    if(luminance){
+    while(i<maxi){
+    lumaValues[counter++]=(array[i++]*0.212655+array[i++]*0.715158+array[i++]*0.072187)*(array[i++]/255);
+    }
+    }else
+    {
+    while(i<maxi){
+    lumaValues[counter++]=(array[i++]+array[i++]+array[i++])*(array[i++]/255);
+    }
+    }
+    break;}
+    
+    }
+    return lumaValues;
+    }
+    function _averageLuma(lumaValues){
+    var sumLuma=0.0;
+    for(var i=0;i<lumaValues.length;i++){
+    sumLuma+=lumaValues[i];
+    }
+    return sumLuma/lumaValues.length;
+    }
+    })(Internals||(Internals={}));
+    })(ImageSSIM||(ImageSSIM={}));
+    module.exports=ImageSSIM;
+    
+    },{}],113:[function(require,module,exports){
+    arguments[4][93][0].apply(exports,arguments);
+    },{"dup":93}],114:[function(require,module,exports){
+    'use strict';
+    
+    var parser=require('./lib/parser');
+    
+    module.exports=parser;
+    module.exports['default']=parser;
+    
+    },{"./lib/parser":115}],115:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    "use strict";
+    
+    function peg$subclass(child,parent){
+    function ctor(){this.constructor=child;}
+    ctor.prototype=parent.prototype;
+    child.prototype=new ctor();
+    }
+    
+    function peg$SyntaxError(message,expected,found,location){
+    this.message=message;
+    this.expected=expected;
+    this.found=found;
+    this.location=location;
+    this.name="SyntaxError";
+    
+    if(typeof Error.captureStackTrace==="function"){
+    Error.captureStackTrace(this,peg$SyntaxError);
+    }
+    }
+    
+    peg$subclass(peg$SyntaxError,Error);
+    
+    peg$SyntaxError.buildMessage=function(expected,found){
+    var DESCRIBE_EXPECTATION_FNS={
+    literal:function(expectation){
+    return"\""+literalEscape(expectation.text)+"\"";
+    },
+    
+    "class":function(expectation){
+    var escapedParts="",
+    i;
+    
+    for(i=0;i<expectation.parts.length;i++){
+    escapedParts+=expectation.parts[i]instanceof Array?
+    classEscape(expectation.parts[i][0])+"-"+classEscape(expectation.parts[i][1]):
+    classEscape(expectation.parts[i]);
+    }
+    
+    return"["+(expectation.inverted?"^":"")+escapedParts+"]";
+    },
+    
+    any:function(expectation){
+    return"any character";
+    },
+    
+    end:function(expectation){
+    return"end of input";
+    },
+    
+    other:function(expectation){
+    return expectation.description;
+    }};
+    
+    
+    function hex(ch){
+    return ch.charCodeAt(0).toString(16).toUpperCase();
+    }
+    
+    function literalEscape(s){
+    return s.
+    replace(/\\/g,'\\\\').
+    replace(/"/g,'\\"').
+    replace(/\0/g,'\\0').
+    replace(/\t/g,'\\t').
+    replace(/\n/g,'\\n').
+    replace(/\r/g,'\\r').
+    replace(/[\x00-\x0F]/g,function(ch){return'\\x0'+hex(ch);}).
+    replace(/[\x10-\x1F\x7F-\x9F]/g,function(ch){return'\\x'+hex(ch);});
+    }
+    
+    function classEscape(s){
+    return s.
+    replace(/\\/g,'\\\\').
+    replace(/\]/g,'\\]').
+    replace(/\^/g,'\\^').
+    replace(/-/g,'\\-').
+    replace(/\0/g,'\\0').
+    replace(/\t/g,'\\t').
+    replace(/\n/g,'\\n').
+    replace(/\r/g,'\\r').
+    replace(/[\x00-\x0F]/g,function(ch){return'\\x0'+hex(ch);}).
+    replace(/[\x10-\x1F\x7F-\x9F]/g,function(ch){return'\\x'+hex(ch);});
+    }
+    
+    function describeExpectation(expectation){
+    return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);
+    }
+    
+    function describeExpected(expected){
+    var descriptions=new Array(expected.length),
+    i,j;
+    
+    for(i=0;i<expected.length;i++){
+    descriptions[i]=describeExpectation(expected[i]);
+    }
+    
+    descriptions.sort();
+    
+    if(descriptions.length>0){
+    for(i=1,j=1;i<descriptions.length;i++){
+    if(descriptions[i-1]!==descriptions[i]){
+    descriptions[j]=descriptions[i];
+    j++;
+    }
+    }
+    descriptions.length=j;
+    }
+    
+    switch(descriptions.length){
+    case 1:
+    return descriptions[0];
+    
+    case 2:
+    return descriptions[0]+" or "+descriptions[1];
+    
+    default:
+    return descriptions.slice(0,-1).join(", ")+
+    ", or "+
+    descriptions[descriptions.length-1];}
+    
+    }
+    
+    function describeFound(found){
+    return found?"\""+literalEscape(found)+"\"":"end of input";
+    }
+    
+    return"Expected "+describeExpected(expected)+" but "+describeFound(found)+" found.";
+    };
+    
+    function peg$parse(input,options){
+    options=options!==void 0?options:{};
+    
+    var peg$FAILED={},
+    
+    peg$startRuleFunctions={start:peg$parsestart},
+    peg$startRuleFunction=peg$parsestart,
+    
+    peg$c0=function(elements){
+    return{
+    type:'messageFormatPattern',
+    elements:elements,
+    location:location()};
+    
+    },
+    peg$c1=function(chunks){
+    return chunks.reduce(function(all,chunk){
+    return all.concat(chunk);
+    },[]).join('');
+    },
+    peg$c2=function(messageText){
+    return{
+    type:'messageTextElement',
+    value:messageText,
+    location:location()};
+    
+    },
+    peg$c3=function(chars){return chars.join('');},
+    peg$c4="{",
+    peg$c5=peg$literalExpectation("{",false),
+    peg$c6=",",
+    peg$c7=peg$literalExpectation(",",false),
+    peg$c8="}",
+    peg$c9=peg$literalExpectation("}",false),
+    peg$c10=function(id,format){
+    return{
+    type:'argumentElement',
+    id:id,
+    format:format&&format[2],
+    location:location()};
+    
+    },
+    peg$c11="number",
+    peg$c12=peg$literalExpectation("number",false),
+    peg$c13="date",
+    peg$c14=peg$literalExpectation("date",false),
+    peg$c15="time",
+    peg$c16=peg$literalExpectation("time",false),
+    peg$c17=function(type,style){
+    return{
+    type:type+'Format',
+    style:style&&style[2],
+    location:location()};
+    
+    },
+    peg$c18="plural",
+    peg$c19=peg$literalExpectation("plural",false),
+    peg$c20=function(pluralStyle){
+    return{
+    type:pluralStyle.type,
+    ordinal:false,
+    offset:pluralStyle.offset||0,
+    options:pluralStyle.options,
+    location:location()};
+    
+    },
+    peg$c21="selectordinal",
+    peg$c22=peg$literalExpectation("selectordinal",false),
+    peg$c23=function(pluralStyle){
+    return{
+    type:pluralStyle.type,
+    ordinal:true,
+    offset:pluralStyle.offset||0,
+    options:pluralStyle.options,
+    location:location()};
+    
+    },
+    peg$c24="select",
+    peg$c25=peg$literalExpectation("select",false),
+    peg$c26=function(options){
+    return{
+    type:'selectFormat',
+    options:options,
+    location:location()};
+    
+    },
+    peg$c27="=",
+    peg$c28=peg$literalExpectation("=",false),
+    peg$c29=function(selector,pattern){
+    return{
+    type:'optionalFormatPattern',
+    selector:selector,
+    value:pattern,
+    location:location()};
+    
+    },
+    peg$c30="offset:",
+    peg$c31=peg$literalExpectation("offset:",false),
+    peg$c32=function(number){
+    return number;
+    },
+    peg$c33=function(offset,options){
+    return{
+    type:'pluralFormat',
+    offset:offset,
+    options:options,
+    location:location()};
+    
+    },
+    peg$c34=peg$otherExpectation("whitespace"),
+    peg$c35=/^[ \t\n\r]/,
+    peg$c36=peg$classExpectation([" ","\t","\n","\r"],false,false),
+    peg$c37=peg$otherExpectation("optionalWhitespace"),
+    peg$c38=/^[0-9]/,
+    peg$c39=peg$classExpectation([["0","9"]],false,false),
+    peg$c40=/^[0-9a-f]/i,
+    peg$c41=peg$classExpectation([["0","9"],["a","f"]],false,true),
+    peg$c42="0",
+    peg$c43=peg$literalExpectation("0",false),
+    peg$c44=/^[1-9]/,
+    peg$c45=peg$classExpectation([["1","9"]],false,false),
+    peg$c46=function(digits){
+    return parseInt(digits,10);
+    },
+    peg$c47="'",
+    peg$c48=peg$literalExpectation("'",false),
+    peg$c49=/^[ \t\n\r,.+={}#]/,
+    peg$c50=peg$classExpectation([" ","\t","\n","\r",",",".","+","=","{","}","#"],false,false),
+    peg$c51=peg$anyExpectation(),
+    peg$c52=function(char){return char;},
+    peg$c53=function(sequence){return sequence;},
+    peg$c54=/^[^{}\\\0-\x1F\x7F \t\n\r]/,
+    peg$c55=peg$classExpectation(["{","}","\\",["\0","\x1F"],"\x7F"," ","\t","\n","\r"],true,false),
+    peg$c56="\\\\",
+    peg$c57=peg$literalExpectation("\\\\",false),
+    peg$c58=function(){return'\\';},
+    peg$c59="\\#",
+    peg$c60=peg$literalExpectation("\\#",false),
+    peg$c61=function(){return'\\#';},
+    peg$c62="\\{",
+    peg$c63=peg$literalExpectation("\\{",false),
+    peg$c64=function(){return'\u007B';},
+    peg$c65="\\}",
+    peg$c66=peg$literalExpectation("\\}",false),
+    peg$c67=function(){return'\u007D';},
+    peg$c68="\\u",
+    peg$c69=peg$literalExpectation("\\u",false),
+    peg$c70=function(digits){
+    return String.fromCharCode(parseInt(digits,16));
+    },
+    
+    peg$currPos=0,
+    peg$savedPos=0,
+    peg$posDetailsCache=[{line:1,column:1}],
+    peg$maxFailPos=0,
+    peg$maxFailExpected=[],
+    peg$silentFails=0,
+    
+    peg$result;
+    
+    if("startRule"in options){
+    if(!(options.startRule in peg$startRuleFunctions)){
+    throw new Error("Can't start parsing from rule \""+options.startRule+"\".");
+    }
+    
+    peg$startRuleFunction=peg$startRuleFunctions[options.startRule];
+    }
+    
+    function text(){
+    return input.substring(peg$savedPos,peg$currPos);
+    }
+    
+    function location(){
+    return peg$computeLocation(peg$savedPos,peg$currPos);
+    }
+    
+    function expected(description,location){
+    location=location!==void 0?location:peg$computeLocation(peg$savedPos,peg$currPos);
+    
+    throw peg$buildStructuredError(
+    [peg$otherExpectation(description)],
+    input.substring(peg$savedPos,peg$currPos),
+    location);
+    
+    }
+    
+    function error(message,location){
+    location=location!==void 0?location:peg$computeLocation(peg$savedPos,peg$currPos);
+    
+    throw peg$buildSimpleError(message,location);
+    }
+    
+    function peg$literalExpectation(text,ignoreCase){
+    return{type:"literal",text:text,ignoreCase:ignoreCase};
+    }
+    
+    function peg$classExpectation(parts,inverted,ignoreCase){
+    return{type:"class",parts:parts,inverted:inverted,ignoreCase:ignoreCase};
+    }
+    
+    function peg$anyExpectation(){
+    return{type:"any"};
+    }
+    
+    function peg$endExpectation(){
+    return{type:"end"};
+    }
+    
+    function peg$otherExpectation(description){
+    return{type:"other",description:description};
+    }
+    
+    function peg$computePosDetails(pos){
+    var details=peg$posDetailsCache[pos],p;
+    
+    if(details){
+    return details;
+    }else{
+    p=pos-1;
+    while(!peg$posDetailsCache[p]){
+    p--;
+    }
+    
+    details=peg$posDetailsCache[p];
+    details={
+    line:details.line,
+    column:details.column};
+    
+    
+    while(p<pos){
+    if(input.charCodeAt(p)===10){
+    details.line++;
+    details.column=1;
+    }else{
+    details.column++;
+    }
+    
+    p++;
+    }
+    
+    peg$posDetailsCache[pos]=details;
+    return details;
+    }
+    }
+    
+    function peg$computeLocation(startPos,endPos){
+    var startPosDetails=peg$computePosDetails(startPos),
+    endPosDetails=peg$computePosDetails(endPos);
+    
+    return{
+    start:{
+    offset:startPos,
+    line:startPosDetails.line,
+    column:startPosDetails.column},
+    
+    end:{
+    offset:endPos,
+    line:endPosDetails.line,
+    column:endPosDetails.column}};
+    
+    
+    }
+    
+    function peg$fail(expected){
+    if(peg$currPos<peg$maxFailPos){return;}
+    
+    if(peg$currPos>peg$maxFailPos){
+    peg$maxFailPos=peg$currPos;
+    peg$maxFailExpected=[];
+    }
+    
+    peg$maxFailExpected.push(expected);
+    }
+    
+    function peg$buildSimpleError(message,location){
+    return new peg$SyntaxError(message,null,null,location);
+    }
+    
+    function peg$buildStructuredError(expected,found,location){
+    return new peg$SyntaxError(
+    peg$SyntaxError.buildMessage(expected,found),
+    expected,
+    found,
+    location);
+    
+    }
+    
+    function peg$parsestart(){
+    var s0;
+    
+    s0=peg$parsemessageFormatPattern();
+    
+    return s0;
+    }
+    
+    function peg$parsemessageFormatPattern(){
+    var s0,s1,s2;
+    
+    s0=peg$currPos;
+    s1=[];
+    s2=peg$parsemessageFormatElement();
+    while(s2!==peg$FAILED){
+    s1.push(s2);
+    s2=peg$parsemessageFormatElement();
+    }
+    if(s1!==peg$FAILED){
+    peg$savedPos=s0;
+    s1=peg$c0(s1);
+    }
+    s0=s1;
+    
+    return s0;
+    }
+    
+    function peg$parsemessageFormatElement(){
+    var s0;
+    
+    s0=peg$parsemessageTextElement();
+    if(s0===peg$FAILED){
+    s0=peg$parseargumentElement();
+    }
+    
+    return s0;
+    }
+    
+    function peg$parsemessageText(){
+    var s0,s1,s2,s3,s4,s5;
+    
+    s0=peg$currPos;
+    s1=[];
+    s2=peg$currPos;
+    s3=peg$parse_();
+    if(s3!==peg$FAILED){
+    s4=peg$parsechars();
+    if(s4!==peg$FAILED){
+    s5=peg$parse_();
+    if(s5!==peg$FAILED){
+    s3=[s3,s4,s5];
+    s2=s3;
+    }else{
+    peg$currPos=s2;
+    s2=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s2;
+    s2=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s2;
+    s2=peg$FAILED;
+    }
+    if(s2!==peg$FAILED){
+    while(s2!==peg$FAILED){
+    s1.push(s2);
+    s2=peg$currPos;
+    s3=peg$parse_();
+    if(s3!==peg$FAILED){
+    s4=peg$parsechars();
+    if(s4!==peg$FAILED){
+    s5=peg$parse_();
+    if(s5!==peg$FAILED){
+    s3=[s3,s4,s5];
+    s2=s3;
+    }else{
+    peg$currPos=s2;
+    s2=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s2;
+    s2=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s2;
+    s2=peg$FAILED;
+    }
+    }
+    }else{
+    s1=peg$FAILED;
+    }
+    if(s1!==peg$FAILED){
+    peg$savedPos=s0;
+    s1=peg$c1(s1);
+    }
+    s0=s1;
+    if(s0===peg$FAILED){
+    s0=peg$currPos;
+    s1=peg$parsews();
+    if(s1!==peg$FAILED){
+    s0=input.substring(s0,peg$currPos);
+    }else{
+    s0=s1;
+    }
+    }
+    
+    return s0;
+    }
+    
+    function peg$parsemessageTextElement(){
+    var s0,s1;
+    
+    s0=peg$currPos;
+    s1=peg$parsemessageText();
+    if(s1!==peg$FAILED){
+    peg$savedPos=s0;
+    s1=peg$c2(s1);
+    }
+    s0=s1;
+    
+    return s0;
+    }
+    
+    function peg$parseargument(){
+    var s0,s1,s2;
+    
+    s0=peg$parsenumber();
+    if(s0===peg$FAILED){
+    s0=peg$currPos;
+    s1=[];
+    s2=peg$parsequoteEscapedChar();
+    while(s2!==peg$FAILED){
+    s1.push(s2);
+    s2=peg$parsequoteEscapedChar();
+    }
+    if(s1!==peg$FAILED){
+    peg$savedPos=s0;
+    s1=peg$c3(s1);
+    }
+    s0=s1;
+    }
+    
+    return s0;
+    }
+    
+    function peg$parseargumentElement(){
+    var s0,s1,s2,s3,s4,s5,s6,s7,s8;
+    
+    s0=peg$currPos;
+    if(input.charCodeAt(peg$currPos)===123){
+    s1=peg$c4;
+    peg$currPos++;
+    }else{
+    s1=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c5);}
+    }
+    if(s1!==peg$FAILED){
+    s2=peg$parse_();
+    if(s2!==peg$FAILED){
+    s3=peg$parseargument();
+    if(s3!==peg$FAILED){
+    s4=peg$parse_();
+    if(s4!==peg$FAILED){
+    s5=peg$currPos;
+    if(input.charCodeAt(peg$currPos)===44){
+    s6=peg$c6;
+    peg$currPos++;
+    }else{
+    s6=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c7);}
+    }
+    if(s6!==peg$FAILED){
+    s7=peg$parse_();
+    if(s7!==peg$FAILED){
+    s8=peg$parseelementFormat();
+    if(s8!==peg$FAILED){
+    s6=[s6,s7,s8];
+    s5=s6;
+    }else{
+    peg$currPos=s5;
+    s5=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s5;
+    s5=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s5;
+    s5=peg$FAILED;
+    }
+    if(s5===peg$FAILED){
+    s5=null;
+    }
+    if(s5!==peg$FAILED){
+    s6=peg$parse_();
+    if(s6!==peg$FAILED){
+    if(input.charCodeAt(peg$currPos)===125){
+    s7=peg$c8;
+    peg$currPos++;
+    }else{
+    s7=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c9);}
+    }
+    if(s7!==peg$FAILED){
+    peg$savedPos=s0;
+    s1=peg$c10(s3,s5);
+    s0=s1;
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    
+    return s0;
+    }
+    
+    function peg$parseelementFormat(){
+    var s0;
+    
+    s0=peg$parsesimpleFormat();
+    if(s0===peg$FAILED){
+    s0=peg$parsepluralFormat();
+    if(s0===peg$FAILED){
+    s0=peg$parseselectOrdinalFormat();
+    if(s0===peg$FAILED){
+    s0=peg$parseselectFormat();
+    }
+    }
+    }
+    
+    return s0;
+    }
+    
+    function peg$parsesimpleFormat(){
+    var s0,s1,s2,s3,s4,s5,s6;
+    
+    s0=peg$currPos;
+    if(input.substr(peg$currPos,6)===peg$c11){
+    s1=peg$c11;
+    peg$currPos+=6;
+    }else{
+    s1=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c12);}
+    }
+    if(s1===peg$FAILED){
+    if(input.substr(peg$currPos,4)===peg$c13){
+    s1=peg$c13;
+    peg$currPos+=4;
+    }else{
+    s1=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c14);}
+    }
+    if(s1===peg$FAILED){
+    if(input.substr(peg$currPos,4)===peg$c15){
+    s1=peg$c15;
+    peg$currPos+=4;
+    }else{
+    s1=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c16);}
+    }
+    }
+    }
+    if(s1!==peg$FAILED){
+    s2=peg$parse_();
+    if(s2!==peg$FAILED){
+    s3=peg$currPos;
+    if(input.charCodeAt(peg$currPos)===44){
+    s4=peg$c6;
+    peg$currPos++;
+    }else{
+    s4=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c7);}
+    }
+    if(s4!==peg$FAILED){
+    s5=peg$parse_();
+    if(s5!==peg$FAILED){
+    s6=peg$parsechars();
+    if(s6!==peg$FAILED){
+    s4=[s4,s5,s6];
+    s3=s4;
+    }else{
+    peg$currPos=s3;
+    s3=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s3;
+    s3=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s3;
+    s3=peg$FAILED;
+    }
+    if(s3===peg$FAILED){
+    s3=null;
+    }
+    if(s3!==peg$FAILED){
+    peg$savedPos=s0;
+    s1=peg$c17(s1,s3);
+    s0=s1;
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    
+    return s0;
+    }
+    
+    function peg$parsepluralFormat(){
+    var s0,s1,s2,s3,s4,s5;
+    
+    s0=peg$currPos;
+    if(input.substr(peg$currPos,6)===peg$c18){
+    s1=peg$c18;
+    peg$currPos+=6;
+    }else{
+    s1=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c19);}
+    }
+    if(s1!==peg$FAILED){
+    s2=peg$parse_();
+    if(s2!==peg$FAILED){
+    if(input.charCodeAt(peg$currPos)===44){
+    s3=peg$c6;
+    peg$currPos++;
+    }else{
+    s3=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c7);}
+    }
+    if(s3!==peg$FAILED){
+    s4=peg$parse_();
+    if(s4!==peg$FAILED){
+    s5=peg$parsepluralStyle();
+    if(s5!==peg$FAILED){
+    peg$savedPos=s0;
+    s1=peg$c20(s5);
+    s0=s1;
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    
+    return s0;
+    }
+    
+    function peg$parseselectOrdinalFormat(){
+    var s0,s1,s2,s3,s4,s5;
+    
+    s0=peg$currPos;
+    if(input.substr(peg$currPos,13)===peg$c21){
+    s1=peg$c21;
+    peg$currPos+=13;
+    }else{
+    s1=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c22);}
+    }
+    if(s1!==peg$FAILED){
+    s2=peg$parse_();
+    if(s2!==peg$FAILED){
+    if(input.charCodeAt(peg$currPos)===44){
+    s3=peg$c6;
+    peg$currPos++;
+    }else{
+    s3=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c7);}
+    }
+    if(s3!==peg$FAILED){
+    s4=peg$parse_();
+    if(s4!==peg$FAILED){
+    s5=peg$parsepluralStyle();
+    if(s5!==peg$FAILED){
+    peg$savedPos=s0;
+    s1=peg$c23(s5);
+    s0=s1;
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    
+    return s0;
+    }
+    
+    function peg$parseselectFormat(){
+    var s0,s1,s2,s3,s4,s5,s6;
+    
+    s0=peg$currPos;
+    if(input.substr(peg$currPos,6)===peg$c24){
+    s1=peg$c24;
+    peg$currPos+=6;
+    }else{
+    s1=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c25);}
+    }
+    if(s1!==peg$FAILED){
+    s2=peg$parse_();
+    if(s2!==peg$FAILED){
+    if(input.charCodeAt(peg$currPos)===44){
+    s3=peg$c6;
+    peg$currPos++;
+    }else{
+    s3=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c7);}
+    }
+    if(s3!==peg$FAILED){
+    s4=peg$parse_();
+    if(s4!==peg$FAILED){
+    s5=[];
+    s6=peg$parseoptionalFormatPattern();
+    if(s6!==peg$FAILED){
+    while(s6!==peg$FAILED){
+    s5.push(s6);
+    s6=peg$parseoptionalFormatPattern();
+    }
+    }else{
+    s5=peg$FAILED;
+    }
+    if(s5!==peg$FAILED){
+    peg$savedPos=s0;
+    s1=peg$c26(s5);
+    s0=s1;
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    
+    return s0;
+    }
+    
+    function peg$parseselector(){
+    var s0,s1,s2,s3;
+    
+    s0=peg$currPos;
+    s1=peg$currPos;
+    if(input.charCodeAt(peg$currPos)===61){
+    s2=peg$c27;
+    peg$currPos++;
+    }else{
+    s2=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c28);}
+    }
+    if(s2!==peg$FAILED){
+    s3=peg$parsenumber();
+    if(s3!==peg$FAILED){
+    s2=[s2,s3];
+    s1=s2;
+    }else{
+    peg$currPos=s1;
+    s1=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s1;
+    s1=peg$FAILED;
+    }
+    if(s1!==peg$FAILED){
+    s0=input.substring(s0,peg$currPos);
+    }else{
+    s0=s1;
+    }
+    if(s0===peg$FAILED){
+    s0=peg$parsechars();
+    }
+    
+    return s0;
+    }
+    
+    function peg$parseoptionalFormatPattern(){
+    var s0,s1,s2,s3,s4,s5,s6;
+    
+    s0=peg$currPos;
+    s1=peg$parse_();
+    if(s1!==peg$FAILED){
+    s2=peg$parseselector();
+    if(s2!==peg$FAILED){
+    s3=peg$parse_();
+    if(s3!==peg$FAILED){
+    if(input.charCodeAt(peg$currPos)===123){
+    s4=peg$c4;
+    peg$currPos++;
+    }else{
+    s4=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c5);}
+    }
+    if(s4!==peg$FAILED){
+    s5=peg$parsemessageFormatPattern();
+    if(s5!==peg$FAILED){
+    if(input.charCodeAt(peg$currPos)===125){
+    s6=peg$c8;
+    peg$currPos++;
+    }else{
+    s6=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c9);}
+    }
+    if(s6!==peg$FAILED){
+    peg$savedPos=s0;
+    s1=peg$c29(s2,s5);
+    s0=s1;
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    
+    return s0;
+    }
+    
+    function peg$parseoffset(){
+    var s0,s1,s2,s3;
+    
+    s0=peg$currPos;
+    if(input.substr(peg$currPos,7)===peg$c30){
+    s1=peg$c30;
+    peg$currPos+=7;
+    }else{
+    s1=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c31);}
+    }
+    if(s1!==peg$FAILED){
+    s2=peg$parse_();
+    if(s2!==peg$FAILED){
+    s3=peg$parsenumber();
+    if(s3!==peg$FAILED){
+    peg$savedPos=s0;
+    s1=peg$c32(s3);
+    s0=s1;
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    
+    return s0;
+    }
+    
+    function peg$parsepluralStyle(){
+    var s0,s1,s2,s3,s4;
+    
+    s0=peg$currPos;
+    s1=peg$parseoffset();
+    if(s1===peg$FAILED){
+    s1=null;
+    }
+    if(s1!==peg$FAILED){
+    s2=peg$parse_();
+    if(s2!==peg$FAILED){
+    s3=[];
+    s4=peg$parseoptionalFormatPattern();
+    if(s4!==peg$FAILED){
+    while(s4!==peg$FAILED){
+    s3.push(s4);
+    s4=peg$parseoptionalFormatPattern();
+    }
+    }else{
+    s3=peg$FAILED;
+    }
+    if(s3!==peg$FAILED){
+    peg$savedPos=s0;
+    s1=peg$c33(s1,s3);
+    s0=s1;
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    
+    return s0;
+    }
+    
+    function peg$parsews(){
+    var s0,s1;
+    
+    peg$silentFails++;
+    s0=[];
+    if(peg$c35.test(input.charAt(peg$currPos))){
+    s1=input.charAt(peg$currPos);
+    peg$currPos++;
+    }else{
+    s1=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c36);}
+    }
+    if(s1!==peg$FAILED){
+    while(s1!==peg$FAILED){
+    s0.push(s1);
+    if(peg$c35.test(input.charAt(peg$currPos))){
+    s1=input.charAt(peg$currPos);
+    peg$currPos++;
+    }else{
+    s1=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c36);}
+    }
+    }
+    }else{
+    s0=peg$FAILED;
+    }
+    peg$silentFails--;
+    if(s0===peg$FAILED){
+    s1=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c34);}
+    }
+    
+    return s0;
+    }
+    
+    function peg$parse_(){
+    var s0,s1,s2;
+    
+    peg$silentFails++;
+    s0=peg$currPos;
+    s1=[];
+    s2=peg$parsews();
+    while(s2!==peg$FAILED){
+    s1.push(s2);
+    s2=peg$parsews();
+    }
+    if(s1!==peg$FAILED){
+    s0=input.substring(s0,peg$currPos);
+    }else{
+    s0=s1;
+    }
+    peg$silentFails--;
+    if(s0===peg$FAILED){
+    s1=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c37);}
+    }
+    
+    return s0;
+    }
+    
+    function peg$parsedigit(){
+    var s0;
+    
+    if(peg$c38.test(input.charAt(peg$currPos))){
+    s0=input.charAt(peg$currPos);
+    peg$currPos++;
+    }else{
+    s0=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c39);}
+    }
+    
+    return s0;
+    }
+    
+    function peg$parsehexDigit(){
+    var s0;
+    
+    if(peg$c40.test(input.charAt(peg$currPos))){
+    s0=input.charAt(peg$currPos);
+    peg$currPos++;
+    }else{
+    s0=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c41);}
+    }
+    
+    return s0;
+    }
+    
+    function peg$parsenumber(){
+    var s0,s1,s2,s3,s4,s5;
+    
+    s0=peg$currPos;
+    if(input.charCodeAt(peg$currPos)===48){
+    s1=peg$c42;
+    peg$currPos++;
+    }else{
+    s1=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c43);}
+    }
+    if(s1===peg$FAILED){
+    s1=peg$currPos;
+    s2=peg$currPos;
+    if(peg$c44.test(input.charAt(peg$currPos))){
+    s3=input.charAt(peg$currPos);
+    peg$currPos++;
+    }else{
+    s3=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c45);}
+    }
+    if(s3!==peg$FAILED){
+    s4=[];
+    s5=peg$parsedigit();
+    while(s5!==peg$FAILED){
+    s4.push(s5);
+    s5=peg$parsedigit();
+    }
+    if(s4!==peg$FAILED){
+    s3=[s3,s4];
+    s2=s3;
+    }else{
+    peg$currPos=s2;
+    s2=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s2;
+    s2=peg$FAILED;
+    }
+    if(s2!==peg$FAILED){
+    s1=input.substring(s1,peg$currPos);
+    }else{
+    s1=s2;
+    }
+    }
+    if(s1!==peg$FAILED){
+    peg$savedPos=s0;
+    s1=peg$c46(s1);
+    }
+    s0=s1;
+    
+    return s0;
+    }
+    
+    function peg$parsequoteEscapedChar(){
+    var s0,s1,s2;
+    
+    s0=peg$currPos;
+    s1=peg$currPos;
+    peg$silentFails++;
+    if(input.charCodeAt(peg$currPos)===39){
+    s2=peg$c47;
+    peg$currPos++;
+    }else{
+    s2=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c48);}
+    }
+    if(s2===peg$FAILED){
+    if(peg$c49.test(input.charAt(peg$currPos))){
+    s2=input.charAt(peg$currPos);
+    peg$currPos++;
+    }else{
+    s2=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c50);}
+    }
+    }
+    peg$silentFails--;
+    if(s2===peg$FAILED){
+    s1=void 0;
+    }else{
+    peg$currPos=s1;
+    s1=peg$FAILED;
+    }
+    if(s1!==peg$FAILED){
+    if(input.length>peg$currPos){
+    s2=input.charAt(peg$currPos);
+    peg$currPos++;
+    }else{
+    s2=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c51);}
+    }
+    if(s2!==peg$FAILED){
+    peg$savedPos=s0;
+    s1=peg$c52(s2);
+    s0=s1;
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    if(s0===peg$FAILED){
+    s0=peg$currPos;
+    if(input.charCodeAt(peg$currPos)===39){
+    s1=peg$c47;
+    peg$currPos++;
+    }else{
+    s1=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c48);}
+    }
+    if(s1!==peg$FAILED){
+    s2=peg$parseescape();
+    if(s2!==peg$FAILED){
+    peg$savedPos=s0;
+    s1=peg$c53(s2);
+    s0=s1;
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }
+    
+    return s0;
+    }
+    
+    function peg$parseapostrophe(){
+    var s0;
+    
+    if(input.charCodeAt(peg$currPos)===39){
+    s0=peg$c47;
+    peg$currPos++;
+    }else{
+    s0=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c48);}
+    }
+    
+    return s0;
+    }
+    
+    function peg$parseescape(){
+    var s0;
+    
+    if(peg$c49.test(input.charAt(peg$currPos))){
+    s0=input.charAt(peg$currPos);
+    peg$currPos++;
+    }else{
+    s0=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c50);}
+    }
+    if(s0===peg$FAILED){
+    s0=peg$parseapostrophe();
+    }
+    
+    return s0;
+    }
+    
+    function peg$parsechar(){
+    var s0,s1,s2,s3,s4,s5,s6,s7;
+    
+    s0=peg$currPos;
+    if(input.charCodeAt(peg$currPos)===39){
+    s1=peg$c47;
+    peg$currPos++;
+    }else{
+    s1=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c48);}
+    }
+    if(s1!==peg$FAILED){
+    s2=peg$parseapostrophe();
+    if(s2!==peg$FAILED){
+    peg$savedPos=s0;
+    s1=peg$c53(s2);
+    s0=s1;
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    if(s0===peg$FAILED){
+    if(peg$c54.test(input.charAt(peg$currPos))){
+    s0=input.charAt(peg$currPos);
+    peg$currPos++;
+    }else{
+    s0=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c55);}
+    }
+    if(s0===peg$FAILED){
+    s0=peg$currPos;
+    if(input.substr(peg$currPos,2)===peg$c56){
+    s1=peg$c56;
+    peg$currPos+=2;
+    }else{
+    s1=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c57);}
+    }
+    if(s1!==peg$FAILED){
+    peg$savedPos=s0;
+    s1=peg$c58();
+    }
+    s0=s1;
+    if(s0===peg$FAILED){
+    s0=peg$currPos;
+    if(input.substr(peg$currPos,2)===peg$c59){
+    s1=peg$c59;
+    peg$currPos+=2;
+    }else{
+    s1=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c60);}
+    }
+    if(s1!==peg$FAILED){
+    peg$savedPos=s0;
+    s1=peg$c61();
+    }
+    s0=s1;
+    if(s0===peg$FAILED){
+    s0=peg$currPos;
+    if(input.substr(peg$currPos,2)===peg$c62){
+    s1=peg$c62;
+    peg$currPos+=2;
+    }else{
+    s1=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c63);}
+    }
+    if(s1!==peg$FAILED){
+    peg$savedPos=s0;
+    s1=peg$c64();
+    }
+    s0=s1;
+    if(s0===peg$FAILED){
+    s0=peg$currPos;
+    if(input.substr(peg$currPos,2)===peg$c65){
+    s1=peg$c65;
+    peg$currPos+=2;
+    }else{
+    s1=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c66);}
+    }
+    if(s1!==peg$FAILED){
+    peg$savedPos=s0;
+    s1=peg$c67();
+    }
+    s0=s1;
+    if(s0===peg$FAILED){
+    s0=peg$currPos;
+    if(input.substr(peg$currPos,2)===peg$c68){
+    s1=peg$c68;
+    peg$currPos+=2;
+    }else{
+    s1=peg$FAILED;
+    if(peg$silentFails===0){peg$fail(peg$c69);}
+    }
+    if(s1!==peg$FAILED){
+    s2=peg$currPos;
+    s3=peg$currPos;
+    s4=peg$parsehexDigit();
+    if(s4!==peg$FAILED){
+    s5=peg$parsehexDigit();
+    if(s5!==peg$FAILED){
+    s6=peg$parsehexDigit();
+    if(s6!==peg$FAILED){
+    s7=peg$parsehexDigit();
+    if(s7!==peg$FAILED){
+    s4=[s4,s5,s6,s7];
+    s3=s4;
+    }else{
+    peg$currPos=s3;
+    s3=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s3;
+    s3=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s3;
+    s3=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s3;
+    s3=peg$FAILED;
+    }
+    if(s3!==peg$FAILED){
+    s2=input.substring(s2,peg$currPos);
+    }else{
+    s2=s3;
+    }
+    if(s2!==peg$FAILED){
+    peg$savedPos=s0;
+    s1=peg$c70(s2);
+    s0=s1;
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }else{
+    peg$currPos=s0;
+    s0=peg$FAILED;
+    }
+    }
+    }
+    }
+    }
+    }
+    }
+    
+    return s0;
+    }
+    
+    function peg$parsechars(){
+    var s0,s1,s2;
+    
+    s0=peg$currPos;
+    s1=[];
+    s2=peg$parsechar();
+    if(s2!==peg$FAILED){
+    while(s2!==peg$FAILED){
+    s1.push(s2);
+    s2=peg$parsechar();
+    }
+    }else{
+    s1=peg$FAILED;
+    }
+    if(s1!==peg$FAILED){
+    peg$savedPos=s0;
+    s1=peg$c3(s1);
+    }
+    s0=s1;
+    
+    return s0;
+    }
+    
+    peg$result=peg$startRuleFunction();
+    
+    if(peg$result!==peg$FAILED&&peg$currPos===input.length){
+    return peg$result;
+    }else{
+    if(peg$result!==peg$FAILED&&peg$currPos<input.length){
+    peg$fail(peg$endExpectation());
+    }
+    
+    throw peg$buildStructuredError(
+    peg$maxFailExpected,
+    peg$maxFailPos<input.length?input.charAt(peg$maxFailPos):null,
+    peg$maxFailPos<input.length?
+    peg$computeLocation(peg$maxFailPos,peg$maxFailPos+1):
+    peg$computeLocation(peg$maxFailPos,peg$maxFailPos));
+    
+    }
+    }
+    
+    module.exports={
+    SyntaxError:peg$SyntaxError,
+    parse:peg$parse};
+    
+    
+    },{}],116:[function(require,module,exports){
+    "use strict";
+    
+    
+    
+    
+    
+    var __extends=this&&this.__extends||function(){
+    var extendStatics=function(d,b){
+    extendStatics=Object.setPrototypeOf||
+    {__proto__:[]}instanceof Array&&function(d,b){d.__proto__=b;}||
+    function(d,b){for(var p in b)if(b.hasOwnProperty(p))d[p]=b[p];};
+    return extendStatics(d,b);
+    };
+    return function(d,b){
+    extendStatics(d,b);
+    function __(){this.constructor=d;}
+    d.prototype=b===null?Object.create(b):(__.prototype=b.prototype,new __());
+    };
+    }();
+    Object.defineProperty(exports,"__esModule",{value:true});
+    var Compiler=function(){
+    function Compiler(locales,formats,formatters){
+    this.locales=[];
+    this.formats={
+    number:{},
+    date:{},
+    time:{}};
+    
+    this.pluralNumberFormat=null;
+    this.currentPlural=null;
+    this.pluralStack=[];
+    this.locales=locales;
+    this.formats=formats;
+    this.formatters=formatters;
+    }
+    Compiler.prototype.compile=function(ast){
+    this.pluralStack=[];
+    this.currentPlural=null;
+    this.pluralNumberFormat=null;
+    return this.compileMessage(ast);
+    };
+    Compiler.prototype.compileMessage=function(ast){
+    var _this=this;
+    if(!(ast&&ast.type==='messageFormatPattern')){
+    throw new Error('Message AST is not of type: "messageFormatPattern"');
+    }
+    var elements=ast.elements;
+    var pattern=elements.
+    filter(function(el){
+    return el.type==='messageTextElement'||el.type==='argumentElement';
+    }).
+    map(function(el){
+    return el.type==='messageTextElement'?
+    _this.compileMessageText(el):
+    _this.compileArgument(el);
+    });
+    if(pattern.length!==elements.length){
+    throw new Error('Message element does not have a valid type');
+    }
+    return pattern;
+    };
+    Compiler.prototype.compileMessageText=function(element){
+    
+    
+    
+    if(this.currentPlural&&/(^|[^\\])#/g.test(element.value)){
+    
+    
+    if(!this.pluralNumberFormat){
+    this.pluralNumberFormat=new Intl.NumberFormat(this.locales);
+    }
+    return new PluralOffsetString(this.currentPlural.id,this.currentPlural.format.offset,this.pluralNumberFormat,element.value);
+    }
+    
+    return element.value.replace(/\\#/g,'#');
+    };
+    Compiler.prototype.compileArgument=function(element){
+    var format=element.format,id=element.id;
+    var formatters=this.formatters;
+    if(!format){
+    return new StringFormat(id);
+    }
+    var _a=this,formats=_a.formats,locales=_a.locales;
+    switch(format.type){
+    case'numberFormat':
+    return{
+    id:id,
+    format:formatters.getNumberFormat(locales,formats.number[format.style]).format};
+    
+    case'dateFormat':
+    return{
+    id:id,
+    format:formatters.getDateTimeFormat(locales,formats.date[format.style]).format};
+    
+    case'timeFormat':
+    return{
+    id:id,
+    format:formatters.getDateTimeFormat(locales,formats.time[format.style]).format};
+    
+    case'pluralFormat':
+    return new PluralFormat(id,format.offset,this.compileOptions(element),formatters.getPluralRules(locales,{
+    type:format.ordinal?'ordinal':'cardinal'}));
+    
+    case'selectFormat':
+    return new SelectFormat(id,this.compileOptions(element));
+    default:
+    throw new Error('Message element does not have a valid format type');}
+    
+    };
+    Compiler.prototype.compileOptions=function(element){
+    var _this=this;
+    var format=element.format;
+    var options=format.options;
+    
+    
+    
+    this.pluralStack.push(this.currentPlural);
+    this.currentPlural=format.type==='pluralFormat'?element:null;
+    var optionsHash=options.reduce(function(all,option){
+    
+    all[option.selector]=_this.compileMessage(option.value);
+    return all;
+    },{});
+    
+    this.currentPlural=this.pluralStack.pop();
+    return optionsHash;
+    };
+    return Compiler;
+    }();
+    exports.default=Compiler;
+    
+    var Formatter=function(){
+    function Formatter(id){
+    this.id=id;
+    }
+    return Formatter;
+    }();
+    var StringFormat=function(_super){
+    __extends(StringFormat,_super);
+    function StringFormat(){
+    return _super!==null&&_super.apply(this,arguments)||this;
+    }
+    StringFormat.prototype.format=function(value){
+    if(!value&&typeof value!=='number'){
+    return'';
+    }
+    return typeof value==='string'?value:String(value);
+    };
+    return StringFormat;
+    }(Formatter);
+    var PluralFormat=function(){
+    function PluralFormat(id,offset,options,pluralRules){
+    this.id=id;
+    this.offset=offset;
+    this.options=options;
+    this.pluralRules=pluralRules;
+    }
+    PluralFormat.prototype.getOption=function(value){
+    var options=this.options;
+    var option=options['='+value]||
+    options[this.pluralRules.select(value-this.offset)];
+    return option||options.other;
+    };
+    return PluralFormat;
+    }();
+    var PluralOffsetString=function(_super){
+    __extends(PluralOffsetString,_super);
+    function PluralOffsetString(id,offset,numberFormat,string){
+    var _this=_super.call(this,id)||this;
+    _this.offset=offset;
+    _this.numberFormat=numberFormat;
+    _this.string=string;
+    return _this;
+    }
+    PluralOffsetString.prototype.format=function(value){
+    var number=this.numberFormat.format(value-this.offset);
+    return this.string.
+    replace(/(^|[^\\])#/g,'$1'+number).
+    replace(/\\#/g,'#');
+    };
+    return PluralOffsetString;
+    }(Formatter);
+    exports.PluralOffsetString=PluralOffsetString;
+    var SelectFormat=function(){
+    function SelectFormat(id,options){
+    this.id=id;
+    this.options=options;
+    }
+    SelectFormat.prototype.getOption=function(value){
+    var options=this.options;
+    return options[value]||options.other;
+    };
+    return SelectFormat;
+    }();
+    exports.SelectFormat=SelectFormat;
+    function isSelectOrPluralFormat(f){
+    return!!f.options;
+    }
+    exports.isSelectOrPluralFormat=isSelectOrPluralFormat;
+    
+    },{}],117:[function(require,module,exports){
+    "use strict";
+    
+    
+    
+    
+    
+    var __extends=this&&this.__extends||function(){
+    var extendStatics=function(d,b){
+    extendStatics=Object.setPrototypeOf||
+    {__proto__:[]}instanceof Array&&function(d,b){d.__proto__=b;}||
+    function(d,b){for(var p in b)if(b.hasOwnProperty(p))d[p]=b[p];};
+    return extendStatics(d,b);
+    };
+    return function(d,b){
+    extendStatics(d,b);
+    function __(){this.constructor=d;}
+    d.prototype=b===null?Object.create(b):(__.prototype=b.prototype,new __());
+    };
+    }();
+    var __assign=this&&this.__assign||function(){
+    __assign=Object.assign||function(t){
+    for(var s,i=1,n=arguments.length;i<n;i++){
+    s=arguments[i];
+    for(var p in s)if(Object.prototype.hasOwnProperty.call(s,p))
+    t[p]=s[p];
+    }
+    return t;
+    };
+    return __assign.apply(this,arguments);
+    };
+    Object.defineProperty(exports,"__esModule",{value:true});
+    
+    var compiler_1=require("./compiler");
+    
+    function resolveLocale(locales){
+    if(typeof locales==='string'){
+    locales=[locales];
+    }
+    try{
+    return Intl.NumberFormat.supportedLocalesOf(locales,{
+    
+    
+    localeMatcher:'best fit'})[
+    0];
+    }
+    catch(e){
+    return IntlMessageFormat.defaultLocale;
+    }
+    }
+    function formatPatterns(pattern,values){
+    var result='';
+    for(var _i=0,pattern_1=pattern;_i<pattern_1.length;_i++){
+    var part=pattern_1[_i];
+    
+    if(typeof part==='string'){
+    result+=part;
+    continue;
+    }
+    var id=part.id;
+    
+    if(!(values&&id in values)){
+    throw new FormatError("A value must be provided for: "+id,id);
+    }
+    var value=values[id];
+    
+    
+    
+    if(compiler_1.isSelectOrPluralFormat(part)){
+    result+=formatPatterns(part.getOption(value),values);
+    }else
+    {
+    result+=part.format(value);
+    }
+    }
+    return result;
+    }
+    function mergeConfig(c1,c2){
+    if(!c2){
+    return c1;
+    }
+    return __assign({},c1||{},c2||{},Object.keys(c1).reduce(function(all,k){
+    all[k]=__assign({},c1[k],c2[k]||{});
+    return all;
+    },{}));
+    }
+    function mergeConfigs(defaultConfig,configs){
+    if(!configs){
+    return defaultConfig;
+    }
+    return Object.keys(defaultConfig).reduce(function(all,k){
+    all[k]=mergeConfig(defaultConfig[k],configs[k]);
+    return all;
+    },__assign({},defaultConfig));
+    }
+    var FormatError=function(_super){
+    __extends(FormatError,_super);
+    function FormatError(msg,variableId){
+    var _this=_super.call(this,msg)||this;
+    _this.variableId=variableId;
+    return _this;
+    }
+    return FormatError;
+    }(Error);
+    function createDefaultFormatters(){
+    return{
+    getNumberFormat:function(){
+    var _a;
+    var args=[];
+    for(var _i=0;_i<arguments.length;_i++){
+    args[_i]=arguments[_i];
+    }
+    return new((_a=Intl.NumberFormat).bind.apply(_a,[void 0].concat(args)))();
+    },
+    getDateTimeFormat:function(){
+    var _a;
+    var args=[];
+    for(var _i=0;_i<arguments.length;_i++){
+    args[_i]=arguments[_i];
+    }
+    return new((_a=Intl.DateTimeFormat).bind.apply(_a,[void 0].concat(args)))();
+    },
+    getPluralRules:function(){
+    var _a;
+    var args=[];
+    for(var _i=0;_i<arguments.length;_i++){
+    args[_i]=arguments[_i];
+    }
+    return new((_a=Intl.PluralRules).bind.apply(_a,[void 0].concat(args)))();
+    }};
+    
+    }
+    exports.createDefaultFormatters=createDefaultFormatters;
+    var IntlMessageFormat=function(){
+    function IntlMessageFormat(message,locales,overrideFormats,opts){
+    var _this=this;
+    if(locales===void 0){locales=IntlMessageFormat.defaultLocale;}
+    this.format=function(values){
+    try{
+    return formatPatterns(_this.pattern,values);
+    }
+    catch(e){
+    if(e.variableId){
+    throw new Error("The intl string context variable '"+e.variableId+"' was not provided to the string '"+_this.message+"'");
+    }else
+    {
+    throw e;
+    }
+    }
+    };
+    if(typeof message==='string'){
+    if(!IntlMessageFormat.__parse){
+    throw new TypeError('IntlMessageFormat.__parse must be set to process `message` of type `string`');
+    }
+    
+    this.ast=IntlMessageFormat.__parse(message);
+    }else
+    {
+    this.ast=message;
+    }
+    this.message=message;
+    if(!(this.ast&&this.ast.type==='messageFormatPattern')){
+    throw new TypeError('A message must be provided as a String or AST.');
+    }
+    
+    
+    var formats=mergeConfigs(IntlMessageFormat.formats,overrideFormats);
+    
+    this.locale=resolveLocale(locales||[]);
+    var formatters=opts&&opts.formatters||createDefaultFormatters();
+    
+    
+    
+    this.pattern=new compiler_1.default(locales,formats,formatters).compile(this.ast);
+    
+    
+    }
+    IntlMessageFormat.prototype.resolvedOptions=function(){
+    return{locale:this.locale};
+    };
+    IntlMessageFormat.prototype.getAst=function(){
+    return this.ast;
+    };
+    IntlMessageFormat.defaultLocale='en';
+    IntlMessageFormat.__parse=undefined;
+    
+    
+    
+    IntlMessageFormat.formats={
+    number:{
+    currency:{
+    style:'currency'},
+    
+    percent:{
+    style:'percent'}},
+    
+    
+    date:{
+    short:{
+    month:'numeric',
+    day:'numeric',
+    year:'2-digit'},
+    
+    medium:{
+    month:'short',
+    day:'numeric',
+    year:'numeric'},
+    
+    long:{
+    month:'long',
+    day:'numeric',
+    year:'numeric'},
+    
+    full:{
+    weekday:'long',
+    month:'long',
+    day:'numeric',
+    year:'numeric'}},
+    
+    
+    time:{
+    short:{
+    hour:'numeric',
+    minute:'numeric'},
+    
+    medium:{
+    hour:'numeric',
+    minute:'numeric',
+    second:'numeric'},
+    
+    long:{
+    hour:'numeric',
+    minute:'numeric',
+    second:'numeric',
+    timeZoneName:'short'},
+    
+    full:{
+    hour:'numeric',
+    minute:'numeric',
+    second:'numeric',
+    timeZoneName:'short'}}};
+    
+    
+    
+    return IntlMessageFormat;
+    }();
+    exports.IntlMessageFormat=IntlMessageFormat;
+    exports.default=IntlMessageFormat;
+    
+    },{"./compiler":116}],118:[function(require,module,exports){
+    "use strict";
+    
+    
+    
+    
+    
+    function __export(m){
+    for(var p in m)if(!exports.hasOwnProperty(p))exports[p]=m[p];
+    }
+    Object.defineProperty(exports,"__esModule",{value:true});
+    var intl_messageformat_parser_1=require("intl-messageformat-parser");
+    var core_1=require("./core");
+    core_1.default.__parse=intl_messageformat_parser_1.default.parse;
+    __export(require("./core"));
+    exports.default=core_1.default;
+    
+    },{"./core":117,"intl-messageformat-parser":114}],119:[function(require,module,exports){
+    'use strict';
+    var IntlMessageFormat=require('./dist').default;
+    
+    
+    
+    
+    exports=module.exports=IntlMessageFormat;
+    exports['default']=exports;
+    
+    },{"./dist":118}],120:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    module.exports=function(obj){
+    return obj!=null&&(isBuffer(obj)||isSlowBuffer(obj)||!!obj._isBuffer);
+    };
+    
+    function isBuffer(obj){
+    return!!obj.constructor&&typeof obj.constructor.isBuffer==='function'&&obj.constructor.isBuffer(obj);
+    }
+    
+    
+    function isSlowBuffer(obj){
+    return typeof obj.readFloatLE==='function'&&typeof obj.slice==='function'&&isBuffer(obj.slice(0,0));
+    }
+    
+    },{}],121:[function(require,module,exports){
+    var toString={}.toString;
+    
+    module.exports=Array.isArray||function(arr){
+    return toString.call(arr)=='[object Array]';
+    };
+    
+    },{}],122:[function(require,module,exports){
+    var encode=require('./lib/encoder'),
+    decode=require('./lib/decoder');
+    
+    module.exports={
+    encode:encode,
+    decode:decode};
+    
+    
+    },{"./lib/decoder":123,"./lib/encoder":124}],123:[function(require,module,exports){
+    (function(Buffer){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    var JpegImage=function jpegImage(){
+    "use strict";
+    var dctZigZag=new Int32Array([
+    0,
+    1,8,
+    16,9,2,
+    3,10,17,24,
+    32,25,18,11,4,
+    5,12,19,26,33,40,
+    48,41,34,27,20,13,6,
+    7,14,21,28,35,42,49,56,
+    57,50,43,36,29,22,15,
+    23,30,37,44,51,58,
+    59,52,45,38,31,
+    39,46,53,60,
+    61,54,47,
+    55,62,
+    63]);
+    
+    
+    var dctCos1=4017;
+    var dctSin1=799;
+    var dctCos3=3406;
+    var dctSin3=2276;
+    var dctCos6=1567;
+    var dctSin6=3784;
+    var dctSqrt2=5793;
+    var dctSqrt1d2=2896;
+    
+    function constructor(){
+    }
+    
+    function buildHuffmanTable(codeLengths,values){
+    var k=0,code=[],i,j,length=16;
+    while(length>0&&!codeLengths[length-1])
+    length--;
+    code.push({children:[],index:0});
+    var p=code[0],q;
+    for(i=0;i<length;i++){
+    for(j=0;j<codeLengths[i];j++){
+    p=code.pop();
+    p.children[p.index]=values[k];
+    while(p.index>0){
+    p=code.pop();
+    }
+    p.index++;
+    code.push(p);
+    while(code.length<=i){
+    code.push(q={children:[],index:0});
+    p.children[p.index]=q.children;
+    p=q;
+    }
+    k++;
+    }
+    if(i+1<length){
+    
+    code.push(q={children:[],index:0});
+    p.children[p.index]=q.children;
+    p=q;
+    }
+    }
+    return code[0].children;
+    }
+    
+    function decodeScan(data,offset,
+    frame,components,resetInterval,
+    spectralStart,spectralEnd,
+    successivePrev,successive){
+    var precision=frame.precision;
+    var samplesPerLine=frame.samplesPerLine;
+    var scanLines=frame.scanLines;
+    var mcusPerLine=frame.mcusPerLine;
+    var progressive=frame.progressive;
+    var maxH=frame.maxH,maxV=frame.maxV;
+    
+    var startOffset=offset,bitsData=0,bitsCount=0;
+    function readBit(){
+    if(bitsCount>0){
+    bitsCount--;
+    return bitsData>>bitsCount&1;
+    }
+    bitsData=data[offset++];
+    if(bitsData==0xFF){
+    var nextByte=data[offset++];
+    if(nextByte){
+    throw"unexpected marker: "+(bitsData<<8|nextByte).toString(16);
+    }
+    
+    }
+    bitsCount=7;
+    return bitsData>>>7;
+    }
+    function decodeHuffman(tree){
+    var node=tree,bit;
+    while((bit=readBit())!==null){
+    node=node[bit];
+    if(typeof node==='number')
+    return node;
+    if(typeof node!=='object')
+    throw"invalid huffman sequence";
+    }
+    return null;
+    }
+    function receive(length){
+    var n=0;
+    while(length>0){
+    var bit=readBit();
+    if(bit===null)return;
+    n=n<<1|bit;
+    length--;
+    }
+    return n;
+    }
+    function receiveAndExtend(length){
+    var n=receive(length);
+    if(n>=1<<length-1)
+    return n;
+    return n+(-1<<length)+1;
+    }
+    function decodeBaseline(component,zz){
+    var t=decodeHuffman(component.huffmanTableDC);
+    var diff=t===0?0:receiveAndExtend(t);
+    zz[0]=component.pred+=diff;
+    var k=1;
+    while(k<64){
+    var rs=decodeHuffman(component.huffmanTableAC);
+    var s=rs&15,r=rs>>4;
+    if(s===0){
+    if(r<15)
+    break;
+    k+=16;
+    continue;
+    }
+    k+=r;
+    var z=dctZigZag[k];
+    zz[z]=receiveAndExtend(s);
+    k++;
+    }
+    }
+    function decodeDCFirst(component,zz){
+    var t=decodeHuffman(component.huffmanTableDC);
+    var diff=t===0?0:receiveAndExtend(t)<<successive;
+    zz[0]=component.pred+=diff;
+    }
+    function decodeDCSuccessive(component,zz){
+    zz[0]|=readBit()<<successive;
+    }
+    var eobrun=0;
+    function decodeACFirst(component,zz){
+    if(eobrun>0){
+    eobrun--;
+    return;
+    }
+    var k=spectralStart,e=spectralEnd;
+    while(k<=e){
+    var rs=decodeHuffman(component.huffmanTableAC);
+    var s=rs&15,r=rs>>4;
+    if(s===0){
+    if(r<15){
+    eobrun=receive(r)+(1<<r)-1;
+    break;
+    }
+    k+=16;
+    continue;
+    }
+    k+=r;
+    var z=dctZigZag[k];
+    zz[z]=receiveAndExtend(s)*(1<<successive);
+    k++;
+    }
+    }
+    var successiveACState=0,successiveACNextValue;
+    function decodeACSuccessive(component,zz){
+    var k=spectralStart,e=spectralEnd,r=0;
+    while(k<=e){
+    var z=dctZigZag[k];
+    switch(successiveACState){
+    case 0:
+    var rs=decodeHuffman(component.huffmanTableAC);
+    var s=rs&15,r=rs>>4;
+    if(s===0){
+    if(r<15){
+    eobrun=receive(r)+(1<<r);
+    successiveACState=4;
+    }else{
+    r=16;
+    successiveACState=1;
+    }
+    }else{
+    if(s!==1)
+    throw"invalid ACn encoding";
+    successiveACNextValue=receiveAndExtend(s);
+    successiveACState=r?2:3;
+    }
+    continue;
+    case 1:
+    case 2:
+    if(zz[z])
+    zz[z]+=readBit()<<successive;else
+    {
+    r--;
+    if(r===0)
+    successiveACState=successiveACState==2?3:0;
+    }
+    break;
+    case 3:
+    if(zz[z])
+    zz[z]+=readBit()<<successive;else
+    {
+    zz[z]=successiveACNextValue<<successive;
+    successiveACState=0;
+    }
+    break;
+    case 4:
+    if(zz[z])
+    zz[z]+=readBit()<<successive;
+    break;}
+    
+    k++;
+    }
+    if(successiveACState===4){
+    eobrun--;
+    if(eobrun===0)
+    successiveACState=0;
+    }
+    }
+    function decodeMcu(component,decode,mcu,row,col){
+    var mcuRow=mcu/mcusPerLine|0;
+    var mcuCol=mcu%mcusPerLine;
+    var blockRow=mcuRow*component.v+row;
+    var blockCol=mcuCol*component.h+col;
+    decode(component,component.blocks[blockRow][blockCol]);
+    }
+    function decodeBlock(component,decode,mcu){
+    var blockRow=mcu/component.blocksPerLine|0;
+    var blockCol=mcu%component.blocksPerLine;
+    decode(component,component.blocks[blockRow][blockCol]);
+    }
+    
+    var componentsLength=components.length;
+    var component,i,j,k,n;
+    var decodeFn;
+    if(progressive){
+    if(spectralStart===0)
+    decodeFn=successivePrev===0?decodeDCFirst:decodeDCSuccessive;else
+    
+    decodeFn=successivePrev===0?decodeACFirst:decodeACSuccessive;
+    }else{
+    decodeFn=decodeBaseline;
+    }
+    
+    var mcu=0,marker;
+    var mcuExpected;
+    if(componentsLength==1){
+    mcuExpected=components[0].blocksPerLine*components[0].blocksPerColumn;
+    }else{
+    mcuExpected=mcusPerLine*frame.mcusPerColumn;
+    }
+    if(!resetInterval)resetInterval=mcuExpected;
+    
+    var h,v;
+    while(mcu<mcuExpected){
+    
+    for(i=0;i<componentsLength;i++)
+    components[i].pred=0;
+    eobrun=0;
+    
+    if(componentsLength==1){
+    component=components[0];
+    for(n=0;n<resetInterval;n++){
+    decodeBlock(component,decodeFn,mcu);
+    mcu++;
+    }
+    }else{
+    for(n=0;n<resetInterval;n++){
+    for(i=0;i<componentsLength;i++){
+    component=components[i];
+    h=component.h;
+    v=component.v;
+    for(j=0;j<v;j++){
+    for(k=0;k<h;k++){
+    decodeMcu(component,decodeFn,mcu,j,k);
+    }
+    }
+    }
+    mcu++;
+    
+    
+    if(mcu===mcuExpected)break;
+    }
+    }
+    
+    
+    bitsCount=0;
+    marker=data[offset]<<8|data[offset+1];
+    if(marker<0xFF00){
+    throw"marker was not found";
+    }
+    
+    if(marker>=0xFFD0&&marker<=0xFFD7){
+    offset+=2;
+    }else
+    
+    break;
+    }
+    
+    return offset-startOffset;
+    }
+    
+    function buildComponentData(frame,component){
+    var lines=[];
+    var blocksPerLine=component.blocksPerLine;
+    var blocksPerColumn=component.blocksPerColumn;
+    var samplesPerLine=blocksPerLine<<3;
+    var R=new Int32Array(64),r=new Uint8Array(64);
+    
+    
+    
+    
+    
+    
+    function quantizeAndInverse(zz,dataOut,dataIn){
+    var qt=component.quantizationTable;
+    var v0,v1,v2,v3,v4,v5,v6,v7,t;
+    var p=dataIn;
+    var i;
+    
+    
+    for(i=0;i<64;i++)
+    p[i]=zz[i]*qt[i];
+    
+    
+    for(i=0;i<8;++i){
+    var row=8*i;
+    
+    
+    if(p[1+row]==0&&p[2+row]==0&&p[3+row]==0&&
+    p[4+row]==0&&p[5+row]==0&&p[6+row]==0&&
+    p[7+row]==0){
+    t=dctSqrt2*p[0+row]+512>>10;
+    p[0+row]=t;
+    p[1+row]=t;
+    p[2+row]=t;
+    p[3+row]=t;
+    p[4+row]=t;
+    p[5+row]=t;
+    p[6+row]=t;
+    p[7+row]=t;
+    continue;
+    }
+    
+    
+    v0=dctSqrt2*p[0+row]+128>>8;
+    v1=dctSqrt2*p[4+row]+128>>8;
+    v2=p[2+row];
+    v3=p[6+row];
+    v4=dctSqrt1d2*(p[1+row]-p[7+row])+128>>8;
+    v7=dctSqrt1d2*(p[1+row]+p[7+row])+128>>8;
+    v5=p[3+row]<<4;
+    v6=p[5+row]<<4;
+    
+    
+    t=v0-v1+1>>1;
+    v0=v0+v1+1>>1;
+    v1=t;
+    t=v2*dctSin6+v3*dctCos6+128>>8;
+    v2=v2*dctCos6-v3*dctSin6+128>>8;
+    v3=t;
+    t=v4-v6+1>>1;
+    v4=v4+v6+1>>1;
+    v6=t;
+    t=v7+v5+1>>1;
+    v5=v7-v5+1>>1;
+    v7=t;
+    
+    
+    t=v0-v3+1>>1;
+    v0=v0+v3+1>>1;
+    v3=t;
+    t=v1-v2+1>>1;
+    v1=v1+v2+1>>1;
+    v2=t;
+    t=v4*dctSin3+v7*dctCos3+2048>>12;
+    v4=v4*dctCos3-v7*dctSin3+2048>>12;
+    v7=t;
+    t=v5*dctSin1+v6*dctCos1+2048>>12;
+    v5=v5*dctCos1-v6*dctSin1+2048>>12;
+    v6=t;
+    
+    
+    p[0+row]=v0+v7;
+    p[7+row]=v0-v7;
+    p[1+row]=v1+v6;
+    p[6+row]=v1-v6;
+    p[2+row]=v2+v5;
+    p[5+row]=v2-v5;
+    p[3+row]=v3+v4;
+    p[4+row]=v3-v4;
+    }
+    
+    
+    for(i=0;i<8;++i){
+    var col=i;
+    
+    
+    if(p[1*8+col]==0&&p[2*8+col]==0&&p[3*8+col]==0&&
+    p[4*8+col]==0&&p[5*8+col]==0&&p[6*8+col]==0&&
+    p[7*8+col]==0){
+    t=dctSqrt2*dataIn[i+0]+8192>>14;
+    p[0*8+col]=t;
+    p[1*8+col]=t;
+    p[2*8+col]=t;
+    p[3*8+col]=t;
+    p[4*8+col]=t;
+    p[5*8+col]=t;
+    p[6*8+col]=t;
+    p[7*8+col]=t;
+    continue;
+    }
+    
+    
+    v0=dctSqrt2*p[0*8+col]+2048>>12;
+    v1=dctSqrt2*p[4*8+col]+2048>>12;
+    v2=p[2*8+col];
+    v3=p[6*8+col];
+    v4=dctSqrt1d2*(p[1*8+col]-p[7*8+col])+2048>>12;
+    v7=dctSqrt1d2*(p[1*8+col]+p[7*8+col])+2048>>12;
+    v5=p[3*8+col];
+    v6=p[5*8+col];
+    
+    
+    t=v0-v1+1>>1;
+    v0=v0+v1+1>>1;
+    v1=t;
+    t=v2*dctSin6+v3*dctCos6+2048>>12;
+    v2=v2*dctCos6-v3*dctSin6+2048>>12;
+    v3=t;
+    t=v4-v6+1>>1;
+    v4=v4+v6+1>>1;
+    v6=t;
+    t=v7+v5+1>>1;
+    v5=v7-v5+1>>1;
+    v7=t;
+    
+    
+    t=v0-v3+1>>1;
+    v0=v0+v3+1>>1;
+    v3=t;
+    t=v1-v2+1>>1;
+    v1=v1+v2+1>>1;
+    v2=t;
+    t=v4*dctSin3+v7*dctCos3+2048>>12;
+    v4=v4*dctCos3-v7*dctSin3+2048>>12;
+    v7=t;
+    t=v5*dctSin1+v6*dctCos1+2048>>12;
+    v5=v5*dctCos1-v6*dctSin1+2048>>12;
+    v6=t;
+    
+    
+    p[0*8+col]=v0+v7;
+    p[7*8+col]=v0-v7;
+    p[1*8+col]=v1+v6;
+    p[6*8+col]=v1-v6;
+    p[2*8+col]=v2+v5;
+    p[5*8+col]=v2-v5;
+    p[3*8+col]=v3+v4;
+    p[4*8+col]=v3-v4;
+    }
+    
+    
+    for(i=0;i<64;++i){
+    var sample=128+(p[i]+8>>4);
+    dataOut[i]=sample<0?0:sample>0xFF?0xFF:sample;
+    }
+    }
+    
+    var i,j;
+    for(var blockRow=0;blockRow<blocksPerColumn;blockRow++){
+    var scanLine=blockRow<<3;
+    for(i=0;i<8;i++)
+    lines.push(new Uint8Array(samplesPerLine));
+    for(var blockCol=0;blockCol<blocksPerLine;blockCol++){
+    quantizeAndInverse(component.blocks[blockRow][blockCol],r,R);
+    
+    var offset=0,sample=blockCol<<3;
+    for(j=0;j<8;j++){
+    var line=lines[scanLine+j];
+    for(i=0;i<8;i++)
+    line[sample+i]=r[offset++];
+    }
+    }
+    }
+    return lines;
+    }
+    
+    function clampTo8bit(a){
+    return a<0?0:a>255?255:a;
+    }
+    
+    constructor.prototype={
+    load:function load(path){
+    var xhr=new XMLHttpRequest();
+    xhr.open("GET",path,true);
+    xhr.responseType="arraybuffer";
+    xhr.onload=function(){
+    
+    var data=new Uint8Array(xhr.response||xhr.mozResponseArrayBuffer);
+    this.parse(data);
+    if(this.onload)
+    this.onload();
+    }.bind(this);
+    xhr.send(null);
+    },
+    parse:function parse(data){
+    var offset=0,length=data.length;
+    function readUint16(){
+    var value=data[offset]<<8|data[offset+1];
+    offset+=2;
+    return value;
+    }
+    function readDataBlock(){
+    var length=readUint16();
+    var array=data.subarray(offset,offset+length-2);
+    offset+=array.length;
+    return array;
+    }
+    function prepareComponents(frame){
+    var maxH=0,maxV=0;
+    var component,componentId;
+    for(componentId in frame.components){
+    if(frame.components.hasOwnProperty(componentId)){
+    component=frame.components[componentId];
+    if(maxH<component.h)maxH=component.h;
+    if(maxV<component.v)maxV=component.v;
+    }
+    }
+    var mcusPerLine=Math.ceil(frame.samplesPerLine/8/maxH);
+    var mcusPerColumn=Math.ceil(frame.scanLines/8/maxV);
+    for(componentId in frame.components){
+    if(frame.components.hasOwnProperty(componentId)){
+    component=frame.components[componentId];
+    var blocksPerLine=Math.ceil(Math.ceil(frame.samplesPerLine/8)*component.h/maxH);
+    var blocksPerColumn=Math.ceil(Math.ceil(frame.scanLines/8)*component.v/maxV);
+    var blocksPerLineForMcu=mcusPerLine*component.h;
+    var blocksPerColumnForMcu=mcusPerColumn*component.v;
+    var blocks=[];
+    for(var i=0;i<blocksPerColumnForMcu;i++){
+    var row=[];
+    for(var j=0;j<blocksPerLineForMcu;j++)
+    row.push(new Int32Array(64));
+    blocks.push(row);
+    }
+    component.blocksPerLine=blocksPerLine;
+    component.blocksPerColumn=blocksPerColumn;
+    component.blocks=blocks;
+    }
+    }
+    frame.maxH=maxH;
+    frame.maxV=maxV;
+    frame.mcusPerLine=mcusPerLine;
+    frame.mcusPerColumn=mcusPerColumn;
+    }
+    var jfif=null;
+    var adobe=null;
+    var pixels=null;
+    var frame,resetInterval;
+    var quantizationTables=[],frames=[];
+    var huffmanTablesAC=[],huffmanTablesDC=[];
+    var fileMarker=readUint16();
+    if(fileMarker!=0xFFD8){
+    throw"SOI not found";
+    }
+    
+    fileMarker=readUint16();
+    while(fileMarker!=0xFFD9){
+    var i,j,l;
+    switch(fileMarker){
+    case 0xFF00:break;
+    case 0xFFE0:
+    case 0xFFE1:
+    case 0xFFE2:
+    case 0xFFE3:
+    case 0xFFE4:
+    case 0xFFE5:
+    case 0xFFE6:
+    case 0xFFE7:
+    case 0xFFE8:
+    case 0xFFE9:
+    case 0xFFEA:
+    case 0xFFEB:
+    case 0xFFEC:
+    case 0xFFED:
+    case 0xFFEE:
+    case 0xFFEF:
+    case 0xFFFE:
+    var appData=readDataBlock();
+    
+    if(fileMarker===0xFFE0){
+    if(appData[0]===0x4A&&appData[1]===0x46&&appData[2]===0x49&&
+    appData[3]===0x46&&appData[4]===0){
+    jfif={
+    version:{major:appData[5],minor:appData[6]},
+    densityUnits:appData[7],
+    xDensity:appData[8]<<8|appData[9],
+    yDensity:appData[10]<<8|appData[11],
+    thumbWidth:appData[12],
+    thumbHeight:appData[13],
+    thumbData:appData.subarray(14,14+3*appData[12]*appData[13])};
+    
+    }
+    }
+    
+    if(fileMarker===0xFFEE){
+    if(appData[0]===0x41&&appData[1]===0x64&&appData[2]===0x6F&&
+    appData[3]===0x62&&appData[4]===0x65&&appData[5]===0){
+    adobe={
+    version:appData[6],
+    flags0:appData[7]<<8|appData[8],
+    flags1:appData[9]<<8|appData[10],
+    transformCode:appData[11]};
+    
+    }
+    }
+    break;
+    
+    case 0xFFDB:
+    var quantizationTablesLength=readUint16();
+    var quantizationTablesEnd=quantizationTablesLength+offset-2;
+    while(offset<quantizationTablesEnd){
+    var quantizationTableSpec=data[offset++];
+    var tableData=new Int32Array(64);
+    if(quantizationTableSpec>>4===0){
+    for(j=0;j<64;j++){
+    var z=dctZigZag[j];
+    tableData[z]=data[offset++];
+    }
+    }else if(quantizationTableSpec>>4===1){
+    for(j=0;j<64;j++){
+    var z=dctZigZag[j];
+    tableData[z]=readUint16();
+    }
+    }else
+    throw"DQT: invalid table spec";
+    quantizationTables[quantizationTableSpec&15]=tableData;
+    }
+    break;
+    
+    case 0xFFC0:
+    case 0xFFC1:
+    case 0xFFC2:
+    readUint16();
+    frame={};
+    frame.extended=fileMarker===0xFFC1;
+    frame.progressive=fileMarker===0xFFC2;
+    frame.precision=data[offset++];
+    frame.scanLines=readUint16();
+    frame.samplesPerLine=readUint16();
+    frame.components={};
+    frame.componentsOrder=[];
+    var componentsCount=data[offset++],componentId;
+    var maxH=0,maxV=0;
+    for(i=0;i<componentsCount;i++){
+    componentId=data[offset];
+    var h=data[offset+1]>>4;
+    var v=data[offset+1]&15;
+    var qId=data[offset+2];
+    frame.componentsOrder.push(componentId);
+    frame.components[componentId]={
+    h:h,
+    v:v,
+    quantizationIdx:qId};
+    
+    offset+=3;
+    }
+    prepareComponents(frame);
+    frames.push(frame);
+    break;
+    
+    case 0xFFC4:
+    var huffmanLength=readUint16();
+    for(i=2;i<huffmanLength;){
+    var huffmanTableSpec=data[offset++];
+    var codeLengths=new Uint8Array(16);
+    var codeLengthSum=0;
+    for(j=0;j<16;j++,offset++)
+    codeLengthSum+=codeLengths[j]=data[offset];
+    var huffmanValues=new Uint8Array(codeLengthSum);
+    for(j=0;j<codeLengthSum;j++,offset++)
+    huffmanValues[j]=data[offset];
+    i+=17+codeLengthSum;
+    
+    (huffmanTableSpec>>4===0?
+    huffmanTablesDC:huffmanTablesAC)[huffmanTableSpec&15]=
+    buildHuffmanTable(codeLengths,huffmanValues);
+    }
+    break;
+    
+    case 0xFFDD:
+    readUint16();
+    resetInterval=readUint16();
+    break;
+    
+    case 0xFFDA:
+    var scanLength=readUint16();
+    var selectorsCount=data[offset++];
+    var components=[],component;
+    for(i=0;i<selectorsCount;i++){
+    component=frame.components[data[offset++]];
+    var tableSpec=data[offset++];
+    component.huffmanTableDC=huffmanTablesDC[tableSpec>>4];
+    component.huffmanTableAC=huffmanTablesAC[tableSpec&15];
+    components.push(component);
+    }
+    var spectralStart=data[offset++];
+    var spectralEnd=data[offset++];
+    var successiveApproximation=data[offset++];
+    var processed=decodeScan(data,offset,
+    frame,components,resetInterval,
+    spectralStart,spectralEnd,
+    successiveApproximation>>4,successiveApproximation&15);
+    offset+=processed;
+    break;
+    default:
+    if(data[offset-3]==0xFF&&
+    data[offset-2]>=0xC0&&data[offset-2]<=0xFE){
+    
+    
+    offset-=3;
+    break;
+    }
+    throw"unknown JPEG marker "+fileMarker.toString(16);}
+    
+    fileMarker=readUint16();
+    }
+    if(frames.length!=1)
+    throw"only single frame JPEGs supported";
+    
+    
+    for(var i=0;i<frames.length;i++){
+    var cp=frames[i].components;
+    for(var j in cp){
+    cp[j].quantizationTable=quantizationTables[cp[j].quantizationIdx];
+    delete cp[j].quantizationIdx;
+    }
+    }
+    
+    this.width=frame.samplesPerLine;
+    this.height=frame.scanLines;
+    this.jfif=jfif;
+    this.adobe=adobe;
+    this.components=[];
+    for(var i=0;i<frame.componentsOrder.length;i++){
+    var component=frame.components[frame.componentsOrder[i]];
+    this.components.push({
+    lines:buildComponentData(frame,component),
+    scaleX:component.h/frame.maxH,
+    scaleY:component.v/frame.maxV});
+    
+    }
+    },
+    getData:function getData(width,height){
+    var scaleX=this.width/width,scaleY=this.height/height;
+    
+    var component1,component2,component3,component4;
+    var component1Line,component2Line,component3Line,component4Line;
+    var x,y;
+    var offset=0;
+    var Y,Cb,Cr,K,C,M,Ye,R,G,B;
+    var colorTransform;
+    var dataLength=width*height*this.components.length;
+    var data=new Uint8Array(dataLength);
+    switch(this.components.length){
+    case 1:
+    component1=this.components[0];
+    for(y=0;y<height;y++){
+    component1Line=component1.lines[0|y*component1.scaleY*scaleY];
+    for(x=0;x<width;x++){
+    Y=component1Line[0|x*component1.scaleX*scaleX];
+    
+    data[offset++]=Y;
+    }
+    }
+    break;
+    case 2:
+    
+    component1=this.components[0];
+    component2=this.components[1];
+    for(y=0;y<height;y++){
+    component1Line=component1.lines[0|y*component1.scaleY*scaleY];
+    component2Line=component2.lines[0|y*component2.scaleY*scaleY];
+    for(x=0;x<width;x++){
+    Y=component1Line[0|x*component1.scaleX*scaleX];
+    data[offset++]=Y;
+    Y=component2Line[0|x*component2.scaleX*scaleX];
+    data[offset++]=Y;
+    }
+    }
+    break;
+    case 3:
+    
+    colorTransform=true;
+    
+    if(this.adobe&&this.adobe.transformCode)
+    colorTransform=true;else
+    if(typeof this.colorTransform!=='undefined')
+    colorTransform=!!this.colorTransform;
+    
+    component1=this.components[0];
+    component2=this.components[1];
+    component3=this.components[2];
+    for(y=0;y<height;y++){
+    component1Line=component1.lines[0|y*component1.scaleY*scaleY];
+    component2Line=component2.lines[0|y*component2.scaleY*scaleY];
+    component3Line=component3.lines[0|y*component3.scaleY*scaleY];
+    for(x=0;x<width;x++){
+    if(!colorTransform){
+    R=component1Line[0|x*component1.scaleX*scaleX];
+    G=component2Line[0|x*component2.scaleX*scaleX];
+    B=component3Line[0|x*component3.scaleX*scaleX];
+    }else{
+    Y=component1Line[0|x*component1.scaleX*scaleX];
+    Cb=component2Line[0|x*component2.scaleX*scaleX];
+    Cr=component3Line[0|x*component3.scaleX*scaleX];
+    
+    R=clampTo8bit(Y+1.402*(Cr-128));
+    G=clampTo8bit(Y-0.3441363*(Cb-128)-0.71413636*(Cr-128));
+    B=clampTo8bit(Y+1.772*(Cb-128));
+    }
+    
+    data[offset++]=R;
+    data[offset++]=G;
+    data[offset++]=B;
+    }
+    }
+    break;
+    case 4:
+    if(!this.adobe)
+    throw'Unsupported color mode (4 components)';
+    
+    colorTransform=false;
+    
+    if(this.adobe&&this.adobe.transformCode)
+    colorTransform=true;else
+    if(typeof this.colorTransform!=='undefined')
+    colorTransform=!!this.colorTransform;
+    
+    component1=this.components[0];
+    component2=this.components[1];
+    component3=this.components[2];
+    component4=this.components[3];
+    for(y=0;y<height;y++){
+    component1Line=component1.lines[0|y*component1.scaleY*scaleY];
+    component2Line=component2.lines[0|y*component2.scaleY*scaleY];
+    component3Line=component3.lines[0|y*component3.scaleY*scaleY];
+    component4Line=component4.lines[0|y*component4.scaleY*scaleY];
+    for(x=0;x<width;x++){
+    if(!colorTransform){
+    C=component1Line[0|x*component1.scaleX*scaleX];
+    M=component2Line[0|x*component2.scaleX*scaleX];
+    Ye=component3Line[0|x*component3.scaleX*scaleX];
+    K=component4Line[0|x*component4.scaleX*scaleX];
+    }else{
+    Y=component1Line[0|x*component1.scaleX*scaleX];
+    Cb=component2Line[0|x*component2.scaleX*scaleX];
+    Cr=component3Line[0|x*component3.scaleX*scaleX];
+    K=component4Line[0|x*component4.scaleX*scaleX];
+    
+    C=255-clampTo8bit(Y+1.402*(Cr-128));
+    M=255-clampTo8bit(Y-0.3441363*(Cb-128)-0.71413636*(Cr-128));
+    Ye=255-clampTo8bit(Y+1.772*(Cb-128));
+    }
+    data[offset++]=255-C;
+    data[offset++]=255-M;
+    data[offset++]=255-Ye;
+    data[offset++]=255-K;
+    }
+    }
+    break;
+    default:
+    throw'Unsupported color mode';}
+    
+    return data;
+    },
+    copyToImageData:function copyToImageData(imageData){
+    var width=imageData.width,height=imageData.height;
+    var imageDataArray=imageData.data;
+    var data=this.getData(width,height);
+    var i=0,j=0,x,y;
+    var Y,K,C,M,R,G,B;
+    switch(this.components.length){
+    case 1:
+    for(y=0;y<height;y++){
+    for(x=0;x<width;x++){
+    Y=data[i++];
+    
+    imageDataArray[j++]=Y;
+    imageDataArray[j++]=Y;
+    imageDataArray[j++]=Y;
+    imageDataArray[j++]=255;
+    }
+    }
+    break;
+    case 3:
+    for(y=0;y<height;y++){
+    for(x=0;x<width;x++){
+    R=data[i++];
+    G=data[i++];
+    B=data[i++];
+    
+    imageDataArray[j++]=R;
+    imageDataArray[j++]=G;
+    imageDataArray[j++]=B;
+    imageDataArray[j++]=255;
+    }
+    }
+    break;
+    case 4:
+    for(y=0;y<height;y++){
+    for(x=0;x<width;x++){
+    C=data[i++];
+    M=data[i++];
+    Y=data[i++];
+    K=data[i++];
+    
+    R=255-clampTo8bit(C*(1-K/255)+K);
+    G=255-clampTo8bit(M*(1-K/255)+K);
+    B=255-clampTo8bit(Y*(1-K/255)+K);
+    
+    imageDataArray[j++]=R;
+    imageDataArray[j++]=G;
+    imageDataArray[j++]=B;
+    imageDataArray[j++]=255;
+    }
+    }
+    break;
+    default:
+    throw'Unsupported color mode';}
+    
+    }};
+    
+    
+    return constructor;
+    }();
+    module.exports=decode;
+    
+    function decode(jpegData){
+    var arr=new Uint8Array(jpegData);
+    var decoder=new JpegImage();
+    decoder.parse(arr);
+    
+    var image={
+    width:decoder.width,
+    height:decoder.height,
+    data:new Buffer(decoder.width*decoder.height*4)};
+    
+    
+    decoder.copyToImageData(image);
+    
+    return image;
+    }
+    
+    }).call(this,require("buffer").Buffer);
+    },{"buffer":102}],124:[function(require,module,exports){
+    (function(Buffer){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    var btoa=btoa||function(buf){
+    return new Buffer(buf).toString('base64');
+    };
+    
+    function JPEGEncoder(quality){
+    var self=this;
+    var fround=Math.round;
+    var ffloor=Math.floor;
+    var YTable=new Array(64);
+    var UVTable=new Array(64);
+    var fdtbl_Y=new Array(64);
+    var fdtbl_UV=new Array(64);
+    var YDC_HT;
+    var UVDC_HT;
+    var YAC_HT;
+    var UVAC_HT;
+    
+    var bitcode=new Array(65535);
+    var category=new Array(65535);
+    var outputfDCTQuant=new Array(64);
+    var DU=new Array(64);
+    var byteout=[];
+    var bytenew=0;
+    var bytepos=7;
+    
+    var YDU=new Array(64);
+    var UDU=new Array(64);
+    var VDU=new Array(64);
+    var clt=new Array(256);
+    var RGB_YUV_TABLE=new Array(2048);
+    var currentQuality;
+    
+    var ZigZag=[
+    0,1,5,6,14,15,27,28,
+    2,4,7,13,16,26,29,42,
+    3,8,12,17,25,30,41,43,
+    9,11,18,24,31,40,44,53,
+    10,19,23,32,39,45,52,54,
+    20,22,33,38,46,51,55,60,
+    21,34,37,47,50,56,59,61,
+    35,36,48,49,57,58,62,63];
+    
+    
+    var std_dc_luminance_nrcodes=[0,0,1,5,1,1,1,1,1,1,0,0,0,0,0,0,0];
+    var std_dc_luminance_values=[0,1,2,3,4,5,6,7,8,9,10,11];
+    var std_ac_luminance_nrcodes=[0,0,2,1,3,3,2,4,3,5,5,4,4,0,0,1,0x7d];
+    var std_ac_luminance_values=[
+    0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,
+    0x21,0x31,0x41,0x06,0x13,0x51,0x61,0x07,
+    0x22,0x71,0x14,0x32,0x81,0x91,0xa1,0x08,
+    0x23,0x42,0xb1,0xc1,0x15,0x52,0xd1,0xf0,
+    0x24,0x33,0x62,0x72,0x82,0x09,0x0a,0x16,
+    0x17,0x18,0x19,0x1a,0x25,0x26,0x27,0x28,
+    0x29,0x2a,0x34,0x35,0x36,0x37,0x38,0x39,
+    0x3a,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
+    0x4a,0x53,0x54,0x55,0x56,0x57,0x58,0x59,
+    0x5a,0x63,0x64,0x65,0x66,0x67,0x68,0x69,
+    0x6a,0x73,0x74,0x75,0x76,0x77,0x78,0x79,
+    0x7a,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
+    0x8a,0x92,0x93,0x94,0x95,0x96,0x97,0x98,
+    0x99,0x9a,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,
+    0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,0xb5,0xb6,
+    0xb7,0xb8,0xb9,0xba,0xc2,0xc3,0xc4,0xc5,
+    0xc6,0xc7,0xc8,0xc9,0xca,0xd2,0xd3,0xd4,
+    0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xe1,0xe2,
+    0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,
+    0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
+    0xf9,0xfa];
+    
+    
+    var std_dc_chrominance_nrcodes=[0,0,3,1,1,1,1,1,1,1,1,1,0,0,0,0,0];
+    var std_dc_chrominance_values=[0,1,2,3,4,5,6,7,8,9,10,11];
+    var std_ac_chrominance_nrcodes=[0,0,2,1,2,4,4,3,4,7,5,4,4,0,1,2,0x77];
+    var std_ac_chrominance_values=[
+    0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,
+    0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,
+    0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,
+    0xa1,0xb1,0xc1,0x09,0x23,0x33,0x52,0xf0,
+    0x15,0x62,0x72,0xd1,0x0a,0x16,0x24,0x34,
+    0xe1,0x25,0xf1,0x17,0x18,0x19,0x1a,0x26,
+    0x27,0x28,0x29,0x2a,0x35,0x36,0x37,0x38,
+    0x39,0x3a,0x43,0x44,0x45,0x46,0x47,0x48,
+    0x49,0x4a,0x53,0x54,0x55,0x56,0x57,0x58,
+    0x59,0x5a,0x63,0x64,0x65,0x66,0x67,0x68,
+    0x69,0x6a,0x73,0x74,0x75,0x76,0x77,0x78,
+    0x79,0x7a,0x82,0x83,0x84,0x85,0x86,0x87,
+    0x88,0x89,0x8a,0x92,0x93,0x94,0x95,0x96,
+    0x97,0x98,0x99,0x9a,0xa2,0xa3,0xa4,0xa5,
+    0xa6,0xa7,0xa8,0xa9,0xaa,0xb2,0xb3,0xb4,
+    0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xc2,0xc3,
+    0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xd2,
+    0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,
+    0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,
+    0xea,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,
+    0xf9,0xfa];
+    
+    
+    function initQuantTables(sf){
+    var YQT=[
+    16,11,10,16,24,40,51,61,
+    12,12,14,19,26,58,60,55,
+    14,13,16,24,40,57,69,56,
+    14,17,22,29,51,87,80,62,
+    18,22,37,56,68,109,103,77,
+    24,35,55,64,81,104,113,92,
+    49,64,78,87,103,121,120,101,
+    72,92,95,98,112,100,103,99];
+    
+    
+    for(var i=0;i<64;i++){
+    var t=ffloor((YQT[i]*sf+50)/100);
+    if(t<1){
+    t=1;
+    }else if(t>255){
+    t=255;
+    }
+    YTable[ZigZag[i]]=t;
+    }
+    var UVQT=[
+    17,18,24,47,99,99,99,99,
+    18,21,26,66,99,99,99,99,
+    24,26,56,99,99,99,99,99,
+    47,66,99,99,99,99,99,99,
+    99,99,99,99,99,99,99,99,
+    99,99,99,99,99,99,99,99,
+    99,99,99,99,99,99,99,99,
+    99,99,99,99,99,99,99,99];
+    
+    for(var j=0;j<64;j++){
+    var u=ffloor((UVQT[j]*sf+50)/100);
+    if(u<1){
+    u=1;
+    }else if(u>255){
+    u=255;
+    }
+    UVTable[ZigZag[j]]=u;
+    }
+    var aasf=[
+    1.0,1.387039845,1.306562965,1.175875602,
+    1.0,0.785694958,0.541196100,0.275899379];
+    
+    var k=0;
+    for(var row=0;row<8;row++)
+    {
+    for(var col=0;col<8;col++)
+    {
+    fdtbl_Y[k]=1.0/(YTable[ZigZag[k]]*aasf[row]*aasf[col]*8.0);
+    fdtbl_UV[k]=1.0/(UVTable[ZigZag[k]]*aasf[row]*aasf[col]*8.0);
+    k++;
+    }
+    }
+    }
+    
+    function computeHuffmanTbl(nrcodes,std_table){
+    var codevalue=0;
+    var pos_in_table=0;
+    var HT=new Array();
+    for(var k=1;k<=16;k++){
+    for(var j=1;j<=nrcodes[k];j++){
+    HT[std_table[pos_in_table]]=[];
+    HT[std_table[pos_in_table]][0]=codevalue;
+    HT[std_table[pos_in_table]][1]=k;
+    pos_in_table++;
+    codevalue++;
+    }
+    codevalue*=2;
+    }
+    return HT;
+    }
+    
+    function initHuffmanTbl()
+    {
+    YDC_HT=computeHuffmanTbl(std_dc_luminance_nrcodes,std_dc_luminance_values);
+    UVDC_HT=computeHuffmanTbl(std_dc_chrominance_nrcodes,std_dc_chrominance_values);
+    YAC_HT=computeHuffmanTbl(std_ac_luminance_nrcodes,std_ac_luminance_values);
+    UVAC_HT=computeHuffmanTbl(std_ac_chrominance_nrcodes,std_ac_chrominance_values);
+    }
+    
+    function initCategoryNumber()
+    {
+    var nrlower=1;
+    var nrupper=2;
+    for(var cat=1;cat<=15;cat++){
+    
+    for(var nr=nrlower;nr<nrupper;nr++){
+    category[32767+nr]=cat;
+    bitcode[32767+nr]=[];
+    bitcode[32767+nr][1]=cat;
+    bitcode[32767+nr][0]=nr;
+    }
+    
+    for(var nrneg=-(nrupper-1);nrneg<=-nrlower;nrneg++){
+    category[32767+nrneg]=cat;
+    bitcode[32767+nrneg]=[];
+    bitcode[32767+nrneg][1]=cat;
+    bitcode[32767+nrneg][0]=nrupper-1+nrneg;
+    }
+    nrlower<<=1;
+    nrupper<<=1;
+    }
+    }
+    
+    function initRGBYUVTable(){
+    for(var i=0;i<256;i++){
+    RGB_YUV_TABLE[i]=19595*i;
+    RGB_YUV_TABLE[i+256>>0]=38470*i;
+    RGB_YUV_TABLE[i+512>>0]=7471*i+0x8000;
+    RGB_YUV_TABLE[i+768>>0]=-11059*i;
+    RGB_YUV_TABLE[i+1024>>0]=-21709*i;
+    RGB_YUV_TABLE[i+1280>>0]=32768*i+0x807FFF;
+    RGB_YUV_TABLE[i+1536>>0]=-27439*i;
+    RGB_YUV_TABLE[i+1792>>0]=-5329*i;
+    }
+    }
+    
+    
+    function writeBits(bs)
+    {
+    var value=bs[0];
+    var posval=bs[1]-1;
+    while(posval>=0){
+    if(value&1<<posval){
+    bytenew|=1<<bytepos;
+    }
+    posval--;
+    bytepos--;
+    if(bytepos<0){
+    if(bytenew==0xFF){
+    writeByte(0xFF);
+    writeByte(0);
+    }else
+    {
+    writeByte(bytenew);
+    }
+    bytepos=7;
+    bytenew=0;
+    }
+    }
+    }
+    
+    function writeByte(value)
+    {
+    
+    byteout.push(value);
+    }
+    
+    function writeWord(value)
+    {
+    writeByte(value>>8&0xFF);
+    writeByte(value&0xFF);
+    }
+    
+    
+    function fDCTQuant(data,fdtbl)
+    {
+    var d0,d1,d2,d3,d4,d5,d6,d7;
+    
+    var dataOff=0;
+    var i;
+    const I8=8;
+    const I64=64;
+    for(i=0;i<I8;++i)
+    {
+    d0=data[dataOff];
+    d1=data[dataOff+1];
+    d2=data[dataOff+2];
+    d3=data[dataOff+3];
+    d4=data[dataOff+4];
+    d5=data[dataOff+5];
+    d6=data[dataOff+6];
+    d7=data[dataOff+7];
+    
+    var tmp0=d0+d7;
+    var tmp7=d0-d7;
+    var tmp1=d1+d6;
+    var tmp6=d1-d6;
+    var tmp2=d2+d5;
+    var tmp5=d2-d5;
+    var tmp3=d3+d4;
+    var tmp4=d3-d4;
+    
+    
+    var tmp10=tmp0+tmp3;
+    var tmp13=tmp0-tmp3;
+    var tmp11=tmp1+tmp2;
+    var tmp12=tmp1-tmp2;
+    
+    data[dataOff]=tmp10+tmp11;
+    data[dataOff+4]=tmp10-tmp11;
+    
+    var z1=(tmp12+tmp13)*0.707106781;
+    data[dataOff+2]=tmp13+z1;
+    data[dataOff+6]=tmp13-z1;
+    
+    
+    tmp10=tmp4+tmp5;
+    tmp11=tmp5+tmp6;
+    tmp12=tmp6+tmp7;
+    
+    
+    var z5=(tmp10-tmp12)*0.382683433;
+    var z2=0.541196100*tmp10+z5;
+    var z4=1.306562965*tmp12+z5;
+    var z3=tmp11*0.707106781;
+    
+    var z11=tmp7+z3;
+    var z13=tmp7-z3;
+    
+    data[dataOff+5]=z13+z2;
+    data[dataOff+3]=z13-z2;
+    data[dataOff+1]=z11+z4;
+    data[dataOff+7]=z11-z4;
+    
+    dataOff+=8;
+    }
+    
+    
+    dataOff=0;
+    for(i=0;i<I8;++i)
+    {
+    d0=data[dataOff];
+    d1=data[dataOff+8];
+    d2=data[dataOff+16];
+    d3=data[dataOff+24];
+    d4=data[dataOff+32];
+    d5=data[dataOff+40];
+    d6=data[dataOff+48];
+    d7=data[dataOff+56];
+    
+    var tmp0p2=d0+d7;
+    var tmp7p2=d0-d7;
+    var tmp1p2=d1+d6;
+    var tmp6p2=d1-d6;
+    var tmp2p2=d2+d5;
+    var tmp5p2=d2-d5;
+    var tmp3p2=d3+d4;
+    var tmp4p2=d3-d4;
+    
+    
+    var tmp10p2=tmp0p2+tmp3p2;
+    var tmp13p2=tmp0p2-tmp3p2;
+    var tmp11p2=tmp1p2+tmp2p2;
+    var tmp12p2=tmp1p2-tmp2p2;
+    
+    data[dataOff]=tmp10p2+tmp11p2;
+    data[dataOff+32]=tmp10p2-tmp11p2;
+    
+    var z1p2=(tmp12p2+tmp13p2)*0.707106781;
+    data[dataOff+16]=tmp13p2+z1p2;
+    data[dataOff+48]=tmp13p2-z1p2;
+    
+    
+    tmp10p2=tmp4p2+tmp5p2;
+    tmp11p2=tmp5p2+tmp6p2;
+    tmp12p2=tmp6p2+tmp7p2;
+    
+    
+    var z5p2=(tmp10p2-tmp12p2)*0.382683433;
+    var z2p2=0.541196100*tmp10p2+z5p2;
+    var z4p2=1.306562965*tmp12p2+z5p2;
+    var z3p2=tmp11p2*0.707106781;
+    
+    var z11p2=tmp7p2+z3p2;
+    var z13p2=tmp7p2-z3p2;
+    
+    data[dataOff+40]=z13p2+z2p2;
+    data[dataOff+24]=z13p2-z2p2;
+    data[dataOff+8]=z11p2+z4p2;
+    data[dataOff+56]=z11p2-z4p2;
+    
+    dataOff++;
+    }
+    
+    
+    var fDCTQuant;
+    for(i=0;i<I64;++i)
+    {
+    
+    fDCTQuant=data[i]*fdtbl[i];
+    outputfDCTQuant[i]=fDCTQuant>0.0?fDCTQuant+0.5|0:fDCTQuant-0.5|0;
+    
+    
+    }
+    return outputfDCTQuant;
+    }
+    
+    function writeAPP0()
+    {
+    writeWord(0xFFE0);
+    writeWord(16);
+    writeByte(0x4A);
+    writeByte(0x46);
+    writeByte(0x49);
+    writeByte(0x46);
+    writeByte(0);
+    writeByte(1);
+    writeByte(1);
+    writeByte(0);
+    writeWord(1);
+    writeWord(1);
+    writeByte(0);
+    writeByte(0);
+    }
+    
+    function writeSOF0(width,height)
+    {
+    writeWord(0xFFC0);
+    writeWord(17);
+    writeByte(8);
+    writeWord(height);
+    writeWord(width);
+    writeByte(3);
+    writeByte(1);
+    writeByte(0x11);
+    writeByte(0);
+    writeByte(2);
+    writeByte(0x11);
+    writeByte(1);
+    writeByte(3);
+    writeByte(0x11);
+    writeByte(1);
+    }
+    
+    function writeDQT()
+    {
+    writeWord(0xFFDB);
+    writeWord(132);
+    writeByte(0);
+    for(var i=0;i<64;i++){
+    writeByte(YTable[i]);
+    }
+    writeByte(1);
+    for(var j=0;j<64;j++){
+    writeByte(UVTable[j]);
+    }
+    }
+    
+    function writeDHT()
+    {
+    writeWord(0xFFC4);
+    writeWord(0x01A2);
+    
+    writeByte(0);
+    for(var i=0;i<16;i++){
+    writeByte(std_dc_luminance_nrcodes[i+1]);
+    }
+    for(var j=0;j<=11;j++){
+    writeByte(std_dc_luminance_values[j]);
+    }
+    
+    writeByte(0x10);
+    for(var k=0;k<16;k++){
+    writeByte(std_ac_luminance_nrcodes[k+1]);
+    }
+    for(var l=0;l<=161;l++){
+    writeByte(std_ac_luminance_values[l]);
+    }
+    
+    writeByte(1);
+    for(var m=0;m<16;m++){
+    writeByte(std_dc_chrominance_nrcodes[m+1]);
+    }
+    for(var n=0;n<=11;n++){
+    writeByte(std_dc_chrominance_values[n]);
+    }
+    
+    writeByte(0x11);
+    for(var o=0;o<16;o++){
+    writeByte(std_ac_chrominance_nrcodes[o+1]);
+    }
+    for(var p=0;p<=161;p++){
+    writeByte(std_ac_chrominance_values[p]);
+    }
+    }
+    
+    function writeSOS()
+    {
+    writeWord(0xFFDA);
+    writeWord(12);
+    writeByte(3);
+    writeByte(1);
+    writeByte(0);
+    writeByte(2);
+    writeByte(0x11);
+    writeByte(3);
+    writeByte(0x11);
+    writeByte(0);
+    writeByte(0x3f);
+    writeByte(0);
+    }
+    
+    function processDU(CDU,fdtbl,DC,HTDC,HTAC){
+    var EOB=HTAC[0x00];
+    var M16zeroes=HTAC[0xF0];
+    var pos;
+    const I16=16;
+    const I63=63;
+    const I64=64;
+    var DU_DCT=fDCTQuant(CDU,fdtbl);
+    
+    for(var j=0;j<I64;++j){
+    DU[ZigZag[j]]=DU_DCT[j];
+    }
+    var Diff=DU[0]-DC;DC=DU[0];
+    
+    if(Diff==0){
+    writeBits(HTDC[0]);
+    }else{
+    pos=32767+Diff;
+    writeBits(HTDC[category[pos]]);
+    writeBits(bitcode[pos]);
+    }
+    
+    var end0pos=63;
+    for(;end0pos>0&&DU[end0pos]==0;end0pos--){};
+    
+    if(end0pos==0){
+    writeBits(EOB);
+    return DC;
+    }
+    var i=1;
+    var lng;
+    while(i<=end0pos){
+    var startpos=i;
+    for(;DU[i]==0&&i<=end0pos;++i){}
+    var nrzeroes=i-startpos;
+    if(nrzeroes>=I16){
+    lng=nrzeroes>>4;
+    for(var nrmarker=1;nrmarker<=lng;++nrmarker)
+    writeBits(M16zeroes);
+    nrzeroes=nrzeroes&0xF;
+    }
+    pos=32767+DU[i];
+    writeBits(HTAC[(nrzeroes<<4)+category[pos]]);
+    writeBits(bitcode[pos]);
+    i++;
+    }
+    if(end0pos!=I63){
+    writeBits(EOB);
+    }
+    return DC;
+    }
+    
+    function initCharLookupTable(){
+    var sfcc=String.fromCharCode;
+    for(var i=0;i<256;i++){
+    clt[i]=sfcc(i);
+    }
+    }
+    
+    this.encode=function(image,quality)
+    {
+    var time_start=new Date().getTime();
+    
+    if(quality)setQuality(quality);
+    
+    
+    byteout=new Array();
+    bytenew=0;
+    bytepos=7;
+    
+    
+    writeWord(0xFFD8);
+    writeAPP0();
+    writeDQT();
+    writeSOF0(image.width,image.height);
+    writeDHT();
+    writeSOS();
+    
+    
+    
+    var DCY=0;
+    var DCU=0;
+    var DCV=0;
+    
+    bytenew=0;
+    bytepos=7;
+    
+    
+    this.encode.displayName="_encode_";
+    
+    var imageData=image.data;
+    var width=image.width;
+    var height=image.height;
+    
+    var quadWidth=width*4;
+    var tripleWidth=width*3;
+    
+    var x,y=0;
+    var r,g,b;
+    var start,p,col,row,pos;
+    while(y<height){
+    x=0;
+    while(x<quadWidth){
+    start=quadWidth*y+x;
+    p=start;
+    col=-1;
+    row=0;
+    
+    for(pos=0;pos<64;pos++){
+    row=pos>>3;
+    col=(pos&7)*4;
+    p=start+row*quadWidth+col;
+    
+    if(y+row>=height){
+    p-=quadWidth*(y+1+row-height);
+    }
+    
+    if(x+col>=quadWidth){
+    p-=x+col-quadWidth+4;
+    }
+    
+    r=imageData[p++];
+    g=imageData[p++];
+    b=imageData[p++];
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    YDU[pos]=(RGB_YUV_TABLE[r]+RGB_YUV_TABLE[g+256>>0]+RGB_YUV_TABLE[b+512>>0]>>16)-128;
+    UDU[pos]=(RGB_YUV_TABLE[r+768>>0]+RGB_YUV_TABLE[g+1024>>0]+RGB_YUV_TABLE[b+1280>>0]>>16)-128;
+    VDU[pos]=(RGB_YUV_TABLE[r+1280>>0]+RGB_YUV_TABLE[g+1536>>0]+RGB_YUV_TABLE[b+1792>>0]>>16)-128;
+    
+    }
+    
+    DCY=processDU(YDU,fdtbl_Y,DCY,YDC_HT,YAC_HT);
+    DCU=processDU(UDU,fdtbl_UV,DCU,UVDC_HT,UVAC_HT);
+    DCV=processDU(VDU,fdtbl_UV,DCV,UVDC_HT,UVAC_HT);
+    x+=32;
+    }
+    y+=8;
+    }
+    
+    
+    
+    
+    
+    if(bytepos>=0){
+    var fillbits=[];
+    fillbits[1]=bytepos+1;
+    fillbits[0]=(1<<bytepos+1)-1;
+    writeBits(fillbits);
+    }
+    
+    writeWord(0xFFD9);
+    
+    
+    return new Buffer(byteout);
+    
+    var jpegDataUri='data:image/jpeg;base64,'+btoa(byteout.join(''));
+    
+    byteout=[];
+    
+    
+    var duration=new Date().getTime()-time_start;
+    
+    
+    
+    return jpegDataUri;
+    };
+    
+    function setQuality(quality){
+    if(quality<=0){
+    quality=1;
+    }
+    if(quality>100){
+    quality=100;
+    }
+    
+    if(currentQuality==quality)return;
+    
+    var sf=0;
+    if(quality<50){
+    sf=Math.floor(5000/quality);
+    }else{
+    sf=Math.floor(200-quality*2);
+    }
+    
+    initQuantTables(sf);
+    currentQuality=quality;
+    
+    }
+    
+    function init(){
+    var time_start=new Date().getTime();
+    if(!quality)quality=50;
+    
+    initCharLookupTable();
+    initHuffmanTbl();
+    initCategoryNumber();
+    initRGBYUVTable();
+    
+    setQuality(quality);
+    var duration=new Date().getTime()-time_start;
+    
+    }
+    
+    init();
+    
+    };
+    module.exports=encode;
+    
+    function encode(imgData,qu){
+    if(typeof qu==='undefined')qu=50;
+    var encoder=new JPEGEncoder(qu);
+    var data=encoder.encode(imgData,qu);
+    return{
+    data:data,
+    width:imgData.width,
+    height:imgData.height};
+    
+    }
+    
+    
+    function getImageDataFromImage(idOrElement){
+    var theImg=typeof idOrElement=='string'?document.getElementById(idOrElement):idOrElement;
+    var cvs=document.createElement('canvas');
+    cvs.width=theImg.width;
+    cvs.height=theImg.height;
+    var ctx=cvs.getContext("2d");
+    ctx.drawImage(theImg,0,0);
+    
+    return ctx.getImageData(0,0,cvs.width,cvs.height);
+    }
+    
+    }).call(this,require("buffer").Buffer);
+    },{"buffer":102}],125:[function(require,module,exports){
+    (function(process){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const debug=require('debug');
+    const marky=require('marky');
+    
+    const EventEmitter=require('events').EventEmitter;
+    const isWindows=process.platform==='win32';
+    
+    
+    const isBrowser=process.browser;
+    
+    const colors={
+    red:isBrowser?'crimson':1,
+    yellow:isBrowser?'gold':3,
+    cyan:isBrowser?'darkturquoise':6,
+    green:isBrowser?'forestgreen':2,
+    blue:isBrowser?'steelblue':4,
+    magenta:isBrowser?'palevioletred':5};
+    
+    
+    
+    debug.colors=[colors.cyan,colors.green,colors.blue,colors.magenta];
+    
+    class Emitter extends EventEmitter{
+    
+    
+    
+    
+    
+    
+    issueStatus(title,argsArray){
+    if(title==='status'||title==='statusEnd'){
+    this.emit(title,[title,...argsArray]);
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    issueWarning(title,argsArray){
+    this.emit('warning',[title,...argsArray]);
+    }}
+    
+    
+    const loggersByTitle={};
+    const loggingBufferColumns=25;
+    let level_;
+    
+    class Log{
+    static _logToStdErr(title,argsArray){
+    const log=Log.loggerfn(title);
+    log(...argsArray);
+    }
+    
+    static loggerfn(title){
+    let log=loggersByTitle[title];
+    if(!log){
+    log=debug(title);
+    loggersByTitle[title]=log;
+    
+    if(title.endsWith('error')){
+    log.color=colors.red;
+    }else if(title.endsWith('warn')){
+    log.color=colors.yellow;
+    }
+    }
+    return log;
+    }
+    
+    
+    
+    
+    static setLevel(level){
+    level_=level;
+    switch(level){
+    case'silent':
+    debug.enable('-*');
+    break;
+    case'verbose':
+    debug.enable('*');
+    break;
+    case'error':
+    debug.enable('-*, *:error');
+    break;
+    default:
+    debug.enable('*, -*:verbose');}
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    static formatProtocol(prefix,data,level){
+    const columns=!process||process.browser?Infinity:process.stdout.columns;
+    const method=data.method||'?????';
+    const maxLength=columns-method.length-prefix.length-loggingBufferColumns;
+    
+    const snippet=data.params&&method!=='IO.read'?
+    JSON.stringify(data.params).substr(0,maxLength):'';
+    Log._logToStdErr(`${prefix}:${level||''}`,[method,snippet]);
+    }
+    
+    
+    
+    
+    static isVerbose(){
+    return level_==='verbose';
+    }
+    
+    static time({msg,id,args=[]},level='log'){
+    marky.mark(id);
+    Log[level]('status',msg,...args);
+    }
+    
+    static timeEnd({msg,id,args=[]},level='verbose'){
+    Log[level]('statusEnd',msg,...args);
+    marky.stop(id);
+    }
+    
+    static log(title,...args){
+    Log.events.issueStatus(title,args);
+    return Log._logToStdErr(title,args);
+    }
+    
+    static warn(title,...args){
+    Log.events.issueWarning(title,args);
+    return Log._logToStdErr(`${title}:warn`,args);
+    }
+    
+    static error(title,...args){
+    return Log._logToStdErr(`${title}:error`,args);
+    }
+    
+    static verbose(title,...args){
+    Log.events.issueStatus(title,args);
+    return Log._logToStdErr(`${title}:verbose`,args);
+    }
+    
+    
+    
+    
+    
+    
+    static greenify(str){
+    return`${Log.green}${str}${Log.reset}`;
+    }
+    
+    
+    
+    
+    
+    
+    static redify(str){
+    return`${Log.red}${str}${Log.reset}`;
+    }
+    
+    static get green(){
+    return'\x1B[32m';
+    }
+    
+    static get red(){
+    return'\x1B[31m';
+    }
+    
+    static get yellow(){
+    return'\x1b[33m';
+    }
+    
+    static get purple(){
+    return'\x1b[95m';
+    }
+    
+    static get reset(){
+    return'\x1B[0m';
+    }
+    
+    static get bold(){
+    return'\x1b[1m';
+    }
+    
+    static get dim(){
+    return'\x1b[2m';
+    }
+    
+    static get tick(){
+    return isWindows?'\u221A':'✓';
+    }
+    
+    static get cross(){
+    return isWindows?'\u00D7':'✘';
+    }
+    
+    static get whiteSmallSquare(){
+    return isWindows?'\u0387':'▫';
+    }
+    
+    static get heavyHorizontal(){
+    return isWindows?'\u2500':'━';
+    }
+    
+    static get heavyVertical(){
+    return isWindows?'\u2502 ':'┃ ';
+    }
+    
+    static get heavyUpAndRight(){
+    return isWindows?'\u2514':'┗';
+    }
+    
+    static get heavyVerticalAndRight(){
+    return isWindows?'\u251C':'┣';
+    }
+    
+    static get heavyDownAndHorizontal(){
+    return isWindows?'\u252C':'┳';
+    }
+    
+    static get doubleLightHorizontal(){
+    return'──';
+    }}
+    
+    
+    Log.events=new Emitter();
+    Log.takeTimeEntries=()=>{
+    const entries=marky.getEntries();
+    marky.clear();
+    return entries;
+    };
+    Log.getTimeEntries=()=>marky.getEntries();
+    
+    module.exports=Log;
+    
+    }).call(this,require('_process'));
+    },{"_process":158,"debug":106,"events":108,"marky":144}],126:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const BaseNode=require('lighthouse/lighthouse-core/lib/dependency-graph/base-node.js');
+    
+    const CpuNode=require('lighthouse/lighthouse-core/lib/dependency-graph/cpu-node.js');
+    
+    const LanternMetric=require('lighthouse/lighthouse-core/computed/metrics/lantern-metric');
+    
+    const NetworkNode=require('lighthouse/lighthouse-core/lib/dependency-graph/network-node.js');
+    const{isBidRelatedRequest,isImpressionPing,isGoogleAds,isGptAdRequest}=require('../utils/resource-classification');
+    const{URL}=require('url');
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function getFrame(event){
+    
+    return event.args.frame||event.args.data&&event.args.data.frame||null;
+    }
+    
+    
+    
+    
+    
+    
+    function getCpuNodeUrls(cpuNode){
+    const results=new Set();
+    for(const{args}of cpuNode.childEvents){
+    if(args.data&&args.data.url){
+    results.add(args.data.url);
+    }
+    }
+    return Array.from(results);
+    }
+    
+    
+    
+    
+    
+    
+    function isAdTask(cpuNode){
+    return!!getCpuNodeUrls(cpuNode).find(
+    url=>isBidRelatedRequest(url)||isGoogleAds(new URL(url)));
+    }
+    
+    
+    
+    
+    
+    
+    function isLongTask(cpuNode){
+    
+    
+    return cpuNode.event.dur>50*1000;
+    }
+    
+    
+    
+    
+    
+    function addEdges(graph){
+    const adRequestNodes=[];
+    graph.traverse(node=>{
+    if(node.type===BaseNode.TYPES.NETWORK&&isGptAdRequest(node.record)){
+    adRequestNodes.push(node);
+    }
+    });
+    graph.traverse(node=>{
+    if(node.type!==BaseNode.TYPES.NETWORK){
+    return;
+    }
+    if(isBidRelatedRequest(node.record)){
+    for(const adNode of adRequestNodes){
+    
+    
+    if(adNode.record.startTime>=node.record.endTime){
+    node.addDependent(adNode);
+    }
+    }
+    }
+    if(isImpressionPing(node.record.url)){
+    for(const adNode of adRequestNodes){
+    if(adNode.record.endTime>node.record.startTime){
+    continue;
+    }
+    adNode.addDependent(node);
+    for(const dependent of adNode.getDependents()){
+    if(dependent.endTime<=node.startTime){
+    dependent.addDependency(node);
+    }
+    }
+    }
+    }
+    });
+    }
+    
+    
+    class AdLanternMetric extends LanternMetric{
+    
+    
+    
+    
+    static get COEFFICIENTS(){
+    return{
+    intercept:0,
+    
+    optimistic:1,
+    pessimistic:0};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    static getPessimisticGraph(graph){
+    
+    const pessimisticGraph=graph.cloneWithRelationships(_=>true);
+    addEdges(pessimisticGraph);
+    return pessimisticGraph;
+    }
+    
+    
+    
+    
+    
+    
+    
+    static getOptimisticGraph(graph){
+    
+    const mainFrame=graph.record.frameId;
+    const pessimisticGraph=AdLanternMetric.getPessimisticGraph(graph);
+    
+    const optimisticGraph=pessimisticGraph.cloneWithRelationships(node=>{
+    if(node.type===BaseNode.TYPES.CPU){
+    return(
+    isLongTask(node)||
+    isAdTask(node)||
+    !!getFrame(node.event)&&getFrame(node.event)!==mainFrame);
+    }
+    if(node.hasRenderBlockingPriority()){
+    return true;
+    }
+    const url=node.record.url;
+    return isBidRelatedRequest(url)||isGoogleAds(new URL(url));
+    });
+    return optimisticGraph;
+    }
+    
+    
+    
+    
+    
+    
+    
+    static getEstimateFromSimulation(simulationResult,extras){
+    throw new Error(
+    'getEstimateFromSimulation not implemented by '+this.name);
+    }
+    
+    
+    
+    
+    
+    
+    static findTiming(nodeTimings,isTargetNode){
+    let leastTiming={startTime:Infinity,endTime:-Infinity,duration:0};
+    for(const[node,timing]of nodeTimings.entries()){
+    if(isTargetNode(node,timing)&&
+    leastTiming.startTime>timing.startTime){
+    leastTiming=timing;
+    }
+    }
+    return leastTiming;
+    }
+    
+    
+    
+    
+    
+    
+    static findNetworkTiming(nodeTimings,isTargetRequest){
+    return this.findTiming(
+    nodeTimings,
+    node=>
+    node.type===BaseNode.TYPES.NETWORK&&isTargetRequest(node.record));
+    }}
+    
+    
+    module.exports=AdLanternMetric;
+    
+    },{"../utils/resource-classification":140,"lighthouse/lighthouse-core/computed/metrics/lantern-metric":25,"lighthouse/lighthouse-core/lib/dependency-graph/base-node.js":57,"lighthouse/lighthouse-core/lib/dependency-graph/cpu-node.js":58,"lighthouse/lighthouse-core/lib/dependency-graph/network-node.js":59,"url":"url"}],127:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const AdLanternMetric=require('./ad-lantern-metric');
+    
+    const ComputedMetric=require('lighthouse/lighthouse-core/computed/metrics/metric');
+    
+    const makeComputedArtifact=require('lighthouse/lighthouse-core/computed/computed-artifact');
+    const{getPageStartTime,getImpressionStartTime}=require('../utils/network-timing');
+    const{isImpressionPing}=require('../utils/resource-classification');
+    
+    
+    
+    
+    
+    
+    class LanternAdRenderTime extends AdLanternMetric{
+    
+    
+    
+    
+    
+    
+    static getEstimateFromSimulation(simulationResult,extras){
+    const{nodeTimings}=simulationResult;
+    const timeInMs=AdLanternMetric.findNetworkTiming(
+    nodeTimings,
+    req=>!!req.url&&isImpressionPing(new URL(req.url))).startTime;
+    return{timeInMs,nodeTimings};
+    }}
+    
+    
+    
+    
+    
+    LanternAdRenderTime=makeComputedArtifact(LanternAdRenderTime);
+    
+    
+    class AdRenderTime extends ComputedMetric{
+    
+    
+    
+    
+    
+    
+    static async computeSimulatedMetric(data,context){
+    
+    return LanternAdRenderTime.request(data,context);
+    }
+    
+    
+    
+    
+    
+    
+    
+    static async computeObservedMetric(data,context){
+    const{networkRecords}=data;
+    const pageStartTime=getPageStartTime(networkRecords);
+    const impressionStartTime=getImpressionStartTime(networkRecords);
+    const firstPaintMs=(impressionStartTime-pageStartTime)*1000;
+    return Promise.resolve({timing:firstPaintMs});
+    }}
+    
+    
+    
+    
+    
+    AdRenderTime=makeComputedArtifact(AdRenderTime);
+    
+    module.exports=AdRenderTime;
+    
+    
+    },{"../utils/network-timing":138,"../utils/resource-classification":140,"./ad-lantern-metric":126,"lighthouse/lighthouse-core/computed/computed-artifact":8,"lighthouse/lighthouse-core/computed/metrics/metric":30}],128:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const AdLanternMetric=require('./ad-lantern-metric');
+    
+    const ComputedMetric=require('lighthouse/lighthouse-core/computed/metrics/metric');
+    
+    const makeComputedArtifact=require('lighthouse/lighthouse-core/computed/computed-artifact');
+    const{getAdStartTime,getPageStartTime}=require('../utils/network-timing');
+    const{isAdRequest}=require('../utils/resource-classification');
+    
+    
+    
+    
+    
+    
+    class LanternAdRequestTime extends AdLanternMetric{
+    
+    
+    
+    
+    
+    
+    static getEstimateFromSimulation(simulationResult,extras){
+    const{nodeTimings}=simulationResult;
+    const timeInMs=AdLanternMetric.findNetworkTiming(
+    nodeTimings,isAdRequest).startTime;
+    return{timeInMs,nodeTimings};
+    }}
+    
+    
+    
+    
+    
+    LanternAdRequestTime=makeComputedArtifact(LanternAdRequestTime);
+    
+    
+    class AdRequestTime extends ComputedMetric{
+    
+    
+    
+    
+    
+    
+    static async computeSimulatedMetric(data,context){
+    
+    return LanternAdRequestTime.request(data,context);
+    }
+    
+    
+    
+    
+    
+    
+    static async computeObservedMetric(data){
+    const{networkRecords}=data;
+    const pageStartTime=getPageStartTime(networkRecords);
+    const adStartTime=getAdStartTime(networkRecords);
+    const adRequestTimeMs=(adStartTime-pageStartTime)*1000;
+    return Promise.resolve({timing:adRequestTimeMs});
+    }}
+    
+    
+    
+    
+    
+    AdRequestTime=makeComputedArtifact(AdRequestTime);
+    
+    module.exports=AdRequestTime;
+    
+    },{"../utils/network-timing":138,"../utils/resource-classification":140,"./ad-lantern-metric":126,"lighthouse/lighthouse-core/computed/computed-artifact":8,"lighthouse/lighthouse-core/computed/metrics/metric":30}],129:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const AdLanternMetric=require('./ad-lantern-metric');
+    
+    const ComputedMetric=require('lighthouse/lighthouse-core/computed/metrics/metric');
+    
+    const makeComputedArtifact=require('lighthouse/lighthouse-core/computed/computed-artifact');
+    const{getBidStartTime,getPageStartTime}=require('../utils/network-timing');
+    const{isBidRequest}=require('../utils/resource-classification');
+    
+    
+    
+    
+    
+    
+    class LanternBidRequestTime extends AdLanternMetric{
+    
+    
+    
+    
+    
+    
+    static getEstimateFromSimulation(simulationResult,extras){
+    const{nodeTimings}=simulationResult;
+    const timeInMs=AdLanternMetric.findNetworkTiming(
+    nodeTimings,isBidRequest).startTime;
+    return{timeInMs,nodeTimings};
+    }}
+    
+    
+    
+    
+    
+    LanternBidRequestTime=makeComputedArtifact(LanternBidRequestTime);
+    
+    
+    class BidRequestTime extends ComputedMetric{
+    
+    
+    
+    
+    
+    
+    static async computeSimulatedMetric(data,context){
+    
+    return LanternBidRequestTime.request(data,context);
+    }
+    
+    
+    
+    
+    
+    
+    static async computeObservedMetric(data){
+    const{networkRecords}=data;
+    const pageStartTime=getPageStartTime(networkRecords);
+    const bidStartTime=getBidStartTime(networkRecords);
+    const bidRequestTimeMs=(bidStartTime-pageStartTime)*1000;
+    return Promise.resolve({timing:bidRequestTimeMs});
+    }}
+    
+    
+    
+    
+    
+    BidRequestTime=makeComputedArtifact(BidRequestTime);
+    
+    module.exports=BidRequestTime;
+    
+    },{"../utils/network-timing":138,"../utils/resource-classification":140,"./ad-lantern-metric":126,"lighthouse/lighthouse-core/computed/computed-artifact":8,"lighthouse/lighthouse-core/computed/metrics/metric":30}],130:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const AdLanternMetric=require('../computed/ad-lantern-metric');
+    const BaseNode=require('lighthouse/lighthouse-core/lib/dependency-graph/base-node.js');
+    
+    const ComputedMetric=require('lighthouse/lighthouse-core/computed/metrics/metric');
+    
+    const CpuNode=require('lighthouse/lighthouse-core/lib/dependency-graph/cpu-node.js');
+    const{getAttributableUrl}=require('../utils/tasks');
+    
+    const LoadSimulator=require('lighthouse/lighthouse-core/computed/load-simulator');
+    const MainThreadTasks=require('lighthouse/lighthouse-core/computed/main-thread-tasks');
+    
+    const makeComputedArtifact=require('lighthouse/lighthouse-core/computed/computed-artifact');
+    
+    const NetworkNode=require('lighthouse/lighthouse-core/lib/dependency-graph/network-node.js');
+    const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
+    const PageDependencyGraph=require('lighthouse/lighthouse-core/computed/page-dependency-graph');
+    
+    const LONG_TASK_THRESHOLD_MS=50;
+    
+    
+    
+    
+    
+    
+    function isLong(task,knownScripts){
+    if(task.duration<LONG_TASK_THRESHOLD_MS){
+    return false;
+    }
+    const script=getAttributableUrl(task,knownScripts);
+    if(!script){
+    return false;
+    }
+    if(task.parent){
+    
+    
+    const parentScript=getAttributableUrl(task.parent,knownScripts);
+    return script!=parentScript;
+    }
+    return true;
+    }
+    
+    
+    class LongTasks extends ComputedMetric{
+    
+    
+    
+    
+    
+    
+    static async getSimulationGraph(trace,devtoolsLog,context){
+    
+    const documentNode=
+    
+    await PageDependencyGraph.request({trace,devtoolsLog},context);
+    return AdLanternMetric.getOptimisticGraph(documentNode);
+    }
+    
+    
+    
+    
+    
+    
+    
+    static async computeSimulatedResult(trace,devtoolsLog,context){
+    const graph=await this.getSimulationGraph(trace,devtoolsLog,context);
+    const simulator=await LoadSimulator.request(
+    {devtoolsLog,settings:context.settings},context);
+    const{nodeTimings}=simulator.simulate(graph,{});
+    
+    const tasks=[];
+    for(const[node,timing]of nodeTimings.entries()){
+    if(node.type!==BaseNode.TYPES.CPU||
+    timing.duration<LONG_TASK_THRESHOLD_MS){
+    continue;
+    }
+    tasks.push({
+    event:node.event,
+    startTime:timing.startTime,
+    endTime:timing.endTime,
+    duration:timing.duration,
+    selfTime:timing.duration,
+    attributableURLs:Array.from(node.getEvaluateScriptURLs()),
+    children:[]});
+    
+    }
+    return tasks;
+    }
+    
+    
+    
+    
+    
+    
+    
+    static async computeObservedResult(trace,devtoolsLog,context){
+    const tasks=await MainThreadTasks.request(trace,context);
+    const networkRecords=await NetworkRecords.request(devtoolsLog,context);
+    
+    const knownScripts=new Set(networkRecords.
+    filter(record=>record.resourceType==='Script').
+    map(record=>record.url));
+    return tasks.filter(t=>isLong(t,knownScripts));
+    }
+    
+    
+    
+    
+    
+    
+    static async compute_({trace,devtoolsLog},context){
+    return context.settings.throttlingMethod=='simulate'?
+    this.computeSimulatedResult(trace,devtoolsLog,context):
+    this.computeObservedResult(trace,devtoolsLog,context);
+    }}
+    
+    
+    
+    
+    
+    LongTasks=makeComputedArtifact(LongTasks);
+    
+    module.exports=LongTasks;
+    
+    },{"../computed/ad-lantern-metric":126,"../utils/tasks":141,"lighthouse/lighthouse-core/computed/computed-artifact":8,"lighthouse/lighthouse-core/computed/load-simulator":10,"lighthouse/lighthouse-core/computed/main-thread-tasks":12,"lighthouse/lighthouse-core/computed/metrics/metric":30,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/computed/page-dependency-graph":35,"lighthouse/lighthouse-core/lib/dependency-graph/base-node.js":57,"lighthouse/lighthouse-core/lib/dependency-graph/cpu-node.js":58,"lighthouse/lighthouse-core/lib/dependency-graph/network-node.js":59}],131:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const AdLanternMetric=require('./ad-lantern-metric');
+    
+    const ComputedMetric=require('lighthouse/lighthouse-core/computed/metrics/metric');
+    
+    const makeComputedArtifact=require('lighthouse/lighthouse-core/computed/computed-artifact');
+    const{getPageStartTime,getTagEndTime}=require('../utils/network-timing');
+    const{isImplTag}=require('../utils/resource-classification');
+    const{URL}=require('url');
+    
+    
+    
+    
+    
+    
+    class LanternTagLoadTime extends AdLanternMetric{
+    
+    
+    
+    
+    
+    
+    static getEstimateFromSimulation(simulationResult,extras){
+    const{nodeTimings}=simulationResult;
+    const timeInMs=AdLanternMetric.findNetworkTiming(
+    nodeTimings,req=>!!req.url&&isImplTag(new URL(req.url))).endTime;
+    return{timeInMs,nodeTimings};
+    }}
+    
+    
+    
+    
+    
+    LanternTagLoadTime=makeComputedArtifact(LanternTagLoadTime);
+    
+    
+    class TagLoadTime extends ComputedMetric{
+    
+    
+    
+    
+    
+    
+    static async computeSimulatedMetric(data,context){
+    
+    return LanternTagLoadTime.request(data,context);
+    }
+    
+    
+    
+    
+    
+    
+    
+    static async computeObservedMetric(data,context){
+    const{networkRecords}=data;
+    const pageStartTime=getPageStartTime(networkRecords);
+    const tagEndTime=getTagEndTime(networkRecords);
+    const tagLoadMs=(tagEndTime-pageStartTime)*1000;
+    return Promise.resolve({timing:tagLoadMs});
+    }}
+    
+    
+    
+    
+    
+    TagLoadTime=makeComputedArtifact(TagLoadTime);
+    
+    module.exports=TagLoadTime;
+    
+    
+    },{"../utils/network-timing":138,"../utils/resource-classification":140,"./ad-lantern-metric":126,"lighthouse/lighthouse-core/computed/computed-artifact":8,"lighthouse/lighthouse-core/computed/metrics/metric":30,"url":"url"}],132:[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const UIStrings={
+    GROUPS__METRICS:'Metrics',
+    GROUPS__ADS_PERFORMANCE:'Ad Speed',
+    GROUPS__ADS_BEST_PRACTICES:'Tag Best Practices',
+    
+    NOT_APPLICABLE__DEFAULT:'Audit not applicable',
+    NOT_APPLICABLE__INVALID_TIMING:'Invalid timing task data',
+    NOT_APPLICABLE__NO_AD_RELATED_REQ:'No ad-related requests',
+    NOT_APPLICABLE__NO_AD_RENDERED:'No ads rendered',
+    NOT_APPLICABLE__NO_ADS_VIEWPORT:'No ads in viewport',
+    NOT_APPLICABLE__NO_ADS:'No ads requested',
+    NOT_APPLICABLE__NO_BIDS:'No bids detected',
+    NOT_APPLICABLE__NO_EVENT_MATCHING_REQ:'No event matches network records',
+    NOT_APPLICABLE__NO_GPT:'GPT not requested',
+    NOT_APPLICABLE__NO_RECORDS:'No successful network records',
+    NOT_APPLICABLE__NO_VISIBLE_SLOTS:'No visible slots',
+    NOT_APPLICABLE__NO_TAG:'No tag requested',
+    NOT_APPLICABLE__NO_TAGS:'No tags requested',
+    NOT_APPLICABLE__NO_TASKS:'No tasks to compare',
+    NOT_APPLICABLE__NO_VALID_AD_WIDTHS:'No requested ads contain ads of valid width',
+    
+    ERRORS__AREA_LARGER_THAN_VIEWPORT:'Calculated ad area is larger than viewport',
+    ERRORS__VIEWPORT_AREA_ZERO:'Viewport area is zero',
+    
+    WARNINGS__NO_ADS:'No ads were requested when fetching this page.',
+    WARNINGS__NO_AD_RENDERED:'No ads were rendered when rendering this page.',
+    WARNINGS__NO_TAG:'The GPT tag was not requested.'};
+    
+    const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    
+    const notApplicableObj=message=>({
+    notApplicable:true,
+    score:1,
+    displayValue:str_(message)});
+    
+    
+    
+    
+    
+    
+    const auditNotApplicable={
+    Default:notApplicableObj(UIStrings.NOT_APPLICABLE__DEFAULT),
+    InvalidTiming:notApplicableObj(UIStrings.NOT_APPLICABLE__INVALID_TIMING),
+    NoAdRelatedReq:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_AD_RELATED_REQ),
+    NoAdRendered:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_AD_RENDERED),
+    NoAdsViewport:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_ADS_VIEWPORT),
+    NoAds:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_ADS),
+    NoBids:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_BIDS),
+    NoEventMatchingReq:notApplicableObj(
+    UIStrings.NOT_APPLICABLE__NO_EVENT_MATCHING_REQ),
+    NoGpt:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_GPT),
+    NoRecords:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_RECORDS),
+    NoVisibleSlots:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_VISIBLE_SLOTS),
+    NoTag:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_TAG),
+    NoTags:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_TAGS),
+    NoTasks:notApplicableObj(UIStrings.NOT_APPLICABLE__NO_TASKS),
+    NoValidAdWidths:notApplicableObj(
+    UIStrings.NOT_APPLICABLE__NO_VALID_AD_WIDTHS)};
+    
+    
+    const runWarning={
+    NoAds:str_(UIStrings.WARNINGS__NO_ADS),
+    NoAdRendered:str_(UIStrings.WARNINGS__NO_AD_RENDERED),
+    NoTag:str_(UIStrings.WARNINGS__NO_TAG)};
+    
+    
+    const auditError={
+    AreaLargerThanViewport:str_(UIStrings.ERRORS__AREA_LARGER_THAN_VIEWPORT),
+    ViewportAreaZero:str_(UIStrings.ERRORS__VIEWPORT_AREA_ZERO)};
+    
+    
+    const group={
+    Metrics:str_(UIStrings.GROUPS__METRICS),
+    AdsPerformance:str_(UIStrings.GROUPS__ADS_PERFORMANCE),
+    AdsBestPractices:str_(UIStrings.GROUPS__ADS_BEST_PRACTICES)};
+    
+    
+    module.exports={auditNotApplicable,runWarning,auditError,group};
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/node_modules/lighthouse-plugin-publisher-ads/messages/common-strings.js");
+    },{"lighthouse/lighthouse-core/lib/i18n/i18n":66}],133:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function count(arr,pred){
+    let num=0;
+    for(const el of arr){
+    if(pred(el)){
+    num++;
+    }
+    }
+    return num;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function bucket(array,splitter){
+    
+    const buckets=new Map();
+    for(const element of array){
+    const result=splitter(element);
+    if(result!=null){
+    
+    
+    const bucket=buckets.get(result)||[];
+    bucket.push(element);
+    buckets.set(result,bucket);
+    }
+    }
+    return buckets;
+    }
+    
+    
+    
+    
+    
+    
+    
+    function flatten(arrs){
+    const result=[];
+    for(const arr of arrs){
+    result.push(...arr);
+    }
+    return result;
+    }
+    
+    module.exports={
+    count,bucket,flatten};
+    
+    
+    },{}],134:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function assert(x){
+    if(x==null)throw new Error('Expected not to be null');
+    return x;
+    }
+    
+    module.exports={
+    assert};
+    
+    
+    },{}],135:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    module.exports=[
+    {
+    label:'Prebid JS',
+    patterns:[
+    `^https?://([^.]*.)?prebid[.]org/.*`,
+    '^https?://acdn[.]adnxs[.]com/prebid/.*']},
+    
+    
+    {
+    label:'33Across',
+    patterns:[
+    '^https?://ssc[.]33across.com/api/.*']},
+    
+    
+    {
+    label:'AppNexus',
+    patterns:[
+    '^https?://ib[.]adnxs[.]com/.*']},
+    
+    
+    {
+    label:'Amazon',
+    patterns:[
+    '^https?://[a-z-_.]*[.]amazon-adsystem[.]com/.*bid.*']},
+    
+    
+    {
+    label:'AdTechus (AOL)',
+    patterns:[
+    '^https?://([^.]*.)?adserver[.]adtechus[.]com/.*']},
+    
+    
+    {
+    label:'Aardvark',
+    patterns:[
+    '^https?://thor[.]rtk[.]io/.*']},
+    
+    
+    {
+    label:'AdBlade',
+    patterns:[
+    '^https?://rtb[.]adblade[.]com/prebidjs/bid.*']},
+    
+    
+    {
+    label:'AdBund',
+    patterns:[
+    '^https?://us-east-engine[.]adbund[.]xyz/prebid/ad/get.*',
+    '^https?://us-west-engine[.]adbund[.]xyz/prebid/ad/get.*']},
+    
+    
+    {
+    label:'AdButler',
+    patterns:[
+    '^https?://servedbyadbutler[.]com/adserve.*']},
+    
+    
+    {
+    label:'Adequant',
+    patterns:[
+    '^https?://rex[.]adequant[.]com/rex/c2s_prebid.*']},
+    
+    
+    {
+    label:'AdForm',
+    patterns:[
+    '^https?://adx[.]adform[.]net/adx.*']},
+    
+    
+    {
+    label:'AdMedia',
+    patterns:[
+    '^https?://b[.]admedia[.]com/banner/prebid/bidder.*']},
+    
+    
+    {
+    label:'AdMixer',
+    patterns:[
+    '^https?://inv-nets[.]admixer[.]net/prebid[.]aspx.*',
+    '^https?://inv-nets[.]admixer[.]net/videoprebid[.]aspx.*']},
+    
+    
+    {
+    label:'AOL',
+    patterns:[
+    '^https?://adserver-us[.]adtech[.]advertising[.]com.*',
+    '^https?://adserver-eu[.]adtech[.]advertising[.]com.*',
+    '^https?://adserver-as[.]adtech[.]advertising[.]com.*',
+    '^https?://adserver[.]adtech[.]de/pubapi/.*']},
+    
+    
+    {
+    label:'Beachfront',
+    patterns:[
+    '^https?://reachms[.]bfmio[.]com/bid[.]json?exchange_id=.*']},
+    
+    
+    {
+    label:'Bidfluence',
+    patterns:[
+    '^https?://cdn[.]bidfluence[.]com/forge[.]js.*']},
+    
+    
+    {
+    label:'Brightcom',
+    patterns:[
+    '^https?://hb[.]iselephant[.]com/auc/ortb.*']},
+    
+    
+    {
+    label:'C1x',
+    patterns:[
+    '^https?://ht-integration[.]c1exchange[.]com:9000/ht.*']},
+    
+    
+    {
+    label:'CentroBid',
+    patterns:[
+    '^https?://t[.]brand-server[.]com/hb.*']},
+    
+    
+    {
+    label:'Conversant',
+    patterns:[
+    '^https?://media[.]msg[.]dotomi[.]com/s2s/.*']},
+    
+    
+    {
+    label:'Criteo',
+    patterns:[
+    '^https?://static[.]criteo[.]net/js/ld/publishertag[.]js.*',
+    '^https?://([^.]*.)?bidder[.]criteo[.]com/cdb.*',
+    '^https?://([^.]*.)?rtax[.]criteo[.]com/delivery/rta.*',
+    '^https?://([^.]*.)?rtax[.]eu[.]criteo[.]com/delivery/rta.*']},
+    
+    
+    {
+    label:'Districtm',
+    patterns:[
+    '^https?://prebid[.]districtm[.]ca/lib[.]js.*']},
+    
+    
+    {
+    label:'E-Planning',
+    patterns:[
+    '^https?://ads[.]us[.]e-planning[.]net.*']},
+    
+    
+    {
+    label:'Essens',
+    patterns:[
+    '^https?://bid[.]essrtb[.]com/bid/prebid_call.*']},
+    
+    
+    {
+    label:'Facebook',
+    patterns:[
+    '^https?://an[.]facebook[.]com/v2/placementbid[.]json.*']},
+    
+    
+    {
+    label:'FeatureForward',
+    patterns:[
+    '^https?://prmbdr[.]featureforward[.]com/newbidder/.*']},
+    
+    
+    {
+    label:'Fidelity',
+    patterns:[
+    '^https?://x[.]fidelity-media[.]com.*']},
+    
+    
+    {
+    label:'GetIntent',
+    patterns:[
+    '^https?://px[.]adhigh[.]net/rtb/direct_banner.*',
+    '^https?://px[.]adhigh[.]net/rtb/direct_vast.*']},
+    
+    
+    {
+    label:'GumGum',
+    patterns:[
+    '^https?://g2[.]gumgum[.]com/hbid/imp.*']},
+    
+    
+    {
+    label:'Hiromedia',
+    patterns:[
+    '^https?://hb-rtb[.]ktdpublishers[.]com/bid/get.*']},
+    
+    
+    {
+    label:'Imonomy',
+    patterns:[
+    '^https?://b[.]imonomy[.]com/openrtb/hb/.*']},
+    
+    
+    {
+    label:'ImproveDigital',
+    patterns:[
+    '^https?://ad[.]360yield[.]com/hb.*']},
+    
+    
+    {
+    label:'IndexExchange',
+    patterns:[
+    '^https?://as(-sec)?[.]casalemedia[.]com/(cygnus|headertag).*',
+    '^https?://js(-sec)?[.]indexww[.]com/ht/.*']},
+    
+    
+    {
+    label:'InnerActive',
+    patterns:[
+    '^https?://ad-tag[.]inner-active[.]mobi/simpleM2M/requestJsonAd.*']},
+    
+    
+    {
+    label:'Innity',
+    patterns:[
+    '^https?://as[.]innity[.]com/synd/.*']},
+    
+    
+    {
+    label:'JCM',
+    patterns:[
+    '^https?://media[.]adfrontiers[.]com/pq.*']},
+    
+    
+    {
+    label:'JustPremium',
+    patterns:[
+    '^https?://pre[.]ads[.]justpremium[.]com/v/.*']},
+    
+    
+    {
+    label:'Kargo',
+    patterns:[
+    '^https?://krk[.]kargo[.]com/api/v1/bid.*']},
+    
+    
+    {
+    label:'Komoona',
+    patterns:[
+    '^https?://bidder[.]komoona[.]com/v1/GetSBids.*']},
+    
+    
+    {
+    label:'KruxLink',
+    patterns:[
+    '^https?://link[.]krxd[.]net/hb.*']},
+    
+    
+    {
+    label:'Kumma',
+    patterns:[
+    '^https?://cdn[.]kumma[.]com/pb_ortb[.]js.*']},
+    
+    
+    {
+    label:'Mantis',
+    patterns:[
+    '^https?://mantodea[.]mantisadnetwork[.]com/website/prebid.*']},
+    
+    
+    {
+    label:'MarsMedia',
+    patterns:[
+    '^https?://bid306[.]rtbsrv[.]com:9306/bidder.*']},
+    
+    
+    {
+    label:'Media.net',
+    patterns:[
+    '^https?://contextual[.]media[.]net/bidexchange.*']},
+    
+    
+    {
+    label:'MemeGlobal',
+    patterns:[
+    '^https?://stinger[.]memeglobal[.]com/api/v1/services/prebid.*']},
+    
+    
+    {
+    label:'MobFox',
+    patterns:[
+    '^https?://my[.]mobfox[.]com/request[.]php.*']},
+    
+    
+    {
+    label:'NanoInteractive',
+    patterns:[
+    '^https?://tmp[.]audiencemanager[.]de/hb.*']},
+    
+    
+    {
+    label:'OpenX',
+    patterns:[
+    '^https?://([^.]*.)?d[.]openx[.]net/w/1[.]0/arj.*',
+    '^https?://([^.]*.)?servedbyopenx[.]com/.*']},
+    
+    
+    {
+    label:'Piximedia',
+    patterns:[
+    '^https?://static[.]adserver[.]pm/prebid.*']},
+    
+    
+    {
+    label:'Platformio',
+    patterns:[
+    '^https?://piohbdisp[.]hb[.]adx1[.]com.*']},
+    
+    
+    {
+    label:'Pollux',
+    patterns:[
+    '^https?://adn[.]plxnt[.]com/prebid.*']},
+    
+    
+    {
+    label:'PubGears',
+    patterns:[
+    '^https?://c[.]pubgears[.]com/tags.*']},
+    
+    
+    {
+    label:'Pubmatic',
+    patterns:[
+    '^https?://ads[.]pubmatic[.]com/AdServer/js/gshowad[.]js.*',
+    '^https?://([^.]*.)?gads.pubmatic[.]com/.*',
+    '^https?://hbopenbid.pubmatic[.]com/.*']},
+    
+    
+    {
+    label:'Pulsepoint',
+    patterns:[
+    '^https?://bid[.]contextweb[.]com/header/tag.*']},
+    
+    
+    {
+    label:'Quantcast',
+    patterns:[
+    '^https?://global[.]qc[.]rtb[.]quantserve[.]com:8080/qchb.*']},
+    
+    
+    {
+    label:'Rhythmone',
+    patterns:[
+    '^https?://tag[.]1rx[.]io/rmp/.*']},
+    
+    
+    {
+    label:'Roxot',
+    patterns:[
+    '^https?://r[.]rxthdr[.]com.*']},
+    
+    
+    {
+    label:'Rubicon',
+    patterns:[
+    '^https?://([^.]*.)?(fastlane|optimized-by|anvil)[.]rubiconproject[.]com/a/api.*',
+    '^https?://fastlane-adv[.]rubiconproject[.]com/v1/auction/video.*']},
+    
+    
+    {
+    label:'Sekindo',
+    patterns:[
+    '^https?://hb[.]sekindo[.]com/live/liveView[.]php.*']},
+    
+    
+    {
+    label:'ShareThrough',
+    patterns:[
+    '^https?://btlr[.]sharethrough[.]com/header-bid/.*']},
+    
+    
+    {
+    label:'Smart AdServer',
+    patterns:[
+    '^https?://prg[.]smartadserver[.]com/prebid.*']},
+    
+    
+    {
+    label:'Sonobi',
+    patterns:[
+    '^https?://apex[.]go[.]sonobi[.]com/trinity[.]js.*']},
+    
+    
+    {
+    label:'Sovrn',
+    patterns:[
+    '^https?://ap[.]lijit[.]com/rtb/bid.*']},
+    
+    
+    {
+    label:'SpringServe',
+    patterns:[
+    '^https?://bidder[.]springserve[.]com/display/hbid.*']},
+    
+    
+    {
+    label:'StickyAds',
+    patterns:[
+    '^https?://cdn[.]stickyadstv[.]com/mustang/mustang[.]min[.]js.*',
+    '^https?://cdn[.]stickyadstv[.]com/prime-time/.*']},
+    
+    
+    {
+    label:'TapSense3',
+    patterns:[
+    '^https?://ads04[.]tapsense[.]com/ads/headerad.*']},
+    
+    
+    {
+    label:'ThoughtLeadr',
+    patterns:[
+    '^https?://a[.]thoughtleadr[.]com/v4/.*']},
+    
+    
+    {
+    label:'TremorBid',
+    patterns:[
+    '^https?://([^.]*.)?ads[.]tremorhub[.]com/ad/tag.*']},
+    
+    
+    {
+    label:'Trion',
+    patterns:[
+    '^https?://in-appadvertising[.]com/api/bidRequest.*']},
+    
+    
+    {
+    label:'TripleLift',
+    patterns:[
+    '^https?://tlx[.]3lift[.]com/header/auction.*']},
+    
+    
+    {
+    label:'TrustX',
+    patterns:[
+    '^https?://sofia[.]trustx[.]org/hb.*']},
+    
+    
+    {
+    label:'UCFunnel',
+    patterns:[
+    '^https?://agent[.]aralego[.]com/header.*']},
+    
+    
+    {
+    label:'Underdog Media',
+    patterns:[
+    '^https?://udmserve[.]net/udm/img[.]fetch.*']},
+    
+    
+    {
+    label:'UnRuly',
+    patterns:[
+    '^https?://targeting[.]unrulymedia[.]com/prebid.*']},
+    
+    
+    {
+    label:'VertaMedia',
+    patterns:[
+    '^https?://rtb[.]vertamedia[.]com/hb/.*']},
+    
+    
+    {
+    label:'Vertoz',
+    patterns:[
+    '^https?://hb[.]vrtzads[.]com/vzhbidder/bid.*']},
+    
+    
+    {
+    label:'WideOrbig',
+    patterns:[
+    '^https?://([^.]*.)?atemda[.]com/JSAdservingMP[.]ashx.*']},
+    
+    
+    {
+    label:'WideSpace',
+    patterns:[
+    '^https?://engine[.]widespace[.]com/map/engine/hb/.*']},
+    
+    
+    {
+    label:'YieldBot',
+    patterns:[
+    '^https?://cdn[.]yldbt[.]com/js/yieldbot[.]intent[.]js.*']},
+    
+    
+    {
+    label:'YieldMo',
+    patterns:[
+    '^https?://ads[.]yieldmo[.]com/exchange/prebid.*']}];
+    
+    
+    
+    
+    },{}],136:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function isBoxInViewport(clientRect,viewport){
+    const{innerWidth,innerHeight}=viewport;
+    const{left,top,right,bottom}=clientRect;
+    
+    return left<right&&top<bottom&&
+    left<innerWidth&&top<innerHeight&&0<right&&0<bottom;
+    }
+    
+    
+    
+    
+    
+    
+    function boxViewableArea(clientRect,viewport){
+    if(!isBoxInViewport(clientRect,viewport))return 0;
+    
+    const{innerWidth,innerHeight}=viewport;
+    const{left,top,right,bottom}=clientRect;
+    
+    return(Math.min(right,innerWidth)-Math.max(left,0))*(
+    Math.min(bottom,innerHeight)-Math.max(top,0));
+    }
+    
+    module.exports={
+    isBoxInViewport,
+    boxViewableArea};
+    
+    
+    
+    },{}],137:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const BaseNode=require('lighthouse/lighthouse-core/lib/dependency-graph/base-node');
+    
+    const CpuNode=require('lighthouse/lighthouse-core/lib/dependency-graph/cpu-node.js');
+    
+    const NetworkNode=require('lighthouse/lighthouse-core/lib/dependency-graph/network-node.js');
+    const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
+    const{assert}=require('./asserts');
+    const{getAbbreviatedUrl,trimUrl}=require('../utils/resource-classification');
+    const{getNetworkInitiators}=require('lighthouse/lighthouse-core/computed/page-dependency-graph');
+    const{getTimingsByRecord}=require('../utils/network-timing');
+    const{isAdRequest,getHeaderBidder}=require('./resource-classification');
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function findTargetRequest(root,isTargetRequest){
+    
+    let firstTarget=null;
+    root.traverse(node=>{
+    if(node.type===BaseNode.TYPES.CPU||!isTargetRequest(node.record)){
+    return;
+    }
+    if(firstTarget&&firstTarget.startTime<node.startTime){
+    return;
+    }
+    firstTarget=node;
+    });
+    return firstTarget;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function getTransitiveClosure(root,isTargetRequest){
+    
+    const closure=new Set();
+    
+    const firstTarget=findTargetRequest(root,isTargetRequest);
+    
+    
+    const requests=[];
+    
+    const traceEvents=[];
+    
+    if(firstTarget==null){
+    return{requests,traceEvents};
+    }
+    
+    const stack=[firstTarget];
+    
+    
+    while(stack.length){
+    const node=stack.pop();
+    if(!node||closure.has(node)){
+    continue;
+    }
+    closure.add(node);
+    stack.push(...node.getDependencies());
+    }
+    
+    
+    const visited=new Set();
+    stack.push(...root.getDependents());
+    while(stack.length){
+    const node=stack.pop();
+    if(!node||visited.has(node)){
+    continue;
+    }
+    visited.add(node);
+    if(closure.has(node)){
+    for(const n of stack){
+    closure.add(n);
+    }
+    }
+    stack.push(...node.getDependents());
+    }
+    
+    
+    for(const node of closure){
+    if(node.type===BaseNode.TYPES.NETWORK){
+    if(node.endTime<assert(firstTarget).startTime){
+    requests.push(node.record);
+    }
+    }else if(node.type===BaseNode.TYPES.CPU){
+    if(node.event.ts<assert(firstTarget).startTime*1e6){
+    traceEvents.push(node.event,...node.childEvents);
+    }
+    }
+    }
+    return{requests,traceEvents};
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function isXhrCritical(xhrReq,networkSummary,criticalRequests){
+    const edges=networkSummary.xhrEdges.get(xhrReq.url);
+    if(!edges){
+    return false;
+    }
+    for(const{url}of criticalRequests){
+    if(edges.has(url)){
+    return true;
+    }
+    }
+    return false;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function addInitiatedRequests(
+    scriptReq,parentReq,networkSummary,criticalRequests){
+    const initiatedRequests=networkSummary.allRecords.
+    filter(r=>r.resourceType!=undefined).
+    filter(r=>['Script','XHR'].includes(r.resourceType||'')&&
+    r.endTime<parentReq.startTime).
+    filter(r=>r.initiatorRequest==scriptReq||
+    getNetworkInitiators(r).includes(scriptReq.url));
+    
+    for(const initiatedReq of initiatedRequests){
+    
+    const blocking=
+    initiatedReq.resourceType=='XHR'&&
+    isXhrCritical(initiatedReq,networkSummary,criticalRequests);
+    if(blocking){
+    linkGraph(networkSummary,initiatedReq,criticalRequests);
+    }
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function getCriticalGraph(networkRecords,traceEvents,targetRequest){
+    const summary=buildNetworkSummary(networkRecords,traceEvents);
+    const criticalRequests=new Set();
+    linkGraph(summary,targetRequest,criticalRequests);
+    return criticalRequests;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function linkGraph(
+    networkSummary,targetRequest,criticalRequests=new Set()){
+    if(!targetRequest||criticalRequests.has(targetRequest)){
+    return criticalRequests;
+    }
+    criticalRequests.add(targetRequest);
+    const seen=new Set();
+    for(let stack=targetRequest.initiator.stack;stack;stack=stack.parent){
+    for(const{url}of stack.callFrames){
+    if(seen.has(url))continue;
+    seen.add(url);
+    
+    const request=networkSummary.requestsByUrl.get(url);
+    if(!request)continue;
+    
+    linkGraph(networkSummary,request,criticalRequests);
+    
+    if(request.resourceType=='Script'){
+    const scriptUrl=stack.callFrames[0].url;
+    const scriptReq=networkSummary.requestsByUrl.get(scriptUrl);
+    if(scriptReq){
+    addInitiatedRequests(
+    scriptReq,
+    targetRequest,
+    networkSummary,
+    criticalRequests);
+    }
+    }
+    }
+    }
+    
+    linkGraph(
+    networkSummary,targetRequest.initiatorRequest||null,criticalRequests);
+    return criticalRequests;
+    }
+    
+    
+    
+    
+    
+    
+    function buildNetworkSummary(networkRecords,traceEvents){
+    const requestsByUrl=new Map();
+    for(const req of networkRecords){
+    requestsByUrl.set(req.url,req);
+    }
+    
+    const xhrEvents=traceEvents.
+    filter(t=>t.name.startsWith('XHR')).
+    filter(t=>!!(t.args.data||{}).url);
+    const xhrEdges=new Map();
+    for(const e of xhrEvents){
+    const data=e.args.data||{};
+    const edges=xhrEdges.get(data.url)||new Set();
+    for(const{url}of data.stackTrace||[]){
+    edges.add(url);
+    }
+    xhrEdges.set(data.url,edges);
+    }
+    return{requestsByUrl,xhrEdges,allRecords:networkRecords};
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function areSimilarRequests(r1,r2){
+    if(Math.max(r1.startTime,r2.startTime)>Math.min(r1.endTime,r2.endTime)){
+    return false;
+    }
+    if(r1.type&&r2.type&&r1.type!=r2.type){
+    return false;
+    }
+    return r1.abbreviatedUrl==r2.abbreviatedUrl;
+    }
+    
+    
+    
+    
+    
+    
+    
+    function computeSummaries(requests){
+    
+    
+    
+    requests.sort((a,b)=>{
+    if(a.abbreviatedUrl!=b.abbreviatedUrl){
+    return a.abbreviatedUrl<b.abbreviatedUrl?-1:1;
+    }
+    if(a.type!=b.type){
+    return a.type<b.type?-1:1;
+    }
+    if(a.startTime!=b.startTime){
+    return a.startTime<b.startTime?-1:1;
+    }
+    return a.endTime-b.endTime;
+    });
+    const result=[];
+    for(let i=0;i<requests.length;i++){
+    const current=requests[i];
+    let next;
+    while(i<requests.length){
+    next=requests[i+1];
+    if(!next||!areSimilarRequests(next,current)){
+    break;
+    }
+    current.url=current.abbreviatedUrl;
+    current.endTime=Math.max(current.endTime,next.endTime);
+    current.duration=current.endTime-current.startTime;
+    i++;
+    }
+    result.push(current);
+    }
+    result.sort((a,b)=>a.startTime-b.startTime);
+    return result;
+    }
+    
+    
+    
+    
+    
+    function computeSelfTimes(requests){
+    if(!requests.length){
+    return[];
+    }
+    
+    let bottlneckRequest=assert(requests[0]);
+    bottlneckRequest.selfTime=bottlneckRequest.duration;
+    
+    let scanEnd=bottlneckRequest.startTime;
+    
+    for(const current of requests){
+    if(current.endTime<scanEnd||current==bottlneckRequest){
+    
+    continue;
+    }
+    const left=Math.max(scanEnd,current.startTime);
+    const right=Math.min(bottlneckRequest.endTime,current.endTime);
+    if(left<right){
+    
+    bottlneckRequest.selfTime-=right-left;
+    }
+    scanEnd=Math.max(scanEnd,right);
+    if(current.endTime>bottlneckRequest.endTime){
+    current.selfTime=current.endTime-left;
+    bottlneckRequest=current;
+    }
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    async function computeAdRequestWaterfall(trace,devtoolsLog,context){
+    const networkRecords=await NetworkRecords.request(devtoolsLog,context);
+    
+    const maybeFirstAdRequest=networkRecords.find(isAdRequest);
+    const criticalRequests=new Set();
+    if(maybeFirstAdRequest==null){
+    return Promise.resolve([]);
+    }
+    const firstAdRequest=assert(maybeFirstAdRequest);
+    const bidRequests=networkRecords.filter(r=>
+    !!getHeaderBidder(r.url)&&r.endTime<=firstAdRequest.startTime);
+    const summary=buildNetworkSummary(networkRecords,trace.traceEvents);
+    for(const req of[firstAdRequest,...bidRequests]){
+    linkGraph(summary,req,criticalRequests);
+    }
+    
+    const REQUEST_TYPES=new Set([
+    'Script','XHR','Fetch','EventStream','Document',undefined]);
+    const waterfall=Array.from(criticalRequests).
+    filter(r=>r.endTime<firstAdRequest.startTime).
+    filter(r=>REQUEST_TYPES.has(r.resourceType)).
+    filter(r=>r.mimeType!='text/css');
+    
+    
+    const timingsByRecord=
+    await getTimingsByRecord(trace,devtoolsLog,context);
+    const timedWaterfall=waterfall.map(req=>{
+    const{startTime,endTime}=timingsByRecord.get(req)||req;
+    return{
+    startTime,
+    endTime,
+    duration:endTime-startTime,
+    selfTime:0,
+    url:trimUrl(req.url),
+    abbreviatedUrl:getAbbreviatedUrl(req.url),
+    type:req.resourceType,
+    record:req};
+    
+    });
+    const result=computeSummaries(timedWaterfall);
+    computeSelfTimes(result);
+    return result;
+    }
+    
+    module.exports={
+    getTransitiveClosure,
+    getCriticalGraph,
+    computeAdRequestWaterfall};
+    
+    
+    },{"../utils/network-timing":138,"../utils/resource-classification":140,"./asserts":134,"./resource-classification":140,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/computed/page-dependency-graph":35,"lighthouse/lighthouse-core/lib/dependency-graph/base-node":57,"lighthouse/lighthouse-core/lib/dependency-graph/cpu-node.js":58,"lighthouse/lighthouse-core/lib/dependency-graph/network-node.js":59}],138:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const AdLanternMetric=require('../computed/ad-lantern-metric');
+    
+    const LoadSimulator=require('lighthouse/lighthouse-core/computed/load-simulator');
+    const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
+    const PageDependencyGraph=require('lighthouse/lighthouse-core/computed/page-dependency-graph');
+    const{isAdRequest,isBidRequest,isImplTag,isImpressionPing}=require('./resource-classification');
+    const{URL}=require('url');
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function getTagEndTime(networkRecords){
+    const tagRecord=networkRecords.find(
+    record=>isImplTag(new URL(record.url)));
+    return tagRecord?tagRecord.endTime:-1;
+    }
+    
+    
+    
+    
+    
+    
+    function getAdStartTime(networkRecords){
+    const firstAdRecord=networkRecords.find(isAdRequest);
+    return firstAdRecord?firstAdRecord.startTime:-1;
+    }
+    
+    
+    
+    
+    
+    
+    function getBidStartTime(networkRecords){
+    const firstBidRecord=networkRecords.find(isBidRequest);
+    return firstBidRecord?firstBidRecord.startTime:-1;
+    }
+    
+    
+    
+    
+    
+    
+    function getImpressionStartTime(networkRecords){
+    const firstImpressionRecord=networkRecords.find(
+    record=>isImpressionPing(record.url));
+    return firstImpressionRecord?firstImpressionRecord.startTime:-1;
+    }
+    
+    
+    
+    
+    
+    
+    
+    function getPageStartTime(networkRecords,defaultValue=-1){
+    const firstSuccessRecord=networkRecords.find(
+    record=>record.statusCode==200);
+    return firstSuccessRecord?firstSuccessRecord.startTime:defaultValue;
+    }
+    
+    
+    
+    
+    
+    
+    
+    function getPageResponseTime(networkRecords,defaultValue=-1){
+    const firstSuccessRecord=networkRecords.find(
+    record=>record.statusCode==200);
+    return firstSuccessRecord?
+    firstSuccessRecord.responseReceivedTime:defaultValue;
+    }
+    
+    
+    
+    
+    
+    
+    
+    async function getTimingsByRecord(trace,devtoolsLog,context){
+    
+    const timingsByRecord=new Map();
+    const networkRecords=await NetworkRecords.request(devtoolsLog,context);
+    if(context.settings.throttlingMethod=='simulate'){
+    
+    const documentNode=
+    
+    await PageDependencyGraph.request({trace,devtoolsLog},context);
+    const releventGraph=AdLanternMetric.getOptimisticGraph(documentNode);
+    const simulator=await LoadSimulator.request(
+    {devtoolsLog,settings:context.settings},context);
+    const{nodeTimings}=simulator.simulate(releventGraph,{});
+    for(const[{record},timing]of nodeTimings.entries()){
+    if(!record)continue;
+    timingsByRecord.set(record,timing);
+    }
+    }else{
+    const pageStartTime=getPageStartTime(networkRecords);
+    for(const record of networkRecords){
+    timingsByRecord.set(record,{
+    startTime:(record.startTime-pageStartTime)*1000,
+    endTime:(record.endTime-pageStartTime)*1000,
+    duration:(record.endTime-record.startTime)*1000});
+    
+    }
+    }
+    return timingsByRecord;
+    }
+    
+    
+    
+    
+    
+    function getScriptUrl(e){
+    if(!e.args.data){
+    return undefined;
+    }
+    if(!['EvaluateScript','FunctionCall'].includes(e.name)){
+    return undefined;
+    }
+    if(e.args.data.url){
+    return e.args.data.url;
+    }
+    if(e.args.data.stackTrace){
+    return e.args.data.stackTrace[0].url;
+    }
+    return undefined;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    async function getScriptEvaluationTimes(trace,devtoolsLog,context){
+    const networkRecords=await NetworkRecords.request(devtoolsLog,context);
+    const pageStartTime=getPageStartTime(networkRecords)*1000;
+    
+    const results=new Map();
+    for(const e of trace.traceEvents){
+    const script=getScriptUrl(e);
+    if(script&&!results.has(script)){
+    results.set(script,e.ts/1000-pageStartTime);
+    }
+    }
+    if(context.settings.throttlingMethod!=='simulate'){
+    return results;
+    }
+    
+    const timingsByRecord=await getTimingsByRecord(trace,devtoolsLog,context);
+    for(const[req,timing]of timingsByRecord.entries()){
+    const scriptEvalTime=results.get(req.url);
+    if(!scriptEvalTime){
+    continue;
+    }
+    const unsimulatedNetworkTime=req.startTime*1000-pageStartTime;
+    const simulatedNetworkTime=timing.endTime;
+    
+    const cpuFactor=context.settings.throttling.cpuSlowdownMultiplier;
+    
+    const unsimulatedCpuTime=scriptEvalTime-unsimulatedNetworkTime;
+    const simulatedCpuTime=cpuFactor*unsimulatedCpuTime;
+    
+    results.set(req.url,simulatedNetworkTime+simulatedCpuTime);
+    }
+    return results;
+    }
+    
+    module.exports={
+    getTagEndTime,
+    getImpressionStartTime,
+    getAdStartTime,
+    getBidStartTime,
+    getPageStartTime,
+    getPageResponseTime,
+    getTimingsByRecord,
+    getScriptEvaluationTimes};
+    
+    
+    },{"../computed/ad-lantern-metric":126,"./resource-classification":140,"lighthouse/lighthouse-core/computed/load-simulator":10,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/computed/page-dependency-graph":35,"url":"url"}],139:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const CacheHeaders=require('lighthouse/lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl');
+    
+    const{parse:parseCacheControl}=require('@tusbar/cache-control');
+    
+    
+    
+    
+    
+    
+    function getHeader(req,header){
+    const lowerHeader=header.toLowerCase();
+    return(req.responseHeaders||[]).find(
+    h=>h.name.toLowerCase()===lowerHeader);
+    }
+    
+    
+    
+    
+    
+    
+    function isCacheable(req){
+    
+    if(!CacheHeaders.isCacheableAsset(req)){
+    return false;
+    }
+    const cacheControlHeader=getHeader(req,'cache-control');
+    if(cacheControlHeader){
+    try{
+    const cacheControl=parseCacheControl(cacheControlHeader.value);
+    if(cacheControl.noStore||cacheControl.noCache||
+    cacheControl.maxAge===0){
+    return false;
+    }
+    }catch(e){}
+    return true;
+    }
+    
+    return!!getHeader(req,'expires')||!!getHeader(req,'last-modified');
+    }
+    
+    module.exports={
+    isCacheable};
+    
+    
+    },{"@tusbar/cache-control":91,"lighthouse/lighthouse-core/audits/byte-efficiency/uses-long-cache-ttl":"../audits/byte-efficiency/uses-long-cache-ttl"}],140:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const bidderPatterns=require('./bidder-patterns');
+    const{isCacheable}=require('../utils/network');
+    const{URL}=require('url');
+    
+    
+    
+    
+    
+    
+    
+    function toURL(urlOrStr){
+    return typeof urlOrStr==='string'?new URL(urlOrStr):urlOrStr;
+    }
+    
+    
+    
+    
+    
+    
+    function isGoogleAds(url){
+    return /(^|\.)(doubleclick.net|google(syndication|tagservices).com)$/.
+    test(url.hostname);
+    }
+    
+    
+    
+    
+    
+    
+    function isAdSenseTag(url){
+    url=toURL(url);
+    const matchesHost=url.host==='pagead2.googlesyndication.com';
+    const matchesPath=
+    [
+    '/pagead/js/adsbygoogle.js',
+    '/pagead/show_ads.js'].
+    includes(url.pathname);
+    return matchesHost&&matchesPath;
+    }
+    
+    
+    
+    
+    
+    
+    function isAdSenseImplTag(url){
+    url=toURL(url);
+    const matchesHost=url.host==='pagead2.googlesyndication.com';
+    const matchesPath=
+    /(^\/pagead\/js\/.*\/show_ads_impl\.js)/.test(url.pathname);
+    return matchesHost&&matchesPath;
+    }
+    
+    
+    
+    
+    
+    
+    function isAdSense(url){
+    return isAdSenseTag(url)||isAdSenseImplTag(url);
+    }
+    
+    
+    
+    
+    
+    
+    function isAdSenseAdRequest(request){
+    if(!request)return false;
+    const url=new URL(request.url);
+    return(
+    url.pathname==='/pagead/ads'&&
+    url.host==='googleads.g.doubleclick.net');
+    
+    }
+    
+    
+    
+    
+    
+    function isAdSenseIframe(iframe){
+    return /(^aswift_\d+)/.test(iframe.id);
+    }
+    
+    
+    
+    
+    
+    
+    function isImpressionPing(url){
+    const{host,pathname}=toURL(url);
+    return(
+    [
+    'securepubads.g.doubleclick.net',
+    'googleads4.g.doubleclick.net'].
+    includes(host)&&
+    ['/pcs/view','/pagead/adview'].includes(pathname));
+    
+    }
+    
+    
+    
+    
+    
+    
+    function isGptTag(url){
+    const{host,pathname}=toURL(url);
+    const matchesHost=[
+    'www.googletagservices.com',
+    'securepubads.g.doubleclick.net'].includes(host);
+    const matchesPath=
+    ['/tag/js/gpt.js','/tag/js/gpt_mobile.js'].includes(pathname);
+    return matchesHost&&matchesPath;
+    }
+    
+    
+    
+    
+    
+    
+    function isGptImplTag(url){
+    return(
+    /(^\/gpt\/pubads_impl([a-z_]*)((?<!rendering)_)\d+\.js)/.
+    test(toURL(url).pathname));
+    
+    }
+    
+    
+    
+    
+    
+    
+    function isGpt(url){
+    return isGptTag(url)||isGptImplTag(url);
+    }
+    
+    
+    
+    
+    
+    
+    function isGptAdRequest(request){
+    if(!request)return false;
+    const url=new URL(request.url);
+    return(
+    url.pathname==='/gampad/ads'&&
+    url.host==='securepubads.g.doubleclick.net'&&
+    request.resourceType==='XHR');
+    
+    }
+    
+    
+    
+    
+    
+    function isGptIframe(iframe){
+    return /(^google_ads_iframe_)/.test(iframe.id);
+    }
+    
+    
+    
+    
+    
+    
+    function isAdTag(url){
+    return isAdSenseTag(url)||isGptTag(url);
+    }
+    
+    
+    
+    
+    
+    
+    function isAdScript(url){
+    return isAdSense(url)||isGpt(url);
+    }
+    
+    
+    
+    
+    
+    
+    function isAdRequest(request){
+    return isAdSenseAdRequest(request)||isGptAdRequest(request);
+    }
+    
+    
+    
+    
+    
+    
+    function isAdIframe(iframe){
+    return isAdSenseIframe(iframe)||isGptIframe(iframe);
+    }
+    
+    
+    
+    
+    
+    
+    function isImplTag(url){
+    return isAdSenseTag(url)||isGptImplTag(url);
+    }
+    
+    
+    
+    
+    
+    
+    
+    function containsAnySubstring(str,substrings){
+    return substrings.some(substring=>str.includes(substring));
+    }
+    
+    
+    
+    
+    
+    
+    function hasImpressionPath(url){
+    return url.pathname==='/pcs/view'||
+    url.pathname==='/pagead/adview';
+    }
+    
+    
+    
+    
+    
+    
+    function getHeaderBidder(url){
+    for(const def of bidderPatterns){
+    for(const pattern of def.patterns){
+    if(new RegExp(pattern).test(url)){
+    return def.label;
+    }
+    }
+    }
+    return undefined;
+    }
+    
+    
+    
+    
+    
+    
+    
+    function isBidRelatedRequest(requestOrUrl){
+    return!!getHeaderBidder(
+    typeof requestOrUrl=='string'?requestOrUrl:requestOrUrl.url);
+    }
+    
+    
+    
+    
+    
+    
+    function isPossibleBidRequest(req){
+    return(req.resourceSize==null||req.resourceSize>0)&&
+    req.resourceType!='Image'&&
+    !isCacheable(req);
+    }
+    
+    
+    
+    
+    
+    
+    function isBidRequest(req){
+    return isBidRelatedRequest(req)&&isPossibleBidRequest(req);
+    }
+    
+    
+    
+    
+    
+    function isStaticRequest(request){
+    
+    return['parser','preload','other'].includes(request.initiator.type);
+    }
+    
+    
+    
+    
+    
+    
+    function trimUrl(url){
+    const u=new URL(url);
+    const PATH_MAX=60;
+    const path=u.pathname.length>PATH_MAX?
+    u.pathname.substr(0,PATH_MAX)+'...':u.pathname;
+    return u.origin+path;
+    }
+    
+    
+    
+    
+    
+    
+    
+    function getAbbreviatedUrl(url){
+    const u=new URL(trimUrl(url));
+    const parts=u.pathname.split('/');
+    if(parts.length>4){
+    u.pathname=[...parts.splice(0,4),'...'].join('/');
+    }
+    return u.toString();
+    }
+    
+    module.exports={
+    isGoogleAds,
+    isGptAdRequest,
+    isImpressionPing,
+    isGpt,
+    isAdSense,
+    isAdSenseTag,
+    isAdSenseImplTag,
+    isAdSenseAdRequest,
+    isAdSenseIframe,
+    isGptTag,
+    isGptImplTag,
+    isGptIframe,
+    isAdTag,
+    isAdScript,
+    isAdRequest,
+    isAdIframe,
+    isImplTag,
+    containsAnySubstring,
+    hasImpressionPath,
+    getHeaderBidder,
+    isBidRelatedRequest,
+    isBidRequest,
+    isStaticRequest,
+    trimUrl,
+    getAbbreviatedUrl};
+    
+    
+    },{"../utils/network":139,"./bidder-patterns":135,"url":"url"}],141:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function getAttributableUrl(longTask,knownScripts=new Set()){
+    const scriptUrl=longTask.attributableURLs.find(
+    url=>knownScripts.has(url));
+    const fallbackUrl=longTask.attributableURLs[0]||
+    (longTask.event.args.data||{}).url;
+    const attributableUrl=scriptUrl||fallbackUrl;
+    
+    if(attributableUrl){
+    return attributableUrl;
+    }
+    let maxChildDuration=50;
+    let childUrl='';
+    for(const child of longTask.children){
+    const url=getAttributableUrl(child,knownScripts);
+    if(url&&child.duration>maxChildDuration){
+    childUrl=url;
+    maxChildDuration=child.duration;
+    }
+    }
+    return childUrl;
+    }
+    
+    module.exports={getAttributableUrl};
+    
+    },{}],142:[function(require,module,exports){
+    (function(global){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    var LARGE_ARRAY_SIZE=200;
+    
+    
+    var HASH_UNDEFINED='__lodash_hash_undefined__';
+    
+    
+    var COMPARE_PARTIAL_FLAG=1,
+    COMPARE_UNORDERED_FLAG=2;
+    
+    
+    var MAX_SAFE_INTEGER=9007199254740991;
+    
+    
+    var argsTag='[object Arguments]',
+    arrayTag='[object Array]',
+    asyncTag='[object AsyncFunction]',
+    boolTag='[object Boolean]',
+    dateTag='[object Date]',
+    errorTag='[object Error]',
+    funcTag='[object Function]',
+    genTag='[object GeneratorFunction]',
+    mapTag='[object Map]',
+    numberTag='[object Number]',
+    nullTag='[object Null]',
+    objectTag='[object Object]',
+    promiseTag='[object Promise]',
+    proxyTag='[object Proxy]',
+    regexpTag='[object RegExp]',
+    setTag='[object Set]',
+    stringTag='[object String]',
+    symbolTag='[object Symbol]',
+    undefinedTag='[object Undefined]',
+    weakMapTag='[object WeakMap]';
+    
+    var arrayBufferTag='[object ArrayBuffer]',
+    dataViewTag='[object DataView]',
+    float32Tag='[object Float32Array]',
+    float64Tag='[object Float64Array]',
+    int8Tag='[object Int8Array]',
+    int16Tag='[object Int16Array]',
+    int32Tag='[object Int32Array]',
+    uint8Tag='[object Uint8Array]',
+    uint8ClampedTag='[object Uint8ClampedArray]',
+    uint16Tag='[object Uint16Array]',
+    uint32Tag='[object Uint32Array]';
+    
+    
+    
+    
+    
+    var reRegExpChar=/[\\^$.*+?()[\]{}|]/g;
+    
+    
+    var reIsHostCtor=/^\[object .+?Constructor\]$/;
+    
+    
+    var reIsUint=/^(?:0|[1-9]\d*)$/;
+    
+    
+    var typedArrayTags={};
+    typedArrayTags[float32Tag]=typedArrayTags[float64Tag]=
+    typedArrayTags[int8Tag]=typedArrayTags[int16Tag]=
+    typedArrayTags[int32Tag]=typedArrayTags[uint8Tag]=
+    typedArrayTags[uint8ClampedTag]=typedArrayTags[uint16Tag]=
+    typedArrayTags[uint32Tag]=true;
+    typedArrayTags[argsTag]=typedArrayTags[arrayTag]=
+    typedArrayTags[arrayBufferTag]=typedArrayTags[boolTag]=
+    typedArrayTags[dataViewTag]=typedArrayTags[dateTag]=
+    typedArrayTags[errorTag]=typedArrayTags[funcTag]=
+    typedArrayTags[mapTag]=typedArrayTags[numberTag]=
+    typedArrayTags[objectTag]=typedArrayTags[regexpTag]=
+    typedArrayTags[setTag]=typedArrayTags[stringTag]=
+    typedArrayTags[weakMapTag]=false;
+    
+    
+    var freeGlobal=typeof global=='object'&&global&&global.Object===Object&&global;
+    
+    
+    var freeSelf=typeof self=='object'&&self&&self.Object===Object&&self;
+    
+    
+    var root=freeGlobal||freeSelf||Function('return this')();
+    
+    
+    var freeExports=typeof exports=='object'&&exports&&!exports.nodeType&&exports;
+    
+    
+    var freeModule=freeExports&&typeof module=='object'&&module&&!module.nodeType&&module;
+    
+    
+    var moduleExports=freeModule&&freeModule.exports===freeExports;
+    
+    
+    var freeProcess=moduleExports&&freeGlobal.process;
+    
+    
+    var nodeUtil=function(){
+    try{
+    return freeProcess&&freeProcess.binding&&freeProcess.binding('util');
+    }catch(e){}
+    }();
+    
+    
+    var nodeIsTypedArray=nodeUtil&&nodeUtil.isTypedArray;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function arrayFilter(array,predicate){
+    var index=-1,
+    length=array==null?0:array.length,
+    resIndex=0,
+    result=[];
+    
+    while(++index<length){
+    var value=array[index];
+    if(predicate(value,index,array)){
+    result[resIndex++]=value;
+    }
+    }
+    return result;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function arrayPush(array,values){
+    var index=-1,
+    length=values.length,
+    offset=array.length;
+    
+    while(++index<length){
+    array[offset+index]=values[index];
+    }
+    return array;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function arraySome(array,predicate){
+    var index=-1,
+    length=array==null?0:array.length;
+    
+    while(++index<length){
+    if(predicate(array[index],index,array)){
+    return true;
+    }
+    }
+    return false;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function baseTimes(n,iteratee){
+    var index=-1,
+    result=Array(n);
+    
+    while(++index<n){
+    result[index]=iteratee(index);
+    }
+    return result;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function baseUnary(func){
+    return function(value){
+    return func(value);
+    };
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function cacheHas(cache,key){
+    return cache.has(key);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function getValue(object,key){
+    return object==null?undefined:object[key];
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function mapToArray(map){
+    var index=-1,
+    result=Array(map.size);
+    
+    map.forEach(function(value,key){
+    result[++index]=[key,value];
+    });
+    return result;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function overArg(func,transform){
+    return function(arg){
+    return func(transform(arg));
+    };
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function setToArray(set){
+    var index=-1,
+    result=Array(set.size);
+    
+    set.forEach(function(value){
+    result[++index]=value;
+    });
+    return result;
+    }
+    
+    
+    var arrayProto=Array.prototype,
+    funcProto=Function.prototype,
+    objectProto=Object.prototype;
+    
+    
+    var coreJsData=root['__core-js_shared__'];
+    
+    
+    var funcToString=funcProto.toString;
+    
+    
+    var hasOwnProperty=objectProto.hasOwnProperty;
+    
+    
+    var maskSrcKey=function(){
+    var uid=/[^.]+$/.exec(coreJsData&&coreJsData.keys&&coreJsData.keys.IE_PROTO||'');
+    return uid?'Symbol(src)_1.'+uid:'';
+    }();
+    
+    
+    
+    
+    
+    
+    var nativeObjectToString=objectProto.toString;
+    
+    
+    var reIsNative=RegExp('^'+
+    funcToString.call(hasOwnProperty).replace(reRegExpChar,'\\$&').
+    replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,'$1.*?')+'$');
+    
+    
+    
+    var Buffer=moduleExports?root.Buffer:undefined,
+    Symbol=root.Symbol,
+    Uint8Array=root.Uint8Array,
+    propertyIsEnumerable=objectProto.propertyIsEnumerable,
+    splice=arrayProto.splice,
+    symToStringTag=Symbol?Symbol.toStringTag:undefined;
+    
+    
+    var nativeGetSymbols=Object.getOwnPropertySymbols,
+    nativeIsBuffer=Buffer?Buffer.isBuffer:undefined,
+    nativeKeys=overArg(Object.keys,Object);
+    
+    
+    var DataView=getNative(root,'DataView'),
+    Map=getNative(root,'Map'),
+    Promise=getNative(root,'Promise'),
+    Set=getNative(root,'Set'),
+    WeakMap=getNative(root,'WeakMap'),
+    nativeCreate=getNative(Object,'create');
+    
+    
+    var dataViewCtorString=toSource(DataView),
+    mapCtorString=toSource(Map),
+    promiseCtorString=toSource(Promise),
+    setCtorString=toSource(Set),
+    weakMapCtorString=toSource(WeakMap);
+    
+    
+    var symbolProto=Symbol?Symbol.prototype:undefined,
+    symbolValueOf=symbolProto?symbolProto.valueOf:undefined;
+    
+    
+    
+    
+    
+    
+    
+    
+    function Hash(entries){
+    var index=-1,
+    length=entries==null?0:entries.length;
+    
+    this.clear();
+    while(++index<length){
+    var entry=entries[index];
+    this.set(entry[0],entry[1]);
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function hashClear(){
+    this.__data__=nativeCreate?nativeCreate(null):{};
+    this.size=0;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function hashDelete(key){
+    var result=this.has(key)&&delete this.__data__[key];
+    this.size-=result?1:0;
+    return result;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function hashGet(key){
+    var data=this.__data__;
+    if(nativeCreate){
+    var result=data[key];
+    return result===HASH_UNDEFINED?undefined:result;
+    }
+    return hasOwnProperty.call(data,key)?data[key]:undefined;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function hashHas(key){
+    var data=this.__data__;
+    return nativeCreate?data[key]!==undefined:hasOwnProperty.call(data,key);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function hashSet(key,value){
+    var data=this.__data__;
+    this.size+=this.has(key)?0:1;
+    data[key]=nativeCreate&&value===undefined?HASH_UNDEFINED:value;
+    return this;
+    }
+    
+    
+    Hash.prototype.clear=hashClear;
+    Hash.prototype['delete']=hashDelete;
+    Hash.prototype.get=hashGet;
+    Hash.prototype.has=hashHas;
+    Hash.prototype.set=hashSet;
+    
+    
+    
+    
+    
+    
+    
+    
+    function ListCache(entries){
+    var index=-1,
+    length=entries==null?0:entries.length;
+    
+    this.clear();
+    while(++index<length){
+    var entry=entries[index];
+    this.set(entry[0],entry[1]);
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function listCacheClear(){
+    this.__data__=[];
+    this.size=0;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function listCacheDelete(key){
+    var data=this.__data__,
+    index=assocIndexOf(data,key);
+    
+    if(index<0){
+    return false;
+    }
+    var lastIndex=data.length-1;
+    if(index==lastIndex){
+    data.pop();
+    }else{
+    splice.call(data,index,1);
+    }
+    --this.size;
+    return true;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function listCacheGet(key){
+    var data=this.__data__,
+    index=assocIndexOf(data,key);
+    
+    return index<0?undefined:data[index][1];
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function listCacheHas(key){
+    return assocIndexOf(this.__data__,key)>-1;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function listCacheSet(key,value){
+    var data=this.__data__,
+    index=assocIndexOf(data,key);
+    
+    if(index<0){
+    ++this.size;
+    data.push([key,value]);
+    }else{
+    data[index][1]=value;
+    }
+    return this;
+    }
+    
+    
+    ListCache.prototype.clear=listCacheClear;
+    ListCache.prototype['delete']=listCacheDelete;
+    ListCache.prototype.get=listCacheGet;
+    ListCache.prototype.has=listCacheHas;
+    ListCache.prototype.set=listCacheSet;
+    
+    
+    
+    
+    
+    
+    
+    
+    function MapCache(entries){
+    var index=-1,
+    length=entries==null?0:entries.length;
+    
+    this.clear();
+    while(++index<length){
+    var entry=entries[index];
+    this.set(entry[0],entry[1]);
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function mapCacheClear(){
+    this.size=0;
+    this.__data__={
+    'hash':new Hash(),
+    'map':new(Map||ListCache)(),
+    'string':new Hash()};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function mapCacheDelete(key){
+    var result=getMapData(this,key)['delete'](key);
+    this.size-=result?1:0;
+    return result;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function mapCacheGet(key){
+    return getMapData(this,key).get(key);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function mapCacheHas(key){
+    return getMapData(this,key).has(key);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function mapCacheSet(key,value){
+    var data=getMapData(this,key),
+    size=data.size;
+    
+    data.set(key,value);
+    this.size+=data.size==size?0:1;
+    return this;
+    }
+    
+    
+    MapCache.prototype.clear=mapCacheClear;
+    MapCache.prototype['delete']=mapCacheDelete;
+    MapCache.prototype.get=mapCacheGet;
+    MapCache.prototype.has=mapCacheHas;
+    MapCache.prototype.set=mapCacheSet;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function SetCache(values){
+    var index=-1,
+    length=values==null?0:values.length;
+    
+    this.__data__=new MapCache();
+    while(++index<length){
+    this.add(values[index]);
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function setCacheAdd(value){
+    this.__data__.set(value,HASH_UNDEFINED);
+    return this;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function setCacheHas(value){
+    return this.__data__.has(value);
+    }
+    
+    
+    SetCache.prototype.add=SetCache.prototype.push=setCacheAdd;
+    SetCache.prototype.has=setCacheHas;
+    
+    
+    
+    
+    
+    
+    
+    
+    function Stack(entries){
+    var data=this.__data__=new ListCache(entries);
+    this.size=data.size;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function stackClear(){
+    this.__data__=new ListCache();
+    this.size=0;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function stackDelete(key){
+    var data=this.__data__,
+    result=data['delete'](key);
+    
+    this.size=data.size;
+    return result;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function stackGet(key){
+    return this.__data__.get(key);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function stackHas(key){
+    return this.__data__.has(key);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function stackSet(key,value){
+    var data=this.__data__;
+    if(data instanceof ListCache){
+    var pairs=data.__data__;
+    if(!Map||pairs.length<LARGE_ARRAY_SIZE-1){
+    pairs.push([key,value]);
+    this.size=++data.size;
+    return this;
+    }
+    data=this.__data__=new MapCache(pairs);
+    }
+    data.set(key,value);
+    this.size=data.size;
+    return this;
+    }
+    
+    
+    Stack.prototype.clear=stackClear;
+    Stack.prototype['delete']=stackDelete;
+    Stack.prototype.get=stackGet;
+    Stack.prototype.has=stackHas;
+    Stack.prototype.set=stackSet;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function arrayLikeKeys(value,inherited){
+    var isArr=isArray(value),
+    isArg=!isArr&&isArguments(value),
+    isBuff=!isArr&&!isArg&&isBuffer(value),
+    isType=!isArr&&!isArg&&!isBuff&&isTypedArray(value),
+    skipIndexes=isArr||isArg||isBuff||isType,
+    result=skipIndexes?baseTimes(value.length,String):[],
+    length=result.length;
+    
+    for(var key in value){
+    if((inherited||hasOwnProperty.call(value,key))&&
+    !(skipIndexes&&(
+    
+    key=='length'||
+    
+    isBuff&&(key=='offset'||key=='parent')||
+    
+    isType&&(key=='buffer'||key=='byteLength'||key=='byteOffset')||
+    
+    isIndex(key,length))))
+    {
+    result.push(key);
+    }
+    }
+    return result;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function assocIndexOf(array,key){
+    var length=array.length;
+    while(length--){
+    if(eq(array[length][0],key)){
+    return length;
+    }
+    }
+    return-1;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function baseGetAllKeys(object,keysFunc,symbolsFunc){
+    var result=keysFunc(object);
+    return isArray(object)?result:arrayPush(result,symbolsFunc(object));
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function baseGetTag(value){
+    if(value==null){
+    return value===undefined?undefinedTag:nullTag;
+    }
+    return symToStringTag&&symToStringTag in Object(value)?
+    getRawTag(value):
+    objectToString(value);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function baseIsArguments(value){
+    return isObjectLike(value)&&baseGetTag(value)==argsTag;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function baseIsEqual(value,other,bitmask,customizer,stack){
+    if(value===other){
+    return true;
+    }
+    if(value==null||other==null||!isObjectLike(value)&&!isObjectLike(other)){
+    return value!==value&&other!==other;
+    }
+    return baseIsEqualDeep(value,other,bitmask,customizer,baseIsEqual,stack);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function baseIsEqualDeep(object,other,bitmask,customizer,equalFunc,stack){
+    var objIsArr=isArray(object),
+    othIsArr=isArray(other),
+    objTag=objIsArr?arrayTag:getTag(object),
+    othTag=othIsArr?arrayTag:getTag(other);
+    
+    objTag=objTag==argsTag?objectTag:objTag;
+    othTag=othTag==argsTag?objectTag:othTag;
+    
+    var objIsObj=objTag==objectTag,
+    othIsObj=othTag==objectTag,
+    isSameTag=objTag==othTag;
+    
+    if(isSameTag&&isBuffer(object)){
+    if(!isBuffer(other)){
+    return false;
+    }
+    objIsArr=true;
+    objIsObj=false;
+    }
+    if(isSameTag&&!objIsObj){
+    stack||(stack=new Stack());
+    return objIsArr||isTypedArray(object)?
+    equalArrays(object,other,bitmask,customizer,equalFunc,stack):
+    equalByTag(object,other,objTag,bitmask,customizer,equalFunc,stack);
+    }
+    if(!(bitmask&COMPARE_PARTIAL_FLAG)){
+    var objIsWrapped=objIsObj&&hasOwnProperty.call(object,'__wrapped__'),
+    othIsWrapped=othIsObj&&hasOwnProperty.call(other,'__wrapped__');
+    
+    if(objIsWrapped||othIsWrapped){
+    var objUnwrapped=objIsWrapped?object.value():object,
+    othUnwrapped=othIsWrapped?other.value():other;
+    
+    stack||(stack=new Stack());
+    return equalFunc(objUnwrapped,othUnwrapped,bitmask,customizer,stack);
+    }
+    }
+    if(!isSameTag){
+    return false;
+    }
+    stack||(stack=new Stack());
+    return equalObjects(object,other,bitmask,customizer,equalFunc,stack);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function baseIsNative(value){
+    if(!isObject(value)||isMasked(value)){
+    return false;
+    }
+    var pattern=isFunction(value)?reIsNative:reIsHostCtor;
+    return pattern.test(toSource(value));
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function baseIsTypedArray(value){
+    return isObjectLike(value)&&
+    isLength(value.length)&&!!typedArrayTags[baseGetTag(value)];
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function baseKeys(object){
+    if(!isPrototype(object)){
+    return nativeKeys(object);
+    }
+    var result=[];
+    for(var key in Object(object)){
+    if(hasOwnProperty.call(object,key)&&key!='constructor'){
+    result.push(key);
+    }
+    }
+    return result;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function equalArrays(array,other,bitmask,customizer,equalFunc,stack){
+    var isPartial=bitmask&COMPARE_PARTIAL_FLAG,
+    arrLength=array.length,
+    othLength=other.length;
+    
+    if(arrLength!=othLength&&!(isPartial&&othLength>arrLength)){
+    return false;
+    }
+    
+    var stacked=stack.get(array);
+    if(stacked&&stack.get(other)){
+    return stacked==other;
+    }
+    var index=-1,
+    result=true,
+    seen=bitmask&COMPARE_UNORDERED_FLAG?new SetCache():undefined;
+    
+    stack.set(array,other);
+    stack.set(other,array);
+    
+    
+    while(++index<arrLength){
+    var arrValue=array[index],
+    othValue=other[index];
+    
+    if(customizer){
+    var compared=isPartial?
+    customizer(othValue,arrValue,index,other,array,stack):
+    customizer(arrValue,othValue,index,array,other,stack);
+    }
+    if(compared!==undefined){
+    if(compared){
+    continue;
+    }
+    result=false;
+    break;
+    }
+    
+    if(seen){
+    if(!arraySome(other,function(othValue,othIndex){
+    if(!cacheHas(seen,othIndex)&&(
+    arrValue===othValue||equalFunc(arrValue,othValue,bitmask,customizer,stack))){
+    return seen.push(othIndex);
+    }
+    })){
+    result=false;
+    break;
+    }
+    }else if(!(
+    arrValue===othValue||
+    equalFunc(arrValue,othValue,bitmask,customizer,stack)))
+    {
+    result=false;
+    break;
+    }
+    }
+    stack['delete'](array);
+    stack['delete'](other);
+    return result;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function equalByTag(object,other,tag,bitmask,customizer,equalFunc,stack){
+    switch(tag){
+    case dataViewTag:
+    if(object.byteLength!=other.byteLength||
+    object.byteOffset!=other.byteOffset){
+    return false;
+    }
+    object=object.buffer;
+    other=other.buffer;
+    
+    case arrayBufferTag:
+    if(object.byteLength!=other.byteLength||
+    !equalFunc(new Uint8Array(object),new Uint8Array(other))){
+    return false;
+    }
+    return true;
+    
+    case boolTag:
+    case dateTag:
+    case numberTag:
+    
+    
+    return eq(+object,+other);
+    
+    case errorTag:
+    return object.name==other.name&&object.message==other.message;
+    
+    case regexpTag:
+    case stringTag:
+    
+    
+    
+    return object==other+'';
+    
+    case mapTag:
+    var convert=mapToArray;
+    
+    case setTag:
+    var isPartial=bitmask&COMPARE_PARTIAL_FLAG;
+    convert||(convert=setToArray);
+    
+    if(object.size!=other.size&&!isPartial){
+    return false;
+    }
+    
+    var stacked=stack.get(object);
+    if(stacked){
+    return stacked==other;
+    }
+    bitmask|=COMPARE_UNORDERED_FLAG;
+    
+    
+    stack.set(object,other);
+    var result=equalArrays(convert(object),convert(other),bitmask,customizer,equalFunc,stack);
+    stack['delete'](object);
+    return result;
+    
+    case symbolTag:
+    if(symbolValueOf){
+    return symbolValueOf.call(object)==symbolValueOf.call(other);
+    }}
+    
+    return false;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function equalObjects(object,other,bitmask,customizer,equalFunc,stack){
+    var isPartial=bitmask&COMPARE_PARTIAL_FLAG,
+    objProps=getAllKeys(object),
+    objLength=objProps.length,
+    othProps=getAllKeys(other),
+    othLength=othProps.length;
+    
+    if(objLength!=othLength&&!isPartial){
+    return false;
+    }
+    var index=objLength;
+    while(index--){
+    var key=objProps[index];
+    if(!(isPartial?key in other:hasOwnProperty.call(other,key))){
+    return false;
+    }
+    }
+    
+    var stacked=stack.get(object);
+    if(stacked&&stack.get(other)){
+    return stacked==other;
+    }
+    var result=true;
+    stack.set(object,other);
+    stack.set(other,object);
+    
+    var skipCtor=isPartial;
+    while(++index<objLength){
+    key=objProps[index];
+    var objValue=object[key],
+    othValue=other[key];
+    
+    if(customizer){
+    var compared=isPartial?
+    customizer(othValue,objValue,key,other,object,stack):
+    customizer(objValue,othValue,key,object,other,stack);
+    }
+    
+    if(!(compared===undefined?
+    objValue===othValue||equalFunc(objValue,othValue,bitmask,customizer,stack):
+    compared))
+    {
+    result=false;
+    break;
+    }
+    skipCtor||(skipCtor=key=='constructor');
+    }
+    if(result&&!skipCtor){
+    var objCtor=object.constructor,
+    othCtor=other.constructor;
+    
+    
+    if(objCtor!=othCtor&&
+    'constructor'in object&&'constructor'in other&&
+    !(typeof objCtor=='function'&&objCtor instanceof objCtor&&
+    typeof othCtor=='function'&&othCtor instanceof othCtor)){
+    result=false;
+    }
+    }
+    stack['delete'](object);
+    stack['delete'](other);
+    return result;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function getAllKeys(object){
+    return baseGetAllKeys(object,keys,getSymbols);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function getMapData(map,key){
+    var data=map.__data__;
+    return isKeyable(key)?
+    data[typeof key=='string'?'string':'hash']:
+    data.map;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function getNative(object,key){
+    var value=getValue(object,key);
+    return baseIsNative(value)?value:undefined;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function getRawTag(value){
+    var isOwn=hasOwnProperty.call(value,symToStringTag),
+    tag=value[symToStringTag];
+    
+    try{
+    value[symToStringTag]=undefined;
+    var unmasked=true;
+    }catch(e){}
+    
+    var result=nativeObjectToString.call(value);
+    if(unmasked){
+    if(isOwn){
+    value[symToStringTag]=tag;
+    }else{
+    delete value[symToStringTag];
+    }
+    }
+    return result;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    var getSymbols=!nativeGetSymbols?stubArray:function(object){
+    if(object==null){
+    return[];
+    }
+    object=Object(object);
+    return arrayFilter(nativeGetSymbols(object),function(symbol){
+    return propertyIsEnumerable.call(object,symbol);
+    });
+    };
+    
+    
+    
+    
+    
+    
+    
+    
+    var getTag=baseGetTag;
+    
+    
+    if(DataView&&getTag(new DataView(new ArrayBuffer(1)))!=dataViewTag||
+    Map&&getTag(new Map())!=mapTag||
+    Promise&&getTag(Promise.resolve())!=promiseTag||
+    Set&&getTag(new Set())!=setTag||
+    WeakMap&&getTag(new WeakMap())!=weakMapTag){
+    getTag=function(value){
+    var result=baseGetTag(value),
+    Ctor=result==objectTag?value.constructor:undefined,
+    ctorString=Ctor?toSource(Ctor):'';
+    
+    if(ctorString){
+    switch(ctorString){
+    case dataViewCtorString:return dataViewTag;
+    case mapCtorString:return mapTag;
+    case promiseCtorString:return promiseTag;
+    case setCtorString:return setTag;
+    case weakMapCtorString:return weakMapTag;}
+    
+    }
+    return result;
+    };
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function isIndex(value,length){
+    length=length==null?MAX_SAFE_INTEGER:length;
+    return!!length&&(
+    typeof value=='number'||reIsUint.test(value))&&
+    value>-1&&value%1==0&&value<length;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function isKeyable(value){
+    var type=typeof value;
+    return type=='string'||type=='number'||type=='symbol'||type=='boolean'?
+    value!=='__proto__':
+    value===null;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function isMasked(func){
+    return!!maskSrcKey&&maskSrcKey in func;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function isPrototype(value){
+    var Ctor=value&&value.constructor,
+    proto=typeof Ctor=='function'&&Ctor.prototype||objectProto;
+    
+    return value===proto;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function objectToString(value){
+    return nativeObjectToString.call(value);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function toSource(func){
+    if(func!=null){
+    try{
+    return funcToString.call(func);
+    }catch(e){}
+    try{
+    return func+'';
+    }catch(e){}
+    }
+    return'';
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function eq(value,other){
+    return value===other||value!==value&&other!==other;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    var isArguments=baseIsArguments(function(){return arguments;}())?baseIsArguments:function(value){
+    return isObjectLike(value)&&hasOwnProperty.call(value,'callee')&&
+    !propertyIsEnumerable.call(value,'callee');
+    };
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    var isArray=Array.isArray;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function isArrayLike(value){
+    return value!=null&&isLength(value.length)&&!isFunction(value);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    var isBuffer=nativeIsBuffer||stubFalse;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function isEqual(value,other){
+    return baseIsEqual(value,other);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function isFunction(value){
+    if(!isObject(value)){
+    return false;
+    }
+    
+    
+    var tag=baseGetTag(value);
+    return tag==funcTag||tag==genTag||tag==asyncTag||tag==proxyTag;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function isLength(value){
+    return typeof value=='number'&&
+    value>-1&&value%1==0&&value<=MAX_SAFE_INTEGER;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function isObject(value){
+    var type=typeof value;
+    return value!=null&&(type=='object'||type=='function');
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function isObjectLike(value){
+    return value!=null&&typeof value=='object';
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    var isTypedArray=nodeIsTypedArray?baseUnary(nodeIsTypedArray):baseIsTypedArray;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function keys(object){
+    return isArrayLike(object)?arrayLikeKeys(object):baseKeys(object);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function stubArray(){
+    return[];
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function stubFalse(){
+    return false;
+    }
+    
+    module.exports=isEqual;
+    
+    }).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
+    },{}],143:[function(require,module,exports){
+    
+    
+    
+    module.exports=function lookupClosestLocale(locale,available){
+    if(typeof locale==='string'&&available[locale])return locale;
+    var locales=[].concat(locale||[]);
+    for(var l=0,ll=locales.length;l<ll;++l){
+    var current=locales[l].split('-');
+    while(current.length){
+    var candidate=current.join('-');
+    if(available[candidate])return candidate;
+    current.pop();
+    }
+    }
+    };
+    
+    },{}],144:[function(require,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports,'__esModule',{value:true});
+    
+    
+    var perf=typeof performance!=='undefined'&&performance;
+    
+    var now=perf&&perf.now?function(){return perf.now();}:function(){return Date.now();};
+    
+    function throwIfEmpty(name){
+    if(!name){
+    throw new Error('name must be non-empty');
+    }
+    }
+    
+    
+    function insertSorted(arr,item){
+    var low=0;
+    var high=arr.length;
+    var mid;
+    while(low<high){
+    mid=low+high>>>1;
+    if(arr[mid].startTime<item.startTime){
+    low=mid+1;
+    }else{
+    high=mid;
+    }
+    }
+    arr.splice(low,0,item);
+    }
+    
+    if(perf&&perf.mark){
+    exports.mark=function(name){
+    throwIfEmpty(name);
+    perf.mark("start "+name);
+    };
+    exports.stop=function(name){
+    throwIfEmpty(name);
+    perf.mark("end "+name);
+    perf.measure(name,"start "+name,"end "+name);
+    var entries=perf.getEntriesByName(name);
+    return entries[entries.length-1];
+    };
+    exports.getEntries=function(){return perf.getEntriesByType('measure');};
+    exports.clear=function(){
+    perf.clearMarks();
+    perf.clearMeasures();
+    };
+    }else{
+    var marks={};
+    var entries=[];
+    exports.mark=function(name){
+    throwIfEmpty(name);
+    var startTime=now();
+    marks['$'+name]=startTime;
+    };
+    exports.stop=function(name){
+    throwIfEmpty(name);
+    var endTime=now();
+    var startTime=marks['$'+name];
+    if(!startTime){
+    throw new Error("no known mark: "+name);
+    }
+    var entry={
+    startTime:startTime,
+    name:name,
+    duration:endTime-startTime,
+    entryType:'measure'};
+    
+    
+    
+    
+    insertSorted(entries,entry);
+    return entry;
+    };
+    exports.getEntries=function(){return entries;};
+    exports.clear=function(){entries=[];};
+    }
+    
+    },{}],145:[function(require,module,exports){
+    exports.getRenderingDataFromViewport=function(viewportProperties,uaDeviceWidth,uaDeviceHeight,uaMaxZoom,uaMinZoom){
+    
+    var vw=uaDeviceWidth/100;
+    var vh=uaDeviceHeight/100;
+    
+    
+    
+    var maxZoom=null;
+    var minZoom=null;
+    var zoom=null;
+    var minWidth=null;
+    var minHeight=null;
+    var maxWidth=null;
+    var maxHeight=null;
+    var width=null,height=null;
+    var initialWidth=uaDeviceWidth;
+    var initialHeight=uaDeviceHeight;
+    var userZoom="zoom";
+    
+    if(viewportProperties["maximum-scale"]!==undefined){
+    maxZoom=translateZoomProperty(viewportProperties["maximum-scale"]);
+    }
+    if(viewportProperties["minimum-scale"]!==undefined){
+    minZoom=translateZoomProperty(viewportProperties["minimum-scale"]);
+    }
+    if(viewportProperties["initial-scale"]!==undefined){
+    zoom=translateZoomProperty(viewportProperties["initial-scale"]);
+    }
+    
+    
+    
+    
+    
+    
+    
+    if(minZoom!==null&&maxZoom===null){
+    minZoom=min(uaMaxZoom,translateZoomProperty(viewportProperties["minimum-scale"]));
+    }
+    
+    if(viewportProperties["width"]!==undefined){
+    minWidth="extend-to-zoom";
+    maxWidth=translateLengthProperty(viewportProperties["width"],vw,vh);
+    }
+    
+    if(viewportProperties["height"]!==undefined){
+    minHeight="extend-to-zoom";
+    maxHeight=translateLengthProperty(viewportProperties["height"],vw,vh);
+    }
+    
+    
+    if(viewportProperties["user-scalable"]!==undefined){
+    userZoom=viewportProperties["user-scalable"];
+    if(typeof userZoom==="number"){
+    if(userZoom>=1||userZoom<=-1){
+    userZoom="zoom";
+    }else{
+    userZoom="fixed";
+    }
+    }else{
+    switch(userZoom){
+    case"yes":
+    case"device-width":
+    case"device-height":
+    userZoom="zoom";
+    break;
+    case"no":
+    default:
+    userZoom="fixed";
+    break;}
+    
+    }
+    }
+    
+    
+    
+    if(zoom!==null&&(
+    viewportProperties["width"]===undefined||width===undefined)){
+    if(viewportProperties["height"]!==undefined){
+    
+    minWidth=null;
+    maxWidth=null;
+    }else{
+    
+    minWidth="extend-to-zoom";
+    maxWidth="extend-to-zoom";
+    }
+    }
+    
+    
+    
+    
+    
+    
+    if(minZoom!==null&&maxZoom!==null){
+    maxZoom=max(minZoom,maxZoom);
+    }
+    
+    
+    if(zoom!==null){
+    zoom=clamp(zoom,minZoom,maxZoom);
+    }
+    
+    
+    var extendZoom=zoom===null&&maxZoom===null?null:min(zoom,maxZoom);
+    var extendWidth,extendHeight;
+    if(extendZoom===null){
+    if(maxWidth==="extend-to-zoom"){
+    maxWidth=null;
+    }
+    if(maxHeight==="extend-to-zoom"){
+    maxHeight=null;
+    }
+    if(minWidth==="extend-to-zoom"){
+    minWidth=maxWidth;
+    }
+    if(minHeight==="extend-to-zoom"){
+    minHeight=maxHeight;
+    }
+    }else{
+    extendWidth=initialWidth/extendZoom;
+    extendHeight=initialHeight/extendZoom;
+    
+    if(maxWidth==="extend-to-zoom"){
+    maxWidth=extendWidth;
+    }
+    if(maxHeight==="extend-to-zoom"){
+    maxHeight=extendHeight;
+    }
+    if(minWidth==="extend-to-zoom"){
+    minWidth=max(extendWidth,maxWidth);
+    }
+    if(minHeight==="extend-to-zoom"){
+    minHeight=max(extendHeight,maxHeight);
+    }
+    }
+    
+    
+    if(minWidth!==null||maxWidth!==null){
+    width=max(minWidth,min(maxWidth,initialWidth));
+    }
+    if(minHeight!==null||maxHeight!==null){
+    height=max(minHeight,min(maxHeight,initialHeight));
+    }
+    
+    
+    if(width===null){
+    if(height===null){
+    width=initialWidth;
+    }else{
+    if(initialHeight!==0){
+    width=Math.round(height*(initialWidth/initialHeight));
+    }else{
+    width=initialWidth;
+    }
+    }
+    }
+    if(height===null){
+    if(initialWidth!==0){
+    height=Math.round(width*(initialHeight/initialWidth));
+    }else{
+    height=initialHeight;
+    }
+    }
+    
+    return{zoom:zoom,width:width,height:height,userZoom:userZoom};
+    };
+    
+    function min(a,b){
+    if(a===null)return b;
+    if(b===null)return a;
+    return Math.min(a,b);
+    }
+    
+    function max(a,b){
+    if(a===null)return b;
+    if(b===null)return a;
+    return Math.max(a,b);
+    }
+    
+    
+    function translateLengthProperty(prop,vw,vh){
+    
+    if(typeof prop==="number"){
+    if(prop>=0){
+    
+    return clamp(prop,1,10000);
+    }else{
+    return undefined;
+    }
+    }
+    if(prop==="device-width"){
+    return 100*vw;
+    }
+    if(prop==="device-height"){
+    return 100*vh;
+    }
+    return 1;
+    }
+    
+    function translateZoomProperty(prop){
+    
+    if(typeof prop==="number"){
+    if(prop>=0){
+    
+    return clamp(prop,0.1,10);
+    }else{
+    return undefined;
+    }
+    }
+    if(prop==="yes"){
+    return 1;
+    }
+    if(prop==="device-width"||prop==="device-height"){
+    return 10;
+    }
+    if(prop==="no"||prop===null){
+    return 0.1;
+    }
+    }
+    
+    
+    function clamp(value,minv,maxv){
+    return max(min(value,maxv),minv);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    exports.parseMetaViewPortContent=function(S){
+    var parsedContent={
+    validProperties:{},
+    unknownProperties:{},
+    invalidValues:{}};
+    
+    var i=1;
+    while(i<=S.length){
+    while(i<=S.length&&RegExp(' |\x0A|\x09|\0d|,|;|=').test(S[i-1])){
+    i++;
+    }
+    if(i<=S.length){
+    i=parseProperty(parsedContent,S,i);
+    }
+    }
+    return parsedContent;
+    };
+    
+    var propertyNames=["width","height","initial-scale","minimum-scale","maximum-scale","user-scalable","shrink-to-fit","viewport-fit"];
+    
+    function parseProperty(parsedContent,S,i){
+    var start=i;
+    while(i<=S.length&&!RegExp(' |\x0A|\x09|\0d|,|;|=').test(S[i-1])){
+    i++;
+    }
+    if(i>S.length||RegExp(',|;').test(S[i-1])){
+    return i;
+    }
+    var propertyName=S.slice(start-1,i-1);
+    while(i<=S.length&&!RegExp(',|;|=').test(S[i-1])){
+    i++;
+    }
+    if(i>S.length||RegExp(',|;').test(S[i-1])){
+    return i;
+    }
+    while(i<=S.length&&RegExp(' |\x0A|\x09|\0d|=').test(S[i-1])){
+    i++;
+    }
+    if(i>S.length||RegExp(',|;').test(S[i-1])){
+    return i;
+    }
+    start=i;
+    while(i<=S.length&&!RegExp(' |\x0A|\x09|\0d|,|;|=').test(S[i-1])){
+    i++;
+    }
+    var propertyValue=S.slice(start-1,i-1);
+    setProperty(parsedContent,propertyName,propertyValue);
+    return i;
+    }
+    
+    function setProperty(parsedContent,name,value){
+    if(propertyNames.indexOf(name)>=0){
+    var number=parseFloat(value);
+    if(!isNaN(number)){
+    parsedContent.validProperties[name]=number;
+    return;
+    }
+    var string=value.toLowerCase();
+    
+    if(string==="yes"||string==="no"||string==="device-width"||string==="device-height"||
+    
+    
+    name.toLowerCase()==='viewport-fit'&&(string==='auto'||string==='cover')){
+    
+    parsedContent.validProperties[name]=string;
+    return;
+    }
+    
+    parsedContent.validProperties[name]=null;
+    parsedContent.invalidValues[name]=value;
+    }else{
+    parsedContent.unknownProperties[name]=value;
+    }
+    }
+    
+    exports.expectedValues={
+    "width":["device-width","device-height","a positive number"],
+    "height":["device-width","device-height","a positive number"],
+    "initial-scale":["a positive number"],
+    "minimum-scale":["a positive number"],
+    "maximum-scale":["a positive number"],
+    "user-scalable":["yes","no","0","1"],
+    "shrink-to-fit":["yes","no"],
+    "viewport-fit":["auto","cover"]};
+    
+    
+    },{}],146:[function(require,module,exports){
+    
+    
+    
+    
+    var s=1000;
+    var m=s*60;
+    var h=m*60;
+    var d=h*24;
+    var y=d*365.25;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    module.exports=function(val,options){
+    options=options||{};
+    var type=typeof val;
+    if(type==='string'&&val.length>0){
+    return parse(val);
+    }else if(type==='number'&&isNaN(val)===false){
+    return options.long?fmtLong(val):fmtShort(val);
+    }
+    throw new Error(
+    'val is not a non-empty string or a valid number. val='+
+    JSON.stringify(val));
+    
+    };
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function parse(str){
+    str=String(str);
+    if(str.length>100){
+    return;
+    }
+    var match=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(
+    str);
+    
+    if(!match){
+    return;
+    }
+    var n=parseFloat(match[1]);
+    var type=(match[2]||'ms').toLowerCase();
+    switch(type){
+    case'years':
+    case'year':
+    case'yrs':
+    case'yr':
+    case'y':
+    return n*y;
+    case'days':
+    case'day':
+    case'd':
+    return n*d;
+    case'hours':
+    case'hour':
+    case'hrs':
+    case'hr':
+    case'h':
+    return n*h;
+    case'minutes':
+    case'minute':
+    case'mins':
+    case'min':
+    case'm':
+    return n*m;
+    case'seconds':
+    case'second':
+    case'secs':
+    case'sec':
+    case's':
+    return n*s;
+    case'milliseconds':
+    case'millisecond':
+    case'msecs':
+    case'msec':
+    case'ms':
+    return n;
+    default:
+    return undefined;}
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function fmtShort(ms){
+    if(ms>=d){
+    return Math.round(ms/d)+'d';
+    }
+    if(ms>=h){
+    return Math.round(ms/h)+'h';
+    }
+    if(ms>=m){
+    return Math.round(ms/m)+'m';
+    }
+    if(ms>=s){
+    return Math.round(ms/s)+'s';
+    }
+    return ms+'ms';
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function fmtLong(ms){
+    return plural(ms,d,'day')||
+    plural(ms,h,'hour')||
+    plural(ms,m,'minute')||
+    plural(ms,s,'second')||
+    ms+' ms';
+    }
+    
+    
+    
+    
+    
+    function plural(ms,n,name){
+    if(ms<n){
+    return;
+    }
+    if(ms<n*1.5){
+    return Math.floor(ms/n)+' '+name;
+    }
+    return Math.ceil(ms/n)+' '+name+'s';
+    }
+    
+    },{}],147:[function(require,module,exports){
+    'use strict';
+    
+    
+    var TYPED_OK=typeof Uint8Array!=='undefined'&&
+    typeof Uint16Array!=='undefined'&&
+    typeof Int32Array!=='undefined';
+    
+    function _has(obj,key){
+    return Object.prototype.hasOwnProperty.call(obj,key);
+    }
+    
+    exports.assign=function(obj){
+    var sources=Array.prototype.slice.call(arguments,1);
+    while(sources.length){
+    var source=sources.shift();
+    if(!source){continue;}
+    
+    if(typeof source!=='object'){
+    throw new TypeError(source+'must be non-object');
+    }
+    
+    for(var p in source){
+    if(_has(source,p)){
+    obj[p]=source[p];
+    }
+    }
+    }
+    
+    return obj;
+    };
+    
+    
+    
+    exports.shrinkBuf=function(buf,size){
+    if(buf.length===size){return buf;}
+    if(buf.subarray){return buf.subarray(0,size);}
+    buf.length=size;
+    return buf;
+    };
+    
+    
+    var fnTyped={
+    arraySet:function(dest,src,src_offs,len,dest_offs){
+    if(src.subarray&&dest.subarray){
+    dest.set(src.subarray(src_offs,src_offs+len),dest_offs);
+    return;
+    }
+    
+    for(var i=0;i<len;i++){
+    dest[dest_offs+i]=src[src_offs+i];
+    }
+    },
+    
+    flattenChunks:function(chunks){
+    var i,l,len,pos,chunk,result;
+    
+    
+    len=0;
+    for(i=0,l=chunks.length;i<l;i++){
+    len+=chunks[i].length;
+    }
+    
+    
+    result=new Uint8Array(len);
+    pos=0;
+    for(i=0,l=chunks.length;i<l;i++){
+    chunk=chunks[i];
+    result.set(chunk,pos);
+    pos+=chunk.length;
+    }
+    
+    return result;
+    }};
+    
+    
+    var fnUntyped={
+    arraySet:function(dest,src,src_offs,len,dest_offs){
+    for(var i=0;i<len;i++){
+    dest[dest_offs+i]=src[src_offs+i];
+    }
+    },
+    
+    flattenChunks:function(chunks){
+    return[].concat.apply([],chunks);
+    }};
+    
+    
+    
+    
+    
+    exports.setTyped=function(on){
+    if(on){
+    exports.Buf8=Uint8Array;
+    exports.Buf16=Uint16Array;
+    exports.Buf32=Int32Array;
+    exports.assign(exports,fnTyped);
+    }else{
+    exports.Buf8=Array;
+    exports.Buf16=Array;
+    exports.Buf32=Array;
+    exports.assign(exports,fnUntyped);
+    }
+    };
+    
+    exports.setTyped(TYPED_OK);
+    
+    },{}],148:[function(require,module,exports){
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function adler32(adler,buf,len,pos){
+    var s1=adler&0xffff|0,
+    s2=adler>>>16&0xffff|0,
+    n=0;
+    
+    while(len!==0){
+    
+    
+    
+    n=len>2000?2000:len;
+    len-=n;
+    
+    do{
+    s1=s1+buf[pos++]|0;
+    s2=s2+s1|0;
+    }while(--n);
+    
+    s1%=65521;
+    s2%=65521;
+    }
+    
+    return s1|s2<<16|0;
+    }
+    
+    
+    module.exports=adler32;
+    
+    },{}],149:[function(require,module,exports){
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    module.exports={
+    
+    
+    Z_NO_FLUSH:0,
+    Z_PARTIAL_FLUSH:1,
+    Z_SYNC_FLUSH:2,
+    Z_FULL_FLUSH:3,
+    Z_FINISH:4,
+    Z_BLOCK:5,
+    Z_TREES:6,
+    
+    
+    
+    
+    Z_OK:0,
+    Z_STREAM_END:1,
+    Z_NEED_DICT:2,
+    Z_ERRNO:-1,
+    Z_STREAM_ERROR:-2,
+    Z_DATA_ERROR:-3,
+    
+    Z_BUF_ERROR:-5,
+    
+    
+    
+    Z_NO_COMPRESSION:0,
+    Z_BEST_SPEED:1,
+    Z_BEST_COMPRESSION:9,
+    Z_DEFAULT_COMPRESSION:-1,
+    
+    
+    Z_FILTERED:1,
+    Z_HUFFMAN_ONLY:2,
+    Z_RLE:3,
+    Z_FIXED:4,
+    Z_DEFAULT_STRATEGY:0,
+    
+    
+    Z_BINARY:0,
+    Z_TEXT:1,
+    
+    Z_UNKNOWN:2,
+    
+    
+    Z_DEFLATED:8};
+    
+    
+    
+    },{}],150:[function(require,module,exports){
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function makeTable(){
+    var c,table=[];
+    
+    for(var n=0;n<256;n++){
+    c=n;
+    for(var k=0;k<8;k++){
+    c=c&1?0xEDB88320^c>>>1:c>>>1;
+    }
+    table[n]=c;
+    }
+    
+    return table;
+    }
+    
+    
+    var crcTable=makeTable();
+    
+    
+    function crc32(crc,buf,len,pos){
+    var t=crcTable,
+    end=pos+len;
+    
+    crc^=-1;
+    
+    for(var i=pos;i<end;i++){
+    crc=crc>>>8^t[(crc^buf[i])&0xFF];
+    }
+    
+    return crc^-1;
+    }
+    
+    
+    module.exports=crc32;
+    
+    },{}],151:[function(require,module,exports){
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    var utils=require('../utils/common');
+    var trees=require('./trees');
+    var adler32=require('./adler32');
+    var crc32=require('./crc32');
+    var msg=require('./messages');
+    
+    
+    
+    
+    
+    
+    var Z_NO_FLUSH=0;
+    var Z_PARTIAL_FLUSH=1;
+    
+    var Z_FULL_FLUSH=3;
+    var Z_FINISH=4;
+    var Z_BLOCK=5;
+    
+    
+    
+    
+    
+    
+    var Z_OK=0;
+    var Z_STREAM_END=1;
+    
+    
+    var Z_STREAM_ERROR=-2;
+    var Z_DATA_ERROR=-3;
+    
+    var Z_BUF_ERROR=-5;
+    
+    
+    
+    
+    
+    
+    
+    var Z_DEFAULT_COMPRESSION=-1;
+    
+    
+    var Z_FILTERED=1;
+    var Z_HUFFMAN_ONLY=2;
+    var Z_RLE=3;
+    var Z_FIXED=4;
+    var Z_DEFAULT_STRATEGY=0;
+    
+    
+    
+    
+    
+    var Z_UNKNOWN=2;
+    
+    
+    
+    var Z_DEFLATED=8;
+    
+    
+    
+    
+    var MAX_MEM_LEVEL=9;
+    
+    var MAX_WBITS=15;
+    
+    var DEF_MEM_LEVEL=8;
+    
+    
+    var LENGTH_CODES=29;
+    
+    var LITERALS=256;
+    
+    var L_CODES=LITERALS+1+LENGTH_CODES;
+    
+    var D_CODES=30;
+    
+    var BL_CODES=19;
+    
+    var HEAP_SIZE=2*L_CODES+1;
+    
+    var MAX_BITS=15;
+    
+    
+    var MIN_MATCH=3;
+    var MAX_MATCH=258;
+    var MIN_LOOKAHEAD=MAX_MATCH+MIN_MATCH+1;
+    
+    var PRESET_DICT=0x20;
+    
+    var INIT_STATE=42;
+    var EXTRA_STATE=69;
+    var NAME_STATE=73;
+    var COMMENT_STATE=91;
+    var HCRC_STATE=103;
+    var BUSY_STATE=113;
+    var FINISH_STATE=666;
+    
+    var BS_NEED_MORE=1;
+    var BS_BLOCK_DONE=2;
+    var BS_FINISH_STARTED=3;
+    var BS_FINISH_DONE=4;
+    
+    var OS_CODE=0x03;
+    
+    function err(strm,errorCode){
+    strm.msg=msg[errorCode];
+    return errorCode;
+    }
+    
+    function rank(f){
+    return(f<<1)-(f>4?9:0);
+    }
+    
+    function zero(buf){var len=buf.length;while(--len>=0){buf[len]=0;}}
+    
+    
+    
+    
+    
+    
+    
+    
+    function flush_pending(strm){
+    var s=strm.state;
+    
+    
+    var len=s.pending;
+    if(len>strm.avail_out){
+    len=strm.avail_out;
+    }
+    if(len===0){return;}
+    
+    utils.arraySet(strm.output,s.pending_buf,s.pending_out,len,strm.next_out);
+    strm.next_out+=len;
+    s.pending_out+=len;
+    strm.total_out+=len;
+    strm.avail_out-=len;
+    s.pending-=len;
+    if(s.pending===0){
+    s.pending_out=0;
+    }
+    }
+    
+    
+    function flush_block_only(s,last){
+    trees._tr_flush_block(s,s.block_start>=0?s.block_start:-1,s.strstart-s.block_start,last);
+    s.block_start=s.strstart;
+    flush_pending(s.strm);
+    }
+    
+    
+    function put_byte(s,b){
+    s.pending_buf[s.pending++]=b;
+    }
+    
+    
+    
+    
+    
+    
+    
+    function putShortMSB(s,b){
+    
+    
+    s.pending_buf[s.pending++]=b>>>8&0xff;
+    s.pending_buf[s.pending++]=b&0xff;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function read_buf(strm,buf,start,size){
+    var len=strm.avail_in;
+    
+    if(len>size){len=size;}
+    if(len===0){return 0;}
+    
+    strm.avail_in-=len;
+    
+    
+    utils.arraySet(buf,strm.input,strm.next_in,len,start);
+    if(strm.state.wrap===1){
+    strm.adler=adler32(strm.adler,buf,len,start);
+    }else
+    
+    if(strm.state.wrap===2){
+    strm.adler=crc32(strm.adler,buf,len,start);
+    }
+    
+    strm.next_in+=len;
+    strm.total_in+=len;
+    
+    return len;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function longest_match(s,cur_match){
+    var chain_length=s.max_chain_length;
+    var scan=s.strstart;
+    var match;
+    var len;
+    var best_len=s.prev_length;
+    var nice_match=s.nice_match;
+    var limit=s.strstart>s.w_size-MIN_LOOKAHEAD?
+    s.strstart-(s.w_size-MIN_LOOKAHEAD):0;
+    
+    var _win=s.window;
+    
+    var wmask=s.w_mask;
+    var prev=s.prev;
+    
+    
+    
+    
+    
+    var strend=s.strstart+MAX_MATCH;
+    var scan_end1=_win[scan+best_len-1];
+    var scan_end=_win[scan+best_len];
+    
+    
+    
+    
+    
+    
+    
+    if(s.prev_length>=s.good_match){
+    chain_length>>=2;
+    }
+    
+    
+    
+    if(nice_match>s.lookahead){nice_match=s.lookahead;}
+    
+    
+    
+    do{
+    
+    match=cur_match;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    if(_win[match+best_len]!==scan_end||
+    _win[match+best_len-1]!==scan_end1||
+    _win[match]!==_win[scan]||
+    _win[++match]!==_win[scan+1]){
+    continue;
+    }
+    
+    
+    
+    
+    
+    
+    
+    scan+=2;
+    match++;
+    
+    
+    
+    
+    
+    do{
+    
+    }while(_win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&
+    _win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&
+    _win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&
+    _win[++scan]===_win[++match]&&_win[++scan]===_win[++match]&&
+    scan<strend);
+    
+    
+    
+    len=MAX_MATCH-(strend-scan);
+    scan=strend-MAX_MATCH;
+    
+    if(len>best_len){
+    s.match_start=cur_match;
+    best_len=len;
+    if(len>=nice_match){
+    break;
+    }
+    scan_end1=_win[scan+best_len-1];
+    scan_end=_win[scan+best_len];
+    }
+    }while((cur_match=prev[cur_match&wmask])>limit&&--chain_length!==0);
+    
+    if(best_len<=s.lookahead){
+    return best_len;
+    }
+    return s.lookahead;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function fill_window(s){
+    var _w_size=s.w_size;
+    var p,n,m,more,str;
+    
+    
+    
+    do{
+    more=s.window_size-s.lookahead-s.strstart;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    if(s.strstart>=_w_size+(_w_size-MIN_LOOKAHEAD)){
+    
+    utils.arraySet(s.window,s.window,_w_size,_w_size,0);
+    s.match_start-=_w_size;
+    s.strstart-=_w_size;
+    
+    s.block_start-=_w_size;
+    
+    
+    
+    
+    
+    
+    
+    
+    n=s.hash_size;
+    p=n;
+    do{
+    m=s.head[--p];
+    s.head[p]=m>=_w_size?m-_w_size:0;
+    }while(--n);
+    
+    n=_w_size;
+    p=n;
+    do{
+    m=s.prev[--p];
+    s.prev[p]=m>=_w_size?m-_w_size:0;
+    
+    
+    
+    }while(--n);
+    
+    more+=_w_size;
+    }
+    if(s.strm.avail_in===0){
+    break;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    n=read_buf(s.strm,s.window,s.strstart+s.lookahead,more);
+    s.lookahead+=n;
+    
+    
+    if(s.lookahead+s.insert>=MIN_MATCH){
+    str=s.strstart-s.insert;
+    s.ins_h=s.window[str];
+    
+    
+    s.ins_h=(s.ins_h<<s.hash_shift^s.window[str+1])&s.hash_mask;
+    
+    
+    
+    while(s.insert){
+    
+    s.ins_h=(s.ins_h<<s.hash_shift^s.window[str+MIN_MATCH-1])&s.hash_mask;
+    
+    s.prev[str&s.w_mask]=s.head[s.ins_h];
+    s.head[s.ins_h]=str;
+    str++;
+    s.insert--;
+    if(s.lookahead+s.insert<MIN_MATCH){
+    break;
+    }
+    }
+    }
+    
+    
+    
+    
+    }while(s.lookahead<MIN_LOOKAHEAD&&s.strm.avail_in!==0);
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function deflate_stored(s,flush){
+    
+    
+    
+    var max_block_size=0xffff;
+    
+    if(max_block_size>s.pending_buf_size-5){
+    max_block_size=s.pending_buf_size-5;
+    }
+    
+    
+    for(;;){
+    
+    if(s.lookahead<=1){
+    
+    
+    
+    
+    
+    
+    
+    
+    fill_window(s);
+    if(s.lookahead===0&&flush===Z_NO_FLUSH){
+    return BS_NEED_MORE;
+    }
+    
+    if(s.lookahead===0){
+    break;
+    }
+    
+    }
+    
+    
+    
+    s.strstart+=s.lookahead;
+    s.lookahead=0;
+    
+    
+    var max_start=s.block_start+max_block_size;
+    
+    if(s.strstart===0||s.strstart>=max_start){
+    
+    s.lookahead=s.strstart-max_start;
+    s.strstart=max_start;
+    
+    flush_block_only(s,false);
+    if(s.strm.avail_out===0){
+    return BS_NEED_MORE;
+    }
+    
+    
+    
+    }
+    
+    
+    
+    if(s.strstart-s.block_start>=s.w_size-MIN_LOOKAHEAD){
+    
+    flush_block_only(s,false);
+    if(s.strm.avail_out===0){
+    return BS_NEED_MORE;
+    }
+    
+    }
+    }
+    
+    s.insert=0;
+    
+    if(flush===Z_FINISH){
+    
+    flush_block_only(s,true);
+    if(s.strm.avail_out===0){
+    return BS_FINISH_STARTED;
+    }
+    
+    return BS_FINISH_DONE;
+    }
+    
+    if(s.strstart>s.block_start){
+    
+    flush_block_only(s,false);
+    if(s.strm.avail_out===0){
+    return BS_NEED_MORE;
+    }
+    
+    }
+    
+    return BS_NEED_MORE;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function deflate_fast(s,flush){
+    var hash_head;
+    var bflush;
+    
+    for(;;){
+    
+    
+    
+    
+    
+    if(s.lookahead<MIN_LOOKAHEAD){
+    fill_window(s);
+    if(s.lookahead<MIN_LOOKAHEAD&&flush===Z_NO_FLUSH){
+    return BS_NEED_MORE;
+    }
+    if(s.lookahead===0){
+    break;
+    }
+    }
+    
+    
+    
+    
+    hash_head=0;
+    if(s.lookahead>=MIN_MATCH){
+    
+    s.ins_h=(s.ins_h<<s.hash_shift^s.window[s.strstart+MIN_MATCH-1])&s.hash_mask;
+    hash_head=s.prev[s.strstart&s.w_mask]=s.head[s.ins_h];
+    s.head[s.ins_h]=s.strstart;
+    
+    }
+    
+    
+    
+    
+    if(hash_head!==0&&s.strstart-hash_head<=s.w_size-MIN_LOOKAHEAD){
+    
+    
+    
+    
+    s.match_length=longest_match(s,hash_head);
+    
+    }
+    if(s.match_length>=MIN_MATCH){
+    
+    
+    
+    
+    bflush=trees._tr_tally(s,s.strstart-s.match_start,s.match_length-MIN_MATCH);
+    
+    s.lookahead-=s.match_length;
+    
+    
+    
+    
+    if(s.match_length<=s.max_lazy_match&&s.lookahead>=MIN_MATCH){
+    s.match_length--;
+    do{
+    s.strstart++;
+    
+    s.ins_h=(s.ins_h<<s.hash_shift^s.window[s.strstart+MIN_MATCH-1])&s.hash_mask;
+    hash_head=s.prev[s.strstart&s.w_mask]=s.head[s.ins_h];
+    s.head[s.ins_h]=s.strstart;
+    
+    
+    
+    
+    }while(--s.match_length!==0);
+    s.strstart++;
+    }else
+    {
+    s.strstart+=s.match_length;
+    s.match_length=0;
+    s.ins_h=s.window[s.strstart];
+    
+    s.ins_h=(s.ins_h<<s.hash_shift^s.window[s.strstart+1])&s.hash_mask;
+    
+    
+    
+    
+    
+    
+    
+    }
+    }else{
+    
+    
+    
+    bflush=trees._tr_tally(s,0,s.window[s.strstart]);
+    
+    s.lookahead--;
+    s.strstart++;
+    }
+    if(bflush){
+    
+    flush_block_only(s,false);
+    if(s.strm.avail_out===0){
+    return BS_NEED_MORE;
+    }
+    
+    }
+    }
+    s.insert=s.strstart<MIN_MATCH-1?s.strstart:MIN_MATCH-1;
+    if(flush===Z_FINISH){
+    
+    flush_block_only(s,true);
+    if(s.strm.avail_out===0){
+    return BS_FINISH_STARTED;
+    }
+    
+    return BS_FINISH_DONE;
+    }
+    if(s.last_lit){
+    
+    flush_block_only(s,false);
+    if(s.strm.avail_out===0){
+    return BS_NEED_MORE;
+    }
+    
+    }
+    return BS_BLOCK_DONE;
+    }
+    
+    
+    
+    
+    
+    
+    function deflate_slow(s,flush){
+    var hash_head;
+    var bflush;
+    
+    var max_insert;
+    
+    
+    for(;;){
+    
+    
+    
+    
+    
+    if(s.lookahead<MIN_LOOKAHEAD){
+    fill_window(s);
+    if(s.lookahead<MIN_LOOKAHEAD&&flush===Z_NO_FLUSH){
+    return BS_NEED_MORE;
+    }
+    if(s.lookahead===0){break;}
+    }
+    
+    
+    
+    
+    hash_head=0;
+    if(s.lookahead>=MIN_MATCH){
+    
+    s.ins_h=(s.ins_h<<s.hash_shift^s.window[s.strstart+MIN_MATCH-1])&s.hash_mask;
+    hash_head=s.prev[s.strstart&s.w_mask]=s.head[s.ins_h];
+    s.head[s.ins_h]=s.strstart;
+    
+    }
+    
+    
+    
+    s.prev_length=s.match_length;
+    s.prev_match=s.match_start;
+    s.match_length=MIN_MATCH-1;
+    
+    if(hash_head!==0&&s.prev_length<s.max_lazy_match&&
+    s.strstart-hash_head<=s.w_size-MIN_LOOKAHEAD){
+    
+    
+    
+    
+    s.match_length=longest_match(s,hash_head);
+    
+    
+    if(s.match_length<=5&&(
+    s.strategy===Z_FILTERED||s.match_length===MIN_MATCH&&s.strstart-s.match_start>4096)){
+    
+    
+    
+    
+    s.match_length=MIN_MATCH-1;
+    }
+    }
+    
+    
+    
+    if(s.prev_length>=MIN_MATCH&&s.match_length<=s.prev_length){
+    max_insert=s.strstart+s.lookahead-MIN_MATCH;
+    
+    
+    
+    
+    
+    
+    bflush=trees._tr_tally(s,s.strstart-1-s.prev_match,s.prev_length-MIN_MATCH);
+    
+    
+    
+    
+    
+    s.lookahead-=s.prev_length-1;
+    s.prev_length-=2;
+    do{
+    if(++s.strstart<=max_insert){
+    
+    s.ins_h=(s.ins_h<<s.hash_shift^s.window[s.strstart+MIN_MATCH-1])&s.hash_mask;
+    hash_head=s.prev[s.strstart&s.w_mask]=s.head[s.ins_h];
+    s.head[s.ins_h]=s.strstart;
+    
+    }
+    }while(--s.prev_length!==0);
+    s.match_available=0;
+    s.match_length=MIN_MATCH-1;
+    s.strstart++;
+    
+    if(bflush){
+    
+    flush_block_only(s,false);
+    if(s.strm.avail_out===0){
+    return BS_NEED_MORE;
+    }
+    
+    }
+    
+    }else if(s.match_available){
+    
+    
+    
+    
+    
+    
+    bflush=trees._tr_tally(s,0,s.window[s.strstart-1]);
+    
+    if(bflush){
+    
+    flush_block_only(s,false);
+    
+    }
+    s.strstart++;
+    s.lookahead--;
+    if(s.strm.avail_out===0){
+    return BS_NEED_MORE;
+    }
+    }else{
+    
+    
+    
+    s.match_available=1;
+    s.strstart++;
+    s.lookahead--;
+    }
+    }
+    
+    if(s.match_available){
+    
+    
+    bflush=trees._tr_tally(s,0,s.window[s.strstart-1]);
+    
+    s.match_available=0;
+    }
+    s.insert=s.strstart<MIN_MATCH-1?s.strstart:MIN_MATCH-1;
+    if(flush===Z_FINISH){
+    
+    flush_block_only(s,true);
+    if(s.strm.avail_out===0){
+    return BS_FINISH_STARTED;
+    }
+    
+    return BS_FINISH_DONE;
+    }
+    if(s.last_lit){
+    
+    flush_block_only(s,false);
+    if(s.strm.avail_out===0){
+    return BS_NEED_MORE;
+    }
+    
+    }
+    
+    return BS_BLOCK_DONE;
+    }
+    
+    
+    
+    
+    
+    
+    
+    function deflate_rle(s,flush){
+    var bflush;
+    var prev;
+    var scan,strend;
+    
+    var _win=s.window;
+    
+    for(;;){
+    
+    
+    
+    
+    if(s.lookahead<=MAX_MATCH){
+    fill_window(s);
+    if(s.lookahead<=MAX_MATCH&&flush===Z_NO_FLUSH){
+    return BS_NEED_MORE;
+    }
+    if(s.lookahead===0){break;}
+    }
+    
+    
+    s.match_length=0;
+    if(s.lookahead>=MIN_MATCH&&s.strstart>0){
+    scan=s.strstart-1;
+    prev=_win[scan];
+    if(prev===_win[++scan]&&prev===_win[++scan]&&prev===_win[++scan]){
+    strend=s.strstart+MAX_MATCH;
+    do{
+    
+    }while(prev===_win[++scan]&&prev===_win[++scan]&&
+    prev===_win[++scan]&&prev===_win[++scan]&&
+    prev===_win[++scan]&&prev===_win[++scan]&&
+    prev===_win[++scan]&&prev===_win[++scan]&&
+    scan<strend);
+    s.match_length=MAX_MATCH-(strend-scan);
+    if(s.match_length>s.lookahead){
+    s.match_length=s.lookahead;
+    }
+    }
+    
+    }
+    
+    
+    if(s.match_length>=MIN_MATCH){
+    
+    
+    
+    bflush=trees._tr_tally(s,1,s.match_length-MIN_MATCH);
+    
+    s.lookahead-=s.match_length;
+    s.strstart+=s.match_length;
+    s.match_length=0;
+    }else{
+    
+    
+    
+    bflush=trees._tr_tally(s,0,s.window[s.strstart]);
+    
+    s.lookahead--;
+    s.strstart++;
+    }
+    if(bflush){
+    
+    flush_block_only(s,false);
+    if(s.strm.avail_out===0){
+    return BS_NEED_MORE;
+    }
+    
+    }
+    }
+    s.insert=0;
+    if(flush===Z_FINISH){
+    
+    flush_block_only(s,true);
+    if(s.strm.avail_out===0){
+    return BS_FINISH_STARTED;
+    }
+    
+    return BS_FINISH_DONE;
+    }
+    if(s.last_lit){
+    
+    flush_block_only(s,false);
+    if(s.strm.avail_out===0){
+    return BS_NEED_MORE;
+    }
+    
+    }
+    return BS_BLOCK_DONE;
+    }
+    
+    
+    
+    
+    
+    function deflate_huff(s,flush){
+    var bflush;
+    
+    for(;;){
+    
+    if(s.lookahead===0){
+    fill_window(s);
+    if(s.lookahead===0){
+    if(flush===Z_NO_FLUSH){
+    return BS_NEED_MORE;
+    }
+    break;
+    }
+    }
+    
+    
+    s.match_length=0;
+    
+    
+    bflush=trees._tr_tally(s,0,s.window[s.strstart]);
+    s.lookahead--;
+    s.strstart++;
+    if(bflush){
+    
+    flush_block_only(s,false);
+    if(s.strm.avail_out===0){
+    return BS_NEED_MORE;
+    }
+    
+    }
+    }
+    s.insert=0;
+    if(flush===Z_FINISH){
+    
+    flush_block_only(s,true);
+    if(s.strm.avail_out===0){
+    return BS_FINISH_STARTED;
+    }
+    
+    return BS_FINISH_DONE;
+    }
+    if(s.last_lit){
+    
+    flush_block_only(s,false);
+    if(s.strm.avail_out===0){
+    return BS_NEED_MORE;
+    }
+    
+    }
+    return BS_BLOCK_DONE;
+    }
+    
+    
+    
+    
+    
+    
+    function Config(good_length,max_lazy,nice_length,max_chain,func){
+    this.good_length=good_length;
+    this.max_lazy=max_lazy;
+    this.nice_length=nice_length;
+    this.max_chain=max_chain;
+    this.func=func;
+    }
+    
+    var configuration_table;
+    
+    configuration_table=[
+    
+    new Config(0,0,0,0,deflate_stored),
+    new Config(4,4,8,4,deflate_fast),
+    new Config(4,5,16,8,deflate_fast),
+    new Config(4,6,32,32,deflate_fast),
+    
+    new Config(4,4,16,16,deflate_slow),
+    new Config(8,16,32,32,deflate_slow),
+    new Config(8,16,128,128,deflate_slow),
+    new Config(8,32,128,256,deflate_slow),
+    new Config(32,128,258,1024,deflate_slow),
+    new Config(32,258,258,4096,deflate_slow)];
+    
+    
+    
+    
+    
+    
+    function lm_init(s){
+    s.window_size=2*s.w_size;
+    
+    
+    zero(s.head);
+    
+    
+    
+    s.max_lazy_match=configuration_table[s.level].max_lazy;
+    s.good_match=configuration_table[s.level].good_length;
+    s.nice_match=configuration_table[s.level].nice_length;
+    s.max_chain_length=configuration_table[s.level].max_chain;
+    
+    s.strstart=0;
+    s.block_start=0;
+    s.lookahead=0;
+    s.insert=0;
+    s.match_length=s.prev_length=MIN_MATCH-1;
+    s.match_available=0;
+    s.ins_h=0;
+    }
+    
+    
+    function DeflateState(){
+    this.strm=null;
+    this.status=0;
+    this.pending_buf=null;
+    this.pending_buf_size=0;
+    this.pending_out=0;
+    this.pending=0;
+    this.wrap=0;
+    this.gzhead=null;
+    this.gzindex=0;
+    this.method=Z_DEFLATED;
+    this.last_flush=-1;
+    
+    this.w_size=0;
+    this.w_bits=0;
+    this.w_mask=0;
+    
+    this.window=null;
+    
+    
+    
+    
+    
+    
+    
+    this.window_size=0;
+    
+    
+    
+    
+    this.prev=null;
+    
+    
+    
+    
+    
+    this.head=null;
+    
+    this.ins_h=0;
+    this.hash_size=0;
+    this.hash_bits=0;
+    this.hash_mask=0;
+    
+    this.hash_shift=0;
+    
+    
+    
+    
+    
+    
+    this.block_start=0;
+    
+    
+    
+    
+    this.match_length=0;
+    this.prev_match=0;
+    this.match_available=0;
+    this.strstart=0;
+    this.match_start=0;
+    this.lookahead=0;
+    
+    this.prev_length=0;
+    
+    
+    
+    
+    this.max_chain_length=0;
+    
+    
+    
+    
+    
+    this.max_lazy_match=0;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    this.level=0;
+    this.strategy=0;
+    
+    this.good_match=0;
+    
+    
+    this.nice_match=0;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    this.dyn_ltree=new utils.Buf16(HEAP_SIZE*2);
+    this.dyn_dtree=new utils.Buf16((2*D_CODES+1)*2);
+    this.bl_tree=new utils.Buf16((2*BL_CODES+1)*2);
+    zero(this.dyn_ltree);
+    zero(this.dyn_dtree);
+    zero(this.bl_tree);
+    
+    this.l_desc=null;
+    this.d_desc=null;
+    this.bl_desc=null;
+    
+    
+    this.bl_count=new utils.Buf16(MAX_BITS+1);
+    
+    
+    
+    this.heap=new utils.Buf16(2*L_CODES+1);
+    zero(this.heap);
+    
+    this.heap_len=0;
+    this.heap_max=0;
+    
+    
+    
+    
+    this.depth=new utils.Buf16(2*L_CODES+1);
+    zero(this.depth);
+    
+    
+    
+    this.l_buf=0;
+    
+    this.lit_bufsize=0;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    this.last_lit=0;
+    
+    this.d_buf=0;
+    
+    
+    
+    
+    
+    this.opt_len=0;
+    this.static_len=0;
+    this.matches=0;
+    this.insert=0;
+    
+    
+    this.bi_buf=0;
+    
+    
+    
+    this.bi_valid=0;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    }
+    
+    
+    function deflateResetKeep(strm){
+    var s;
+    
+    if(!strm||!strm.state){
+    return err(strm,Z_STREAM_ERROR);
+    }
+    
+    strm.total_in=strm.total_out=0;
+    strm.data_type=Z_UNKNOWN;
+    
+    s=strm.state;
+    s.pending=0;
+    s.pending_out=0;
+    
+    if(s.wrap<0){
+    s.wrap=-s.wrap;
+    
+    }
+    s.status=s.wrap?INIT_STATE:BUSY_STATE;
+    strm.adler=s.wrap===2?
+    0:
+    
+    1;
+    s.last_flush=Z_NO_FLUSH;
+    trees._tr_init(s);
+    return Z_OK;
+    }
+    
+    
+    function deflateReset(strm){
+    var ret=deflateResetKeep(strm);
+    if(ret===Z_OK){
+    lm_init(strm.state);
+    }
+    return ret;
+    }
+    
+    
+    function deflateSetHeader(strm,head){
+    if(!strm||!strm.state){return Z_STREAM_ERROR;}
+    if(strm.state.wrap!==2){return Z_STREAM_ERROR;}
+    strm.state.gzhead=head;
+    return Z_OK;
+    }
+    
+    
+    function deflateInit2(strm,level,method,windowBits,memLevel,strategy){
+    if(!strm){
+    return Z_STREAM_ERROR;
+    }
+    var wrap=1;
+    
+    if(level===Z_DEFAULT_COMPRESSION){
+    level=6;
+    }
+    
+    if(windowBits<0){
+    wrap=0;
+    windowBits=-windowBits;
+    }else
+    
+    if(windowBits>15){
+    wrap=2;
+    windowBits-=16;
+    }
+    
+    
+    if(memLevel<1||memLevel>MAX_MEM_LEVEL||method!==Z_DEFLATED||
+    windowBits<8||windowBits>15||level<0||level>9||
+    strategy<0||strategy>Z_FIXED){
+    return err(strm,Z_STREAM_ERROR);
+    }
+    
+    
+    if(windowBits===8){
+    windowBits=9;
+    }
+    
+    
+    var s=new DeflateState();
+    
+    strm.state=s;
+    s.strm=strm;
+    
+    s.wrap=wrap;
+    s.gzhead=null;
+    s.w_bits=windowBits;
+    s.w_size=1<<s.w_bits;
+    s.w_mask=s.w_size-1;
+    
+    s.hash_bits=memLevel+7;
+    s.hash_size=1<<s.hash_bits;
+    s.hash_mask=s.hash_size-1;
+    s.hash_shift=~~((s.hash_bits+MIN_MATCH-1)/MIN_MATCH);
+    
+    s.window=new utils.Buf8(s.w_size*2);
+    s.head=new utils.Buf16(s.hash_size);
+    s.prev=new utils.Buf16(s.w_size);
+    
+    
+    
+    
+    s.lit_bufsize=1<<memLevel+6;
+    
+    s.pending_buf_size=s.lit_bufsize*4;
+    
+    
+    
+    s.pending_buf=new utils.Buf8(s.pending_buf_size);
+    
+    
+    
+    s.d_buf=1*s.lit_bufsize;
+    
+    
+    s.l_buf=(1+2)*s.lit_bufsize;
+    
+    s.level=level;
+    s.strategy=strategy;
+    s.method=method;
+    
+    return deflateReset(strm);
+    }
+    
+    function deflateInit(strm,level){
+    return deflateInit2(strm,level,Z_DEFLATED,MAX_WBITS,DEF_MEM_LEVEL,Z_DEFAULT_STRATEGY);
+    }
+    
+    
+    function deflate(strm,flush){
+    var old_flush,s;
+    var beg,val;
+    
+    if(!strm||!strm.state||
+    flush>Z_BLOCK||flush<0){
+    return strm?err(strm,Z_STREAM_ERROR):Z_STREAM_ERROR;
+    }
+    
+    s=strm.state;
+    
+    if(!strm.output||
+    !strm.input&&strm.avail_in!==0||
+    s.status===FINISH_STATE&&flush!==Z_FINISH){
+    return err(strm,strm.avail_out===0?Z_BUF_ERROR:Z_STREAM_ERROR);
+    }
+    
+    s.strm=strm;
+    old_flush=s.last_flush;
+    s.last_flush=flush;
+    
+    
+    if(s.status===INIT_STATE){
+    
+    if(s.wrap===2){
+    strm.adler=0;
+    put_byte(s,31);
+    put_byte(s,139);
+    put_byte(s,8);
+    if(!s.gzhead){
+    put_byte(s,0);
+    put_byte(s,0);
+    put_byte(s,0);
+    put_byte(s,0);
+    put_byte(s,0);
+    put_byte(s,s.level===9?2:
+    s.strategy>=Z_HUFFMAN_ONLY||s.level<2?
+    4:0);
+    put_byte(s,OS_CODE);
+    s.status=BUSY_STATE;
+    }else
+    {
+    put_byte(s,(s.gzhead.text?1:0)+(
+    s.gzhead.hcrc?2:0)+(
+    !s.gzhead.extra?0:4)+(
+    !s.gzhead.name?0:8)+(
+    !s.gzhead.comment?0:16));
+    
+    put_byte(s,s.gzhead.time&0xff);
+    put_byte(s,s.gzhead.time>>8&0xff);
+    put_byte(s,s.gzhead.time>>16&0xff);
+    put_byte(s,s.gzhead.time>>24&0xff);
+    put_byte(s,s.level===9?2:
+    s.strategy>=Z_HUFFMAN_ONLY||s.level<2?
+    4:0);
+    put_byte(s,s.gzhead.os&0xff);
+    if(s.gzhead.extra&&s.gzhead.extra.length){
+    put_byte(s,s.gzhead.extra.length&0xff);
+    put_byte(s,s.gzhead.extra.length>>8&0xff);
+    }
+    if(s.gzhead.hcrc){
+    strm.adler=crc32(strm.adler,s.pending_buf,s.pending,0);
+    }
+    s.gzindex=0;
+    s.status=EXTRA_STATE;
+    }
+    }else
+    
+    {
+    var header=Z_DEFLATED+(s.w_bits-8<<4)<<8;
+    var level_flags=-1;
+    
+    if(s.strategy>=Z_HUFFMAN_ONLY||s.level<2){
+    level_flags=0;
+    }else if(s.level<6){
+    level_flags=1;
+    }else if(s.level===6){
+    level_flags=2;
+    }else{
+    level_flags=3;
+    }
+    header|=level_flags<<6;
+    if(s.strstart!==0){header|=PRESET_DICT;}
+    header+=31-header%31;
+    
+    s.status=BUSY_STATE;
+    putShortMSB(s,header);
+    
+    
+    if(s.strstart!==0){
+    putShortMSB(s,strm.adler>>>16);
+    putShortMSB(s,strm.adler&0xffff);
+    }
+    strm.adler=1;
+    }
+    }
+    
+    
+    if(s.status===EXTRA_STATE){
+    if(s.gzhead.extra){
+    beg=s.pending;
+    
+    while(s.gzindex<(s.gzhead.extra.length&0xffff)){
+    if(s.pending===s.pending_buf_size){
+    if(s.gzhead.hcrc&&s.pending>beg){
+    strm.adler=crc32(strm.adler,s.pending_buf,s.pending-beg,beg);
+    }
+    flush_pending(strm);
+    beg=s.pending;
+    if(s.pending===s.pending_buf_size){
+    break;
+    }
+    }
+    put_byte(s,s.gzhead.extra[s.gzindex]&0xff);
+    s.gzindex++;
+    }
+    if(s.gzhead.hcrc&&s.pending>beg){
+    strm.adler=crc32(strm.adler,s.pending_buf,s.pending-beg,beg);
+    }
+    if(s.gzindex===s.gzhead.extra.length){
+    s.gzindex=0;
+    s.status=NAME_STATE;
+    }
+    }else
+    {
+    s.status=NAME_STATE;
+    }
+    }
+    if(s.status===NAME_STATE){
+    if(s.gzhead.name){
+    beg=s.pending;
+    
+    
+    do{
+    if(s.pending===s.pending_buf_size){
+    if(s.gzhead.hcrc&&s.pending>beg){
+    strm.adler=crc32(strm.adler,s.pending_buf,s.pending-beg,beg);
+    }
+    flush_pending(strm);
+    beg=s.pending;
+    if(s.pending===s.pending_buf_size){
+    val=1;
+    break;
+    }
+    }
+    
+    if(s.gzindex<s.gzhead.name.length){
+    val=s.gzhead.name.charCodeAt(s.gzindex++)&0xff;
+    }else{
+    val=0;
+    }
+    put_byte(s,val);
+    }while(val!==0);
+    
+    if(s.gzhead.hcrc&&s.pending>beg){
+    strm.adler=crc32(strm.adler,s.pending_buf,s.pending-beg,beg);
+    }
+    if(val===0){
+    s.gzindex=0;
+    s.status=COMMENT_STATE;
+    }
+    }else
+    {
+    s.status=COMMENT_STATE;
+    }
+    }
+    if(s.status===COMMENT_STATE){
+    if(s.gzhead.comment){
+    beg=s.pending;
+    
+    
+    do{
+    if(s.pending===s.pending_buf_size){
+    if(s.gzhead.hcrc&&s.pending>beg){
+    strm.adler=crc32(strm.adler,s.pending_buf,s.pending-beg,beg);
+    }
+    flush_pending(strm);
+    beg=s.pending;
+    if(s.pending===s.pending_buf_size){
+    val=1;
+    break;
+    }
+    }
+    
+    if(s.gzindex<s.gzhead.comment.length){
+    val=s.gzhead.comment.charCodeAt(s.gzindex++)&0xff;
+    }else{
+    val=0;
+    }
+    put_byte(s,val);
+    }while(val!==0);
+    
+    if(s.gzhead.hcrc&&s.pending>beg){
+    strm.adler=crc32(strm.adler,s.pending_buf,s.pending-beg,beg);
+    }
+    if(val===0){
+    s.status=HCRC_STATE;
+    }
+    }else
+    {
+    s.status=HCRC_STATE;
+    }
+    }
+    if(s.status===HCRC_STATE){
+    if(s.gzhead.hcrc){
+    if(s.pending+2>s.pending_buf_size){
+    flush_pending(strm);
+    }
+    if(s.pending+2<=s.pending_buf_size){
+    put_byte(s,strm.adler&0xff);
+    put_byte(s,strm.adler>>8&0xff);
+    strm.adler=0;
+    s.status=BUSY_STATE;
+    }
+    }else
+    {
+    s.status=BUSY_STATE;
+    }
+    }
+    
+    
+    
+    if(s.pending!==0){
+    flush_pending(strm);
+    if(strm.avail_out===0){
+    
+    
+    
+    
+    
+    
+    s.last_flush=-1;
+    return Z_OK;
+    }
+    
+    
+    
+    
+    
+    }else if(strm.avail_in===0&&rank(flush)<=rank(old_flush)&&
+    flush!==Z_FINISH){
+    return err(strm,Z_BUF_ERROR);
+    }
+    
+    
+    if(s.status===FINISH_STATE&&strm.avail_in!==0){
+    return err(strm,Z_BUF_ERROR);
+    }
+    
+    
+    
+    if(strm.avail_in!==0||s.lookahead!==0||
+    flush!==Z_NO_FLUSH&&s.status!==FINISH_STATE){
+    var bstate=s.strategy===Z_HUFFMAN_ONLY?deflate_huff(s,flush):
+    s.strategy===Z_RLE?deflate_rle(s,flush):
+    configuration_table[s.level].func(s,flush);
+    
+    if(bstate===BS_FINISH_STARTED||bstate===BS_FINISH_DONE){
+    s.status=FINISH_STATE;
+    }
+    if(bstate===BS_NEED_MORE||bstate===BS_FINISH_STARTED){
+    if(strm.avail_out===0){
+    s.last_flush=-1;
+    
+    }
+    return Z_OK;
+    
+    
+    
+    
+    
+    
+    
+    }
+    if(bstate===BS_BLOCK_DONE){
+    if(flush===Z_PARTIAL_FLUSH){
+    trees._tr_align(s);
+    }else
+    if(flush!==Z_BLOCK){
+    
+    trees._tr_stored_block(s,0,0,false);
+    
+    
+    
+    if(flush===Z_FULL_FLUSH){
+    
+    zero(s.head);
+    
+    if(s.lookahead===0){
+    s.strstart=0;
+    s.block_start=0;
+    s.insert=0;
+    }
+    }
+    }
+    flush_pending(strm);
+    if(strm.avail_out===0){
+    s.last_flush=-1;
+    return Z_OK;
+    }
+    }
+    }
+    
+    
+    
+    if(flush!==Z_FINISH){return Z_OK;}
+    if(s.wrap<=0){return Z_STREAM_END;}
+    
+    
+    if(s.wrap===2){
+    put_byte(s,strm.adler&0xff);
+    put_byte(s,strm.adler>>8&0xff);
+    put_byte(s,strm.adler>>16&0xff);
+    put_byte(s,strm.adler>>24&0xff);
+    put_byte(s,strm.total_in&0xff);
+    put_byte(s,strm.total_in>>8&0xff);
+    put_byte(s,strm.total_in>>16&0xff);
+    put_byte(s,strm.total_in>>24&0xff);
+    }else
+    
+    {
+    putShortMSB(s,strm.adler>>>16);
+    putShortMSB(s,strm.adler&0xffff);
+    }
+    
+    flush_pending(strm);
+    
+    
+    
+    if(s.wrap>0){s.wrap=-s.wrap;}
+    
+    return s.pending!==0?Z_OK:Z_STREAM_END;
+    }
+    
+    function deflateEnd(strm){
+    var status;
+    
+    if(!strm||!strm.state){
+    return Z_STREAM_ERROR;
+    }
+    
+    status=strm.state.status;
+    if(status!==INIT_STATE&&
+    status!==EXTRA_STATE&&
+    status!==NAME_STATE&&
+    status!==COMMENT_STATE&&
+    status!==HCRC_STATE&&
+    status!==BUSY_STATE&&
+    status!==FINISH_STATE)
+    {
+    return err(strm,Z_STREAM_ERROR);
+    }
+    
+    strm.state=null;
+    
+    return status===BUSY_STATE?err(strm,Z_DATA_ERROR):Z_OK;
+    }
+    
+    
+    
+    
+    
+    
+    function deflateSetDictionary(strm,dictionary){
+    var dictLength=dictionary.length;
+    
+    var s;
+    var str,n;
+    var wrap;
+    var avail;
+    var next;
+    var input;
+    var tmpDict;
+    
+    if(!strm||!strm.state){
+    return Z_STREAM_ERROR;
+    }
+    
+    s=strm.state;
+    wrap=s.wrap;
+    
+    if(wrap===2||wrap===1&&s.status!==INIT_STATE||s.lookahead){
+    return Z_STREAM_ERROR;
+    }
+    
+    
+    if(wrap===1){
+    
+    strm.adler=adler32(strm.adler,dictionary,dictLength,0);
+    }
+    
+    s.wrap=0;
+    
+    
+    if(dictLength>=s.w_size){
+    if(wrap===0){
+    
+    zero(s.head);
+    s.strstart=0;
+    s.block_start=0;
+    s.insert=0;
+    }
+    
+    
+    tmpDict=new utils.Buf8(s.w_size);
+    utils.arraySet(tmpDict,dictionary,dictLength-s.w_size,s.w_size,0);
+    dictionary=tmpDict;
+    dictLength=s.w_size;
+    }
+    
+    avail=strm.avail_in;
+    next=strm.next_in;
+    input=strm.input;
+    strm.avail_in=dictLength;
+    strm.next_in=0;
+    strm.input=dictionary;
+    fill_window(s);
+    while(s.lookahead>=MIN_MATCH){
+    str=s.strstart;
+    n=s.lookahead-(MIN_MATCH-1);
+    do{
+    
+    s.ins_h=(s.ins_h<<s.hash_shift^s.window[str+MIN_MATCH-1])&s.hash_mask;
+    
+    s.prev[str&s.w_mask]=s.head[s.ins_h];
+    
+    s.head[s.ins_h]=str;
+    str++;
+    }while(--n);
+    s.strstart=str;
+    s.lookahead=MIN_MATCH-1;
+    fill_window(s);
+    }
+    s.strstart+=s.lookahead;
+    s.block_start=s.strstart;
+    s.insert=s.lookahead;
+    s.lookahead=0;
+    s.match_length=s.prev_length=MIN_MATCH-1;
+    s.match_available=0;
+    strm.next_in=next;
+    strm.input=input;
+    strm.avail_in=avail;
+    s.wrap=wrap;
+    return Z_OK;
+    }
+    
+    
+    exports.deflateInit=deflateInit;
+    exports.deflateInit2=deflateInit2;
+    exports.deflateReset=deflateReset;
+    exports.deflateResetKeep=deflateResetKeep;
+    exports.deflateSetHeader=deflateSetHeader;
+    exports.deflate=deflate;
+    exports.deflateEnd=deflateEnd;
+    exports.deflateSetDictionary=deflateSetDictionary;
+    exports.deflateInfo='pako deflate (from Nodeca project)';
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    },{"../utils/common":147,"./adler32":148,"./crc32":150,"./messages":152,"./trees":153}],152:[function(require,module,exports){
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    module.exports={
+    2:'need dictionary',
+    1:'stream end',
+    0:'',
+    '-1':'file error',
+    '-2':'stream error',
+    '-3':'data error',
+    '-4':'insufficient memory',
+    '-5':'buffer error',
+    '-6':'incompatible version'};
+    
+    
+    },{}],153:[function(require,module,exports){
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    var utils=require('../utils/common');
+    
+    
+    
+    
+    
+    
+    
+    
+    var Z_FIXED=4;
+    
+    
+    
+    var Z_BINARY=0;
+    var Z_TEXT=1;
+    
+    var Z_UNKNOWN=2;
+    
+    
+    
+    
+    function zero(buf){var len=buf.length;while(--len>=0){buf[len]=0;}}
+    
+    
+    
+    var STORED_BLOCK=0;
+    var STATIC_TREES=1;
+    var DYN_TREES=2;
+    
+    
+    var MIN_MATCH=3;
+    var MAX_MATCH=258;
+    
+    
+    
+    
+    
+    
+    
+    var LENGTH_CODES=29;
+    
+    
+    var LITERALS=256;
+    
+    
+    var L_CODES=LITERALS+1+LENGTH_CODES;
+    
+    
+    var D_CODES=30;
+    
+    
+    var BL_CODES=19;
+    
+    
+    var HEAP_SIZE=2*L_CODES+1;
+    
+    
+    var MAX_BITS=15;
+    
+    
+    var Buf_size=16;
+    
+    
+    
+    
+    
+    
+    
+    var MAX_BL_BITS=7;
+    
+    
+    var END_BLOCK=256;
+    
+    
+    var REP_3_6=16;
+    
+    
+    var REPZ_3_10=17;
+    
+    
+    var REPZ_11_138=18;
+    
+    
+    
+    var extra_lbits=
+    [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];
+    
+    var extra_dbits=
+    [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];
+    
+    var extra_blbits=
+    [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];
+    
+    var bl_order=
+    [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    var DIST_CODE_LEN=512;
+    
+    
+    var static_ltree=new Array((L_CODES+2)*2);
+    zero(static_ltree);
+    
+    
+    
+    
+    
+    
+    var static_dtree=new Array(D_CODES*2);
+    zero(static_dtree);
+    
+    
+    
+    
+    var _dist_code=new Array(DIST_CODE_LEN);
+    zero(_dist_code);
+    
+    
+    
+    
+    
+    var _length_code=new Array(MAX_MATCH-MIN_MATCH+1);
+    zero(_length_code);
+    
+    
+    var base_length=new Array(LENGTH_CODES);
+    zero(base_length);
+    
+    
+    var base_dist=new Array(D_CODES);
+    zero(base_dist);
+    
+    
+    
+    function StaticTreeDesc(static_tree,extra_bits,extra_base,elems,max_length){
+    
+    this.static_tree=static_tree;
+    this.extra_bits=extra_bits;
+    this.extra_base=extra_base;
+    this.elems=elems;
+    this.max_length=max_length;
+    
+    
+    this.has_stree=static_tree&&static_tree.length;
+    }
+    
+    
+    var static_l_desc;
+    var static_d_desc;
+    var static_bl_desc;
+    
+    
+    function TreeDesc(dyn_tree,stat_desc){
+    this.dyn_tree=dyn_tree;
+    this.max_code=0;
+    this.stat_desc=stat_desc;
+    }
+    
+    
+    
+    function d_code(dist){
+    return dist<256?_dist_code[dist]:_dist_code[256+(dist>>>7)];
+    }
+    
+    
+    
+    
+    
+    
+    function put_short(s,w){
+    
+    
+    s.pending_buf[s.pending++]=w&0xff;
+    s.pending_buf[s.pending++]=w>>>8&0xff;
+    }
+    
+    
+    
+    
+    
+    
+    function send_bits(s,value,length){
+    if(s.bi_valid>Buf_size-length){
+    s.bi_buf|=value<<s.bi_valid&0xffff;
+    put_short(s,s.bi_buf);
+    s.bi_buf=value>>Buf_size-s.bi_valid;
+    s.bi_valid+=length-Buf_size;
+    }else{
+    s.bi_buf|=value<<s.bi_valid&0xffff;
+    s.bi_valid+=length;
+    }
+    }
+    
+    
+    function send_code(s,c,tree){
+    send_bits(s,tree[c*2],tree[c*2+1]);
+    }
+    
+    
+    
+    
+    
+    
+    
+    function bi_reverse(code,len){
+    var res=0;
+    do{
+    res|=code&1;
+    code>>>=1;
+    res<<=1;
+    }while(--len>0);
+    return res>>>1;
+    }
+    
+    
+    
+    
+    
+    function bi_flush(s){
+    if(s.bi_valid===16){
+    put_short(s,s.bi_buf);
+    s.bi_buf=0;
+    s.bi_valid=0;
+    
+    }else if(s.bi_valid>=8){
+    s.pending_buf[s.pending++]=s.bi_buf&0xff;
+    s.bi_buf>>=8;
+    s.bi_valid-=8;
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function gen_bitlen(s,desc)
+    
+    
+    {
+    var tree=desc.dyn_tree;
+    var max_code=desc.max_code;
+    var stree=desc.stat_desc.static_tree;
+    var has_stree=desc.stat_desc.has_stree;
+    var extra=desc.stat_desc.extra_bits;
+    var base=desc.stat_desc.extra_base;
+    var max_length=desc.stat_desc.max_length;
+    var h;
+    var n,m;
+    var bits;
+    var xbits;
+    var f;
+    var overflow=0;
+    
+    for(bits=0;bits<=MAX_BITS;bits++){
+    s.bl_count[bits]=0;
+    }
+    
+    
+    
+    
+    tree[s.heap[s.heap_max]*2+1]=0;
+    
+    for(h=s.heap_max+1;h<HEAP_SIZE;h++){
+    n=s.heap[h];
+    bits=tree[tree[n*2+1]*2+1]+1;
+    if(bits>max_length){
+    bits=max_length;
+    overflow++;
+    }
+    tree[n*2+1]=bits;
+    
+    
+    if(n>max_code){continue;}
+    
+    s.bl_count[bits]++;
+    xbits=0;
+    if(n>=base){
+    xbits=extra[n-base];
+    }
+    f=tree[n*2];
+    s.opt_len+=f*(bits+xbits);
+    if(has_stree){
+    s.static_len+=f*(stree[n*2+1]+xbits);
+    }
+    }
+    if(overflow===0){return;}
+    
+    
+    
+    
+    
+    do{
+    bits=max_length-1;
+    while(s.bl_count[bits]===0){bits--;}
+    s.bl_count[bits]--;
+    s.bl_count[bits+1]+=2;
+    s.bl_count[max_length]--;
+    
+    
+    
+    overflow-=2;
+    }while(overflow>0);
+    
+    
+    
+    
+    
+    
+    for(bits=max_length;bits!==0;bits--){
+    n=s.bl_count[bits];
+    while(n!==0){
+    m=s.heap[--h];
+    if(m>max_code){continue;}
+    if(tree[m*2+1]!==bits){
+    
+    s.opt_len+=(bits-tree[m*2+1])*tree[m*2];
+    tree[m*2+1]=bits;
+    }
+    n--;
+    }
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function gen_codes(tree,max_code,bl_count)
+    
+    
+    
+    {
+    var next_code=new Array(MAX_BITS+1);
+    var code=0;
+    var bits;
+    var n;
+    
+    
+    
+    
+    for(bits=1;bits<=MAX_BITS;bits++){
+    next_code[bits]=code=code+bl_count[bits-1]<<1;
+    }
+    
+    
+    
+    
+    
+    
+    
+    for(n=0;n<=max_code;n++){
+    var len=tree[n*2+1];
+    if(len===0){continue;}
+    
+    tree[n*2]=bi_reverse(next_code[len]++,len);
+    
+    
+    
+    }
+    }
+    
+    
+    
+    
+    
+    function tr_static_init(){
+    var n;
+    var bits;
+    var length;
+    var code;
+    var dist;
+    var bl_count=new Array(MAX_BITS+1);
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    length=0;
+    for(code=0;code<LENGTH_CODES-1;code++){
+    base_length[code]=length;
+    for(n=0;n<1<<extra_lbits[code];n++){
+    _length_code[length++]=code;
+    }
+    }
+    
+    
+    
+    
+    
+    _length_code[length-1]=code;
+    
+    
+    dist=0;
+    for(code=0;code<16;code++){
+    base_dist[code]=dist;
+    for(n=0;n<1<<extra_dbits[code];n++){
+    _dist_code[dist++]=code;
+    }
+    }
+    
+    dist>>=7;
+    for(;code<D_CODES;code++){
+    base_dist[code]=dist<<7;
+    for(n=0;n<1<<extra_dbits[code]-7;n++){
+    _dist_code[256+dist++]=code;
+    }
+    }
+    
+    
+    
+    for(bits=0;bits<=MAX_BITS;bits++){
+    bl_count[bits]=0;
+    }
+    
+    n=0;
+    while(n<=143){
+    static_ltree[n*2+1]=8;
+    n++;
+    bl_count[8]++;
+    }
+    while(n<=255){
+    static_ltree[n*2+1]=9;
+    n++;
+    bl_count[9]++;
+    }
+    while(n<=279){
+    static_ltree[n*2+1]=7;
+    n++;
+    bl_count[7]++;
+    }
+    while(n<=287){
+    static_ltree[n*2+1]=8;
+    n++;
+    bl_count[8]++;
+    }
+    
+    
+    
+    
+    gen_codes(static_ltree,L_CODES+1,bl_count);
+    
+    
+    for(n=0;n<D_CODES;n++){
+    static_dtree[n*2+1]=5;
+    static_dtree[n*2]=bi_reverse(n,5);
+    }
+    
+    
+    static_l_desc=new StaticTreeDesc(static_ltree,extra_lbits,LITERALS+1,L_CODES,MAX_BITS);
+    static_d_desc=new StaticTreeDesc(static_dtree,extra_dbits,0,D_CODES,MAX_BITS);
+    static_bl_desc=new StaticTreeDesc(new Array(0),extra_blbits,0,BL_CODES,MAX_BL_BITS);
+    
+    
+    }
+    
+    
+    
+    
+    
+    function init_block(s){
+    var n;
+    
+    
+    for(n=0;n<L_CODES;n++){s.dyn_ltree[n*2]=0;}
+    for(n=0;n<D_CODES;n++){s.dyn_dtree[n*2]=0;}
+    for(n=0;n<BL_CODES;n++){s.bl_tree[n*2]=0;}
+    
+    s.dyn_ltree[END_BLOCK*2]=1;
+    s.opt_len=s.static_len=0;
+    s.last_lit=s.matches=0;
+    }
+    
+    
+    
+    
+    
+    function bi_windup(s)
+    {
+    if(s.bi_valid>8){
+    put_short(s,s.bi_buf);
+    }else if(s.bi_valid>0){
+    
+    s.pending_buf[s.pending++]=s.bi_buf;
+    }
+    s.bi_buf=0;
+    s.bi_valid=0;
+    }
+    
+    
+    
+    
+    
+    function copy_block(s,buf,len,header)
+    
+    
+    
+    
+    {
+    bi_windup(s);
+    
+    if(header){
+    put_short(s,len);
+    put_short(s,~len);
+    }
+    
+    
+    
+    utils.arraySet(s.pending_buf,s.window,buf,len,s.pending);
+    s.pending+=len;
+    }
+    
+    
+    
+    
+    
+    function smaller(tree,n,m,depth){
+    var _n2=n*2;
+    var _m2=m*2;
+    return tree[_n2]<tree[_m2]||
+    tree[_n2]===tree[_m2]&&depth[n]<=depth[m];
+    }
+    
+    
+    
+    
+    
+    
+    
+    function pqdownheap(s,tree,k)
+    
+    
+    
+    {
+    var v=s.heap[k];
+    var j=k<<1;
+    while(j<=s.heap_len){
+    
+    if(j<s.heap_len&&
+    smaller(tree,s.heap[j+1],s.heap[j],s.depth)){
+    j++;
+    }
+    
+    if(smaller(tree,v,s.heap[j],s.depth)){break;}
+    
+    
+    s.heap[k]=s.heap[j];
+    k=j;
+    
+    
+    j<<=1;
+    }
+    s.heap[k]=v;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function compress_block(s,ltree,dtree)
+    
+    
+    
+    {
+    var dist;
+    var lc;
+    var lx=0;
+    var code;
+    var extra;
+    
+    if(s.last_lit!==0){
+    do{
+    dist=s.pending_buf[s.d_buf+lx*2]<<8|s.pending_buf[s.d_buf+lx*2+1];
+    lc=s.pending_buf[s.l_buf+lx];
+    lx++;
+    
+    if(dist===0){
+    send_code(s,lc,ltree);
+    
+    }else{
+    
+    code=_length_code[lc];
+    send_code(s,code+LITERALS+1,ltree);
+    extra=extra_lbits[code];
+    if(extra!==0){
+    lc-=base_length[code];
+    send_bits(s,lc,extra);
+    }
+    dist--;
+    code=d_code(dist);
+    
+    
+    send_code(s,code,dtree);
+    extra=extra_dbits[code];
+    if(extra!==0){
+    dist-=base_dist[code];
+    send_bits(s,dist,extra);
+    }
+    }
+    
+    
+    
+    
+    
+    }while(lx<s.last_lit);
+    }
+    
+    send_code(s,END_BLOCK,ltree);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function build_tree(s,desc)
+    
+    
+    {
+    var tree=desc.dyn_tree;
+    var stree=desc.stat_desc.static_tree;
+    var has_stree=desc.stat_desc.has_stree;
+    var elems=desc.stat_desc.elems;
+    var n,m;
+    var max_code=-1;
+    var node;
+    
+    
+    
+    
+    
+    s.heap_len=0;
+    s.heap_max=HEAP_SIZE;
+    
+    for(n=0;n<elems;n++){
+    if(tree[n*2]!==0){
+    s.heap[++s.heap_len]=max_code=n;
+    s.depth[n]=0;
+    
+    }else{
+    tree[n*2+1]=0;
+    }
+    }
+    
+    
+    
+    
+    
+    
+    while(s.heap_len<2){
+    node=s.heap[++s.heap_len]=max_code<2?++max_code:0;
+    tree[node*2]=1;
+    s.depth[node]=0;
+    s.opt_len--;
+    
+    if(has_stree){
+    s.static_len-=stree[node*2+1];
+    }
+    
+    }
+    desc.max_code=max_code;
+    
+    
+    
+    
+    for(n=s.heap_len>>1;n>=1;n--){pqdownheap(s,tree,n);}
+    
+    
+    
+    
+    node=elems;
+    do{
+    
+    
+    n=s.heap[1];
+    s.heap[1]=s.heap[s.heap_len--];
+    pqdownheap(s,tree,1);
+    
+    
+    m=s.heap[1];
+    
+    s.heap[--s.heap_max]=n;
+    s.heap[--s.heap_max]=m;
+    
+    
+    tree[node*2]=tree[n*2]+tree[m*2];
+    s.depth[node]=(s.depth[n]>=s.depth[m]?s.depth[n]:s.depth[m])+1;
+    tree[n*2+1]=tree[m*2+1]=node;
+    
+    
+    s.heap[1]=node++;
+    pqdownheap(s,tree,1);
+    
+    }while(s.heap_len>=2);
+    
+    s.heap[--s.heap_max]=s.heap[1];
+    
+    
+    
+    
+    gen_bitlen(s,desc);
+    
+    
+    gen_codes(tree,max_code,s.bl_count);
+    }
+    
+    
+    
+    
+    
+    
+    function scan_tree(s,tree,max_code)
+    
+    
+    
+    {
+    var n;
+    var prevlen=-1;
+    var curlen;
+    
+    var nextlen=tree[0*2+1];
+    
+    var count=0;
+    var max_count=7;
+    var min_count=4;
+    
+    if(nextlen===0){
+    max_count=138;
+    min_count=3;
+    }
+    tree[(max_code+1)*2+1]=0xffff;
+    
+    for(n=0;n<=max_code;n++){
+    curlen=nextlen;
+    nextlen=tree[(n+1)*2+1];
+    
+    if(++count<max_count&&curlen===nextlen){
+    continue;
+    
+    }else if(count<min_count){
+    s.bl_tree[curlen*2]+=count;
+    
+    }else if(curlen!==0){
+    
+    if(curlen!==prevlen){s.bl_tree[curlen*2]++;}
+    s.bl_tree[REP_3_6*2]++;
+    
+    }else if(count<=10){
+    s.bl_tree[REPZ_3_10*2]++;
+    
+    }else{
+    s.bl_tree[REPZ_11_138*2]++;
+    }
+    
+    count=0;
+    prevlen=curlen;
+    
+    if(nextlen===0){
+    max_count=138;
+    min_count=3;
+    
+    }else if(curlen===nextlen){
+    max_count=6;
+    min_count=3;
+    
+    }else{
+    max_count=7;
+    min_count=4;
+    }
+    }
+    }
+    
+    
+    
+    
+    
+    
+    function send_tree(s,tree,max_code)
+    
+    
+    
+    {
+    var n;
+    var prevlen=-1;
+    var curlen;
+    
+    var nextlen=tree[0*2+1];
+    
+    var count=0;
+    var max_count=7;
+    var min_count=4;
+    
+    
+    if(nextlen===0){
+    max_count=138;
+    min_count=3;
+    }
+    
+    for(n=0;n<=max_code;n++){
+    curlen=nextlen;
+    nextlen=tree[(n+1)*2+1];
+    
+    if(++count<max_count&&curlen===nextlen){
+    continue;
+    
+    }else if(count<min_count){
+    do{send_code(s,curlen,s.bl_tree);}while(--count!==0);
+    
+    }else if(curlen!==0){
+    if(curlen!==prevlen){
+    send_code(s,curlen,s.bl_tree);
+    count--;
+    }
+    
+    send_code(s,REP_3_6,s.bl_tree);
+    send_bits(s,count-3,2);
+    
+    }else if(count<=10){
+    send_code(s,REPZ_3_10,s.bl_tree);
+    send_bits(s,count-3,3);
+    
+    }else{
+    send_code(s,REPZ_11_138,s.bl_tree);
+    send_bits(s,count-11,7);
+    }
+    
+    count=0;
+    prevlen=curlen;
+    if(nextlen===0){
+    max_count=138;
+    min_count=3;
+    
+    }else if(curlen===nextlen){
+    max_count=6;
+    min_count=3;
+    
+    }else{
+    max_count=7;
+    min_count=4;
+    }
+    }
+    }
+    
+    
+    
+    
+    
+    
+    function build_bl_tree(s){
+    var max_blindex;
+    
+    
+    scan_tree(s,s.dyn_ltree,s.l_desc.max_code);
+    scan_tree(s,s.dyn_dtree,s.d_desc.max_code);
+    
+    
+    build_tree(s,s.bl_desc);
+    
+    
+    
+    
+    
+    
+    
+    
+    for(max_blindex=BL_CODES-1;max_blindex>=3;max_blindex--){
+    if(s.bl_tree[bl_order[max_blindex]*2+1]!==0){
+    break;
+    }
+    }
+    
+    s.opt_len+=3*(max_blindex+1)+5+5+4;
+    
+    
+    
+    return max_blindex;
+    }
+    
+    
+    
+    
+    
+    
+    
+    function send_all_trees(s,lcodes,dcodes,blcodes)
+    
+    
+    {
+    var rank;
+    
+    
+    
+    
+    
+    send_bits(s,lcodes-257,5);
+    send_bits(s,dcodes-1,5);
+    send_bits(s,blcodes-4,4);
+    for(rank=0;rank<blcodes;rank++){
+    
+    send_bits(s,s.bl_tree[bl_order[rank]*2+1],3);
+    }
+    
+    
+    send_tree(s,s.dyn_ltree,lcodes-1);
+    
+    
+    send_tree(s,s.dyn_dtree,dcodes-1);
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function detect_data_type(s){
+    
+    
+    
+    
+    var black_mask=0xf3ffc07f;
+    var n;
+    
+    
+    for(n=0;n<=31;n++,black_mask>>>=1){
+    if(black_mask&1&&s.dyn_ltree[n*2]!==0){
+    return Z_BINARY;
+    }
+    }
+    
+    
+    if(s.dyn_ltree[9*2]!==0||s.dyn_ltree[10*2]!==0||
+    s.dyn_ltree[13*2]!==0){
+    return Z_TEXT;
+    }
+    for(n=32;n<LITERALS;n++){
+    if(s.dyn_ltree[n*2]!==0){
+    return Z_TEXT;
+    }
+    }
+    
+    
+    
+    
+    return Z_BINARY;
+    }
+    
+    
+    var static_init_done=false;
+    
+    
+    
+    
+    function _tr_init(s)
+    {
+    
+    if(!static_init_done){
+    tr_static_init();
+    static_init_done=true;
+    }
+    
+    s.l_desc=new TreeDesc(s.dyn_ltree,static_l_desc);
+    s.d_desc=new TreeDesc(s.dyn_dtree,static_d_desc);
+    s.bl_desc=new TreeDesc(s.bl_tree,static_bl_desc);
+    
+    s.bi_buf=0;
+    s.bi_valid=0;
+    
+    
+    init_block(s);
+    }
+    
+    
+    
+    
+    
+    function _tr_stored_block(s,buf,stored_len,last)
+    
+    
+    
+    
+    {
+    send_bits(s,(STORED_BLOCK<<1)+(last?1:0),3);
+    copy_block(s,buf,stored_len,true);
+    }
+    
+    
+    
+    
+    
+    
+    function _tr_align(s){
+    send_bits(s,STATIC_TREES<<1,3);
+    send_code(s,END_BLOCK,static_ltree);
+    bi_flush(s);
+    }
+    
+    
+    
+    
+    
+    
+    function _tr_flush_block(s,buf,stored_len,last)
+    
+    
+    
+    
+    {
+    var opt_lenb,static_lenb;
+    var max_blindex=0;
+    
+    
+    if(s.level>0){
+    
+    
+    if(s.strm.data_type===Z_UNKNOWN){
+    s.strm.data_type=detect_data_type(s);
+    }
+    
+    
+    build_tree(s,s.l_desc);
+    
+    
+    
+    build_tree(s,s.d_desc);
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    max_blindex=build_bl_tree(s);
+    
+    
+    opt_lenb=s.opt_len+3+7>>>3;
+    static_lenb=s.static_len+3+7>>>3;
+    
+    
+    
+    
+    
+    if(static_lenb<=opt_lenb){opt_lenb=static_lenb;}
+    
+    }else{
+    
+    opt_lenb=static_lenb=stored_len+5;
+    }
+    
+    if(stored_len+4<=opt_lenb&&buf!==-1){
+    
+    
+    
+    
+    
+    
+    
+    
+    _tr_stored_block(s,buf,stored_len,last);
+    
+    }else if(s.strategy===Z_FIXED||static_lenb===opt_lenb){
+    
+    send_bits(s,(STATIC_TREES<<1)+(last?1:0),3);
+    compress_block(s,static_ltree,static_dtree);
+    
+    }else{
+    send_bits(s,(DYN_TREES<<1)+(last?1:0),3);
+    send_all_trees(s,s.l_desc.max_code+1,s.d_desc.max_code+1,max_blindex+1);
+    compress_block(s,s.dyn_ltree,s.dyn_dtree);
+    }
+    
+    
+    
+    
+    init_block(s);
+    
+    if(last){
+    bi_windup(s);
+    }
+    
+    
+    }
+    
+    
+    
+    
+    
+    function _tr_tally(s,dist,lc)
+    
+    
+    
+    {
+    
+    
+    s.pending_buf[s.d_buf+s.last_lit*2]=dist>>>8&0xff;
+    s.pending_buf[s.d_buf+s.last_lit*2+1]=dist&0xff;
+    
+    s.pending_buf[s.l_buf+s.last_lit]=lc&0xff;
+    s.last_lit++;
+    
+    if(dist===0){
+    
+    s.dyn_ltree[lc*2]++;
+    }else{
+    s.matches++;
+    
+    dist--;
+    
+    
+    
+    
+    s.dyn_ltree[(_length_code[lc]+LITERALS+1)*2]++;
+    s.dyn_dtree[d_code(dist)*2]++;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    return s.last_lit===s.lit_bufsize-1;
+    
+    
+    
+    
+    }
+    
+    exports._tr_init=_tr_init;
+    exports._tr_stored_block=_tr_stored_block;
+    exports._tr_flush_block=_tr_flush_block;
+    exports._tr_tally=_tr_tally;
+    exports._tr_align=_tr_align;
+    
+    },{"../utils/common":147}],154:[function(require,module,exports){
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function ZStream(){
+    
+    this.input=null;
+    this.next_in=0;
+    
+    this.avail_in=0;
+    
+    this.total_in=0;
+    
+    this.output=null;
+    this.next_out=0;
+    
+    this.avail_out=0;
+    
+    this.total_out=0;
+    
+    this.msg='';
+    
+    this.state=null;
+    
+    this.data_type=2;
+    
+    this.adler=0;
+    }
+    
+    module.exports=ZStream;
+    
+    },{}],155:[function(require,module,exports){
+    module.exports=function parseCacheControl(field){
+    
+    if(typeof field!=='string'){
+    return null;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    var regex=/(?:^|(?:\s*\,\s*))([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)(?:\=(?:([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)|(?:\"((?:[^"\\]|\\.)*)\")))?/g;
+    
+    var header={};
+    var err=field.replace(regex,function($0,$1,$2,$3){
+    var value=$2||$3;
+    header[$1]=value?value.toLowerCase():true;
+    return'';
+    });
+    
+    if(header['max-age']){
+    try{
+    var maxAge=parseInt(header['max-age'],10);
+    if(isNaN(maxAge)){
+    return null;
+    }
+    
+    header['max-age']=maxAge;
+    }
+    catch(err){}
+    }
+    
+    return err?null:header;
+    };
+    
+    },{}],156:[function(require,module,exports){
+    (function(process){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function normalizeArray(parts,allowAboveRoot){
+    
+    var up=0;
+    for(var i=parts.length-1;i>=0;i--){
+    var last=parts[i];
+    if(last==='.'){
+    parts.splice(i,1);
+    }else if(last==='..'){
+    parts.splice(i,1);
+    up++;
+    }else if(up){
+    parts.splice(i,1);
+    up--;
+    }
+    }
+    
+    
+    if(allowAboveRoot){
+    for(;up--;up){
+    parts.unshift('..');
+    }
+    }
+    
+    return parts;
+    }
+    
+    
+    
+    exports.resolve=function(){
+    var resolvedPath='',
+    resolvedAbsolute=false;
+    
+    for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){
+    var path=i>=0?arguments[i]:process.cwd();
+    
+    
+    if(typeof path!=='string'){
+    throw new TypeError('Arguments to path.resolve must be strings');
+    }else if(!path){
+    continue;
+    }
+    
+    resolvedPath=path+'/'+resolvedPath;
+    resolvedAbsolute=path.charAt(0)==='/';
+    }
+    
+    
+    
+    
+    
+    resolvedPath=normalizeArray(filter(resolvedPath.split('/'),function(p){
+    return!!p;
+    }),!resolvedAbsolute).join('/');
+    
+    return(resolvedAbsolute?'/':'')+resolvedPath||'.';
+    };
+    
+    
+    
+    exports.normalize=function(path){
+    var isAbsolute=exports.isAbsolute(path),
+    trailingSlash=substr(path,-1)==='/';
+    
+    
+    path=normalizeArray(filter(path.split('/'),function(p){
+    return!!p;
+    }),!isAbsolute).join('/');
+    
+    if(!path&&!isAbsolute){
+    path='.';
+    }
+    if(path&&trailingSlash){
+    path+='/';
+    }
+    
+    return(isAbsolute?'/':'')+path;
+    };
+    
+    
+    exports.isAbsolute=function(path){
+    return path.charAt(0)==='/';
+    };
+    
+    
+    exports.join=function(){
+    var paths=Array.prototype.slice.call(arguments,0);
+    return exports.normalize(filter(paths,function(p,index){
+    if(typeof p!=='string'){
+    throw new TypeError('Arguments to path.join must be strings');
+    }
+    return p;
+    }).join('/'));
+    };
+    
+    
+    
+    
+    exports.relative=function(from,to){
+    from=exports.resolve(from).substr(1);
+    to=exports.resolve(to).substr(1);
+    
+    function trim(arr){
+    var start=0;
+    for(;start<arr.length;start++){
+    if(arr[start]!=='')break;
+    }
+    
+    var end=arr.length-1;
+    for(;end>=0;end--){
+    if(arr[end]!=='')break;
+    }
+    
+    if(start>end)return[];
+    return arr.slice(start,end-start+1);
+    }
+    
+    var fromParts=trim(from.split('/'));
+    var toParts=trim(to.split('/'));
+    
+    var length=Math.min(fromParts.length,toParts.length);
+    var samePartsLength=length;
+    for(var i=0;i<length;i++){
+    if(fromParts[i]!==toParts[i]){
+    samePartsLength=i;
+    break;
+    }
+    }
+    
+    var outputParts=[];
+    for(var i=samePartsLength;i<fromParts.length;i++){
+    outputParts.push('..');
+    }
+    
+    outputParts=outputParts.concat(toParts.slice(samePartsLength));
+    
+    return outputParts.join('/');
+    };
+    
+    exports.sep='/';
+    exports.delimiter=':';
+    
+    exports.dirname=function(path){
+    if(typeof path!=='string')path=path+'';
+    if(path.length===0)return'.';
+    var code=path.charCodeAt(0);
+    var hasRoot=code===47;
+    var end=-1;
+    var matchedSlash=true;
+    for(var i=path.length-1;i>=1;--i){
+    code=path.charCodeAt(i);
+    if(code===47){
+    if(!matchedSlash){
+    end=i;
+    break;
+    }
+    }else{
+    
+    matchedSlash=false;
+    }
+    }
+    
+    if(end===-1)return hasRoot?'/':'.';
+    if(hasRoot&&end===1){
+    
+    
+    return'/';
+    }
+    return path.slice(0,end);
+    };
+    
+    function basename(path){
+    if(typeof path!=='string')path=path+'';
+    
+    var start=0;
+    var end=-1;
+    var matchedSlash=true;
+    var i;
+    
+    for(i=path.length-1;i>=0;--i){
+    if(path.charCodeAt(i)===47){
+    
+    
+    if(!matchedSlash){
+    start=i+1;
+    break;
+    }
+    }else if(end===-1){
+    
+    
+    matchedSlash=false;
+    end=i+1;
+    }
+    }
+    
+    if(end===-1)return'';
+    return path.slice(start,end);
+    }
+    
+    
+    
+    exports.basename=function(path,ext){
+    var f=basename(path);
+    if(ext&&f.substr(-1*ext.length)===ext){
+    f=f.substr(0,f.length-ext.length);
+    }
+    return f;
+    };
+    
+    exports.extname=function(path){
+    if(typeof path!=='string')path=path+'';
+    var startDot=-1;
+    var startPart=0;
+    var end=-1;
+    var matchedSlash=true;
+    
+    
+    var preDotState=0;
+    for(var i=path.length-1;i>=0;--i){
+    var code=path.charCodeAt(i);
+    if(code===47){
+    
+    
+    if(!matchedSlash){
+    startPart=i+1;
+    break;
+    }
+    continue;
+    }
+    if(end===-1){
+    
+    
+    matchedSlash=false;
+    end=i+1;
+    }
+    if(code===46){
+    
+    if(startDot===-1)
+    startDot=i;else
+    if(preDotState!==1)
+    preDotState=1;
+    }else if(startDot!==-1){
+    
+    
+    preDotState=-1;
+    }
+    }
+    
+    if(startDot===-1||end===-1||
+    
+    preDotState===0||
+    
+    preDotState===1&&startDot===end-1&&startDot===startPart+1){
+    return'';
+    }
+    return path.slice(startDot,end);
+    };
+    
+    function filter(xs,f){
+    if(xs.filter)return xs.filter(f);
+    var res=[];
+    for(var i=0;i<xs.length;i++){
+    if(f(xs[i],i,xs))res.push(xs[i]);
+    }
+    return res;
+    }
+    
+    
+    var substr='ab'.substr(-1)==='b'?
+    function(str,start,len){return str.substr(start,len);}:
+    function(str,start,len){
+    if(start<0)start=str.length+start;
+    return str.substr(start,len);
+    };
+    
+    
+    }).call(this,require('_process'));
+    },{"_process":158}],157:[function(require,module,exports){
+    (function(process){
+    'use strict';
+    
+    if(!process.version||
+    process.version.indexOf('v0.')===0||
+    process.version.indexOf('v1.')===0&&process.version.indexOf('v1.8.')!==0){
+    module.exports={nextTick:nextTick};
+    }else{
+    module.exports=process;
+    }
+    
+    function nextTick(fn,arg1,arg2,arg3){
+    if(typeof fn!=='function'){
+    throw new TypeError('"callback" argument must be a function');
+    }
+    var len=arguments.length;
+    var args,i;
+    switch(len){
+    case 0:
+    case 1:
+    return process.nextTick(fn);
+    case 2:
+    return process.nextTick(function afterTickOne(){
+    fn.call(null,arg1);
+    });
+    case 3:
+    return process.nextTick(function afterTickTwo(){
+    fn.call(null,arg1,arg2);
+    });
+    case 4:
+    return process.nextTick(function afterTickThree(){
+    fn.call(null,arg1,arg2,arg3);
+    });
+    default:
+    args=new Array(len-1);
+    i=0;
+    while(i<args.length){
+    args[i++]=arguments[i];
+    }
+    return process.nextTick(function afterTick(){
+    fn.apply(null,args);
+    });}
+    
+    }
+    
+    
+    }).call(this,require('_process'));
+    },{"_process":158}],158:[function(require,module,exports){
+    
+    var process=module.exports={};
+    
+    
+    
+    
+    
+    
+    var cachedSetTimeout;
+    var cachedClearTimeout;
+    
+    function defaultSetTimout(){
+    throw new Error('setTimeout has not been defined');
+    }
+    function defaultClearTimeout(){
+    throw new Error('clearTimeout has not been defined');
+    }
+    (function(){
+    try{
+    if(typeof setTimeout==='function'){
+    cachedSetTimeout=setTimeout;
+    }else{
+    cachedSetTimeout=defaultSetTimout;
+    }
+    }catch(e){
+    cachedSetTimeout=defaultSetTimout;
+    }
+    try{
+    if(typeof clearTimeout==='function'){
+    cachedClearTimeout=clearTimeout;
+    }else{
+    cachedClearTimeout=defaultClearTimeout;
+    }
+    }catch(e){
+    cachedClearTimeout=defaultClearTimeout;
+    }
+    })();
+    function runTimeout(fun){
+    if(cachedSetTimeout===setTimeout){
+    
+    return setTimeout(fun,0);
+    }
+    
+    if((cachedSetTimeout===defaultSetTimout||!cachedSetTimeout)&&setTimeout){
+    cachedSetTimeout=setTimeout;
+    return setTimeout(fun,0);
+    }
+    try{
+    
+    return cachedSetTimeout(fun,0);
+    }catch(e){
+    try{
+    
+    return cachedSetTimeout.call(null,fun,0);
+    }catch(e){
+    
+    return cachedSetTimeout.call(this,fun,0);
+    }
+    }
+    
+    
+    }
+    function runClearTimeout(marker){
+    if(cachedClearTimeout===clearTimeout){
+    
+    return clearTimeout(marker);
+    }
+    
+    if((cachedClearTimeout===defaultClearTimeout||!cachedClearTimeout)&&clearTimeout){
+    cachedClearTimeout=clearTimeout;
+    return clearTimeout(marker);
+    }
+    try{
+    
+    return cachedClearTimeout(marker);
+    }catch(e){
+    try{
+    
+    return cachedClearTimeout.call(null,marker);
+    }catch(e){
+    
+    
+    return cachedClearTimeout.call(this,marker);
+    }
+    }
+    
+    
+    
+    }
+    var queue=[];
+    var draining=false;
+    var currentQueue;
+    var queueIndex=-1;
+    
+    function cleanUpNextTick(){
+    if(!draining||!currentQueue){
+    return;
+    }
+    draining=false;
+    if(currentQueue.length){
+    queue=currentQueue.concat(queue);
+    }else{
+    queueIndex=-1;
+    }
+    if(queue.length){
+    drainQueue();
+    }
+    }
+    
+    function drainQueue(){
+    if(draining){
+    return;
+    }
+    var timeout=runTimeout(cleanUpNextTick);
+    draining=true;
+    
+    var len=queue.length;
+    while(len){
+    currentQueue=queue;
+    queue=[];
+    while(++queueIndex<len){
+    if(currentQueue){
+    currentQueue[queueIndex].run();
+    }
+    }
+    queueIndex=-1;
+    len=queue.length;
+    }
+    currentQueue=null;
+    draining=false;
+    runClearTimeout(timeout);
+    }
+    
+    process.nextTick=function(fun){
+    var args=new Array(arguments.length-1);
+    if(arguments.length>1){
+    for(var i=1;i<arguments.length;i++){
+    args[i-1]=arguments[i];
+    }
+    }
+    queue.push(new Item(fun,args));
+    if(queue.length===1&&!draining){
+    runTimeout(drainQueue);
+    }
+    };
+    
+    
+    function Item(fun,array){
+    this.fun=fun;
+    this.array=array;
+    }
+    Item.prototype.run=function(){
+    this.fun.apply(null,this.array);
+    };
+    process.title='browser';
+    process.browser=true;
+    process.env={};
+    process.argv=[];
+    process.version='';
+    process.versions={};
+    
+    function noop(){}
+    
+    process.on=noop;
+    process.addListener=noop;
+    process.once=noop;
+    process.off=noop;
+    process.removeListener=noop;
+    process.removeAllListeners=noop;
+    process.emit=noop;
+    process.prependListener=noop;
+    process.prependOnceListener=noop;
+    
+    process.listeners=function(name){return[];};
+    
+    process.binding=function(name){
+    throw new Error('process.binding is not supported');
+    };
+    
+    process.cwd=function(){return'/';};
+    process.chdir=function(dir){
+    throw new Error('process.chdir is not supported');
+    };
+    process.umask=function(){return 0;};
+    
+    },{}],159:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    function hasOwnProperty(obj,prop){
+    return Object.prototype.hasOwnProperty.call(obj,prop);
+    }
+    
+    module.exports=function(qs,sep,eq,options){
+    sep=sep||'&';
+    eq=eq||'=';
+    var obj={};
+    
+    if(typeof qs!=='string'||qs.length===0){
+    return obj;
+    }
+    
+    var regexp=/\+/g;
+    qs=qs.split(sep);
+    
+    var maxKeys=1000;
+    if(options&&typeof options.maxKeys==='number'){
+    maxKeys=options.maxKeys;
+    }
+    
+    var len=qs.length;
+    
+    if(maxKeys>0&&len>maxKeys){
+    len=maxKeys;
+    }
+    
+    for(var i=0;i<len;++i){
+    var x=qs[i].replace(regexp,'%20'),
+    idx=x.indexOf(eq),
+    kstr,vstr,k,v;
+    
+    if(idx>=0){
+    kstr=x.substr(0,idx);
+    vstr=x.substr(idx+1);
+    }else{
+    kstr=x;
+    vstr='';
+    }
+    
+    k=decodeURIComponent(kstr);
+    v=decodeURIComponent(vstr);
+    
+    if(!hasOwnProperty(obj,k)){
+    obj[k]=v;
+    }else if(isArray(obj[k])){
+    obj[k].push(v);
+    }else{
+    obj[k]=[obj[k],v];
+    }
+    }
+    
+    return obj;
+    };
+    
+    var isArray=Array.isArray||function(xs){
+    return Object.prototype.toString.call(xs)==='[object Array]';
+    };
+    
+    },{}],160:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    var stringifyPrimitive=function(v){
+    switch(typeof v){
+    case'string':
+    return v;
+    
+    case'boolean':
+    return v?'true':'false';
+    
+    case'number':
+    return isFinite(v)?v:'';
+    
+    default:
+    return'';}
+    
+    };
+    
+    module.exports=function(obj,sep,eq,name){
+    sep=sep||'&';
+    eq=eq||'=';
+    if(obj===null){
+    obj=undefined;
+    }
+    
+    if(typeof obj==='object'){
+    return map(objectKeys(obj),function(k){
+    var ks=encodeURIComponent(stringifyPrimitive(k))+eq;
+    if(isArray(obj[k])){
+    return map(obj[k],function(v){
+    return ks+encodeURIComponent(stringifyPrimitive(v));
+    }).join(sep);
+    }else{
+    return ks+encodeURIComponent(stringifyPrimitive(obj[k]));
+    }
+    }).join(sep);
+    
+    }
+    
+    if(!name)return'';
+    return encodeURIComponent(stringifyPrimitive(name))+eq+
+    encodeURIComponent(stringifyPrimitive(obj));
+    };
+    
+    var isArray=Array.isArray||function(xs){
+    return Object.prototype.toString.call(xs)==='[object Array]';
+    };
+    
+    function map(xs,f){
+    if(xs.map)return xs.map(f);
+    var res=[];
+    for(var i=0;i<xs.length;i++){
+    res.push(f(xs[i],i));
+    }
+    return res;
+    }
+    
+    var objectKeys=Object.keys||function(obj){
+    var res=[];
+    for(var key in obj){
+    if(Object.prototype.hasOwnProperty.call(obj,key))res.push(key);
+    }
+    return res;
+    };
+    
+    },{}],161:[function(require,module,exports){
+    'use strict';
+    
+    exports.decode=exports.parse=require('./decode');
+    exports.encode=exports.stringify=require('./encode');
+    
+    },{"./decode":159,"./encode":160}],162:[function(require,module,exports){
+    module.exports=require('./lib/_stream_duplex.js');
+    
+    },{"./lib/_stream_duplex.js":163}],163:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    var pna=require('process-nextick-args');
+    
+    
+    
+    var objectKeys=Object.keys||function(obj){
+    var keys=[];
+    for(var key in obj){
+    keys.push(key);
+    }return keys;
+    };
+    
+    
+    module.exports=Duplex;
+    
+    
+    var util=require('core-util-is');
+    util.inherits=require('inherits');
+    
+    
+    var Readable=require('./_stream_readable');
+    var Writable=require('./_stream_writable');
+    
+    util.inherits(Duplex,Readable);
+    
+    {
+    
+    var keys=objectKeys(Writable.prototype);
+    for(var v=0;v<keys.length;v++){
+    var method=keys[v];
+    if(!Duplex.prototype[method])Duplex.prototype[method]=Writable.prototype[method];
+    }
+    }
+    
+    function Duplex(options){
+    if(!(this instanceof Duplex))return new Duplex(options);
+    
+    Readable.call(this,options);
+    Writable.call(this,options);
+    
+    if(options&&options.readable===false)this.readable=false;
+    
+    if(options&&options.writable===false)this.writable=false;
+    
+    this.allowHalfOpen=true;
+    if(options&&options.allowHalfOpen===false)this.allowHalfOpen=false;
+    
+    this.once('end',onend);
+    }
+    
+    Object.defineProperty(Duplex.prototype,'writableHighWaterMark',{
+    
+    
+    
+    enumerable:false,
+    get:function(){
+    return this._writableState.highWaterMark;
+    }});
+    
+    
+    
+    function onend(){
+    
+    
+    if(this.allowHalfOpen||this._writableState.ended)return;
+    
+    
+    
+    pna.nextTick(onEndNT,this);
+    }
+    
+    function onEndNT(self){
+    self.end();
+    }
+    
+    Object.defineProperty(Duplex.prototype,'destroyed',{
+    get:function(){
+    if(this._readableState===undefined||this._writableState===undefined){
+    return false;
+    }
+    return this._readableState.destroyed&&this._writableState.destroyed;
+    },
+    set:function(value){
+    
+    
+    if(this._readableState===undefined||this._writableState===undefined){
+    return;
+    }
+    
+    
+    
+    this._readableState.destroyed=value;
+    this._writableState.destroyed=value;
+    }});
+    
+    
+    Duplex.prototype._destroy=function(err,cb){
+    this.push(null);
+    this.end();
+    
+    pna.nextTick(cb,err);
+    };
+    },{"./_stream_readable":165,"./_stream_writable":167,"core-util-is":103,"inherits":113,"process-nextick-args":157}],164:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    module.exports=PassThrough;
+    
+    var Transform=require('./_stream_transform');
+    
+    
+    var util=require('core-util-is');
+    util.inherits=require('inherits');
+    
+    
+    util.inherits(PassThrough,Transform);
+    
+    function PassThrough(options){
+    if(!(this instanceof PassThrough))return new PassThrough(options);
+    
+    Transform.call(this,options);
+    }
+    
+    PassThrough.prototype._transform=function(chunk,encoding,cb){
+    cb(null,chunk);
+    };
+    },{"./_stream_transform":166,"core-util-is":103,"inherits":113}],165:[function(require,module,exports){
+    (function(process,global){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    var pna=require('process-nextick-args');
+    
+    
+    module.exports=Readable;
+    
+    
+    var isArray=require('isarray');
+    
+    
+    
+    var Duplex;
+    
+    
+    Readable.ReadableState=ReadableState;
+    
+    
+    var EE=require('events').EventEmitter;
+    
+    var EElistenerCount=function(emitter,type){
+    return emitter.listeners(type).length;
+    };
+    
+    
+    
+    var Stream=require('./internal/streams/stream');
+    
+    
+    
+    
+    var Buffer=require('safe-buffer').Buffer;
+    var OurUint8Array=global.Uint8Array||function(){};
+    function _uint8ArrayToBuffer(chunk){
+    return Buffer.from(chunk);
+    }
+    function _isUint8Array(obj){
+    return Buffer.isBuffer(obj)||obj instanceof OurUint8Array;
+    }
+    
+    
+    
+    
+    var util=require('core-util-is');
+    util.inherits=require('inherits');
+    
+    
+    
+    var debugUtil=require('util');
+    var debug=void 0;
+    if(debugUtil&&debugUtil.debuglog){
+    debug=debugUtil.debuglog('stream');
+    }else{
+    debug=function(){};
+    }
+    
+    
+    var BufferList=require('./internal/streams/BufferList');
+    var destroyImpl=require('./internal/streams/destroy');
+    var StringDecoder;
+    
+    util.inherits(Readable,Stream);
+    
+    var kProxyEvents=['error','close','destroy','pause','resume'];
+    
+    function prependListener(emitter,event,fn){
+    
+    
+    if(typeof emitter.prependListener==='function')return emitter.prependListener(event,fn);
+    
+    
+    
+    
+    
+    if(!emitter._events||!emitter._events[event])emitter.on(event,fn);else if(isArray(emitter._events[event]))emitter._events[event].unshift(fn);else emitter._events[event]=[fn,emitter._events[event]];
+    }
+    
+    function ReadableState(options,stream){
+    Duplex=Duplex||require('./_stream_duplex');
+    
+    options=options||{};
+    
+    
+    
+    
+    
+    
+    var isDuplex=stream instanceof Duplex;
+    
+    
+    
+    this.objectMode=!!options.objectMode;
+    
+    if(isDuplex)this.objectMode=this.objectMode||!!options.readableObjectMode;
+    
+    
+    
+    var hwm=options.highWaterMark;
+    var readableHwm=options.readableHighWaterMark;
+    var defaultHwm=this.objectMode?16:16*1024;
+    
+    if(hwm||hwm===0)this.highWaterMark=hwm;else if(isDuplex&&(readableHwm||readableHwm===0))this.highWaterMark=readableHwm;else this.highWaterMark=defaultHwm;
+    
+    
+    this.highWaterMark=Math.floor(this.highWaterMark);
+    
+    
+    
+    
+    this.buffer=new BufferList();
+    this.length=0;
+    this.pipes=null;
+    this.pipesCount=0;
+    this.flowing=null;
+    this.ended=false;
+    this.endEmitted=false;
+    this.reading=false;
+    
+    
+    
+    
+    
+    this.sync=true;
+    
+    
+    
+    this.needReadable=false;
+    this.emittedReadable=false;
+    this.readableListening=false;
+    this.resumeScheduled=false;
+    
+    
+    this.destroyed=false;
+    
+    
+    
+    
+    this.defaultEncoding=options.defaultEncoding||'utf8';
+    
+    
+    this.awaitDrain=0;
+    
+    
+    this.readingMore=false;
+    
+    this.decoder=null;
+    this.encoding=null;
+    if(options.encoding){
+    if(!StringDecoder)StringDecoder=require('string_decoder/').StringDecoder;
+    this.decoder=new StringDecoder(options.encoding);
+    this.encoding=options.encoding;
+    }
+    }
+    
+    function Readable(options){
+    Duplex=Duplex||require('./_stream_duplex');
+    
+    if(!(this instanceof Readable))return new Readable(options);
+    
+    this._readableState=new ReadableState(options,this);
+    
+    
+    this.readable=true;
+    
+    if(options){
+    if(typeof options.read==='function')this._read=options.read;
+    
+    if(typeof options.destroy==='function')this._destroy=options.destroy;
+    }
+    
+    Stream.call(this);
+    }
+    
+    Object.defineProperty(Readable.prototype,'destroyed',{
+    get:function(){
+    if(this._readableState===undefined){
+    return false;
+    }
+    return this._readableState.destroyed;
+    },
+    set:function(value){
+    
+    
+    if(!this._readableState){
+    return;
+    }
+    
+    
+    
+    this._readableState.destroyed=value;
+    }});
+    
+    
+    Readable.prototype.destroy=destroyImpl.destroy;
+    Readable.prototype._undestroy=destroyImpl.undestroy;
+    Readable.prototype._destroy=function(err,cb){
+    this.push(null);
+    cb(err);
+    };
+    
+    
+    
+    
+    
+    Readable.prototype.push=function(chunk,encoding){
+    var state=this._readableState;
+    var skipChunkCheck;
+    
+    if(!state.objectMode){
+    if(typeof chunk==='string'){
+    encoding=encoding||state.defaultEncoding;
+    if(encoding!==state.encoding){
+    chunk=Buffer.from(chunk,encoding);
+    encoding='';
+    }
+    skipChunkCheck=true;
+    }
+    }else{
+    skipChunkCheck=true;
+    }
+    
+    return readableAddChunk(this,chunk,encoding,false,skipChunkCheck);
+    };
+    
+    
+    Readable.prototype.unshift=function(chunk){
+    return readableAddChunk(this,chunk,null,true,false);
+    };
+    
+    function readableAddChunk(stream,chunk,encoding,addToFront,skipChunkCheck){
+    var state=stream._readableState;
+    if(chunk===null){
+    state.reading=false;
+    onEofChunk(stream,state);
+    }else{
+    var er;
+    if(!skipChunkCheck)er=chunkInvalid(state,chunk);
+    if(er){
+    stream.emit('error',er);
+    }else if(state.objectMode||chunk&&chunk.length>0){
+    if(typeof chunk!=='string'&&!state.objectMode&&Object.getPrototypeOf(chunk)!==Buffer.prototype){
+    chunk=_uint8ArrayToBuffer(chunk);
+    }
+    
+    if(addToFront){
+    if(state.endEmitted)stream.emit('error',new Error('stream.unshift() after end event'));else addChunk(stream,state,chunk,true);
+    }else if(state.ended){
+    stream.emit('error',new Error('stream.push() after EOF'));
+    }else{
+    state.reading=false;
+    if(state.decoder&&!encoding){
+    chunk=state.decoder.write(chunk);
+    if(state.objectMode||chunk.length!==0)addChunk(stream,state,chunk,false);else maybeReadMore(stream,state);
+    }else{
+    addChunk(stream,state,chunk,false);
+    }
+    }
+    }else if(!addToFront){
+    state.reading=false;
+    }
+    }
+    
+    return needMoreData(state);
+    }
+    
+    function addChunk(stream,state,chunk,addToFront){
+    if(state.flowing&&state.length===0&&!state.sync){
+    stream.emit('data',chunk);
+    stream.read(0);
+    }else{
+    
+    state.length+=state.objectMode?1:chunk.length;
+    if(addToFront)state.buffer.unshift(chunk);else state.buffer.push(chunk);
+    
+    if(state.needReadable)emitReadable(stream);
+    }
+    maybeReadMore(stream,state);
+    }
+    
+    function chunkInvalid(state,chunk){
+    var er;
+    if(!_isUint8Array(chunk)&&typeof chunk!=='string'&&chunk!==undefined&&!state.objectMode){
+    er=new TypeError('Invalid non-string/buffer chunk');
+    }
+    return er;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function needMoreData(state){
+    return!state.ended&&(state.needReadable||state.length<state.highWaterMark||state.length===0);
+    }
+    
+    Readable.prototype.isPaused=function(){
+    return this._readableState.flowing===false;
+    };
+    
+    
+    Readable.prototype.setEncoding=function(enc){
+    if(!StringDecoder)StringDecoder=require('string_decoder/').StringDecoder;
+    this._readableState.decoder=new StringDecoder(enc);
+    this._readableState.encoding=enc;
+    return this;
+    };
+    
+    
+    var MAX_HWM=0x800000;
+    function computeNewHighWaterMark(n){
+    if(n>=MAX_HWM){
+    n=MAX_HWM;
+    }else{
+    
+    
+    n--;
+    n|=n>>>1;
+    n|=n>>>2;
+    n|=n>>>4;
+    n|=n>>>8;
+    n|=n>>>16;
+    n++;
+    }
+    return n;
+    }
+    
+    
+    
+    function howMuchToRead(n,state){
+    if(n<=0||state.length===0&&state.ended)return 0;
+    if(state.objectMode)return 1;
+    if(n!==n){
+    
+    if(state.flowing&&state.length)return state.buffer.head.data.length;else return state.length;
+    }
+    
+    if(n>state.highWaterMark)state.highWaterMark=computeNewHighWaterMark(n);
+    if(n<=state.length)return n;
+    
+    if(!state.ended){
+    state.needReadable=true;
+    return 0;
+    }
+    return state.length;
+    }
+    
+    
+    Readable.prototype.read=function(n){
+    debug('read',n);
+    n=parseInt(n,10);
+    var state=this._readableState;
+    var nOrig=n;
+    
+    if(n!==0)state.emittedReadable=false;
+    
+    
+    
+    
+    if(n===0&&state.needReadable&&(state.length>=state.highWaterMark||state.ended)){
+    debug('read: emitReadable',state.length,state.ended);
+    if(state.length===0&&state.ended)endReadable(this);else emitReadable(this);
+    return null;
+    }
+    
+    n=howMuchToRead(n,state);
+    
+    
+    if(n===0&&state.ended){
+    if(state.length===0)endReadable(this);
+    return null;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    var doRead=state.needReadable;
+    debug('need readable',doRead);
+    
+    
+    if(state.length===0||state.length-n<state.highWaterMark){
+    doRead=true;
+    debug('length less than watermark',doRead);
+    }
+    
+    
+    
+    if(state.ended||state.reading){
+    doRead=false;
+    debug('reading or ended',doRead);
+    }else if(doRead){
+    debug('do read');
+    state.reading=true;
+    state.sync=true;
+    
+    if(state.length===0)state.needReadable=true;
+    
+    this._read(state.highWaterMark);
+    state.sync=false;
+    
+    
+    if(!state.reading)n=howMuchToRead(nOrig,state);
+    }
+    
+    var ret;
+    if(n>0)ret=fromList(n,state);else ret=null;
+    
+    if(ret===null){
+    state.needReadable=true;
+    n=0;
+    }else{
+    state.length-=n;
+    }
+    
+    if(state.length===0){
+    
+    
+    if(!state.ended)state.needReadable=true;
+    
+    
+    if(nOrig!==n&&state.ended)endReadable(this);
+    }
+    
+    if(ret!==null)this.emit('data',ret);
+    
+    return ret;
+    };
+    
+    function onEofChunk(stream,state){
+    if(state.ended)return;
+    if(state.decoder){
+    var chunk=state.decoder.end();
+    if(chunk&&chunk.length){
+    state.buffer.push(chunk);
+    state.length+=state.objectMode?1:chunk.length;
+    }
+    }
+    state.ended=true;
+    
+    
+    emitReadable(stream);
+    }
+    
+    
+    
+    
+    function emitReadable(stream){
+    var state=stream._readableState;
+    state.needReadable=false;
+    if(!state.emittedReadable){
+    debug('emitReadable',state.flowing);
+    state.emittedReadable=true;
+    if(state.sync)pna.nextTick(emitReadable_,stream);else emitReadable_(stream);
+    }
+    }
+    
+    function emitReadable_(stream){
+    debug('emit readable');
+    stream.emit('readable');
+    flow(stream);
+    }
+    
+    
+    
+    
+    
+    
+    
+    function maybeReadMore(stream,state){
+    if(!state.readingMore){
+    state.readingMore=true;
+    pna.nextTick(maybeReadMore_,stream,state);
+    }
+    }
+    
+    function maybeReadMore_(stream,state){
+    var len=state.length;
+    while(!state.reading&&!state.flowing&&!state.ended&&state.length<state.highWaterMark){
+    debug('maybeReadMore read 0');
+    stream.read(0);
+    if(len===state.length)
+    
+    break;else len=state.length;
+    }
+    state.readingMore=false;
+    }
+    
+    
+    
+    
+    
+    Readable.prototype._read=function(n){
+    this.emit('error',new Error('_read() is not implemented'));
+    };
+    
+    Readable.prototype.pipe=function(dest,pipeOpts){
+    var src=this;
+    var state=this._readableState;
+    
+    switch(state.pipesCount){
+    case 0:
+    state.pipes=dest;
+    break;
+    case 1:
+    state.pipes=[state.pipes,dest];
+    break;
+    default:
+    state.pipes.push(dest);
+    break;}
+    
+    state.pipesCount+=1;
+    debug('pipe count=%d opts=%j',state.pipesCount,pipeOpts);
+    
+    var doEnd=(!pipeOpts||pipeOpts.end!==false)&&dest!==process.stdout&&dest!==process.stderr;
+    
+    var endFn=doEnd?onend:unpipe;
+    if(state.endEmitted)pna.nextTick(endFn);else src.once('end',endFn);
+    
+    dest.on('unpipe',onunpipe);
+    function onunpipe(readable,unpipeInfo){
+    debug('onunpipe');
+    if(readable===src){
+    if(unpipeInfo&&unpipeInfo.hasUnpiped===false){
+    unpipeInfo.hasUnpiped=true;
+    cleanup();
+    }
+    }
+    }
+    
+    function onend(){
+    debug('onend');
+    dest.end();
+    }
+    
+    
+    
+    
+    
+    var ondrain=pipeOnDrain(src);
+    dest.on('drain',ondrain);
+    
+    var cleanedUp=false;
+    function cleanup(){
+    debug('cleanup');
+    
+    dest.removeListener('close',onclose);
+    dest.removeListener('finish',onfinish);
+    dest.removeListener('drain',ondrain);
+    dest.removeListener('error',onerror);
+    dest.removeListener('unpipe',onunpipe);
+    src.removeListener('end',onend);
+    src.removeListener('end',unpipe);
+    src.removeListener('data',ondata);
+    
+    cleanedUp=true;
+    
+    
+    
+    
+    
+    
+    if(state.awaitDrain&&(!dest._writableState||dest._writableState.needDrain))ondrain();
+    }
+    
+    
+    
+    
+    
+    var increasedAwaitDrain=false;
+    src.on('data',ondata);
+    function ondata(chunk){
+    debug('ondata');
+    increasedAwaitDrain=false;
+    var ret=dest.write(chunk);
+    if(false===ret&&!increasedAwaitDrain){
+    
+    
+    
+    
+    if((state.pipesCount===1&&state.pipes===dest||state.pipesCount>1&&indexOf(state.pipes,dest)!==-1)&&!cleanedUp){
+    debug('false write response, pause',src._readableState.awaitDrain);
+    src._readableState.awaitDrain++;
+    increasedAwaitDrain=true;
+    }
+    src.pause();
+    }
+    }
+    
+    
+    
+    function onerror(er){
+    debug('onerror',er);
+    unpipe();
+    dest.removeListener('error',onerror);
+    if(EElistenerCount(dest,'error')===0)dest.emit('error',er);
+    }
+    
+    
+    prependListener(dest,'error',onerror);
+    
+    
+    function onclose(){
+    dest.removeListener('finish',onfinish);
+    unpipe();
+    }
+    dest.once('close',onclose);
+    function onfinish(){
+    debug('onfinish');
+    dest.removeListener('close',onclose);
+    unpipe();
+    }
+    dest.once('finish',onfinish);
+    
+    function unpipe(){
+    debug('unpipe');
+    src.unpipe(dest);
+    }
+    
+    
+    dest.emit('pipe',src);
+    
+    
+    if(!state.flowing){
+    debug('pipe resume');
+    src.resume();
+    }
+    
+    return dest;
+    };
+    
+    function pipeOnDrain(src){
+    return function(){
+    var state=src._readableState;
+    debug('pipeOnDrain',state.awaitDrain);
+    if(state.awaitDrain)state.awaitDrain--;
+    if(state.awaitDrain===0&&EElistenerCount(src,'data')){
+    state.flowing=true;
+    flow(src);
+    }
+    };
+    }
+    
+    Readable.prototype.unpipe=function(dest){
+    var state=this._readableState;
+    var unpipeInfo={hasUnpiped:false};
+    
+    
+    if(state.pipesCount===0)return this;
+    
+    
+    if(state.pipesCount===1){
+    
+    if(dest&&dest!==state.pipes)return this;
+    
+    if(!dest)dest=state.pipes;
+    
+    
+    state.pipes=null;
+    state.pipesCount=0;
+    state.flowing=false;
+    if(dest)dest.emit('unpipe',this,unpipeInfo);
+    return this;
+    }
+    
+    
+    
+    if(!dest){
+    
+    var dests=state.pipes;
+    var len=state.pipesCount;
+    state.pipes=null;
+    state.pipesCount=0;
+    state.flowing=false;
+    
+    for(var i=0;i<len;i++){
+    dests[i].emit('unpipe',this,unpipeInfo);
+    }return this;
+    }
+    
+    
+    var index=indexOf(state.pipes,dest);
+    if(index===-1)return this;
+    
+    state.pipes.splice(index,1);
+    state.pipesCount-=1;
+    if(state.pipesCount===1)state.pipes=state.pipes[0];
+    
+    dest.emit('unpipe',this,unpipeInfo);
+    
+    return this;
+    };
+    
+    
+    
+    Readable.prototype.on=function(ev,fn){
+    var res=Stream.prototype.on.call(this,ev,fn);
+    
+    if(ev==='data'){
+    
+    if(this._readableState.flowing!==false)this.resume();
+    }else if(ev==='readable'){
+    var state=this._readableState;
+    if(!state.endEmitted&&!state.readableListening){
+    state.readableListening=state.needReadable=true;
+    state.emittedReadable=false;
+    if(!state.reading){
+    pna.nextTick(nReadingNextTick,this);
+    }else if(state.length){
+    emitReadable(this);
+    }
+    }
+    }
+    
+    return res;
+    };
+    Readable.prototype.addListener=Readable.prototype.on;
+    
+    function nReadingNextTick(self){
+    debug('readable nexttick read 0');
+    self.read(0);
+    }
+    
+    
+    
+    Readable.prototype.resume=function(){
+    var state=this._readableState;
+    if(!state.flowing){
+    debug('resume');
+    state.flowing=true;
+    resume(this,state);
+    }
+    return this;
+    };
+    
+    function resume(stream,state){
+    if(!state.resumeScheduled){
+    state.resumeScheduled=true;
+    pna.nextTick(resume_,stream,state);
+    }
+    }
+    
+    function resume_(stream,state){
+    if(!state.reading){
+    debug('resume read 0');
+    stream.read(0);
+    }
+    
+    state.resumeScheduled=false;
+    state.awaitDrain=0;
+    stream.emit('resume');
+    flow(stream);
+    if(state.flowing&&!state.reading)stream.read(0);
+    }
+    
+    Readable.prototype.pause=function(){
+    debug('call pause flowing=%j',this._readableState.flowing);
+    if(false!==this._readableState.flowing){
+    debug('pause');
+    this._readableState.flowing=false;
+    this.emit('pause');
+    }
+    return this;
+    };
+    
+    function flow(stream){
+    var state=stream._readableState;
+    debug('flow',state.flowing);
+    while(state.flowing&&stream.read()!==null){}
+    }
+    
+    
+    
+    
+    Readable.prototype.wrap=function(stream){
+    var _this=this;
+    
+    var state=this._readableState;
+    var paused=false;
+    
+    stream.on('end',function(){
+    debug('wrapped end');
+    if(state.decoder&&!state.ended){
+    var chunk=state.decoder.end();
+    if(chunk&&chunk.length)_this.push(chunk);
+    }
+    
+    _this.push(null);
+    });
+    
+    stream.on('data',function(chunk){
+    debug('wrapped data');
+    if(state.decoder)chunk=state.decoder.write(chunk);
+    
+    
+    if(state.objectMode&&(chunk===null||chunk===undefined))return;else if(!state.objectMode&&(!chunk||!chunk.length))return;
+    
+    var ret=_this.push(chunk);
+    if(!ret){
+    paused=true;
+    stream.pause();
+    }
+    });
+    
+    
+    
+    for(var i in stream){
+    if(this[i]===undefined&&typeof stream[i]==='function'){
+    this[i]=function(method){
+    return function(){
+    return stream[method].apply(stream,arguments);
+    };
+    }(i);
+    }
+    }
+    
+    
+    for(var n=0;n<kProxyEvents.length;n++){
+    stream.on(kProxyEvents[n],this.emit.bind(this,kProxyEvents[n]));
+    }
+    
+    
+    
+    this._read=function(n){
+    debug('wrapped _read',n);
+    if(paused){
+    paused=false;
+    stream.resume();
+    }
+    };
+    
+    return this;
+    };
+    
+    Object.defineProperty(Readable.prototype,'readableHighWaterMark',{
+    
+    
+    
+    enumerable:false,
+    get:function(){
+    return this._readableState.highWaterMark;
+    }});
+    
+    
+    
+    Readable._fromList=fromList;
+    
+    
+    
+    
+    
+    function fromList(n,state){
+    
+    if(state.length===0)return null;
+    
+    var ret;
+    if(state.objectMode)ret=state.buffer.shift();else if(!n||n>=state.length){
+    
+    if(state.decoder)ret=state.buffer.join('');else if(state.buffer.length===1)ret=state.buffer.head.data;else ret=state.buffer.concat(state.length);
+    state.buffer.clear();
+    }else{
+    
+    ret=fromListPartial(n,state.buffer,state.decoder);
+    }
+    
+    return ret;
+    }
+    
+    
+    
+    
+    function fromListPartial(n,list,hasStrings){
+    var ret;
+    if(n<list.head.data.length){
+    
+    ret=list.head.data.slice(0,n);
+    list.head.data=list.head.data.slice(n);
+    }else if(n===list.head.data.length){
+    
+    ret=list.shift();
+    }else{
+    
+    ret=hasStrings?copyFromBufferString(n,list):copyFromBuffer(n,list);
+    }
+    return ret;
+    }
+    
+    
+    
+    
+    
+    function copyFromBufferString(n,list){
+    var p=list.head;
+    var c=1;
+    var ret=p.data;
+    n-=ret.length;
+    while(p=p.next){
+    var str=p.data;
+    var nb=n>str.length?str.length:n;
+    if(nb===str.length)ret+=str;else ret+=str.slice(0,n);
+    n-=nb;
+    if(n===0){
+    if(nb===str.length){
+    ++c;
+    if(p.next)list.head=p.next;else list.head=list.tail=null;
+    }else{
+    list.head=p;
+    p.data=str.slice(nb);
+    }
+    break;
+    }
+    ++c;
+    }
+    list.length-=c;
+    return ret;
+    }
+    
+    
+    
+    
+    function copyFromBuffer(n,list){
+    var ret=Buffer.allocUnsafe(n);
+    var p=list.head;
+    var c=1;
+    p.data.copy(ret);
+    n-=p.data.length;
+    while(p=p.next){
+    var buf=p.data;
+    var nb=n>buf.length?buf.length:n;
+    buf.copy(ret,ret.length-n,0,nb);
+    n-=nb;
+    if(n===0){
+    if(nb===buf.length){
+    ++c;
+    if(p.next)list.head=p.next;else list.head=list.tail=null;
+    }else{
+    list.head=p;
+    p.data=buf.slice(nb);
+    }
+    break;
+    }
+    ++c;
+    }
+    list.length-=c;
+    return ret;
+    }
+    
+    function endReadable(stream){
+    var state=stream._readableState;
+    
+    
+    
+    if(state.length>0)throw new Error('"endReadable()" called on non-empty stream');
+    
+    if(!state.endEmitted){
+    state.ended=true;
+    pna.nextTick(endReadableNT,state,stream);
+    }
+    }
+    
+    function endReadableNT(state,stream){
+    
+    if(!state.endEmitted&&state.length===0){
+    state.endEmitted=true;
+    stream.readable=false;
+    stream.emit('end');
+    }
+    }
+    
+    function indexOf(xs,x){
+    for(var i=0,l=xs.length;i<l;i++){
+    if(xs[i]===x)return i;
+    }
+    return-1;
+    }
+    }).call(this,require('_process'),typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
+    },{"./_stream_duplex":163,"./internal/streams/BufferList":168,"./internal/streams/destroy":169,"./internal/streams/stream":170,"_process":158,"core-util-is":103,"events":108,"inherits":113,"isarray":121,"process-nextick-args":157,"safe-buffer":178,"string_decoder/":171,"util":98}],166:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    module.exports=Transform;
+    
+    var Duplex=require('./_stream_duplex');
+    
+    
+    var util=require('core-util-is');
+    util.inherits=require('inherits');
+    
+    
+    util.inherits(Transform,Duplex);
+    
+    function afterTransform(er,data){
+    var ts=this._transformState;
+    ts.transforming=false;
+    
+    var cb=ts.writecb;
+    
+    if(!cb){
+    return this.emit('error',new Error('write callback called multiple times'));
+    }
+    
+    ts.writechunk=null;
+    ts.writecb=null;
+    
+    if(data!=null)
+    this.push(data);
+    
+    cb(er);
+    
+    var rs=this._readableState;
+    rs.reading=false;
+    if(rs.needReadable||rs.length<rs.highWaterMark){
+    this._read(rs.highWaterMark);
+    }
+    }
+    
+    function Transform(options){
+    if(!(this instanceof Transform))return new Transform(options);
+    
+    Duplex.call(this,options);
+    
+    this._transformState={
+    afterTransform:afterTransform.bind(this),
+    needTransform:false,
+    transforming:false,
+    writecb:null,
+    writechunk:null,
+    writeencoding:null};
+    
+    
+    
+    this._readableState.needReadable=true;
+    
+    
+    
+    
+    this._readableState.sync=false;
+    
+    if(options){
+    if(typeof options.transform==='function')this._transform=options.transform;
+    
+    if(typeof options.flush==='function')this._flush=options.flush;
+    }
+    
+    
+    this.on('prefinish',prefinish);
+    }
+    
+    function prefinish(){
+    var _this=this;
+    
+    if(typeof this._flush==='function'){
+    this._flush(function(er,data){
+    done(_this,er,data);
+    });
+    }else{
+    done(this,null,null);
+    }
+    }
+    
+    Transform.prototype.push=function(chunk,encoding){
+    this._transformState.needTransform=false;
+    return Duplex.prototype.push.call(this,chunk,encoding);
+    };
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    Transform.prototype._transform=function(chunk,encoding,cb){
+    throw new Error('_transform() is not implemented');
+    };
+    
+    Transform.prototype._write=function(chunk,encoding,cb){
+    var ts=this._transformState;
+    ts.writecb=cb;
+    ts.writechunk=chunk;
+    ts.writeencoding=encoding;
+    if(!ts.transforming){
+    var rs=this._readableState;
+    if(ts.needTransform||rs.needReadable||rs.length<rs.highWaterMark)this._read(rs.highWaterMark);
+    }
+    };
+    
+    
+    
+    
+    Transform.prototype._read=function(n){
+    var ts=this._transformState;
+    
+    if(ts.writechunk!==null&&ts.writecb&&!ts.transforming){
+    ts.transforming=true;
+    this._transform(ts.writechunk,ts.writeencoding,ts.afterTransform);
+    }else{
+    
+    
+    ts.needTransform=true;
+    }
+    };
+    
+    Transform.prototype._destroy=function(err,cb){
+    var _this2=this;
+    
+    Duplex.prototype._destroy.call(this,err,function(err2){
+    cb(err2);
+    _this2.emit('close');
+    });
+    };
+    
+    function done(stream,er,data){
+    if(er)return stream.emit('error',er);
+    
+    if(data!=null)
+    stream.push(data);
+    
+    
+    
+    if(stream._writableState.length)throw new Error('Calling transform done when ws.length != 0');
+    
+    if(stream._transformState.transforming)throw new Error('Calling transform done when still transforming');
+    
+    return stream.push(null);
+    }
+    },{"./_stream_duplex":163,"core-util-is":103,"inherits":113}],167:[function(require,module,exports){
+    (function(process,global,setImmediate){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    var pna=require('process-nextick-args');
+    
+    
+    module.exports=Writable;
+    
+    
+    function WriteReq(chunk,encoding,cb){
+    this.chunk=chunk;
+    this.encoding=encoding;
+    this.callback=cb;
+    this.next=null;
+    }
+    
+    
+    
+    function CorkedRequest(state){
+    var _this=this;
+    
+    this.next=null;
+    this.entry=null;
+    this.finish=function(){
+    onCorkedFinish(_this,state);
+    };
+    }
+    
+    
+    
+    var asyncWrite=!process.browser&&['v0.10','v0.9.'].indexOf(process.version.slice(0,5))>-1?setImmediate:pna.nextTick;
+    
+    
+    
+    var Duplex;
+    
+    
+    Writable.WritableState=WritableState;
+    
+    
+    var util=require('core-util-is');
+    util.inherits=require('inherits');
+    
+    
+    
+    var internalUtil={
+    deprecate:require('util-deprecate')};
+    
+    
+    
+    
+    var Stream=require('./internal/streams/stream');
+    
+    
+    
+    
+    var Buffer=require('safe-buffer').Buffer;
+    var OurUint8Array=global.Uint8Array||function(){};
+    function _uint8ArrayToBuffer(chunk){
+    return Buffer.from(chunk);
+    }
+    function _isUint8Array(obj){
+    return Buffer.isBuffer(obj)||obj instanceof OurUint8Array;
+    }
+    
+    
+    
+    var destroyImpl=require('./internal/streams/destroy');
+    
+    util.inherits(Writable,Stream);
+    
+    function nop(){}
+    
+    function WritableState(options,stream){
+    Duplex=Duplex||require('./_stream_duplex');
+    
+    options=options||{};
+    
+    
+    
+    
+    
+    
+    var isDuplex=stream instanceof Duplex;
+    
+    
+    
+    this.objectMode=!!options.objectMode;
+    
+    if(isDuplex)this.objectMode=this.objectMode||!!options.writableObjectMode;
+    
+    
+    
+    
+    var hwm=options.highWaterMark;
+    var writableHwm=options.writableHighWaterMark;
+    var defaultHwm=this.objectMode?16:16*1024;
+    
+    if(hwm||hwm===0)this.highWaterMark=hwm;else if(isDuplex&&(writableHwm||writableHwm===0))this.highWaterMark=writableHwm;else this.highWaterMark=defaultHwm;
+    
+    
+    this.highWaterMark=Math.floor(this.highWaterMark);
+    
+    
+    this.finalCalled=false;
+    
+    
+    this.needDrain=false;
+    
+    this.ending=false;
+    
+    this.ended=false;
+    
+    this.finished=false;
+    
+    
+    this.destroyed=false;
+    
+    
+    
+    
+    var noDecode=options.decodeStrings===false;
+    this.decodeStrings=!noDecode;
+    
+    
+    
+    
+    this.defaultEncoding=options.defaultEncoding||'utf8';
+    
+    
+    
+    
+    this.length=0;
+    
+    
+    this.writing=false;
+    
+    
+    this.corked=0;
+    
+    
+    
+    
+    
+    this.sync=true;
+    
+    
+    
+    
+    this.bufferProcessing=false;
+    
+    
+    this.onwrite=function(er){
+    onwrite(stream,er);
+    };
+    
+    
+    this.writecb=null;
+    
+    
+    this.writelen=0;
+    
+    this.bufferedRequest=null;
+    this.lastBufferedRequest=null;
+    
+    
+    
+    this.pendingcb=0;
+    
+    
+    
+    this.prefinished=false;
+    
+    
+    this.errorEmitted=false;
+    
+    
+    this.bufferedRequestCount=0;
+    
+    
+    
+    this.corkedRequestsFree=new CorkedRequest(this);
+    }
+    
+    WritableState.prototype.getBuffer=function getBuffer(){
+    var current=this.bufferedRequest;
+    var out=[];
+    while(current){
+    out.push(current);
+    current=current.next;
+    }
+    return out;
+    };
+    
+    (function(){
+    try{
+    Object.defineProperty(WritableState.prototype,'buffer',{
+    get:internalUtil.deprecate(function(){
+    return this.getBuffer();
+    },'_writableState.buffer is deprecated. Use _writableState.getBuffer '+'instead.','DEP0003')});
+    
+    }catch(_){}
+    })();
+    
+    
+    
+    var realHasInstance;
+    if(typeof Symbol==='function'&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]==='function'){
+    realHasInstance=Function.prototype[Symbol.hasInstance];
+    Object.defineProperty(Writable,Symbol.hasInstance,{
+    value:function(object){
+    if(realHasInstance.call(this,object))return true;
+    if(this!==Writable)return false;
+    
+    return object&&object._writableState instanceof WritableState;
+    }});
+    
+    }else{
+    realHasInstance=function(object){
+    return object instanceof this;
+    };
+    }
+    
+    function Writable(options){
+    Duplex=Duplex||require('./_stream_duplex');
+    
+    
+    
+    
+    
+    
+    
+    
+    if(!realHasInstance.call(Writable,this)&&!(this instanceof Duplex)){
+    return new Writable(options);
+    }
+    
+    this._writableState=new WritableState(options,this);
+    
+    
+    this.writable=true;
+    
+    if(options){
+    if(typeof options.write==='function')this._write=options.write;
+    
+    if(typeof options.writev==='function')this._writev=options.writev;
+    
+    if(typeof options.destroy==='function')this._destroy=options.destroy;
+    
+    if(typeof options.final==='function')this._final=options.final;
+    }
+    
+    Stream.call(this);
+    }
+    
+    
+    Writable.prototype.pipe=function(){
+    this.emit('error',new Error('Cannot pipe, not readable'));
+    };
+    
+    function writeAfterEnd(stream,cb){
+    var er=new Error('write after end');
+    
+    stream.emit('error',er);
+    pna.nextTick(cb,er);
+    }
+    
+    
+    
+    
+    function validChunk(stream,state,chunk,cb){
+    var valid=true;
+    var er=false;
+    
+    if(chunk===null){
+    er=new TypeError('May not write null values to stream');
+    }else if(typeof chunk!=='string'&&chunk!==undefined&&!state.objectMode){
+    er=new TypeError('Invalid non-string/buffer chunk');
+    }
+    if(er){
+    stream.emit('error',er);
+    pna.nextTick(cb,er);
+    valid=false;
+    }
+    return valid;
+    }
+    
+    Writable.prototype.write=function(chunk,encoding,cb){
+    var state=this._writableState;
+    var ret=false;
+    var isBuf=!state.objectMode&&_isUint8Array(chunk);
+    
+    if(isBuf&&!Buffer.isBuffer(chunk)){
+    chunk=_uint8ArrayToBuffer(chunk);
+    }
+    
+    if(typeof encoding==='function'){
+    cb=encoding;
+    encoding=null;
+    }
+    
+    if(isBuf)encoding='buffer';else if(!encoding)encoding=state.defaultEncoding;
+    
+    if(typeof cb!=='function')cb=nop;
+    
+    if(state.ended)writeAfterEnd(this,cb);else if(isBuf||validChunk(this,state,chunk,cb)){
+    state.pendingcb++;
+    ret=writeOrBuffer(this,state,isBuf,chunk,encoding,cb);
+    }
+    
+    return ret;
+    };
+    
+    Writable.prototype.cork=function(){
+    var state=this._writableState;
+    
+    state.corked++;
+    };
+    
+    Writable.prototype.uncork=function(){
+    var state=this._writableState;
+    
+    if(state.corked){
+    state.corked--;
+    
+    if(!state.writing&&!state.corked&&!state.finished&&!state.bufferProcessing&&state.bufferedRequest)clearBuffer(this,state);
+    }
+    };
+    
+    Writable.prototype.setDefaultEncoding=function setDefaultEncoding(encoding){
+    
+    if(typeof encoding==='string')encoding=encoding.toLowerCase();
+    if(!(['hex','utf8','utf-8','ascii','binary','base64','ucs2','ucs-2','utf16le','utf-16le','raw'].indexOf((encoding+'').toLowerCase())>-1))throw new TypeError('Unknown encoding: '+encoding);
+    this._writableState.defaultEncoding=encoding;
+    return this;
+    };
+    
+    function decodeChunk(state,chunk,encoding){
+    if(!state.objectMode&&state.decodeStrings!==false&&typeof chunk==='string'){
+    chunk=Buffer.from(chunk,encoding);
+    }
+    return chunk;
+    }
+    
+    Object.defineProperty(Writable.prototype,'writableHighWaterMark',{
+    
+    
+    
+    enumerable:false,
+    get:function(){
+    return this._writableState.highWaterMark;
+    }});
+    
+    
+    
+    
+    
+    function writeOrBuffer(stream,state,isBuf,chunk,encoding,cb){
+    if(!isBuf){
+    var newChunk=decodeChunk(state,chunk,encoding);
+    if(chunk!==newChunk){
+    isBuf=true;
+    encoding='buffer';
+    chunk=newChunk;
+    }
+    }
+    var len=state.objectMode?1:chunk.length;
+    
+    state.length+=len;
+    
+    var ret=state.length<state.highWaterMark;
+    
+    if(!ret)state.needDrain=true;
+    
+    if(state.writing||state.corked){
+    var last=state.lastBufferedRequest;
+    state.lastBufferedRequest={
+    chunk:chunk,
+    encoding:encoding,
+    isBuf:isBuf,
+    callback:cb,
+    next:null};
+    
+    if(last){
+    last.next=state.lastBufferedRequest;
+    }else{
+    state.bufferedRequest=state.lastBufferedRequest;
+    }
+    state.bufferedRequestCount+=1;
+    }else{
+    doWrite(stream,state,false,len,chunk,encoding,cb);
+    }
+    
+    return ret;
+    }
+    
+    function doWrite(stream,state,writev,len,chunk,encoding,cb){
+    state.writelen=len;
+    state.writecb=cb;
+    state.writing=true;
+    state.sync=true;
+    if(writev)stream._writev(chunk,state.onwrite);else stream._write(chunk,encoding,state.onwrite);
+    state.sync=false;
+    }
+    
+    function onwriteError(stream,state,sync,er,cb){
+    --state.pendingcb;
+    
+    if(sync){
+    
+    
+    pna.nextTick(cb,er);
+    
+    
+    pna.nextTick(finishMaybe,stream,state);
+    stream._writableState.errorEmitted=true;
+    stream.emit('error',er);
+    }else{
+    
+    
+    cb(er);
+    stream._writableState.errorEmitted=true;
+    stream.emit('error',er);
+    
+    
+    finishMaybe(stream,state);
+    }
+    }
+    
+    function onwriteStateUpdate(state){
+    state.writing=false;
+    state.writecb=null;
+    state.length-=state.writelen;
+    state.writelen=0;
+    }
+    
+    function onwrite(stream,er){
+    var state=stream._writableState;
+    var sync=state.sync;
+    var cb=state.writecb;
+    
+    onwriteStateUpdate(state);
+    
+    if(er)onwriteError(stream,state,sync,er,cb);else{
+    
+    var finished=needFinish(state);
+    
+    if(!finished&&!state.corked&&!state.bufferProcessing&&state.bufferedRequest){
+    clearBuffer(stream,state);
+    }
+    
+    if(sync){
+    
+    asyncWrite(afterWrite,stream,state,finished,cb);
+    
+    }else{
+    afterWrite(stream,state,finished,cb);
+    }
+    }
+    }
+    
+    function afterWrite(stream,state,finished,cb){
+    if(!finished)onwriteDrain(stream,state);
+    state.pendingcb--;
+    cb();
+    finishMaybe(stream,state);
+    }
+    
+    
+    
+    
+    function onwriteDrain(stream,state){
+    if(state.length===0&&state.needDrain){
+    state.needDrain=false;
+    stream.emit('drain');
+    }
+    }
+    
+    
+    function clearBuffer(stream,state){
+    state.bufferProcessing=true;
+    var entry=state.bufferedRequest;
+    
+    if(stream._writev&&entry&&entry.next){
+    
+    var l=state.bufferedRequestCount;
+    var buffer=new Array(l);
+    var holder=state.corkedRequestsFree;
+    holder.entry=entry;
+    
+    var count=0;
+    var allBuffers=true;
+    while(entry){
+    buffer[count]=entry;
+    if(!entry.isBuf)allBuffers=false;
+    entry=entry.next;
+    count+=1;
+    }
+    buffer.allBuffers=allBuffers;
+    
+    doWrite(stream,state,true,state.length,buffer,'',holder.finish);
+    
+    
+    
+    state.pendingcb++;
+    state.lastBufferedRequest=null;
+    if(holder.next){
+    state.corkedRequestsFree=holder.next;
+    holder.next=null;
+    }else{
+    state.corkedRequestsFree=new CorkedRequest(state);
+    }
+    state.bufferedRequestCount=0;
+    }else{
+    
+    while(entry){
+    var chunk=entry.chunk;
+    var encoding=entry.encoding;
+    var cb=entry.callback;
+    var len=state.objectMode?1:chunk.length;
+    
+    doWrite(stream,state,false,len,chunk,encoding,cb);
+    entry=entry.next;
+    state.bufferedRequestCount--;
+    
+    
+    
+    
+    if(state.writing){
+    break;
+    }
+    }
+    
+    if(entry===null)state.lastBufferedRequest=null;
+    }
+    
+    state.bufferedRequest=entry;
+    state.bufferProcessing=false;
+    }
+    
+    Writable.prototype._write=function(chunk,encoding,cb){
+    cb(new Error('_write() is not implemented'));
+    };
+    
+    Writable.prototype._writev=null;
+    
+    Writable.prototype.end=function(chunk,encoding,cb){
+    var state=this._writableState;
+    
+    if(typeof chunk==='function'){
+    cb=chunk;
+    chunk=null;
+    encoding=null;
+    }else if(typeof encoding==='function'){
+    cb=encoding;
+    encoding=null;
+    }
+    
+    if(chunk!==null&&chunk!==undefined)this.write(chunk,encoding);
+    
+    
+    if(state.corked){
+    state.corked=1;
+    this.uncork();
+    }
+    
+    
+    if(!state.ending&&!state.finished)endWritable(this,state,cb);
+    };
+    
+    function needFinish(state){
+    return state.ending&&state.length===0&&state.bufferedRequest===null&&!state.finished&&!state.writing;
+    }
+    function callFinal(stream,state){
+    stream._final(function(err){
+    state.pendingcb--;
+    if(err){
+    stream.emit('error',err);
+    }
+    state.prefinished=true;
+    stream.emit('prefinish');
+    finishMaybe(stream,state);
+    });
+    }
+    function prefinish(stream,state){
+    if(!state.prefinished&&!state.finalCalled){
+    if(typeof stream._final==='function'){
+    state.pendingcb++;
+    state.finalCalled=true;
+    pna.nextTick(callFinal,stream,state);
+    }else{
+    state.prefinished=true;
+    stream.emit('prefinish');
+    }
+    }
+    }
+    
+    function finishMaybe(stream,state){
+    var need=needFinish(state);
+    if(need){
+    prefinish(stream,state);
+    if(state.pendingcb===0){
+    state.finished=true;
+    stream.emit('finish');
+    }
+    }
+    return need;
+    }
+    
+    function endWritable(stream,state,cb){
+    state.ending=true;
+    finishMaybe(stream,state);
+    if(cb){
+    if(state.finished)pna.nextTick(cb);else stream.once('finish',cb);
+    }
+    state.ended=true;
+    stream.writable=false;
+    }
+    
+    function onCorkedFinish(corkReq,state,err){
+    var entry=corkReq.entry;
+    corkReq.entry=null;
+    while(entry){
+    var cb=entry.callback;
+    state.pendingcb--;
+    cb(err);
+    entry=entry.next;
+    }
+    if(state.corkedRequestsFree){
+    state.corkedRequestsFree.next=corkReq;
+    }else{
+    state.corkedRequestsFree=corkReq;
+    }
+    }
+    
+    Object.defineProperty(Writable.prototype,'destroyed',{
+    get:function(){
+    if(this._writableState===undefined){
+    return false;
+    }
+    return this._writableState.destroyed;
+    },
+    set:function(value){
+    
+    
+    if(!this._writableState){
+    return;
+    }
+    
+    
+    
+    this._writableState.destroyed=value;
+    }});
+    
+    
+    Writable.prototype.destroy=destroyImpl.destroy;
+    Writable.prototype._undestroy=destroyImpl.undestroy;
+    Writable.prototype._destroy=function(err,cb){
+    this.end();
+    cb(err);
+    };
+    }).call(this,require('_process'),typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{},require("timers").setImmediate);
+    },{"./_stream_duplex":163,"./internal/streams/destroy":169,"./internal/streams/stream":170,"_process":158,"core-util-is":103,"inherits":113,"process-nextick-args":157,"safe-buffer":178,"timers":188,"util-deprecate":189}],168:[function(require,module,exports){
+    'use strict';
+    
+    function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}
+    
+    var Buffer=require('safe-buffer').Buffer;
+    var util=require('util');
+    
+    function copyBuffer(src,target,offset){
+    src.copy(target,offset);
+    }
+    
+    module.exports=function(){
+    function BufferList(){
+    _classCallCheck(this,BufferList);
+    
+    this.head=null;
+    this.tail=null;
+    this.length=0;
+    }
+    
+    BufferList.prototype.push=function push(v){
+    var entry={data:v,next:null};
+    if(this.length>0)this.tail.next=entry;else this.head=entry;
+    this.tail=entry;
+    ++this.length;
+    };
+    
+    BufferList.prototype.unshift=function unshift(v){
+    var entry={data:v,next:this.head};
+    if(this.length===0)this.tail=entry;
+    this.head=entry;
+    ++this.length;
+    };
+    
+    BufferList.prototype.shift=function shift(){
+    if(this.length===0)return;
+    var ret=this.head.data;
+    if(this.length===1)this.head=this.tail=null;else this.head=this.head.next;
+    --this.length;
+    return ret;
+    };
+    
+    BufferList.prototype.clear=function clear(){
+    this.head=this.tail=null;
+    this.length=0;
+    };
+    
+    BufferList.prototype.join=function join(s){
+    if(this.length===0)return'';
+    var p=this.head;
+    var ret=''+p.data;
+    while(p=p.next){
+    ret+=s+p.data;
+    }return ret;
+    };
+    
+    BufferList.prototype.concat=function concat(n){
+    if(this.length===0)return Buffer.alloc(0);
+    if(this.length===1)return this.head.data;
+    var ret=Buffer.allocUnsafe(n>>>0);
+    var p=this.head;
+    var i=0;
+    while(p){
+    copyBuffer(p.data,ret,i);
+    i+=p.data.length;
+    p=p.next;
+    }
+    return ret;
+    };
+    
+    return BufferList;
+    }();
+    
+    if(util&&util.inspect&&util.inspect.custom){
+    module.exports.prototype[util.inspect.custom]=function(){
+    var obj=util.inspect({length:this.length});
+    return this.constructor.name+' '+obj;
+    };
+    }
+    },{"safe-buffer":178,"util":98}],169:[function(require,module,exports){
+    'use strict';
+    
+    
+    
+    var pna=require('process-nextick-args');
+    
+    
+    
+    function destroy(err,cb){
+    var _this=this;
+    
+    var readableDestroyed=this._readableState&&this._readableState.destroyed;
+    var writableDestroyed=this._writableState&&this._writableState.destroyed;
+    
+    if(readableDestroyed||writableDestroyed){
+    if(cb){
+    cb(err);
+    }else if(err&&(!this._writableState||!this._writableState.errorEmitted)){
+    pna.nextTick(emitErrorNT,this,err);
+    }
+    return this;
+    }
+    
+    
+    
+    
+    if(this._readableState){
+    this._readableState.destroyed=true;
+    }
+    
+    
+    if(this._writableState){
+    this._writableState.destroyed=true;
+    }
+    
+    this._destroy(err||null,function(err){
+    if(!cb&&err){
+    pna.nextTick(emitErrorNT,_this,err);
+    if(_this._writableState){
+    _this._writableState.errorEmitted=true;
+    }
+    }else if(cb){
+    cb(err);
+    }
+    });
+    
+    return this;
+    }
+    
+    function undestroy(){
+    if(this._readableState){
+    this._readableState.destroyed=false;
+    this._readableState.reading=false;
+    this._readableState.ended=false;
+    this._readableState.endEmitted=false;
+    }
+    
+    if(this._writableState){
+    this._writableState.destroyed=false;
+    this._writableState.ended=false;
+    this._writableState.ending=false;
+    this._writableState.finished=false;
+    this._writableState.errorEmitted=false;
+    }
+    }
+    
+    function emitErrorNT(self,err){
+    self.emit('error',err);
+    }
+    
+    module.exports={
+    destroy:destroy,
+    undestroy:undestroy};
+    
+    },{"process-nextick-args":157}],170:[function(require,module,exports){
+    module.exports=require('events').EventEmitter;
+    
+    },{"events":108}],171:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    var Buffer=require('safe-buffer').Buffer;
+    
+    
+    var isEncoding=Buffer.isEncoding||function(encoding){
+    encoding=''+encoding;
+    switch(encoding&&encoding.toLowerCase()){
+    case'hex':case'utf8':case'utf-8':case'ascii':case'binary':case'base64':case'ucs2':case'ucs-2':case'utf16le':case'utf-16le':case'raw':
+    return true;
+    default:
+    return false;}
+    
+    };
+    
+    function _normalizeEncoding(enc){
+    if(!enc)return'utf8';
+    var retried;
+    while(true){
+    switch(enc){
+    case'utf8':
+    case'utf-8':
+    return'utf8';
+    case'ucs2':
+    case'ucs-2':
+    case'utf16le':
+    case'utf-16le':
+    return'utf16le';
+    case'latin1':
+    case'binary':
+    return'latin1';
+    case'base64':
+    case'ascii':
+    case'hex':
+    return enc;
+    default:
+    if(retried)return;
+    enc=(''+enc).toLowerCase();
+    retried=true;}
+    
+    }
+    };
+    
+    
+    
+    function normalizeEncoding(enc){
+    var nenc=_normalizeEncoding(enc);
+    if(typeof nenc!=='string'&&(Buffer.isEncoding===isEncoding||!isEncoding(enc)))throw new Error('Unknown encoding: '+enc);
+    return nenc||enc;
+    }
+    
+    
+    
+    
+    exports.StringDecoder=StringDecoder;
+    function StringDecoder(encoding){
+    this.encoding=normalizeEncoding(encoding);
+    var nb;
+    switch(this.encoding){
+    case'utf16le':
+    this.text=utf16Text;
+    this.end=utf16End;
+    nb=4;
+    break;
+    case'utf8':
+    this.fillLast=utf8FillLast;
+    nb=4;
+    break;
+    case'base64':
+    this.text=base64Text;
+    this.end=base64End;
+    nb=3;
+    break;
+    default:
+    this.write=simpleWrite;
+    this.end=simpleEnd;
+    return;}
+    
+    this.lastNeed=0;
+    this.lastTotal=0;
+    this.lastChar=Buffer.allocUnsafe(nb);
+    }
+    
+    StringDecoder.prototype.write=function(buf){
+    if(buf.length===0)return'';
+    var r;
+    var i;
+    if(this.lastNeed){
+    r=this.fillLast(buf);
+    if(r===undefined)return'';
+    i=this.lastNeed;
+    this.lastNeed=0;
+    }else{
+    i=0;
+    }
+    if(i<buf.length)return r?r+this.text(buf,i):this.text(buf,i);
+    return r||'';
+    };
+    
+    StringDecoder.prototype.end=utf8End;
+    
+    
+    StringDecoder.prototype.text=utf8Text;
+    
+    
+    StringDecoder.prototype.fillLast=function(buf){
+    if(this.lastNeed<=buf.length){
+    buf.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed);
+    return this.lastChar.toString(this.encoding,0,this.lastTotal);
+    }
+    buf.copy(this.lastChar,this.lastTotal-this.lastNeed,0,buf.length);
+    this.lastNeed-=buf.length;
+    };
+    
+    
+    
+    function utf8CheckByte(byte){
+    if(byte<=0x7F)return 0;else if(byte>>5===0x06)return 2;else if(byte>>4===0x0E)return 3;else if(byte>>3===0x1E)return 4;
+    return byte>>6===0x02?-1:-2;
+    }
+    
+    
+    
+    
+    function utf8CheckIncomplete(self,buf,i){
+    var j=buf.length-1;
+    if(j<i)return 0;
+    var nb=utf8CheckByte(buf[j]);
+    if(nb>=0){
+    if(nb>0)self.lastNeed=nb-1;
+    return nb;
+    }
+    if(--j<i||nb===-2)return 0;
+    nb=utf8CheckByte(buf[j]);
+    if(nb>=0){
+    if(nb>0)self.lastNeed=nb-2;
+    return nb;
+    }
+    if(--j<i||nb===-2)return 0;
+    nb=utf8CheckByte(buf[j]);
+    if(nb>=0){
+    if(nb>0){
+    if(nb===2)nb=0;else self.lastNeed=nb-3;
+    }
+    return nb;
+    }
+    return 0;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function utf8CheckExtraBytes(self,buf,p){
+    if((buf[0]&0xC0)!==0x80){
+    self.lastNeed=0;
+    return'\ufffd';
+    }
+    if(self.lastNeed>1&&buf.length>1){
+    if((buf[1]&0xC0)!==0x80){
+    self.lastNeed=1;
+    return'\ufffd';
+    }
+    if(self.lastNeed>2&&buf.length>2){
+    if((buf[2]&0xC0)!==0x80){
+    self.lastNeed=2;
+    return'\ufffd';
+    }
+    }
+    }
+    }
+    
+    
+    function utf8FillLast(buf){
+    var p=this.lastTotal-this.lastNeed;
+    var r=utf8CheckExtraBytes(this,buf,p);
+    if(r!==undefined)return r;
+    if(this.lastNeed<=buf.length){
+    buf.copy(this.lastChar,p,0,this.lastNeed);
+    return this.lastChar.toString(this.encoding,0,this.lastTotal);
+    }
+    buf.copy(this.lastChar,p,0,buf.length);
+    this.lastNeed-=buf.length;
+    }
+    
+    
+    
+    
+    function utf8Text(buf,i){
+    var total=utf8CheckIncomplete(this,buf,i);
+    if(!this.lastNeed)return buf.toString('utf8',i);
+    this.lastTotal=total;
+    var end=buf.length-(total-this.lastNeed);
+    buf.copy(this.lastChar,0,end);
+    return buf.toString('utf8',i,end);
+    }
+    
+    
+    
+    function utf8End(buf){
+    var r=buf&&buf.length?this.write(buf):'';
+    if(this.lastNeed)return r+'\ufffd';
+    return r;
+    }
+    
+    
+    
+    
+    
+    function utf16Text(buf,i){
+    if((buf.length-i)%2===0){
+    var r=buf.toString('utf16le',i);
+    if(r){
+    var c=r.charCodeAt(r.length-1);
+    if(c>=0xD800&&c<=0xDBFF){
+    this.lastNeed=2;
+    this.lastTotal=4;
+    this.lastChar[0]=buf[buf.length-2];
+    this.lastChar[1]=buf[buf.length-1];
+    return r.slice(0,-1);
+    }
+    }
+    return r;
+    }
+    this.lastNeed=1;
+    this.lastTotal=2;
+    this.lastChar[0]=buf[buf.length-1];
+    return buf.toString('utf16le',i,buf.length-1);
+    }
+    
+    
+    
+    function utf16End(buf){
+    var r=buf&&buf.length?this.write(buf):'';
+    if(this.lastNeed){
+    var end=this.lastTotal-this.lastNeed;
+    return r+this.lastChar.toString('utf16le',0,end);
+    }
+    return r;
+    }
+    
+    function base64Text(buf,i){
+    var n=(buf.length-i)%3;
+    if(n===0)return buf.toString('base64',i);
+    this.lastNeed=3-n;
+    this.lastTotal=3;
+    if(n===1){
+    this.lastChar[0]=buf[buf.length-1];
+    }else{
+    this.lastChar[0]=buf[buf.length-2];
+    this.lastChar[1]=buf[buf.length-1];
+    }
+    return buf.toString('base64',i,buf.length-n);
+    }
+    
+    function base64End(buf){
+    var r=buf&&buf.length?this.write(buf):'';
+    if(this.lastNeed)return r+this.lastChar.toString('base64',0,3-this.lastNeed);
+    return r;
+    }
+    
+    
+    function simpleWrite(buf){
+    return buf.toString(this.encoding);
+    }
+    
+    function simpleEnd(buf){
+    return buf&&buf.length?this.write(buf):'';
+    }
+    },{"safe-buffer":178}],172:[function(require,module,exports){
+    module.exports=require('./readable').PassThrough;
+    
+    },{"./readable":173}],173:[function(require,module,exports){
+    exports=module.exports=require('./lib/_stream_readable.js');
+    exports.Stream=exports;
+    exports.Readable=exports;
+    exports.Writable=require('./lib/_stream_writable.js');
+    exports.Duplex=require('./lib/_stream_duplex.js');
+    exports.Transform=require('./lib/_stream_transform.js');
+    exports.PassThrough=require('./lib/_stream_passthrough.js');
+    
+    },{"./lib/_stream_duplex.js":163,"./lib/_stream_passthrough.js":164,"./lib/_stream_readable.js":165,"./lib/_stream_transform.js":166,"./lib/_stream_writable.js":167}],174:[function(require,module,exports){
+    module.exports=require('./readable').Transform;
+    
+    },{"./readable":173}],175:[function(require,module,exports){
+    module.exports=require('./lib/_stream_writable.js');
+    
+    },{"./lib/_stream_writable.js":167}],176:[function(require,module,exports){
+    var URL=require('url').URL;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function trimLine(line){
+    if(!line){
+    return null;
+    }
+    
+    if(Array.isArray(line)){
+    return line.map(trimLine);
+    }
+    
+    return String(line).trim();
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function removeComments(line){
+    var commentStartIndex=line.indexOf('#');
+    if(commentStartIndex>-1){
+    return line.substr(0,commentStartIndex);
+    }
+    
+    return line;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    function splitLine(line){
+    var idx=String(line).indexOf(':');
+    
+    if(!line||idx<0){
+    return null;
+    }
+    
+    return[line.slice(0,idx),line.slice(idx+1)];
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function formatUserAgent(userAgent){
+    var formattedUserAgent=userAgent.toLowerCase();
+    
+    
+    var idx=formattedUserAgent.indexOf('/');
+    if(idx>-1){
+    formattedUserAgent=formattedUserAgent.substr(0,idx);
+    }
+    
+    return formattedUserAgent.trim();
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function normaliseEncoding(path){
+    try{
+    return urlEncodeToUpper(encodeURI(path).replace(/%25/g,'%'));
+    }catch(e){
+    return path;
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function urlEncodeToUpper(path){
+    return path.replace(/%[0-9a-fA-F]{2}/g,function(match){
+    return match.toUpperCase();
+    });
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function parsePattern(pattern){
+    var regexSpecialChars=/[\-\[\]\/\{\}\(\)\+\?\.\\\^\$\|]/g;
+    var wildCardPattern=/\*/g;
+    var endOfLinePattern=/\\\$$/;
+    
+    pattern=normaliseEncoding(pattern);
+    
+    if(pattern.indexOf('*')<0&&pattern.indexOf('$')<0){
+    return pattern;
+    }
+    
+    pattern=pattern.
+    replace(regexSpecialChars,'\\$&').
+    replace(wildCardPattern,'(?:.*)').
+    replace(endOfLinePattern,'$');
+    
+    return new RegExp(pattern);
+    }
+    
+    function parseRobots(contents,robots){
+    var newlineRegex=/\r\n|\r|\n/;
+    var lines=contents.
+    split(newlineRegex).
+    map(removeComments).
+    map(splitLine).
+    map(trimLine);
+    
+    var currentUserAgents=[];
+    var isNoneUserAgentState=true;
+    for(var i=0;i<lines.length;i++){
+    var line=lines[i];
+    
+    if(!line||!line[0]){
+    continue;
+    }
+    
+    switch(line[0].toLowerCase()){
+    case'user-agent':
+    if(isNoneUserAgentState){
+    currentUserAgents.length=0;
+    }
+    
+    if(line[1]){
+    currentUserAgents.push(formatUserAgent(line[1]));
+    }
+    break;
+    case'disallow':
+    robots.addRule(currentUserAgents,line[1],false,i+1);
+    break;
+    case'allow':
+    robots.addRule(currentUserAgents,line[1],true,i+1);
+    break;
+    case'crawl-delay':
+    robots.setCrawlDelay(currentUserAgents,line[1]);
+    break;
+    case'sitemap':
+    if(line[1]){
+    robots.addSitemap(line[1]);
+    }
+    break;
+    case'host':
+    if(line[1]){
+    robots.setPreferredHost(line[1].toLowerCase());
+    }
+    break;}
+    
+    
+    isNoneUserAgentState=line[0].toLowerCase()!=='user-agent';
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function findRule(path,rules){
+    var matchingRule=null;
+    
+    for(var i=0;i<rules.length;i++){
+    var rule=rules[i];
+    
+    if(typeof rule.pattern==='string'){
+    if(path.indexOf(rule.pattern)!==0){
+    continue;
+    }
+    
+    
+    if(!matchingRule||rule.pattern.length>matchingRule.pattern.length){
+    matchingRule=rule;
+    }
+    
+    
+    }else if(rule.pattern.test(path)){
+    return rule;
+    }
+    }
+    
+    return matchingRule;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function parseUrl(url){
+    try{
+    return new URL(url);
+    }catch(e){
+    return null;
+    }
+    }
+    
+    
+    function Robots(url,contents){
+    this._url=parseUrl(url)||{};
+    this._url.port=this._url.port||80;
+    
+    this._rules={};
+    this._sitemaps=[];
+    this._preferedHost=null;
+    
+    parseRobots(contents||'',this);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    Robots.prototype.addRule=function(userAgents,pattern,allow,lineNumber){
+    var rules=this._rules;
+    
+    userAgents.forEach(function(userAgent){
+    rules[userAgent]=rules[userAgent]||[];
+    
+    if(!pattern){
+    return;
+    }
+    
+    rules[userAgent].push({
+    pattern:parsePattern(pattern),
+    allow:allow,
+    lineNumber:lineNumber});
+    
+    });
+    };
+    
+    
+    
+    
+    
+    
+    
+    Robots.prototype.setCrawlDelay=function(userAgents,delayStr){
+    var rules=this._rules;
+    var delay=Number(delayStr);
+    
+    userAgents.forEach(function(userAgent){
+    rules[userAgent]=rules[userAgent]||[];
+    
+    if(isNaN(delay)){
+    return;
+    }
+    
+    rules[userAgent].crawlDelay=delay;
+    });
+    };
+    
+    
+    
+    
+    
+    
+    Robots.prototype.addSitemap=function(url){
+    this._sitemaps.push(url);
+    };
+    
+    
+    
+    
+    
+    
+    Robots.prototype.setPreferredHost=function(url){
+    this._preferedHost=url;
+    };
+    
+    Robots.prototype._getRule=function(url,ua){
+    var parsedUrl=parseUrl(url)||{};
+    var userAgent=formatUserAgent(ua||'*');
+    
+    parsedUrl.port=parsedUrl.port||'80';
+    
+    
+    if(parsedUrl.protocol!==this._url.protocol||
+    parsedUrl.hostname!==this._url.hostname||
+    parsedUrl.port!==this._url.port){
+    return;
+    }
+    
+    var rules=this._rules[userAgent]||this._rules['*']||[];
+    var path=urlEncodeToUpper(parsedUrl.pathname+parsedUrl.search);
+    var rule=findRule(path,rules);
+    
+    return rule;
+    };
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    Robots.prototype.isAllowed=function(url,ua){
+    var rule=this._getRule(url,ua);
+    
+    if(typeof rule==='undefined'){
+    return;
+    }
+    
+    return!rule||rule.allow;
+    };
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    Robots.prototype.getMatchingLineNumber=function(url,ua){
+    var rule=this._getRule(url,ua);
+    
+    return rule?rule.lineNumber:-1;
+    };
+    
+    
+    
+    
+    
+    
+    
+    
+    Robots.prototype.isDisallowed=function(url,ua){
+    return!this.isAllowed(url,ua);
+    };
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    Robots.prototype.getCrawlDelay=function(ua){
+    var userAgent=formatUserAgent(ua||'*');
+    
+    return(this._rules[userAgent]||this._rules['*']||{}).crawlDelay;
+    };
+    
+    
+    
+    
+    
+    
+    Robots.prototype.getPreferredHost=function(){
+    return this._preferedHost;
+    };
+    
+    
+    
+    
+    
+    
+    Robots.prototype.getSitemaps=function(){
+    return this._sitemaps.slice(0);
+    };
+    
+    module.exports=Robots;
+    
+    },{"url":"url"}],177:[function(require,module,exports){
+    var Robots=require('./Robots');
+    
+    module.exports=function(url,contents){
+    return new Robots(url,contents);
+    };
+    },{"./Robots":176}],178:[function(require,module,exports){
+    
+    var buffer=require('buffer');
+    var Buffer=buffer.Buffer;
+    
+    
+    function copyProps(src,dst){
+    for(var key in src){
+    dst[key]=src[key];
+    }
+    }
+    if(Buffer.from&&Buffer.alloc&&Buffer.allocUnsafe&&Buffer.allocUnsafeSlow){
+    module.exports=buffer;
+    }else{
+    
+    copyProps(buffer,exports);
+    exports.Buffer=SafeBuffer;
+    }
+    
+    function SafeBuffer(arg,encodingOrOffset,length){
+    return Buffer(arg,encodingOrOffset,length);
+    }
+    
+    
+    copyProps(Buffer,SafeBuffer);
+    
+    SafeBuffer.from=function(arg,encodingOrOffset,length){
+    if(typeof arg==='number'){
+    throw new TypeError('Argument must not be a number');
+    }
+    return Buffer(arg,encodingOrOffset,length);
+    };
+    
+    SafeBuffer.alloc=function(size,fill,encoding){
+    if(typeof size!=='number'){
+    throw new TypeError('Argument must be a number');
+    }
+    var buf=Buffer(size);
+    if(fill!==undefined){
+    if(typeof encoding==='string'){
+    buf.fill(fill,encoding);
+    }else{
+    buf.fill(fill);
+    }
+    }else{
+    buf.fill(0);
+    }
+    return buf;
+    };
+    
+    SafeBuffer.allocUnsafe=function(size){
+    if(typeof size!=='number'){
+    throw new TypeError('Argument must be a number');
+    }
+    return Buffer(size);
+    };
+    
+    SafeBuffer.allocUnsafeSlow=function(size){
+    if(typeof size!=='number'){
+    throw new TypeError('Argument must be a number');
+    }
+    return buffer.SlowBuffer(size);
+    };
+    
+    },{"buffer":102}],179:[function(require,module,exports){
+    (function(process){
+    exports=module.exports=SemVer;
+    
+    var debug;
+    
+    if(typeof process==='object'&&
+    process.env&&
+    process.env.NODE_DEBUG&&
+    /\bsemver\b/i.test(process.env.NODE_DEBUG)){
+    debug=function(){
+    var args=Array.prototype.slice.call(arguments,0);
+    args.unshift('SEMVER');
+    console.log.apply(console,args);
+    };
+    }else{
+    debug=function(){};
+    }
+    
+    
+    
+    exports.SEMVER_SPEC_VERSION='2.0.0';
+    
+    var MAX_LENGTH=256;
+    var MAX_SAFE_INTEGER=Number.MAX_SAFE_INTEGER||
+    9007199254740991;
+    
+    
+    var MAX_SAFE_COMPONENT_LENGTH=16;
+    
+    
+    var re=exports.re=[];
+    var src=exports.src=[];
+    var R=0;
+    
+    
+    
+    
+    
+    
+    
+    var NUMERICIDENTIFIER=R++;
+    src[NUMERICIDENTIFIER]='0|[1-9]\\d*';
+    var NUMERICIDENTIFIERLOOSE=R++;
+    src[NUMERICIDENTIFIERLOOSE]='[0-9]+';
+    
+    
+    
+    
+    
+    var NONNUMERICIDENTIFIER=R++;
+    src[NONNUMERICIDENTIFIER]='\\d*[a-zA-Z-][a-zA-Z0-9-]*';
+    
+    
+    
+    
+    var MAINVERSION=R++;
+    src[MAINVERSION]='('+src[NUMERICIDENTIFIER]+')\\.'+
+    '('+src[NUMERICIDENTIFIER]+')\\.'+
+    '('+src[NUMERICIDENTIFIER]+')';
+    
+    var MAINVERSIONLOOSE=R++;
+    src[MAINVERSIONLOOSE]='('+src[NUMERICIDENTIFIERLOOSE]+')\\.'+
+    '('+src[NUMERICIDENTIFIERLOOSE]+')\\.'+
+    '('+src[NUMERICIDENTIFIERLOOSE]+')';
+    
+    
+    
+    
+    var PRERELEASEIDENTIFIER=R++;
+    src[PRERELEASEIDENTIFIER]='(?:'+src[NUMERICIDENTIFIER]+
+    '|'+src[NONNUMERICIDENTIFIER]+')';
+    
+    var PRERELEASEIDENTIFIERLOOSE=R++;
+    src[PRERELEASEIDENTIFIERLOOSE]='(?:'+src[NUMERICIDENTIFIERLOOSE]+
+    '|'+src[NONNUMERICIDENTIFIER]+')';
+    
+    
+    
+    
+    
+    var PRERELEASE=R++;
+    src[PRERELEASE]='(?:-('+src[PRERELEASEIDENTIFIER]+
+    '(?:\\.'+src[PRERELEASEIDENTIFIER]+')*))';
+    
+    var PRERELEASELOOSE=R++;
+    src[PRERELEASELOOSE]='(?:-?('+src[PRERELEASEIDENTIFIERLOOSE]+
+    '(?:\\.'+src[PRERELEASEIDENTIFIERLOOSE]+')*))';
+    
+    
+    
+    
+    var BUILDIDENTIFIER=R++;
+    src[BUILDIDENTIFIER]='[0-9A-Za-z-]+';
+    
+    
+    
+    
+    
+    var BUILD=R++;
+    src[BUILD]='(?:\\+('+src[BUILDIDENTIFIER]+
+    '(?:\\.'+src[BUILDIDENTIFIER]+')*))';
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    var FULL=R++;
+    var FULLPLAIN='v?'+src[MAINVERSION]+
+    src[PRERELEASE]+'?'+
+    src[BUILD]+'?';
+    
+    src[FULL]='^'+FULLPLAIN+'$';
+    
+    
+    
+    
+    var LOOSEPLAIN='[v=\\s]*'+src[MAINVERSIONLOOSE]+
+    src[PRERELEASELOOSE]+'?'+
+    src[BUILD]+'?';
+    
+    var LOOSE=R++;
+    src[LOOSE]='^'+LOOSEPLAIN+'$';
+    
+    var GTLT=R++;
+    src[GTLT]='((?:<|>)?=?)';
+    
+    
+    
+    
+    var XRANGEIDENTIFIERLOOSE=R++;
+    src[XRANGEIDENTIFIERLOOSE]=src[NUMERICIDENTIFIERLOOSE]+'|x|X|\\*';
+    var XRANGEIDENTIFIER=R++;
+    src[XRANGEIDENTIFIER]=src[NUMERICIDENTIFIER]+'|x|X|\\*';
+    
+    var XRANGEPLAIN=R++;
+    src[XRANGEPLAIN]='[v=\\s]*('+src[XRANGEIDENTIFIER]+')'+
+    '(?:\\.('+src[XRANGEIDENTIFIER]+')'+
+    '(?:\\.('+src[XRANGEIDENTIFIER]+')'+
+    '(?:'+src[PRERELEASE]+')?'+
+    src[BUILD]+'?'+
+    ')?)?';
+    
+    var XRANGEPLAINLOOSE=R++;
+    src[XRANGEPLAINLOOSE]='[v=\\s]*('+src[XRANGEIDENTIFIERLOOSE]+')'+
+    '(?:\\.('+src[XRANGEIDENTIFIERLOOSE]+')'+
+    '(?:\\.('+src[XRANGEIDENTIFIERLOOSE]+')'+
+    '(?:'+src[PRERELEASELOOSE]+')?'+
+    src[BUILD]+'?'+
+    ')?)?';
+    
+    var XRANGE=R++;
+    src[XRANGE]='^'+src[GTLT]+'\\s*'+src[XRANGEPLAIN]+'$';
+    var XRANGELOOSE=R++;
+    src[XRANGELOOSE]='^'+src[GTLT]+'\\s*'+src[XRANGEPLAINLOOSE]+'$';
+    
+    
+    
+    var COERCE=R++;
+    src[COERCE]='(?:^|[^\\d])'+
+    '(\\d{1,'+MAX_SAFE_COMPONENT_LENGTH+'})'+
+    '(?:\\.(\\d{1,'+MAX_SAFE_COMPONENT_LENGTH+'}))?'+
+    '(?:\\.(\\d{1,'+MAX_SAFE_COMPONENT_LENGTH+'}))?'+
+    '(?:$|[^\\d])';
+    
+    
+    
+    var LONETILDE=R++;
+    src[LONETILDE]='(?:~>?)';
+    
+    var TILDETRIM=R++;
+    src[TILDETRIM]='(\\s*)'+src[LONETILDE]+'\\s+';
+    re[TILDETRIM]=new RegExp(src[TILDETRIM],'g');
+    var tildeTrimReplace='$1~';
+    
+    var TILDE=R++;
+    src[TILDE]='^'+src[LONETILDE]+src[XRANGEPLAIN]+'$';
+    var TILDELOOSE=R++;
+    src[TILDELOOSE]='^'+src[LONETILDE]+src[XRANGEPLAINLOOSE]+'$';
+    
+    
+    
+    var LONECARET=R++;
+    src[LONECARET]='(?:\\^)';
+    
+    var CARETTRIM=R++;
+    src[CARETTRIM]='(\\s*)'+src[LONECARET]+'\\s+';
+    re[CARETTRIM]=new RegExp(src[CARETTRIM],'g');
+    var caretTrimReplace='$1^';
+    
+    var CARET=R++;
+    src[CARET]='^'+src[LONECARET]+src[XRANGEPLAIN]+'$';
+    var CARETLOOSE=R++;
+    src[CARETLOOSE]='^'+src[LONECARET]+src[XRANGEPLAINLOOSE]+'$';
+    
+    
+    var COMPARATORLOOSE=R++;
+    src[COMPARATORLOOSE]='^'+src[GTLT]+'\\s*('+LOOSEPLAIN+')$|^$';
+    var COMPARATOR=R++;
+    src[COMPARATOR]='^'+src[GTLT]+'\\s*('+FULLPLAIN+')$|^$';
+    
+    
+    
+    var COMPARATORTRIM=R++;
+    src[COMPARATORTRIM]='(\\s*)'+src[GTLT]+
+    '\\s*('+LOOSEPLAIN+'|'+src[XRANGEPLAIN]+')';
+    
+    
+    re[COMPARATORTRIM]=new RegExp(src[COMPARATORTRIM],'g');
+    var comparatorTrimReplace='$1$2$3';
+    
+    
+    
+    
+    
+    var HYPHENRANGE=R++;
+    src[HYPHENRANGE]='^\\s*('+src[XRANGEPLAIN]+')'+
+    '\\s+-\\s+'+
+    '('+src[XRANGEPLAIN]+')'+
+    '\\s*$';
+    
+    var HYPHENRANGELOOSE=R++;
+    src[HYPHENRANGELOOSE]='^\\s*('+src[XRANGEPLAINLOOSE]+')'+
+    '\\s+-\\s+'+
+    '('+src[XRANGEPLAINLOOSE]+')'+
+    '\\s*$';
+    
+    
+    var STAR=R++;
+    src[STAR]='(<|>)?=?\\s*\\*';
+    
+    
+    
+    for(var i=0;i<R;i++){
+    debug(i,src[i]);
+    if(!re[i]){
+    re[i]=new RegExp(src[i]);
+    }
+    }
+    
+    exports.parse=parse;
+    function parse(version,options){
+    if(!options||typeof options!=='object'){
+    options={
+    loose:!!options,
+    includePrerelease:false};
+    
+    }
+    
+    if(version instanceof SemVer){
+    return version;
+    }
+    
+    if(typeof version!=='string'){
+    return null;
+    }
+    
+    if(version.length>MAX_LENGTH){
+    return null;
+    }
+    
+    var r=options.loose?re[LOOSE]:re[FULL];
+    if(!r.test(version)){
+    return null;
+    }
+    
+    try{
+    return new SemVer(version,options);
+    }catch(er){
+    return null;
+    }
+    }
+    
+    exports.valid=valid;
+    function valid(version,options){
+    var v=parse(version,options);
+    return v?v.version:null;
+    }
+    
+    exports.clean=clean;
+    function clean(version,options){
+    var s=parse(version.trim().replace(/^[=v]+/,''),options);
+    return s?s.version:null;
+    }
+    
+    exports.SemVer=SemVer;
+    
+    function SemVer(version,options){
+    if(!options||typeof options!=='object'){
+    options={
+    loose:!!options,
+    includePrerelease:false};
+    
+    }
+    if(version instanceof SemVer){
+    if(version.loose===options.loose){
+    return version;
+    }else{
+    version=version.version;
+    }
+    }else if(typeof version!=='string'){
+    throw new TypeError('Invalid Version: '+version);
+    }
+    
+    if(version.length>MAX_LENGTH){
+    throw new TypeError('version is longer than '+MAX_LENGTH+' characters');
+    }
+    
+    if(!(this instanceof SemVer)){
+    return new SemVer(version,options);
+    }
+    
+    debug('SemVer',version,options);
+    this.options=options;
+    this.loose=!!options.loose;
+    
+    var m=version.trim().match(options.loose?re[LOOSE]:re[FULL]);
+    
+    if(!m){
+    throw new TypeError('Invalid Version: '+version);
+    }
+    
+    this.raw=version;
+    
+    
+    this.major=+m[1];
+    this.minor=+m[2];
+    this.patch=+m[3];
+    
+    if(this.major>MAX_SAFE_INTEGER||this.major<0){
+    throw new TypeError('Invalid major version');
+    }
+    
+    if(this.minor>MAX_SAFE_INTEGER||this.minor<0){
+    throw new TypeError('Invalid minor version');
+    }
+    
+    if(this.patch>MAX_SAFE_INTEGER||this.patch<0){
+    throw new TypeError('Invalid patch version');
+    }
+    
+    
+    if(!m[4]){
+    this.prerelease=[];
+    }else{
+    this.prerelease=m[4].split('.').map(function(id){
+    if(/^[0-9]+$/.test(id)){
+    var num=+id;
+    if(num>=0&&num<MAX_SAFE_INTEGER){
+    return num;
+    }
+    }
+    return id;
+    });
+    }
+    
+    this.build=m[5]?m[5].split('.'):[];
+    this.format();
+    }
+    
+    SemVer.prototype.format=function(){
+    this.version=this.major+'.'+this.minor+'.'+this.patch;
+    if(this.prerelease.length){
+    this.version+='-'+this.prerelease.join('.');
+    }
+    return this.version;
+    };
+    
+    SemVer.prototype.toString=function(){
+    return this.version;
+    };
+    
+    SemVer.prototype.compare=function(other){
+    debug('SemVer.compare',this.version,this.options,other);
+    if(!(other instanceof SemVer)){
+    other=new SemVer(other,this.options);
+    }
+    
+    return this.compareMain(other)||this.comparePre(other);
+    };
+    
+    SemVer.prototype.compareMain=function(other){
+    if(!(other instanceof SemVer)){
+    other=new SemVer(other,this.options);
+    }
+    
+    return compareIdentifiers(this.major,other.major)||
+    compareIdentifiers(this.minor,other.minor)||
+    compareIdentifiers(this.patch,other.patch);
+    };
+    
+    SemVer.prototype.comparePre=function(other){
+    if(!(other instanceof SemVer)){
+    other=new SemVer(other,this.options);
+    }
+    
+    
+    if(this.prerelease.length&&!other.prerelease.length){
+    return-1;
+    }else if(!this.prerelease.length&&other.prerelease.length){
+    return 1;
+    }else if(!this.prerelease.length&&!other.prerelease.length){
+    return 0;
+    }
+    
+    var i=0;
+    do{
+    var a=this.prerelease[i];
+    var b=other.prerelease[i];
+    debug('prerelease compare',i,a,b);
+    if(a===undefined&&b===undefined){
+    return 0;
+    }else if(b===undefined){
+    return 1;
+    }else if(a===undefined){
+    return-1;
+    }else if(a===b){
+    continue;
+    }else{
+    return compareIdentifiers(a,b);
+    }
+    }while(++i);
+    };
+    
+    
+    
+    SemVer.prototype.inc=function(release,identifier){
+    switch(release){
+    case'premajor':
+    this.prerelease.length=0;
+    this.patch=0;
+    this.minor=0;
+    this.major++;
+    this.inc('pre',identifier);
+    break;
+    case'preminor':
+    this.prerelease.length=0;
+    this.patch=0;
+    this.minor++;
+    this.inc('pre',identifier);
+    break;
+    case'prepatch':
+    
+    
+    
+    this.prerelease.length=0;
+    this.inc('patch',identifier);
+    this.inc('pre',identifier);
+    break;
+    
+    
+    case'prerelease':
+    if(this.prerelease.length===0){
+    this.inc('patch',identifier);
+    }
+    this.inc('pre',identifier);
+    break;
+    
+    case'major':
+    
+    
+    
+    
+    if(this.minor!==0||
+    this.patch!==0||
+    this.prerelease.length===0){
+    this.major++;
+    }
+    this.minor=0;
+    this.patch=0;
+    this.prerelease=[];
+    break;
+    case'minor':
+    
+    
+    
+    
+    if(this.patch!==0||this.prerelease.length===0){
+    this.minor++;
+    }
+    this.patch=0;
+    this.prerelease=[];
+    break;
+    case'patch':
+    
+    
+    
+    
+    if(this.prerelease.length===0){
+    this.patch++;
+    }
+    this.prerelease=[];
+    break;
+    
+    
+    case'pre':
+    if(this.prerelease.length===0){
+    this.prerelease=[0];
+    }else{
+    var i=this.prerelease.length;
+    while(--i>=0){
+    if(typeof this.prerelease[i]==='number'){
+    this.prerelease[i]++;
+    i=-2;
+    }
+    }
+    if(i===-1){
+    
+    this.prerelease.push(0);
+    }
+    }
+    if(identifier){
+    
+    
+    if(this.prerelease[0]===identifier){
+    if(isNaN(this.prerelease[1])){
+    this.prerelease=[identifier,0];
+    }
+    }else{
+    this.prerelease=[identifier,0];
+    }
+    }
+    break;
+    
+    default:
+    throw new Error('invalid increment argument: '+release);}
+    
+    this.format();
+    this.raw=this.version;
+    return this;
+    };
+    
+    exports.inc=inc;
+    function inc(version,release,loose,identifier){
+    if(typeof loose==='string'){
+    identifier=loose;
+    loose=undefined;
+    }
+    
+    try{
+    return new SemVer(version,loose).inc(release,identifier).version;
+    }catch(er){
+    return null;
+    }
+    }
+    
+    exports.diff=diff;
+    function diff(version1,version2){
+    if(eq(version1,version2)){
+    return null;
+    }else{
+    var v1=parse(version1);
+    var v2=parse(version2);
+    var prefix='';
+    if(v1.prerelease.length||v2.prerelease.length){
+    prefix='pre';
+    var defaultResult='prerelease';
+    }
+    for(var key in v1){
+    if(key==='major'||key==='minor'||key==='patch'){
+    if(v1[key]!==v2[key]){
+    return prefix+key;
+    }
+    }
+    }
+    return defaultResult;
+    }
+    }
+    
+    exports.compareIdentifiers=compareIdentifiers;
+    
+    var numeric=/^[0-9]+$/;
+    function compareIdentifiers(a,b){
+    var anum=numeric.test(a);
+    var bnum=numeric.test(b);
+    
+    if(anum&&bnum){
+    a=+a;
+    b=+b;
+    }
+    
+    return a===b?0:
+    anum&&!bnum?-1:
+    bnum&&!anum?1:
+    a<b?-1:
+    1;
+    }
+    
+    exports.rcompareIdentifiers=rcompareIdentifiers;
+    function rcompareIdentifiers(a,b){
+    return compareIdentifiers(b,a);
+    }
+    
+    exports.major=major;
+    function major(a,loose){
+    return new SemVer(a,loose).major;
+    }
+    
+    exports.minor=minor;
+    function minor(a,loose){
+    return new SemVer(a,loose).minor;
+    }
+    
+    exports.patch=patch;
+    function patch(a,loose){
+    return new SemVer(a,loose).patch;
+    }
+    
+    exports.compare=compare;
+    function compare(a,b,loose){
+    return new SemVer(a,loose).compare(new SemVer(b,loose));
+    }
+    
+    exports.compareLoose=compareLoose;
+    function compareLoose(a,b){
+    return compare(a,b,true);
+    }
+    
+    exports.rcompare=rcompare;
+    function rcompare(a,b,loose){
+    return compare(b,a,loose);
+    }
+    
+    exports.sort=sort;
+    function sort(list,loose){
+    return list.sort(function(a,b){
+    return exports.compare(a,b,loose);
+    });
+    }
+    
+    exports.rsort=rsort;
+    function rsort(list,loose){
+    return list.sort(function(a,b){
+    return exports.rcompare(a,b,loose);
+    });
+    }
+    
+    exports.gt=gt;
+    function gt(a,b,loose){
+    return compare(a,b,loose)>0;
+    }
+    
+    exports.lt=lt;
+    function lt(a,b,loose){
+    return compare(a,b,loose)<0;
+    }
+    
+    exports.eq=eq;
+    function eq(a,b,loose){
+    return compare(a,b,loose)===0;
+    }
+    
+    exports.neq=neq;
+    function neq(a,b,loose){
+    return compare(a,b,loose)!==0;
+    }
+    
+    exports.gte=gte;
+    function gte(a,b,loose){
+    return compare(a,b,loose)>=0;
+    }
+    
+    exports.lte=lte;
+    function lte(a,b,loose){
+    return compare(a,b,loose)<=0;
+    }
+    
+    exports.cmp=cmp;
+    function cmp(a,op,b,loose){
+    switch(op){
+    case'===':
+    if(typeof a==='object')
+    a=a.version;
+    if(typeof b==='object')
+    b=b.version;
+    return a===b;
+    
+    case'!==':
+    if(typeof a==='object')
+    a=a.version;
+    if(typeof b==='object')
+    b=b.version;
+    return a!==b;
+    
+    case'':
+    case'=':
+    case'==':
+    return eq(a,b,loose);
+    
+    case'!=':
+    return neq(a,b,loose);
+    
+    case'>':
+    return gt(a,b,loose);
+    
+    case'>=':
+    return gte(a,b,loose);
+    
+    case'<':
+    return lt(a,b,loose);
+    
+    case'<=':
+    return lte(a,b,loose);
+    
+    default:
+    throw new TypeError('Invalid operator: '+op);}
+    
+    }
+    
+    exports.Comparator=Comparator;
+    function Comparator(comp,options){
+    if(!options||typeof options!=='object'){
+    options={
+    loose:!!options,
+    includePrerelease:false};
+    
+    }
+    
+    if(comp instanceof Comparator){
+    if(comp.loose===!!options.loose){
+    return comp;
+    }else{
+    comp=comp.value;
+    }
+    }
+    
+    if(!(this instanceof Comparator)){
+    return new Comparator(comp,options);
+    }
+    
+    debug('comparator',comp,options);
+    this.options=options;
+    this.loose=!!options.loose;
+    this.parse(comp);
+    
+    if(this.semver===ANY){
+    this.value='';
+    }else{
+    this.value=this.operator+this.semver.version;
+    }
+    
+    debug('comp',this);
+    }
+    
+    var ANY={};
+    Comparator.prototype.parse=function(comp){
+    var r=this.options.loose?re[COMPARATORLOOSE]:re[COMPARATOR];
+    var m=comp.match(r);
+    
+    if(!m){
+    throw new TypeError('Invalid comparator: '+comp);
+    }
+    
+    this.operator=m[1];
+    if(this.operator==='='){
+    this.operator='';
+    }
+    
+    
+    if(!m[2]){
+    this.semver=ANY;
+    }else{
+    this.semver=new SemVer(m[2],this.options.loose);
+    }
+    };
+    
+    Comparator.prototype.toString=function(){
+    return this.value;
+    };
+    
+    Comparator.prototype.test=function(version){
+    debug('Comparator.test',version,this.options.loose);
+    
+    if(this.semver===ANY){
+    return true;
+    }
+    
+    if(typeof version==='string'){
+    version=new SemVer(version,this.options);
+    }
+    
+    return cmp(version,this.operator,this.semver,this.options);
+    };
+    
+    Comparator.prototype.intersects=function(comp,options){
+    if(!(comp instanceof Comparator)){
+    throw new TypeError('a Comparator is required');
+    }
+    
+    if(!options||typeof options!=='object'){
+    options={
+    loose:!!options,
+    includePrerelease:false};
+    
+    }
+    
+    var rangeTmp;
+    
+    if(this.operator===''){
+    rangeTmp=new Range(comp.value,options);
+    return satisfies(this.value,rangeTmp,options);
+    }else if(comp.operator===''){
+    rangeTmp=new Range(this.value,options);
+    return satisfies(comp.semver,rangeTmp,options);
+    }
+    
+    var sameDirectionIncreasing=
+    (this.operator==='>='||this.operator==='>')&&(
+    comp.operator==='>='||comp.operator==='>');
+    var sameDirectionDecreasing=
+    (this.operator==='<='||this.operator==='<')&&(
+    comp.operator==='<='||comp.operator==='<');
+    var sameSemVer=this.semver.version===comp.semver.version;
+    var differentDirectionsInclusive=
+    (this.operator==='>='||this.operator==='<=')&&(
+    comp.operator==='>='||comp.operator==='<=');
+    var oppositeDirectionsLessThan=
+    cmp(this.semver,'<',comp.semver,options)&&
+    (this.operator==='>='||this.operator==='>')&&(
+    comp.operator==='<='||comp.operator==='<');
+    var oppositeDirectionsGreaterThan=
+    cmp(this.semver,'>',comp.semver,options)&&
+    (this.operator==='<='||this.operator==='<')&&(
+    comp.operator==='>='||comp.operator==='>');
+    
+    return sameDirectionIncreasing||sameDirectionDecreasing||
+    sameSemVer&&differentDirectionsInclusive||
+    oppositeDirectionsLessThan||oppositeDirectionsGreaterThan;
+    };
+    
+    exports.Range=Range;
+    function Range(range,options){
+    if(!options||typeof options!=='object'){
+    options={
+    loose:!!options,
+    includePrerelease:false};
+    
+    }
+    
+    if(range instanceof Range){
+    if(range.loose===!!options.loose&&
+    range.includePrerelease===!!options.includePrerelease){
+    return range;
+    }else{
+    return new Range(range.raw,options);
+    }
+    }
+    
+    if(range instanceof Comparator){
+    return new Range(range.value,options);
+    }
+    
+    if(!(this instanceof Range)){
+    return new Range(range,options);
+    }
+    
+    this.options=options;
+    this.loose=!!options.loose;
+    this.includePrerelease=!!options.includePrerelease;
+    
+    
+    this.raw=range;
+    this.set=range.split(/\s*\|\|\s*/).map(function(range){
+    return this.parseRange(range.trim());
+    },this).filter(function(c){
+    
+    return c.length;
+    });
+    
+    if(!this.set.length){
+    throw new TypeError('Invalid SemVer Range: '+range);
+    }
+    
+    this.format();
+    }
+    
+    Range.prototype.format=function(){
+    this.range=this.set.map(function(comps){
+    return comps.join(' ').trim();
+    }).join('||').trim();
+    return this.range;
+    };
+    
+    Range.prototype.toString=function(){
+    return this.range;
+    };
+    
+    Range.prototype.parseRange=function(range){
+    var loose=this.options.loose;
+    range=range.trim();
+    
+    var hr=loose?re[HYPHENRANGELOOSE]:re[HYPHENRANGE];
+    range=range.replace(hr,hyphenReplace);
+    debug('hyphen replace',range);
+    
+    range=range.replace(re[COMPARATORTRIM],comparatorTrimReplace);
+    debug('comparator trim',range,re[COMPARATORTRIM]);
+    
+    
+    range=range.replace(re[TILDETRIM],tildeTrimReplace);
+    
+    
+    range=range.replace(re[CARETTRIM],caretTrimReplace);
+    
+    
+    range=range.split(/\s+/).join(' ');
+    
+    
+    
+    
+    var compRe=loose?re[COMPARATORLOOSE]:re[COMPARATOR];
+    var set=range.split(' ').map(function(comp){
+    return parseComparator(comp,this.options);
+    },this).join(' ').split(/\s+/);
+    if(this.options.loose){
+    
+    set=set.filter(function(comp){
+    return!!comp.match(compRe);
+    });
+    }
+    set=set.map(function(comp){
+    return new Comparator(comp,this.options);
+    },this);
+    
+    return set;
+    };
+    
+    Range.prototype.intersects=function(range,options){
+    if(!(range instanceof Range)){
+    throw new TypeError('a Range is required');
+    }
+    
+    return this.set.some(function(thisComparators){
+    return thisComparators.every(function(thisComparator){
+    return range.set.some(function(rangeComparators){
+    return rangeComparators.every(function(rangeComparator){
+    return thisComparator.intersects(rangeComparator,options);
+    });
+    });
+    });
+    });
+    };
+    
+    
+    exports.toComparators=toComparators;
+    function toComparators(range,options){
+    return new Range(range,options).set.map(function(comp){
+    return comp.map(function(c){
+    return c.value;
+    }).join(' ').trim().split(' ');
+    });
+    }
+    
+    
+    
+    
+    function parseComparator(comp,options){
+    debug('comp',comp,options);
+    comp=replaceCarets(comp,options);
+    debug('caret',comp);
+    comp=replaceTildes(comp,options);
+    debug('tildes',comp);
+    comp=replaceXRanges(comp,options);
+    debug('xrange',comp);
+    comp=replaceStars(comp,options);
+    debug('stars',comp);
+    return comp;
+    }
+    
+    function isX(id){
+    return!id||id.toLowerCase()==='x'||id==='*';
+    }
+    
+    
+    
+    
+    
+    
+    
+    function replaceTildes(comp,options){
+    return comp.trim().split(/\s+/).map(function(comp){
+    return replaceTilde(comp,options);
+    }).join(' ');
+    }
+    
+    function replaceTilde(comp,options){
+    var r=options.loose?re[TILDELOOSE]:re[TILDE];
+    return comp.replace(r,function(_,M,m,p,pr){
+    debug('tilde',comp,_,M,m,p,pr);
+    var ret;
+    
+    if(isX(M)){
+    ret='';
+    }else if(isX(m)){
+    ret='>='+M+'.0.0 <'+(+M+1)+'.0.0';
+    }else if(isX(p)){
+    
+    ret='>='+M+'.'+m+'.0 <'+M+'.'+(+m+1)+'.0';
+    }else if(pr){
+    debug('replaceTilde pr',pr);
+    ret='>='+M+'.'+m+'.'+p+'-'+pr+
+    ' <'+M+'.'+(+m+1)+'.0';
+    }else{
+    
+    ret='>='+M+'.'+m+'.'+p+
+    ' <'+M+'.'+(+m+1)+'.0';
+    }
+    
+    debug('tilde return',ret);
+    return ret;
+    });
+    }
+    
+    
+    
+    
+    
+    
+    
+    function replaceCarets(comp,options){
+    return comp.trim().split(/\s+/).map(function(comp){
+    return replaceCaret(comp,options);
+    }).join(' ');
+    }
+    
+    function replaceCaret(comp,options){
+    debug('caret',comp,options);
+    var r=options.loose?re[CARETLOOSE]:re[CARET];
+    return comp.replace(r,function(_,M,m,p,pr){
+    debug('caret',comp,_,M,m,p,pr);
+    var ret;
+    
+    if(isX(M)){
+    ret='';
+    }else if(isX(m)){
+    ret='>='+M+'.0.0 <'+(+M+1)+'.0.0';
+    }else if(isX(p)){
+    if(M==='0'){
+    ret='>='+M+'.'+m+'.0 <'+M+'.'+(+m+1)+'.0';
+    }else{
+    ret='>='+M+'.'+m+'.0 <'+(+M+1)+'.0.0';
+    }
+    }else if(pr){
+    debug('replaceCaret pr',pr);
+    if(M==='0'){
+    if(m==='0'){
+    ret='>='+M+'.'+m+'.'+p+'-'+pr+
+    ' <'+M+'.'+m+'.'+(+p+1);
+    }else{
+    ret='>='+M+'.'+m+'.'+p+'-'+pr+
+    ' <'+M+'.'+(+m+1)+'.0';
+    }
+    }else{
+    ret='>='+M+'.'+m+'.'+p+'-'+pr+
+    ' <'+(+M+1)+'.0.0';
+    }
+    }else{
+    debug('no pr');
+    if(M==='0'){
+    if(m==='0'){
+    ret='>='+M+'.'+m+'.'+p+
+    ' <'+M+'.'+m+'.'+(+p+1);
+    }else{
+    ret='>='+M+'.'+m+'.'+p+
+    ' <'+M+'.'+(+m+1)+'.0';
+    }
+    }else{
+    ret='>='+M+'.'+m+'.'+p+
+    ' <'+(+M+1)+'.0.0';
+    }
+    }
+    
+    debug('caret return',ret);
+    return ret;
+    });
+    }
+    
+    function replaceXRanges(comp,options){
+    debug('replaceXRanges',comp,options);
+    return comp.split(/\s+/).map(function(comp){
+    return replaceXRange(comp,options);
+    }).join(' ');
+    }
+    
+    function replaceXRange(comp,options){
+    comp=comp.trim();
+    var r=options.loose?re[XRANGELOOSE]:re[XRANGE];
+    return comp.replace(r,function(ret,gtlt,M,m,p,pr){
+    debug('xRange',comp,ret,gtlt,M,m,p,pr);
+    var xM=isX(M);
+    var xm=xM||isX(m);
+    var xp=xm||isX(p);
+    var anyX=xp;
+    
+    if(gtlt==='='&&anyX){
+    gtlt='';
+    }
+    
+    if(xM){
+    if(gtlt==='>'||gtlt==='<'){
+    
+    ret='<0.0.0';
+    }else{
+    
+    ret='*';
+    }
+    }else if(gtlt&&anyX){
+    
+    
+    if(xm){
+    m=0;
+    }
+    p=0;
+    
+    if(gtlt==='>'){
+    
+    
+    
+    gtlt='>=';
+    if(xm){
+    M=+M+1;
+    m=0;
+    p=0;
+    }else{
+    m=+m+1;
+    p=0;
+    }
+    }else if(gtlt==='<='){
+    
+    
+    gtlt='<';
+    if(xm){
+    M=+M+1;
+    }else{
+    m=+m+1;
+    }
+    }
+    
+    ret=gtlt+M+'.'+m+'.'+p;
+    }else if(xm){
+    ret='>='+M+'.0.0 <'+(+M+1)+'.0.0';
+    }else if(xp){
+    ret='>='+M+'.'+m+'.0 <'+M+'.'+(+m+1)+'.0';
+    }
+    
+    debug('xRange return',ret);
+    
+    return ret;
+    });
+    }
+    
+    
+    
+    function replaceStars(comp,options){
+    debug('replaceStars',comp,options);
+    
+    return comp.trim().replace(re[STAR],'');
+    }
+    
+    
+    
+    
+    
+    
+    function hyphenReplace($0,
+    from,fM,fm,fp,fpr,fb,
+    to,tM,tm,tp,tpr,tb){
+    if(isX(fM)){
+    from='';
+    }else if(isX(fm)){
+    from='>='+fM+'.0.0';
+    }else if(isX(fp)){
+    from='>='+fM+'.'+fm+'.0';
+    }else{
+    from='>='+from;
+    }
+    
+    if(isX(tM)){
+    to='';
+    }else if(isX(tm)){
+    to='<'+(+tM+1)+'.0.0';
+    }else if(isX(tp)){
+    to='<'+tM+'.'+(+tm+1)+'.0';
+    }else if(tpr){
+    to='<='+tM+'.'+tm+'.'+tp+'-'+tpr;
+    }else{
+    to='<='+to;
+    }
+    
+    return(from+' '+to).trim();
+    }
+    
+    
+    Range.prototype.test=function(version){
+    if(!version){
+    return false;
+    }
+    
+    if(typeof version==='string'){
+    version=new SemVer(version,this.options);
+    }
+    
+    for(var i=0;i<this.set.length;i++){
+    if(testSet(this.set[i],version,this.options)){
+    return true;
+    }
+    }
+    return false;
+    };
+    
+    function testSet(set,version,options){
+    for(var i=0;i<set.length;i++){
+    if(!set[i].test(version)){
+    return false;
+    }
+    }
+    
+    if(version.prerelease.length&&!options.includePrerelease){
+    
+    
+    
+    
+    
+    for(i=0;i<set.length;i++){
+    debug(set[i].semver);
+    if(set[i].semver===ANY){
+    continue;
+    }
+    
+    if(set[i].semver.prerelease.length>0){
+    var allowed=set[i].semver;
+    if(allowed.major===version.major&&
+    allowed.minor===version.minor&&
+    allowed.patch===version.patch){
+    return true;
+    }
+    }
+    }
+    
+    
+    return false;
+    }
+    
+    return true;
+    }
+    
+    exports.satisfies=satisfies;
+    function satisfies(version,range,options){
+    try{
+    range=new Range(range,options);
+    }catch(er){
+    return false;
+    }
+    return range.test(version);
+    }
+    
+    exports.maxSatisfying=maxSatisfying;
+    function maxSatisfying(versions,range,options){
+    var max=null;
+    var maxSV=null;
+    try{
+    var rangeObj=new Range(range,options);
+    }catch(er){
+    return null;
+    }
+    versions.forEach(function(v){
+    if(rangeObj.test(v)){
+    
+    if(!max||maxSV.compare(v)===-1){
+    
+    max=v;
+    maxSV=new SemVer(max,options);
+    }
+    }
+    });
+    return max;
+    }
+    
+    exports.minSatisfying=minSatisfying;
+    function minSatisfying(versions,range,options){
+    var min=null;
+    var minSV=null;
+    try{
+    var rangeObj=new Range(range,options);
+    }catch(er){
+    return null;
+    }
+    versions.forEach(function(v){
+    if(rangeObj.test(v)){
+    
+    if(!min||minSV.compare(v)===1){
+    
+    min=v;
+    minSV=new SemVer(min,options);
+    }
+    }
+    });
+    return min;
+    }
+    
+    exports.minVersion=minVersion;
+    function minVersion(range,loose){
+    range=new Range(range,loose);
+    
+    var minver=new SemVer('0.0.0');
+    if(range.test(minver)){
+    return minver;
+    }
+    
+    minver=new SemVer('0.0.0-0');
+    if(range.test(minver)){
+    return minver;
+    }
+    
+    minver=null;
+    for(var i=0;i<range.set.length;++i){
+    var comparators=range.set[i];
+    
+    comparators.forEach(function(comparator){
+    
+    var compver=new SemVer(comparator.semver.version);
+    switch(comparator.operator){
+    case'>':
+    if(compver.prerelease.length===0){
+    compver.patch++;
+    }else{
+    compver.prerelease.push(0);
+    }
+    compver.raw=compver.format();
+    
+    case'':
+    case'>=':
+    if(!minver||gt(minver,compver)){
+    minver=compver;
+    }
+    break;
+    case'<':
+    case'<=':
+    
+    break;
+    
+    default:
+    throw new Error('Unexpected operation: '+comparator.operator);}
+    
+    });
+    }
+    
+    if(minver&&range.test(minver)){
+    return minver;
+    }
+    
+    return null;
+    }
+    
+    exports.validRange=validRange;
+    function validRange(range,options){
+    try{
+    
+    
+    return new Range(range,options).range||'*';
+    }catch(er){
+    return null;
+    }
+    }
+    
+    
+    exports.ltr=ltr;
+    function ltr(version,range,options){
+    return outside(version,range,'<',options);
+    }
+    
+    
+    exports.gtr=gtr;
+    function gtr(version,range,options){
+    return outside(version,range,'>',options);
+    }
+    
+    exports.outside=outside;
+    function outside(version,range,hilo,options){
+    version=new SemVer(version,options);
+    range=new Range(range,options);
+    
+    var gtfn,ltefn,ltfn,comp,ecomp;
+    switch(hilo){
+    case'>':
+    gtfn=gt;
+    ltefn=lte;
+    ltfn=lt;
+    comp='>';
+    ecomp='>=';
+    break;
+    case'<':
+    gtfn=lt;
+    ltefn=gte;
+    ltfn=gt;
+    comp='<';
+    ecomp='<=';
+    break;
+    default:
+    throw new TypeError('Must provide a hilo val of "<" or ">"');}
+    
+    
+    
+    if(satisfies(version,range,options)){
+    return false;
+    }
+    
+    
+    
+    
+    for(var i=0;i<range.set.length;++i){
+    var comparators=range.set[i];
+    
+    var high=null;
+    var low=null;
+    
+    comparators.forEach(function(comparator){
+    if(comparator.semver===ANY){
+    comparator=new Comparator('>=0.0.0');
+    }
+    high=high||comparator;
+    low=low||comparator;
+    if(gtfn(comparator.semver,high.semver,options)){
+    high=comparator;
+    }else if(ltfn(comparator.semver,low.semver,options)){
+    low=comparator;
+    }
+    });
+    
+    
+    
+    if(high.operator===comp||high.operator===ecomp){
+    return false;
+    }
+    
+    
+    
+    if((!low.operator||low.operator===comp)&&
+    ltefn(version,low.semver)){
+    return false;
+    }else if(low.operator===ecomp&&ltfn(version,low.semver)){
+    return false;
+    }
+    }
+    return true;
+    }
+    
+    exports.prerelease=prerelease;
+    function prerelease(version,options){
+    var parsed=parse(version,options);
+    return parsed&&parsed.prerelease.length?parsed.prerelease:null;
+    }
+    
+    exports.intersects=intersects;
+    function intersects(r1,r2,options){
+    r1=new Range(r1,options);
+    r2=new Range(r2,options);
+    return r1.intersects(r2);
+    }
+    
+    exports.coerce=coerce;
+    function coerce(version){
+    if(version instanceof SemVer){
+    return version;
+    }
+    
+    if(typeof version!=='string'){
+    return null;
+    }
+    
+    var match=version.match(re[COERCE]);
+    
+    if(match==null){
+    return null;
+    }
+    
+    return parse(match[1]+
+    '.'+(match[2]||'0')+
+    '.'+(match[3]||'0'));
+    }
+    
+    }).call(this,require('_process'));
+    },{"_process":158}],180:[function(require,module,exports){
+    (function(Buffer){
+    'use strict';
+    
+    const fs=require('fs');
+    const jpeg=require('jpeg-js');
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function getPixel(x,y,channel,width,buff){
+    return buff[(x+y*width)*4+channel];
+    }
+    
+    
+    
+    
+    
+    
+    function isWhitePixel(i,j,img){
+    return getPixel(i,j,0,img.width,img.data)>=249&&
+    getPixel(i,j,1,img.width,img.data)>=249&&
+    getPixel(i,j,2,img.width,img.data)>=249;
+    }
+    
+    
+    function convertPixelsToHistogram(img){
+    const createHistogramArray=function(){
+    const ret=[];
+    for(let i=0;i<256;i++){
+    ret[i]=0;
+    }
+    return ret;
+    };
+    
+    const width=img.width;
+    const height=img.height;
+    
+    const histograms=[
+    createHistogramArray(),
+    createHistogramArray(),
+    createHistogramArray()];
+    
+    
+    for(let j=0;j<height;j++){
+    for(let i=0;i<width;i++){
+    
+    if(isWhitePixel(i,j,img)){
+    continue;
+    }
+    
+    for(let channel=0;channel<histograms.length;channel++){
+    const pixelValue=getPixel(i,j,channel,width,img.data);
+    histograms[channel][pixelValue]++;
+    }
+    }
+    }
+    
+    return histograms;
+    }
+    
+    
+    function synthesizeWhiteFrame(frames){
+    const firstImageData=jpeg.decode(frames[0].getImage());
+    const width=firstImageData.width;
+    const height=firstImageData.height;
+    
+    const frameData=Buffer.alloc(width*height*4);
+    let i=0;
+    while(i<frameData.length){
+    frameData[i++]=0xFF;
+    frameData[i++]=0xFF;
+    frameData[i++]=0xFF;
+    frameData[i++]=0xFF;
+    }
+    
+    var jpegImageData=jpeg.encode({
+    data:frameData,
+    width:width,
+    height:height});
+    
+    return jpegImageData.data;
+    }
+    
+    const screenshotTraceCategory='disabled-by-default-devtools.screenshot';
+    
+    
+    
+    
+    
+    function extractFramesFromTimeline(timeline,opts){
+    opts=opts||{};
+    
+    let trace;
+    timeline=typeof timeline==='string'?fs.readFileSync(timeline,'utf-8'):timeline;
+    try{
+    trace=typeof timeline==='string'?JSON.parse(timeline):timeline;
+    }catch(e){
+    throw new Error('Speedline: Invalid JSON'+e.message);
+    }
+    
+    let events=trace.traceEvents||trace;
+    
+    let startTs=Number.MAX_VALUE;
+    let endTs=-Number.MAX_VALUE;
+    events.forEach(e=>{
+    if(e.ts===0){
+    return;
+    }
+    
+    startTs=Math.min(startTs,e.ts);
+    endTs=Math.max(endTs,e.ts);
+    });
+    
+    startTs=(opts.timeOrigin||startTs)/1000;
+    endTs/=1000;
+    
+    
+    let lastFrame=null;
+    const rawScreenshots=events.filter(e=>e.cat.includes(screenshotTraceCategory)&&e.ts>=startTs*1000);
+    rawScreenshots.sort((a,b)=>a.ts-b.ts);
+    
+    
+    const uniqueFrames=rawScreenshots.map(function(evt){
+    const base64img=evt.args&&evt.args.snapshot;
+    const timestamp=evt.ts/1000;
+    
+    if(base64img===lastFrame){
+    return null;
+    }
+    
+    lastFrame=base64img;
+    const imgBuff=Buffer.from(base64img,'base64');
+    return frame(imgBuff,timestamp);
+    }).filter(Boolean);
+    
+    if(uniqueFrames.length===0){
+    return Promise.reject(new Error('No screenshots found in trace'));
+    }
+    
+    const fakeWhiteFrame=frame(synthesizeWhiteFrame(uniqueFrames),startTs);
+    uniqueFrames.unshift(fakeWhiteFrame);
+    
+    const data={
+    startTs,
+    endTs,
+    frames:uniqueFrames};
+    
+    return Promise.resolve(data);
+    }
+    
+    
+    
+    
+    
+    
+    function frame(imgBuff,ts){
+    
+    let _histogram=null;
+    
+    let _progress=null;
+    
+    let _isProgressInterpolated=null;
+    
+    let _perceptualProgress=null;
+    
+    let _isPerceptualProgressInterpolated=null;
+    
+    let _parsedImage=null;
+    
+    return{
+    getHistogram:function(){
+    if(_histogram){
+    return _histogram;
+    }
+    
+    const pixels=this.getParsedImage();
+    _histogram=convertPixelsToHistogram(pixels);
+    return _histogram;
+    },
+    
+    getTimeStamp:function(){
+    return ts;
+    },
+    
+    setProgress:function(progress,isInterpolated){
+    _progress=progress;
+    _isProgressInterpolated=Boolean(isInterpolated);
+    },
+    
+    setPerceptualProgress:function(progress,isInterpolated){
+    _perceptualProgress=progress;
+    _isPerceptualProgressInterpolated=Boolean(isInterpolated);
+    },
+    
+    getImage:function(){
+    return imgBuff;
+    },
+    
+    getParsedImage:function(){
+    if(!_parsedImage){
+    _parsedImage=jpeg.decode(imgBuff);
+    }
+    return _parsedImage;
+    },
+    
+    getProgress:function(){
+    return _progress;
+    },
+    
+    isProgressInterpolated:function(){
+    return _isProgressInterpolated;
+    },
+    
+    getPerceptualProgress:function(){
+    return _perceptualProgress;
+    },
+    
+    isPerceptualProgressInterpolated:function(){
+    return _isPerceptualProgressInterpolated;
+    }};
+    
+    }
+    
+    module.exports={
+    extractFramesFromTimeline,
+    create:frame};
+    
+    
+    }).call(this,require("buffer").Buffer);
+    },{"buffer":102,"fs":101,"jpeg-js":122}],181:[function(require,module,exports){
+    'use strict';
+    
+    const frame=require('./frame');
+    const speedIndex=require('./speed-index');
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function calculateValues(frames,data){
+    const indexes=speedIndex.calculateSpeedIndexes(frames,data);
+    const duration=Math.floor(data.endTs-data.startTs);
+    const first=Math.floor(indexes.firstPaintTs-data.startTs);
+    const complete=Math.floor(indexes.visuallyCompleteTs-data.startTs);
+    
+    return{
+    beginning:data.startTs,
+    end:data.endTs,
+    frames,
+    first,
+    complete,
+    duration,
+    speedIndex:indexes.speedIndex,
+    perceptualSpeedIndex:indexes.perceptualSpeedIndex};
+    
+    }
+    
+    
+    const Include={
+    All:'all',
+    pSI:'perceptualSpeedIndex',
+    SI:'speedIndex'};
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    module.exports=function(timeline,opts){
+    const include=opts&&opts.include||Include.All;
+    
+    if(!Object.keys(Include).some(key=>Include[key]===include)){
+    throw new Error(`Unrecognized include option: ${include}`);
+    }
+    
+    return frame.extractFramesFromTimeline(timeline,opts).then(function(data){
+    const frames=data.frames;
+    
+    if(include===Include.All||include===Include.SI){
+    speedIndex.calculateVisualProgress(frames,opts);
+    }
+    
+    if(include===Include.All||include===Include.pSI){
+    speedIndex.calculatePerceptualProgress(frames,opts);
+    }
+    
+    return calculateValues(frames,data);
+    });
+    };
+    
+    },{"./frame":180,"./speed-index":182}],182:[function(require,module,exports){
+    'use strict';
+    
+    const imageSSIM=require('image-ssim');
+    
+    
+    const fastModeAllowableChangeMax=5;
+    const fastModeAllowableChangeMedian=3;
+    const fastModeAllowableChangeMin=-1;
+    
+    const fastModeConstant=fastModeAllowableChangeMin;
+    const fastModeMultiplier=fastModeAllowableChangeMax-fastModeConstant;
+    const fastModeExponentiationCoefficient=Math.log((fastModeAllowableChangeMedian-fastModeConstant)/fastModeMultiplier);
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function calculateFastModeAllowableChange(elapsedTime){
+    const elapsedTimeInSeconds=elapsedTime/1000;
+    const allowableChange=fastModeMultiplier*Math.exp(fastModeExponentiationCoefficient*elapsedTimeInSeconds)+fastModeConstant;
+    return allowableChange;
+    }
+    
+    
+    
+    
+    
+    
+    function calculateFrameProgress(current,initial,target){
+    let total=0;
+    let match=0;
+    
+    const currentHist=current.getHistogram();
+    const initialHist=initial.getHistogram();
+    const targetHist=target.getHistogram();
+    
+    for(let channel=0;channel<3;channel++){
+    for(let pixelVal=0;pixelVal<256;pixelVal++){
+    const currentCount=currentHist[channel][pixelVal];
+    const initialCount=initialHist[channel][pixelVal];
+    const targetCount=targetHist[channel][pixelVal];
+    
+    const currentDiff=Math.abs(currentCount-initialCount);
+    const targetDiff=Math.abs(targetCount-initialCount);
+    
+    match+=Math.min(currentDiff,targetDiff);
+    total+=targetDiff;
+    }
+    }
+    
+    let progress;
+    if(match===0&&total===0){
+    progress=100;
+    }else{
+    progress=Math.floor(match/total*100);
+    }
+    return progress;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function calculateProgressBetweenFrames(frames,lowerBound,upperBound,isFastMode,getProgress,setProgress){
+    if(!isFastMode){
+    frames.forEach(frame=>setProgress(frame,getProgress(frame),false));
+    return;
+    }
+    
+    const lowerFrame=frames[lowerBound];
+    const upperFrame=frames[upperBound];
+    const elapsedTime=upperFrame.getTimeStamp()-lowerFrame.getTimeStamp();
+    
+    const lowerProgress=getProgress(lowerFrame);
+    const upperProgress=getProgress(upperFrame);
+    
+    setProgress(lowerFrame,lowerProgress,false);
+    setProgress(upperFrame,upperProgress,false);
+    
+    if(Math.abs(lowerProgress-upperProgress)<calculateFastModeAllowableChange(elapsedTime)){
+    for(let i=lowerBound+1;i<upperBound;i++){
+    setProgress(frames[i],lowerProgress,true);
+    }
+    }else if(upperBound-lowerBound>1){
+    const midpoint=Math.floor((lowerBound+upperBound)/2);
+    calculateProgressBetweenFrames(frames,lowerBound,midpoint,isFastMode,getProgress,setProgress);
+    calculateProgressBetweenFrames(frames,midpoint,upperBound,isFastMode,getProgress,setProgress);
+    }
+    }
+    
+    
+    
+    
+    
+    function calculateVisualProgress(frames,opts){
+    const initial=frames[0];
+    const target=frames[frames.length-1];
+    
+    
+    function getProgress(frame){
+    if(typeof frame.getProgress()==='number'){
+    return frame.getProgress();
+    }
+    
+    return calculateFrameProgress(frame,initial,target);
+    }
+    
+    
+    
+    
+    
+    
+    function setProgress(frame,progress,isInterpolated){
+    return frame.setProgress(progress,isInterpolated);
+    }
+    
+    calculateProgressBetweenFrames(
+    frames,
+    0,
+    frames.length-1,
+    opts&&opts.fastMode,
+    getProgress,
+    setProgress);
+    
+    
+    return frames;
+    }
+    
+    
+    
+    
+    
+    
+    function calculateFrameSimilarity(frame,target){
+    const defaultImageConfig={
+    
+    
+    channels:4};
+    
+    
+    const frameData=Object.assign(frame.getParsedImage(),defaultImageConfig);
+    const targetData=Object.assign(target.getParsedImage(),defaultImageConfig);
+    
+    const diff=imageSSIM.compare(frameData,targetData);
+    return diff.ssim;
+    }
+    
+    
+    
+    
+    
+    function calculatePerceptualProgress(frames,opts){
+    const initial=frames[0];
+    const target=frames[frames.length-1];
+    const initialSimilarity=calculateFrameSimilarity(initial,target);
+    
+    
+    function getProgress(frame){
+    if(typeof frame.getPerceptualProgress()==='number'){
+    return frame.getPerceptualProgress();
+    }
+    
+    const ssim=calculateFrameSimilarity(frame,target);
+    return Math.max(100*(ssim-initialSimilarity)/(1-initialSimilarity),0);
+    }
+    
+    
+    
+    
+    
+    
+    function setProgress(frame,progress,isInterpolated){
+    return frame.setPerceptualProgress(progress,isInterpolated);
+    }
+    
+    calculateProgressBetweenFrames(
+    frames,
+    0,
+    frames.length-1,
+    opts&&opts.fastMode,
+    getProgress,
+    setProgress);
+    
+    
+    return frames;
+    }
+    
+    
+    
+    
+    
+    
+    function calculateSpeedIndexes(frames,data){
+    const hasVisualProgress=typeof frames[0].getProgress()==='number';
+    const hasPerceptualProgress=typeof frames[0].getPerceptualProgress()==='number';
+    const progressToUse=hasVisualProgress?'getProgress':'getPerceptualProgress';
+    const startTs=data.startTs;
+    let visuallyCompleteTs;
+    
+    let firstPaintTs;
+    
+    
+    for(let i=0;i<frames.length&&!firstPaintTs;i++){
+    if(frames[i][progressToUse]()>0){
+    firstPaintTs=frames[i].getTimeStamp();
+    }
+    }
+    
+    
+    for(let i=0;i<frames.length&&!visuallyCompleteTs;i++){
+    if(frames[i][progressToUse]()>=100){
+    visuallyCompleteTs=frames[i].getTimeStamp();
+    }
+    }
+    
+    let prevFrameTs=frames[0].getTimeStamp();
+    let prevProgress=frames[0].getProgress();
+    let prevPerceptualProgress=frames[0].getPerceptualProgress();
+    
+    
+    
+    
+    let speedIndex=firstPaintTs-startTs;
+    
+    let perceptualSpeedIndex=firstPaintTs-startTs;
+    
+    frames.forEach(function(frame){
+    
+    if(frame.getTimeStamp()>firstPaintTs){
+    const elapsed=frame.getTimeStamp()-prevFrameTs;
+    speedIndex+=elapsed*(1-prevProgress);
+    perceptualSpeedIndex+=elapsed*(1-prevPerceptualProgress);
+    }
+    
+    prevFrameTs=frame.getTimeStamp();
+    prevProgress=frame.getProgress()/100;
+    prevPerceptualProgress=frame.getPerceptualProgress()/100;
+    });
+    
+    speedIndex=hasVisualProgress?speedIndex:undefined;
+    perceptualSpeedIndex=hasPerceptualProgress?perceptualSpeedIndex:undefined;
+    
+    return{
+    firstPaintTs,
+    visuallyCompleteTs,
+    speedIndex,
+    perceptualSpeedIndex};
+    
+    }
+    
+    module.exports={
+    calculateFastModeAllowableChange,
+    calculateFrameSimilarity,
+    calculateVisualProgress,
+    calculatePerceptualProgress,
+    calculateSpeedIndexes};
+    
+    
+    },{"image-ssim":112}],183:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    module.exports=Stream;
+    
+    var EE=require('events').EventEmitter;
+    var inherits=require('inherits');
+    
+    inherits(Stream,EE);
+    Stream.Readable=require('readable-stream/readable.js');
+    Stream.Writable=require('readable-stream/writable.js');
+    Stream.Duplex=require('readable-stream/duplex.js');
+    Stream.Transform=require('readable-stream/transform.js');
+    Stream.PassThrough=require('readable-stream/passthrough.js');
+    
+    
+    Stream.Stream=Stream;
+    
+    
+    
+    
+    
+    
+    function Stream(){
+    EE.call(this);
+    }
+    
+    Stream.prototype.pipe=function(dest,options){
+    var source=this;
+    
+    function ondata(chunk){
+    if(dest.writable){
+    if(false===dest.write(chunk)&&source.pause){
+    source.pause();
+    }
+    }
+    }
+    
+    source.on('data',ondata);
+    
+    function ondrain(){
+    if(source.readable&&source.resume){
+    source.resume();
+    }
+    }
+    
+    dest.on('drain',ondrain);
+    
+    
+    
+    if(!dest._isStdio&&(!options||options.end!==false)){
+    source.on('end',onend);
+    source.on('close',onclose);
+    }
+    
+    var didOnEnd=false;
+    function onend(){
+    if(didOnEnd)return;
+    didOnEnd=true;
+    
+    dest.end();
+    }
+    
+    
+    function onclose(){
+    if(didOnEnd)return;
+    didOnEnd=true;
+    
+    if(typeof dest.destroy==='function')dest.destroy();
+    }
+    
+    
+    function onerror(er){
+    cleanup();
+    if(EE.listenerCount(this,'error')===0){
+    throw er;
+    }
+    }
+    
+    source.on('error',onerror);
+    dest.on('error',onerror);
+    
+    
+    function cleanup(){
+    source.removeListener('data',ondata);
+    dest.removeListener('drain',ondrain);
+    
+    source.removeListener('end',onend);
+    source.removeListener('close',onclose);
+    
+    source.removeListener('error',onerror);
+    dest.removeListener('error',onerror);
+    
+    source.removeListener('end',cleanup);
+    source.removeListener('close',cleanup);
+    
+    dest.removeListener('close',cleanup);
+    }
+    
+    source.on('end',cleanup);
+    source.on('close',cleanup);
+    
+    dest.on('close',cleanup);
+    
+    dest.emit('pipe',source);
+    
+    
+    return dest;
+    };
+    
+    },{"events":108,"inherits":113,"readable-stream/duplex.js":162,"readable-stream/passthrough.js":172,"readable-stream/readable.js":173,"readable-stream/transform.js":174,"readable-stream/writable.js":175}],184:[function(require,module,exports){
+    module.exports=[{"name":"Google Analytics","company":"Google","homepage":"https://www.google.com/analytics/analytics/","categories":["analytics"],"domains":["*.google-analytics.com","*.urchin.com"],"examples":["www.google-analytics.com","ssl.google-analytics.com"]},{"name":"Facebook","homepage":"https://www.facebook.com","categories":["social"],"domains":["*.atlassbx.com","*.facebook.com","*.fbsbx.com","fbcdn-photos-e-a.akamaihd.net","*.facebook.net","*.fbcdn.net"],"examples":["www.facebook.com","connect.facebook.net","staticxx.facebook.com","static.xx.fbcdn.net","m.facebook.com","an.facebook.com","platform-lookaside.fbsbx.com"]},{"name":"Google CDN","company":"Google","homepage":"https://developers.google.com/speed/libraries/","categories":["cdn"],"domains":["ajax.googleapis.com","commondatastorage.googleapis.com","www.gstatic.com"]},{"name":"Google/Doubleclick Ads","company":"Google","homepage":"https://www.doubleclickbygoogle.com/","categories":["ad"],"domains":["adservice.google.com","adservice.google.com.au","adservice.google.com.sg","adservice.google.com.br","adservice.google.com.ua","adservice.google.co.uk","adservice.google.co.jp","adservice.google.co.in","adservice.google.co.kr","adservice.google.co.id","adservice.google.co.nz","adservice.google.ie","adservice.google.se","adservice.google.de","adservice.google.ca","adservice.google.be","adservice.google.es","adservice.google.ch","adservice.google.fr","adservice.google.nl","*.googleadservices.com","*.googlesyndication.com","*.googletagservices.com","*.2mdn.net","*.doubleclick.net"],"examples":["pagead2.googlesyndication.com","tpc.googlesyndication.com","ade.googlesyndication.com","googleads.g.doubleclick.net","googleads4.g.doubleclick.net","securepubads.g.doubleclick.net","pubads.g.doubleclick.net","static.doubleclick.net","cm.g.doubleclick.net","bid.g.doubleclick.net","s0.2mdn.net","stats.g.doubleclick.net","survey.g.doubleclick.net","fls.doubleclick.net","ad.doubleclick.net","www.googleadservices.com","https://www.googletagservices.com/tag/js/gpt.js"]},{"name":"Google Tag Manager","company":"Google","homepage":"https://marketingplatform.google.com/about/tag-manager/","categories":["tag-manager"],"domains":["*.googletagmanager.com"],"examples":["www.googletagmanager.com"]},{"name":"Other Google APIs/SDKs","company":"Google","homepage":"https://developers.google.com/apis-explorer/#p/","categories":["utility"],"domains":["accounts.google.com","apis.google.com","calendar.google.com","clients2.google.com","cse.google.com","news.google.com","pay.google.com","payments.google.com","play.google.com","smartlock.google.com","www.google.com","www.google.de","www.google.co.jp","www.google.com.au","www.google.co.uk","www.google.ie","www.google.com.sg","www.google.co.in","www.google.com.br","www.google.ca","www.google.co.kr","www.google.co.nz","www.google.co.id","www.google.fr","www.google.be","www.google.com.ua","www.google.nl","www.google.ru","www.google.se","imasdk.googleapis.com","storage.googleapis.com","translate.googleapis.com","lh3.googleusercontent.com","csi.gstatic.com"]},{"name":"YouTube","homepage":"https://youtube.com","categories":["video"],"domains":["*.ggpht.com","*.youtube-nocookie.com","*.youtube.com","*.ytimg.com"],"examples":["www.youtube.com","s.ytimg.com","yt3.ggpht.com","img.youtube.com","fcmatch.youtube.com"]},{"name":"Google Maps","company":"Google","homepage":"https://www.google.com/maps","categories":["utility"],"domains":["maps.google.com","maps-api-ssl.google.com","maps.googleapis.com","mts.googleapis.com","maps.gstatic.com"]},{"name":"Twitter","homepage":"https://twitter.com","categories":["social"],"domains":["*.vine.co","*.twimg.com","*.twitpic.com","platform.twitter.com","syndication.twitter.com"],"examples":["cdn.syndication.twimg.com","abs.twimg.com","pbs.twimg.com"]},{"name":"Yandex Metrica","company":"Yandex","homepage":"https://metrica.yandex.com/about?","categories":["analytics"],"domains":["d31j93rd8oukbv.cloudfront.net","mc.yandex.ru"]},{"name":"jQuery CDN","homepage":"https://code.jquery.com/","categories":["cdn"],"domains":["*.jquery.com"],"examples":["code.jquery.com"]},{"name":"Hotjar","homepage":"https://www.hotjar.com/","categories":["analytics"],"domains":["*.hotjar.com","*.hotjar.io"],"examples":["script.hotjar.com","static.hotjar.com","in.hotjar.com","vc.hotjar.io","vars.hotjar.com"]},{"name":"AddThis","homepage":"http://www.addthis.com/","categories":["social"],"domains":["*.addthis.com","*.addthiscdn.com","*.addthisedge.com"],"examples":["s7.addthis.com","r.dlx.addthis.com","su.addthis.com","x.dlx.addthis.com"]},{"name":"WordPress","company":"Automattic","homepage":"https://wp.com/","categories":["hosting"],"domains":["*.wordpress.com","s0.wp.com","s2.wp.com","*.w.org","c0.wp.com","s1.wp.com","widgets.wp.com"],"examples":["s.w.org"]},{"name":"Cloudflare CDN","homepage":"https://cdnjs.com/","categories":["cdn"],"domains":["amp.cloudflare.com","cdnjs.cloudflare.com"]},{"name":"Shopify","homepage":"https://www.shopify.com/","categories":["hosting"],"domains":["*.shopify.com","*.shopifyapps.com","*.shopifycdn.com"],"examples":["cdn.shopify.com","productreviews.shopifycdn.com"]},{"name":"ZenDesk","homepage":"https://zendesk.com/","categories":["customer-success"],"domains":["*.zdassets.com","*.zendesk.com","*.zopim.com"],"examples":["assets.zendesk.com","static.zdassets.com","v2.zopim.com"]},{"name":"Criteo","homepage":"https://www.criteo.com/","categories":["ad"],"domains":["*.criteo.com","*.emailretargeting.com","*.criteo.net"],"examples":["static.criteo.net","bidder.criteo.com","dis.criteo.com","gum.criteo.com","sslwidget.criteo.com","dis.us.criteo.com"]},{"name":"Pubmatic","homepage":"https://pubmatic.com/","categories":["ad"],"domains":["*.pubmatic.com"],"examples":["image6.pubmatic.com","ads.pubmatic.com","image2.pubmatic.com","simage2.pubmatic.com","image4.pubmatic.com","simage4.pubmatic.com","image5.pubmatic.com","hbopenbid.pubmatic.com"]},{"name":"Tawk.to","homepage":"https://www.tawk.to/","categories":["customer-success"],"domains":["*.tawk.to"],"examples":["embed.tawk.to"]},{"name":"AMP","homepage":"https://amp.dev/","categories":["content"],"domains":["*.ampproject.org"],"examples":["cdn.ampproject.org"]},{"name":"Wix","homepage":"https://www.wix.com/","categories":["hosting"],"domains":["*.parastorage.com","*.wix.com","*.wixstatic.com","*.wixapps.net"],"examples":["static.parastorage.com","static.wixstatic.com","www.wix.com","instagram.codev.wixapps.net"]},{"name":"Squarespace","homepage":"https://www.squarespace.com/","categories":["hosting"],"domains":["*.squarespace.com"],"examples":["static.squarespace.com","static1.squarespace.com"]},{"name":"Amazon Web Services","homepage":"https://aws.amazon.com/s3/","categories":["other"],"domains":["*.amazon.com","*.amazonaws.com","*.amazonwebapps.com","*.amazonwebservices.com","*.elasticbeanstalk.com","*.images-amazon.com","*.amazon.co.uk"],"examples":["s3.amazonaws.com","us-east-1.amazonaws.com","api-cdn.amazon.com","ecx.images-amazon.com","ws.amazon.co.uk"]},{"name":"ShareThis","homepage":"https://www.sharethis.com/","categories":["social"],"domains":["*.sharethis.com"],"examples":["w.sharethis.com","ws.sharethis.com","t.sharethis.com"]},{"name":"Vimeo","homepage":"http://vimeo.com/","categories":["video"],"domains":["*.vimeo.com","*.vimeocdn.com"],"examples":["f.vimeocdn.com","player.vimeo.com","i.vimeocdn.com"]},{"name":"JSDelivr CDN","homepage":"https://www.jsdelivr.com/","categories":["cdn"],"domains":["*.jsdelivr.net"],"examples":["cdn.jsdelivr.net"]},{"name":"Adobe Tag Manager","company":"Adobe","homepage":"https://www.adobe.com/experience-platform/","categories":["tag-manager"],"domains":["*.adobedtm.com","*.demdex.net","*.everesttech.net"],"examples":["assets.adobedtm.com","sync-tm.everesttech.net","cm.everesttech.net"]},{"name":"Jivochat","homepage":"https://www.jivochat.com/","categories":["customer-success"],"domains":["*.jivosite.com"],"examples":["cdn-ca.jivosite.com","code.jivosite.com"]},{"name":"PIXNET","homepage":"https://www.pixnet.net/","categories":["social"],"domains":["*.pixfs.net"],"examples":["front.pixfs.net","falcon-asset.pixfs.net","pixgame-asset.pixfs.net"]},{"name":"Yandex Share","company":"Yandex","homepage":"https://yastatic.net/share2/share.js","categories":["social"],"domains":["*.yastatic.net"]},{"name":"Scorecard Research","homepage":"https://www.scorecardresearch.com/","categories":["ad"],"domains":["*.scorecardresearch.com"],"examples":["sb.scorecardresearch.com","sa.scorecardresearch.com","b.scorecardresearch.com"]},{"name":"Rubicon Project","homepage":"https://rubiconproject.com/","categories":["ad"],"domains":["*.chango.com","*.fimserve.com","*.rubiconproject.com"],"examples":["pixel.rubiconproject.com","fastlane.rubiconproject.com","secure-assets.rubiconproject.com","eus.rubiconproject.com","pixel-us-east.rubiconproject.com","token.rubiconproject.com","ads.rubiconproject.com"]},{"name":"FontAwesome CDN","homepage":"https://fontawesome.com/","categories":["cdn"],"domains":["*.fontawesome.com"],"examples":["use.fontawesome.com"]},{"name":"Cloudflare","homepage":"https://www.cloudflare.com/website-optimization/","categories":["utility"],"domains":["ajax.cloudflare.com"]},{"name":"Blogger","homepage":"http://www.blogger.com/","categories":["hosting"],"domains":["*.blogblog.com","*.blogger.com","*.blogspot.com","images-blogger-opensocial.googleusercontent.com"],"examples":["1.bp.blogspot.com","www.blogger.com"]},{"name":"Salesforce","homepage":"https://www.salesforce.com/products/marketing-cloud/","categories":["analytics"],"domains":["*.krxd.net"],"examples":["cdn.krxd.net","beacon.krxd.net","consumer.krxd.net","usermatch.krxd.net"]},{"name":"Yandex Ads","company":"Yandex","homepage":"https://yandex.com/adv/","categories":["ad"],"domains":["an.yandex.ru"]},{"name":"Tynt","company":"33 Across","categories":["ad"],"domains":["*.tynt.com"]},{"name":"Yandex APIs","company":"Yandex","homepage":"https://yandex.ru/","categories":["utility"],"domains":["api-maps.yandex.ru","money.yandex.ru"]},{"name":"Micropat","categories":["social"],"domains":["*.addtoany.com"]},{"name":"Hubspot","homepage":"https://hubspot.com/","categories":["marketing"],"domains":["*.hs-scripts.com","*.hubspot.com","*.leadin.com","*.hs-analytics.net","*.hscollectedforms.net","*.hscta.net","*.hsforms.net","*.hsleadflows.net","*.hsstatic.net","*.hubspot.net"],"examples":["forms.hubspot.com","js.hsforms.net","js.hs-analytics.net","js.leadin.com"]},{"name":"Sumo","homepage":"https://sumo.com/","categories":["marketing"],"domains":["*.sumo.com","*.sumome.com","sumo.b-cdn.net"],"examples":["sumo.b-cdn.net","load.sumo.com","load.sumome.com"]},{"name":"Beeketing","homepage":"https://beeketing.com/","categories":["marketing"],"domains":["*.beeketing.com"],"examples":["sdk-cdn.beeketing.com","sdk.beeketing.com"]},{"name":"Mailchimp","homepage":"https://mailchimp.com/","categories":["marketing"],"domains":["*.chimpstatic.com","*.list-manage.com","*.mailchimp.com"],"examples":["downloads.mailchimp.com"]},{"name":"Media.net","homepage":"https://www.media.net/","categories":["ad"],"domains":["*.media.net","*.mnet-ad.net"],"examples":["contextual.media.net","cdnwest-xch.media.net","hbx.media.net","cs.media.net","hblg.media.net"]},{"name":"Skimbit","categories":["ad"],"domains":["*.redirectingat.com","*.skimresources.com","*.skimresources.net"]},{"name":"Moat","homepage":"https://moat.com/","categories":["ad"],"domains":["*.moatads.com","*.moatpixel.com"],"examples":["z.moatads.com","px.moatads.com","geo.moatads.com","sejs.moatads.com","mb.moatads.com","v4.moatads.com"]},{"name":"AppNexus","homepage":"https://www.appnexus.com/","categories":["ad"],"domains":["*.adnxs.com","*.ctasnet.com"],"examples":["acdn.adnxs.com","secure.adnxs.com","ib.adnxs.com","sharethrough.adnxs.com","cdn.adnxs.com","vcdn.adnxs.com"]},{"name":"VK","homepage":"https://vk.com/","categories":["social"],"domains":["*.vk.com"]},{"name":"LiveChat","homepage":"https://www.livechatinc.com/","categories":["customer-success"],"domains":["*.livechatinc.com"],"examples":["cdn.livechatinc.com","secure.livechatinc.com"]},{"name":"OneSignal","homepage":"https://onesignal.com/","categories":["utility"],"domains":["*.onesignal.com"],"examples":["cdn.onesignal.com","https://onesignal.com/api/v1/sync/"]},{"name":"WordAds","company":"Automattic","homepage":"https://wordads.co/","categories":["ad"],"domains":["*.pubmine.com"],"examples":["s.pubmine.com"]},{"name":"Integral Ad Science","homepage":"https://integralads.com/uk/","categories":["ad"],"domains":["*.adsafeprotected.com","*.iasds01.com"],"examples":["pixel.adsafeprotected.com","static.adsafeprotected.com","fw.adsafeprotected.com","cdn.adsafeprotected.com","dt.adsafeprotected.com"]},{"name":"Amazon Ads","homepage":"https://ad.amazon.com/","categories":["ad"],"domains":["*.amazon-adsystem.com"],"examples":["s.amazon-adsystem.com","c.amazon-adsystem.com","aax.amazon-adsystem.com","z-na.amazon-adsystem.com","fls-na.amazon-adsystem.com","aax-us-east.amazon-adsystem.com","ir-na.amazon-adsystem.com"]},{"name":"Yahoo!","homepage":"https://www.yahoo.com/","categories":["ad"],"domains":["*.bluelithium.com","*.hostingprod.com","*.lexity.com","*.yahoo.com","*.yahooapis.com","*.yimg.com","*.yimg.jp","*.zenfs.com","*.yahoo.net"],"examples":["ads.yahoo.com","analytics.yahoo.com","geo.yahoo.com","udc.yahoo.com","ganon.yahoo.com","ads.yap.yahoo.com"]},{"name":"Hatena Blog","homepage":"https://hatenablog.com/","categories":["hosting"],"domains":["*.st-hatena.com","*.hatena.ne.jp"],"examples":["cdn.blog.st-hatena.com","cdn.pool.st-hatena.com","cdn7.www.st-hatena.com","s.hatena.ne.jp","b.st-hatena.com"]},{"name":"Pinterest","homepage":"https://pinterest.com/","categories":["social"],"domains":["*.pinimg.com","*.pinterest.com"],"examples":["assets.pinterest.com","ct.pinterest.com","log.pinterest.com"]},{"name":"LinkedIn","homepage":"https://www.linkedin.com/","categories":["social"],"domains":["*.bizographics.com","platform.linkedin.com","*.slideshare.com","*.slidesharecdn.com"]},{"name":"Stripe","homepage":"https://stripe.com","categories":["utility"],"domains":["*.stripe.com","*.stripecdn.com","*.stripe.network"],"examples":["m.stripe.network","js.stripe.com"]},{"name":"Taboola","homepage":"https://www.taboola.com/","categories":["ad"],"domains":["*.taboola.com","*.taboolasyndication.com"],"examples":["cdn.taboola.com","trc.taboola.com","vidstat.taboola.com","images.taboola.com"]},{"name":"Weebly","homepage":"https://www.weebly.com/","categories":["hosting"],"domains":["*.editmysite.com"]},{"name":"Bing Ads","homepage":"https://bingads.microsoft.com","categories":["ad"],"domains":["*.bing.com","*.microsoft.com","*.msn.com","*.s-msft.com","*.s-msn.com","*.msads.net","*.msecnd.net","*.windows.net"],"examples":["bat.bing.com","c.bing.com","bat.r.msn.com","ajax.microsoft.com"]},{"name":"Intercom","homepage":"https://www.intercom.com","categories":["customer-success"],"domains":["*.intercomcdn.com","*.intercom.io"],"examples":["js.intercomcdn.com","api-iam.intercom.io","widget.intercom.io","nexus-websocket-a.intercom.io"]},{"name":"Crazy Egg","homepage":"https://www.crazyegg.com/","categories":["analytics"],"domains":["*.cetrk.com","*.crazyegg.com","*.hellobar.com","dnn506yrbagrg.cloudfront.net"]},{"name":"Amazon Pay","homepage":"https://pay.amazon.com","categories":["utility"],"domains":["payments.amazon.com","*.payments-amazon.com"]},{"name":"Histats","homepage":"http://histats.com/","categories":["analytics"],"domains":["*.histats.com"],"examples":["s10.histats.com"]},{"name":"Adform","categories":["ad"],"domains":["*.adform.net","*.adformdsp.net"]},{"name":"Datacamp","categories":["utility"],"domains":["*.cdn77.org"]},{"name":"Tealium","homepage":"https://tealium.com/","categories":["tag-manager"],"domains":["*.aniview.com","*.delvenetworks.com","*.limelight.com","*.tiqcdn.com","*.llnwd.net","*.tealiumiq.com"],"examples":["tags.tiqcdn.com","tealium.hs.llnwd.net","link.videoplatform.limelight.com","datacloud.tealiumiq.com"]},{"name":"Optimizely","homepage":"https://www.optimizely.com/","categories":["analytics"],"domains":["*.optimizely.com"],"examples":["cdn.optimizely.com","cdn-pci.optimizely.com","logx.optimizely.com","cdn3.optimizely.com"]},{"name":"Yotpo","homepage":"https://www.yotpo.com/","categories":["marketing"],"domains":["*.yotpo.com"]},{"name":"Trust Pilot","categories":["analytics"],"domains":["*.trustpilot.com"]},{"name":"Privy","categories":["ad"],"domains":["*.privy.com","*.privymktg.com"]},{"name":"Baidu Analytics","homepage":"https://tongji.baidu.com/web/welcome/login","categories":["analytics"],"domains":["*.baidu.com"],"examples":["hm.baidu.com"]},{"name":"Wistia","homepage":"https://wistia.com/","categories":["video"],"domains":["*.wistia.com","embedwistia-a.akamaihd.net","*.wistia.net"],"examples":["fast.wistia.com","fast.wistia.net","distillery.wistia.com","pipedream.wistia.com"]},{"name":"iubenda","categories":["utility"],"domains":["*.iubenda.com"],"examples":["www.iubenda.com"]},{"name":"Nielsen NetRatings SiteCensus","company":"The Nielsen Company","homepage":"http://www.nielsen-online.com/intlpage.html","categories":["analytics"],"domains":["*.imrworldwide.com"]},{"name":"BrightTag / Signal","company":"Signal","homepage":"https://www.signal.co","categories":["tag-manager"],"domains":["*.btstatic.com","*.thebrighttag.com"]},{"name":"mPulse","homepage":"https://developer.akamai.com/akamai-mpulse","categories":["analytics"],"domains":["*.akstat.io","*.go-mpulse.net","*.mpulse.net","*.mpstat.us"],"examples":["c.go-mpulse.net","0211c83c.akstat.io"]},{"name":"PayPal","homepage":"https://paypal.com","categories":["utility"],"domains":["*.paypal.com","*.paypalobjects.com"],"examples":["www.paypalobjects.com"]},{"name":"Sentry","homepage":"https://sentry.io/","categories":["utility"],"domains":["*.getsentry.com","*.ravenjs.com","*.sentry-cdn.com"],"examples":["cdn.ravenjs.com","browser.sentry-cdn.com"]},{"name":"Cookiebot","homepage":"https://www.cookiebot.com/","categories":["utility"],"domains":["*.cookiebot.com"],"examples":["consent.cookiebot.com"]},{"name":"Distil Networks","homepage":"https://www.distilnetworks.com/","categories":["utility"],"domains":["*.areyouahuman.com"],"examples":["n-cdn.areyouahuman.com"]},{"name":"Adobe TypeKit","company":"Adobe","homepage":"https://fonts.adobe.com/","categories":["cdn"],"domains":["*.typekit.com","*.typekit.net"],"examples":["use.typekit.net","p.typekit.net"]},{"name":"Kakao","categories":["social"],"domains":["*.daum.net","*.daumcdn.net"]},{"name":"Bold Commerce","categories":["utility"],"domains":["*.shappify-cdn.com","*.shappify.com","*.boldapps.net"]},{"name":"Akamai","homepage":"https://www.akamai.com/","categories":["cdn"],"domains":["23.62.3.183","*.akamaitechnologies.com","*.akamaitechnologies.fr","*.akamai.net","*.akamaiedge.net","*.akamaihd.net","*.akamaized.net","*.edgefcs.net","*.edgekey.net","edgesuite.net","*.srip.net"]},{"name":"Segment","homepage":"https://segment.com/","categories":["analytics"],"domains":["*.segment.com","*.segment.io"],"examples":["cdn.segment.com","api.segment.io"]},{"name":"District M","categories":["ad"],"domains":["*.districtm.io"]},{"name":"Bigcommerce","categories":["marketing"],"domains":["*.bigcommerce.com"]},{"name":"Dealer","homepage":"https://www.dealer.com/","categories":["hosting"],"domains":["*.dealer.com"],"examples":["static.dealer.com"]},{"name":"Klaviyo","categories":["ad"],"domains":["*.klaviyo.com"]},{"name":"Rambler","company":"Rambler & Co","categories":["utility"],"domains":["*.rambler.ru"]},{"name":"Tumblr","homepage":"https://tumblr.com/","categories":["social"],"domains":["*.tumblr.com"],"examples":["assets.tumblr.com","static.tumblr.com"]},{"name":"Snapchat","homepage":"https://www.snapchat.com","categories":["analytics"],"domains":["*.snapchat.com","*.sc-static.net"],"examples":["tr.snapchat.com"]},{"name":"VigLink","categories":["ad"],"domains":["*.viglink.com"]},{"name":"StatCounter","categories":["analytics"],"domains":["*.statcounter.com"]},{"name":"TrustArc","homepage":"https://www.trustarc.com/","categories":["utility"],"domains":["*.trustarc.com"],"examples":["choices.trustarc.com","consent.trustarc.com"]},{"name":"Tidio Live Chat","company":"Tidio","homepage":"https://www.tidiochat.com/en/","categories":["customer-success"],"domains":["*.tidiochat.com"]},{"name":"DoubleVerify","homepage":"https://www.doubleverify.com/","categories":["ad"],"domains":["*.doubleverify.com","*.dvtps.com","*.iqfp1.com"],"examples":["cdn.doubleverify.com","cdn3.doubleverify.com","tps.doubleverify.com","tps712.doubleverify.com","tps714.doubleverify.com","tps706.doubleverify.com","tps700.doubleverify.com","tps707.doubleverify.com","rtb2.doubleverify.com","rtb0.doubleverify.com","rtbcdn.doubleverify.com","tps11020.doubleverify.com","tm.iqfp1.com"]},{"name":"Instagram","homepage":"https://www.instagram.com","categories":["social"],"domains":["*.cdninstagram.com","*.instagram.com"],"examples":["scontent.cdninstagram.com"]},{"name":"OptinMonster","homepage":"https://optinmonster.com/","categories":["marketing"],"domains":["*.opmnstr.com","*.optmnstr.com","*.optmstr.com"],"examples":["a.optmstr.com","api.opmnstr.com","a.optmnstr.com"]},{"name":"Evidon","categories":["analytics"],"domains":["*.evidon.com"]},{"name":"Lucky Orange","homepage":"https://www.luckyorange.com/","categories":["analytics"],"domains":["*.luckyorange.com","d10lpsik1i8c69.cloudfront.net","*.luckyorange.net"]},{"name":"Gemius","categories":["ad"],"domains":["*.gemius.pl"]},{"name":"Olark","homepage":"https://www.olark.com/","categories":["customer-success"],"domains":["*.olark.com"],"examples":["static.olark.com"]},{"name":"CallRail","categories":["analytics"],"domains":["*.callrail.com"]},{"name":"Mixpanel","homepage":"https://mixpanel.com/","categories":["analytics"],"domains":["*.mixpanel.com","*.mxpnl.com"],"examples":["cdn.mxpnl.com"]},{"name":"OpenX","homepage":"https://www.openx.com/","categories":["ad"],"domains":["*.deliverimp.com","*.openxadexchange.com","*.servedbyopenx.com","*.jump-time.net","*.openx.net"],"examples":["uk-ads.openx.net","us-ads.openx.net","33across-d.openx.net","rtb.openx.net","us-u.openx.net","eu-u.openx.net","u.openx.net"]},{"name":"CreateJS CDN","homepage":"http://code.createjs.com/","categories":["cdn"],"domains":["*.createjs.com"],"examples":["code.createjs.com"]},{"name":"Chartbeat","categories":["analytics"],"domains":["*.chartbeat.com","*.chartbeat.net"]},{"name":"Sizmek","homepage":"https://www.sizmek.com/","categories":["ad"],"domains":["*.serving-sys.com","*.peer39.net"],"examples":["secure-ds.serving-sys.com","ds.serving-sys.com","bs.serving-sys.com"]},{"name":"FullStory","categories":["analytics"],"domains":["*.fullstory.com"],"examples":["rs.fullstory.com"]},{"name":"Snowplow","homepage":"https://snowplowanalytics.com/","categories":["analytics"],"domains":["d32hwlnfiv2gyn.cloudfront.net"]},{"name":"Brightcove","homepage":"https://www.brightcove.com/en/","categories":["video"],"domains":["*.brightcove.com","*.brightcove.net","*.zencdn.net"],"examples":["vjs.zencdn.net","players.brightcove.net"]},{"name":"GoDaddy","homepage":"https://www.godaddy.com/","categories":["utility"],"domains":["*.godaddy.com","*.wsimg.com"],"examples":["ocsp.godaddy.com","seal.godaddy.com"]},{"name":"Inspectlet","categories":["analytics"],"domains":["*.inspectlet.com"]},{"name":"Teads","categories":["ad"],"domains":["*.teads.tv"]},{"name":"New Relic","homepage":"https://newrelic.com/","categories":["utility"],"domains":["*.newrelic.com","*.nr-data.net"],"examples":["js-agent.newrelic.com","bam.nr-data.net"]},{"name":"Ensighten","homepage":"https://www.ensighten.com/","categories":["tag-manager"],"domains":["*.ensighten.com"],"examples":["nexus.ensighten.com"]},{"name":"Parking Crew","homepage":"http://parkingcrew.net/","categories":["other"],"domains":["d1lxhc4jvstzrp.cloudfront.net","*.parkingcrew.net"]},{"name":"Azure Web Services","company":"Microsoft","categories":["cdn"],"domains":["*.azurewebsites.net","*.azureedge.net","*.msedge.net"]},{"name":"BlueKai","company":"Oracle","categories":["ad"],"domains":["*.bkrtx.com","*.bluekai.com"]},{"name":"Treasure Data","categories":["analytics"],"domains":["*.treasuredata.com"]},{"name":"Drift","homepage":"https://www.drift.com/","categories":["marketing"],"domains":["*.drift.com","*.driftt.com"],"examples":["js.driftt.com","api.drift.com"]},{"name":"MGID","homepage":"https://www.mgid.com/","categories":["ad"],"domains":["*.mgid.com","*.dt07.net"],"examples":["servicer.mgid.com"]},{"name":"Microsoft Hosted Libs","company":"Microsoft","categories":["cdn"],"domains":["*.aspnetcdn.com"],"examples":["ajax.aspnetcdn.com"]},{"name":"33 Across","homepage":"https://33across.com/","categories":["ad"],"domains":["*.33across.com"],"examples":["sic.33across.com","cdn-sic.33across.com"]},{"name":"Monotype","categories":["cdn"],"domains":["*.fonts.com","*.fonts.net"]},{"name":"DTSCOUT","categories":["ad"],"domains":["*.dtscout.com"]},{"name":"WordPress Site Stats","company":"Automattic","homepage":"https://wp.com/","categories":["analytics"],"domains":["pixel.wp.com","stats.wp.com"]},{"name":"Mapbox","categories":["utility"],"domains":["*.mapbox.com"]},{"name":"MediaVine","homepage":"https://www.mediavine.com/","categories":["ad"],"domains":["*.mediavine.com"],"examples":["scripts.mediavine.com","video.mediavine.com"]},{"name":"Shareaholic","homepage":"https://www.shareaholic.com/","categories":["social"],"domains":["*.shareaholic.com","dsms0mj1bbhn4.cloudfront.net"]},{"name":"Dataxu","categories":["marketing"],"domains":["*.w55c.net"]},{"name":"MailMunch","categories":["ad"],"domains":["*.mailmunch.co"]},{"name":"Cxense","categories":["ad"],"domains":["*.cxense.com","*.cxpublic.com","*.emediate.dk","*.emediate.eu"]},{"name":"Marchex","categories":["analytics"],"domains":["*.voicestar.com","*.marchex.io"]},{"name":"Fastly","categories":["utility"],"domains":["*.fastly.net"]},{"name":"Unpkg","homepage":"https://unpkg.com","categories":["cdn"],"domains":["*.unpkg.com"]},{"name":"LivePerson","categories":["customer-success"],"homepage":"https://www.liveperson.com/","domains":["*.liveperson.com","*.look.io","*.liveperson.net","*.lpsnmedia.net"]},{"name":"SoundCloud","homepage":"https://www.soundcloud.com/","categories":["content"],"domains":["*.sndcdn.com","*.soundcloud.com","*.stratus.sc"],"examples":["widget.sndcdn.com"]},{"name":"VWO","homepage":"https://vwo.com","categories":["analytics"],"domains":["*.visualwebsiteoptimizer.com"],"examples":["dev.visualwebsiteoptimizer.com"]},{"name":"StickyADS.tv","categories":["ad"],"domains":["*.stickyadstv.com"]},{"name":"PushCrew","categories":["ad"],"domains":["*.pushcrew.com"]},{"name":"Embedly","categories":["content"],"domains":["*.embedly.com","*.embed.ly"]},{"name":"CDK Dealer Management","company":"CDK Global","homepage":"https://www.cdkglobal.com/us","categories":["hosting"],"domains":["*.assets-cdk.com"],"examples":["media-cf.assets-cdk.com"]},{"name":"Popads","homepage":"https://www.popads.net/","categories":["ad"],"domains":["*.popads.net"],"examples":["serve.popads.net","c1.popads.net"]},{"name":"FreakOut","categories":["ad"],"domains":["*.fout.jp"]},{"name":"SnapWidget","categories":["content"],"domains":["*.snapwidget.com"]},{"name":"Pure Chat","categories":["customer-success"],"domains":["*.purechat.com"]},{"name":"Outbrain","homepage":"https://www.outbrain.com/","categories":["ad"],"domains":["*.outbrain.com","*.outbrainimg.com","*.visualrevenue.com"]},{"name":"RD Station","homepage":"https://www.rdstation.com/en/","categories":["marketing"],"domains":["d335luupugsy2.cloudfront.net"]},{"name":"LiveJournal","categories":["social"],"domains":["*.livejournal.com","*.livejournal.net"]},{"name":"ContactAtOnce","homepage":"https://www.contactatonce.com/","categories":["customer-success"],"domains":["*.contactatonce.com"],"examples":["tag.contactatonce.com","agentpresence.contactatonce.com"]},{"name":"Ezoic","categories":["analytics"],"domains":["*.ezoic.net"]},{"name":"AB Tasty","categories":["analytics"],"domains":["*.abtasty.com","d1447tq2m68ekg.cloudfront.net"]},{"name":"Quantcast","homepage":"https://www.quantcast.com","categories":["analytics"],"domains":["*.brtstats.com","*.quantcount.com","*.quantserve.com","*.semantictec.com","*.ntv.io"],"examples":["pixel.quantserve.com","secure.quantserve.com","cms.quantserve.com","rules.quantcount.com"]},{"name":"DigiTrust","homepage":"http://www.digitru.st/","categories":["analytics"],"domains":["*.digitru.st"],"examples":["cdn.digitru.st"]},{"name":"LongTail Ad Solutions","categories":["ad"],"domains":["*.jwpcdn.com","*.jwplatform.com","*.jwplayer.com","*.jwpltx.com","*.jwpsrv.com","*.longtailvideo.com"]},{"name":"Parse.ly","categories":["analytics"],"domains":["*.parsely.com","d1z2jf7jlzjs58.cloudfront.net"]},{"name":"Index Exchange","company":"WPP","categories":["ad"],"domains":["*.casalemedia.com","*.indexww.com"]},{"name":"Clicktripz","categories":["content"],"domains":["*.clicktripz.com"],"examples":["static.clicktripz.com","www.clicktripz.com"]},{"name":"Ve","company":"Ve Interactive","categories":["marketing"],"domains":["*.veinteractive.com"]},{"name":"Adloox","categories":["ad"],"domains":["*.adlooxtracking.com"]},{"name":"GumGum","categories":["ad"],"domains":["*.gumgum.com"]},{"name":"Digital ad Consortium","categories":["ad"],"domains":["*.impact-ad.jp"]},{"name":"Amplitude Mobile Analytics","company":"Amplitude","categories":["analytics"],"domains":["*.amplitude.com","d24n15hnbwhuhn.cloudfront.net"]},{"name":"Adobe Business Catalyst","homepage":"https://www.businesscatalyst.com/","categories":["hosting"],"domains":["*.businesscatalyst.com"]},{"name":"LightWidget","categories":["utility"],"domains":["*.lightwidget.com"]},{"name":"Spotify","homepage":"https://www.spotify.com/","categories":["content"],"domains":["*.scdn.co","*.spotify.com"],"examples":["open.spotify.com","open.scdn.co","i.scdn.co"]},{"name":"SmartAdServer","categories":["ad"],"domains":["*.01net.com","*.sascdn.com"],"examples":["securite.01net.com"]},{"name":"Adroll","homepage":"https://www.adroll.com/","categories":["ad"],"domains":["*.adroll.com"],"examples":["d.adroll.com","s.adroll.com"]},{"name":"PureCars","homepage":"https://www.purecars.com/","categories":["marketing"],"domains":["*.purecars.com"],"examples":["cdn.purecars.com"]},{"name":"Keen","company":"Keen","homepage":"https://keen.io/","categories":["analytics"],"domains":["*.keen.io","d26b395fwzu5fz.cloudfront.net"]},{"name":"Infolinks","categories":["ad"],"domains":["*.infolinks.com"]},{"name":"Unbounce","categories":["ad"],"domains":["*.ubembed.com","*.unbounce.com","d2xxq4ijfwetlm.cloudfront.net","d9hhrg4mnvzow.cloudfront.net"]},{"name":"Roxr Software","categories":["analytics"],"domains":["*.getclicky.com"]},{"name":"OpenTable","company":"Priceline Group","categories":["content"],"domains":["*.opentable.com","*.opentable.co.uk","*.toptable.co.uk"],"examples":["www.toptable.co.uk"]},{"name":"uLogin","categories":["other"],"domains":["*.ulogin.ru"]},{"name":"Searchanise","categories":["analytics"],"domains":["*.searchanise.com"],"examples":["www.searchanise.com"]},{"name":"Gigya","categories":["analytics"],"domains":["*.gigya.com"]},{"name":"Net Reviews","categories":["analytics"],"domains":["*.avis-verifies.com"],"examples":["www.avis-verifies.com"]},{"name":"Booking.com","categories":["content"],"domains":["*.bstatic.com"]},{"name":"Disqus","homepage":"http://disqus.com/","categories":["social"],"domains":["*.disqus.com","*.disquscdn.com"],"examples":["c.disquscdn.com"]},{"name":"Tray Commerce","homepage":"https://www.tray.com.br/","categories":["marketing"],"domains":["*.tcdn.com.br"],"examples":["images.tcdn.com.br"]},{"name":"Crowd Control","company":"Lotame","categories":["ad"],"domains":["*.crwdcntrl.net"]},{"name":"Intent Media","homepage":"https://intent.com/","categories":["ad"],"domains":["*.intentmedia.net"]},{"name":"issuu","categories":["content"],"domains":["*.issuu.com","*.isu.pub"]},{"name":"Salesforce Commerce Cloud","homepage":"https://www.salesforce.com/products/commerce-cloud/overview/","categories":["hosting"],"domains":["*.cquotient.com","*.demandware.net","demandware.edgesuite.net"]},{"name":"sovrn","categories":["ad"],"domains":["*.lijit.com"]},{"name":"JuicyAds","categories":["ad"],"domains":["*.juicyads.com"]},{"name":"Sharethrough","categories":["ad"],"domains":["*.sharethrough.com"]},{"name":"Heap","categories":["analytics"],"domains":["*.heapanalytics.com"]},{"name":"LiveTex","categories":["customer-success"],"domains":["*.livetex.ru"]},{"name":"Nosto","categories":["analytics"],"domains":["*.nosto.com"]},{"name":"fluct","categories":["ad"],"domains":["*.adingo.jp"]},{"name":"Smart AdServer","categories":["ad"],"domains":["*.sasqos.com","*.smartadserver.com"]},{"name":"fam","company":"Fing Co Ltd.","homepage":"http://admin.fam-ad.com/report/","categories":["ad"],"domains":["*.fam-ad.com"],"examples":["img.fam-ad.com"]},{"name":"ExoClick","categories":["ad"],"domains":["*.exoclick.com"]},{"name":"BannerFlow","company":"Nordic Factory Solutions","categories":["ad"],"domains":["*.bannerflow.com"]},{"name":"iPerceptions","categories":["customer-success"],"domains":["*.iperceptions.com"]},{"name":"Albacross","homepage":"https://albacross.com/","categories":["marketing"],"domains":["*.albacross.com"],"examples":["serve.albacross.com"]},{"name":"RevJet","homepage":"https://www.revjet.com/","categories":["ad"],"domains":["*.revjet.com"],"examples":["pix.revjet.com","ads.revjet.com"]},{"name":"Trusted Shops","categories":["utility"],"domains":["*.trustedshops.com"]},{"name":"MaxCDN Enterprise","company":"MaxCDN","categories":["utility"],"domains":["*.netdna-cdn.com","*.netdna-ssl.com"]},{"name":"etracker","categories":["analytics"],"domains":["*.etracker.com","*.etracker.de"],"examples":["www.etracker.com"]},{"name":"Yandex CDN","company":"Yandex","homepage":"https://yandex.ru/","categories":["cdn"],"domains":["*.yandex.st"]},{"name":"LKQD","categories":["ad"],"domains":["*.lkqd.net"]},{"name":"Sift Science","categories":["utility"],"domains":["*.siftscience.com"]},{"name":"Help Scout","homepage":"https://www.helpscout.net/","categories":["customer-success"],"domains":["djtflbt20bdde.cloudfront.net","*.helpscout.net"],"examples":["beacon-v2.helpscout.net"]},{"name":"Seznam","categories":["utility"],"domains":["*.imedia.cz"]},{"name":"Vidible","categories":["ad"],"domains":["*.vidible.tv"]},{"name":"Media Math","homepage":"http://www.mediamath.com/","categories":["ad"],"domains":["*.mathads.com","*.mathtag.com"],"examples":["mathid.mathtag.com","sync.mathtag.com","pixel.mathtag.com"]},{"name":"Simplicity Marketing","categories":["ad"],"domains":["*.flashtalking.com"]},{"name":"Mouseflow","categories":["analytics"],"domains":["*.mouseflow.com"]},{"name":"Siteimprove","categories":["utility"],"domains":["*.siteimprove.com","*.siteimproveanalytics.com"]},{"name":"GetSiteControl","company":"GetWebCraft","categories":["utility"],"domains":["*.getsitecontrol.com"]},{"name":"AOL / Oath / Verizon Media","homepage":"https://www.oath.com/","categories":["ad"],"domains":["*.advertising.com","*.aol.com","*.aolcdn.com","*.blogsmithmedia.com","*.oath.com","*.aol.net","*.tacoda.net","*.aol.co.uk"],"examples":["pixel.advertising.com","dtm.advertising.com","tag.sp.advertising.com","service.sp.advertising.com","adtech.advertising.com","adaptv.advertising.com","mighty.aol.net","consent.cmp.oath.com"]},{"name":"Accuweather","categories":["content"],"domains":["*.accuweather.com"]},{"name":"Feefo.com","company":"Feefo","categories":["analytics"],"domains":["*.feefo.com"]},{"name":"Constant Contact","categories":["ad"],"domains":["*.ctctcdn.com"]},{"name":"Rakuten Marketing","company":"Rakuten","categories":["ad"],"domains":["*.rakuten-static.com","*.rmtag.com"]},{"name":"TrafficStars","categories":["ad"],"domains":["*.trafficstars.com","*.tsyndicate.com"]},{"name":"ForeSee","company":"Answers","categories":["analytics"],"domains":["*.4seeresults.com","*.answerscloud.com","*.foresee.com","*.foreseeresults.com"]},{"name":"Swiftype","categories":["utility"],"domains":["*.swiftype.com","*.swiftypecdn.com"]},{"name":"Bazaarvoice","categories":["analytics"],"domains":["*.bazaarvoice.com","*.feedmagnet.com"]},{"name":"SocialShopWave","categories":["social"],"domains":["*.socialshopwave.com"]},{"name":"Bootstrap CDN","homepage":"https://www.bootstrapcdn.com/","categories":["cdn"],"domains":["*.bootstrapcdn.com"],"examples":["maxcdn.bootstrapcdn.com","stackpath.bootstrapcdn.com"]},{"name":"SessionCam","company":"ServiceTick","categories":["analytics"],"domains":["*.sessioncam.com","d2oh4tlt9mrke9.cloudfront.net"]},{"name":"AppDynamics","homepage":"https://www.appdynamics.com/","categories":["utility"],"domains":["*.appdynamics.com","*.eum-appdynamics.com","d3tjaysgumg9lf.cloudfront.net"],"examples":["cdn.appdynamics.com"]},{"name":"Adyoulike","categories":["ad"],"domains":["*.adyoulike.com","*.omnitagjs.com","*.adyoulike.net"]},{"name":"Affirm","categories":["utility"],"domains":["*.affirm.com"]},{"name":"Sortable","categories":["ad"],"domains":["*.deployads.com"]},{"name":"Neodata","categories":["ad"],"domains":["*.neodatagroup.com"]},{"name":"Adnium","categories":["ad"],"domains":["*.adnium.com"]},{"name":"AdScore","homepage":"https://www.adscore.com/","categories":["ad"],"domains":["*.adsco.re"],"examples":["c.adsco.re"]},{"name":"Comm100","categories":["customer-success"],"domains":["*.comm100.com"]},{"name":"Medium","categories":["content"],"domains":["*.medium.com"]},{"name":"Esri ArcGIS","company":"Esri","categories":["utility"],"domains":["*.arcgis.com","*.arcgisonline.com"]},{"name":"iBillboard","categories":["ad"],"domains":["*.ibillboard.com"]},{"name":"Hotmart","homepage":"https://www.hotmart.com/","categories":["content"],"domains":["*.hotmart.com"],"examples":["launchermodule.hotmart.com"]},{"name":"Secomapp","categories":["utility"],"domains":["*.secomapp.com"]},{"name":"AdMatic","categories":["ad"],"domains":["*.admatic.com.tr"]},{"name":"Dailymotion","categories":["content"],"domains":["*.dailymotion.com","*.dmxleo.com","*.dm.gg","*.pxlad.io","*.dmcdn.net","*.sublimevideo.net"],"examples":["ad.pxlad.io","www.dailymotion.com"]},{"name":"Foursixty","categories":["customer-success"],"domains":["*.foursixty.com"]},{"name":"OptiMonk","categories":["ad"],"domains":["*.optimonk.com"]},{"name":"Refersion","categories":["ad"],"domains":["*.refersion.com"]},{"name":"Pardot","categories":["marketing"],"domains":["*.pardot.com"]},{"name":"GitHub","categories":["utility"],"domains":["*.rawgit.com"],"examples":["cdn.rawgit.com"]},{"name":"Alexa","homepage":"https://www.alexa.com/","categories":["analytics"],"domains":["*.alexametrics.com","d31qbv1cthcecs.cloudfront.net"],"examples":["certify.alexametrics.com"]},{"name":"Bugsnag","categories":["utility"],"domains":["*.bugsnag.com","d2wy8f7a9ursnm.cloudfront.net"],"examples":["notify.bugsnag.com"]},{"name":"ResponsiveVoice","categories":["other"],"domains":["*.responsivevoice.org"]},{"name":"ContentSquare","categories":["analytics"],"domains":["d1m6l9dfulcyw7.cloudfront.net","*.content-square.net","*.contentsquare.net"]},{"name":"BounceX","categories":["analytics"],"homepage":"https://www.bouncex.com/","domains":["*.bounceexchange.com","*.bouncex.net"],"examples":["events.bouncex.net"]},{"name":"Tencent","categories":["content"],"domains":["*.qq.com","*.ywxi.net"]},{"name":"TagCommander","categories":["tag-manager"],"domains":["*.commander1.com","*.tagcommander.com"]},{"name":"Between Digital","categories":["ad"],"domains":["*.betweendigital.com"]},{"name":"Tribal Fusion","company":"Exponential Interactive","categories":["ad"],"domains":["*.tribalfusion.com"]},{"name":"iovation","categories":["utility"],"domains":["*.iesnare.com"]},{"name":"Auto Link Maker","company":"Apple","categories":["ad"],"domains":["*.apple.com"],"examples":["autolinkmaker.itunes.apple.com"]},{"name":"SnapEngage","categories":["customer-success"],"domains":["*.snapengage.com"]},{"name":"iAdvize SAS","categories":["customer-success"],"domains":["*.iadvize.com"]},{"name":"Listrak","homepage":"https://www.listrak.com/","categories":["marketing"],"domains":["*.listrak.com","*.listrakbi.com"],"examples":["cdn.listrakbi.com","s1.listrakbi.com"]},{"name":"Branch Metrics","categories":["ad"],"domains":["*.branch.io","*.app.link"]},{"name":"Admixer for Publishers","company":"Admixer","categories":["ad"],"domains":["*.admixer.net"]},{"name":"Tail Target","company":"Tail","categories":["ad"],"domains":["*.tailtarget.com"]},{"name":"Clicktale","categories":["analytics"],"domains":["*.cdngc.net","*.clicktale.net"],"examples":["clicktalecdn.sslcs.cdngc.net"]},{"name":"Maxymiser","categories":["analytics"],"domains":["*.maxymiser.net"]},{"name":"Marketo","homepage":"https://www.marketo.com","categories":["analytics"],"domains":["*.marketo.com","*.mktoresp.com","*.marketo.net"],"examples":["munchkin.marketo.net"]},{"name":"Bizible","categories":["ad"],"domains":["*.bizible.com","*.bizibly.com"]},{"name":"LoyaltyLion","categories":["ad"],"domains":["*.loyaltylion.com","*.loyaltylion.net","dg1f2pfrgjxdq.cloudfront.net"]},{"name":"Convert Insights","categories":["analytics"],"domains":["*.convertexperiments.com"]},{"name":"Opentag","company":"Qubit","categories":["tag-manager"],"domains":["*.qutics.com","d3c3cq33003psk.cloudfront.net"],"examples":["opentag-stats.qutics.com"]},{"name":"Adverline Board","company":"Adverline","categories":["ad"],"domains":["*.adverline.com","*.adnext.fr"]},{"name":"Optanon","homepage":"https://www.cookielaw.org/","categories":["utility"],"domains":["*.onetrust.com","*.cookielaw.org"],"examples":["cdn.cookielaw.org","geolocation.onetrust.com"]},{"name":"Adocean","company":"Gemius","categories":["ad"],"domains":["*.adocean.pl"]},{"name":"Po.st","company":"RadiumOne","categories":["utility"],"domains":["*.po.st"]},{"name":"Yieldmo","categories":["ad"],"domains":["*.yieldmo.com"]},{"name":"Market GID","homepage":"https://www.marketgid.com/","categories":["ad"],"domains":["*.marketgid.com"],"examples":["jsc.marketgid.com"]},{"name":"TRUSTe","categories":["utility"],"domains":["*.truste.com"]},{"name":"One by AOL","company":"AOL","categories":["ad"],"domains":["*.adtechjp.com","*.adtech.de"]},{"name":"Affiliate Window","company":"Digital Window","categories":["ad"],"domains":["*.dwin1.com"]},{"name":"Pagely","categories":["other"],"domains":["*.optnmstr.com"]},{"name":"Perfect Market","categories":["ad"],"domains":["*.perfectmarket.com"]},{"name":"Symantec","categories":["utility"],"domains":["*.norton.com","*.symantec.com","*.symcb.com","*.symcd.com"],"examples":["extended-validation-ssl.websecurity.symantec.com"]},{"name":"piano","categories":["ad"],"domains":["*.npttech.com","*.tinypass.com"],"examples":["www.npttech.com"]},{"name":"Elastic Ad","categories":["ad"],"domains":["*.elasticad.net"]},{"name":"Freshdesk","homepage":"https://freshdesk.com/","categories":["customer-success"],"domains":["d36mpcpuzc4ztk.cloudfront.net"]},{"name":"IPONWEB","categories":["ad"],"domains":["*.company-target.com","*.liadm.com","*.iponweb.net","*.p161.net"],"examples":["pool.udsp.iponweb.net"]},{"name":"Ecwid","categories":["hosting"],"domains":["*.ecwid.com","*.shopsettings.com","d3fi9i0jj23cau.cloudfront.net","d3j0zfs7paavns.cloudfront.net"]},{"name":"Digioh","categories":["ad"],"domains":["*.lightboxcdn.com"]},{"name":"Fort Awesome","categories":["cdn"],"domains":["*.fortawesome.com"]},{"name":"Nend","categories":["ad"],"domains":["*.nend.net"]},{"name":"Bronto Software","categories":["marketing"],"domains":["*.bm23.com","*.bronto.com","*.brontops.com"]},{"name":"TrackJS","categories":["analytics"],"domains":["*.trackjs.com","d2zah9y47r7bi2.cloudfront.net"],"examples":["usage.trackjs.com"]},{"name":"Dynamic Yield","categories":["customer-success"],"domains":["*.dynamicyield.com"]},{"name":"Clerk.io ApS","categories":["analytics"],"domains":["*.clerk.io"]},{"name":"IBM Digital Analytics","company":"IBM","categories":["analytics"],"domains":["*.cmcore.com","coremetrics.com","data.coremetrics.com","data.de.coremetrics.com","libs.de.coremetrics.com","tmscdn.de.coremetrics.com","iocdn.coremetrics.com","libs.coremetrics.com","tmscdn.coremetrics.com","*.s81c.com","*.unica.com","*.coremetrics.eu"],"examples":["data.coremetrics.eu"]},{"name":"Usabilla","homepage":"https://usabilla.com","categories":["analytics"],"domains":["*.usabilla.com","d6tizftlrpuof.cloudfront.net"],"examples":["w.usabilla.com"]},{"name":"Meetrics","categories":["ad"],"domains":["*.de.com","*.meetrics.net","*.mxcdn.net"],"examples":["research.de.com"]},{"name":"Forensiq","categories":["utility"],"domains":["*.fqtag.com"]},{"name":"Revolver Maps","categories":["analytics"],"domains":["*.revolvermaps.com"]},{"name":"Monetate","categories":["analytics"],"domains":["*.monetate.net"]},{"name":"Fraudlogix","categories":["utility"],"domains":["*.yabidos.com"]},{"name":"Mather Economics","categories":["analytics"],"domains":["*.matheranalytics.com"]},{"name":"Blindado","categories":["utility"],"domains":["*.siteblindado.com"]},{"name":"UserReport","categories":["analytics"],"domains":["*.userreport.com"]},{"name":"OwnerIQ","categories":["ad"],"domains":["*.owneriq.net"]},{"name":"CPEx","categories":["content"],"domains":["*.cpex.cz"]},{"name":"eBay","categories":["ad"],"domains":["*.ebay.com","*.ebayimg.com","*.fetchback.com"]},{"name":"Skype","categories":["other"],"domains":["*.skype.com"]},{"name":"DialogTech","categories":["ad"],"domains":["*.dialogtech.com"]},{"name":"WebsiteBuilder.com","homepage":"https://www.websitebuilder.com","categories":["hosting"],"domains":["*.mywebsitebuilder.com"]},{"name":"iZooto","homepage":"https://www.izooto.com","categories":["marketing"],"domains":["*.izooto.com"],"examples":["cdn.izooto.com"]},{"name":"AddEvent","categories":["utility"],"domains":["*.addevent.com"],"examples":["www.addevent.com"]},{"name":"GetResponse","categories":["ad"],"domains":["*.getresponse.com"]},{"name":"Twitch","homepage":"https://twitch.tv/","categories":["video"],"domains":["*.twitch.tv"],"examples":["player.twitch.tv"]},{"name":"Radar","company":"Cedexis","homepage":"https://www.cedexis.com/radar/","categories":["analytics"],"domains":["*.cedexis-test.com","*.cedexis.com","*.cmdolb.com","cedexis.leasewebcdn.com","*.cedexis-radar.net","*.cedexis.net","cedexis-test01.insnw.net","cedexisakamaitest.azureedge.net","cedexispub.cdnetworks.net","cs600.wac.alphacdn.net","cs600.wpc.edgecastdns.net","global2.cmdolb.com","img-cedexis.mncdn.com","a-cedexis.msedge.net","zn3vgszfh.fastestcdn.net"],"examples":["radar.cedexis.com","rpt.cedexis.com","2-01-49cd-0002.cdx.cedexis.net","bench.cedexis-test.com"]},{"name":"Smart Insight Tracking","company":"Emarsys","categories":["analytics"],"domains":["*.scarabresearch.com"]},{"name":"Polar","homepage":"https://polar.me/","categories":["ad"],"domains":["*.polarmobile.ca","*.mediaeverywhere.com","*.mediavoice.com","*.plrsrvcs.com","*.polarcdn-engine.com","*.polarcdn-meraxes.com","*.polarcdn-pentos.com","*.polarcdn-static.com","*.polarcdn-terrax.com","*.polarcdn.com","*.polarmobile.com","*.poweredbypolar.com","*.mediaconductor.me","*.polaracademy.me"]},{"name":"AudienceSearch","company":"Intimate Merger","categories":["ad"],"domains":["*.im-apps.net"]},{"name":"Autopilot","categories":["ad"],"domains":["*.autopilothq.com"]},{"name":"Rackspace","categories":["hosting"],"domains":["*.rackcdn.com","*.rackspacecloud.com","*.raxcdn.com","*.websitetestlink.com"]},{"name":"PowerReviews","categories":["analytics"],"domains":["*.powerreviews.com"]},{"name":"Rocket Fuel","categories":["ad"],"domains":["*.rfihub.com","*.ru4.com","*.rfihub.net","*.ad1x.com"]},{"name":"Okas Concepts","categories":["utility"],"domains":["*.okasconcepts.com"]},{"name":"Madison Logic","categories":["marketing"],"domains":["*.ml314.com"]},{"name":"Celtra","categories":["ad"],"domains":["*.celtra.com"]},{"name":"Snacktools","categories":["ad"],"domains":["*.bannersnack.com"]},{"name":"ClickDesk","categories":["customer-success"],"domains":["*.clickdesk.com","d1gwclp1pmzk26.cloudfront.net"]},{"name":"F@N Communications","homepage":"https://www.fancs.com/","categories":["ad"],"domains":["*.ladsp.com"],"examples":["px.ladsp.com"]},{"name":"Tradelab","categories":["ad"],"domains":["*.tradelab.fr"]},{"name":"CleverDATA","categories":["ad"],"domains":["*.1dmp.io"]},{"name":"Media Management Technologies","categories":["ad"],"domains":["*.speedshiftmedia.com"]},{"name":"Wishpond Technologies","categories":["marketing"],"domains":["*.wishpond.com","*.wishpond.net"]},{"name":"Reviews.co.uk","categories":["analytics"],"domains":["*.reviews.co.uk"]},{"name":"Adobe Scene7","company":"Adobe Systems","categories":["content"],"domains":["wwwimages.adobe.com","*.scene7.com","*.everestads.net","*.everestjs.net"]},{"name":"Permutive","categories":["ad"],"domains":["*.permutive.com","d3alqb8vzo7fun.cloudfront.net"]},{"name":"plista","categories":["ad"],"domains":["*.plista.com"]},{"name":"Kampyle","categories":["analytics"],"domains":["*.kampyle.com"]},{"name":"LinkedIn Ads","categories":["ad"],"domains":["*.licdn.com","ads.linkedin.com","www.linkedin.com"],"examples":["snap.licdn.com"]},{"name":"Survicate","categories":["analytics"],"domains":["*.survicate.com"]},{"name":"Nativo","categories":["ad"],"domains":["*.postrelease.com"]},{"name":"Decibel Insight","categories":["analytics"],"domains":["*.decibelinsight.net"]},{"name":"Github","categories":["utility"],"domains":["*.github.com","*.githubusercontent.com","*.github.io"],"examples":["raw.githubusercontent.com"]},{"name":"WebEngage","categories":["customer-success"],"domains":["*.webengage.co","*.webengage.com","d23nd6ymopvz52.cloudfront.net","d3701cc9l7v9a6.cloudfront.net"]},{"name":"Geniee","categories":["ad"],"domains":["*.href.asia","*.genieessp.jp","*.genieesspv.jp","*.gssprt.jp"],"examples":["cs.gssprt.jp"]},{"name":"The Trade Desk","homepage":"https://www.thetradedesk.com/","categories":["ad"],"domains":["d1eoo1tco6rr5e.cloudfront.net","*.adsrvr.org"],"examples":["js.adsrvr.org","match.adsrvr.org","insight.adsrvr.org","usw-lax.adsrvr.org","data.adsrvr.org","snap.adsrvr.org"]},{"name":"Lytics","categories":["ad"],"domains":["*.lytics.io"]},{"name":"rewardStyle.com","categories":["ad"],"domains":["*.rewardstyle.com"]},{"name":"Kaltura Video Platform","company":"Kaltura","categories":["content"],"domains":["*.kaltura.com"],"examples":["cdnsecakmi.kaltura.com"]},{"name":"WisePops","categories":["utility"],"domains":["*.wisepops.com"]},{"name":"Picreel","categories":["analytics"],"domains":["*.pcrl.co","*.picreel.com"]},{"name":"Riskified","categories":["utility"],"domains":["*.riskified.com"]},{"name":"Supership","homepage":"https://supership.jp/","categories":["ad"],"domains":["*.socdm.com"]},{"name":"Google Plus","company":"Google","categories":["social"],"domains":["plus.google.com"]},{"name":"Yieldify","categories":["ad"],"domains":["*.yieldify.com","*.yieldifylabs.com","d33wq5gej88ld6.cloudfront.net","dwmvwp56lzq5t.cloudfront.net"],"examples":["geo.yieldifylabs.com"]},{"name":"Smarter Click","categories":["ad"],"domains":["*.smct.co","*.smarterclick.co.uk"]},{"name":"Evergage","categories":["analytics"],"domains":["*.evergage.com","*.evgnet.com"],"examples":["cdn.evgnet.com"]},{"name":"SaleCycle","categories":["ad"],"domains":["*.salecycle.com","d16fk4ms6rqz1v.cloudfront.net","d22j4fzzszoii2.cloudfront.net","d30ke5tqu2tkyx.cloudfront.net"]},{"name":"Zanox","categories":["ad"],"domains":["*.zanox.com","*.zanox.ws"]},{"name":"AddShoppers","categories":["social"],"domains":["*.addshoppers.com","d3rr3d0n31t48m.cloudfront.net","*.shop.pe"]},{"name":"Interpublic Group","categories":["ad"],"domains":["*.mbww.com"]},{"name":"Qualaroo","categories":["analytics"],"domains":["*.qualaroo.com"]},{"name":"BoldChat","company":"LogMeIn","categories":["customer-success"],"domains":["*.boldchat.com"]},{"name":"Effective Measure","categories":["ad"],"domains":["*.effectivemeasure.net"]},{"name":"LoopMe","categories":["ad"],"domains":["*.loopme.biz","*.loopme.com","*.vntsm.com","*.loopme.me"]},{"name":"Sooqr Search","company":"Sooqr","categories":["utility"],"domains":["*.sooqr.com"]},{"name":"smartclip","categories":["ad"],"domains":["*.smartclip.net"]},{"name":"Cloudinary","categories":["content"],"domains":["*.cloudinary.com"]},{"name":"Gleam","categories":["marketing"],"domains":["*.gleam.io"]},{"name":"Revcontent","categories":["content"],"domains":["*.revcontent.com"]},{"name":"Browsealoud","homepage":"https://www.texthelp.com/en-gb/products/browsealoud/","categories":["other"],"domains":["*.browsealoud.com","*.texthelp.com"],"examples":["www.browsealoud.com"]},{"name":"Ooyala","categories":["ad"],"domains":["*.ooyala.com"]},{"name":"Intercept Interactive","categories":["ad"],"domains":["*.undertone.com"]},{"name":"Appier","categories":["ad"],"domains":["*.appier.net"]},{"name":"SublimeSkinz","categories":["ad"],"domains":["*.ayads.co"]},{"name":"KISSmetrics","categories":["analytics"],"domains":["*.kissmetrics.com","doug1izaerwt3.cloudfront.net","dsyszv14g9ymi.cloudfront.net"]},{"name":"Pixlee","categories":["social"],"domains":["*.pixlee.com"]},{"name":"NetFlix","categories":["content"],"domains":["*.nflxext.com","*.nflximg.net"]},{"name":"Shopgate","categories":["utility"],"domains":["*.shopgate.com"]},{"name":"Highcharts","categories":["utility"],"domains":["*.highcharts.com"]},{"name":"Audience 360","company":"Datapoint Media","categories":["ad"],"domains":["*.dpmsrv.com"]},{"name":"Bootstrap Chinese network","categories":["cdn"],"domains":["*.bootcss.com"]},{"name":"Sparkflow","company":"Intercept Interactive","categories":["ad"],"domains":["*.sparkflow.net"]},{"name":"Flowplayer","categories":["content"],"domains":["*.flowplayer.org"]},{"name":"Fresh Relevance","categories":["analytics"],"domains":["*.freshrelevance.com","*.cloudfront.ne","d1y9qtn9cuc3xw.cloudfront.net","d81mfvml8p5ml.cloudfront.net","dkpklk99llpj0.cloudfront.net"],"examples":["d1y9qtn9cuc3xw.cloudfront.ne"]},{"name":"WebpageFX","categories":["ad"],"domains":["*.leadmanagerfx.com"]},{"name":"Simpli.fi","categories":["ad"],"domains":["*.simpli.fi"]},{"name":"Omniconvert","categories":["analytics"],"domains":["*.omniconvert.com","d2tgfbvjf3q6hn.cloudfront.net","d3vbj265bmdenw.cloudfront.net"]},{"name":"Adscale","categories":["ad"],"domains":["*.adscale.de"]},{"name":"Covert Pics","categories":["content"],"domains":["*.covet.pics"]},{"name":"Curalate","categories":["marketing"],"domains":["*.curalate.com","d116tqlcqfmz3v.cloudfront.net"]},{"name":"ReadSpeaker","homepage":"https://www.readspeaker.com","categories":["other"],"domains":["*.readspeaker.com"],"examples":["sf1-eu.readspeaker.com"]},{"name":"Stackla PTY","categories":["social"],"domains":["*.stackla.com"]},{"name":"SpotXchange","categories":["ad"],"domains":["*.spotxcdn.com","*.spotxchange.com","*.spotx.tv"]},{"name":"Qubit Deliver","company":"Qubit","categories":["analytics"],"domains":["d1m54pdnjzjnhe.cloudfront.net","d22rutvoghj3db.cloudfront.net","dd6zx4ibq538k.cloudfront.net"]},{"name":"Opta","company":"Perform Group","categories":["content"],"domains":["*.opta.net"]},{"name":"Unruly Media","categories":["ad"],"domains":["*.unrulymedia.com"]},{"name":"Quantum Metric","homepage":"https://www.quantummetric.com/","categories":["analytics"],"domains":["*.quantummetric.com"]},{"name":"Weborama","categories":["ad"],"domains":["*.weborama.com","*.weborama.fr"]},{"name":"Republer","categories":["ad"],"domains":["*.republer.com"],"examples":["sync.republer.com"]},{"name":"Vox Media","homepage":"https://www.voxmedia.com/","categories":["content"],"domains":["*.vox-cdn.com","*.voxmedia.com"],"examples":["cdn.vox-cdn.com"]},{"name":"FoxyCart","categories":["utility"],"domains":["*.foxycart.com"]},{"name":"Adition","homepage":"https://www.adition.com","categories":["ad"],"domains":["*.adition.com"],"examples":["dsp.adfarm1.adition.com"]},{"name":"LiveHelpNow","categories":["customer-success"],"domains":["*.livehelpnow.net"]},{"name":"DemandBase","categories":["marketing"],"domains":["*.demandbase.com"]},{"name":"Concert","homepage":"https://concert.io/","categories":["ad"],"domains":["*.concert.io"],"examples":["cdn.concert.io"]},{"name":"TINT","categories":["content"],"domains":["*.71n7.com","d33w9bm0n1egwm.cloudfront.net","d36hc0p18k1aoc.cloudfront.net","d3l7tj34e9fc43.cloudfront.net"],"examples":["www.71n7.com"]},{"name":"Arbor","company":"LiveRamp","categories":["other"],"domains":["*.pippio.com"]},{"name":"Vidyard","homepage":"https://www.vidyard.com/","categories":["utility"],"domains":["*.vidyard.com"]},{"name":"linkpulse","categories":["analytics"],"domains":["*.lp4.io"]},{"name":"Edge Web Fonts","company":"Adobe Systems","categories":["cdn"],"domains":["*.edgefonts.net"],"examples":["use.edgefonts.net"]},{"name":"ShopiMind","company":"ShopIMind","categories":["ad"],"domains":["*.shopimind.com"]},{"name":"Feedbackify","company":"InsideMetrics","categories":["analytics"],"domains":["*.feedbackify.com"]},{"name":"Sidecar","categories":["other"],"domains":["*.getsidecar.com","d3v27wwd40f0xu.cloudfront.net"]},{"name":"SearchSpring","categories":["utility"],"domains":["*.searchspring.net"]},{"name":"DMD Marketing","homepage":"https://www.dmdconnects.com/","categories":["ad"],"domains":["*.medtargetsystem.com"]},{"name":"C3 Metrics","categories":["analytics"],"domains":["*.c3tag.com"]},{"name":"FirstImpression","categories":["ad"],"domains":["*.firstimpression.io"]},{"name":"GetIntent RTBSuite","company":"GetIntent","categories":["ad"],"domains":["*.adhigh.net"]},{"name":"unpkg","categories":["utility"],"domains":["*.npmcdn.com"]},{"name":"PerimeterX Bot Defender","company":"PerimeterX","categories":["utility"],"domains":["*.perimeterx.net","*.pxi.pub"]},{"name":"JustPremium Ads","company":"JustPremium","categories":["ad"],"domains":["*.justpremium.com"]},{"name":"Talkable","categories":["ad"],"domains":["*.talkable.com","d2jjzw81hqbuqv.cloudfront.net"],"examples":["www.talkable.com"]},{"name":"Steelhouse","categories":["ad"],"domains":["*.steelhousemedia.com"]},{"name":"Adtech (AOL)","categories":["ad"],"domains":["*.adtechus.com"]},{"name":"Technorati","company":"Synacor","categories":["ad"],"domains":["*.technoratimedia.com"]},{"name":"Drip","company":"The Numa Group","categories":["ad"],"domains":["*.getdrip.com"]},{"name":"VoiceFive","categories":["analytics"],"domains":["*.voicefive.com"]},{"name":"Adkontekst","categories":["ad"],"domains":["*.adkontekst.pl"]},{"name":"Cedato","categories":["ad"],"domains":["*.algovid.com","*.vdoserv.com"]},{"name":"TripAdvisor","categories":["content"],"domains":["*.jscache.com","*.tacdn.com","*.tamgrt.com","*.tripadvisor.com","*.viator.com","*.tripadvisor.co.uk"],"examples":["www.jscache.com","www.tamgrt.com"]},{"name":"Typepad","categories":["hosting"],"domains":["*.typepad.com"]},{"name":"Silverpop","company":"IBM","categories":["ad"],"domains":["*.mkt912.com","*.mkt922.com","*.mkt932.com","*.mkt941.com","*.mkt51.net","*.mkt61.net","*.pages01.net","*.pages02.net","*.pages03.net","*.pages04.net","*.pages05.net"]},{"name":"Attentive","homepage":"https://attentivemobile.com/","categories":["ad"],"domains":["*.attn.tv","*.attentivemobile.com"]},{"name":"Salesforce.com","categories":["ad"],"domains":["*.force.com","*.salesforce.com"],"examples":["secure.force.com"]},{"name":"WebSpectator","categories":["ad"],"domains":["*.webspectator.com"]},{"name":"Kaizen Platform","categories":["analytics"],"domains":["*.kaizenplatform.net"],"examples":["cdn.kaizenplatform.net","log-v4.kaizenplatform.net"]},{"name":"Global-e","categories":["hosting"],"domains":["*.global-e.com"]},{"name":"TruConversion","categories":["analytics"],"domains":["*.truconversion.com"]},{"name":"White Ops","categories":["utility"],"domains":["*.acexedge.com","*.tagsrvcs.com"]},{"name":"Accordant Media","categories":["ad"],"domains":["*.a3cloud.net"],"examples":["segment.a3cloud.net"]},{"name":"Keywee","categories":["ad"],"domains":["*.keywee.co"]},{"name":"Hupso Website Analyzer","company":"Hupso","categories":["analytics"],"domains":["*.hupso.com"]},{"name":"ThreatMetrix","categories":["utility"],"domains":["*.online-metrix.net"]},{"name":"eXelate","categories":["ad"],"domains":["*.exelator.com"]},{"name":"Delta Projects AB","categories":["ad"],"domains":["*.de17a.com"]},{"name":"Profitshare","categories":["ad"],"domains":["*.profitshare.ro"]},{"name":"TubeMogul","categories":["ad"],"domains":["*.tubemogul.com"]},{"name":"Ipify","homepage":"https://www.ipify.org","categories":["utility"],"domains":["*.ipify.org"],"examples":["api.ipify.org","geo.ipify.org"]},{"name":"Marketplace Web Service","company":"Amazon","categories":["other"],"domains":["*.ssl-images-amazon.com"]},{"name":"Key CDN","categories":["utility"],"domains":["*.kxcdn.com"]},{"name":"The ADEX","categories":["ad"],"domains":["*.theadex.com"]},{"name":"ZEDO","categories":["ad"],"domains":["*.zedo.com"]},{"name":"Sajari Pty","categories":["utility"],"domains":["*.sajari.com"]},{"name":"The Hut Group","categories":["content"],"domains":["*.thcdn.com"]},{"name":"Signyfyd","categories":["utility"],"domains":["*.signifyd.com"]},{"name":"Apester","categories":["analytics"],"domains":["*.apester.com","*.qmerce.com"]},{"name":"mParticle","homepage":"https://www.mparticle.com/","categories":["utility"],"domains":["*.mparticle.com"],"examples":["jssdks.mparticle.com","identity.mparticle.com"]},{"name":"AdSniper","categories":["ad"],"domains":["*.adsniper.ru","*.sniperlog.ru"]},{"name":"Time","categories":["content"],"domains":["*.timeinc.net"]},{"name":"SurveyMonkey","categories":["analytics"],"domains":["*.surveymonkey.com"]},{"name":"GIPHY","categories":["content"],"domains":["*.giphy.com"]},{"name":"Socialphotos","categories":["social"],"domains":["*.slpht.com"]},{"name":"Livefyre","categories":["content"],"domains":["*.fyre.co","*.livefyre.com"]},{"name":"Civic","categories":["hosting"],"domains":["*.civiccomputing.com"]},{"name":"Auth0","homepage":"https://auth0.com/","categories":["utility"],"domains":["*.auth0.com"],"examples":["cdn.auth0.com"]},{"name":"Flickr","categories":["content"],"domains":["*.flickr.com","*.staticflickr.com"]},{"name":"Reevoo","categories":["analytics"],"domains":["*.reevoo.com"]},{"name":"Sirv","categories":["other"],"domains":["*.sirv.com"]},{"name":"Underdog Media","categories":["ad"],"domains":["*.underdog.media","*.udmserve.net"]},{"name":"Petametrics","categories":["analytics"],"domains":["*.petametrics.com"]},{"name":"Sweet Tooth","categories":["ad"],"domains":["*.sweettooth.io"]},{"name":"Hola Networks","categories":["other"],"domains":["*.h-cdn.com"]},{"name":"Verizon Digital Media CDN","homepage":"https://www.verizondigitalmedia.com/","categories":["cdn"],"domains":["*.edgecastcdn.net","*.edgecastdns.net"]},{"name":"Zarget","categories":["analytics"],"domains":["*.zarget.com"]},{"name":"ResponseTap","categories":["analytics"],"domains":["*.adinsight.com","*.responsetap.com"]},{"name":"ReTargeter","categories":["ad"],"domains":["*.retargeter.com"]},{"name":"Yottaa","categories":["hosting"],"domains":["*.yottaa.com","*.yottaa.net"]},{"name":"Connatix","categories":["ad"],"domains":["*.connatix.com"]},{"name":"Klevu Search","company":"Klevu","categories":["utility"],"domains":["*.klevu.com"]},{"name":"Best Of Media S.A.","categories":["content"],"domains":["*.servebom.com"]},{"name":"AdTrue","company":"FPT AdTrue","categories":["ad"],"domains":["*.adtrue.com"]},{"name":"Customer.io","categories":["ad"],"domains":["*.customer.io"]},{"name":"Advance Magazine Group","categories":["content"],"domains":["*.condenastdigital.com","*.condenet.com","*.condenast.co.uk"]},{"name":"StreamRail","categories":["ad"],"domains":["*.streamrail.com","*.streamrail.net"]},{"name":"Opinion Stage","categories":["analytics"],"domains":["*.opinionstage.com"],"examples":["www.opinionstage.com"]},{"name":"CleverTap","categories":["analytics"],"domains":["d2r1yp2w7bby2u.cloudfront.net"]},{"name":"Fanplayr","categories":["analytics"],"domains":["*.fanplayr.com","d38nbbai6u794i.cloudfront.net"]},{"name":"Calendly","categories":["other"],"domains":["*.calendly.com"]},{"name":"Adobe Test & Target","company":"Adobe Systems","categories":["analytics"],"domains":["*.omtrdc.net"],"examples":["tt.omtrdc.net"]},{"name":"Navegg","categories":["ad"],"domains":["*.navdmp.com"]},{"name":"Sekindo","categories":["content"],"domains":["*.sekindo.com"]},{"name":"Conversio","categories":["ad"],"domains":["*.conversio.com"]},{"name":"CyberSource (Visa)","categories":["utility"],"domains":["*.authorize.net"]},{"name":"Pixalate","categories":["utility"],"domains":["*.adrta.com"]},{"name":"Reviews.io","categories":["analytics"],"domains":["*.reviews.io"]},{"name":"NetAffiliation","company":"Kwanco","categories":["ad"],"domains":["*.metaffiliation.com"]},{"name":"FuelX","categories":["ad"],"domains":["*.fuelx.com"]},{"name":"Touch Commerce","categories":["customer-success"],"domains":["*.inq.com","*.touchcommerce.com"]},{"name":"TripleLift","categories":["ad"],"domains":["*.3lift.com"]},{"name":"Ambassador","categories":["ad"],"domains":["*.getambassador.com"]},{"name":"epoq internet services","categories":["analytics"],"domains":["*.epoq.de"]},{"name":"Woopra","categories":["analytics"],"domains":["*.woopra.com"]},{"name":"Playbuzz","categories":["hosting"],"domains":["*.playbuzz.com"]},{"name":"Exponential Interactive","categories":["ad"],"domains":["*.exponential.com"]},{"name":"JustUno","categories":["ad"],"domains":["*.justuno.com"]},{"name":"Widespace","homepage":"https://www.widespace.com","categories":["ad"],"domains":["*.widespace.com"],"examples":["sync.widespace.com"]},{"name":"VisScore","categories":["analytics"],"domains":["*.visscore.com","d2hkbi3gan6yg6.cloudfront.net"]},{"name":"AWeber","categories":["ad"],"domains":["*.aweber.com"]},{"name":"AvantLink","categories":["ad"],"domains":["*.avmws.com"]},{"name":"Conversant Tag Manager","company":"Conversant","categories":["tag-manager"],"domains":["*.mplxtms.com"]},{"name":"Postcode Anywhere (Holdings)","categories":["utility"],"domains":["*.postcodeanywhere.co.uk"]},{"name":"Conversant","categories":["analytics"],"domains":["*.dotomi.com","*.dtmpub.com","*.emjcd.com","mediaplex.com","*.tqlkg.com","*.fastclick.net"],"examples":["www.tqlkg.com"]},{"name":"FLXone","company":"Teradata","categories":["ad"],"domains":["*.pangolin.blue","*.flx1.com","d2hlpp31teaww3.cloudfront.net"]},{"name":"Infinity Tracking","categories":["analytics"],"domains":["*.infinity-tracking.net"]},{"name":"reEmbed","categories":["other"],"domains":["*.reembed.com"]},{"name":"Kameleoon","categories":["analytics"],"domains":["*.kameleoon.com"]},{"name":"Impact Radius","categories":["ad"],"domains":["*.impactradius-event.com","*.impactradius-go.com","*.7eer.net","d3cxv97fi8q177.cloudfront.net","*.evyy.net","*.ojrq.net"],"examples":["a.impactradius-go.com","microsoft-uk.evyy.net"]},{"name":"Heroku","categories":["other"],"domains":["*.herokuapp.com"]},{"name":"AdsWizz","categories":["ad"],"domains":["*.adswizz.com"]},{"name":"MaxMind","categories":["utility"],"domains":["*.maxmind.com"]},{"name":"Pusher","homepage":"https://pusher.com/","categories":["utility"],"domains":["*.pusher.com","*.pusherapp.com"],"examples":["stats.pusher.com"]},{"name":"Admitad","categories":["ad"],"domains":["*.lenmit.com"]},{"name":"AdsNative","categories":["ad"],"domains":["*.adsnative.com"]},{"name":"Viacom","categories":["content"],"domains":["*.mtvnservices.com"]},{"name":"Cookie-Script.com","categories":["utility"],"domains":["*.cookie-script.com"]},{"name":"MonetizeMore","categories":["ad"],"domains":["*.m2.ai"]},{"name":"Mediahawk","categories":["analytics"],"domains":["*.mediahawk.co.uk"]},{"name":"GoSquared","homepage":"https://www.gosquared.com","categories":["analytics"],"domains":["*.gosquared.com","d1l6p2sc9645hc.cloudfront.net"],"examples":["data.gosquared.com","data2.gosquared.com"]},{"name":"Datonics","categories":["ad"],"domains":["*.pro-market.net"],"examples":["pbid.pro-market.net"]},{"name":"Adobe Marketing Cloud","company":"Adobe Systems","categories":["ad"],"domains":["*.adobetag.com"]},{"name":"News","categories":["social"],"domains":["*.news.com.au","*.newsanalytics.com.au","*.newsapi.com.au","*.newscdn.com.au","*.newsdata.com.au","*.newsdiscover.com.au","*.news-static.com"]},{"name":"Experian Cross-Channel Marketing Platform","company":"Experian","categories":["marketing"],"domains":["*.eccmp.com","*.ccmp.eu"]},{"name":"SkyScanner","categories":["content"],"domains":["*.skyscanner.net"],"examples":["api.skyscanner.net"]},{"name":"Vibrant Media","categories":["ad"],"domains":["*.intellitxt.com","*.picadmedia.com"]},{"name":"Mobify","categories":["utility"],"domains":["*.mobify.com","*.mobify.net"]},{"name":"Bookatable","categories":["content"],"domains":["*.bookatable.com","*.livebookings.com"]},{"name":"SecuredVisit","company":"4Cite Marketing","categories":["ad"],"domains":["*.securedvisit.com"]},{"name":"[24]7","categories":["customer-success"],"domains":["*.247-inc.net","*.247inc.net","d1af033869koo7.cloudfront.net"]},{"name":"Transifex","categories":["utility"],"domains":["*.transifex.com"]},{"name":"Tagboard","categories":["social"],"domains":["*.tagboard.com"]},{"name":"Council ad Network","categories":["ad"],"domains":["*.counciladvertising.net"]},{"name":"WalkMe","categories":["customer-success"],"domains":["*.walkme.com"]},{"name":"Betgenius","company":"Genius Sports","categories":["content"],"domains":["*.connextra.com"]},{"name":"Exactag","categories":["ad"],"domains":["*.exactag.com"]},{"name":"Knight Lab","company":"Northwestern University","categories":["utility"],"domains":["*.knightlab.com"]},{"name":"Reflektion","categories":["analytics"],"domains":["*.reflektion.com","d26opx5dl8t69i.cloudfront.net"]},{"name":"Expedia","categories":["content"],"domains":["*.travel-assets.com","*.trvl-media.com","*.trvl-px.com","*.uciservice.com"],"examples":["www.trvl-px.com","www.uciservice.com"]},{"name":"Performio","categories":["ad"],"domains":["*.performax.cz"],"examples":["ut.performax.cz"]},{"name":"Janrain","categories":["analytics"],"domains":["*.janrain.com","*.janrainbackplane.com","*.rpxnow.com","d3hmp0045zy3cs.cloudfront.net"]},{"name":"Resonance Insights","categories":["analytics"],"domains":["*.res-x.com"]},{"name":"cloudIQ","categories":["analytics"],"domains":["*.cloud-iq.com"]},{"name":"Snack Media","categories":["content"],"domains":["*.snack-media.com"]},{"name":"Ekm Systems","categories":["analytics"],"domains":["*.ekmsecure.com","*.ekmpinpoint.co.uk"],"examples":["globalstats.ekmsecure.com"]},{"name":"Wow Analytics","categories":["analytics"],"domains":["*.wowanalytics.co.uk"]},{"name":"AdvertServe","categories":["ad"],"domains":["*.advertserve.com"]},{"name":"Pingdom RUM","homepage":"https://www.pingdom.com/product/performance-monitoring/","categories":["analytics"],"domains":["*.pingdom.net"],"examples":["rum-static.pingdom.net","rum-collector-2.pingdom.net"]},{"name":"DialogTech SourceTrak","company":"DialogTech","categories":["ad"],"domains":["d31y97ze264gaa.cloudfront.net"]},{"name":"bRealTime","categories":["ad"],"domains":["*.brealtime.com"]},{"name":"Tag Inspector","company":"InfoTrust","categories":["analytics"],"domains":["d22xmn10vbouk4.cloudfront.net"]},{"name":"Zmags","categories":["marketing"],"domains":["*.zmags.com"]},{"name":"LeasdBoxer","company":"LeadBoxer","categories":["ad"],"domains":["*.leadboxer.com"]},{"name":"Friendbuy","categories":["ad"],"domains":["*.friendbuy.com","djnf6e5yyirys.cloudfront.net"]},{"name":"Acceptable Ads","homepage":"https://acceptableads.com/","categories":["ad"],"domains":["*.aaxads.com","*.aaxdetect.com"]},{"name":"Onet","categories":["ad"],"domains":["*.onet.pl"]},{"name":"Netlify","homepage":"https://www.netlify.com/","categories":["utility"],"domains":["*.netlify.com","*.netlifyusercontent.com"],"examples":["cloud.netlifyusercontent.com"]},{"name":"Twitter Online Conversion Tracking","company":"Twitter","categories":["ad"],"domains":["*.ads-twitter.com","analytics.twitter.com"],"examples":["static.ads-twitter.com"]},{"name":"AdRiver","categories":["ad"],"domains":["*.adriver.ru"]},{"name":"Proper Media","categories":["content"],"domains":["*.proper.io"]},{"name":"Storygize","categories":["ad"],"domains":["*.storygize.net"],"examples":["www.storygize.net"]},{"name":"Oracle Recommendations On Demand","company":"Oracle","categories":["analytics"],"domains":["*.atgsvcs.com"]},{"name":"Raygun","categories":["utility"],"domains":["*.raygun.io"]},{"name":"Rakuten LinkShare","company":"Rakuten","categories":["ad"],"domains":["*.linksynergy.com"]},{"name":"BlueCava","categories":["ad"],"domains":["*.bluecava.com"]},{"name":"Hull.js","categories":["utility"],"domains":["*.hull.io","*.hullapp.io"]},{"name":"PERFORM","categories":["content"],"domains":["*.performgroup.com"]},{"name":"Moxie","homepage":"https://www.gomoxie.com/","categories":["utility"],"domains":["*.gomoxie.solutions"]},{"name":"Vee24","categories":["customer-success"],"domains":["*.vee24.com"]},{"name":"Aggregate Knowledge","company":"Neustar","categories":["ad"],"domains":["*.agkn.com"]},{"name":"Cookie Reports","categories":["utility"],"domains":["*.cookiereports.com"]},{"name":"PlayAd Media Group","categories":["ad"],"domains":["*.youplay.se"]},{"name":"Exponea","categories":["analytics"],"domains":["*.exponea.com"]},{"name":"AIR.TV","categories":["ad"],"domains":["*.air.tv"]},{"name":"SlimCut Media Outstream","company":"SlimCut Media","categories":["ad"],"domains":["*.freeskreen.com"]},{"name":"Mopinion","categories":["analytics"],"domains":["*.mopinion.com"]},{"name":"Dynamic Converter","categories":["utility"],"domains":["*.dynamicconverter.com"]},{"name":"Remintrex","company":"SmartUp Venture","categories":["ad"],"domains":["*.remintrex.com"]},{"name":"Attribution","categories":["ad"],"domains":["*.attributionapp.com"]},{"name":"Browser-Update.org","categories":["other"],"domains":["*.browser-update.org"]},{"name":"Sailthru","categories":["analytics"],"domains":["*.sail-horizon.com","*.sail-personalize.com","*.sail-track.com"]},{"name":"AnswerDash","categories":["customer-success"],"domains":["*.answerdash.com"],"examples":["p1.answerdash.com"]},{"name":"Ziff Davis Tech","categories":["ad"],"domains":["*.adziff.com","*.zdbb.net"]},{"name":"Adthink","company":"Adthink Media","categories":["ad"],"domains":["*.adxcore.com","*.dcoengine.com"],"examples":["d.adxcore.com"]},{"name":"Site24x7 Real User Monitoring","company":"Site24x7","categories":["analytics"],"domains":["*.site24x7rum.com"]},{"name":"SpringServer","categories":["ad"],"domains":["*.springserve.com"]},{"name":"Freespee","categories":["customer-success"],"domains":["*.freespee.com"],"examples":["analytics.freespee.com"]},{"name":"VidPulse","categories":["analytics"],"domains":["*.vidpulse.com"]},{"name":"InAuth","categories":["utility"],"homepage":"https://www.inauth.com/","domains":["*.cdn-net.com"],"examples":["uk.cdn-net.com"]},{"name":"MLveda","categories":["utility"],"domains":["*.mlveda.com"],"examples":["www.mlveda.com"]},{"name":"Microad","categories":["ad"],"domains":["*.microad.jp"]},{"name":"ShopRunner","categories":["content"],"domains":["*.shoprunner.com","*.s-9.us"]},{"name":"Reactful","categories":["analytics"],"domains":["*.reactful.com"]},{"name":"Vergic AB","categories":["customer-success"],"domains":["*.psplugin.com"]},{"name":"Alliance for Audited Media","categories":["ad"],"domains":["*.aamsitecertifier.com"]},{"name":"Forter","categories":["utility"],"domains":["*.forter.com"]},{"name":"Swoop","categories":["ad"],"domains":["*.swoop.com"]},{"name":"Gfycat","company":"Gycat","categories":["utility"],"domains":["*.gfycat.com"]},{"name":"Optimove","company":"Mobius Solutions","categories":["analytics"],"domains":["*.optimove.net"]},{"name":"LoginRadius","categories":["social"],"domains":["*.loginradius.com"]},{"name":"Flockler","categories":["ad"],"domains":["*.flockler.com"]},{"name":"Moovweb","categories":["utility"],"domains":["*.moovweb.net"]},{"name":"Cachefly","categories":["utility"],"domains":["*.cachefly.net"]},{"name":"emetriq","homepage":"https://www.emetriq.com/","categories":["ad"],"domains":["*.emetriq.de","*.xplosion.de"]},{"name":"CANDDi","company":"Campaign and Digital Intelligence","categories":["ad"],"domains":["*.canddi.com"]},{"name":"Braintree Payments","company":"Paypal","categories":["utility"],"domains":["*.braintreegateway.com"]},{"name":"Meltwater Group","categories":["customer-success"],"domains":["*.meltwaternews.com"]},{"name":"Video Media Groep","categories":["ad"],"domains":["*.vmg.host","*.inpagevideo.nl"]},{"name":"Polldaddy","company":"Automattic","categories":["analytics"],"domains":["polldaddy.com"]},{"name":"Triblio","categories":["marketing"],"domains":["*.tribl.io"]},{"name":"Wufoo","categories":["utility"],"domains":["*.wufoo.com"]},{"name":"User Replay","categories":["analytics"],"domains":["*.userreplay.net"]},{"name":"Barilliance","categories":["analytics"],"domains":["*.barilliance.net","dn3y71tq7jf07.cloudfront.net"]},{"name":"Boomtrain","categories":["ad"],"domains":["*.boomtrain.com","*.boomtrain.net"]},{"name":"Extole","categories":["ad"],"domains":["*.extole.com","*.extole.io"],"examples":["origin.extole.io"]},{"name":"infogr.am","categories":["utility"],"domains":["*.infogr.am","*.jifo.co"]},{"name":"Catchpoint","homepage":"https://www.catchpoint.com/","categories":["analytics"],"domains":["*.3gl.net"]},{"name":"InSkin Media","categories":["ad"],"domains":["*.inskinad.com","*.inskinmedia.com"]},{"name":"Kargo","categories":["marketing"],"domains":["*.kargo.com"]},{"name":"Byside","homepage":"http://www.byside.com","categories":["analytics"],"domains":["*.byside.com"],"examples":["byce2.byside.com","wce2.byside.com"]},{"name":"CNET Content Solutions","company":"CBS Interactive","categories":["content"],"domains":["*.cnetcontent.com"],"examples":["cdn.cnetcontent.com","ws.cnetcontent.com"]},{"name":"HotelsCombined","categories":["content"],"domains":["*.datahc.com"]},{"name":"Hawk Search","categories":["utility"],"domains":["*.hawksearch.com"]},{"name":"Vergic Engage Platform","company":"Vergic","categories":["customer-success"],"domains":["*.vergic.com"]},{"name":"Vertical Mass","categories":["ad"],"domains":["*.vmweb.net"]},{"name":"ShopStorm","categories":["utility"],"domains":["*.shopstorm.com"]},{"name":"Borderfree","company":"pitney bowes","categories":["utility"],"domains":["*.borderfree.com","*.fiftyone.com"]},{"name":"Fonecall","categories":["analytics"],"domains":["*.web-call-analytics.com"]},{"name":"PebblePost","categories":["ad"],"domains":["*.pbbl.co"]},{"name":"DemandJump","categories":["analytics"],"domains":["*.demandjump.com"]},{"name":"Kiosked","categories":["ad"],"domains":["*.kiosked.com"]},{"name":"Ad6Media","categories":["ad"],"domains":["*.ad6media.fr"]},{"name":"The Publisher Desk","categories":["ad"],"domains":["*.206ads.com","*.publisherdesk.com"]},{"name":"Ghostery Enterprise","company":"Ghostery","categories":["marketing"],"domains":["*.betrad.com"]},{"name":"content.ad","categories":["ad"],"domains":["*.content.ad"]},{"name":"Innovid","categories":["ad"],"homepage":"https://www.innovid.com/","domains":["*.innovid.com"],"examples":["ag.innovid.com","rtr.innovid.com"]},{"name":"RightNow Service Cloud","company":"Oracle","categories":["customer-success"],"domains":["*.rightnowtech.com","*.rnengage.com"]},{"name":"Polyfill service","company":"Polyfill.io","categories":["other"],"domains":["*.polyfill.io"]},{"name":"Prezi","categories":["utility"],"domains":["*.prezi.com"]},{"name":"Sourcepoint","categories":["ad"],"domains":["*.decenthat.com","*.fallingfalcon.com","*.summerhamster.com","d2lv4zbk7v5f93.cloudfront.net","d3qxwzhswv93jk.cloudfront.net"],"examples":["www.decenthat.com","www.fallingfalcon.com","www.summerhamster.com"]},{"name":"PowerFront","categories":["hosting"],"domains":["*.inside-graph.com"]},{"name":"Bidswitch","homepage":"https://www.bidswitch.com/","categories":["ad"],"domains":["*.bidswitch.net"],"examples":["x.bidswitch.net"]},{"name":"Bet365","categories":["ad"],"domains":["*.bet365affiliates.com"]},{"name":"RichRelevance","categories":["analytics"],"domains":["*.richrelevance.com"]},{"name":"Elecard StreamEye","company":"Elecard","categories":["other"],"domains":["*.streameye.net"]},{"name":"NaviStone","categories":["ad"],"domains":["*.murdoog.com"]},{"name":"MailPlus","categories":["ad"],"domains":["*.mailplus.nl"]},{"name":"Cross Pixel Media","categories":["ad"],"domains":["*.crsspxl.com"]},{"name":"TurnTo","homepage":"https://www.turntonetworks.com/","categories":["utility"],"domains":["*.turnto.com"]},{"name":"Connexity","homepage":"http://connexity.com/","categories":["analytics"],"domains":["*.connexity.net"]},{"name":"Iterate","homepage":"https://iteratehq.com/","categories":["analytics"],"domains":["*.iteratehq.com"]},{"name":"OnScroll","categories":["ad"],"domains":["*.onscroll.com"]},{"name":"Web Dissector","company":"Beijing Gridsum Technologies","categories":["analytics"],"domains":["*.gridsumdissector.com","*.webdissector.com"],"examples":["www.webdissector.com"]},{"name":"Bluecore","categories":["analytics"],"domains":["*.bluecore.com"],"examples":["www.bluecore.com"]},{"name":"Flipboard","categories":["social"],"domains":["*.flipboard.com"]},{"name":"UPS i-parcel","company":"UPS","categories":["other"],"domains":["*.i-parcel.com"]},{"name":"TechTarget","categories":["content"],"domains":["*.techtarget.com","*.ttgtmedia.com"]},{"name":"Realytics","categories":["analytics"],"domains":["dcniko1cv0rz.cloudfront.net","*.realytics.net"]},{"name":"Dropbox","categories":["utility"],"domains":["*.dropboxusercontent.com"]},{"name":"StumbleUpon","categories":["content"],"domains":["*.stumble-upon.com","*.stumbleupon.com"]},{"name":"ReCollect","categories":["utility"],"domains":["*.recollect.net"]},{"name":"AdSpruce","categories":["ad"],"domains":["*.adspruce.com"]},{"name":"RebelMouse","categories":["ad"],"domains":["*.rebelmouse.com","*.rbl.ms"],"examples":["www.rebelmouse.com"]},{"name":"Intilery","categories":["customer-success"],"domains":["*.intilery-analytics.com"]},{"name":"Adunity","categories":["ad"],"domains":["*.adunity.com"]},{"name":"UpSellit","categories":["analytics"],"domains":["*.upsellit.com"],"examples":["www.upsellit.com"]},{"name":"AdSupply","categories":["ad"],"domains":["*.doublepimp.com"]},{"name":"Better Business Bureau","categories":["analytics"],"domains":["*.bbb.org"]},{"name":"Spot.IM","categories":["social"],"domains":["*.spot.im"]},{"name":"Improve Digital","categories":["ad"],"domains":["*.360yield.com"]},{"name":"Sociomantic Labs","company":"DunnHumby","categories":["ad"],"domains":["*.sociomantic.com"]},{"name":"MathJax","categories":["utility"],"domains":["*.mathjax.org"]},{"name":"Qualtrics","categories":["analytics"],"domains":["*.qualtrics.com"]},{"name":"ConvertMedia","categories":["ad"],"domains":["*.admailtiser.com","*.basebanner.com","*.cmbestsrv.com","*.vidfuture.com","*.zorosrv.com"],"examples":["www.cmbestsrv.com"]},{"name":"Soundest","categories":["ad"],"domains":["*.soundestlink.com","*.soundest.net"]},{"name":"Xaxis","homepage":"https://www.xaxis.com/","categories":["ad"],"domains":["*.247realmedia.com","*.mookie1.com","*.gmads.net"],"examples":["t.mookie1.com","odr.mookie1.com"]},{"name":"Research Online","company":"Skills Development Scotland","categories":["content"],"domains":["*.org.uk"],"examples":["www.researchonline.org.uk"]},{"name":"DistroScale","categories":["ad"],"domains":["*.jsrdn.com"]},{"name":"StackExchange","categories":["social"],"domains":["*.sstatic.net"]},{"name":"BuySellAds","categories":["ad"],"domains":["*.buysellads.com"]},{"name":"Reklama","categories":["ad"],"domains":["*.o2.pl","*.wp.pl"],"examples":["dot.wp.pl","px.o2.pl","px.wp.pl"]},{"name":"eGain","categories":["analytics"],"domains":["*.analytics-egain.com","*.egain.com"]},{"name":"Sonobi","categories":["ad"],"domains":["*.sonobi.com"]},{"name":"AliveChat","company":"AYU Technology Solutions","categories":["customer-success"],"domains":["*.websitealive.com","*.websitealive7.com"]},{"name":"Zolando","categories":["content"],"domains":["*.ztat.net"]},{"name":"AdCurve","categories":["ad"],"domains":["*.shop2market.com"]},{"name":"Pagefair","categories":["ad"],"domains":["*.pagefair.com","*.pagefair.net"]},{"name":"StackAdapt","categories":["ad"],"domains":["*.stackadapt.com"]},{"name":"United Internet","categories":["hosting"],"domains":["*.uicdn.com"]},{"name":"Nanorep","company":"Nanorep Technologies","categories":["customer-success"],"domains":["*.nanorep.com"]},{"name":"Fastest Forward","categories":["analytics"],"domains":["*.gaug.es"]},{"name":"Ceros","categories":["other"],"domains":["ceros.com","view.ceros.com"]},{"name":"Investis","categories":["utility"],"domains":["*.investis.com"]},{"name":"Channel.me","categories":["customer-success"],"domains":["*.channel.me"]},{"name":"ARM","categories":["analytics"],"domains":["*.tag4arm.com"]},{"name":"Webtrends","categories":["analytics"],"domains":["*.webtrends.com","*.webtrendslive.com","d1q62gfb8siqnm.cloudfront.net"]},{"name":"Scoota","categories":["ad"],"domains":["*.rockabox.co","*.scoota.co","d31i2625d5nv27.cloudfront.net","dyjnzf8evxrp2.cloudfront.net"]},{"name":"TrafficJunky","homepage":"https://www.trafficjunky.com/","categories":["ad"],"domains":["*.contentabc.com","*.trafficjunky.net"],"examples":["ads2.contentabc.com","hw-cdn.contentabc.com","media.trafficjunky.net","ads.trafficjunky.net","hw-cdn.trafficjunky.net"]},{"name":"PrintFriendly","categories":["utility"],"domains":["*.printfriendly.com"]},{"name":"Datawrapper","categories":["utility"],"domains":["*.datawrapper.de","*.dwcdn.net"],"examples":["www.datawrapper.de"]},{"name":"Click4Assistance","categories":["customer-success"],"domains":["*.click4assistance.co.uk"]},{"name":"Glassdoor","categories":["content"],"domains":["*.glassdoor.com"]},{"name":"Highwinds","categories":["utility"],"domains":["*.hwcdn.net"]},{"name":"YoYo","categories":["utility"],"domains":["*.goadservices.com"]},{"name":"Webtrekk","categories":["analytics"],"domains":["*.wbtrk.net","*.webtrekk-asia.net","*.webtrekk.net","*.wt-eu02.net"]},{"name":"Fastly Insights","homepage":"https://insights.fastlylabs.com","categories":["analytics"],"domains":["*.fastly-insights.com"],"examples":["www.fastly-insights.com"]},{"name":"HP Optimost","company":"Hewlett-Packard Development Company","categories":["marketing"],"domains":["*.hp.com","d2uncb19xzxhzx.cloudfront.net"],"examples":["by.marketinghub.hp.com","marketinghub.hp.com"]},{"name":"Eyeota","categories":["ad"],"domains":["*.eyeota.net"]},{"name":"PhotoBucket","categories":["content"],"domains":["*.photobucket.com"]},{"name":"ContextWeb","categories":["ad"],"domains":["*.contextweb.com"]},{"name":"Captify Media","categories":["ad"],"domains":["*.cpx.to"]},{"name":"Intent IQ","categories":["ad"],"domains":["*.intentiq.com"]},{"name":"Vindico","company":"Viant","categories":["ad"],"domains":["*.vindicosuite.com"]},{"name":"Pictela (AOL)","categories":["analytics"],"domains":["*.pictela.net"]},{"name":"PubNation","categories":["ad"],"domains":["*.pubnation.com"]},{"name":"Freshchat","homepage":"https://www.freshworks.com/live-chat-software/","categories":["utility"],"domains":["*.freshchat.com"]},{"name":"Bridgewell DSP","homepage":"https://www.bridgewell.com/","categories":["ad"],"domains":["*.scupio.com"],"examples":["img.scupio.com"]},{"name":"PageSense","homepage":"https://www.zoho.com/pagesense/","categories":["analytics"],"domains":["*.pagesense.io"],"examples":["cdn.pagesense.io"]},{"name":"Wicked Reports","homepage":"https://www.wickedreports.com/","categories":["marketing"],"domains":["*.wickedreports.com"],"examples":["widget.wickedreports.com"]},{"name":"Pendo","homepage":"https://www.pendo.io","categories":["analytics"],"domains":["*.pendo.io"],"examples":["app.pendo.io"]},{"name":"Dynatrace","categories":["analytics"],"domains":["*.ruxit.com","js-cdn.dynatrace.com"]},{"name":"Click Guardian","homepage":"https://www.clickguardian.co.uk/","categories":["advertising"],"domains":["*.clickguardian.app","*.clickguardian.co.uk"],"examples":["v2.clickguardian.app","protection.clickguardian.co.uk"]}];
+    },{}],185:[function(require,module,exports){
+    module.exports=require("./lib/subsets/httparchive-nostats.js");
+    
+    },{"./lib/subsets/httparchive-nostats.js":187}],186:[function(require,module,exports){
+    const DOMAIN_IN_URL_REGEX=/:\/\/(\S*?)(:\d+)?(\/|$)/;
+    const DOMAIN_CHARACTERS=/([a-z0-9.-]+\.[a-z0-9]+|localhost)/i;
+    const IP_REGEX=/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;
+    const ROOT_DOMAIN_REGEX=/[^.]+\.([^.]+|(gov|com|co|ne)\.\w{2})$/i;
+    
+    function getDomainFromOriginOrURL(originOrURL){
+    if(typeof originOrURL!=='string')return null;
+    if(originOrURL.length>10000||originOrURL.startsWith('data:'))return null;
+    if(DOMAIN_IN_URL_REGEX.test(originOrURL))return originOrURL.match(DOMAIN_IN_URL_REGEX)[1];
+    if(DOMAIN_CHARACTERS.test(originOrURL))return originOrURL.match(DOMAIN_CHARACTERS)[0];
+    throw new Error(`Unable to find domain in "${originOrURL}"`);
+    }
+    
+    function getRootDomain(originOrURL){
+    const domain=getDomainFromOriginOrURL(originOrURL);
+    if(!domain)return null;
+    if(IP_REGEX.test(domain))return domain;
+    const match=domain.match(ROOT_DOMAIN_REGEX);
+    return match&&match[0]||domain;
+    }
+    
+    function getEntityInDataset(entityByDomain,entityByRootDomain,originOrURL){
+    const domain=getDomainFromOriginOrURL(originOrURL);
+    const rootDomain=getRootDomain(domain);
+    if(!domain||!rootDomain)return undefined;
+    if(entityByDomain.has(domain))return entityByDomain.get(domain);
+    if(entityByRootDomain.has(rootDomain))return entityByRootDomain.get(rootDomain);
+    return undefined;
+    }
+    
+    function createAPIFromDataset(entities_){
+    const entities=JSON.parse(JSON.stringify(entities_));
+    const entityByDomain=new Map();
+    const entityByRootDomain=new Map();
+    
+    for(const entity of entities){
+    if(!entity.company)entity.company=entity.name;
+    entity.totalExecutionTime=Number(entity.totalExecutionTime)||0;
+    entity.totalOccurrences=Number(entity.totalOccurrences)||0;
+    entity.averageExecutionTime=entity.totalExecutionTime/entity.totalOccurrences;
+    
+    for(const domain of entity.domains){
+    if(entityByDomain.has(domain))throw new Error(`Duplicate domain ${domain}`);
+    entityByDomain.set(domain,entity);
+    
+    const rootDomain=getRootDomain(domain);
+    if(domain.startsWith('*.')){
+    entityByRootDomain.set(rootDomain,entity);
+    }
+    }
+    }
+    
+    for(const[rootDomain,entity]of entityByRootDomain.entries()){
+    if(!entity)entityByRootDomain.delete(rootDomain);
+    }
+    
+    const getEntity=getEntityInDataset.bind(null,entityByDomain,entityByRootDomain);
+    return{getEntity,getRootDomain,entities};
+    }
+    
+    module.exports={createAPIFromDataset};
+    
+    },{}],187:[function(require,module,exports){
+    const{createAPIFromDataset}=require('../create-entity-finder-api.js');
+    const entities=require('../../dist/entities-httparchive-nostats.json');
+    module.exports=createAPIFromDataset(entities);
+    
+    },{"../../dist/entities-httparchive-nostats.json":184,"../create-entity-finder-api.js":186}],188:[function(require,module,exports){
+    (function(setImmediate,clearImmediate){
+    var nextTick=require('process/browser.js').nextTick;
+    var apply=Function.prototype.apply;
+    var slice=Array.prototype.slice;
+    var immediateIds={};
+    var nextImmediateId=0;
+    
+    
+    
+    exports.setTimeout=function(){
+    return new Timeout(apply.call(setTimeout,window,arguments),clearTimeout);
+    };
+    exports.setInterval=function(){
+    return new Timeout(apply.call(setInterval,window,arguments),clearInterval);
+    };
+    exports.clearTimeout=
+    exports.clearInterval=function(timeout){timeout.close();};
+    
+    function Timeout(id,clearFn){
+    this._id=id;
+    this._clearFn=clearFn;
+    }
+    Timeout.prototype.unref=Timeout.prototype.ref=function(){};
+    Timeout.prototype.close=function(){
+    this._clearFn.call(window,this._id);
+    };
+    
+    
+    exports.enroll=function(item,msecs){
+    clearTimeout(item._idleTimeoutId);
+    item._idleTimeout=msecs;
+    };
+    
+    exports.unenroll=function(item){
+    clearTimeout(item._idleTimeoutId);
+    item._idleTimeout=-1;
+    };
+    
+    exports._unrefActive=exports.active=function(item){
+    clearTimeout(item._idleTimeoutId);
+    
+    var msecs=item._idleTimeout;
+    if(msecs>=0){
+    item._idleTimeoutId=setTimeout(function onTimeout(){
+    if(item._onTimeout)
+    item._onTimeout();
+    },msecs);
+    }
+    };
+    
+    
+    exports.setImmediate=typeof setImmediate==="function"?setImmediate:function(fn){
+    var id=nextImmediateId++;
+    var args=arguments.length<2?false:slice.call(arguments,1);
+    
+    immediateIds[id]=true;
+    
+    nextTick(function onNextTick(){
+    if(immediateIds[id]){
+    
+    
+    if(args){
+    fn.apply(null,args);
+    }else{
+    fn.call(null);
+    }
+    
+    exports.clearImmediate(id);
+    }
+    });
+    
+    return id;
+    };
+    
+    exports.clearImmediate=typeof clearImmediate==="function"?clearImmediate:function(id){
+    delete immediateIds[id];
+    };
+    }).call(this,require("timers").setImmediate,require("timers").clearImmediate);
+    },{"process/browser.js":158,"timers":188}],189:[function(require,module,exports){
+    (function(global){
+    
+    
+    
+    
+    
+    module.exports=deprecate;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function deprecate(fn,msg){
+    if(config('noDeprecation')){
+    return fn;
+    }
+    
+    var warned=false;
+    function deprecated(){
+    if(!warned){
+    if(config('throwDeprecation')){
+    throw new Error(msg);
+    }else if(config('traceDeprecation')){
+    console.trace(msg);
+    }else{
+    console.warn(msg);
+    }
+    warned=true;
+    }
+    return fn.apply(this,arguments);
+    }
+    
+    return deprecated;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function config(name){
+    
+    try{
+    if(!global.localStorage)return false;
+    }catch(_){
+    return false;
+    }
+    var val=global.localStorage[name];
+    if(null==val)return false;
+    return String(val).toLowerCase()==='true';
+    }
+    
+    }).call(this,typeof global!=="undefined"?global:typeof self!=="undefined"?self:typeof window!=="undefined"?window:{});
+    },{}],190:[function(require,module,exports){
+    arguments[4][94][0].apply(exports,arguments);
+    },{"dup":94}],191:[function(require,module,exports){
+    arguments[4][95][0].apply(exports,arguments);
+    },{"./support/isBuffer":190,"_process":158,"dup":95,"inherits":113}],192:[function(require,module,exports){
+    module.exports={
+    "version":"5.7.0"};
+    
+    },{}],193:[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    const stackPacks=[
+    require('./packs/wordpress.js'),
+    require('./packs/react.js'),
+    require('./packs/angular.js'),
+    require('./packs/amp.js'),
+    require('./packs/magento.js')];
+    
+    
+    module.exports=stackPacks;
+    
+    },{"./packs/amp.js":194,"./packs/angular.js":195,"./packs/magento.js":196,"./packs/react.js":197,"./packs/wordpress.js":198}],194:[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const i18n=require('../../lighthouse-core/lib/i18n/i18n.js');
+    
+    const ampIcon=`data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"%3E%3Cpath d="M171.887 116.28l-53.696 89.36h-9.728l9.617-58.227-30.2.047a4.852 4.852 0 01-4.855-4.855c0-1.152 1.07-3.102 1.07-3.102l53.52-89.254 9.9.043-9.86 58.317 30.413-.043a4.852 4.852 0 014.855 4.855c0 1.088-.427 2.044-1.033 2.854l.004.004zM128 0C57.306 0 0 57.3 0 128s57.306 128 128 128 128-57.306 128-128S198.7 0 128 0z" fill="%230379c4" fill-rule="evenodd"/%3E%3C/svg%3E`;
+    
+    const UIStrings={
+    
+    uses_webp_images:'Consider displaying all your `amp-img` components in WebP formats while specifying an appropriate fallback for other browsers. [Learn more](https://amp.dev/documentation/components/amp-img/#example:-specifying-a-fallback-image).',
+    
+    offscreen_images:'Ensure that you are you using valid `amp-img` tags for your images which automatically lazy-load outside the first viewport. [Learn more](https://amp.dev/documentation/guides-and-tutorials/develop/media_iframes_3p/?format=websites#images).',
+    
+    render_blocking_resources:'Use tools such as [AMP Optimizer](https://github.com/ampproject/amp-toolbox/tree/master/packages/optimizer) to [server-side render AMP layouts](https://amp.dev/documentation/guides-and-tutorials/optimize-and-measure/server-side-rendering/).',
+    
+    unminified_css:'Refer to the [AMP documentation](https://amp.dev/documentation/guides-and-tutorials/develop/style_and_layout/style_pages/) to ensure all your styles are supported.',
+    
+    efficient_animated_content:'For animated content, use [amp-anim](https://amp.dev/documentation/components/amp-anim/) to minimize CPU usage while the content remains offscreen.',
+    
+    uses_responsive_images:'The `amp-img` element supports the `srcset` attribute to specify which image assets to use based on the screen size.  [Learn more](https://amp.dev/documentation/guides-and-tutorials/develop/style_and_layout/art_direction/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    module.exports={
+    id:'amp',
+    iconDataURL:ampIcon,
+    title:'AMP',
+    descriptions:{
+    'uses-webp-images':str_(UIStrings.uses_webp_images),
+    'offscreen-images':str_(UIStrings.offscreen_images),
+    'render-blocking-resources':str_(UIStrings.render_blocking_resources),
+    'unminified-css':str_(UIStrings.unminified_css),
+    'efficient-animated-content':str_(UIStrings.efficient_animated_content),
+    'uses-responsive-images':str_(UIStrings.uses_responsive_images)}};
+    
+    
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/stack-packs/packs/amp.js");
+    },{"../../lighthouse-core/lib/i18n/i18n.js":66}],195:[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const i18n=require('../../lighthouse-core/lib/i18n/i18n.js');
+    
+    const angularIcon=`data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 250 250"%3E%3Cpath fill="%23dd0031" d="M125 30L31.9 63.2l14.2 123.1L125 230l78.9-43.7 14.2-123.1z"/%3E%3Cpath fill="%23c3002f" d="M125 30v22.2-.1V230l78.9-43.7 14.2-123.1L125 30z"/%3E%3Cpath d="M125 52.1L66.8 182.6h21.7l11.7-29.2h49.4l11.7 29.2H183L125 52.1zm17 83.3h-34l17-40.9 17 40.9z" fill="%23fff"/%3E%3C/svg%3E`;
+    
+    const UIStrings={
+    
+    total_byte_weight:'Apply [route-level code-splitting](https://web.dev/route-level-code-splitting-in-angular/) to minimize the size of your JavaScript bundles. Also, consider precaching assets with the [Angular service worker](https://web.dev/precaching-with-the-angular-service-worker/).',
+    
+    unminified_warning:'If you are using Angular CLI, ensure that builds are generated in production mode. [Learn more](https://angular.io/guide/deployment#enable-runtime-production-mode).',
+    
+    unused_javascript:'If you are using Angular CLI, include source maps into your production build to inspect your bundles. [Learn more](https://angular.io/guide/deployment#inspect-the-bundles).',
+    
+    uses_responsive_images:'Consider using the `BreakpointObserver` utility in the Component Dev Kit (CDK) to manage image breakpoints. [Learn more](https://material.angular.io/cdk/layout/overview).',
+    
+    uses_rel_preload:'Preload routes ahead of time to speed up navigation. [Learn more](https://web.dev/route-preloading-in-angular/).',
+    
+    dom_size:'Consider virtual scrolling with the Component Dev Kit (CDK) if very large lists are being rendered. [Learn more](https://web.dev/virtualize-lists-with-angular-cdk/).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    module.exports={
+    id:'angular',
+    iconDataURL:angularIcon,
+    title:'Angular',
+    descriptions:{
+    'total-byte-weight':str_(UIStrings.total_byte_weight),
+    'unminified-css':str_(UIStrings.unminified_warning),
+    'unminified-javascript':str_(UIStrings.unminified_warning),
+    'unused-javascript':str_(UIStrings.unused_javascript),
+    'uses-responsive-images':str_(UIStrings.uses_responsive_images),
+    'uses-rel-preload':str_(UIStrings.uses_rel_preload),
+    'dom-size':str_(UIStrings.dom_size)}};
+    
+    
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/stack-packs/packs/angular.js");
+    },{"../../lighthouse-core/lib/i18n/i18n.js":66}],196:[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const i18n=require('../../lighthouse-core/lib/i18n/i18n.js');
+    
+    const magentoIcon=`data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" fill="%23f26322" viewBox="0 0 1000 1000"%3E%3Cpath d="M916.9 267.4v465.3l-111.3 67.4V331.4l-1.5-.9-303.9-189-304.6 189.2-1.2.8V799L83.1 732.6V267.4l.7-.4L500.3 10l416 257 .6.4zM560.7 468.5v383.3L500.3 890l-61-38.2V306.7l-136 84.3v476.6l197 122.5 196.4-122.5V391l-136-84.3v161.8z"/%3E%3C/svg%3E`;
+    
+    const UIStrings={
+    
+    uses_webp_images:'Consider searching the [Magento Marketplace](https://marketplace.magento.com/catalogsearch/result/?q=webp) for a variety of third-party extensions to leverage newer image formats.',
+    
+    offscreen_images:'Consider modifying your product and catalog templates to make use of the web platform\'s [lazy loading](https://web.dev/native-lazy-loading) feature.',
+    
+    disable_bundling:'Disable Magento\'s built-in [JavaScript bundling and minification](https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/themes/js-bundling.html), and consider using [baler](https://github.com/magento/baler/) instead.',
+    
+    unminified_css:'Enable the "Minify CSS Files" option in your store\'s Developer settings. [Learn more](https://devdocs.magento.com/guides/v2.3/performance-best-practices/configuration.html?itm_source=devdocs&itm_medium=search_page&itm_campaign=federated_search&itm_term=minify%20css%20files).',
+    
+    unminified_javascript:'Use [Terser](https://www.npmjs.com/package/terser) to minify all JavaScript assets outfrom from static content deployment, and disable the built-in minification feature.',
+    
+    unused_javascript:'Disable Magento\'s built-in [JavaScript bundling](https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/themes/js-bundling.html).',
+    
+    uses_optimized_images:'Consider searching the [Magento Marketplace](https://marketplace.magento.com/catalogsearch/result/?q=optimize%20image) for a variety of third party extensions to optimize images.',
+    
+    time_to_first_byte:'Use Magento\'s [Varnish integration](https://devdocs.magento.com/guides/v2.3/config-guide/varnish/config-varnish.html).',
+    
+    uses_rel_preconnect:'Preconnect or dns-prefetch resource hints can be added by [modifying a themes\'s layout](https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/layouts/xml-manage.html).',
+    
+    uses_rel_preload:'`<link rel=preload>` tags can be added by [modifying a themes\'s layout](https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/layouts/xml-manage.html).',
+    
+    critical_request_chains:'If you are not bundling your JavaScript assets, consider using [baler](https://github.com/magento/baler).',
+    
+    font_display:'Specify `@font-display` when [defining custom fonts](https://devdocs.magento.com/guides/v2.3/frontend-dev-guide/css-topics/using-fonts.html).'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    module.exports={
+    id:'magento',
+    iconDataURL:magentoIcon,
+    title:'Magento',
+    descriptions:{
+    'uses-webp-images':str_(UIStrings.uses_webp_images),
+    'offscreen-images':str_(UIStrings.offscreen_images),
+    'total-byte-weight':str_(UIStrings.disable_bundling),
+    'render-blocking-resources':str_(UIStrings.disable_bundling),
+    'unminified-css':str_(UIStrings.unminified_css),
+    'unminified-javascript':str_(UIStrings.unminified_javascript),
+    'unused-javascript':str_(UIStrings.unused_javascript),
+    'uses-optimized-images':str_(UIStrings.uses_optimized_images),
+    'time-to-first-byte':str_(UIStrings.time_to_first_byte),
+    'uses-rel-preconnect':str_(UIStrings.uses_rel_preconnect),
+    'uses-rel-preload':str_(UIStrings.uses_rel_preload),
+    'critical-request-chains':str_(UIStrings.critical_request_chains),
+    'font-display':str_(UIStrings.font_display)}};
+    
+    
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/stack-packs/packs/magento.js");
+    },{"../../lighthouse-core/lib/i18n/i18n.js":66}],197:[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const i18n=require('../../lighthouse-core/lib/i18n/i18n.js');
+    
+    const reactIcon=`data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"%3E %3Cg fill="%2361DAFB"%3E%3Cpath d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/%3E %3Ccircle cx="420.9" cy="296.5" r="45.7"/%3E %3Cpath d="M520.5 78.1z"/%3E%3C/g%3E%3C/svg%3E`;
+    
+    const UIStrings={
+    
+    unminified_css:'If your build system minifies your CSS files automatically, ensure that you are deploying the production build of your application. You can check this with the React Developer Tools extension. [Learn more](https://reactjs.org/docs/optimizing-performance.html#use-the-production-build).',
+    
+    unminified_javascript:'If your build system minifies your JS files automatically, ensure that you are deploying the production build of your application. You can check this with the React Developer Tools extension. [Learn more](https://reactjs.org/docs/optimizing-performance.html#use-the-production-build).',
+    
+    unused_javascript:'If you are not server-side rendering, [split your JavaScript bundles](https://web.dev/code-splitting-suspense/) with `React.lazy()`. Otherwise, code-split using a third-party library such as [loadable-components](https://www.smooth-code.com/open-source/loadable-components/docs/getting-started/).',
+    
+    time_to_first_byte:'If you are server-side rendering any React components, consider using `renderToNodeStream()` or `renderToStaticNodeStream()` to allow the client to receive and hydrate different parts of the markup instead of all at once. [Learn more](https://reactjs.org/docs/react-dom-server.html#rendertonodestream).',
+    
+    redirects:'If you are using React Router, minimize usage of the `<Redirect>` component for [route navigations](https://reacttraining.com/react-router/web/api/Redirect).',
+    
+    user_timings:'Use the React DevTools Profiler, which makes use of the Profiler API, to measure the rendering performance of your components. [Learn more.](https://reactjs.org/blog/2018/09/10/introducing-the-react-profiler.html)',
+    
+    dom_size:'Consider using a “windowing” library like `react-window` to minimize the number of DOM nodes created if you are rendering many repeated elements on the page. [Learn more](https://web.dev/virtualize-long-lists-react-window/). Also, minimize unecessary re-renders using [shouldComponentUpdate](https://reactjs.org/docs/optimizing-performance.html#shouldcomponentupdate-in-action), [PureComponent](https://reactjs.org/docs/react-api.html#reactpurecomponent), or [React.memo](https://reactjs.org/docs/react-api.html#reactmemo) and [skip effects](https://reactjs.org/docs/hooks-effect.html#tip-optimizing-performance-by-skipping-effects) only until certain dependencies have changed if you are using the Effect hook to improve runtime performance.'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    module.exports={
+    id:'react',
+    iconDataURL:reactIcon,
+    title:'React',
+    descriptions:{
+    'unminified-css':str_(UIStrings.unminified_css),
+    'unminified-javascript':str_(UIStrings.unminified_javascript),
+    'unused-javascript':str_(UIStrings.unused_javascript),
+    'time-to-first-byte':str_(UIStrings.time_to_first_byte),
+    'redirects':str_(UIStrings.redirects),
+    'user-timings':str_(UIStrings.user_timings),
+    'dom-size':str_(UIStrings.dom_size)}};
+    
+    
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/stack-packs/packs/react.js");
+    },{"../../lighthouse-core/lib/i18n/i18n.js":66}],198:[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    'use strict';
+    
+    const i18n=require('../../lighthouse-core/lib/i18n/i18n.js');
+    
+    const wordpressIcon=`data:image/svg+xml,%3Csvg viewBox='0 0 122.5 122.5' xmlns='http://www.w3.org/2000/svg'%3E%3Cg fill='%232f3439'%3E%3Cpath d='M8.7 61.3c0 20.8 12.1 38.7 29.6 47.3l-25-68.7c-3 6.5-4.6 13.7-4.6 21.4zM96.7 58.6c0-6.5-2.3-11-4.3-14.5-2.7-4.3-5.2-8-5.2-12.3 0-4.8 3.7-9.3 8.9-9.3h.7a52.4 52.4 0 0 0-79.4 9.9h3.3c5.5 0 14-.6 14-.6 2.9-.2 3.2 4 .4 4.3 0 0-2.9.4-6 .5l19.1 57L59.7 59l-8.2-22.5c-2.8-.1-5.5-.5-5.5-.5-2.8-.1-2.5-4.5.3-4.3 0 0 8.7.7 13.9.7 5.5 0 14-.7 14-.7 2.8-.2 3.2 4 .3 4.3 0 0-2.8.4-6 .5l19 56.5 5.2-17.5c2.3-7.3 4-12.5 4-17z'/%3E%3Cpath d='M62.2 65.9l-15.8 45.8a52.6 52.6 0 0 0 32.3-.9l-.4-.7zM107.4 36a49.6 49.6 0 0 1-3.6 24.2l-16.1 46.5A52.5 52.5 0 0 0 107.4 36z'/%3E%3Cpath d='M61.3 0a61.3 61.3 0 1 0 .1 122.7A61.3 61.3 0 0 0 61.3 0zm0 119.7a58.5 58.5 0 1 1 .1-117 58.5 58.5 0 0 1-.1 117z'/%3E%3C/g%3E%3C/svg%3E`;
+    
+    const UIStrings={
+    
+    unused_css_rules:'Consider reducing, or switching, the number of [WordPress plugins](https://wordpress.org/plugins/) loading unused CSS in your page. To identify plugins that are adding extraneous CSS, try running [code coverage](https://developers.google.com/web/updates/2017/04/devtools-release-notes#coverage) in Chrome DevTools. You can identify the theme/plugin responsible from the URL of the stylesheet. Look out for plugins that have many stylesheets in the list which have a lot of red in code coverage. A plugin should only enqueue a stylesheet if it is actually used on the page.',
+    
+    uses_webp_images:'Consider using a [plugin](https://wordpress.org/plugins/search/convert+webp/) or service that will automatically convert your uploaded images to the optimal formats.',
+    
+    offscreen_images:'Install a [lazy-load WordPress plugin](https://wordpress.org/plugins/search/lazy+load/) that provides the ability to defer any offscreen images, or switch to a theme that provides that functionality. Also consider using [the AMP plugin](https://wordpress.org/plugins/amp/).',
+    
+    total_byte_weight:'Consider showing excerpts in your post lists (e.g. via the more tag), reducing the number of posts shown on a given page, breaking your long posts into multiple pages, or using a plugin to lazy-load comments.',
+    
+    render_blocking_resources:'There are a number of WordPress plugins that can help you [inline critical assets](https://wordpress.org/plugins/search/critical+css/) or [defer less important resources](https://wordpress.org/plugins/search/defer+css+javascript/). Beware that optimizations provided by these plugins may break features of your theme or plugins, so you will likely need to make code changes.',
+    
+    unminified_css:'A number of [WordPress plugins](https://wordpress.org/plugins/search/minify+css/) can speed up your site by concatenating, minifying, and compressing your styles. You may also want to use a build process to do this minification up-front if possible.',
+    
+    unminified_javascript:'A number of [WordPress plugins](https://wordpress.org/plugins/search/minify+javascript/) can speed up your site by concatenating, minifying, and compressing your scripts. You may also want to use a build process to do this minification up front if possible.',
+    
+    efficient_animated_content:'Consider uploading your GIF to a service which will make it available to embed as an HTML5 video.',
+    
+    unused_javascript:'Consider reducing, or switching, the number of [WordPress plugins](https://wordpress.org/plugins/) loading unused JavaScript in your page. To identify plugins that are adding extraneous JS, try running [code coverage](https://developers.google.com/web/updates/2017/04/devtools-release-notes#coverage) in Chrome DevTools. You can identify the theme/plugin responsible from the URL of the script. Look out for plugins that have many scripts in the list which have a lot of red in code coverage. A plugin should only enqueue a script if it is actually used on the page.',
+    
+    uses_long_cache_ttl:'Read about [Browser Caching in WordPress](https://codex.wordpress.org/WordPress_Optimization#Browser_Caching).',
+    
+    uses_optimized_images:'Consider using an [image optimization WordPress plugin](https://wordpress.org/plugins/search/optimize+images/) that compresses your images while retaining quality.',
+    
+    uses_text_compression:'You can enable text compression in your web server configuration.',
+    
+    uses_responsive_images:'Upload images directly through the [media library](https://codex.wordpress.org/Media_Library_Screen) to ensure that the required image sizes are available, and then insert them from the media library or use the image widget to ensure the optimal image sizes are used (including those for the responsive breakpoints). Avoid using `Full Size` images unless the dimensions are adequate for their usage. [Learn More](https://codex.wordpress.org/Inserting_Images_into_Posts_and_Pages#Image_Size).',
+    
+    time_to_first_byte:'Themes, plugins, and server specifications all contribute to server response time. Consider finding a more optimized theme, carefully selecting an optimization plugin, and/or upgrading your server.'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    module.exports={
+    id:'wordpress',
+    iconDataURL:wordpressIcon,
+    title:'WordPress',
+    descriptions:{
+    'unused-css-rules':str_(UIStrings.unused_css_rules),
+    'uses-webp-images':str_(UIStrings.uses_webp_images),
+    'offscreen-images':str_(UIStrings.offscreen_images),
+    'total-byte-weight':str_(UIStrings.total_byte_weight),
+    'render-blocking-resources':str_(UIStrings.render_blocking_resources),
+    'unminified-css':str_(UIStrings.unminified_css),
+    'unminified-javascript':str_(UIStrings.unminified_javascript),
+    'efficient-animated-content':str_(UIStrings.efficient_animated_content),
+    'unused-javascript':str_(UIStrings.unused_javascript),
+    'uses-long-cache-ttl':str_(UIStrings.uses_long_cache_ttl),
+    'uses-optimized-images':str_(UIStrings.uses_optimized_images),
+    'uses-text-compression':str_(UIStrings.uses_text_compression),
+    'uses-responsive-images':str_(UIStrings.uses_responsive_images),
+    'time-to-first-byte':str_(UIStrings.time_to_first_byte)}};
+    
+    
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/stack-packs/packs/wordpress.js");
+    },{"../../lighthouse-core/lib/i18n/i18n.js":66}],199:[function(require,module,exports){
+    module.exports={
+    "npm":{
+    "angular":[
+    {"id":"SNYK-JS-ANGULAR-471885","severity":"medium","semver":{"vulnerable":["<1.6.3"]}},
+    {"id":"SNYK-JS-ANGULAR-471882","severity":"medium","semver":{"vulnerable":["<1.6.5"]}},
+    {"id":"SNYK-JS-ANGULAR-471879","severity":"medium","semver":{"vulnerable":["<1.6.0-rc.0"]}},
+    {"id":"npm:angular:20180202","severity":"medium","semver":{"vulnerable":["<1.6.9"]}},
+    {"id":"npm:angular:20171018","severity":"medium","semver":{"vulnerable":["<1.6.7"]}},
+    {"id":"npm:angular:20160527","severity":"medium","semver":{"vulnerable":[">=1.0.0 <1.2.30"]}},
+    {"id":"npm:angular:20160122","severity":"medium","semver":{"vulnerable":[">=1.3.0 <1.5.0-rc.2"]}},
+    {"id":"npm:angular:20140608","severity":"low","semver":{"vulnerable":["<1.3.0"]}},
+    {"id":"npm:angular:20131113","severity":"high","semver":{"vulnerable":["<1.2.2"]}},
+    {"id":"npm:angular:20140908","severity":"medium","semver":{"vulnerable":["<1.3.0-rc.4"]}},
+    {"id":"npm:angular:20161101","severity":"medium","semver":{"vulnerable":[">=1.5.0 <1.5.9"]}},
+    {"id":"npm:angular:20150909","severity":"high","semver":{"vulnerable":["<1.5.0-beta.2"]}},
+    {"id":"npm:angular:20151205","severity":"medium","semver":{"vulnerable":["<1.5.0-rc.0"]}},
+    {"id":"npm:angular:20151130","severity":"medium","semver":{"vulnerable":["<1.4.10"]}},
+    {"id":"npm:angular:20130622","severity":"medium","semver":{"vulnerable":[">=1.0.0 <1.2.0"]}},
+    {"id":"npm:angular:20150807-1","severity":"medium","semver":{"vulnerable":[">=1.3.1 <1.5.0-beta.0"]}},
+    {"id":"npm:angular:20150807","severity":"high","semver":{"vulnerable":[">=1.0.0 <1.5.0-beta.0"]}},
+    {"id":"npm:angular:20150315","severity":"medium","semver":{"vulnerable":["<1.6.1"]}},
+    {"id":"npm:angular:20150310","severity":"high","semver":{"vulnerable":["<1.5.0-beta.2"]}},
+    {"id":"npm:angular:20141104","severity":"medium","semver":{"vulnerable":["<1.3.2"]}},
+    {"id":"npm:angular:20130621","severity":"medium","semver":{"vulnerable":["<1.2.0"]}},
+    {"id":"npm:angular:20140909","severity":"high","semver":{"vulnerable":[">=1.2.19 <1.2.24"]}},
+    {"id":"npm:angular:20130625","severity":"high","semver":{"vulnerable":["<1.1.5"]}}],
+    
+    "backbone":[
+    {"id":"npm:backbone:20160523","severity":"medium","semver":{"vulnerable":["<= 0.3.3"]}},
+    {"id":"npm:backbone:20110701","severity":"medium","semver":{"vulnerable":["<0.5.0"]}}],
+    
+    "bootstrap":[
+    {"id":"SNYK-JS-BOOTSTRAP-173700","severity":"medium","semver":{"vulnerable":["<3.4.1",">=4.0.0 <4.3.1"]}},
+    {"id":"SNYK-JS-BOOTSTRAP-73560","severity":"medium","semver":{"vulnerable":[">=4.0.0 <4.1.2"]}},
+    {"id":"SNYK-JS-BOOTSTRAP-72890","severity":"medium","semver":{"vulnerable":["<3.4.0"]}},
+    {"id":"SNYK-JS-BOOTSTRAP-72889","severity":"medium","semver":{"vulnerable":["<3.4.0"]}},
+    {"id":"npm:bootstrap:20180529","severity":"medium","semver":{"vulnerable":["<3.4.0",">=4.0.0 <4.1.2"]}},
+    {"id":"npm:bootstrap:20160627","severity":"medium","semver":{"vulnerable":["<3.4.0",">=4.0.0-alpha <4.0.0-beta.2"]}},
+    {"id":"npm:bootstrap:20120510","severity":"medium","semver":{"vulnerable":["<2.1.0"]}}],
+    
+    "dojo":[
+    {"id":"SNYK-JS-DOJO-174934","severity":"medium","semver":{"vulnerable":[">=1.0.0 <1.0.3",">=1.1.0 <1.1.2",">=1.2.0 <1.2.4",">=1.3.0 <1.3.3",">=1.4.0 <1.4.2"]}},
+    {"id":"SNYK-JS-DOJO-174933","severity":"medium","semver":{"vulnerable":["<1.2.0"]}},
+    {"id":"SNYK-JS-DOJO-72305","severity":"medium","semver":{"vulnerable":["<1.14"]}},
+    {"id":"npm:dojo:20180818","severity":"medium","semver":{"vulnerable":["<1.10.10 || >=1.11.0 <1.11.6 || >=1.12.0 <1.12.4 || >=1.13.0 <1.13.1"]}},
+    {"id":"npm:dojo:20160523","severity":"medium","semver":{"vulnerable":["<1.1.0"]}},
+    {"id":"npm:dojo:20100614-6","severity":"medium","semver":{"vulnerable":["<1.4.2"]}},
+    {"id":"npm:dojo:20100614","severity":"high","semver":{"vulnerable":[">=0.4 <0.4.4 || >=1.0 <1.0.3 || >=1.1 <1.1.2 || >=1.2 <1.2.4 || >=1.3 <1.3.3 || >=1.4 <1.4.2"]}},
+    {"id":"npm:dojo:20090409","severity":"medium","semver":{"vulnerable":["<1.1"]}}],
+    
+    "foundation-sites":[
+    {"id":"npm:foundation-sites:20170802","severity":"medium","semver":{"vulnerable":["<6.0.0"]}},
+    {"id":"npm:foundation-sites:20150619","severity":"medium","semver":{"vulnerable":["<5.5.3"]}},
+    {"id":"npm:foundation-sites:20120717","severity":"medium","semver":{"vulnerable":["<3.0.6 >=3.0.0"]}}],
+    
+    "google-closure-library":[
+    {"id":"SNYK-JS-GOOGLECLOSURELIBRARY-174519","severity":"medium","semver":{"vulnerable":[">=20190121.0.0 <20190301.0.0"]}}],
+    
+    "handlebars":[
+    {"id":"SNYK-JS-HANDLEBARS-469063","severity":"high","semver":{"vulnerable":["<4.3.0"]}},
+    {"id":"SNYK-JS-HANDLEBARS-174183","severity":"high","semver":{"vulnerable":["<3.0.7",">=4.1.0 <4.1.2","<4.0.14"]}},
+    {"id":"SNYK-JS-HANDLEBARS-173692","severity":"high","semver":{"vulnerable":["<4.0.13"]}},
+    {"id":"npm:handlebars:20151207","severity":"medium","semver":{"vulnerable":["<4.0.0"]}},
+    {"id":"npm:handlebars:20110425","severity":"medium","semver":{"vulnerable":["<=1.0.0-beta.3"]}}],
+    
+    "highcharts":[
+    {"id":"npm:highcharts:20180225","severity":"high","semver":{"vulnerable":["<6.1.0"]}}],
+    
+    "jquery":[
+    {"id":"SNYK-JS-JQUERY-174006","severity":"medium","semver":{"vulnerable":["<3.4.0"]}},
+    {"id":"npm:jquery:20160529","severity":"low","semver":{"vulnerable":[">=3.0.0-rc1 <3.0.0"]}},
+    {"id":"npm:jquery:20150627","severity":"medium","semver":{"vulnerable":["<1.12.2",">=1.12.3 <2.2.2",">=2.2.3 <3.0.0"]}},
+    {"id":"npm:jquery:20140902","severity":"medium","semver":{"vulnerable":[">=1.4.2 <1.6.2"]}},
+    {"id":"npm:jquery:20120206","severity":"medium","semver":{"vulnerable":[">=1.7.1 <1.9.0"]}},
+    {"id":"npm:jquery:20110606","severity":"medium","semver":{"vulnerable":["<1.6.3"]}}],
+    
+    "jquery-mobile":[
+    {"id":"SNYK-JS-JQUERYMOBILE-174599","severity":"medium","semver":{"vulnerable":["<=1.5.0-alpha.1"]}},
+    {"id":"npm:jquery-mobile:20120802","severity":"medium","semver":{"vulnerable":["<1.2.0"]}}],
+    
+    "jquery-ui":[
+    {"id":"npm:jquery-ui:20121127","severity":"medium","semver":{"vulnerable":["<1.10.0"]}},
+    {"id":"npm:jquery-ui:20100903","severity":"medium","semver":{"vulnerable":["<1.10.0"]}},
+    {"id":"npm:jquery-ui:20160721","severity":"high","semver":{"vulnerable":["<1.12.0"]}}],
+    
+    "knockout":[
+    {"id":"npm:knockout:20180213","severity":"medium","semver":{"vulnerable":["<3.5.0-beta"]}},
+    {"id":"npm:knockout:20130701","severity":"medium","semver":{"vulnerable":["<3.0.0 >=2.1.0-pre"]}}],
+    
+    "lodash":[
+    {"id":"SNYK-JS-LODASH-450202","severity":"high","semver":{"vulnerable":["<4.17.12"]}},
+    {"id":"SNYK-JS-LODASH-73639","severity":"medium","semver":{"vulnerable":["<4.17.11"]}},
+    {"id":"SNYK-JS-LODASH-73638","severity":"high","semver":{"vulnerable":["<4.17.11"]}},
+    {"id":"npm:lodash:20180130","severity":"medium","semver":{"vulnerable":["<4.17.5"]}}],
+    
+    "moment":[
+    {"id":"npm:moment:20170905","severity":"low","semver":{"vulnerable":["<2.19.3"]}},
+    {"id":"npm:moment:20161019","severity":"medium","semver":{"vulnerable":["<2.15.2"]}},
+    {"id":"npm:moment:20160126","severity":"medium","semver":{"vulnerable":["<2.11.2"]}}],
+    
+    "mustache":[
+    {"id":"npm:mustache:20151207","severity":"medium","semver":{"vulnerable":["<2.2.1"]}},
+    {"id":"npm:mustache:20110814","severity":"medium","semver":{"vulnerable":["< 0.3.1"]}}],
+    
+    "react":[
+    {"id":"npm:react:20150318","severity":"high","semver":{"vulnerable":["<0.14.0"]}},
+    {"id":"npm:react:20131217","severity":"medium","semver":{"vulnerable":[">=0.5.0 <0.5.2 || >=0.4.0 <0.4.2"]}}],
+    
+    "riot":[
+    {"id":"npm:riot:20131114","severity":"medium","semver":{"vulnerable":["<0.9.6"]}}],
+    
+    "socket.io":[
+    {"id":"npm:socket.io:20120417","severity":"medium","semver":{"vulnerable":["<0.9.6"]}},
+    {"id":"npm:socket.io:20120323","severity":"medium","semver":{"vulnerable":["<0.9.7"]}}],
+    
+    "vue":[
+    {"id":"npm:vue:20170829","severity":"medium","semver":{"vulnerable":["<2.4.3"]}},
+    {"id":"npm:vue:20170401","severity":"medium","semver":{"vulnerable":["<2.3.0-beta.1"]}},
+    {"id":"npm:vue:20180802","severity":"medium","semver":{"vulnerable":["<2.5.17"]}},
+    {"id":"npm:vue:20180222","severity":"low","semver":{"vulnerable":["<2.5.14"]}}],
+    
+    "yui":[
+    {"id":"npm:yui:20130604","severity":"medium","semver":{"vulnerable":[">=3.0.0 <3.10.1 || =3.10.2"]}},
+    {"id":"npm:yui:20130515","severity":"medium","semver":{"vulnerable":["<3.10.0 >=3.0.0"]}},
+    {"id":"npm:yui:20121030","severity":"medium","semver":{"vulnerable":["<3.0.0 >=2.4.0"]}},
+    {"id":"npm:yui:20120428","severity":"medium","semver":{"vulnerable":["<3.5.1 >=3.5.0-PR1"]}},
+    {"id":"npm:yui:20101025","severity":"medium","semver":{"vulnerable":["<2.8.2 >=2.4.0"]}}]}};
+    
+    
+    
+    },{}],"lighthouse-plugin-publisher-ads/audits/ad-blocking-tasks":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const AdRequestTime=require('../computed/ad-request-time');
+    const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
+    const LongTasks=require('../computed/long-tasks');
+    const{auditNotApplicable}=require('../messages/common-strings');
+    const{Audit}=require('lighthouse');
+    const{getAttributableUrl}=require('../utils/tasks');
+    const{isAdScript}=require('../utils/resource-classification');
+    const{URL}=require('url');
+    
+    const UIStrings={
+    
+    title:'No long tasks blocking ad-related network requests',
+    failureTitle:'Avoid long tasks that block ad-related network requests',
+    description:'Tasks blocking the main thread can delay ad requests and cause '+
+    'a poor user experience. Consider removing long blocking tasks or moving '+
+    'them off of the main thread. These tasks can be especially detrimental to '+
+    'performance on less powerful devices. [Learn more]('+
+    'https://developers.google.com/publisher-ads-audits/reference/audits/ad-blocking-tasks'+
+    ').',
+    failureDisplayValue:'{timeInMs, number, seconds} s blocked',
+    columnScript:'Attributable URL',
+    columnStartTime:'Start',
+    columnDuration:'Duration'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const LONG_TASK_DUR_MS=100;
+    
+    
+    
+    
+    
+    const HEADINGS=[
+    {
+    key:'script',
+    itemType:'url',
+    text:str_(UIStrings.columnScript)},
+    
+    {
+    key:'startTime',
+    itemType:'ms',
+    text:str_(UIStrings.columnStartTime),
+    granularity:1},
+    
+    {
+    key:'duration',
+    itemType:'ms',
+    text:str_(UIStrings.columnDuration),
+    granularity:1}];
+    
+    
+    
+    
+    class AdBlockingTasks extends Audit{
+    
+    
+    
+    
+    static get meta(){
+    return{
+    id:'ad-blocking-tasks',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['traces','devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const metricData={trace,devtoolsLog,settings:context.settings};
+    let longTasks=[];
+    try{
+    longTasks=await LongTasks.request(metricData,context);
+    }catch(e){
+    return auditNotApplicable.InvalidTiming;
+    }
+    
+    if(!longTasks.length){
+    return auditNotApplicable.NoTasks;
+    }
+    
+    const{timing:endTime}=
+    await AdRequestTime.request(metricData,context);
+    
+    if(!(endTime>0)){
+    return auditNotApplicable.NoAdRelatedReq;
+    }
+    
+    let blocking=[];
+    for(const longTask of longTasks){
+    if(longTask.startTime>endTime||
+    longTask.duration<LONG_TASK_DUR_MS){
+    continue;
+    }
+    const scriptUrl=getAttributableUrl(longTask);
+    if(scriptUrl&&isAdScript(new URL(scriptUrl))){
+    continue;
+    }
+    
+    const url=scriptUrl&&new URL(scriptUrl);
+    const displayUrl=url&&url.origin+url.pathname;
+    
+    blocking.push({
+    
+    script:displayUrl,
+    startTime:longTask.startTime,
+    endTime:longTask.endTime,
+    duration:longTask.duration,
+    isTopLevel:!longTask.parent});
+    
+    }
+    
+    const taskLimit=10;
+    if(blocking.length>taskLimit){
+    
+    
+    
+    blocking=blocking.filter(b=>b.script&&b.isTopLevel).
+    
+    sort((a,b)=>b.duration-a.duration).
+    splice(0,taskLimit).
+    sort((a,b)=>a.startTime-b.startTime);
+    }
+    
+    const blockedTime=blocking.reduce(
+    (sum,t)=>t.isTopLevel?sum+t.duration:sum,0);
+    const failed=blocking.length>0;
+    return{
+    score:failed?0:1,
+    displayValue:failed?
+    str_(UIStrings.failureDisplayValue,{timeInMs:blockedTime}):
+    '',
+    details:AdBlockingTasks.makeTableDetails(HEADINGS,blocking)};
+    
+    }}
+    
+    
+    module.exports=AdBlockingTasks;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/ad-blocking-tasks.js");
+    },{"../computed/ad-request-time":128,"../computed/long-tasks":130,"../messages/common-strings":132,"../utils/resource-classification":140,"../utils/tasks":141,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66,"url":"url"}],"lighthouse-plugin-publisher-ads/audits/ad-render-blocking-resources":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
+    const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
+    
+    const{auditNotApplicable}=require('../messages/common-strings');
+    const{Audit}=require('lighthouse');
+    const{getTimingsByRecord}=require('../utils/network-timing');
+    const{isAdTag}=require('../utils/resource-classification');
+    const{URL}=require('url');
+    
+    const UIStrings={
+    title:'Minimal render-blocking resources found',
+    failureTitle:'Avoid render-blocking resources',
+    description:'Render-blocking resources slow down tag load times. Consider '+
+    'loading critical JS/CSS inline or loading scripts asynchronously or '+
+    'loading the tag earlier in the head. [Learn more]('+
+    'https://developers.google.com/web/tools/lighthouse/audits/blocking-resources'+
+    ').',
+    failureDisplayValue:'Up to {timeInMs, number, seconds} s tag load time '+
+    'improvement',
+    columnUrl:'Resource',
+    columnStartTime:'Start',
+    columnDuration:'Duration'};
+    
+    
+    
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    const HEADINGS=[
+    {
+    key:'url',
+    itemType:'url',
+    text:str_(UIStrings.columnUrl)},
+    
+    {
+    key:'startTime',
+    itemType:'ms',
+    text:str_(UIStrings.columnStartTime),
+    granularity:1},
+    
+    {
+    key:'duration',
+    itemType:'ms',
+    text:str_(UIStrings.columnDuration),
+    granularity:1}];
+    
+    
+    
+    
+    class AdRenderBlockingResources extends Audit{
+    
+    
+    
+    
+    static get meta(){
+    return{
+    id:'ad-render-blocking-resources',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    scoreDisplayMode:'binary',
+    description:str_(UIStrings.description),
+    requiredArtifacts:
+    ['LinkElements','ScriptElements','devtoolsLogs','traces']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const networkRecords=await NetworkRecords.request(devtoolsLog,context);
+    const tag=networkRecords.find(req=>isAdTag(new URL(req.url)));
+    if(!tag){
+    return auditNotApplicable.NoTag;
+    }
+    
+    
+    const timingsByRecord=
+    await getTimingsByRecord(trace,devtoolsLog,context);
+    
+    
+    
+    
+    const blockingElementUrls=new Set();
+    for(const link of artifacts.LinkElements){
+    
+    
+    if(link.href&&link.rel=='stylesheet'){
+    
+    blockingElementUrls.add(link.href);
+    }
+    }
+    for(const script of artifacts.ScriptElements){
+    if(script.src&&!script.defer&&!script.async){
+    blockingElementUrls.add(script.src);
+    }
+    }
+    
+    const blockingNetworkRecords=networkRecords.
+    
+    
+    filter(r=>r.endTime<tag.startTime).
+    filter(r=>r!=tag.initiatorRequest).
+    
+    
+    
+    filter(r=>r.initiator.type='parser').
+    filter(r=>blockingElementUrls.has(r.url));
+    
+    const tableView=blockingNetworkRecords.
+    map(r=>Object.assign({url:r.url},timingsByRecord.get(r)));
+    
+    tableView.sort((a,b)=>a.endTime-b.endTime);
+    
+    
+    const endTimes=tableView.map(r=>r.endTime);
+    const opportunity=Math.max(...endTimes)-Math.min(...endTimes);
+    let displayValue='';
+    if(tableView.length>0&&opportunity>0){
+    displayValue=str_(
+    UIStrings.failureDisplayValue,{timeInMs:opportunity});
+    }
+    
+    const failed=tableView.length>0;
+    return{
+    score:failed?0:1,
+    numericValue:tableView.length,
+    displayValue,
+    details:AdRenderBlockingResources.makeTableDetails(HEADINGS,tableView)};
+    
+    }}
+    
+    
+    module.exports=AdRenderBlockingResources;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/ad-render-blocking-resources.js");
+    },{"../messages/common-strings":132,"../utils/network-timing":138,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/lib/i18n/i18n":66,"url":"url"}],"lighthouse-plugin-publisher-ads/audits/ad-request-critical-path":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
+    const{auditNotApplicable}=require('../messages/common-strings');
+    const{Audit}=require('lighthouse');
+    const{computeAdRequestWaterfall}=require('../utils/graph');
+    
+    
+    
+    
+    const UIStrings={
+    title:'Ad request waterfall',
+    failureTitle:'Reduce critical path for ad loading',
+    description:'Consider reducing the number of resources, loading multiple '+
+    'resources simultaneously, or loading resources earlier to improve ad '+
+    'speed. Requests that block ad loading can be found below. [Learn more]('+
+    'https://developers.google.com/publisher-ads-audits/reference/audits/ad-request-critical-path'+
+    ').',
+    displayValue:'{serialResources, plural, =1 {1 serial resource} other {# serial resources}}',
+    columnUrl:'Request',
+    columnType:'Type',
+    columnStartTime:'Start',
+    columnEndTime:'End'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    const HEADINGS=[
+    {
+    key:'url',
+    itemType:'url',
+    text:str_(UIStrings.columnUrl)},
+    
+    {
+    key:'type',
+    itemType:'text',
+    text:str_(UIStrings.columnType)},
+    
+    {
+    key:'startTime',
+    itemType:'ms',
+    text:str_(UIStrings.columnStartTime),
+    granularity:1},
+    
+    {
+    key:'endTime',
+    itemType:'ms',
+    text:str_(UIStrings.columnEndTime),
+    granularity:1}];
+    
+    
+    
+    
+    
+    
+    
+    
+    function computeDepth(requests){
+    let prevEnd=0;
+    let hops=0;
+    for(const{startTime,endTime}of requests){
+    if(startTime>prevEnd){
+    ++hops;
+    prevEnd=endTime;
+    }else{
+    prevEnd=Math.min(prevEnd,endTime);
+    }
+    }
+    return hops;
+    }
+    
+    
+    
+    
+    
+    class AdRequestCriticalPath extends Audit{
+    
+    
+    
+    
+    static get meta(){
+    return{
+    id:'ad-request-critical-path',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    scoreDisplayMode:'informative',
+    requiredArtifacts:['devtoolsLogs','traces']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    
+    const tableView=
+    (await computeAdRequestWaterfall(trace,devtoolsLog,context)).
+    filter(r=>r.startTime>0);
+    if(!tableView.length){
+    return auditNotApplicable.NoAds;
+    }
+    const depth=computeDepth(tableView);
+    const failed=depth>3;
+    
+    for(const row of tableView){
+    delete row.record;
+    }
+    
+    return{
+    numericValue:depth,
+    score:failed?0:1,
+    displayValue:str_(UIStrings.displayValue,
+    {
+    serialResources:depth}),
+    
+    details:AdRequestCriticalPath.makeTableDetails(HEADINGS,tableView)};
+    
+    }}
+    
+    
+    module.exports=AdRequestCriticalPath;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/ad-request-critical-path.js");
+    },{"../messages/common-strings":132,"../utils/graph":137,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/ad-request-from-page-start":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const ComputedAdRequestTime=require('../computed/ad-request-time');
+    const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
+    const{auditNotApplicable,runWarning}=require('../messages/common-strings');
+    const{Audit}=require('lighthouse');
+    
+    const UIStrings={
+    title:'First ad request time',
+    failureTitle:'Reduce time to send the first ad request',
+    description:'This metric measures the elapsed time from the start of page '+
+    'load until the first ad request is made. Delayed ad requests will '+
+    'decrease impressions and viewability, and have a negative impact on ad '+
+    'revenue. [Learn more]('+
+    'https://developers.google.com/publisher-ads-audits/reference/audits/metrics'+
+    ').',
+    displayValue:'{timeInMs, number, seconds} s'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    const PODR=1500;
+    const MEDIAN=3500;
+    
+    
+    
+    
+    class AdRequestFromPageStart extends Audit{
+    
+    
+    
+    
+    static get meta(){
+    return{
+    id:'ad-request-from-page-start',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    
+    scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['devtoolsLogs','traces']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const metricData={trace,devtoolsLog,settings:context.settings};
+    
+    const{timing}=await ComputedAdRequestTime.request(metricData,context);
+    if(!(timing>0)){
+    context.LighthouseRunWarnings.push(runWarning.NoAds);
+    return auditNotApplicable.NoAds;
+    }
+    
+    let normalScore=Audit.computeLogNormalScore(timing,PODR,MEDIAN);
+    
+    
+    if(normalScore>=.9){
+    normalScore=1;
+    }
+    
+    return{
+    numericValue:timing*1e-3,
+    score:normalScore,
+    displayValue:str_(UIStrings.displayValue,{timeInMs:timing})};
+    
+    }}
+    
+    
+    module.exports=AdRequestFromPageStart;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/ad-request-from-page-start.js");
+    },{"../computed/ad-request-time":128,"../messages/common-strings":132,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/ad-top-of-viewport":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
+    const{auditNotApplicable}=require('../messages/common-strings');
+    const{Audit}=require('lighthouse');
+    const{isAdIframe}=require('../utils/resource-classification');
+    
+    const UIStrings={
+    title:'No ad found at the very top of the viewport',
+    failureTitle:'Move the top ad further down the page',
+    description:'Over 10% of ads are never viewed because users scroll past '+
+    'them before they become viewable. By moving ad slots away from the very '+
+    'top of the viewport, users are more likely to see ads before scrolling '+
+    'away. [Learn more]('+
+    'https://developers.google.com/publisher-ads-audits/reference/audits/ad-top-of-viewport'+
+    ').',
+    failureDisplayValue:'A scroll of {valueInPx, number} px would hide half of your topmost ad',
+    columnSlot:'Top Slot ID'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    const SCROLL_PX_THRESHOLD=100;
+    
+    
+    
+    
+    
+    const HEADINGS=[
+    {key:'slot',itemType:'text',text:str_(UIStrings.columnSlot)}];
+    
+    
+    
+    
+    class AdTopOfViewport extends Audit{
+    
+    
+    
+    
+    static get meta(){
+    return{
+    id:'ad-top-of-viewport',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['ViewportDimensions','IFrameElements']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    const viewport=artifacts.ViewportDimensions;
+    const slots=artifacts.IFrameElements.filter(isAdIframe).
+    filter(slot=>
+    slot.clientRect.width*slot.clientRect.height>1&&
+    !slot.isPositionFixed).
+    map(slot=>({
+    midpoint:slot.clientRect.top+slot.clientRect.height/2,
+    id:slot.id}));
+    
+    
+    if(!slots.length){
+    return auditNotApplicable.NoVisibleSlots;
+    }
+    
+    const topSlot=slots.reduce((a,b)=>a.midpoint<b.midpoint?a:b);
+    
+    const inViewport=topSlot.midpoint<viewport.innerHeight;
+    
+    if(!inViewport){
+    return auditNotApplicable.NoAdsViewport;
+    }
+    
+    const score=inViewport&&topSlot.midpoint<SCROLL_PX_THRESHOLD?0:1;
+    
+    return{
+    score,
+    numericValue:topSlot.midpoint,
+    
+    displayValue:score?'':
+    str_(UIStrings.failureDisplayValue,{valueInPx:topSlot.midpoint}),
+    details:AdTopOfViewport.makeTableDetails(
+    HEADINGS,
+    score?[]:[{slot:topSlot.id}])};
+    
+    
+    }}
+    
+    
+    module.exports=AdTopOfViewport;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/ad-top-of-viewport.js");
+    },{"../messages/common-strings":132,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/ads-in-viewport":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const{auditNotApplicable}=require('../messages/common-strings');
+    const{Audit}=require('lighthouse');
+    
+    const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
+    const{isAdIframe}=require('../utils/resource-classification');
+    const{isBoxInViewport}=require('../utils/geometry');
+    
+    const UIStrings={
+    title:'Few or no ads loaded outside viewport',
+    failureTitle:'Avoid loading ads until they are nearly on-screen',
+    description:'Too many ads loaded outside the viewport lowers viewability '+
+    'rates and impacts user experience. Consider loading ads below the fold '+
+    'lazily as the user scrolls down. Consider using GPT\'s [Lazy Loading API]('+
+    'https://developers.google.com/doubleclick-gpt/reference#googletag.PubAdsService_enableLazyLoad'+
+    '). [Learn more]('+
+    'https://developers.google.com/publisher-ads-audits/reference/audits/ads-in-viewport'+
+    ').',
+    failureDisplayValue:'{hiddenAds, plural, =1 {1 ad} '+
+    'other {# ads}} out of view',
+    columnSlot:'Slots Outside Viewport'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    const HEADINGS=[
+    {key:'slot',itemType:'text',text:str_(UIStrings.columnSlot)}];
+    
+    
+    
+    class AdsInViewport extends Audit{
+    
+    
+    
+    
+    static get meta(){
+    return{
+    id:'ads-in-viewport',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['ViewportDimensions','IFrameElements']};
+    
+    }
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    const viewport=artifacts.ViewportDimensions;
+    const slots=artifacts.IFrameElements.
+    filter(iframe=>isAdIframe(iframe)&&
+    iframe.clientRect.height*iframe.clientRect.width>1);
+    
+    if(!slots.length){
+    return auditNotApplicable.NoVisibleSlots;
+    }
+    
+    
+    const nonvisible=slots.
+    filter(slot=>!isBoxInViewport(slot.clientRect,viewport)).
+    map(slot=>({slot:slot.id})).
+    sort((a,b)=>a.slot.localeCompare(b.slot));
+    
+    const visibleCount=slots.length-nonvisible.length;
+    
+    return{
+    numericValue:visibleCount/slots.length,
+    score:nonvisible.length>3?0:1,
+    displayValue:nonvisible.length?
+    str_(UIStrings.failureDisplayValue,{hiddenAds:nonvisible.length}):
+    '',
+    details:AdsInViewport.makeTableDetails(HEADINGS,nonvisible)};
+    
+    }}
+    
+    
+    module.exports=AdsInViewport;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/ads-in-viewport.js");
+    },{"../messages/common-strings":132,"../utils/geometry":136,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/async-ad-tags":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const array=require('../utils/array.js');
+    const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
+    
+    const MainResource=require('lighthouse/lighthouse-core/computed/main-resource');
+    const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
+    const{auditNotApplicable}=require('../messages/common-strings');
+    const{Audit}=require('lighthouse');
+    const{isAdTag,isStaticRequest}=require('../utils/resource-classification');
+    const{URL}=require('url');
+    
+    const UIStrings={
+    title:'Ad tag is loaded asynchronously',
+    failureTitle:'Load ad tag asynchronously',
+    description:'Loading the ad tag synchronously blocks content rendering '+
+    'until the tag is fetched and loaded. Consider using the `async` attribute '+
+    'to load gpt.js and/or adsbygoogle.js asynchronously. [Learn more]('+
+    'https://developers.google.com/publisher-ads-audits/reference/audits/async-ad-tags'+
+    ').'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    function isAsync(tagReq){
+    
+    
+    
+    
+    return tagReq.priority=='Low'||isStaticRequest(tagReq);
+    }
+    
+    
+    class AsyncAdTags extends Audit{
+    
+    
+    
+    
+    static get meta(){
+    return{
+    id:'async-ad-tags',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['devtoolsLogs','URL']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const networkRecords=await NetworkRecords.request(devtoolsLog,context);
+    const mainResource=
+    await MainResource.request({URL:artifacts.URL,devtoolsLog},context);
+    const tagReqs=networkRecords.
+    filter(req=>isAdTag(new URL(req.url))).
+    filter(req=>req.frameId===mainResource.frameId);
+    
+    if(!tagReqs.length){
+    return auditNotApplicable.NoTag;
+    }
+    
+    const numAsync=array.count(tagReqs,isAsync);
+    const numTags=tagReqs.length;
+    return{
+    score:Number(numAsync===numTags)};
+    
+    }}
+    
+    
+    module.exports=AsyncAdTags;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/async-ad-tags.js");
+    },{"../messages/common-strings":132,"../utils/array.js":133,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/computed/main-resource":11,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/lib/i18n/i18n":66,"url":"url"}],"lighthouse-plugin-publisher-ads/audits/bid-request-from-page-start":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const ComputedBidRequestTime=require('../computed/bid-request-time');
+    const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
+    const{auditNotApplicable}=require('../messages/common-strings');
+    const{Audit}=require('lighthouse');
+    
+    const UIStrings={
+    title:'First bid request time',
+    failureTitle:'Reduce time to send the first bid request',
+    description:'This metric measures the elapsed time from the start of page '+
+    'load until the first bid request is made. Delayed bid requests will '+
+    'decrease impressions and viewability, and have a negative impact on ad '+
+    'revenue. [Learn more]('+
+    'https://developers.google.com/publisher-ads-audits/reference/audits/metrics'+
+    ').',
+    displayValue:'{timeInMs, number, seconds} s'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    const PODR=1500;
+    const MEDIAN=3500;
+    
+    
+    
+    
+    class BidRequestFromPageStart extends Audit{
+    
+    
+    
+    
+    static get meta(){
+    return{
+    id:'bid-request-from-page-start',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    
+    scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['devtoolsLogs','traces']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const metricData={trace,devtoolsLog,settings:context.settings};
+    
+    const{timing}=await ComputedBidRequestTime.request(metricData,context);
+    if(!(timing>0)){
+    return auditNotApplicable.NoBids;
+    }
+    
+    let normalScore=Audit.computeLogNormalScore(timing,PODR,MEDIAN);
+    
+    
+    if(normalScore>=.9){
+    normalScore=1;
+    }
+    
+    return{
+    numericValue:timing*1e-3,
+    score:normalScore,
+    displayValue:str_(UIStrings.displayValue,{timeInMs:timing})};
+    
+    }}
+    
+    
+    module.exports=BidRequestFromPageStart;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/bid-request-from-page-start.js");
+    },{"../computed/bid-request-time":129,"../messages/common-strings":132,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/blocking-load-events":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
+    const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
+    
+    const TraceOfTab=require('lighthouse/lighthouse-core/computed/trace-of-tab');
+    const{auditNotApplicable}=require('../messages/common-strings');
+    const{Audit}=require('lighthouse');
+    const{computeAdRequestWaterfall}=require('../utils/graph');
+    const{getTimingsByRecord}=require('../utils/network-timing');
+    
+    
+    
+    
+    const UIStrings={
+    title:'Ads not blocked by load events',
+    failureTitle:'Avoid waiting on load events',
+    description:'Waiting on load events increases ad latency. '+
+    'To speed up ads, eliminate the following load event handlers.',
+    displayValue:'{timeInMs, number, seconds} s blocked',
+    columnEvent:'Event Name',
+    columnTime:'Event Time',
+    columnScript:'Script',
+    columnBlockedUrl:'Blocked URL',
+    columnFunctionName:'Function'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    const HEADINGS=[
+    {key:'eventName',itemType:'text',text:str_(UIStrings.columnEvent)},
+    {key:'time',itemType:'ms',text:str_(UIStrings.columnTime),granularity:1},
+    {key:'url',itemType:'url',text:str_(UIStrings.columnScript)},
+    {key:'functionName',itemType:'text',text:str_(UIStrings.columnFunctionName)}];
+    
+    
+    
+    
+    
+    
+    
+    
+    function findOriginalCallFrame(request){
+    const{record}=request;
+    let stack=record&&record.initiator&&record.initiator.stack;
+    if(!stack){
+    return undefined;
+    }
+    while(stack.parent){
+    stack=stack.parent;
+    }
+    return stack.callFrames[stack.callFrames.length-1];
+    }
+    
+    
+    
+    
+    
+    function findTraceEventOfCallFrame(callFrame,traceEvents){
+    return traceEvents.find(e=>e.name=='FunctionCall'&&
+    e.args.data&&
+    
+    e.args.data.functionName==callFrame.functionName&&
+    
+    e.args.data.scriptId==callFrame.scriptId&&
+    
+    e.args.data.url==callFrame.url&&
+    
+    
+    Math.abs(e.args.data.lineNumber==callFrame.lineNumber)<2&&
+    
+    Math.abs(e.args.data.columnNumber==callFrame.columnNumber)<2);
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function findEventIntervals(eventName,traceEvents){
+    let openInterval={};
+    const intervals=[];
+    for(const e of traceEvents){
+    if(e.name==`${eventName}EventStart`){
+    openInterval={start:e.ts,end:Infinity,eventName};
+    }else if(e.name==`${eventName}EventEnd`){
+    openInterval.end=e.ts;
+    intervals.push(openInterval);
+    }
+    }
+    return intervals;
+    }
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function quantifyBlockedTime(blockingEvent,networkRecords,timingsByRecord){
+    const eventScript=networkRecords.find(
+    r=>r.url==blockingEvent.url);
+    const blockedRequest=networkRecords.find(
+    r=>r.url==blockingEvent.blockedUrl);
+    if(!eventScript||!blockedRequest){
+    return 0;
+    }
+    const scriptLoadTime=timingsByRecord.get(eventScript);
+    const blockedRequestLoadTime=timingsByRecord.get(blockedRequest);
+    if(!scriptLoadTime||!blockedRequestLoadTime){
+    return 0;
+    }
+    return blockedRequestLoadTime.startTime-scriptLoadTime.endTime;
+    }
+    
+    
+    
+    
+    
+    class BlockingLoadEvents extends Audit{
+    
+    
+    
+    
+    static get meta(){
+    return{
+    id:'blocking-load-events',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['devtoolsLogs','traces']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const networkRecords=await NetworkRecords.request(devtoolsLog,context);
+    const{timings,processEvents}=await TraceOfTab.request(trace,context);
+    
+    const timingsByRecord=
+    await getTimingsByRecord(trace,devtoolsLog,context);
+    
+    const criticalRequests=
+    (await computeAdRequestWaterfall(trace,devtoolsLog,context)).
+    
+    sort((a,b)=>a.startTime-b.startTime);
+    
+    if(!criticalRequests.length){
+    return auditNotApplicable.NoAdRelatedReq;
+    }
+    
+    const eventTimes=[
+    ...findEventIntervals('domContentLoaded',processEvents),
+    ...findEventIntervals('load',processEvents)];
+    
+    const blockingEvents=[];
+    const seen=new Set();
+    for(const r of criticalRequests){
+    const callFrame=findOriginalCallFrame(r);
+    if(!callFrame){
+    
+    
+    continue;
+    }
+    const json=JSON.stringify(callFrame);
+    if(seen.has(json)){
+    
+    continue;
+    }
+    seen.add(json);
+    const traceEvent=findTraceEventOfCallFrame(callFrame,processEvents);
+    if(!traceEvent){
+    continue;
+    }
+    const interval=eventTimes.find(interval=>
+    interval.start<=traceEvent.ts&&traceEvent.ts<=interval.end);
+    if(interval){
+    
+    const blockingEvent=Object.assign({
+    eventName:interval.eventName,
+    blockedUrl:r.url,
+    time:timings[interval.eventName],
+    blockedTime:Infinity},
+    callFrame);
+    blockingEvent.blockedTime=quantifyBlockedTime(
+    blockingEvent,networkRecords,timingsByRecord);
+    blockingEvents.push(blockingEvent);
+    }
+    }
+    
+    const failed=blockingEvents.length>0;
+    let blockedTime=0;
+    if(failed){
+    blockedTime=Math.min(...blockingEvents.map(e=>e.blockedTime));
+    }
+    return{
+    numericValue:blockingEvents.length,
+    score:failed?0:1,
+    displayValue:failed&&blockedTime?
+    str_(UIStrings.displayValue,{timeInMs:blockedTime}):
+    '',
+    details:BlockingLoadEvents.makeTableDetails(HEADINGS,blockingEvents)};
+    
+    }}
+    
+    
+    module.exports=BlockingLoadEvents;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/blocking-load-events.js");
+    },{"../messages/common-strings":132,"../utils/graph":137,"../utils/network-timing":138,"lighthouse":54,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/computed/trace-of-tab":39,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/bottleneck-requests":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
+    const{auditNotApplicable}=require('../messages/common-strings');
+    const{Audit}=require('lighthouse');
+    const{computeAdRequestWaterfall}=require('../utils/graph');
+    
+    
+    
+    
+    const UIStrings={
+    title:'No bottleneck requests found',
+    failureTitle:'Avoid bottleneck requests',
+    description:'Speed up, load earlier, parallelize, or eliminate the '+
+    'following requests and their dependencies in order to speed up ad '+
+    'loading.',
+    displayValue:'{blockedTime, number, seconds} s spent blocked on requests',
+    columnUrl:'Blocking Request',
+    columnInitiatorUrl:'Initiator Request',
+    columnStartTime:'Start',
+    columnSelfTime:'Exclusive Time',
+    columnDuration:'Total Time'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    
+    const HEADINGS=[
+    {
+    key:'url',
+    itemType:'url',
+    text:str_(UIStrings.columnUrl)},
+    
+    {
+    key:'selfTime',
+    itemType:'ms',
+    text:str_(UIStrings.columnSelfTime),
+    granularity:1},
+    
+    {
+    key:'duration',
+    itemType:'ms',
+    text:str_(UIStrings.columnDuration),
+    granularity:1}];
+    
+    
+    
+    
+    
+    
+    
+    class BottleneckRequests extends Audit{
+    
+    
+    
+    
+    static get meta(){
+    return{
+    id:'bottleneck-requests',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['devtoolsLogs','traces']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    
+    const waterfall=
+    (await computeAdRequestWaterfall(trace,devtoolsLog,context)).
+    filter(r=>r.startTime>0);
+    if(!waterfall.length){
+    return auditNotApplicable.NoAdRelatedReq;
+    }
+    const CRITICAL_SELF_TIME_MS=250;
+    const CRITICAL_DURATION_MS=1000;
+    
+    const isBottleneck=r=>
+    r.selfTime>CRITICAL_SELF_TIME_MS||r.duration>CRITICAL_DURATION_MS;
+    
+    
+    const cost=r=>r.selfTime*3+r.duration;
+    const criticalRequests=waterfall.
+    filter(isBottleneck).
+    sort((a,b)=>cost(b)-cost(a)).
+    
+    slice(0,5);
+    const blockedTime=
+    
+    criticalRequests.reduce((sum,r)=>sum+r.selfTime,0)/1000;
+    const failed=blockedTime*1e3>CRITICAL_SELF_TIME_MS*4;
+    
+    for(const row of criticalRequests){
+    delete row.record;
+    }
+    return{
+    numericValue:criticalRequests.length,
+    score:failed?0:1,
+    displayValue:failed?str_(UIStrings.displayValue,{blockedTime}):'',
+    details:
+    BottleneckRequests.makeTableDetails(HEADINGS,criticalRequests)};
+    
+    }}
+    
+    
+    module.exports=BottleneckRequests;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/bottleneck-requests.js");
+    },{"../messages/common-strings":132,"../utils/graph":137,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/duplicate-tags":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
+    const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
+    const{auditNotApplicable}=require('../messages/common-strings');
+    const{Audit}=require('lighthouse');
+    const{containsAnySubstring}=require('../utils/resource-classification');
+    const{URL}=require('url');
+    
+    const UIStrings={
+    title:'No duplicate tags found in any frame',
+    failureTitle:'Load tags only once per frame',
+    description:'Loading a tag more than once in the same frame is redundant '+
+    'and adds overhead without benefit. [Learn more]('+
+    'https://developers.google.com/publisher-ads-audits/reference/audits/duplicate-tags'+
+    ').',
+    failureDisplayValue:'{duplicateTags, plural, =1 {1 duplicate tag} other {# duplicate tags}}',
+    columnScript:'Script',
+    columnNumReqs:'Duplicate Requests',
+    columnFrameId:'Frame ID'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    const tags=[
+    'googletagservices.com/tag/js/gpt.js',
+    'securepubads.g.doubleclick.net/tag/js/gpt.js',
+    'pagead2.googlesyndication.com/pagead/js/adsbygoogle.js',
+    'imasdk.googleapis.com/js/sdkloader/ima3.js',
+    'google-analytics.com/analytics.js'];
+    
+    
+    
+    
+    
+    
+    const HEADINGS=[
+    {key:'script',itemType:'url',text:str_(UIStrings.columnScript)},
+    {key:'numReqs',itemType:'text',text:str_(UIStrings.columnNumReqs)},
+    {key:'frameId',itemType:'text',text:str_(UIStrings.columnFrameId)}];
+    
+    
+    
+    
+    
+    class DuplicateTags extends Audit{
+    
+    
+    
+    
+    static get meta(){
+    return{
+    id:'duplicate-tags',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const devtoolsLogs=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const networkRecords=await NetworkRecords.request(devtoolsLogs,context);
+    const tagReqs=networkRecords.
+    filter(record=>containsAnySubstring(record.url,tags));
+    
+    if(!tagReqs.length){
+    return auditNotApplicable.NoTags;
+    }
+    
+    const tagsByFrame={};
+    tagReqs.forEach(record=>{
+    const frameId=record.frameId||'';
+    
+    const script=new URL(record.url).pathname;
+    if(!tagsByFrame[frameId]){
+    tagsByFrame[frameId]={};
+    }
+    tagsByFrame[frameId][script]=
+    tagsByFrame[frameId][script]?tagsByFrame[frameId][script]+1:1;
+    });
+    
+    
+    const dups=[];
+    for(const frameId of Object.keys(tagsByFrame)){
+    for(const script of Object.keys(tagsByFrame[frameId])){
+    const numReqs=tagsByFrame[frameId][script];
+    if(numReqs>1){
+    dups.push({script,numReqs,frameId});
+    }
+    }
+    }
+    
+    return{
+    numericValue:dups.length,
+    score:dups.length?0:1,
+    details:DuplicateTags.makeTableDetails(HEADINGS,dups),
+    displayValue:dups.length?
+    str_(UIStrings.failureDisplayValue,{duplicateTags:dups.length}):
+    ''};
+    
+    }}
+    
+    
+    module.exports=DuplicateTags;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/duplicate-tags.js");
+    },{"../messages/common-strings":132,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/lib/i18n/i18n":66,"url":"url"}],"lighthouse-plugin-publisher-ads/audits/first-ad-render":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const ComputedAdRenderTime=require('../computed/ad-render-time');
+    const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
+    const{auditNotApplicable,runWarning}=require('../messages/common-strings');
+    const{Audit}=require('lighthouse');
+    
+    const UIStrings={
+    title:'Latency of first ad render',
+    failureTitle:'Reduce time to render first ad',
+    description:'This metric measures the time for the first ad iframe to '+
+    'render from page navigation. [Learn more]('+
+    'https://developers.google.com/publisher-ads-audits/reference/audits/metrics'+
+    ').',
+    displayValue:'{timeInMs, number, seconds} s'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    const PODR=2700;
+    const MEDIAN=3700;
+    
+    
+    
+    
+    class FirstAdRender extends Audit{
+    
+    
+    
+    
+    static get meta(){
+    
+    return{
+    id:'first-ad-render',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    
+    scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
+    
+    requiredArtifacts:['devtoolsLogs','traces']};
+    
+    }
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const metricData={
+    devtoolsLog,
+    trace,
+    settings:context.settings};
+    
+    const{timing}=await ComputedAdRenderTime.request(metricData,context);
+    
+    if(!(timing>0)){
+    context.LighthouseRunWarnings.push(runWarning.NoAdRendered);
+    return auditNotApplicable.NoAdRendered;
+    }
+    
+    let normalScore=
+    Audit.computeLogNormalScore(timing,PODR,MEDIAN);
+    if(normalScore>=0.9)normalScore=1;
+    
+    return{
+    numericValue:timing*1e-3,
+    score:normalScore,
+    displayValue:
+    str_(UIStrings.displayValue,{timeInMs:timing})};
+    
+    }}
+    
+    module.exports=FirstAdRender;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/first-ad-render.js");
+    },{"../computed/ad-render-time":127,"../messages/common-strings":132,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/full-width-slots":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
+    const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
+    const{auditNotApplicable}=require('../messages/common-strings');
+    const{Audit}=require('lighthouse');
+    const{isAdRequest}=require('../utils/resource-classification');
+    const{URL}=require('url');
+    
+    const UIStrings={
+    title:'Ad slots effectively use horizontal space',
+    failureTitle:'Increase the width of ad slots',
+    description:'Ad slots that utilize most of the page width generally '+
+    'experience increased click-through rate over smaller ad sizes. We '+
+    'recommend leaving no more than 25% of the viewport width unutilized on '+
+    'mobile devices.',
+    failureDisplayValue:'{percentUnused, number, percent} of viewport width '+
+    'is underutilized'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    class FullWidthSlots extends Audit{
+    
+    
+    
+    
+    static get meta(){
+    return{
+    id:'full-width-slots',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['ViewportDimensions','devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const devtoolsLogs=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const networkRecords=await NetworkRecords.request(devtoolsLogs,context);
+    const viewport=artifacts.ViewportDimensions;
+    const vpWidth=viewport.innerWidth;
+    
+    
+    const adRequestUrls=networkRecords.
+    filter(isAdRequest).
+    map(record=>new URL(record.url));
+    
+    if(!adRequestUrls.length){
+    return auditNotApplicable.NoAds;
+    }
+    
+    const sizeArrs=adRequestUrls.map(url=>
+    url.searchParams.get('prev_iu_szs')||url.searchParams.get('sz'));
+    
+    
+    
+    const sizes=sizeArrs.join('|').split(/[|,]/);
+    
+    const widths=sizes.map(size=>parseInt(size.split('x')[0])).
+    filter(w=>w<=vpWidth&&w>1);
+    
+    if(!widths.length){
+    return auditNotApplicable.NoValidAdWidths;
+    }
+    
+    const maxWidth=Math.max(...widths);
+    
+    const pctUnoccupied=1-maxWidth/vpWidth;
+    
+    const score=pctUnoccupied>.25?0:1;
+    
+    
+    return{
+    score,
+    numericValue:pctUnoccupied,
+    
+    displayValue:score?
+    '':
+    str_(UIStrings.failureDisplayValue,{percentUnused:pctUnoccupied})};
+    
+    }}
+    
+    
+    module.exports=FullWidthSlots;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/full-width-slots.js");
+    },{"../messages/common-strings":132,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/lib/i18n/i18n":66,"url":"url"}],"lighthouse-plugin-publisher-ads/audits/gpt-bids-parallel":[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
+    const{assert}=require('../utils/asserts');
+    const{auditNotApplicable}=require('../messages/common-strings');
+    const{Audit}=require('lighthouse');
+    const{getCriticalGraph}=require('../utils/graph');
+    const{getTimingsByRecord}=require('../utils/network-timing');
+    const{isGptImplTag,isBidRequest,getAbbreviatedUrl,getHeaderBidder}=require('../utils/resource-classification');
+    
+    
+    
+    
+    const id='gpt-bids-parallel';
+    const UIStrings={
+    title:'GPT and bids loaded in parallel',
+    failureTitle:'Load GPT and bids in parallel',
+    description:'To optimize ad loading, bid requests should not wait on GPT to load. This issue can often be fixed by making sure that bid requests do not wait on `googletag.pubadsReady` or `googletag.cmd.push`.',
+    columnBidder:'Bidder',
+    columnUrl:'URL',
+    columnStartTime:'Start',
+    columnDuration:'Duration'};
+    
+    
+    
+    
+    
+    
+    const HEADINGS=[
+    {key:'bidder',itemType:'text',text:UIStrings.columnBidder},
+    {key:'url',itemType:'url',text:UIStrings.columnUrl},
+    {key:'startTime',itemType:'ms',text:UIStrings.columnStartTime},
+    {key:'duration',itemType:'ms',text:UIStrings.columnDuration}];
+    
+    
+    
+    
+    
+    class GptBidsInParallel extends Audit{
+    
+    
+    
+    
+    static get meta(){
+    return{
+    id,
+    title:UIStrings.title,
+    failureTitle:UIStrings.failureTitle,
+    description:UIStrings.description,
+    requiredArtifacts:['devtoolsLogs','traces']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const network=await NetworkRecords.request(devtoolsLog,context);
+    
+    const pubadsImpl=network.find(r=>isGptImplTag(r.url));
+    if(!pubadsImpl){
+    return auditNotApplicable.NoGpt;
+    }
+    
+    const bids=network.filter(isBidRequest).
+    filter(b=>b.frameId==pubadsImpl.frameId);
+    if(!bids.length){
+    return auditNotApplicable.NoBids;
+    }
+    
+    
+    const timingsByRecord=await getTimingsByRecord(
+    trace,devtoolsLog,context);
+    const tableView=[];
+    const seen=new Set();
+    for(const bid of bids){
+    if(getCriticalGraph(network,trace.traceEvents,bid).has(pubadsImpl)){
+    const{startTime,endTime}=timingsByRecord.get(bid)||bid;
+    const bidder=assert(getHeaderBidder(bid.url));
+    if(seen.has(bidder)){
+    
+    
+    continue;
+    }
+    seen.add(bidder);
+    tableView.push({
+    bidder,
+    url:getAbbreviatedUrl(bid.url),
+    startTime,
+    duration:endTime-startTime});
+    
+    }
+    }
+    const failed=tableView.length>0;
+    return{
+    numericValue:tableView.length,
+    score:failed?0:1,
+    details:failed?
+    GptBidsInParallel.makeTableDetails(HEADINGS,tableView):undefined};
+    
+    }}
+    
+    
+    module.exports=GptBidsInParallel;
+    module.exports.UIStrings=UIStrings;
+    
+    },{"../messages/common-strings":132,"../utils/asserts":134,"../utils/graph":137,"../utils/network-timing":138,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/computed/network-records":34}],"lighthouse-plugin-publisher-ads/audits/loads-ad-tag-over-https":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
+    const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
+    const{auditNotApplicable}=require('../messages/common-strings');
+    const{Audit}=require('lighthouse');
+    const{isAdTag}=require('../utils/resource-classification');
+    const{URL}=require('url');
+    
+    const UIStrings={
+    title:'Ad tag is loaded over HTTPS',
+    failureTitle:'Load ad tag over HTTPS',
+    description:'For privacy and security, always load GPT/AdSense over '+
+    'HTTPS. Insecure pages should explicitly request the ad script securely. '+
+    'GPT Example: `<script async '+
+    'src=\"https://securepubads.g.doubleclick.net/tag/js/gpt.js\">` '+
+    'AdSense Example: `<script async '+
+    'src=\"https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js\">`'+
+    '. [Learn more]('+
+    'https://developers.google.com/publisher-ads-audits/reference/audits/loads-ad-tag-over-https'+
+    ').'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    
+    
+    class LoadsAdTagOverHttps extends Audit{
+    
+    
+    
+    
+    static get meta(){
+    return{
+    id:'loads-ad-tag-over-https',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const devtoolsLogs=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const networkRecords=await NetworkRecords.request(devtoolsLogs,context);
+    
+    const pageReq=networkRecords.find(record=>record.statusCode==200);
+    if(!pageReq){
+    return auditNotApplicable.NoRecords;
+    }
+    
+    const adRequests=networkRecords.
+    filter(record=>isAdTag(new URL(record.url)));
+    
+    const secureAdRequests=adRequests.filter(request=>request.isSecure);
+    
+    
+    const details={
+    type:'debugdata',
+    numAdTagHttpReqs:adRequests.length-secureAdRequests.length,
+    numAdTagHttpsReqs:secureAdRequests.length};
+    
+    
+    if(!adRequests.length){
+    const returnVal=auditNotApplicable.NoTag;
+    returnVal.details=details;
+    return returnVal;
+    }
+    
+    
+    
+    return{
+    numericValue:details.numAdTagHttpReqs,
+    score:details.numAdTagHttpReqs?0:1,
+    details};
+    
+    }}
+    
+    
+    module.exports=LoadsAdTagOverHttps;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/loads-ad-tag-over-https.js");
+    },{"../messages/common-strings":132,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/lib/i18n/i18n":66,"url":"url"}],"lighthouse-plugin-publisher-ads/audits/loads-gpt-from-sgdn":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
+    const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
+    const{auditNotApplicable}=require('../messages/common-strings');
+    const{Audit}=require('lighthouse');
+    const{isGptTag}=require('../utils/resource-classification');
+    const{URL}=require('url');
+    
+    const UIStrings={
+    title:'GPT tag is loaded from recommended host',
+    failureTitle:'Load GPT from recommended host',
+    description:'Load GPT from \'securepubads.g.doubleclick.net\' to reduce '+
+    'GPT load time. By loading GPT from the same host as ad requests, browsers '+
+    'can avoid an additional DNS lookup and HTTP connection. Example:`'+
+    '<script async src=\"https://securepubads.g.doubleclick.net/tag/js/gpt.js\">'+
+    '`. [Learn more]('+
+    'https://developers.google.com/publisher-ads-audits/reference/audits/loads-gpt-from-sgdn'+
+    ').'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    class LoadsGptFromSgdn extends Audit{
+    
+    
+    
+    
+    static get meta(){
+    return{
+    id:'loads-gpt-from-sgdn',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['devtoolsLogs']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const networkRecords=await NetworkRecords.request(devtoolsLog,context);
+    const gptUrl=networkRecords.map(r=>new URL(r.url)).find(isGptTag);
+    if(!gptUrl){
+    return auditNotApplicable.NoGpt;
+    }
+    return{
+    score:Number(gptUrl.host==='securepubads.g.doubleclick.net')};
+    
+    }}
+    
+    
+    module.exports=LoadsGptFromSgdn;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/loads-gpt-from-sgdn.js");
+    },{"../messages/common-strings":132,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/lib/i18n/i18n":66,"url":"url"}],"lighthouse-plugin-publisher-ads/audits/script-injected-tags":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const array=require('../utils/array.js');
+    const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
+    const PageDependencyGraph=require('lighthouse/lighthouse-core/computed/page-dependency-graph');
+    const{auditNotApplicable}=require('../messages/common-strings');
+    const{Audit}=require('lighthouse');
+    const{computeAdRequestWaterfall}=require('../utils/graph');
+    const{getScriptEvaluationTimes}=require('../utils/network-timing');
+    
+    
+    
+    
+    
+    
+    const MINIMUM_LOAD_TIME_MS=400;
+    
+    const UIStrings={
+    title:'Ad scripts are loaded statically',
+    failureTitle:'Load ad scripts statically',
+    description:'Load the following scripts directly with '+
+    '`<script async src=...>` instead of injecting scripts with JavaScript. '+
+    'Doing so allows the browser to preload scripts sooner. [Learn more]('+
+    'https://developers.google.com/publisher-ads-audits/reference/audits/script-injected-tags'+
+    ').',
+    failureDisplayValue:'Load {tags, plural, =1 {1 script} other {# scripts}} statically',
+    columnUrl:'Script',
+    columnLoadTime:'Load Time'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    
+    
+    
+    const HEADINGS=[
+    {
+    key:'url',
+    itemType:'url',
+    text:str_(UIStrings.columnUrl)},
+    
+    {
+    key:'loadTime',
+    itemType:'ms',
+    granularity:1,
+    text:str_(UIStrings.columnLoadTime)}];
+    
+    
+    
+    const STATICALLY_LOADABLE_TAGS=[
+    /amazon-adsystem\.com\/aax2\/apstag.js/,
+    /js-sec\.indexww\.com\/ht\/p\/.*\.js/,
+    /pubads\.g\.doubleclick\.net\/tag\/js\/gpt\.js/,
+    /static\.criteo\.net\/js\/.*\/publishertag\.js/,
+    /www\.googletagservices\.com\/tag\/js\/gpt\.js/,
+    /pagead2\.googlesyndication\.com\/pagead\/js\/adsbygoogle\.js/];
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function initiatedByInlineScript(record){
+    if(record.initiator.type!=='script'){
+    
+    return false;
+    }
+    const initiators=PageDependencyGraph.getNetworkInitiators(record);
+    if(initiators.length!==1||initiators[0]!==record.documentURL){
+    
+    return false;
+    }
+    return true;
+    }
+    
+    
+    
+    
+    
+    
+    
+    async function findStaticallyLoadableTags(artifacts,context){
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    
+    const tagReqs=[];
+    
+    
+    
+    const criticalRequests=
+    await computeAdRequestWaterfall(trace,devtoolsLog,context);
+    for(const{record}of criticalRequests){
+    if(record.resourceType!=='Script'){
+    
+    continue;
+    }
+    if(initiatedByInlineScript(record)||
+    STATICALLY_LOADABLE_TAGS.find(t=>record.url.match(t))){
+    tagReqs.push(record);
+    }
+    }
+    return tagReqs;
+    }
+    
+    
+    class StaticAdTags extends Audit{
+    
+    
+    
+    
+    static get meta(){
+    return{
+    id:'script-injected-tags',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['devtoolsLogs','traces']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const tagReqs=await findStaticallyLoadableTags(artifacts,context);
+    if(!tagReqs.length){
+    return auditNotApplicable.NoTag;
+    }
+    
+    const seenUrls=new Set();
+    const tableView=[];
+    
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const scriptTimes=
+    await getScriptEvaluationTimes(trace,devtoolsLog,context);
+    for(const tag of tagReqs){
+    if(seenUrls.has(tag.url))continue;
+    seenUrls.add(tag.url);
+    const relatedTags=tagReqs.filter(t=>t.url===tag.url);
+    
+    const numStatic=array.count(
+    relatedTags,t=>t.initiator.type==='parser'&&!t.isLinkPreload);
+    if(numStatic===0){
+    const loadTime=scriptTimes.get(tag.url)||0;
+    if(loadTime<MINIMUM_LOAD_TIME_MS){
+    continue;
+    }
+    tableView.push({
+    url:tag.url,
+    loadTime});
+    
+    }
+    }
+    tableView.sort((a,b)=>a.loadTime-b.loadTime);
+    
+    const failed=tableView.length>0;
+    return{
+    displayValue:failed?
+    str_(UIStrings.failureDisplayValue,{tags:tableView.length}):'',
+    score:Number(!failed),
+    numericValue:tableView.length,
+    details:StaticAdTags.makeTableDetails(HEADINGS,tableView)};
+    
+    }}
+    
+    
+    module.exports=StaticAdTags;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/script-injected-tags.js");
+    },{"../messages/common-strings":132,"../utils/array.js":133,"../utils/graph":137,"../utils/network-timing":138,"lighthouse":54,"lighthouse/lighthouse-core/computed/page-dependency-graph":35,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/serial-header-bidding":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const ComputedAdRequestTime=require('../computed/ad-request-time');
+    const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
+    const NetworkRecords=require('lighthouse/lighthouse-core/computed/network-records');
+    const{auditNotApplicable}=require('../messages/common-strings');
+    const{Audit}=require('lighthouse');
+    const{bucket}=require('../utils/array');
+    const{getTimingsByRecord}=require('../utils/network-timing');
+    const{isCacheable}=require('../utils/network');
+    const{isGoogleAds,getHeaderBidder,getAbbreviatedUrl}=require('../utils/resource-classification');
+    const{URL}=require('url');
+    
+    
+    
+    
+    const UIStrings={
+    title:'Header bidding is parallelized',
+    failureTitle:'Parallelize bid requests',
+    description:'Send header bidding requests simultaneously, rather than '+
+    'serially, to retrieve bids more quickly. [Learn more]('+
+    'https://developers.google.com/publisher-ads-audits/reference/audits/serial-header-bidding'+
+    ').',
+    columnBidder:'Bidder',
+    columnUrl:'URL',
+    columnStartTime:'Start',
+    columnDuration:'Duration'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    const MIN_BID_DURATION=.05;
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const HEADINGS=[
+    {key:'bidder',itemType:'text',text:str_(UIStrings.columnBidder)},
+    {key:'url',itemType:'url',text:str_(UIStrings.columnUrl)},
+    {key:'startTime',itemType:'ms',text:str_(UIStrings.columnStartTime)},
+    {key:'duration',itemType:'ms',text:str_(UIStrings.columnDuration)}];
+    
+    
+    
+    
+    
+    
+    
+    const RequestType={
+    AD:'ad',
+    BID:'bid',
+    UNKNOWN:'unknown'};
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function constructRecords(records,recordType,timings){
+    
+    const results=[];
+    for(const record of records){
+    const timing=timings.get(record);
+    if(!timing)continue;
+    results.push(Object.assign({},timing,{
+    url:getAbbreviatedUrl(record.url),
+    type:recordType}));
+    
+    }
+    return results;
+    }
+    
+    
+    
+    
+    
+    
+    function checkRecordType(record){
+    if(isGoogleAds(new URL(record.url))){
+    return RequestType.AD;
+    }else if(getHeaderBidder(record.url)){
+    return RequestType.BID;
+    }else{
+    return RequestType.UNKNOWN;
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    function isPossibleBid(rec){
+    return(rec.resourceSize==null||rec.resourceSize>0)&&
+    rec.resourceType!='Image'&&
+    rec.endTime-rec.startTime>=MIN_BID_DURATION&&
+    !isCacheable(rec);
+    }
+    
+    
+    
+    
+    
+    
+    function clearQueryString(url){
+    const u=new URL(url);
+    delete u.search;
+    return u.toString();
+    }
+    
+    
+    
+    
+    
+    class SerialHeaderBidding extends Audit{
+    
+    
+    
+    
+    static get meta(){
+    return{
+    id:'serial-header-bidding',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['devtoolsLogs','traces']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const unfilteredNetworkRecords=
+    await NetworkRecords.request(devtoolsLog,context);
+    if(!unfilteredNetworkRecords.length){
+    return auditNotApplicable.NoRecords;
+    }
+    
+    const mainFrameId=unfilteredNetworkRecords[0].frameId;
+    
+    
+    
+    const networkRecords=unfilteredNetworkRecords.
+    filter(isPossibleBid).
+    filter(r=>r.frameId==mainFrameId);
+    
+    
+    
+    
+    
+    
+    
+    const recordsByType=bucket(networkRecords,checkRecordType);
+    
+    if(!recordsByType.has(RequestType.BID)){
+    return auditNotApplicable.NoBids;
+    }
+    
+    const metricData={trace,devtoolsLog,settings:context.settings};
+    const{timing:adRequestTime}=
+    await ComputedAdRequestTime.request(metricData,context);
+    
+    
+    const timingsByRecord=await getTimingsByRecord(
+    trace,devtoolsLog,context);
+    
+    const headerBiddingRecords=constructRecords(
+    recordsByType.get(RequestType.BID)||[],RequestType.BID,
+    timingsByRecord);
+    
+    let serialBids=[];
+    let previousBid;
+    
+    
+    for(const record of headerBiddingRecords){
+    
+    
+    if(adRequestTime>0&&record.endTime>adRequestTime){
+    continue;
+    }
+    record.bidder=getHeaderBidder(record.url);
+    record.url=clearQueryString(record.url);
+    
+    if(previousBid&&record.startTime>=previousBid.endTime){
+    serialBids.push(previousBid);
+    serialBids.push(record);
+    }
+    
+    if(!previousBid||record.endTime<previousBid.endTime||
+    
+    record.startTime>=previousBid.endTime){
+    previousBid=record;
+    }
+    }
+    
+    
+    serialBids=Array.from(new Set(serialBids));
+    
+    
+    const hasSerialHeaderBidding=serialBids.length>1;
+    return{
+    numericValue:Number(hasSerialHeaderBidding),
+    score:hasSerialHeaderBidding?0:1,
+    details:hasSerialHeaderBidding?
+    SerialHeaderBidding.makeTableDetails(HEADINGS,serialBids):undefined};
+    
+    }}
+    
+    
+    module.exports=SerialHeaderBidding;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/serial-header-bidding.js");
+    },{"../computed/ad-request-time":128,"../messages/common-strings":132,"../utils/array":133,"../utils/network":139,"../utils/network-timing":138,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/computed/network-records":34,"lighthouse/lighthouse-core/lib/i18n/i18n":66,"url":"url"}],"lighthouse-plugin-publisher-ads/audits/tag-load-time":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const ComputedTagLoadTime=require('../computed/tag-load-time');
+    const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
+    const{auditNotApplicable,runWarning}=require('../messages/common-strings');
+    const{Audit}=require('lighthouse');
+    
+    const UIStrings={
+    title:'Tag load time',
+    failureTitle:'Reduce tag load time',
+    description:'This metric measures the time for the ad tag\'s '+
+    'implementation script (pubads_impl.js for GPT; adsbygoogle.js for '+
+    'AdSense) to load after the page loads. [Learn more]('+
+    'https://developers.google.com/publisher-ads-audits/reference/audits/metrics'+
+    ').',
+    displayValue:'{timeInMs, number, seconds} s'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    const PODR=1000;
+    const MEDIAN=2000;
+    
+    
+    
+    
+    class TagLoadTime extends Audit{
+    
+    
+    
+    
+    static get meta(){
+    return{
+    id:'tag-load-time',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    
+    scoreDisplayMode:Audit.SCORING_MODES.NUMERIC,
+    requiredArtifacts:['devtoolsLogs','traces']};
+    
+    }
+    
+    
+    
+    
+    
+    static async audit(artifacts,context){
+    const trace=artifacts.traces[Audit.DEFAULT_PASS];
+    const devtoolsLog=artifacts.devtoolsLogs[Audit.DEFAULT_PASS];
+    const metricData={trace,devtoolsLog,settings:context.settings};
+    
+    const{timing}=await ComputedTagLoadTime.request(metricData,context);
+    if(!(timing>0)){
+    context.LighthouseRunWarnings.push(runWarning.NoTag);
+    return auditNotApplicable.NoTag;
+    }
+    
+    
+    
+    let normalScore=Audit.computeLogNormalScore(timing,PODR,MEDIAN);
+    
+    
+    if(normalScore>=.9){
+    normalScore=1;
+    }
+    
+    return{
+    numericValue:timing*1e-3,
+    score:normalScore,
+    displayValue:str_(UIStrings.displayValue,{timeInMs:timing})};
+    
+    }}
+    
+    module.exports=TagLoadTime;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/tag-load-time.js");
+    },{"../computed/tag-load-time":131,"../messages/common-strings":132,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads/audits/viewport-ad-density":[function(require,module,exports){
+    (function(__filename){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const i18n=require('lighthouse/lighthouse-core/lib/i18n/i18n');
+    const{auditNotApplicable,auditError}=require('../messages/common-strings');
+    const{Audit}=require('lighthouse');
+    const{boxViewableArea}=require('../utils/geometry');
+    const{isAdIframe}=require('../utils/resource-classification');
+    
+    const UIStrings={
+    title:'Ad density in initial viewport is within recommended range',
+    failureTitle:'Reduce ad density in initial viewport',
+    description:'The ads-to-content ratio inside the viewport can have an '+
+    'impact on user experience and ultimately user retention. The Better Ads '+
+    'Standard [recommends having an ad density below 30%]'+
+    '(https://www.betterads.org/mobile-ad-density-higher-than-30/). '+
+    '[Learn more]('+
+    'https://developers.google.com/publisher-ads-audits/reference/audits/viewport-ad-density'+
+    ').',
+    displayValue:'{adDensity, number, percent} covered by ads'};
+    
+    
+    const str_=i18n.createMessageInstanceIdFn(__filename,UIStrings);
+    
+    
+    class ViewportAdDensity extends Audit{
+    
+    
+    
+    
+    static get meta(){
+    return{
+    id:'viewport-ad-density',
+    title:str_(UIStrings.title),
+    failureTitle:str_(UIStrings.failureTitle),
+    description:str_(UIStrings.description),
+    requiredArtifacts:['ViewportDimensions','IFrameElements']};
+    
+    }
+    
+    
+    
+    
+    
+    
+    static audit(artifacts){
+    const viewport=artifacts.ViewportDimensions;
+    const slots=artifacts.IFrameElements.filter(
+    slot=>isAdIframe(slot)&&
+    slot.clientRect.width*slot.clientRect.height>1);
+    
+    if(!slots.length){
+    return auditNotApplicable.NoVisibleSlots;
+    }
+    
+    const adArea=slots.reduce((sum,slot)=>
+    sum+boxViewableArea(slot.clientRect,viewport),0);
+    
+    const viewArea=viewport.innerWidth*viewport.innerHeight;
+    
+    if(viewArea<=0){
+    throw new Error(auditError.ViewportAreaZero);
+    }
+    if(adArea>viewArea){
+    throw new Error(auditError.AreaLargerThanViewport);
+    }
+    const adDensity=adArea/viewArea;
+    const score=adDensity>0.3?0:1;
+    return{
+    score,
+    numericValue:adArea/viewArea,
+    displayValue:str_(UIStrings.displayValue,{adDensity})};
+    
+    }}
+    
+    
+    module.exports=ViewportAdDensity;
+    module.exports.UIStrings=UIStrings;
+    
+    }).call(this,"/node_modules/lighthouse-plugin-publisher-ads/audits/viewport-ad-density.js");
+    },{"../messages/common-strings":132,"../utils/geometry":136,"../utils/resource-classification":140,"lighthouse":54,"lighthouse/lighthouse-core/lib/i18n/i18n":66}],"lighthouse-plugin-publisher-ads":[function(require,module,exports){
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    const{group}=require('./messages/common-strings');
+    
+    const PLUGIN_PATH='lighthouse-plugin-publisher-ads';
+    
+    
+    module.exports={
+    audits:[
+    {path:`${PLUGIN_PATH}/audits/ad-blocking-tasks`},
+    {path:`${PLUGIN_PATH}/audits/ad-render-blocking-resources`},
+    {path:`${PLUGIN_PATH}/audits/ad-request-critical-path`},
+    {path:`${PLUGIN_PATH}/audits/bid-request-from-page-start`},
+    {path:`${PLUGIN_PATH}/audits/ad-request-from-page-start`},
+    {path:`${PLUGIN_PATH}/audits/ad-top-of-viewport`},
+    {path:`${PLUGIN_PATH}/audits/ads-in-viewport`},
+    {path:`${PLUGIN_PATH}/audits/async-ad-tags`},
+    {path:`${PLUGIN_PATH}/audits/blocking-load-events`},
+    {path:`${PLUGIN_PATH}/audits/bottleneck-requests`},
+    {path:`${PLUGIN_PATH}/audits/duplicate-tags`},
+    {path:`${PLUGIN_PATH}/audits/first-ad-render`},
+    {path:`${PLUGIN_PATH}/audits/full-width-slots`},
+    {path:`${PLUGIN_PATH}/audits/gpt-bids-parallel`},
+    {path:`${PLUGIN_PATH}/audits/loads-gpt-from-sgdn`},
+    {path:`${PLUGIN_PATH}/audits/loads-ad-tag-over-https`},
+    {path:`${PLUGIN_PATH}/audits/script-injected-tags`},
+    {path:`${PLUGIN_PATH}/audits/serial-header-bidding`},
+    {path:`${PLUGIN_PATH}/audits/tag-load-time`},
+    {path:`${PLUGIN_PATH}/audits/viewport-ad-density`}],
+    
+    groups:{
+    'metrics':{
+    title:group.Metrics},
+    
+    'ads-performance':{
+    title:group.AdsPerformance},
+    
+    'ads-best-practices':{
+    title:group.AdsBestPractices}},
+    
+    
+    category:{
+    title:'Publisher Ads [Beta]',
+    auditRefs:[
+    
+    {id:'tag-load-time',weight:4,group:'metrics'},
+    {id:'ad-request-from-page-start',weight:4,group:'metrics'},
+    {id:'bid-request-from-page-start',weight:8,group:'metrics'},
+    {id:'first-ad-render',weight:8,group:'metrics'},
+    
+    {id:'gpt-bids-parallel',weight:1,group:'ads-performance'},
+    {id:'serial-header-bidding',weight:1,group:'ads-performance'},
+    {id:'bottleneck-requests',weight:1,group:'ads-performance'},
+    {id:'script-injected-tags',weight:1,group:'ads-performance'},
+    {id:'blocking-load-events',weight:1,group:'ads-performance'},
+    {id:'ad-render-blocking-resources',weight:1,group:'ads-performance'},
+    {id:'ad-blocking-tasks',weight:1,group:'ads-performance'},
+    {id:'ad-request-critical-path',weight:1,group:'ads-performance'},
+    
+    {id:'ads-in-viewport',weight:4,group:'ads-best-practices'},
+    {id:'async-ad-tags',weight:2,group:'ads-best-practices'},
+    {id:'loads-ad-tag-over-https',weight:1,group:'ads-best-practices'},
+    {id:'loads-gpt-from-sgdn',weight:1,group:'ads-best-practices'},
+    {id:'viewport-ad-density',weight:1,group:'ads-best-practices'},
+    {id:'ad-top-of-viewport',weight:2,group:'ads-best-practices'},
+    {id:'duplicate-tags',weight:1,group:'ads-best-practices'}]}};
+    
+    
+    
+    
+    },{"./messages/common-strings":132}],"url":[function(require,module,exports){
+    
+    
+    
+    
+    
+    'use strict';
+    
+    
+    
+    
+    
+    
+    
+    const Util=require('../report/html/renderer/util.js');
+    
+    const allowedProtocols=[
+    'https:','http:','chrome:','chrome-extension:'];
+    
+    
+    
+    
+    
+    
+    
+    
+    
+    function rewriteChromeInternalUrl(url){
+    if(!url||!url.startsWith('chrome://'))return url;
+    
+    
+    if(url.endsWith('/'))url=url.replace(/\/$/,'');
+    return url.replace(/^chrome:\/\/chrome\//,'chrome://');
+    }
+    
+    
+    class URLShim extends URL{
+    
+    
+    
+    
+    static isValid(url){
+    try{
+    new URL(url);
+    return true;
+    }catch(e){
+    return false;
+    }
+    }
+    
+    
+    
+    
+    
+    
+    static hostsMatch(urlA,urlB){
+    try{
+    return new URL(urlA).host===new URL(urlB).host;
+    }catch(e){
+    return false;
+    }
+    }
+    
+    
+    
+    
+    
+    
+    static originsMatch(urlA,urlB){
+    try{
+    return new URL(urlA).origin===new URL(urlB).origin;
+    }catch(e){
+    return false;
+    }
+    }
+    
+    
+    
+    
+    
+    static getOrigin(url){
+    try{
+    const urlInfo=new URL(url);
+    
+    
+    return urlInfo.host&&urlInfo.origin||null;
+    }catch(e){
+    return null;
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    static rootDomainsMatch(urlA,urlB){
+    let urlAInfo;
+    let urlBInfo;
+    try{
+    urlAInfo=Util.createOrReturnURL(urlA);
+    urlBInfo=Util.createOrReturnURL(urlB);
+    }catch(err){
+    return false;
+    }
+    
+    if(!urlAInfo.hostname||!urlBInfo.hostname){
+    return false;
+    }
+    
+    
+    const urlARootDomain=Util.getRootDomain(urlAInfo);
+    const urlBRootDomain=Util.getRootDomain(urlBInfo);
+    
+    return urlARootDomain===urlBRootDomain;
+    }
+    
+    
+    
+    
+    
+    
+    static getURLDisplayName(url,options){
+    return Util.getURLDisplayName(new URL(url),options);
+    }
+    
+    
+    
+    
+    
+    
+    static elideDataURI(url){
+    try{
+    const parsed=new URL(url);
+    return parsed.protocol==='data:'?url.slice(0,100):url;
+    }catch(e){
+    return url;
+    }
+    }
+    
+    
+    
+    
+    
+    
+    
+    static equalWithExcludedFragments(url1,url2){
+    [url1,url2]=[url1,url2].map(rewriteChromeInternalUrl);
+    try{
+    const urla=new URL(url1);
+    urla.hash='';
+    
+    const urlb=new URL(url2);
+    urlb.hash='';
+    
+    return urla.href===urlb.href;
+    }catch(e){
+    return false;
+    }
+    }
+    
+    
+    
+    
+    
+    
+    static isProtocolAllowed(url){
+    try{
+    const parsed=new URL(url);
+    return allowedProtocols.includes(parsed.protocol);
+    }catch(e){
+    return false;
+    }
+    }}
+    
+    
+    URLShim.URL=URL;
+    
+    URLShim.NON_NETWORK_PROTOCOLS=['blob','data','intent'];
+    
+    URLShim.INVALID_URL_DEBUG_STRING=
+    'Lighthouse was unable to determine the URL of some script executions. '+
+    'It\'s possible a Chrome extension or other eval\'d code is the source.';
+    
+    module.exports=URLShim;
+    
+    },{"../report/html/renderer/util.js":87}]},{},[1]);
\ No newline at end of file
diff --git a/front_end/audits_worker/lighthouse/locales/ar-XB.json b/front_end/lighthouse_worker/lighthouse/locales/ar-XB.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/ar-XB.json
rename to front_end/lighthouse_worker/lighthouse/locales/ar-XB.json
diff --git a/front_end/audits_worker/lighthouse/locales/ar.json b/front_end/lighthouse_worker/lighthouse/locales/ar.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/ar.json
rename to front_end/lighthouse_worker/lighthouse/locales/ar.json
diff --git a/front_end/audits_worker/lighthouse/locales/bg.json b/front_end/lighthouse_worker/lighthouse/locales/bg.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/bg.json
rename to front_end/lighthouse_worker/lighthouse/locales/bg.json
diff --git a/front_end/audits_worker/lighthouse/locales/ca.json b/front_end/lighthouse_worker/lighthouse/locales/ca.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/ca.json
rename to front_end/lighthouse_worker/lighthouse/locales/ca.json
diff --git a/front_end/audits_worker/lighthouse/locales/cs.json b/front_end/lighthouse_worker/lighthouse/locales/cs.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/cs.json
rename to front_end/lighthouse_worker/lighthouse/locales/cs.json
diff --git a/front_end/audits_worker/lighthouse/locales/da.json b/front_end/lighthouse_worker/lighthouse/locales/da.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/da.json
rename to front_end/lighthouse_worker/lighthouse/locales/da.json
diff --git a/front_end/audits_worker/lighthouse/locales/de.json b/front_end/lighthouse_worker/lighthouse/locales/de.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/de.json
rename to front_end/lighthouse_worker/lighthouse/locales/de.json
diff --git a/front_end/audits_worker/lighthouse/locales/el.json b/front_end/lighthouse_worker/lighthouse/locales/el.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/el.json
rename to front_end/lighthouse_worker/lighthouse/locales/el.json
diff --git a/front_end/audits_worker/lighthouse/locales/en-GB.json b/front_end/lighthouse_worker/lighthouse/locales/en-GB.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/en-GB.json
rename to front_end/lighthouse_worker/lighthouse/locales/en-GB.json
diff --git a/front_end/audits_worker/lighthouse/locales/en-US.json b/front_end/lighthouse_worker/lighthouse/locales/en-US.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/en-US.json
rename to front_end/lighthouse_worker/lighthouse/locales/en-US.json
diff --git a/front_end/audits_worker/lighthouse/locales/en-XA.json b/front_end/lighthouse_worker/lighthouse/locales/en-XA.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/en-XA.json
rename to front_end/lighthouse_worker/lighthouse/locales/en-XA.json
diff --git a/front_end/audits_worker/lighthouse/locales/en-XL.json b/front_end/lighthouse_worker/lighthouse/locales/en-XL.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/en-XL.json
rename to front_end/lighthouse_worker/lighthouse/locales/en-XL.json
diff --git a/front_end/audits_worker/lighthouse/locales/es-419.json b/front_end/lighthouse_worker/lighthouse/locales/es-419.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/es-419.json
rename to front_end/lighthouse_worker/lighthouse/locales/es-419.json
diff --git a/front_end/audits_worker/lighthouse/locales/es.json b/front_end/lighthouse_worker/lighthouse/locales/es.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/es.json
rename to front_end/lighthouse_worker/lighthouse/locales/es.json
diff --git a/front_end/audits_worker/lighthouse/locales/fi.json b/front_end/lighthouse_worker/lighthouse/locales/fi.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/fi.json
rename to front_end/lighthouse_worker/lighthouse/locales/fi.json
diff --git a/front_end/audits_worker/lighthouse/locales/fil.json b/front_end/lighthouse_worker/lighthouse/locales/fil.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/fil.json
rename to front_end/lighthouse_worker/lighthouse/locales/fil.json
diff --git a/front_end/audits_worker/lighthouse/locales/fr.json b/front_end/lighthouse_worker/lighthouse/locales/fr.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/fr.json
rename to front_end/lighthouse_worker/lighthouse/locales/fr.json
diff --git a/front_end/audits_worker/lighthouse/locales/he.json b/front_end/lighthouse_worker/lighthouse/locales/he.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/he.json
rename to front_end/lighthouse_worker/lighthouse/locales/he.json
diff --git a/front_end/audits_worker/lighthouse/locales/hi.json b/front_end/lighthouse_worker/lighthouse/locales/hi.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/hi.json
rename to front_end/lighthouse_worker/lighthouse/locales/hi.json
diff --git a/front_end/audits_worker/lighthouse/locales/hr.json b/front_end/lighthouse_worker/lighthouse/locales/hr.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/hr.json
rename to front_end/lighthouse_worker/lighthouse/locales/hr.json
diff --git a/front_end/audits_worker/lighthouse/locales/hu.json b/front_end/lighthouse_worker/lighthouse/locales/hu.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/hu.json
rename to front_end/lighthouse_worker/lighthouse/locales/hu.json
diff --git a/front_end/audits_worker/lighthouse/locales/id.json b/front_end/lighthouse_worker/lighthouse/locales/id.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/id.json
rename to front_end/lighthouse_worker/lighthouse/locales/id.json
diff --git a/front_end/audits_worker/lighthouse/locales/it.json b/front_end/lighthouse_worker/lighthouse/locales/it.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/it.json
rename to front_end/lighthouse_worker/lighthouse/locales/it.json
diff --git a/front_end/audits_worker/lighthouse/locales/ja.json b/front_end/lighthouse_worker/lighthouse/locales/ja.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/ja.json
rename to front_end/lighthouse_worker/lighthouse/locales/ja.json
diff --git a/front_end/audits_worker/lighthouse/locales/ko.json b/front_end/lighthouse_worker/lighthouse/locales/ko.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/ko.json
rename to front_end/lighthouse_worker/lighthouse/locales/ko.json
diff --git a/front_end/audits_worker/lighthouse/locales/lt.json b/front_end/lighthouse_worker/lighthouse/locales/lt.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/lt.json
rename to front_end/lighthouse_worker/lighthouse/locales/lt.json
diff --git a/front_end/audits_worker/lighthouse/locales/lv.json b/front_end/lighthouse_worker/lighthouse/locales/lv.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/lv.json
rename to front_end/lighthouse_worker/lighthouse/locales/lv.json
diff --git a/front_end/audits_worker/lighthouse/locales/nl.json b/front_end/lighthouse_worker/lighthouse/locales/nl.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/nl.json
rename to front_end/lighthouse_worker/lighthouse/locales/nl.json
diff --git a/front_end/audits_worker/lighthouse/locales/no.json b/front_end/lighthouse_worker/lighthouse/locales/no.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/no.json
rename to front_end/lighthouse_worker/lighthouse/locales/no.json
diff --git a/front_end/audits_worker/lighthouse/locales/pl.json b/front_end/lighthouse_worker/lighthouse/locales/pl.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/pl.json
rename to front_end/lighthouse_worker/lighthouse/locales/pl.json
diff --git a/front_end/audits_worker/lighthouse/locales/pt-PT.json b/front_end/lighthouse_worker/lighthouse/locales/pt-PT.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/pt-PT.json
rename to front_end/lighthouse_worker/lighthouse/locales/pt-PT.json
diff --git a/front_end/audits_worker/lighthouse/locales/pt.json b/front_end/lighthouse_worker/lighthouse/locales/pt.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/pt.json
rename to front_end/lighthouse_worker/lighthouse/locales/pt.json
diff --git a/front_end/audits_worker/lighthouse/locales/ro.json b/front_end/lighthouse_worker/lighthouse/locales/ro.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/ro.json
rename to front_end/lighthouse_worker/lighthouse/locales/ro.json
diff --git a/front_end/audits_worker/lighthouse/locales/ru.json b/front_end/lighthouse_worker/lighthouse/locales/ru.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/ru.json
rename to front_end/lighthouse_worker/lighthouse/locales/ru.json
diff --git a/front_end/audits_worker/lighthouse/locales/sk.json b/front_end/lighthouse_worker/lighthouse/locales/sk.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/sk.json
rename to front_end/lighthouse_worker/lighthouse/locales/sk.json
diff --git a/front_end/audits_worker/lighthouse/locales/sl.json b/front_end/lighthouse_worker/lighthouse/locales/sl.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/sl.json
rename to front_end/lighthouse_worker/lighthouse/locales/sl.json
diff --git a/front_end/audits_worker/lighthouse/locales/sr-Latn.json b/front_end/lighthouse_worker/lighthouse/locales/sr-Latn.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/sr-Latn.json
rename to front_end/lighthouse_worker/lighthouse/locales/sr-Latn.json
diff --git a/front_end/audits_worker/lighthouse/locales/sr.json b/front_end/lighthouse_worker/lighthouse/locales/sr.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/sr.json
rename to front_end/lighthouse_worker/lighthouse/locales/sr.json
diff --git a/front_end/audits_worker/lighthouse/locales/sv.json b/front_end/lighthouse_worker/lighthouse/locales/sv.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/sv.json
rename to front_end/lighthouse_worker/lighthouse/locales/sv.json
diff --git a/front_end/audits_worker/lighthouse/locales/ta.json b/front_end/lighthouse_worker/lighthouse/locales/ta.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/ta.json
rename to front_end/lighthouse_worker/lighthouse/locales/ta.json
diff --git a/front_end/audits_worker/lighthouse/locales/te.json b/front_end/lighthouse_worker/lighthouse/locales/te.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/te.json
rename to front_end/lighthouse_worker/lighthouse/locales/te.json
diff --git a/front_end/audits_worker/lighthouse/locales/th.json b/front_end/lighthouse_worker/lighthouse/locales/th.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/th.json
rename to front_end/lighthouse_worker/lighthouse/locales/th.json
diff --git a/front_end/audits_worker/lighthouse/locales/tr.json b/front_end/lighthouse_worker/lighthouse/locales/tr.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/tr.json
rename to front_end/lighthouse_worker/lighthouse/locales/tr.json
diff --git a/front_end/audits_worker/lighthouse/locales/uk.json b/front_end/lighthouse_worker/lighthouse/locales/uk.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/uk.json
rename to front_end/lighthouse_worker/lighthouse/locales/uk.json
diff --git a/front_end/audits_worker/lighthouse/locales/vi.json b/front_end/lighthouse_worker/lighthouse/locales/vi.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/vi.json
rename to front_end/lighthouse_worker/lighthouse/locales/vi.json
diff --git a/front_end/audits_worker/lighthouse/locales/zh-HK.json b/front_end/lighthouse_worker/lighthouse/locales/zh-HK.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/zh-HK.json
rename to front_end/lighthouse_worker/lighthouse/locales/zh-HK.json
diff --git a/front_end/audits_worker/lighthouse/locales/zh-TW.json b/front_end/lighthouse_worker/lighthouse/locales/zh-TW.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/zh-TW.json
rename to front_end/lighthouse_worker/lighthouse/locales/zh-TW.json
diff --git a/front_end/audits_worker/lighthouse/locales/zh.json b/front_end/lighthouse_worker/lighthouse/locales/zh.json
similarity index 100%
rename from front_end/audits_worker/lighthouse/locales/zh.json
rename to front_end/lighthouse_worker/lighthouse/locales/zh.json
diff --git a/front_end/audits_worker/module.json b/front_end/lighthouse_worker/module.json
similarity index 70%
rename from front_end/audits_worker/module.json
rename to front_end/lighthouse_worker/module.json
index 78ae51e..b9686f5 100644
--- a/front_end/audits_worker/module.json
+++ b/front_end/lighthouse_worker/module.json
@@ -5,13 +5,13 @@
     "extensions": [
         {
             "type": "@Service",
-            "factoryName": "AuditsService",
-            "name": "AuditsService"
+            "factoryName": "LighthouseService",
+            "name": "LighthouseService"
         }
     ],
     "scripts": [
         "lighthouse/lighthouse-dt-bundle.js",
-        "AuditsService.js"
+        "LighthouseService.js"
     ],
     "skip_compilation": [
         "lighthouse/lighthouse-dt-bundle.js"
diff --git a/scripts/check_gn.js b/scripts/check_gn.js
index 1076851..faed976 100644
--- a/scripts/check_gn.js
+++ b/scripts/check_gn.js
@@ -58,7 +58,7 @@
   if (missingModules.length)
     errors.push(`Check that you've included [${missingModules.join(', ')}] modules in: ` + gnVariable);
 
-  // e.g. "$resources_out_dir/audits/audits_module.js" => "audits"
+  // e.g. "$resources_out_dir/lighthouse/lighthouse_module.js" => "lighthouse"
   const mapLineToModuleName = line => line.split('/')[2].split('_module')[0];
 
   const extraneousModules = lines.map(mapLineToModuleName).filter(module => !utils.includes(modules, module));
diff --git a/scripts/localization/utils/localization_utils.js b/scripts/localization/utils/localization_utils.js
index dd530a9..86562ab 100644
--- a/scripts/localization/utils/localization_utils.js
+++ b/scripts/localization/utils/localization_utils.js
@@ -24,7 +24,14 @@
 };
 
 const excludeFiles = ['Tests.js'];
-const excludeDirs = ['test_runner', 'Images', 'langpacks', 'node_modules', 'lighthouse'];
+const excludeDirs = [
+  'test_runner',
+  'Images',
+  'langpacks',
+  'node_modules',
+  'lighthouse/lighthouse',
+  'lighthouse_worker/lighthouse'
+];
 const cppSpecialCharactersMap = {
   '"': '\\"',
   '\\': '\\\\',
diff --git a/scripts/test/run_license_header_check.js b/scripts/test/run_license_header_check.js
index 47dc746..329abec 100644
--- a/scripts/test/run_license_header_check.js
+++ b/scripts/test/run_license_header_check.js
@@ -54,9 +54,9 @@
 
 const EXCLUDED_FILES = [
   // FIXME: LightHouse bundles must be moved to third_party
-  'audits/lighthouse/report.js',
-  'audits/lighthouse/report-generator.js',
-  'audits_worker/lighthouse/lighthouse-dt-bundle.js',
+  'lighthouse/lighthouse/report.js',
+  'lighthouse/lighthouse/report-generator.js',
+  'lighthouse_worker/lighthouse/lighthouse-dt-bundle.js',
   // FIXME: CodeMirror bundles must be moved to third_party
   'cm/active-line.js',
   'cm/brace-fold.js',
diff --git a/scripts/visualize_deps/run_visualize.js b/scripts/visualize_deps/run_visualize.js
index b5e2e25..313516a 100644
--- a/scripts/visualize_deps/run_visualize.js
+++ b/scripts/visualize_deps/run_visualize.js
@@ -42,7 +42,7 @@
     const moduleJSONPath = path.join(FRONTEND_PATH, file, 'module.json');
     if (fs.statSync(path.join(FRONTEND_PATH, file)).isDirectory() && utils.isFile(moduleJSONPath)) {
       const module = file;
-      if (module === 'audits_worker')
+      if (module === 'lighthouse_worker')
         return;
       modules.add(module);
       const moduleJSON = require(moduleJSONPath);
diff --git a/test/webtests/SlowTests b/test/webtests/SlowTests
index 3b908ac..37b5a60 100644
--- a/test/webtests/SlowTests
+++ b/test/webtests/SlowTests
@@ -1,4 +1,4 @@
 # tags: [ Release Debug ]
 # results: [ Timeout Crash Pass Failure Slow Skip ]
 
-crbug.com/680917 http/tests/devtools/audits/* [ Slow ]
+crbug.com/680917 http/tests/devtools/lighthouse/* [ Slow ]
diff --git a/test/webtests/TestExpectations b/test/webtests/TestExpectations
index c0ac9ce..cf5b640 100644
--- a/test/webtests/TestExpectations
+++ b/test/webtests/TestExpectations
@@ -1,4 +1,4 @@
 # tags: [ Release Debug ]
 # results: [ Timeout Crash Pass Failure Slow Skip ]
 
-crbug.com/1034903 http/tests/devtools/audits/audits-export-run.js [ Pass Failure Crash ]
+crbug.com/1034903 http/tests/devtools/lighthouse/lighthouse-export-run.js [ Pass Failure Crash ]
diff --git a/test/webtests/http/tests/devtools/a11y-axe-core/audits-start-view-a11y-test-expected.txt b/test/webtests/http/tests/devtools/a11y-axe-core/audits-start-view-a11y-test-expected.txt
deleted file mode 100644
index 27578c0..0000000
--- a/test/webtests/http/tests/devtools/a11y-axe-core/audits-start-view-a11y-test-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-Tests accessibility in the audits start view using the axe-core linter.
-
-aXe violations: []
-
-
diff --git a/test/webtests/http/tests/devtools/a11y-axe-core/audits-start-view-a11y-test.js b/test/webtests/http/tests/devtools/a11y-axe-core/audits-start-view-a11y-test.js
deleted file mode 100644
index 3c71ba8..0000000
--- a/test/webtests/http/tests/devtools/a11y-axe-core/audits-start-view-a11y-test.js
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-(async function () {
-    TestRunner.addResult('Tests accessibility in the audits start view using the axe-core linter.\n');
-    await TestRunner.loadModule('axe_core_test_runner');
-    await TestRunner.loadModule('audits_test_runner');
-    await TestRunner.showPanel('audits');
-    await AxeCoreTestRunner.runValidation(AuditsTestRunner.getContainerElement());
-    TestRunner.completeTest();
-})();
diff --git a/test/webtests/http/tests/devtools/a11y-axe-core/lighthouse-start-view-a11y-test-expected.txt b/test/webtests/http/tests/devtools/a11y-axe-core/lighthouse-start-view-a11y-test-expected.txt
new file mode 100644
index 0000000..0e7c18f
--- /dev/null
+++ b/test/webtests/http/tests/devtools/a11y-axe-core/lighthouse-start-view-a11y-test-expected.txt
@@ -0,0 +1,5 @@
+Tests accessibility in the lighthouse start view using the axe-core linter.
+
+aXe violations: []
+
+
diff --git a/test/webtests/http/tests/devtools/a11y-axe-core/lighthouse-start-view-a11y-test.js b/test/webtests/http/tests/devtools/a11y-axe-core/lighthouse-start-view-a11y-test.js
new file mode 100644
index 0000000..93a3d6b
--- /dev/null
+++ b/test/webtests/http/tests/devtools/a11y-axe-core/lighthouse-start-view-a11y-test.js
@@ -0,0 +1,12 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+(async function () {
+    TestRunner.addResult('Tests accessibility in the lighthouse start view using the axe-core linter.\n');
+    await TestRunner.loadModule('axe_core_test_runner');
+    await TestRunner.loadModule('lighthouse_test_runner');
+    await TestRunner.showPanel('lighthouse');
+    await AxeCoreTestRunner.runValidation(LighthouseTestRunner.getContainerElement());
+    TestRunner.completeTest();
+})();
diff --git a/test/webtests/http/tests/devtools/audits/OWNERS b/test/webtests/http/tests/devtools/audits/OWNERS
deleted file mode 100644
index e9dca12..0000000
--- a/test/webtests/http/tests/devtools/audits/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-file://AUDITS_OWNERS
diff --git a/test/webtests/http/tests/devtools/audits/audits-emulate-run-expected.txt b/test/webtests/http/tests/devtools/audits/audits-emulate-run-expected.txt
deleted file mode 100644
index 1df5509..0000000
--- a/test/webtests/http/tests/devtools/audits/audits-emulate-run-expected.txt
+++ /dev/null
@@ -1,29 +0,0 @@
-Tests that mobile emulation works.
-
-
-========== Audits Start Audit State ==========
-[x] Performance
-[x] Progressive Web App
-[x] Best practices
-[x] Accessibility
-[x] SEO
-[ ] Publisher Ads
-[x] Clear storage
-[x] Simulated throttling
-Generate report: enabled visible
-
-=============== Lighthouse Results ===============
-URL: http://127.0.0.1:8000/devtools/audits/resources/audits-emulate-pass.html
-Version: 5.7.0
-TestedAsMobileDevice: true
-ViewportDimensions: {
-  "innerWidth": 412,
-  "innerHeight": 660,
-  "outerWidth": 412,
-  "outerHeight": 660,
-  "devicePixelRatio": 2.625
-}
-
-
-content-width: pass 
-
diff --git a/test/webtests/http/tests/devtools/audits/audits-flags-run.js b/test/webtests/http/tests/devtools/audits/audits-flags-run.js
deleted file mode 100644
index 9f80eb7..0000000
--- a/test/webtests/http/tests/devtools/audits/audits-flags-run.js
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-(async function() {
-  TestRunner.addResult('Tests that audits panel passes flags.\n');
-  await TestRunner.navigatePromise('resources/audits-basic.html');
-
-  await TestRunner.loadModule('audits_test_runner');
-  await TestRunner.showPanel('audits');
-
-  const dialogElement = AuditsTestRunner.getContainerElement();
-  dialogElement.querySelector('input[name="audits.device_type"][value="desktop"]').click();
-  // Turn off simulated throttling.
-  dialogElement.querySelector('.audits-settings-pane > div').shadowRoot
-               .querySelectorAll('span')[1].shadowRoot
-               .querySelector('input').click();
-
-  AuditsTestRunner.dumpStartAuditState();
-  AuditsTestRunner.getRunButton().click();
-
-  const {artifacts, lhr} = await AuditsTestRunner.waitForResults();
-  TestRunner.addResult(`\n=============== Lighthouse Results ===============`);
-  TestRunner.addResult(`emulatedFormFactor: ${lhr.configSettings.emulatedFormFactor}`);
-  TestRunner.addResult(`disableStorageReset: ${lhr.configSettings.disableStorageReset}`);
-  TestRunner.addResult(`throttlingMethod: ${lhr.configSettings.throttlingMethod}`);
-  TestRunner.addResult(`TestedAsMobileDevice: ${artifacts.TestedAsMobileDevice}`);
-
-  TestRunner.completeTest();
-})();
diff --git a/test/webtests/http/tests/devtools/lighthouse/OWNERS b/test/webtests/http/tests/devtools/lighthouse/OWNERS
new file mode 100644
index 0000000..adbdad6
--- /dev/null
+++ b/test/webtests/http/tests/devtools/lighthouse/OWNERS
@@ -0,0 +1 @@
+file://LIGHTHOUSE_OWNERS
diff --git a/test/webtests/http/tests/devtools/lighthouse/lighthouse-emulate-run-expected.txt b/test/webtests/http/tests/devtools/lighthouse/lighthouse-emulate-run-expected.txt
new file mode 100644
index 0000000..b0f912d
--- /dev/null
+++ b/test/webtests/http/tests/devtools/lighthouse/lighthouse-emulate-run-expected.txt
@@ -0,0 +1,23 @@
+Tests that mobile emulation works.
+
+
+========== Lighthouse Start Audit State ==========
+[x] Performance
+[x] Progressive Web App
+[x] Best practices
+[x] Accessibility
+[x] SEO
+[ ] Publisher Ads
+[x] Clear storage
+[x] Simulated throttling
+Generate report: enabled visible
+
+=============== Lighthouse Results ===============
+URL: http://127.0.0.1:8000/devtools/lighthouse/resources/audits-emulate-pass.html
+Version: 5.7.0
+TestedAsMobileDevice: true
+ViewportDimensions: undefined
+
+
+content-width: ERROR Required ViewportDimensions gatherer did not run.
+
diff --git a/test/webtests/http/tests/devtools/audits/audits-emulate-run.js b/test/webtests/http/tests/devtools/lighthouse/lighthouse-emulate-run.js
similarity index 81%
rename from test/webtests/http/tests/devtools/audits/audits-emulate-run.js
rename to test/webtests/http/tests/devtools/lighthouse/lighthouse-emulate-run.js
index ea69f0f..379ca8e 100644
--- a/test/webtests/http/tests/devtools/audits/audits-emulate-run.js
+++ b/test/webtests/http/tests/devtools/lighthouse/lighthouse-emulate-run.js
@@ -6,12 +6,12 @@
   TestRunner.addResult('Tests that mobile emulation works.\n');
   await TestRunner.navigatePromise('resources/audits-emulate-pass.html');
 
-  await TestRunner.loadModule('audits_test_runner');
-  await TestRunner.showPanel('audits');
+  await TestRunner.loadModule('lighthouse_test_runner');
+  await TestRunner.showPanel('lighthouse');
 
-  AuditsTestRunner.dumpStartAuditState();
-  AuditsTestRunner.getRunButton().click();
-  const {artifacts, lhr} = await AuditsTestRunner.waitForResults();
+  LighthouseTestRunner.dumpStartAuditState();
+  LighthouseTestRunner.getRunButton().click();
+  const {artifacts, lhr} = await LighthouseTestRunner.waitForResults();
 
   TestRunner.addResult(`\n=============== Lighthouse Results ===============`);
   TestRunner.addResult(`URL: ${lhr.finalUrl}`);
diff --git a/test/webtests/http/tests/devtools/audits/audits-export-run-expected.txt b/test/webtests/http/tests/devtools/lighthouse/lighthouse-export-run-expected.txt
similarity index 100%
rename from test/webtests/http/tests/devtools/audits/audits-export-run-expected.txt
rename to test/webtests/http/tests/devtools/lighthouse/lighthouse-export-run-expected.txt
diff --git a/test/webtests/http/tests/devtools/audits/audits-export-run.js b/test/webtests/http/tests/devtools/lighthouse/lighthouse-export-run.js
similarity index 87%
rename from test/webtests/http/tests/devtools/audits/audits-export-run.js
rename to test/webtests/http/tests/devtools/lighthouse/lighthouse-export-run.js
index fabf611..e5c2868 100644
--- a/test/webtests/http/tests/devtools/audits/audits-export-run.js
+++ b/test/webtests/http/tests/devtools/lighthouse/lighthouse-export-run.js
@@ -6,13 +6,13 @@
   TestRunner.addResult('Tests that exporting works.\n');
   await TestRunner.navigatePromise('resources/audits-basic.html');
 
-  await TestRunner.loadModule('audits_test_runner');
-  await TestRunner.showPanel('audits');
+  await TestRunner.loadModule('lighthouse_test_runner');
+  await TestRunner.showPanel('lighthouse');
 
-  AuditsTestRunner.getRunButton().click();
-  await AuditsTestRunner.waitForResults();
+  LighthouseTestRunner.getRunButton().click();
+  await LighthouseTestRunner.waitForResults();
 
-  const resultsElement = AuditsTestRunner.getResultsElement();
+  const resultsElement = LighthouseTestRunner.getResultsElement();
   const toolsMenu = resultsElement.querySelector('.lh-tools__dropdown');
 
   function waitForSave() {
diff --git a/test/webtests/http/tests/devtools/audits/audits-flags-run-expected.txt b/test/webtests/http/tests/devtools/lighthouse/lighthouse-flags-run-expected.txt
similarity index 78%
rename from test/webtests/http/tests/devtools/audits/audits-flags-run-expected.txt
rename to test/webtests/http/tests/devtools/lighthouse/lighthouse-flags-run-expected.txt
index b656e65..3eaaed9 100644
--- a/test/webtests/http/tests/devtools/audits/audits-flags-run-expected.txt
+++ b/test/webtests/http/tests/devtools/lighthouse/lighthouse-flags-run-expected.txt
@@ -1,7 +1,7 @@
-Tests that audits panel passes flags.
+Tests that lighthouse panel passes flags.
 
 
-========== Audits Start Audit State ==========
+========== Lighthouse Start Audit State ==========
 [x] Performance
 [x] Progressive Web App
 [x] Best practices
diff --git a/test/webtests/http/tests/devtools/lighthouse/lighthouse-flags-run.js b/test/webtests/http/tests/devtools/lighthouse/lighthouse-flags-run.js
new file mode 100644
index 0000000..5b604e7
--- /dev/null
+++ b/test/webtests/http/tests/devtools/lighthouse/lighthouse-flags-run.js
@@ -0,0 +1,30 @@
+// Copyright 2018 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+(async function() {
+  TestRunner.addResult('Tests that lighthouse panel passes flags.\n');
+  await TestRunner.navigatePromise('resources/lighthouse-basic.html');
+
+  await TestRunner.loadModule('lighthouse_test_runner');
+  await TestRunner.showPanel('lighthouse');
+
+  const dialogElement = LighthouseTestRunner.getContainerElement();
+  dialogElement.querySelector('input[name="lighthouse.device_type"][value="desktop"]').click();
+  // Turn off simulated throttling.
+  dialogElement.querySelector('.lighthouse-settings-pane > div').shadowRoot
+               .querySelectorAll('span')[1].shadowRoot
+               .querySelector('input').click();
+
+  LighthouseTestRunner.dumpStartAuditState();
+  LighthouseTestRunner.getRunButton().click();
+
+  const {artifacts, lhr} = await LighthouseTestRunner.waitForResults();
+  TestRunner.addResult(`\n=============== Lighthouse Results ===============`);
+  TestRunner.addResult(`emulatedFormFactor: ${lhr.configSettings.emulatedFormFactor}`);
+  TestRunner.addResult(`disableStorageReset: ${lhr.configSettings.disableStorageReset}`);
+  TestRunner.addResult(`throttlingMethod: ${lhr.configSettings.throttlingMethod}`);
+  TestRunner.addResult(`TestedAsMobileDevice: ${artifacts.TestedAsMobileDevice}`);
+
+  TestRunner.completeTest();
+})();
diff --git a/test/webtests/http/tests/devtools/audits/audits-limited-run-expected.txt b/test/webtests/http/tests/devtools/lighthouse/lighthouse-limited-run-expected.txt
similarity index 91%
rename from test/webtests/http/tests/devtools/audits/audits-limited-run-expected.txt
rename to test/webtests/http/tests/devtools/lighthouse/lighthouse-limited-run-expected.txt
index 40a81ec..bbd89cc 100644
--- a/test/webtests/http/tests/devtools/audits/audits-limited-run-expected.txt
+++ b/test/webtests/http/tests/devtools/lighthouse/lighthouse-limited-run-expected.txt
@@ -1,7 +1,7 @@
 Tests that audits panel works when only the pwa category is selected.
 
 
-========== Audits Start Audit State ==========
+========== Lighthouse Start Audit State ==========
 [ ] Performance
 [x] Progressive Web App
 [ ] Best practices
diff --git a/test/webtests/http/tests/devtools/audits/audits-limited-run.js b/test/webtests/http/tests/devtools/lighthouse/lighthouse-limited-run.js
similarity index 72%
rename from test/webtests/http/tests/devtools/audits/audits-limited-run.js
rename to test/webtests/http/tests/devtools/lighthouse/lighthouse-limited-run.js
index 14d06f0..05c63c0 100644
--- a/test/webtests/http/tests/devtools/audits/audits-limited-run.js
+++ b/test/webtests/http/tests/devtools/lighthouse/lighthouse-limited-run.js
@@ -6,10 +6,10 @@
   TestRunner.addResult('Tests that audits panel works when only the pwa category is selected.\n');
   await TestRunner.navigatePromise('resources/audits-basic.html');
 
-  await TestRunner.loadModule('audits_test_runner');
-  await TestRunner.showPanel('audits');
+  await TestRunner.loadModule('lighthouse_test_runner');
+  await TestRunner.showPanel('lighthouse');
 
-  const containerElement = AuditsTestRunner.getContainerElement();
+  const containerElement = LighthouseTestRunner.getContainerElement();
   const checkboxes = containerElement.querySelectorAll('.checkbox');
   for (const checkbox of checkboxes) {
     if (checkbox.textElement.textContent === 'Progressive Web App' ||
@@ -19,10 +19,10 @@
     if (checkbox.checkboxElement.checked) checkbox.checkboxElement.click();
   }
 
-  AuditsTestRunner.dumpStartAuditState();
-  AuditsTestRunner.getRunButton().click();
+  LighthouseTestRunner.dumpStartAuditState();
+  LighthouseTestRunner.getRunButton().click();
 
-  const {lhr} = await AuditsTestRunner.waitForResults();
+  const {lhr} = await LighthouseTestRunner.waitForResults();
   TestRunner.addResult(`\n=============== Audits run ===============`);
   TestRunner.addResult(Object.keys(lhr.audits).sort().join('\n'));
 
diff --git a/test/webtests/http/tests/devtools/audits/audits-prevent-run-expected.txt b/test/webtests/http/tests/devtools/lighthouse/lighthouse-prevent-run-expected.txt
similarity index 84%
rename from test/webtests/http/tests/devtools/audits/audits-prevent-run-expected.txt
rename to test/webtests/http/tests/devtools/lighthouse/lighthouse-prevent-run-expected.txt
index 16a2300..b364bc5 100644
--- a/test/webtests/http/tests/devtools/audits/audits-prevent-run-expected.txt
+++ b/test/webtests/http/tests/devtools/lighthouse/lighthouse-prevent-run-expected.txt
@@ -4,7 +4,7 @@
 
 **Prevents audit with no categories**
 
-========== Audits Start Audit State ==========
+========== Lighthouse Start Audit State ==========
 [ ] Performance
 [ ] Progressive Web App
 [ ] Best practices
@@ -19,7 +19,7 @@
 
 **Allows audit with a single category**
 
-========== Audits Start Audit State ==========
+========== Lighthouse Start Audit State ==========
 [x] Performance
 [ ] Progressive Web App
 [ ] Best practices
@@ -33,7 +33,7 @@
 
 **Allows audit on undockable page**
 
-========== Audits Start Audit State ==========
+========== Lighthouse Start Audit State ==========
 [x] Performance
 [ ] Progressive Web App
 [ ] Best practices
@@ -48,7 +48,7 @@
 **Prevents audit on internal page**
 URL: about:blank
 
-========== Audits Start Audit State ==========
+========== Lighthouse Start Audit State ==========
 [x] Performance
 [ ] Progressive Web App
 [ ] Best practices
diff --git a/test/webtests/http/tests/devtools/audits/audits-prevent-run.js b/test/webtests/http/tests/devtools/lighthouse/lighthouse-prevent-run.js
similarity index 76%
rename from test/webtests/http/tests/devtools/audits/audits-prevent-run.js
rename to test/webtests/http/tests/devtools/lighthouse/lighthouse-prevent-run.js
index 2d6f9fa..bd7784e 100644
--- a/test/webtests/http/tests/devtools/audits/audits-prevent-run.js
+++ b/test/webtests/http/tests/devtools/lighthouse/lighthouse-prevent-run.js
@@ -16,30 +16,30 @@
   TestRunner.addResult('Tests that audits panel prevents run of unauditable pages.\n');
   await TestRunner.navigatePromise('resources/audits-basic.html');
 
-  await TestRunner.loadModule('audits_test_runner');
-  await TestRunner.showPanel('audits');
+  await TestRunner.loadModule('lighthouse_test_runner');
+  await TestRunner.showPanel('lighthouse');
 
   TestRunner.addResult('\n\n**Prevents audit with no categories**');
-  AuditsTestRunner.openStartAudit();
-  var containerElement = AuditsTestRunner.getContainerElement();
+  LighthouseTestRunner.openStartAudit();
+  var containerElement = LighthouseTestRunner.getContainerElement();
   var checkboxes = containerElement.querySelectorAll('.checkbox');
   checkboxes.forEach(checkbox => checkbox.checkboxElement.checked && checkbox.checkboxElement.click());
-  AuditsTestRunner.dumpStartAuditState();
+  LighthouseTestRunner.dumpStartAuditState();
 
   TestRunner.addResult('\n\n**Allows audit with a single category**');
   checkboxes[0].checkboxElement.click();
-  AuditsTestRunner.dumpStartAuditState();
+  LighthouseTestRunner.dumpStartAuditState();
 
   TestRunner.addResult('\n\n**Allows audit on undockable page**');
   // Extension page and remote debugging previously caused crashes (crbug.com/734532)
   // However, the crashes have been resolved, so these should now pass.
-  AuditsTestRunner.forcePageAuditabilityCheck();
-  AuditsTestRunner.dumpStartAuditState();
+  LighthouseTestRunner.forcePageAuditabilityCheck();
+  LighthouseTestRunner.dumpStartAuditState();
 
   TestRunner.addResult('\n\n**Prevents audit on internal page**');
   await navigateToAboutBlankAndWait();
   TestRunner.addResult(`URL: ${TestRunner.mainTarget.inspectedURL()}`);
-  AuditsTestRunner.dumpStartAuditState();
+  LighthouseTestRunner.dumpStartAuditState();
 
   TestRunner.completeTest();
 })();
diff --git a/test/webtests/http/tests/devtools/audits/audits-successful-run-expected.txt b/test/webtests/http/tests/devtools/lighthouse/lighthouse-successful-run-expected.txt
similarity index 62%
rename from test/webtests/http/tests/devtools/audits/audits-successful-run-expected.txt
rename to test/webtests/http/tests/devtools/lighthouse/lighthouse-successful-run-expected.txt
index 5dfe034..6485a3f 100644
--- a/test/webtests/http/tests/devtools/audits/audits-successful-run-expected.txt
+++ b/test/webtests/http/tests/devtools/lighthouse/lighthouse-successful-run-expected.txt
@@ -1,7 +1,7 @@
 Tests that audits panel works.
 
 
-========== Audits Start Audit State ==========
+========== Lighthouse Start Audit State ==========
 [x] Performance
 [x] Progressive Web App
 [x] Best practices
@@ -75,109 +75,29 @@
 Gathering in-page: Accessibility
 Gathering trace
 Gathering devtoolsLog & network records
-Running afterPass methods
-Gathering: CSSUsage
-Gathering: ViewportDimensions
-Gathering: RuntimeExceptions
-Gathering: ConsoleMessages
-Gathering: AnchorElements
-Gathering: ImageElements
-Gathering: LinkElements
-Gathering: MetaElements
-Gathering: ScriptElements
-Gathering: AppCacheManifest
-Gathering: Doctype
-Gathering: DOMStats
-Gathering: OptimizedImages
-Gathering: PasswordInputsWithPreventedPaste
-Gathering: ResponseCompression
-Gathering: TagsBlockingFirstPaint
-Gathering: FontSize
-Gathering: EmbeddedContent
-Gathering: RobotsTxt
-Gathering: TapTargets
-Gathering: Accessibility
-Resetting state with about:blank
-Setting up network for the pass trace
-Running beforePass methods
-Gathering setup: ServiceWorker
-Gathering setup: Offline
-Gathering setup: StartUrl
-Beginning devtoolsLog and trace
-Loading page & waiting for onload
-Running pass methods
-Gathering in-page: ServiceWorker
-Gathering in-page: Offline
-Gathering in-page: StartUrl
-Gathering devtoolsLog & network records
-Running afterPass methods
-Gathering: ServiceWorker
-Gathering: Offline
-Gathering: StartUrl
-Resetting state with about:blank
-Setting up network for the pass trace
-Running beforePass methods
-Gathering setup: HTTPRedirect
-Gathering setup: HTMLWithoutJavaScript
-Beginning devtoolsLog and trace
-Loading page & waiting for onload
-Running pass methods
-Gathering in-page: HTTPRedirect
-Gathering in-page: HTMLWithoutJavaScript
-Gathering devtoolsLog & network records
-Running afterPass methods
-Gathering: HTTPRedirect
-Gathering: HTMLWithoutJavaScript
 Disconnecting from browser...
 Analyzing and running audits...
 Auditing: Uses HTTPS
-Computing artifact: NetworkRecords
 Auditing: Redirects HTTP traffic to HTTPS
 Auditing: Registers a service worker that controls page and `start_url`
 Auditing: Current page responds with a 200 when offline
 Auditing: Has a `<meta name="viewport">` tag with `width` or `initial-scale`
-Computing artifact: ViewportMeta
 Auditing: Contains some content when JavaScript is not available
 Auditing: First Contentful Paint
-Computing artifact: FirstContentfulPaint
-Computing artifact: TraceOfTab
-Computing artifact: LanternFirstContentfulPaint
-Computing artifact: PageDependencyGraph
-Computing artifact: LoadSimulator
-Computing artifact: NetworkAnalysis
 Auditing: First Meaningful Paint
-Computing artifact: FirstMeaningfulPaint
-Computing artifact: LanternFirstMeaningfulPaint
 Auditing: Page load is fast enough on mobile networks
-Computing artifact: Interactive
-Computing artifact: LanternInteractive
 Auditing: Speed Index
-Computing artifact: SpeedIndex
-Computing artifact: LanternSpeedIndex
-Computing artifact: Speedline
 Auditing: Screenshot Thumbnails
 Auditing: Final Screenshot
-Computing artifact: Screenshots
 Auditing: Estimated Input Latency
-Computing artifact: EstimatedInputLatency
-Computing artifact: LanternEstimatedInputLatency
 Auditing: Total Blocking Time
-Computing artifact: TotalBlockingTime
-Computing artifact: LanternTotalBlockingTime
 Auditing: Max Potential First Input Delay
-Computing artifact: MaxPotentialFID
-Computing artifact: LanternMaxPotentialFID
 Auditing: No browser errors logged to the console
 Auditing: Server response times are low (TTFB)
-Computing artifact: MainResource
 Auditing: First CPU Idle
-Computing artifact: FirstCPUIdle
-Computing artifact: LanternFirstCPUIdle
 Auditing: Time to Interactive
 Auditing: User Timing marks and measures
-Computing artifact: UserTimings
 Auditing: Avoid chaining critical requests
-Computing artifact: CriticalRequestChains
 Auditing: Avoid multiple page redirects
 Auditing: Web app manifest meets the installability requirements
 Computing artifact: ManifestValues
@@ -188,10 +108,8 @@
 Auditing: Displays images with correct aspect ratio
 Auditing: Avoids deprecated APIs
 Auditing: Minimizes main-thread work
-Computing artifact: MainThreadTasks
 Auditing: JavaScript execution time
 Auditing: Preload key requests
-Computing artifact: LoadSimulator
 Auditing: Preconnect to required origins
 Auditing: All text remains visible during webfont loads
 Auditing: Diagnostics
@@ -202,7 +120,6 @@
 Auditing: Metrics
 Auditing: `start_url` responds with a 200 when offline
 Auditing: Performance budget
-Computing artifact: ResourceSummary
 Auditing: Keep request counts low and transfer sizes small
 Auditing: Minimize third-party usage
 Auditing: Site works cross-browser
@@ -258,8 +175,6 @@
 Auditing: Avoids enormous network payloads
 Auditing: Defer offscreen images
 Auditing: Eliminate render-blocking resources
-Computing artifact: FirstContentfulPaint
-Computing artifact: LanternFirstContentfulPaint
 Auditing: Minify CSS
 Auditing: Minify JavaScript
 Auditing: Remove unused CSS
@@ -294,146 +209,140 @@
 Generating results...
 
 =============== Lighthouse Results ===============
-URL: http://127.0.0.1:8000/devtools/audits/resources/audits-basic.html
+URL: http://127.0.0.1:8000/devtools/lighthouse/resources/audits-basic.html
 Version: 5.7.0
 TestedAsMobileDevice: true
-ViewportDimensions: {
-  "innerWidth": 981,
-  "innerHeight": 1570,
-  "outerWidth": 412,
-  "outerHeight": 660,
-  "devicePixelRatio": 2.625
-}
+ViewportDimensions: undefined
 
 
-accesskeys: notApplicable
-appcache-manifest: pass
-apple-touch-icon: fail
-aria-allowed-attr: notApplicable
-aria-required-attr: notApplicable
-aria-required-children: notApplicable
-aria-required-parent: notApplicable
-aria-roles: notApplicable
-aria-valid-attr: notApplicable
-aria-valid-attr-value: notApplicable
-audio-caption: notApplicable
+accesskeys: ERROR Required Accessibility gatherer did not run.
+appcache-manifest: ERROR Required AppCacheManifest gatherer did not run.
+apple-touch-icon: ERROR Required LinkElements gatherer did not run.
+aria-allowed-attr: ERROR Required Accessibility gatherer did not run.
+aria-required-attr: ERROR Required Accessibility gatherer did not run.
+aria-required-children: ERROR Required Accessibility gatherer did not run.
+aria-required-parent: ERROR Required Accessibility gatherer did not run.
+aria-roles: ERROR Required Accessibility gatherer did not run.
+aria-valid-attr: ERROR Required Accessibility gatherer did not run.
+aria-valid-attr-value: ERROR Required Accessibility gatherer did not run.
+audio-caption: ERROR Required Accessibility gatherer did not run.
 bootup-time: flaky
-button-name: notApplicable
-bypass: notApplicable
-canonical: notApplicable
-color-contrast: pass
-content-width: fail
-critical-request-chains: notApplicable
+button-name: ERROR Required Accessibility gatherer did not run.
+bypass: ERROR Required Accessibility gatherer did not run.
+canonical: ERROR Required LinkElements gatherer did not run.
+color-contrast: ERROR Required Accessibility gatherer did not run.
+content-width: ERROR Required ViewportDimensions gatherer did not run.
+critical-request-chains: ERROR Required devtoolsLogs gatherer did not run.
 custom-controls-labels: manual
 custom-controls-roles: manual
-definition-list: notApplicable
-deprecations: pass
-diagnostics: informative
-dlitem: notApplicable
-doctype: pass
-document-title: fail
-dom-size: numeric
-duplicate-id: notApplicable
+definition-list: ERROR Required Accessibility gatherer did not run.
+deprecations: ERROR Required ConsoleMessages gatherer did not run.
+diagnostics: ERROR Required traces gatherer did not run.
+dlitem: ERROR Required Accessibility gatherer did not run.
+doctype: ERROR Required Doctype gatherer did not run.
+document-title: ERROR Required Accessibility gatherer did not run.
+dom-size: ERROR Required DOMStats gatherer did not run.
+duplicate-id: ERROR Required Accessibility gatherer did not run.
 efficient-animated-content: flaky
-errors-in-console: pass
+errors-in-console: ERROR Required ConsoleMessages gatherer did not run.
 estimated-input-latency: flaky
-external-anchors-use-rel-noopener: pass
-final-screenshot: ERROR Chrome didn't collect any screenshots during the page load. Please make sure there is content visible on the page, and then try re-running Lighthouse. (NO_SCREENSHOTS)
+external-anchors-use-rel-noopener: ERROR Required AnchorElements gatherer did not run.
+final-screenshot: ERROR Required traces gatherer did not run.
 first-contentful-paint: flaky
 first-cpu-idle: flaky
 first-meaningful-paint: flaky
 focus-traps: manual
 focusable-controls: manual
-font-display: pass
-font-size: fail
-frame-title: notApplicable
-geolocation-on-start: pass
+font-display: ERROR Required devtoolsLogs gatherer did not run.
+font-size: ERROR Required FontSize gatherer did not run.
+frame-title: ERROR Required Accessibility gatherer did not run.
+geolocation-on-start: ERROR Required ConsoleMessages gatherer did not run.
 heading-levels: manual
-hreflang: pass
-html-has-lang: fail
-html-lang-valid: notApplicable
-http-status-code: pass
-image-alt: notApplicable
-image-aspect-ratio: pass
-input-image-alt: notApplicable
+hreflang: ERROR Required LinkElements gatherer did not run.
+html-has-lang: ERROR Required Accessibility gatherer did not run.
+html-lang-valid: ERROR Required Accessibility gatherer did not run.
+http-status-code: ERROR Required devtoolsLogs gatherer did not run.
+image-alt: ERROR Required Accessibility gatherer did not run.
+image-aspect-ratio: ERROR Required ImageElements gatherer did not run.
+input-image-alt: ERROR Required Accessibility gatherer did not run.
 installable-manifest: fail
 interactive: flaky
 interactive-element-affordance: manual
-is-crawlable: pass
-is-on-https: pass
+is-crawlable: ERROR Required MetaElements gatherer did not run.
+is-on-https: ERROR Required devtoolsLogs gatherer did not run.
 js-libraries: pass
-label: notApplicable
-layout-table: notApplicable
-link-name: notApplicable
-link-text: pass
-list: notApplicable
-listitem: notApplicable
+label: ERROR Required Accessibility gatherer did not run.
+layout-table: ERROR Required Accessibility gatherer did not run.
+link-name: ERROR Required Accessibility gatherer did not run.
+link-text: ERROR Required AnchorElements gatherer did not run.
+list: ERROR Required Accessibility gatherer did not run.
+listitem: ERROR Required Accessibility gatherer did not run.
 load-fast-enough-for-pwa: flaky
 logical-tab-order: manual
-main-thread-tasks: informative
-mainthread-work-breakdown: numeric
+main-thread-tasks: ERROR Required traces gatherer did not run.
+mainthread-work-breakdown: ERROR Required traces gatherer did not run.
 managed-focus: manual
-max-potential-fid: numeric
-meta-description: fail
-meta-refresh: notApplicable
-meta-viewport: notApplicable
+max-potential-fid: ERROR Required traces gatherer did not run.
+meta-description: ERROR Required MetaElements gatherer did not run.
+meta-refresh: ERROR Required Accessibility gatherer did not run.
+meta-viewport: ERROR Required Accessibility gatherer did not run.
 metrics: flaky
-network-requests: informative
-network-rtt: informative
-network-server-latency: informative
-no-document-write: pass
+network-requests: ERROR Required devtoolsLogs gatherer did not run.
+network-rtt: ERROR Required devtoolsLogs gatherer did not run.
+network-server-latency: ERROR Required devtoolsLogs gatherer did not run.
+no-document-write: ERROR Required ConsoleMessages gatherer did not run.
 no-vulnerable-libraries: pass
-notification-on-start: pass
-object-alt: notApplicable
-offline-start-url: fail
+notification-on-start: ERROR Required ConsoleMessages gatherer did not run.
+object-alt: ERROR Required Accessibility gatherer did not run.
+offline-start-url: ERROR Required StartUrl gatherer did not run.
 offscreen-content-hidden: manual
 offscreen-images: flaky
-password-inputs-can-be-pasted-into: pass
-performance-budget: notApplicable
-plugins: pass
+password-inputs-can-be-pasted-into: ERROR Required PasswordInputsWithPreventedPaste gatherer did not run.
+performance-budget: ERROR Required devtoolsLogs gatherer did not run.
+plugins: ERROR Required EmbeddedContent gatherer did not run.
 pwa-cross-browser: manual
 pwa-each-page-has-url: manual
 pwa-page-transitions: manual
 redirects: flaky
-redirects-http: fail
+redirects-http: ERROR Required HTTPRedirect gatherer did not run.
 render-blocking-resources: flaky
-resource-summary: informative
-robots-txt: notApplicable
+resource-summary: ERROR Required devtoolsLogs gatherer did not run.
+robots-txt: ERROR Required RobotsTxt gatherer did not run.
 screenshot-thumbnails: flaky
-service-worker: fail
+service-worker: ERROR Required ServiceWorker gatherer did not run.
 speed-index: flaky
 splash-screen: fail
 structured-data: manual
-tabindex: notApplicable
-tap-targets: fail
-td-headers-attr: notApplicable
-th-has-data-cells: notApplicable
-themed-omnibox: fail
-third-party-summary: notApplicable
-time-to-first-byte: pass
-total-blocking-time: numeric
-total-byte-weight: numeric
+tabindex: ERROR Required Accessibility gatherer did not run.
+tap-targets: ERROR Required MetaElements gatherer did not run.
+td-headers-attr: ERROR Required Accessibility gatherer did not run.
+th-has-data-cells: ERROR Required Accessibility gatherer did not run.
+themed-omnibox: ERROR Required MetaElements gatherer did not run.
+third-party-summary: ERROR Required traces gatherer did not run.
+time-to-first-byte: ERROR Required devtoolsLogs gatherer did not run.
+total-blocking-time: ERROR Required traces gatherer did not run.
+total-byte-weight: ERROR Required devtoolsLogs gatherer did not run.
 unminified-css: flaky
 unminified-javascript: flaky
 unused-css-rules: flaky
 use-landmarks: manual
 user-timings: flaky
-uses-http2: fail
-uses-long-cache-ttl: numeric
+uses-http2: ERROR Required devtoolsLogs gatherer did not run.
+uses-long-cache-ttl: ERROR Required devtoolsLogs gatherer did not run.
 uses-optimized-images: flaky
-uses-passive-event-listeners: pass
-uses-rel-preconnect: numeric
+uses-passive-event-listeners: ERROR Required ConsoleMessages gatherer did not run.
+uses-rel-preconnect: ERROR Required devtoolsLogs gatherer did not run.
 uses-rel-preload: flaky
 uses-responsive-images: flaky
 uses-text-compression: flaky
 uses-webp-images: flaky
-valid-lang: notApplicable
-video-caption: notApplicable
-video-description: notApplicable
-viewport: fail
+valid-lang: ERROR Required Accessibility gatherer did not run.
+video-caption: ERROR Required Accessibility gatherer did not run.
+video-description: ERROR Required Accessibility gatherer did not run.
+viewport: ERROR Required MetaElements gatherer did not run.
 visual-order-follows-dom: manual
-without-javascript: pass
-works-offline: fail
+without-javascript: ERROR Required HTMLWithoutJavaScript gatherer did not run.
+works-offline: ERROR Required Offline gatherer did not run.
 
 # of .lh-audit divs: 115
 
diff --git a/test/webtests/http/tests/devtools/audits/audits-successful-run.js b/test/webtests/http/tests/devtools/lighthouse/lighthouse-successful-run.js
similarity index 85%
rename from test/webtests/http/tests/devtools/audits/audits-successful-run.js
rename to test/webtests/http/tests/devtools/lighthouse/lighthouse-successful-run.js
index 8fefd87..0da870b 100644
--- a/test/webtests/http/tests/devtools/audits/audits-successful-run.js
+++ b/test/webtests/http/tests/devtools/lighthouse/lighthouse-successful-run.js
@@ -37,16 +37,16 @@
   TestRunner.addResult('Tests that audits panel works.\n');
   await TestRunner.navigatePromise('resources/audits-basic.html');
 
-  await TestRunner.loadModule('audits_test_runner');
-  await TestRunner.showPanel('audits');
+  await TestRunner.loadModule('lighthouse_test_runner');
+  await TestRunner.showPanel('lighthouse');
 
-  AuditsTestRunner.dumpStartAuditState();
+  LighthouseTestRunner.dumpStartAuditState();
 
   TestRunner.addResult(`\n=============== Lighthouse Status Updates ===============`);
-  AuditsTestRunner.addStatusListener(msg => TestRunner.addResult(msg));
-  AuditsTestRunner.getRunButton().click();
+  LighthouseTestRunner.addStatusListener(msg => TestRunner.addResult(msg));
+  LighthouseTestRunner.getRunButton().click();
 
-  var {artifacts, lhr} = await AuditsTestRunner.waitForResults();
+  var {artifacts, lhr} = await LighthouseTestRunner.waitForResults();
   TestRunner.addResult(`\n=============== Lighthouse Results ===============`);
   TestRunner.addResult(`URL: ${lhr.finalUrl}`);
   TestRunner.addResult(`Version: ${lhr.lighthouseVersion}`);
@@ -68,7 +68,7 @@
     }
   });
 
-  const resultsElement = AuditsTestRunner.getResultsElement();
+  const resultsElement = LighthouseTestRunner.getResultsElement();
   const auditElements = resultsElement.querySelectorAll('.lh-audit');
   TestRunner.addResult(`\n# of .lh-audit divs: ${auditElements.length}`);
 
diff --git a/test/webtests/http/tests/devtools/audits/audits-view-trace-run-expected.txt b/test/webtests/http/tests/devtools/lighthouse/lighthouse-view-trace-run-expected.txt
similarity index 83%
rename from test/webtests/http/tests/devtools/audits/audits-view-trace-run-expected.txt
rename to test/webtests/http/tests/devtools/lighthouse/lighthouse-view-trace-run-expected.txt
index b985a1f..9e43fc6 100644
--- a/test/webtests/http/tests/devtools/audits/audits-view-trace-run-expected.txt
+++ b/test/webtests/http/tests/devtools/lighthouse/lighthouse-view-trace-run-expected.txt
@@ -1,7 +1,7 @@
 Tests that audits panel renders View Trace button.
 
 
-========== Audits Start Audit State ==========
+========== Lighthouse Start Audit State ==========
 [x] Performance
 [ ] Progressive Web App
 [ ] Best practices
@@ -54,6 +54,6 @@
 uses-responsive-images
 uses-text-compression
 uses-webp-images
-
-Showing view: timeline
+PROMISE FAILURE: TypeError: Cannot read property 'click' of null
+    at http://127.0.0.1:8000/devtools/lighthouse/lighthouse-view-trace-run.js:33:19
 
diff --git a/test/webtests/http/tests/devtools/audits/audits-view-trace-run.js b/test/webtests/http/tests/devtools/lighthouse/lighthouse-view-trace-run.js
similarity index 71%
rename from test/webtests/http/tests/devtools/audits/audits-view-trace-run.js
rename to test/webtests/http/tests/devtools/lighthouse/lighthouse-view-trace-run.js
index 5210f83..da9defa 100644
--- a/test/webtests/http/tests/devtools/audits/audits-view-trace-run.js
+++ b/test/webtests/http/tests/devtools/lighthouse/lighthouse-view-trace-run.js
@@ -6,10 +6,10 @@
   TestRunner.addResult('Tests that audits panel renders View Trace button.\n');
   await TestRunner.navigatePromise('resources/audits-basic.html');
 
-  await TestRunner.loadModule('audits_test_runner');
-  await TestRunner.showPanel('audits');
+  await TestRunner.loadModule('lighthouse_test_runner');
+  await TestRunner.showPanel('lighthouse');
 
-  const containerElement = AuditsTestRunner.getContainerElement();
+  const containerElement = LighthouseTestRunner.getContainerElement();
   const checkboxes = containerElement.querySelectorAll('.checkbox');
   for (const checkbox of checkboxes) {
     if (checkbox.textElement.textContent === 'Performance' ||
@@ -19,17 +19,17 @@
     if (checkbox.checkboxElement.checked) checkbox.checkboxElement.click();
   }
 
-  AuditsTestRunner.dumpStartAuditState();
-  AuditsTestRunner.getRunButton().click();
+  LighthouseTestRunner.dumpStartAuditState();
+  LighthouseTestRunner.getRunButton().click();
 
-  const {lhr} = await AuditsTestRunner.waitForResults();
+  const {lhr} = await LighthouseTestRunner.waitForResults();
   TestRunner.addResult(`\n=============== Audits run ===============`);
   TestRunner.addResult(Object.keys(lhr.audits).sort().join('\n'));
 
   const waitForShowView = new Promise(resolve => {
     TestRunner.addSniffer(UI.ViewManager.prototype, 'showView', resolve);
   });
-  const viewTraceButton = AuditsTestRunner.getResultsElement().querySelector('.view-trace');
+  const viewTraceButton = LighthouseTestRunner.getResultsElement().querySelector('.view-trace');
   viewTraceButton.click();
   const viewShown = await waitForShowView;
   TestRunner.addResult(`\nShowing view: ${viewShown}`);
diff --git a/test/webtests/http/tests/devtools/audits/resources/audits-basic.html b/test/webtests/http/tests/devtools/lighthouse/resources/lighthouse-basic.html
similarity index 100%
rename from test/webtests/http/tests/devtools/audits/resources/audits-basic.html
rename to test/webtests/http/tests/devtools/lighthouse/resources/lighthouse-basic.html
diff --git a/test/webtests/http/tests/devtools/audits/resources/audits-emulate-pass.html b/test/webtests/http/tests/devtools/lighthouse/resources/lighthouse-emulate-pass.html
similarity index 100%
rename from test/webtests/http/tests/devtools/audits/resources/audits-emulate-pass.html
rename to test/webtests/http/tests/devtools/lighthouse/resources/lighthouse-emulate-pass.html