From 9dee40fe2a18d404b9ba20422fb2e4bc0bfeda6a Mon Sep 17 00:00:00 2001 From: tophf Date: Thu, 21 Sep 2023 20:42:15 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20master=20from=20source=20@=20e?= =?UTF-8?q?8445da3bde118e550c442b4c13ac7578ea7760f=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 404.html | 67 + 404/index.html | 67 + _gatsby/slices/_gatsby-scripts-1.html | 7 + api/gm/index.html | 772 +++++++ api/matching/index.html | 154 ++ api/metadata-block/index.html | 231 ++ app-64f2811254713e6e49a8.js | 3 + app-64f2811254713e6e49a8.js.LICENSE.txt | 39 + app-64f2811254713e6e49a8.js.map | 1 + ...07d707efd756d62ecd-d2251742f874e379db01.js | 2 + ...07efd756d62ecd-d2251742f874e379db01.js.map | 1 + chunk-map.json | 1 + ...fline-app-shell-js-cb64605f204f20d86cc6.js | 2 + ...e-app-shell-js-cb64605f204f20d86cc6.js.map | 1 + ...--src-pages-404-js-f492d11d80ac96643791.js | 2 + ...c-pages-404-js-f492d11d80ac96643791.js.map | 1 + ...src-pages-posts-js-2af8287b24b85f8a349a.js | 2 + ...pages-posts-js-2af8287b24b85f8a349a.js.map | 1 + ...-content-api-gm-md-8b41ac603591ac6753ab.js | 2 + ...tent-api-gm-md-8b41ac603591ac6753ab.js.map | 1 + ...nt-api-matching-md-e8309d58c91945d209b3.js | 2 + ...pi-matching-md-e8309d58c91945d209b3.js.map | 1 + ...-metadata-block-md-e0225f93d9e68bdcccfe.js | 2 + ...adata-block-md-e0225f93d9e68bdcccfe.js.map | 1 + ...ntent-faq-index-md-3e073515d5b7aee08895.js | 2 + ...t-faq-index-md-3e073515d5b7aee08895.js.map | 1 + ...nt-get-it-index-md-8232a8ad579335aa0806.js | 2 + ...et-it-index-md-8232a8ad579335aa0806.js.map | 1 + ...serscript-index-md-01d374f92879a9944d67.js | 2 + ...cript-index-md-01d374f92879a9944d67.js.map | 1 + ...hortcuts-index-mdx-c5dc6c0850e752ed7672.js | 2 + ...cuts-index-mdx-c5dc6c0850e752ed7672.js.map | 1 + ...rving-dom-index-md-10aeee7f45ced0a15aa3.js | 2 + ...g-dom-index-md-10aeee7f45ced0a15aa3.js.map | 1 + ...rn-syntax-index-md-c8d9414d661bc1988e6a.js | 2 + ...yntax-index-md-c8d9414d661bc1988e6a.js.map | 1 + ...h-content-index-md-1c6d23836a98d9fe83d7.js | 2 + ...ntent-index-md-1c6d23836a98d9fe83d7.js.map | 1 + ...alization-index-md-430734c217f1c5151033.js | 2 + ...ation-index-md-430734c217f1c5151033.js.map | 1 + ...cript-generator-md-e37afad40b0497c9ed43.js | 2 + ...t-generator-md-e37afad40b0497c9ed43.js.map | 1 + ...te-editor-index-md-04fa65d69f1f9d7bf5eb.js | 2 + ...ditor-index-md-04fa65d69f1f9d7bf5eb.js.map | 1 + ...ct-into-context-md-426a002ac27e601f0947.js | 2 + ...nto-context-md-426a002ac27e601f0947.js.map | 1 + ...-with-blob-urls-md-0c7e8eef22e98f312597.js | 2 + ...h-blob-urls-md-0c7e8eef22e98f312597.js.map | 1 + ...s-for-blacklist-md-5c1bf3efdbc84e6dc9c3.js | 2 + ...r-blacklist-md-5c1bf3efdbc84e6dc9c3.js.map | 1 + ...onkey-workflows-md-b8ea341c5a9e5271cf8d.js | 2 + ...y-workflows-md-b8ea341c5a9e5271cf8d.js.map | 1 + ...t-privacy-index-md-898886663a86da785181.js | 2 + ...ivacy-index-md-898886663a86da785181.js.map | 1 + ...s-install-beta-mdx-72fc2c577f47a95406c1.js | 2 + ...stall-beta-mdx-72fc2c577f47a95406c1.js.map | 1 + ...install-stable-mdx-c82902d8e42e2b5f3f9a.js | 2 + ...all-stable-mdx-c82902d8e42e2b5f3f9a.js.map | 1 + components/install-beta/index.html | 108 + components/install-stable/index.html | 148 ++ faq/index.html | 90 + favicon-32x32.png | Bin 0 -> 2497 bytes get-it/index.html | 251 +++ guide/creating-a-userscript/index.html | 119 ++ guide/keyboard-shortcuts/index.html | 109 + guide/observing-dom/index.html | 127 ++ guide/using-modern-syntax/index.html | 122 ++ icons/icon-144x144.png | Bin 0 -> 15586 bytes icons/icon-192x192.png | Bin 0 -> 26308 bytes icons/icon-256x256.png | Bin 0 -> 38226 bytes icons/icon-384x384.png | Bin 0 -> 90343 bytes icons/icon-48x48.png | Bin 0 -> 4289 bytes icons/icon-512x512.png | Bin 0 -> 146516 bytes icons/icon-72x72.png | Bin 0 -> 7163 bytes icons/icon-96x96.png | Bin 0 -> 10493 bytes idb-keyval-3.2.0-iife.min.js | 1 + index.html | 186 ++ localization/index.html | 89 + manifest.webmanifest | 1 + offline-plugin-app-shell-fallback/index.html | 67 + page-data/404.html/page-data.json | 1 + page-data/404/page-data.json | 1 + page-data/api/gm/page-data.json | 1 + page-data/api/matching/page-data.json | 1 + page-data/api/metadata-block/page-data.json | 1 + page-data/app-data.json | 1 + .../components/install-beta/page-data.json | 1 + .../components/install-stable/page-data.json | 1 + page-data/faq/page-data.json | 1 + page-data/get-it/page-data.json | 1 + .../creating-a-userscript/page-data.json | 1 + .../guide/keyboard-shortcuts/page-data.json | 1 + page-data/guide/observing-dom/page-data.json | 1 + .../guide/using-modern-syntax/page-data.json | 1 + page-data/index/page-data.json | 1 + page-data/localization/page-data.json | 1 + .../page-data.json | 1 + .../page-data.json | 1 + .../page-data.json | 1 + .../posts/inject-into-context/page-data.json | 1 + .../page-data.json | 1 + page-data/posts/page-data.json | 1 + .../smart-rules-for-blacklist/page-data.json | 1 + .../violentmonkey-workflows/page-data.json | 1 + page-data/privacy/page-data.json | 1 + page-data/sq/d/1116475411.json | 1 + page-data/sq/d/1700780748.json | 1 + page-data/sq/d/2344890832.json | 1 + page-data/sq/d/3202921338.json | 1 + page-data/sq/d/3798213247.json | 1 + polyfill-c7af91edbbea3673745d.js | 2 + polyfill-c7af91edbbea3673745d.js.map | 1 + .../index.html | 125 ++ .../index.html | 234 ++ posts/index.html | 67 + posts/inject-into-context/index.html | 129 ++ .../inject-scripts-with-blob-urls/index.html | 128 ++ posts/smart-rules-for-blacklist/index.html | 137 ++ posts/violentmonkey-workflows/index.html | 97 + privacy/index.html | 82 + sitemap-0.xml | 1 + sitemap-index.xml | 1 + .../222b7/editor-2.png | Bin 0 -> 2185 bytes .../6114d/editor-2.png | Bin 0 -> 6198 bytes .../ff46a/editor-2.png | Bin 0 -> 6330 bytes .../9d635/maxthon.png | Bin 0 -> 522 bytes .../02cd5/editor-5.png | Bin 0 -> 11073 bytes .../222b7/editor-5.png | Bin 0 -> 1736 bytes .../a6d36/editor-5.png | Bin 0 -> 17035 bytes .../ff46a/editor-5.png | Bin 0 -> 5858 bytes .../9d635/github.png | Bin 0 -> 845 bytes .../02cd5/editor-1.png | Bin 0 -> 7334 bytes .../222b7/editor-1.png | Bin 0 -> 1197 bytes .../a6d36/editor-1.png | Bin 0 -> 12327 bytes .../ff46a/editor-1.png | Bin 0 -> 3477 bytes .../1fbe8/match.png | Bin 0 -> 8998 bytes .../222b7/match.png | Bin 0 -> 1606 bytes .../a6d36/match.png | Bin 0 -> 11517 bytes .../ff46a/match.png | Bin 0 -> 4697 bytes .../02cd5/editor-3.png | Bin 0 -> 9828 bytes .../222b7/editor-3.png | Bin 0 -> 1570 bytes .../a6d36/editor-3.png | Bin 0 -> 14930 bytes .../ff46a/editor-3.png | Bin 0 -> 5367 bytes .../222b7/easy-1.png | Bin 0 -> 2080 bytes .../24c7e/easy-1.png | Bin 0 -> 5205 bytes .../ff46a/easy-1.png | Bin 0 -> 6479 bytes .../942f4/chrome.png | Bin 0 -> 1546 bytes .../9d635/firefox.png | Bin 0 -> 3070 bytes .../222b7/editor-6.png | Bin 0 -> 1886 bytes .../d10fb/editor-6.png | Bin 0 -> 8019 bytes .../ff46a/editor-6.png | Bin 0 -> 6059 bytes .../02cd5/editor-4.png | Bin 0 -> 15118 bytes .../222b7/editor-4.png | Bin 0 -> 2498 bytes .../a6d36/editor-4.png | Bin 0 -> 22301 bytes .../ff46a/editor-4.png | Bin 0 -> 8014 bytes .../9d635/edge.png | Bin 0 -> 2464 bytes .../vm-6437e4e5a400c6eff1c23ead4d549b0a.png | Bin 0 -> 10337 bytes styles.7152d3656b4955d5b035.css | 1 + sw.js | 178 ++ webpack-runtime-9331f5e1790af6c863ed.js | 2 + webpack-runtime-9331f5e1790af6c863ed.js.map | 1 + webpack.stats.json | 1 + workbox-v4.3.1/workbox-background-sync.dev.js | 822 +++++++ .../workbox-background-sync.dev.js.map | 1 + .../workbox-background-sync.prod.js | 2 + .../workbox-background-sync.prod.js.map | 1 + .../workbox-broadcast-update.dev.js | 496 +++++ .../workbox-broadcast-update.dev.js.map | 1 + .../workbox-broadcast-update.prod.js | 2 + .../workbox-broadcast-update.prod.js.map | 1 + .../workbox-cacheable-response.dev.js | 200 ++ .../workbox-cacheable-response.dev.js.map | 1 + .../workbox-cacheable-response.prod.js | 2 + .../workbox-cacheable-response.prod.js.map | 1 + workbox-v4.3.1/workbox-core.dev.js | 1712 +++++++++++++++ workbox-v4.3.1/workbox-core.dev.js.map | 1 + workbox-v4.3.1/workbox-core.prod.js | 2 + workbox-v4.3.1/workbox-core.prod.js.map | 1 + workbox-v4.3.1/workbox-expiration.dev.js | 652 ++++++ workbox-v4.3.1/workbox-expiration.dev.js.map | 1 + workbox-v4.3.1/workbox-expiration.prod.js | 2 + workbox-v4.3.1/workbox-expiration.prod.js.map | 1 + .../workbox-navigation-preload.dev.js | 110 + .../workbox-navigation-preload.dev.js.map | 1 + .../workbox-navigation-preload.prod.js | 2 + .../workbox-navigation-preload.prod.js.map | 1 + workbox-v4.3.1/workbox-offline-ga.dev.js | 243 +++ workbox-v4.3.1/workbox-offline-ga.dev.js.map | 1 + workbox-v4.3.1/workbox-offline-ga.prod.js | 2 + workbox-v4.3.1/workbox-offline-ga.prod.js.map | 1 + workbox-v4.3.1/workbox-precaching.dev.js | 989 +++++++++ workbox-v4.3.1/workbox-precaching.dev.js.map | 1 + workbox-v4.3.1/workbox-precaching.prod.js | 2 + workbox-v4.3.1/workbox-precaching.prod.js.map | 1 + workbox-v4.3.1/workbox-range-requests.dev.js | 268 +++ .../workbox-range-requests.dev.js.map | 1 + workbox-v4.3.1/workbox-range-requests.prod.js | 2 + .../workbox-range-requests.prod.js.map | 1 + workbox-v4.3.1/workbox-routing.dev.js | 1020 +++++++++ workbox-v4.3.1/workbox-routing.dev.js.map | 1 + workbox-v4.3.1/workbox-routing.prod.js | 2 + workbox-v4.3.1/workbox-routing.prod.js.map | 1 + workbox-v4.3.1/workbox-strategies.dev.js | 1138 ++++++++++ workbox-v4.3.1/workbox-strategies.dev.js.map | 1 + workbox-v4.3.1/workbox-strategies.prod.js | 2 + workbox-v4.3.1/workbox-strategies.prod.js.map | 1 + workbox-v4.3.1/workbox-streams.dev.js | 337 +++ workbox-v4.3.1/workbox-streams.dev.js.map | 1 + workbox-v4.3.1/workbox-streams.prod.js | 2 + workbox-v4.3.1/workbox-streams.prod.js.map | 1 + workbox-v4.3.1/workbox-sw.js | 2 + workbox-v4.3.1/workbox-sw.js.map | 1 + workbox-v4.3.1/workbox-window.dev.es5.mjs | 885 ++++++++ workbox-v4.3.1/workbox-window.dev.es5.mjs.map | 1 + workbox-v4.3.1/workbox-window.dev.mjs | 751 +++++++ workbox-v4.3.1/workbox-window.dev.mjs.map | 1 + workbox-v4.3.1/workbox-window.dev.umd.js | 896 ++++++++ workbox-v4.3.1/workbox-window.dev.umd.js.map | 1 + workbox-v4.3.1/workbox-window.prod.es5.mjs | 2 + .../workbox-window.prod.es5.mjs.map | 1 + workbox-v4.3.1/workbox-window.prod.mjs | 2 + workbox-v4.3.1/workbox-window.prod.mjs.map | 1 + workbox-v4.3.1/workbox-window.prod.umd.js | 2 + workbox-v4.3.1/workbox-window.prod.umd.js.map | 1 + ~partytown/debug/partytown-atomics.js | 572 +++++ ~partytown/debug/partytown-media.js | 374 ++++ ~partytown/debug/partytown-sandbox-sw.js | 559 +++++ ~partytown/debug/partytown-sw.js | 59 + ~partytown/debug/partytown-ww-atomics.js | 1881 +++++++++++++++++ ~partytown/debug/partytown-ww-sw.js | 1873 ++++++++++++++++ ~partytown/debug/partytown.js | 75 + ~partytown/partytown-atomics.js | 2 + ~partytown/partytown-media.js | 2 + ~partytown/partytown-sw.js | 2 + ~partytown/partytown.js | 2 + 235 files changed, 20032 insertions(+) create mode 100644 404.html create mode 100644 404/index.html create mode 100644 _gatsby/slices/_gatsby-scripts-1.html create mode 100644 api/gm/index.html create mode 100644 api/matching/index.html create mode 100644 api/metadata-block/index.html create mode 100644 app-64f2811254713e6e49a8.js create mode 100644 app-64f2811254713e6e49a8.js.LICENSE.txt create mode 100644 app-64f2811254713e6e49a8.js.map create mode 100644 c5a3695c8d75dc4f08b1dd07d707efd756d62ecd-d2251742f874e379db01.js create mode 100644 c5a3695c8d75dc4f08b1dd07d707efd756d62ecd-d2251742f874e379db01.js.map create mode 100644 chunk-map.json create mode 100644 component---cache-caches-gatsby-plugin-offline-app-shell-js-cb64605f204f20d86cc6.js create mode 100644 component---cache-caches-gatsby-plugin-offline-app-shell-js-cb64605f204f20d86cc6.js.map create mode 100644 component---src-pages-404-js-f492d11d80ac96643791.js create mode 100644 component---src-pages-404-js-f492d11d80ac96643791.js.map create mode 100644 component---src-pages-posts-js-2af8287b24b85f8a349a.js create mode 100644 component---src-pages-posts-js-2af8287b24b85f8a349a.js.map create mode 100644 component---src-templates-post-index-js-content-file-path-content-api-gm-md-8b41ac603591ac6753ab.js create mode 100644 component---src-templates-post-index-js-content-file-path-content-api-gm-md-8b41ac603591ac6753ab.js.map create mode 100644 component---src-templates-post-index-js-content-file-path-content-api-matching-md-e8309d58c91945d209b3.js create mode 100644 component---src-templates-post-index-js-content-file-path-content-api-matching-md-e8309d58c91945d209b3.js.map create mode 100644 component---src-templates-post-index-js-content-file-path-content-api-metadata-block-md-e0225f93d9e68bdcccfe.js create mode 100644 component---src-templates-post-index-js-content-file-path-content-api-metadata-block-md-e0225f93d9e68bdcccfe.js.map create mode 100644 component---src-templates-post-index-js-content-file-path-content-faq-index-md-3e073515d5b7aee08895.js create mode 100644 component---src-templates-post-index-js-content-file-path-content-faq-index-md-3e073515d5b7aee08895.js.map create mode 100644 component---src-templates-post-index-js-content-file-path-content-get-it-index-md-8232a8ad579335aa0806.js create mode 100644 component---src-templates-post-index-js-content-file-path-content-get-it-index-md-8232a8ad579335aa0806.js.map create mode 100644 component---src-templates-post-index-js-content-file-path-content-guide-creating-a-userscript-index-md-01d374f92879a9944d67.js create mode 100644 component---src-templates-post-index-js-content-file-path-content-guide-creating-a-userscript-index-md-01d374f92879a9944d67.js.map create mode 100644 component---src-templates-post-index-js-content-file-path-content-guide-keyboard-shortcuts-index-mdx-c5dc6c0850e752ed7672.js create mode 100644 component---src-templates-post-index-js-content-file-path-content-guide-keyboard-shortcuts-index-mdx-c5dc6c0850e752ed7672.js.map create mode 100644 component---src-templates-post-index-js-content-file-path-content-guide-observing-dom-index-md-10aeee7f45ced0a15aa3.js create mode 100644 component---src-templates-post-index-js-content-file-path-content-guide-observing-dom-index-md-10aeee7f45ced0a15aa3.js.map create mode 100644 component---src-templates-post-index-js-content-file-path-content-guide-using-modern-syntax-index-md-c8d9414d661bc1988e6a.js create mode 100644 component---src-templates-post-index-js-content-file-path-content-guide-using-modern-syntax-index-md-c8d9414d661bc1988e6a.js.map create mode 100644 component---src-templates-post-index-js-content-file-path-content-index-md-1c6d23836a98d9fe83d7.js create mode 100644 component---src-templates-post-index-js-content-file-path-content-index-md-1c6d23836a98d9fe83d7.js.map create mode 100644 component---src-templates-post-index-js-content-file-path-content-localization-index-md-430734c217f1c5151033.js create mode 100644 component---src-templates-post-index-js-content-file-path-content-localization-index-md-430734c217f1c5151033.js.map create mode 100644 component---src-templates-post-index-js-content-file-path-content-posts-features-in-userscript-generator-md-e37afad40b0497c9ed43.js create mode 100644 component---src-templates-post-index-js-content-file-path-content-posts-features-in-userscript-generator-md-e37afad40b0497c9ed43.js.map create mode 100644 component---src-templates-post-index-js-content-file-path-content-posts-how-to-edit-scripts-with-your-favorite-editor-index-md-04fa65d69f1f9d7bf5eb.js create mode 100644 component---src-templates-post-index-js-content-file-path-content-posts-how-to-edit-scripts-with-your-favorite-editor-index-md-04fa65d69f1f9d7bf5eb.js.map create mode 100644 component---src-templates-post-index-js-content-file-path-content-posts-inject-into-context-md-426a002ac27e601f0947.js create mode 100644 component---src-templates-post-index-js-content-file-path-content-posts-inject-into-context-md-426a002ac27e601f0947.js.map create mode 100644 component---src-templates-post-index-js-content-file-path-content-posts-inject-scripts-with-blob-urls-md-0c7e8eef22e98f312597.js create mode 100644 component---src-templates-post-index-js-content-file-path-content-posts-inject-scripts-with-blob-urls-md-0c7e8eef22e98f312597.js.map create mode 100644 component---src-templates-post-index-js-content-file-path-content-posts-smart-rules-for-blacklist-md-5c1bf3efdbc84e6dc9c3.js create mode 100644 component---src-templates-post-index-js-content-file-path-content-posts-smart-rules-for-blacklist-md-5c1bf3efdbc84e6dc9c3.js.map create mode 100644 component---src-templates-post-index-js-content-file-path-content-posts-violentmonkey-workflows-md-b8ea341c5a9e5271cf8d.js create mode 100644 component---src-templates-post-index-js-content-file-path-content-posts-violentmonkey-workflows-md-b8ea341c5a9e5271cf8d.js.map create mode 100644 component---src-templates-post-index-js-content-file-path-content-privacy-index-md-898886663a86da785181.js create mode 100644 component---src-templates-post-index-js-content-file-path-content-privacy-index-md-898886663a86da785181.js.map create mode 100644 component---src-templates-post-index-js-content-file-path-src-components-install-beta-mdx-72fc2c577f47a95406c1.js create mode 100644 component---src-templates-post-index-js-content-file-path-src-components-install-beta-mdx-72fc2c577f47a95406c1.js.map create mode 100644 component---src-templates-post-index-js-content-file-path-src-components-install-stable-mdx-c82902d8e42e2b5f3f9a.js create mode 100644 component---src-templates-post-index-js-content-file-path-src-components-install-stable-mdx-c82902d8e42e2b5f3f9a.js.map create mode 100644 components/install-beta/index.html create mode 100644 components/install-stable/index.html create mode 100644 faq/index.html create mode 100644 favicon-32x32.png create mode 100644 get-it/index.html create mode 100644 guide/creating-a-userscript/index.html create mode 100644 guide/keyboard-shortcuts/index.html create mode 100644 guide/observing-dom/index.html create mode 100644 guide/using-modern-syntax/index.html create mode 100644 icons/icon-144x144.png create mode 100644 icons/icon-192x192.png create mode 100644 icons/icon-256x256.png create mode 100644 icons/icon-384x384.png create mode 100644 icons/icon-48x48.png create mode 100644 icons/icon-512x512.png create mode 100644 icons/icon-72x72.png create mode 100644 icons/icon-96x96.png create mode 100644 idb-keyval-3.2.0-iife.min.js create mode 100644 index.html create mode 100644 localization/index.html create mode 100644 manifest.webmanifest create mode 100644 offline-plugin-app-shell-fallback/index.html create mode 100644 page-data/404.html/page-data.json create mode 100644 page-data/404/page-data.json create mode 100644 page-data/api/gm/page-data.json create mode 100644 page-data/api/matching/page-data.json create mode 100644 page-data/api/metadata-block/page-data.json create mode 100644 page-data/app-data.json create mode 100644 page-data/components/install-beta/page-data.json create mode 100644 page-data/components/install-stable/page-data.json create mode 100644 page-data/faq/page-data.json create mode 100644 page-data/get-it/page-data.json create mode 100644 page-data/guide/creating-a-userscript/page-data.json create mode 100644 page-data/guide/keyboard-shortcuts/page-data.json create mode 100644 page-data/guide/observing-dom/page-data.json create mode 100644 page-data/guide/using-modern-syntax/page-data.json create mode 100644 page-data/index/page-data.json create mode 100644 page-data/localization/page-data.json create mode 100644 page-data/offline-plugin-app-shell-fallback/page-data.json create mode 100644 page-data/posts/features-in-userscript-generator/page-data.json create mode 100644 page-data/posts/how-to-edit-scripts-with-your-favorite-editor/page-data.json create mode 100644 page-data/posts/inject-into-context/page-data.json create mode 100644 page-data/posts/inject-scripts-with-blob-urls/page-data.json create mode 100644 page-data/posts/page-data.json create mode 100644 page-data/posts/smart-rules-for-blacklist/page-data.json create mode 100644 page-data/posts/violentmonkey-workflows/page-data.json create mode 100644 page-data/privacy/page-data.json create mode 100644 page-data/sq/d/1116475411.json create mode 100644 page-data/sq/d/1700780748.json create mode 100644 page-data/sq/d/2344890832.json create mode 100644 page-data/sq/d/3202921338.json create mode 100644 page-data/sq/d/3798213247.json create mode 100644 polyfill-c7af91edbbea3673745d.js create mode 100644 polyfill-c7af91edbbea3673745d.js.map create mode 100644 posts/features-in-userscript-generator/index.html create mode 100644 posts/how-to-edit-scripts-with-your-favorite-editor/index.html create mode 100644 posts/index.html create mode 100644 posts/inject-into-context/index.html create mode 100644 posts/inject-scripts-with-blob-urls/index.html create mode 100644 posts/smart-rules-for-blacklist/index.html create mode 100644 posts/violentmonkey-workflows/index.html create mode 100644 privacy/index.html create mode 100644 sitemap-0.xml create mode 100644 sitemap-index.xml create mode 100644 static/17a5d02e3af9acd5c40e180192fa9e07/222b7/editor-2.png create mode 100644 static/17a5d02e3af9acd5c40e180192fa9e07/6114d/editor-2.png create mode 100644 static/17a5d02e3af9acd5c40e180192fa9e07/ff46a/editor-2.png create mode 100644 static/417c33e94510295d5d31457c6a370464/9d635/maxthon.png create mode 100644 static/421f4c24f117d74eacd0208b1870bfb9/02cd5/editor-5.png create mode 100644 static/421f4c24f117d74eacd0208b1870bfb9/222b7/editor-5.png create mode 100644 static/421f4c24f117d74eacd0208b1870bfb9/a6d36/editor-5.png create mode 100644 static/421f4c24f117d74eacd0208b1870bfb9/ff46a/editor-5.png create mode 100644 static/49c98c639750ed124996d21d44c0a89e/9d635/github.png create mode 100644 static/52e07bc04265f6628af77e2ed266053e/02cd5/editor-1.png create mode 100644 static/52e07bc04265f6628af77e2ed266053e/222b7/editor-1.png create mode 100644 static/52e07bc04265f6628af77e2ed266053e/a6d36/editor-1.png create mode 100644 static/52e07bc04265f6628af77e2ed266053e/ff46a/editor-1.png create mode 100644 static/5353fff61b7784074245599dfc3ebf63/1fbe8/match.png create mode 100644 static/5353fff61b7784074245599dfc3ebf63/222b7/match.png create mode 100644 static/5353fff61b7784074245599dfc3ebf63/a6d36/match.png create mode 100644 static/5353fff61b7784074245599dfc3ebf63/ff46a/match.png create mode 100644 static/661dce4756c0ba64899cbb919da56f8b/02cd5/editor-3.png create mode 100644 static/661dce4756c0ba64899cbb919da56f8b/222b7/editor-3.png create mode 100644 static/661dce4756c0ba64899cbb919da56f8b/a6d36/editor-3.png create mode 100644 static/661dce4756c0ba64899cbb919da56f8b/ff46a/editor-3.png create mode 100644 static/80726b39919f5a205b7af42b156d5bc9/222b7/easy-1.png create mode 100644 static/80726b39919f5a205b7af42b156d5bc9/24c7e/easy-1.png create mode 100644 static/80726b39919f5a205b7af42b156d5bc9/ff46a/easy-1.png create mode 100644 static/8cc7a9ead9c41330ebc5e5e4e6fa5a52/942f4/chrome.png create mode 100644 static/b302ac873f1a2ebe23de71f9e88e0ff8/9d635/firefox.png create mode 100644 static/bf23974b6eeaef641a71bf08d1f2dd1c/222b7/editor-6.png create mode 100644 static/bf23974b6eeaef641a71bf08d1f2dd1c/d10fb/editor-6.png create mode 100644 static/bf23974b6eeaef641a71bf08d1f2dd1c/ff46a/editor-6.png create mode 100644 static/c24d0bc496b005979d19eb4d4d6db0b5/02cd5/editor-4.png create mode 100644 static/c24d0bc496b005979d19eb4d4d6db0b5/222b7/editor-4.png create mode 100644 static/c24d0bc496b005979d19eb4d4d6db0b5/a6d36/editor-4.png create mode 100644 static/c24d0bc496b005979d19eb4d4d6db0b5/ff46a/editor-4.png create mode 100644 static/c2d555bd768e2e4658e93229e4a2c51c/9d635/edge.png create mode 100644 static/vm-6437e4e5a400c6eff1c23ead4d549b0a.png create mode 100644 styles.7152d3656b4955d5b035.css create mode 100644 sw.js create mode 100644 webpack-runtime-9331f5e1790af6c863ed.js create mode 100644 webpack-runtime-9331f5e1790af6c863ed.js.map create mode 100644 webpack.stats.json create mode 100644 workbox-v4.3.1/workbox-background-sync.dev.js create mode 100644 workbox-v4.3.1/workbox-background-sync.dev.js.map create mode 100644 workbox-v4.3.1/workbox-background-sync.prod.js create mode 100644 workbox-v4.3.1/workbox-background-sync.prod.js.map create mode 100644 workbox-v4.3.1/workbox-broadcast-update.dev.js create mode 100644 workbox-v4.3.1/workbox-broadcast-update.dev.js.map create mode 100644 workbox-v4.3.1/workbox-broadcast-update.prod.js create mode 100644 workbox-v4.3.1/workbox-broadcast-update.prod.js.map create mode 100644 workbox-v4.3.1/workbox-cacheable-response.dev.js create mode 100644 workbox-v4.3.1/workbox-cacheable-response.dev.js.map create mode 100644 workbox-v4.3.1/workbox-cacheable-response.prod.js create mode 100644 workbox-v4.3.1/workbox-cacheable-response.prod.js.map create mode 100644 workbox-v4.3.1/workbox-core.dev.js create mode 100644 workbox-v4.3.1/workbox-core.dev.js.map create mode 100644 workbox-v4.3.1/workbox-core.prod.js create mode 100644 workbox-v4.3.1/workbox-core.prod.js.map create mode 100644 workbox-v4.3.1/workbox-expiration.dev.js create mode 100644 workbox-v4.3.1/workbox-expiration.dev.js.map create mode 100644 workbox-v4.3.1/workbox-expiration.prod.js create mode 100644 workbox-v4.3.1/workbox-expiration.prod.js.map create mode 100644 workbox-v4.3.1/workbox-navigation-preload.dev.js create mode 100644 workbox-v4.3.1/workbox-navigation-preload.dev.js.map create mode 100644 workbox-v4.3.1/workbox-navigation-preload.prod.js create mode 100644 workbox-v4.3.1/workbox-navigation-preload.prod.js.map create mode 100644 workbox-v4.3.1/workbox-offline-ga.dev.js create mode 100644 workbox-v4.3.1/workbox-offline-ga.dev.js.map create mode 100644 workbox-v4.3.1/workbox-offline-ga.prod.js create mode 100644 workbox-v4.3.1/workbox-offline-ga.prod.js.map create mode 100644 workbox-v4.3.1/workbox-precaching.dev.js create mode 100644 workbox-v4.3.1/workbox-precaching.dev.js.map create mode 100644 workbox-v4.3.1/workbox-precaching.prod.js create mode 100644 workbox-v4.3.1/workbox-precaching.prod.js.map create mode 100644 workbox-v4.3.1/workbox-range-requests.dev.js create mode 100644 workbox-v4.3.1/workbox-range-requests.dev.js.map create mode 100644 workbox-v4.3.1/workbox-range-requests.prod.js create mode 100644 workbox-v4.3.1/workbox-range-requests.prod.js.map create mode 100644 workbox-v4.3.1/workbox-routing.dev.js create mode 100644 workbox-v4.3.1/workbox-routing.dev.js.map create mode 100644 workbox-v4.3.1/workbox-routing.prod.js create mode 100644 workbox-v4.3.1/workbox-routing.prod.js.map create mode 100644 workbox-v4.3.1/workbox-strategies.dev.js create mode 100644 workbox-v4.3.1/workbox-strategies.dev.js.map create mode 100644 workbox-v4.3.1/workbox-strategies.prod.js create mode 100644 workbox-v4.3.1/workbox-strategies.prod.js.map create mode 100644 workbox-v4.3.1/workbox-streams.dev.js create mode 100644 workbox-v4.3.1/workbox-streams.dev.js.map create mode 100644 workbox-v4.3.1/workbox-streams.prod.js create mode 100644 workbox-v4.3.1/workbox-streams.prod.js.map create mode 100644 workbox-v4.3.1/workbox-sw.js create mode 100644 workbox-v4.3.1/workbox-sw.js.map create mode 100644 workbox-v4.3.1/workbox-window.dev.es5.mjs create mode 100644 workbox-v4.3.1/workbox-window.dev.es5.mjs.map create mode 100644 workbox-v4.3.1/workbox-window.dev.mjs create mode 100644 workbox-v4.3.1/workbox-window.dev.mjs.map create mode 100644 workbox-v4.3.1/workbox-window.dev.umd.js create mode 100644 workbox-v4.3.1/workbox-window.dev.umd.js.map create mode 100644 workbox-v4.3.1/workbox-window.prod.es5.mjs create mode 100644 workbox-v4.3.1/workbox-window.prod.es5.mjs.map create mode 100644 workbox-v4.3.1/workbox-window.prod.mjs create mode 100644 workbox-v4.3.1/workbox-window.prod.mjs.map create mode 100644 workbox-v4.3.1/workbox-window.prod.umd.js create mode 100644 workbox-v4.3.1/workbox-window.prod.umd.js.map create mode 100644 ~partytown/debug/partytown-atomics.js create mode 100644 ~partytown/debug/partytown-media.js create mode 100644 ~partytown/debug/partytown-sandbox-sw.js create mode 100644 ~partytown/debug/partytown-sw.js create mode 100644 ~partytown/debug/partytown-ww-atomics.js create mode 100644 ~partytown/debug/partytown-ww-sw.js create mode 100644 ~partytown/debug/partytown.js create mode 100644 ~partytown/partytown-atomics.js create mode 100644 ~partytown/partytown-media.js create mode 100644 ~partytown/partytown-sw.js create mode 100644 ~partytown/partytown.js diff --git a/404.html b/404.html new file mode 100644 index 00000000..3d2cd10b --- /dev/null +++ b/404.html @@ -0,0 +1,67 @@ +Violentmonkey

Not Found

You just hit a route that doesn't exist... the sadness.

Open Chat
+ + \ No newline at end of file diff --git a/404/index.html b/404/index.html new file mode 100644 index 00000000..1198def4 --- /dev/null +++ b/404/index.html @@ -0,0 +1,67 @@ +Violentmonkey

Not Found

You just hit a route that doesn't exist... the sadness.

Open Chat
+ + \ No newline at end of file diff --git a/_gatsby/slices/_gatsby-scripts-1.html b/_gatsby/slices/_gatsby-scripts-1.html new file mode 100644 index 00000000..eda44f4a --- /dev/null +++ b/_gatsby/slices/_gatsby-scripts-1.html @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/api/gm/index.html b/api/gm/index.html new file mode 100644 index 00000000..35fd8b25 --- /dev/null +++ b/api/gm/index.html @@ -0,0 +1,772 @@ +Violentmonkey

GM_* APIs

Table of Contents

Violentmonkey APIs are derived from those in Greasemonkey v3, and most of them work the same way, GM.* Greasemonkey v4-compatible aliases were added in VM2.12.0.

+

GM_*

+

GM_* are a group of special APIs provided by Violentmonkey.

+

GM_info

+

An object that exposes information about the current userscript. It has following properties:

+
    +
  • +uuid: string +

    A unique ID of the script.

    +
  • +
  • +scriptMetaStr: string +

    The meta block of the script.

    +
  • +
  • +scriptWillUpdate: boolean +

    Whether the script will be updated automatically.

    +
  • +
  • +scriptHandler: string +

    The name of userscript manager, which should be the string Violentmonkey.

    +
  • +
  • +version: string +

    Version of Violentmonkey.

    +
  • +
  • +platform: object- since VM2.12.4 +

    Unlike navigator.userAgent, which can be overriden by other extensions/userscripts or by devtools in device-emulation mode, GM_info.platform is more reliable as the data is obtained in the background page of Violentmonkey using a specialized extension API (browser.runtime.getPlatformInfo and getBrowserInfo).

    +
      +
    • +arch: string +

      One of "arm", "mips", "mips64", "x86-32", "x86-64".

      +
    • +
    • +browserName: string +

      "chrome", "firefox" or whatever was returned by the API.

      +
    • +
    • +browserVersion: string +
    • +
    • +os: string +

      One of "android", "cros", "linux", "mac", "openbsd", "win".

      +
    • +
    +
  • +
  • +script: object +

    Contains structured fields from the Metadata Block:

    +
      +
    • +description: string +
    • +
    • +excludes: string[] +
    • +
    • +includes: string[] +
    • +
    • +matches: string[] +
    • +
    • +name: string +
    • +
    • +namespace: string +
    • +
    • +resources: Array<{name, url}> +
    • +
    • +runAt: string +
    • +
    • +version: string +
    • +
    +
  • +
  • +injectInto: string- since VM2.10.0 +

    The injection mode of current script. See @inject-mode for more information.

    +
  • +
+

GM_getValue

+

Retrieves a value for current script from storage.

+
let value = GM_getValue(key, defaultValue)
+
+
    +
  • +key: string +

    The name for value to load.

    +
  • +
  • +defaultValue: any +

    The default value to return if no value exists in the storage.

    +
  • +
+

GM_setValue

+

Sets a key / value pair for current script to storage.

+
GM_setValue(key, value)
+
+
    +
  • +key: string +

    The unique name for value within this script.

    +
  • +
  • +value: any +

    The value to be stored, which must be JSON serializable (string, number, boolean, null, or an array/object consisting of these types) so for example you can't store DOM elements or objects with cyclic dependencies.

    +
  • +
+

GM_deleteValue

+

Deletes an existing key / value pair for current script from storage.

+
GM_deleteValue(key)
+
+
    +
  • +key: string +

    The unique name for value within this script.

    +
  • +
+

GM_listValues

+

Returns an array of keys of all available values within this script.

+
let arrayOfKeys = GM_listValues()
+
+

GM_addValueChangeListener

+

Adds a change listener to the storage and returns the listener ID.

+
let listenerId = GM_addValueChangeListener(name, callback)
+
+
    +
  • +name: string +

    The name of the observed variable

    +
  • +
  • +callback: (name, oldValue, newValue, remote) => void +
      +
    • +name: string +

      The name of the observed variable

      +
    • +
    • +oldValue: any +

      The old value of the observed variable (undefined if it was created)

      +
    • +
    • +newValue: any +

      The new value of the observed variable (undefined if it was deleted)

      +
    • +
    • +remote: boolean +

      true if modified by the userscript instance of another tab or false for this script instance. Can be used by scripts of different browser tabs to communicate with each other.

      +
    • +
    +
  • +
+

GM_removeValueChangeListener

+

Removes a change listener by its ID.

+
GM_removeValueChangeListener(listenerId)
+
+
    +
  • +listenerId: string +
  • +
+

GM_getResourceText

+

Retrieves a text resource from the metadata block.

+
let text = GM_getResourceText(name)
+
+
    +
  • +name: string +

    Name of a resource defined in the metadata block.

    +
  • +
+

GM_getResourceURL

+

Retrieves a blob: or data: URL of a resource from the metadata block.

+
let blobUrl = GM_getResourceURL(name);
+let blobOrDataUrl = GM_getResourceURL(name, isBlobUrl);
+
+
    +
  • +name: string +

    Name of a resource defined in the metadata block.

    +
  • +
  • +isBlobUrl: boolean = true- since VM2.13.1 +
      +
    • +

      true returns a blob: URL. It's short and cacheable, so it's good for reusing in multiple DOM elements.

      +
    • +
    • +

      false returns a data: URL. It's long so reusing it in DOM may be less performant due to the lack of caching, but it's particularly handy for direct synchronous decoding of the data on sites that forbid fetching blob: in their CSP.

      +
    • +
    +
  • +
+

Note: when setting this URL as src or href of a DOM element, it may fail on some sites with a particularly strict CSP that forbids blob: or data: URLs. Such sites are rare though. The workaround in Chrome is to use GM_addElement, whereas in Firefox you'll have to disable CSP either globally via about:config or by using an additional extension that modifies HTTP headers selectively.

+

GM_addElement

+

Since VM2.13.1

+

Appends and returns an element with the specified attributes.

+
let element1 = GM_addElement(tagName, attributes);
+let element2 = GM_addElement(parentNode, tagName, attributes);
+
+
    +
  • +parentNode?: Node | Element | ShadowRoot +

    The parent node to which the new node will be appended.

    +

    It can be inside ShadowDOM: someElement.shadowRoot.

    +

    When omitted, it'll be determined automatically:

    +
      +
    1. document.head (<head>) for script, link, style, meta tags.
    2. +
    3. document.body (<body>) for other tags or when there's no <head>.
    4. +
    5. document.documentElement (<html> or an XML root node) otherwise.
    6. +
    +
  • +
  • +tagName: string +

    A tag name like 'script'. Any valid HTML tag can be used, but the only motivation for this API was to add script, link, style elements when they are disallowed by a strict Content-Security-Policy of the site e.g. github.com, twitter.com.

    +
  • +
  • +attributes?: object +

    The keys are HTML attributes, not DOM properties, except textContent which sets DOM property textContent. The values are strings so if you want to assign a private function to onload you can do it after the element is created.

    +
  • +
+

Examples:

+
// using a private function in `onload`
+let el = GM_addElement('script', { src: 'https://....' });
+el.onload = () => console.log('loaded', el);
+
+
// same as GM_addStyle('a { color:red }')
+let el = GM_addElement('style', { textContent: 'a { color:red }' });
+
+
// appending to an arbitrary node
+let el = GM_addElement(parentElement.shadowRoot, 'iframe', { src: url });
+
+

Notes:

+
    +
  • The element is returned immediately (synchronously) even with GM.addElement, no need for .then(), but you can use it if you want, just once though as it's auto-removed to avoid recursion. The API is synchronous because Violentmonkey runs scripts only when the root element appears, so there's always a node to serve as a parent.
  • +
  • Invalid arguments will raise an exception, which can be caught using try {} catch (e) {}, just like standard DOM API document.createElement.
  • +
  • This API is experimental in Tampermonkey, and hence subject to change.
  • +
+

GM_addStyle

+

Appends and returns a <style> element with the specified CSS.

+
let styleElement = GM_addStyle(css);
+
+
    +
  • +css: string +

    The CSS code to inject.

    +
  • +
+

Older versions of Violentmonkey (prior to 2.12.0) returned an imitation of Promise, +which is still maintained for compatibility, so don't be surprised if you see code like +GM_addStyle(css).then(el => { /* whatever */ });

+

GM_openInTab

+

Opens URL in a new tab.

+
    +
  1. +

    using an object

    +
    let tabControl = GM_openInTab(url, options)
    +
    +
      +
    • +url: string +

      The URL to open in a new tab. URL relative to current page is also allowed.

      +

      Note that Firefox disallows data:, blob:, chrome:, file:, and many about: URLs.

      +
    • +
    • +options?: object +
        +
      • +active: boolean = true +

        Make the new tab active (i.e. open in foreground).

        +
      • +
      • +container?: number- since VM2.12.5, Firefox-only +

        Set tab's container in Firefox:

        +
          +
        • not specified = reuse script's tab container
        • +
        • 0 = default (main) container
        • +
        • 1, 2, etc. = internal container index
        • +
        +
      • +
      • +insert: boolean = true- since VM2.11.0 +

        Insert the new tab next to the current tab and set its "openerTab" so when it's closed the original tab will be focused automatically. When false or not specified, the usual browser behavior is to open the tab at the end of the tab list.

        +
      • +
      • +pinned: boolean = false- since VM2.12.5 +

        Pin the tab (i.e. show without a title at the beginning of the tab list).

        +
      • +
      +
    • +
    +
  2. +
  3. +

    Using a boolean, compatible with Greasemonkey:

    +
    let tabControl = GM_openInTab(url, openInBackground)
    +
    +
      +
    • +openInBackground: boolean +

      Open the tab in background. +Note, this is a reverse of the first usage method so for example true is the same as { active: false }.

      +
    • +
    +
  4. +
+

Returns an object with following properties:

+
    +
  • +onclose?: () => void +

    Сan be assigned to a function. If provided, it will be called when the opened tab is closed.

    +
  • +
  • +closed: boolean +

    Whether the opened tab is closed.

    +
  • +
  • +close: () => void +

    A function to explicitly close the opened tab.

    +
  • +
+
let tabControl = GM_openInTab(url);
+tabControl.onclose = () => console.log('tab is closed');
+tabControl.close();
+
+

GM_registerMenuCommand

+

Registers a command in Violentmonkey popup menu.

+
GM_registerMenuCommand(caption, onClick)
+// v2.12.5 and newer return an `id` equal to `caption` for compatibility with TM
+const id = GM_registerMenuCommand(caption, onClick)
+
+
    +
  • +caption: string +

    The name to show in the popup menu.

    +
  • +
  • +onClick: () => void +

    When the command is clicked in the menu, this function will run with the following parameter:

    +
      +
    • event: MouseEvent | KeyboardEvent- since VM2.13.1 is the event that activated the command so you can check event.button, event.shiftKey, event.key, and so on.
    • +
    +
  • +
+

If you want to add a shortcut, please see vm.shortcut.

+

GM_unregisterMenuCommand

+

Unregisters a command which has been registered to Violentmonkey popup menu.

+
GM_unregisterMenuCommand(caption)
+
+
    +
  • +caption: string +

    The name of command to unregister.

    +
  • +
+

GM_notification

+

Shows an HTML5 desktop notification.

+
    +
  1. +

    using an object:

    +
    let control = GM_notification(options)
    +
    +
      +
    • +options: object +
        +
      • +text: string +

        Main text of the notification.

        +
      • +
      • +title?: string +

        Title of the notification.

        +
      • +
      • +image?: string +

        URL of an image to show in the notification.

        +
      • +
      • +silent?: boolean = false- since VM2.15.2, Chrome 70 +

        No sounds/vibrations when showing the notification. Only for Chromium-based browsers as of Aug 2023.

        +
      • +
      • +tag?: string- since VM2.15.4 +

        Unique name of the notification, e.g. 'abc', same as the web Notification API. Names are scoped to each userscript i.e. your tag won't clash with another script's tag.

        +

        The purpose of a tagged notification is to replace an older notification with the same tag, even if it was shown in another tab (or before this tab was navigated elsewhere and your notification had zombieTimeout).

        +
      • +
      • +zombieTimeout?: number = 0- since VM2.15.4 +

        Number of milliseconds to keep the notification after the userscript "dies", i.e. when its tab or frame is reloaded/closed/navigated. If not specified or invalid, the default behavior is to immediately remove the notifications.

        +
      • +
      • +onclick?: () => void +

        Callback when the notification is clicked by user. As of VM2.15.2 it also forces the notification to be visible until clicked in Chrome which by default hides the notification after a few seconds.

        +
      • +
      • +ondone?: () => void +

        Callback when the notification is closed, either by user or by system.

        +
      • +
      +
    • +
    +
  2. +
  3. +

    Using separate parameters, compatible with Greasemonkey:

    +
    GM_notification(text, title, image, onclick)
    +
    +
      +
    • +text: string +

      Main text of the notification.

      +
    • +
    • +title?: string +

      Title of the notification.

      +
    • +
    • +image?: string +

      URL of an image to show in the notification.

      +
    • +
    • +onclick?: () => void +

      Callback when the notification is clicked by user.

      +
    • +
    +
  4. +
+

As of VM2.12.8 returns a control object with the following properties:

+
    +
  • +remove: () => Promise<void> +

    A function to remove the notification.

    +
  • +
+

GM_setClipboard

+

Sets data to system clipboard.

+
GM_setClipboard(data, type)
+
+
    +
  • +data: string +

    The data to be copied to system clipboard.

    +
  • +
  • +type: string = 'text/plain' +

    The MIME type of data to copy.

    +
  • +
+

GM_xmlhttpRequest

+

Makes a request like XMLHttpRequest, with some special capabilities, not restricted by same-origin policy.

+

Note: h is lowercase (the historical spelling).

+
let control = GM_xmlhttpRequest(details)
+
+
    +
  • +details: object +
      +
    • +url: string +

      URL relative to current page is also allowed.

      +
    • +
    • +method?: string +

      Usually GET.

      +
    • +
    • +user?: string +

      User for authentication.

      +
    • +
    • +password?: string +

      Password for authentication.

      +
    • +
    • +overrideMimeType?: string +

      A MIME type to specify with the request.

      +
    • +
    • +headers?: object +

      For example { 'name1': 'value1', 'name2': 'value2' }.

      +

      Some special headers are also allowed:

      +
        +
      • 'Cookie'
      • +
      • 'Host'
      • +
      • 'Origin'
      • +
      • 'Referer'
      • +
      • 'User-Agent'
      • +
      +
    • +
    • +responseType?: string +

      One of the following:

      +
        +
      • 'text' 👈 default
      • +
      • 'json'
      • +
      • 'blob'
      • +
      • 'arraybuffer'
      • +
      • 'document' (since VM2.12.0)
      • +
      +
    • +
    • +timeout?: number- since VM2.9.5 +

      Time to wait for the request, none by default.

      +
    • +
    • +data?: string | ArrayBuffer | Blob | DataView | FormData | ReadableStream | TypedArray | URLSearchParams +

      Data to send with the request, usually for POST and PUT requests.

      +
    • +
    • +binary?: boolean- since VM2.12.2 +

      Send the data string as a blob. This is for compatibility with Tampermonkey/Greasemonkey, where only string type is allowed in data.

      +
    • +
    • +context?: any +

      Can be an object and will be assigned to context of the response object.

      +
    • +
    • +anonymous?: boolean = false- since VM2.10.1 +

      When set to true, no cookie will be sent with the request and since VM2.12.5 the response cookies will be ignored.

      +

      When absent, an inverted value of Greasemonkey4-compatible withCredentials is used. Note that Violentmonkey sends cookies by default, like Tampermonkey, but unlike Greasemonkey4 (same-origin url only).

      +
    • +
    +

    Event handlers:

    +
      +
    • +onabort?: () => void +
    • +
    • +onerror?: () => void +
    • +
    • +onload?: () => void +
    • +
    • +onloadend?: () => void +
    • +
    • +onloadstart?: () => void- since VM2.12.5 +
    • +
    • +onprogress?: () => void +
    • +
    • +onreadystatechange?: () => void +
    • +
    • +ontimeout?: () => void +
    • +
    +

    Each event handler is a function that accepts one argument responseObject

    +
  • +
+
+

Note:

+
    +
  • synchronous is not supported.
  • +
+
+

Returns a control object with the following properties:

+
    +
  • +abort: () => void +

    A function to abort the request.

    +
  • +
+

The response object is passed to each event handler with the following properties, most of which are identical to those provided by the standard XMLHttpRequest:

+
    +
  • +status: number +
  • +
  • +statusText: string +
  • +
  • +readyState: number +
  • +
  • +responseHeaders: string +
  • +
  • +response: string | Blob | ArrayBuffer | Document | object | null +
  • +
  • responseText: string | undefined, only provided when available
  • +
  • responseXML: Document | null- since VM2.13.4, only provided when available
  • +
  • lengthComputable: boolean, only provided when available
  • +
  • loaded: number, only provided when available
  • +
  • total: number, only provided when available
  • +
  • finalUrl: string, the final URL after redirection
  • +
  • context: any, the same context object you specified in details
  • +
+

GM_download

+

Since VM2.9.5

+

Downloads a URL to a local file.

+
    +
  1. +

    using an object:

    +
    GM_download(options)
    +
    +
      +
    • +

      options: object:

      +
        +
      • +url: string +

        The URL to download.

        +
      • +
      • +name: string +

        The filename to save to. Folders/subpaths aren't supported yet.

        +
      • +
      +

      Most GM_xmlhttpRequest options are supported.

      +
        +
      • +headers?: object +
      • +
      • +timeout?: number- since VM2.9.5 +
      • +
      • +context?: any- since VM2.13.4 +
      • +
      • +user?: string- since VM2.13.4 +
      • +
      • +password?: string- since VM2.13.4 +
      • +
      • +anonymous?: boolean = false- since VM2.13.4 +
      • +
      • +onabort?: () => void- since VM2.13.4 +
      • +
      • +onerror?: () => void +
      • +
      • +onload?: () => void +
      • +
      • +onloadend?: () => void- since VM2.13.4 +
      • +
      • +onloadstart?: () => void- since VM2.13.4 +
      • +
      • +onprogress?: () => void +
      • +
      • +onreadystatechange?: () => void- since VM2.13.4 +
      • +
      • +ontimeout?: () => void +
      • +
      +

      The onload event handler is called after the data is downloaded from URL, before writing the file.

      +
    • +
    +
  2. +
  3. +

    using separate parameters:

    +
    GM_download(url, name)
    +
    +
      +
    • +url: string +

      The URL to download.

      +
    • +
    • +name: string +

      The filename to save to. Folders/subpaths aren't supported yet.

      +
    • +
    +
  4. +
+

Returns a control object with the following properties, same as GM_xmlhttpRequest:

+
    +
  • +abort: () => void +

    A function to abort the request.

    +
  • +
+

GM.*

+

GM (since VM2.12.0) is a single variable with Greasemonkey4-compatible aliases:

+ +

The async functions return a Promise that's resolved with the returned value.


Open Chat
+ + \ No newline at end of file diff --git a/api/matching/index.html b/api/matching/index.html new file mode 100644 index 00000000..b5284dfc --- /dev/null +++ b/api/matching/index.html @@ -0,0 +1,154 @@ +Violentmonkey

Matching

Table of Contents

There are four types of rules: @match / @exclude-match / @include / @exclude in Violentmonkey.

+

@match / @exclude-match

+

It is recommended to use @match / @exclude-match rather than @include / @exclude because the match rules are safer and more strict.

+

@match defines a URL matching rule. @exclude-match defines a match rule but used to exclude the matched URLs, similar to @exclude.

+

For more details, see Match Patterns for Chrome extensions.

+

Note that match patterns only work on scheme, host and path, i.e. match patterns always ignore query string and hash.

+

Since Violentmonkey v2.10.4, some additional rules are accepted:

+
    +
  • the scheme part accepts http* to match http or https;
  • +
  • the host part accepts wildcards (*) at any position, e.g. www.google.*;
  • +
  • the host part accepts .tld to match any top level domain suffix.
  • +
+

Examples:

+
// @match *://*/*
+// @exclude-match *://*.tk/*
+
+

@include / @exclude

+

Each @include and @exclude rule can be one of the following:

+
    +
  • +

    a normal string

    +

    If the string does not start or end with a slash (/), it will be used as a normal string.

    +

    If there are wildcards (*), each of them matches any characters.

    +

    e.g. https://www.google.com/* matches the following:

    +
      +
    • https://www.google.com/
    • +
    • https://www.google.com/any/subview
    • +
    +

    but not the following:

    +
      +
    • http://www.google.com/
    • +
    • https://www.google.com.hk/
    • +
    +

    If there is no wildcard in the string, the rule matches the entire URL.

    +

    e.g. https://www.google.com/ matches only https://www.google.com/ but not https://www.google.com/any/subview.

    +

    The host part accepts .tld to match top level domain suffix.

    +

    e.g. https://www.google.tld/ matches both https://www.google.com/ and https://www.google.co.jp/.

    +
  • +
  • +

    a regular expression

    +

    If the string starts and ends with a slash (/), it will be compiled as a regular expression.

    +

    e.g. /\.google\.com[\.\/]/ matches the following:

    +
      +
    • https://www.google.com/,
    • +
    • https://www.google.com/any/subview
    • +
    • http://www.google.com/
    • +
    • https://www.google.com.hk/
    • +
    +
  • +
+

Examples:

+
// @include *
+// @include https://www.google.com/*
+// @include /\.com\.hk\//
+// @exclude https://www.google.com/exact/url
+
+

How does a script match?

+

In short, a script will execute if it matches any @match or @include rule and does not match any @exclude-match or @exclude rule.

+

Here is the long version:

+
    +
  • If any @exclude-match or @exclude rule matches, the script does not match.
  • +
  • Otherwise if any @match rule is defined, the script matches only if some of the @match rules match.
  • +
  • If no @match rule is defined, we fallback to @include rules and the script matches only if some of the @include rules match.
  • +
  • If neither @match nor @include rule is defined, the script is assumed to match.
  • +
+ + + match.png +

Open Chat
+ + \ No newline at end of file diff --git a/api/metadata-block/index.html b/api/metadata-block/index.html new file mode 100644 index 00000000..1748debc --- /dev/null +++ b/api/metadata-block/index.html @@ -0,0 +1,231 @@ +Violentmonkey

Metadata Block

Table of Contents

The metadata must follow the format:

+
// ==UserScript==
+// @key value
+// ==/UserScript==
+
+

Each line of the block must start with //, the first line must be // ==UserScript== and the last line must be // ==/UserScript==. No extra space is allowed at the beginning or ending of line.

+

Some of the keys can be localized for multiple languages, by adding a colon and the locale code to the key, e.g. @name:zh-CN. The locale code is case insensitive.

+

Labels:

+
    +
  • required The key must be set.
  • +
  • multilingual The key can be localized by appending a colon and the locale code, e.g. @name:zh-CN.
  • +
  • multiple The key can be set multiple times.
  • +
+

@name

+

requiredmultilingual

+

The name of the script, shown in script list and menus. It must be unique within a @namespace. If a script is being installed, and a script with the same @namespace and @name already exists, it will be replaced by the new one. Creating a script with same @namespace and @name will cause a conflict error.

+

Examples:

+
// @name          Violentmonkey Script
+// @name:zh-CN    暴力猴脚本
+
+

@namespace

+

The combination of @namespace and @name is the unique identifier for a userscript. @namespace can be any string, for example the homepage of a group of userscripts by the same author. If not provided the @namespace falls back to an empty string ('').

+

Examples:

+
// @namespace https://violentmonkey.github.io
+
+

@match / @exclude-match

+

multiple

+

Define rules to decide whether a script should be executed. It is recommended to use @match instead of @include.

+

See more about matching.

+

@include / @exclude

+

multiple

+

The old way to decide whether a script should be executed.

+

See more about matching.

+

@version

+

Version of the script, it can be used to check if a script has new versions. It is composed of several parts, joined by .. Each part must start with numbers, and can be followed by alphabetic characters.

+

Note: If no @version is specified, the script will not be updated automatically.

+

Examples:

+
// @version 1.0
+
+// @version 1.2a.3
+
+

@description

+

multiple

+

A brief summary to describe the script.

+

Examples:

+
// @description         This script rocks.
+// @description:zh-CN   这个脚本很棒!
+
+

@icon

+

Specify an icon for the script.

+

Examples:

+
// @icon https://my.cdn.com/icon.png
+
+

@require

+

multiple

+

Require another script to execute before the current one. The value is the URL to the required script, which may be relative to the URL the script is being installed from.

+

The required script will be downloaded along with installation and execute before the script.

+

Local files are not allowed to be required due to security concern. Also it does not make sense since scripts are supposed to work on different devices.

+

Examples:

+
// @require https://my.cdn.com/jquery.js
+
+

@resource

+

multiple

+

Some static resources that can be accessed in the script by GM_getResourceText and GM_getResourceURL. The value is composed of two parts, joined with one or more white spaces. The first part is the name of the resource, no white space is allowed in it. The second part is the URL to the resource, which may be relative to the URL the script is being installed from.

+

The resource will be downloaded along with installation and can be accessed when the script executes.

+

Examples:

+
// @resource logo https://my.cdn.com/logo.png
+// @resource text https://my.cdn.com/some-text.txt
+
+

@run-at

+

Decide when the script will execute.

+

Several values can be set for @run-at:

+
    +
  • +

    document-end default

    +

    The script executes when DOMContentLoaded is fired. At this time, the basic HTML of the page is ready and other resources like images might still be on the way.

    +
  • +
  • +

    document-start

    +

    The script executes as soon as possible. There is no guarantee for the script to execute before other scripts in the page.

    +

    Note: in Greasemonkey v3, the script may be ensured to execute even before HTML is loaded, but this is impossible for Violentmonkey as a web extension.

    +
  • +
  • +

    document-idle

    +

    The script executes after DOMContentLoaded is fired.

    +
  • +
+

@noframes

+

When present, the script will execute only in top level document, but not in nested frames.

+
// @noframes
+
+

@grant

+

multiple

+

Specify which special APIs should be granted and can be used when the script executes.

+

If no @grant is present, @grant none is assumed.

+
    +
  • +

    In case you don't need special API or sandboxing

    +
    // @grant none
    +
    +

    Sandbox is disabled in this mode, meaning the script can add/modify globals directly without the need to use unsafeWindow.

    +
  • +
  • +

    In case any special API is used, it must be explicitly granted

    +
    // @grant GM_getValue
    +// @grant GM_setValue
    +
    +

    …or for the new GM.* API methods (Since VM2.12.10):

    +
    // @grant GM.getValue
    +// @grant GM.setValue
    +
    +
  • +
+

In addition to GM API the following privileges may be granted:

+
    +
  • +

    // @grant window.close

    +

    Since VM2.6.2
    +Allows closing the tab via window.close()

    +
  • +
  • +

    // @grant window.focus

    +

    Since VM2.12.10
    +Allows focusing the tab via window.focus() even if the user didn't interact with it first.

    +
  • +
+

@inject-into

+

Added in Violentmonkey v2.10.0

+

Decide which context the script will be injected into.

+

If not set in the metadata block, the default value page will be used. +However, you can change the default value in Violentmonkey settings.

+

Possible values:

+
    +
  • +

    page default

    +

    Inject into context of the web page.

    +

    In this mode, unsafeWindow refers to the window object, +allowing the script to access JavaScript objects of the web page, +just like normal page scripts can.

    +
  • +
  • +

    content

    +

    Inject into context of content scripts.

    +

    In this mode, unsafeWindow refers to the global object in content script. +As a result, the script can access and modify the page's DOM, +but cannot access JavaScript objects of the web page.

    +
  • +
  • +

    auto

    +

    Try to inject into context of the web page. If blocked by CSP rules, inject as a content script.

    +
  • +
+

@downloadURL

+

The URL the script can be downloaded from. Checked for updates automatically at a regular interval, and also manually on user request. Automatically added when using "Install from URL."

+

@supportURL

+

If supplied, the question mark icon in the user scripts list will link to this.

+

@homepageURL

+

If supplied, the home icon in the user scripts list will link to this.

+

@unwrap

+

Since VM2.13.1.

+

If supplied, the script will be injected as is into the global scope of the page, i.e. without our standard wrapper like window.VMxxx=function(){...}.

+

The @grant key is ignored so the script won't have access to GM.* or GM_* API. +The @inject-into key is supported as usual.

+

A typical use case is direct access to global page variables declared as const or let. In a standard userscript you would have to create a script element yourself explicitly by using document.createElement or GM_addElement, then transfer the result via a CustomEvent or unsafeWindow.foo.

+

Another use case is migration from other extensions that run your JavaScript code as is, without userscript API.


Open Chat
+ + \ No newline at end of file diff --git a/app-64f2811254713e6e49a8.js b/app-64f2811254713e6e49a8.js new file mode 100644 index 00000000..3fe3a50b --- /dev/null +++ b/app-64f2811254713e6e49a8.js @@ -0,0 +1,3 @@ +/*! For license information please see app-64f2811254713e6e49a8.js.LICENSE.txt */ +(self.webpackChunkviolentmonkey_github_io=self.webpackChunkviolentmonkey_github_io||[]).push([[143],{433:function(e,t,n){"use strict";var r;n.r(t),n.d(t,{BaseContext:function(){return y},Link:function(){return K},Location:function(){return ee},LocationContext:function(){return b},LocationProvider:function(){return Z},Match:function(){return ne},Redirect:function(){return P},Router:function(){return ue},ServerLocation:function(){return te},createHistory:function(){return d},createMemorySource:function(){return p},globalHistory:function(){return m},insertParams:function(){return N},isRedirect:function(){return x},match:function(){return T},navigate:function(){return v},pick:function(){return R},redirectTo:function(){return E},resolve:function(){return O},shallowCompare:function(){return $},startsWith:function(){return C},useBaseContext:function(){return w},useLocation:function(){return fe},useLocationContext:function(){return S},useMatch:function(){return he},useNavigate:function(){return de},useParams:function(){return pe},validateRedirect:function(){return L}});n(9345),n(382);var o=n(959),a=n(507),i=n.n(a),l=n(3670),s=n.n(l);function u(){return u=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0||(o[n]=e[n]);return o}const f=e=>{const{search:t,hash:n,href:r,origin:o,protocol:a,host:i,hostname:l,port:s}=e.location;let{pathname:u}=e.location;return!u&&r&&h&&(u=new URL(r).pathname),{pathname:encodeURI(decodeURI(u)),search:t,hash:n,href:r,origin:o,protocol:a,host:i,hostname:l,port:s,state:e.history.state,key:e.history.state&&e.history.state.key||"initial"}},d=(e,t)=>{let n=[],r=f(e),o=!1,a=()=>{};return{get location(){return r},get transitioning(){return o},_onTransitionComplete(){o=!1,a()},listen(t){n.push(t);const o=()=>{r=f(e),t({location:r,action:"POP"})};return e.addEventListener("popstate",o),()=>{e.removeEventListener("popstate",o),n=n.filter((e=>e!==t))}},navigate(t,{state:i,replace:l=!1}={}){if("number"==typeof t)e.history.go(t);else{i=u({},i,{key:Date.now()+""});try{o||l?e.history.replaceState(i,null,t):e.history.pushState(i,null,t)}catch(n){e.location[l?"replace":"assign"](t)}}r=f(e),o=!0;const s=new Promise((e=>a=e));return n.forEach((e=>e({location:r,action:"PUSH"}))),s}}},p=(e="/")=>{const t=e.indexOf("?"),n={pathname:t>-1?e.substr(0,t):e,search:t>-1?e.substr(t):""};let r=0;const o=[n],a=[null];return{get location(){return o[r]},addEventListener(e,t){},removeEventListener(e,t){},history:{get entries(){return o},get index(){return r},get state(){return a[r]},pushState(e,t,n){const[i,l=""]=n.split("?");r++,o.push({pathname:i,search:l.length?`?${l}`:l}),a.push(e)},replaceState(e,t,n){const[i,l=""]=n.split("?");o[r]={pathname:i,search:l},a[r]=e},go(e){const t=r+e;t<0||t>a.length-1||(r=t)}}}},h=!("undefined"==typeof window||!window.document||!window.document.createElement),m=d(h?window:p()),{navigate:v}=m;function g(e,t){return o.createServerContext?((e,t=null)=>(globalThis.__SERVER_CONTEXT||(globalThis.__SERVER_CONTEXT={}),globalThis.__SERVER_CONTEXT[e]||(globalThis.__SERVER_CONTEXT[e]=o.createServerContext(e,t)),globalThis.__SERVER_CONTEXT[e]))(e,t):o.createContext(t)}const y=g("Base",{baseuri:"/",basepath:"/"}),b=g("Location"),w=()=>o.useContext(y),S=()=>o.useContext(b);function k(e){this.uri=e}const x=e=>e instanceof k,E=e=>{throw new k(e)};function _(e){const{to:t,replace:n=!0,state:r,noThrow:a,baseuri:i}=e;o.useEffect((()=>{Promise.resolve().then((()=>{const o=O(t,i);v(N(o,e),{replace:n,state:r})}))}),[]);const l=O(t,i);return a||E(N(l,e)),null}const P=e=>{const t=S(),{baseuri:n}=w();return o.createElement(_,u({},t,{baseuri:n},e))};P.propTypes={from:i().string,to:i().string.isRequired};const C=(e,t)=>e.substr(0,t.length)===t,R=(e,t)=>{let n,r;const[o]=t.split("?"),a=A(o),i=""===a[0],l=z(e);for(let u=0,c=l.length;u dynamic segment "${r[1]}" is a reserved name. Please use a different name in path "${o.path}".`);const t=decodeURIComponent(n);f[r[1]]=t}else if(t!==n){e=!0;break}}if(!e){n={route:o,params:f,uri:"/"+a.slice(0,p).join("/")};break}}return n||r||null},T=(e,t)=>R([{path:e}],t),O=(e,t)=>{if(C(e,"/"))return e;const[n,r]=e.split("?"),[o]=t.split("?"),a=A(n),i=A(o);if(""===a[0])return U(o,r);if(!C(a[0],".")){const e=i.concat(a).join("/");return U(("/"===o?"":"/")+e,r)}const l=i.concat(a),s=[];for(let u=0,c=l.length;u{const[n,r=""]=e.split("?");let o="/"+A(n).map((e=>{const n=j.exec(e);return n?t[n[1]]:e})).join("/");const{location:{search:a=""}={}}=t,i=a.split("?")[1]||"";return o=U(o,r,i),o},L=(e,t)=>{const n=e=>I(e);return A(e).filter(n).sort().join("/")===A(t).filter(n).sort().join("/")},j=/^:(.+)/,I=e=>j.test(e),D=e=>e&&"*"===e[0],M=(e,t)=>({route:e,score:e.default?0:A(e.path).reduce(((e,t)=>(e+=4,(e=>""===e)(t)?e+=1:I(t)?e+=2:D(t)?e-=5:e+=3,e)),0),index:t}),z=e=>e.map(M).sort(((e,t)=>e.scoret.score?-1:e.index-t.index)),A=e=>e.replace(/(^\/+|\/+$)/g,"").split("/"),U=(e,...t)=>e+((t=t.filter((e=>e&&e.length>0)))&&t.length>0?`?${t.join("&")}`:""),F=["uri","path"],$=(e,t)=>{const n=Object.keys(e);return n.length===Object.keys(t).length&&n.every((n=>t.hasOwnProperty(n)&&e[n]===t[n]))},H=e=>e.replace(/(^\/+|\/+$)/g,""),B=e=>t=>{if(!t)return null;if(t.type===o.Fragment&&t.props.children)return o.Children.map(t.props.children,B(e));if(s()(t.props.path||t.props.default||t.type===P,`: Children of must have a \`path\` or \`default\` prop, or be a \`\`. None found on element type \`${t.type}\``),s()(!!(t.type!==P||t.props.from&&t.props.to),` requires both "from" and "to" props when inside a .`),s()(!(t.type===P&&!L(t.props.from,t.props.to)),` has mismatched dynamic segments, ensure both paths have the exact same dynamic segments.`),t.props.default)return{value:t,default:!0};const n=t.type===P?t.props.from:t.props.path,r="/"===n?e:`${H(e)}/${H(n)}`;return{value:t,default:t.props.default,path:t.props.children?`${H(r)}/*`:r}},W=["innerRef"],q=["to","state","replace","getProps"],V=["key"];let{forwardRef:Q}=r||(r=n.t(o,2));void 0===Q&&(Q=e=>e);const G=()=>{},K=Q(((e,t)=>{let{innerRef:n}=e,r=c(e,W);const{baseuri:a}=w(),{location:i}=S(),{to:l,state:s,replace:f,getProps:d=G}=r,p=c(r,q),h=O(l,a),m=encodeURI(h),g=i.pathname===m,y=C(i.pathname,m);return o.createElement("a",u({ref:t||n,"aria-current":g?"page":void 0},p,d({isCurrent:g,isPartiallyCurrent:y,href:h,location:i}),{href:h,onClick:e=>{if(p.onClick&&p.onClick(e),(e=>!e.defaultPrevented&&0===e.button&&!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey))(e)){e.preventDefault();let t=f;if("boolean"!=typeof f&&g){const e=c(u({},i.state),V);t=$(u({},s),e)}v(h,{state:s,replace:t})}}}))}));K.displayName="Link",K.propTypes={to:i().string.isRequired};class J extends o.Component{constructor(...e){super(...e),this.displayName="ReactUseErrorBoundary"}componentDidCatch(...e){this.setState({}),this.props.onError(...e)}render(){return this.props.children}}const Y=o.createContext({componentDidCatch:{current:void 0},error:void 0,setError:()=>!1});function X({children:e}){const[t,n]=o.useState(),r=o.useRef(),a=o.useMemo((()=>({componentDidCatch:r,error:t,setError:n})),[t]);return o.createElement(Y.Provider,{value:a},o.createElement(J,{error:t,onError:(e,t)=>{n(e),null==r.current||r.current(e,t)}},e))}X.displayName="ReactUseErrorBoundaryContext";const Z=function(e){var t,n;function r(t){return o.createElement(X,null,o.createElement(e,u({key:"WrappedComponent"},t)))}return r.displayName=`WithErrorBoundary(${null!=(t=null!=(n=e.displayName)?n:e.name)?t:"Component"})`,r}((({history:e=m,children:t})=>{const{location:n}=e,[r,a]=o.useState({location:n}),[i]=function(e){const t=o.useContext(Y);t.componentDidCatch.current=void 0;const n=o.useCallback((()=>{t.setError(void 0)}),[]);return[t.error,n]}();if(o.useEffect((()=>{e._onTransitionComplete()}),[r.location]),o.useEffect((()=>{let t=!1;const n=e.listen((({location:e})=>{Promise.resolve().then((()=>{requestAnimationFrame((()=>{t||a({location:e})}))}))}));return()=>{t=!0,n()}}),[]),i){if(!x(i))throw i;v(i.uri,{replace:!0})}return o.createElement(b.Provider,{value:r},"function"==typeof t?t(r):t||null)})),ee=({children:e})=>{const t=S();return t?e(t):o.createElement(Z,null,e)},te=({url:e,children:t})=>{const n=e.indexOf("?");let r,a="";return n>-1?(r=e.substring(0,n),a=e.substring(n)):r=e,o.createElement(b.Provider,{value:{location:{pathname:r,search:a,hash:""}}},t)},ne=({path:e,children:t})=>{const{baseuri:n}=w(),{location:r}=S(),o=O(e,n),a=T(o,r.pathname);return t({location:r,match:a?u({},a.params,{uri:a.uri,path:e}):null})},re=["uri","location","component"],oe=["children","style","component","uri","location"],ae=e=>{let{uri:t,location:n,component:r}=e,a=c(e,re);return o.createElement(le,u({},a,{component:r,uri:t,location:n}))};let ie=0;const le=e=>{let{children:t,style:n,component:r="div",uri:a,location:i}=e,l=c(e,oe);const s=o.useRef(),f=o.useRef(!0),d=o.useRef(a),p=o.useRef(i.pathname),h=o.useRef(!1);o.useEffect((()=>(ie++,m(),()=>{ie--,0===ie&&(f.current=!0)})),[]),o.useEffect((()=>{let e=!1,t=!1;a!==d.current&&(d.current=a,e=!0),i.pathname!==p.current&&(p.current=i.pathname,t=!0),h.current=e||t&&i.pathname===a,h.current&&m()}),[a,i]);const m=o.useCallback((()=>{var e;f.current?f.current=!1:(e=s.current,h.current&&e&&e.focus())}),[]);return o.createElement(r,u({style:u({outline:"none"},n),tabIndex:"-1",ref:s},l),t)},se=["location","primary","children","basepath","baseuri","component"],ue=e=>{const t=w(),n=S();return o.createElement(ce,u({},t,n,e))};function ce(e){const{location:t,primary:n=!0,children:r,basepath:a,component:i="div"}=e,l=c(e,se),s=o.Children.toArray(r).reduce(((e,t)=>{const n=B(a)(t);return e.concat(n)}),[]),{pathname:f}=t,d=R(s,f);if(d){const{params:e,uri:r,route:s,route:{value:c}}=d,f=s.default?a:s.path.replace(/\*$/,""),p=u({},e,{uri:r,location:t}),h=o.cloneElement(c,p,c.props.children?o.createElement(ue,{location:t,primary:n},c.props.children):void 0),m=n?ae:i,v=n?u({uri:r,location:t,component:i},l):l;return o.createElement(y.Provider,{value:{baseuri:r,basepath:f}},o.createElement(m,v,h))}return null}const fe=()=>{const e=S();if(!e)throw new Error("useLocation hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router");return e.location},de=()=>{throw new Error("useNavigate is removed. Use import { navigate } from 'gatsby' instead")},pe=()=>{const e=w();if(!e)throw new Error("useParams hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router");const t=fe(),n=T(e.basepath,t.pathname);return n?n.params:null},he=e=>{if(!e)throw new Error("useMatch(path: string) requires an argument of a string to match against");const t=w();if(!t)throw new Error("useMatch hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router");const n=fe(),r=O(e,t.baseuri),o=T(r,n.pathname);return o?u({},o.params,{uri:o.uri,path:e}):null}},5474:function(e){"use strict";var t=/[|\\{}()[\]^$+*?.]/g;e.exports=function(e){if("string"!=typeof e)throw new TypeError("Expected a string");return e.replace(t,"\\$&")}},8316:function(e,t){"use strict";t.H=void 0;t.H=(e,t="always")=>{const n=e.endsWith(".html"),r=e.endsWith(".xml"),o=e.endsWith(".pdf");return"/"===e?e:((n||r||o)&&(t="never"),"always"===t?e.endsWith("/")?e:`${e}/`:"never"===t&&e.endsWith("/")?e.slice(0,-1):e)}},2010:function(e,t,n){"use strict";t.__esModule=!0,t.onInitialClientRender=void 0;n(8750),n(1163);t.onInitialClientRender=()=>{}},2983:function(e,t,n){"use strict";n(5538),n(423),t.__esModule=!0,t.getForwards=function(e){return null==e?void 0:e.flatMap((e=>(null==e?void 0:e.forward)||[]))}},1163:function(e,t,n){"use strict";t.__esModule=!0,t.injectPartytownSnippet=function(e){if(!e.length)return;const t=document.querySelector("script[data-partytown]"),n=document.querySelector('iframe[src*="~partytown/partytown-sandbox-sw"]');t&&t.remove();n&&n.remove();const a=(0,o.getForwards)(e),i=document.createElement("script");i.dataset.partytown="",i.innerHTML=(0,r.partytownSnippet)({forward:a}),document.head.appendChild(i)};var r=n(4235),o=n(2983)},9031:function(e,t,n){"use strict";var r=n(959),o={stream:!0},a=new Map,i=Symbol.for("react.element"),l=Symbol.for("react.lazy"),s=Symbol.for("react.default_value"),u=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ContextRegistry;function c(e,t,n){this._status=e,this._value=t,this._response=n}function f(e){switch(e._status){case 3:return e._value;case 1:var t=JSON.parse(e._value,e._response._fromJSON);return e._status=3,e._value=t;case 2:for(var r=(t=e._value).chunks,o=0;o=t.f?o():e.fonts.load(function(e){return _(e)+" "+e.f+"00 300px "+x(e.c)}(t.a),t.h).then((function(e){1<=e.length?r():setTimeout(a,25)}),(function(){o()}))}()})),o=null,a=new Promise((function(e,n){o=setTimeout(n,t.f)}));Promise.race([a,r]).then((function(){o&&(clearTimeout(o),o=null),t.g(t.a)}),(function(){t.j(t.a)}))};var M={D:"serif",C:"sans-serif"},z=null;function A(){if(null===z){var e=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent);z=!!e&&(536>parseInt(e[1],10)||536===parseInt(e[1],10)&&11>=parseInt(e[2],10))}return z}function U(e,t,n){for(var r in M)if(M.hasOwnProperty(r)&&t===e.f[M[r]]&&n===e.f[M[r]])return!0;return!1}function F(e){var t,n=e.g.a.offsetWidth,r=e.h.a.offsetWidth;(t=n===e.f.serif&&r===e.f["sans-serif"])||(t=A()&&U(e,n,r)),t?l()-e.A>=e.w?A()&&U(e,n,r)&&(null===e.u||e.u.hasOwnProperty(e.a.c))?$(e,e.v):$(e,e.B):function(e){setTimeout(i((function(){F(this)}),e),50)}(e):$(e,e.v)}function $(e,t){setTimeout(i((function(){d(this.g.a),d(this.h.a),d(this.j.a),d(this.m.a),t(this.a)}),e),0)}function H(e,t,n){this.c=e,this.a=t,this.f=0,this.m=this.j=!1,this.s=n}D.prototype.start=function(){this.f.serif=this.j.a.offsetWidth,this.f["sans-serif"]=this.m.a.offsetWidth,this.A=l(),F(this)};var B=null;function W(e){0==--e.f&&e.j&&(e.m?((e=e.a).g&&p(e.f,[e.a.c("wf","active")],[e.a.c("wf","loading"),e.a.c("wf","inactive")]),T(e,"active")):R(e.a))}function q(e){this.j=e,this.a=new O,this.h=0,this.f=this.g=!0}function V(e,t,n,r,o){var a=0==--e.h;(e.f||e.g)&&setTimeout((function(){var e=o||null,l=r||{};if(0===n.length&&a)R(t.a);else{t.f+=n.length,a&&(t.j=a);var s,u=[];for(s=0;s1?arguments[1]:void 0)}},7530:function(e,t,n){"use strict";var r=n(2144),o=n(7725),a=n(6075),i=n(9266),l=n(5409),s=n(2701),u=n(2103),c=n(8990),f=n(4431),d=n(9463),p=Array;e.exports=function(e){var t=a(e),n=s(this),h=arguments.length,m=h>1?arguments[1]:void 0,v=void 0!==m;v&&(m=r(m,h>2?arguments[2]:void 0));var g,y,b,w,S,k,x=d(t),E=0;if(!x||this===p&&l(x))for(g=u(t),y=n?new this(g):p(g);g>E;E++)k=v?m(t[E],E):t[E],c(y,E,k);else for(S=(w=f(t,x)).next,y=n?new this:[];!(b=o(S,w)).done;E++)k=v?i(w,m,[b.value,E],!0):b.value,c(y,E,k);return y.length=E,y}},6039:function(e,t,n){"use strict";var r=n(7794),o=n(7913),a=n(2103),i=function(e){return function(t,n,i){var l,s=r(t),u=a(s),c=o(i,u);if(e&&n!=n){for(;u>c;)if((l=s[c++])!=l)return!0}else for(;u>c;c++)if((e||c in s)&&s[c]===n)return e||c||0;return!e&&-1}};e.exports={includes:i(!0),indexOf:i(!1)}},8695:function(e,t,n){"use strict";var r=n(2144),o=n(2058),a=n(9860),i=n(6075),l=n(2103),s=n(7745),u=o([].push),c=function(e){var t=1===e,n=2===e,o=3===e,c=4===e,f=6===e,d=7===e,p=5===e||f;return function(h,m,v,g){for(var y,b,w=i(h),S=a(w),k=r(m,v),x=l(S),E=0,_=g||s,P=t?_(h,x):n||d?_(h,0):void 0;x>E;E++)if((p||E in S)&&(b=k(y=S[E],E,w),e))if(t)P[E]=b;else if(b)switch(e){case 3:return!0;case 5:return y;case 6:return E;case 2:u(P,y)}else switch(e){case 4:return!1;case 7:u(P,y)}return f?-1:o||c?c:P}};e.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterReject:c(7)}},7437:function(e,t,n){"use strict";var r=n(9645);e.exports=function(e,t){var n=[][e];return!!n&&r((function(){n.call(null,t||function(){return 1},1)}))}},6138:function(e,t,n){"use strict";var r=n(4596),o=n(6075),a=n(9860),i=n(2103),l=TypeError,s=function(e){return function(t,n,s,u){r(n);var c=o(t),f=a(c),d=i(c),p=e?d-1:0,h=e?-1:1;if(s<2)for(;;){if(p in f){u=f[p],p+=h;break}if(p+=h,e?p<0:d<=p)throw l("Reduce of empty array with no initial value")}for(;e?p>=0:d>p;p+=h)p in f&&(u=n(u,f[p],p,c));return u}};e.exports={left:s(!1),right:s(!0)}},4501:function(e,t,n){"use strict";var r=n(7913),o=n(2103),a=n(8990),i=Array,l=Math.max;e.exports=function(e,t,n){for(var s=o(e),u=r(t,s),c=r(void 0===n?s:n,s),f=i(l(c-u,0)),d=0;u0;)e[r]=e[--r];r!==a++&&(e[r]=n)}return e},l=function(e,t,n,r){for(var o=t.length,a=n.length,i=0,l=0;i9007199254740991)throw t("Maximum allowed index exceeded");return e}},8685:function(e){"use strict";e.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},3981:function(e,t,n){"use strict";var r=n(4799)("span").classList,o=r&&r.constructor&&r.constructor.prototype;e.exports=o===Object.prototype?void 0:o},5676:function(e,t,n){"use strict";var r=n(7366).match(/firefox\/(\d+)/i);e.exports=!!r&&+r[1]},9422:function(e,t,n){"use strict";var r=n(8194),o=n(8018);e.exports=!r&&!o&&"object"==typeof window&&"object"==typeof document},8194:function(e){"use strict";e.exports="object"==typeof Deno&&Deno&&"object"==typeof Deno.version},9619:function(e,t,n){"use strict";var r=n(7366);e.exports=/MSIE|Trident/.test(r)},9462:function(e,t,n){"use strict";var r=n(7366);e.exports=/ipad|iphone|ipod/i.test(r)&&"undefined"!=typeof Pebble},7970:function(e,t,n){"use strict";var r=n(7366);e.exports=/(?:ipad|iphone|ipod).*applewebkit/i.test(r)},8018:function(e,t,n){"use strict";var r=n(7990),o=n(8555);e.exports="process"===o(r.process)},2573:function(e,t,n){"use strict";var r=n(7366);e.exports=/web0s(?!.*chrome)/i.test(r)},7366:function(e){"use strict";e.exports="undefined"!=typeof navigator&&String(navigator.userAgent)||""},1579:function(e,t,n){"use strict";var r,o,a=n(7990),i=n(7366),l=a.process,s=a.Deno,u=l&&l.versions||s&&s.version,c=u&&u.v8;c&&(o=(r=c.split("."))[0]>0&&r[0]<4?1:+(r[0]+r[1])),!o&&i&&(!(r=i.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=i.match(/Chrome\/(\d+)/))&&(o=+r[1]),e.exports=o},2861:function(e,t,n){"use strict";var r=n(7366).match(/AppleWebKit\/(\d+)\./);e.exports=!!r&&+r[1]},4577:function(e){"use strict";e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},8903:function(e,t,n){"use strict";var r=n(7990),o=n(4086).f,a=n(859),i=n(6561),l=n(1105),s=n(5609),u=n(9168);e.exports=function(e,t){var n,c,f,d,p,h=e.target,m=e.global,v=e.stat;if(n=m?r:v?r[h]||l(h,{}):(r[h]||{}).prototype)for(c in t){if(d=t[c],f=e.dontCallGetSet?(p=o(n,c))&&p.value:n[c],!u(m?c:h+(v?".":"#")+c,e.forced)&&void 0!==f){if(typeof d==typeof f)continue;s(d,f)}(e.sham||f&&f.sham)&&a(d,"sham",!0),i(n,c,d,e)}}},9645:function(e){"use strict";e.exports=function(e){try{return!!e()}catch(t){return!0}}},4902:function(e,t,n){"use strict";n(8610);var r=n(2330),o=n(6561),a=n(4530),i=n(9645),l=n(5537),s=n(859),u=l("species"),c=RegExp.prototype;e.exports=function(e,t,n,f){var d=l(e),p=!i((function(){var t={};return t[d]=function(){return 7},7!==""[e](t)})),h=p&&!i((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[u]=function(){return n},n.flags="",n[d]=/./[d]),n.exec=function(){return t=!0,null},n[d](""),!t}));if(!p||!h||n){var m=r(/./[d]),v=t(d,""[e],(function(e,t,n,o,i){var l=r(e),s=t.exec;return s===a||s===c.exec?p&&!i?{done:!0,value:m(t,n,o)}:{done:!0,value:l(n,t,o)}:{done:!1}}));o(String.prototype,e,v[0]),o(c,d,v[1])}f&&s(c[d],"sham",!0)}},5598:function(e,t,n){"use strict";var r=n(1113),o=n(2103),a=n(4023),i=n(2144),l=function(e,t,n,s,u,c,f,d){for(var p,h,m=u,v=0,g=!!f&&i(f,d);v0&&r(p)?(h=o(p),m=l(e,t,p,h,m,c-1)-1):(a(m+1),e[m]=p),m++),v++;return m};e.exports=l},9878:function(e,t,n){"use strict";var r=n(2023),o=Function.prototype,a=o.apply,i=o.call;e.exports="object"==typeof Reflect&&Reflect.apply||(r?i.bind(a):function(){return i.apply(a,arguments)})},2144:function(e,t,n){"use strict";var r=n(2330),o=n(4596),a=n(2023),i=r(r.bind);e.exports=function(e,t){return o(e),void 0===t?e:a?i(e,t):function(){return e.apply(t,arguments)}}},2023:function(e,t,n){"use strict";var r=n(9645);e.exports=!r((function(){var e=function(){}.bind();return"function"!=typeof e||e.hasOwnProperty("prototype")}))},7725:function(e,t,n){"use strict";var r=n(2023),o=Function.prototype.call;e.exports=r?o.bind(o):function(){return o.apply(o,arguments)}},2697:function(e,t,n){"use strict";var r=n(369),o=n(8496),a=Function.prototype,i=r&&Object.getOwnPropertyDescriptor,l=o(a,"name"),s=l&&"something"===function(){}.name,u=l&&(!r||r&&i(a,"name").configurable);e.exports={EXISTS:l,PROPER:s,CONFIGURABLE:u}},5911:function(e,t,n){"use strict";var r=n(2058),o=n(4596);e.exports=function(e,t,n){try{return r(o(Object.getOwnPropertyDescriptor(e,t)[n]))}catch(a){}}},2330:function(e,t,n){"use strict";var r=n(8555),o=n(2058);e.exports=function(e){if("Function"===r(e))return o(e)}},2058:function(e,t,n){"use strict";var r=n(2023),o=Function.prototype,a=o.call,i=r&&o.bind.bind(a,a);e.exports=r?i:function(e){return function(){return a.apply(e,arguments)}}},1553:function(e,t,n){"use strict";var r=n(7990),o=n(1808);e.exports=function(e,t){return arguments.length<2?(n=r[e],o(n)?n:void 0):r[e]&&r[e][t];var n}},9463:function(e,t,n){"use strict";var r=n(5786),o=n(692),a=n(276),i=n(3820),l=n(5537)("iterator");e.exports=function(e){if(!a(e))return o(e,l)||o(e,"@@iterator")||i[r(e)]}},4431:function(e,t,n){"use strict";var r=n(7725),o=n(4596),a=n(9308),i=n(8151),l=n(9463),s=TypeError;e.exports=function(e,t){var n=arguments.length<2?l(e):t;if(o(n))return a(r(n,e));throw s(i(e)+" is not iterable")}},692:function(e,t,n){"use strict";var r=n(4596),o=n(276);e.exports=function(e,t){var n=e[t];return o(n)?void 0:r(n)}},378:function(e,t,n){"use strict";var r=n(2058),o=n(6075),a=Math.floor,i=r("".charAt),l=r("".replace),s=r("".slice),u=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,c=/\$([$&'`]|\d{1,2})/g;e.exports=function(e,t,n,r,f,d){var p=n+e.length,h=r.length,m=c;return void 0!==f&&(f=o(f),m=u),l(d,m,(function(o,l){var u;switch(i(l,0)){case"$":return"$";case"&":return e;case"`":return s(t,0,n);case"'":return s(t,p);case"<":u=f[s(l,1,-1)];break;default:var c=+l;if(0===c)return o;if(c>h){var d=a(c/10);return 0===d?o:d<=h?void 0===r[d-1]?i(l,1):r[d-1]+i(l,1):o}u=r[c-1]}return void 0===u?"":u}))}},7990:function(e,t,n){"use strict";var r=function(e){return e&&e.Math===Math&&e};e.exports=r("object"==typeof globalThis&&globalThis)||r("object"==typeof window&&window)||r("object"==typeof self&&self)||r("object"==typeof n.g&&n.g)||function(){return this}()||this||Function("return this")()},8496:function(e,t,n){"use strict";var r=n(2058),o=n(6075),a=r({}.hasOwnProperty);e.exports=Object.hasOwn||function(e,t){return a(o(e),t)}},642:function(e){"use strict";e.exports={}},9294:function(e){"use strict";e.exports=function(e,t){try{1===arguments.length?console.error(e):console.error(e,t)}catch(n){}}},2086:function(e,t,n){"use strict";var r=n(1553);e.exports=r("document","documentElement")},6938:function(e,t,n){"use strict";var r=n(369),o=n(9645),a=n(4799);e.exports=!r&&!o((function(){return 7!==Object.defineProperty(a("div"),"a",{get:function(){return 7}}).a}))},9860:function(e,t,n){"use strict";var r=n(2058),o=n(9645),a=n(8555),i=Object,l=r("".split);e.exports=o((function(){return!i("z").propertyIsEnumerable(0)}))?function(e){return"String"===a(e)?l(e,""):i(e)}:i},4240:function(e,t,n){"use strict";var r=n(1808),o=n(7627),a=n(7323);e.exports=function(e,t,n){var i,l;return a&&r(i=t.constructor)&&i!==n&&o(l=i.prototype)&&l!==n.prototype&&a(e,l),e}},449:function(e,t,n){"use strict";var r=n(2058),o=n(1808),a=n(7322),i=r(Function.toString);o(a.inspectSource)||(a.inspectSource=function(e){return i(e)}),e.exports=a.inspectSource},7776:function(e,t,n){"use strict";var r,o,a,i=n(9514),l=n(7990),s=n(7627),u=n(859),c=n(8496),f=n(7322),d=n(3273),p=n(642),h="Object already initialized",m=l.TypeError,v=l.WeakMap;if(i||f.state){var g=f.state||(f.state=new v);g.get=g.get,g.has=g.has,g.set=g.set,r=function(e,t){if(g.has(e))throw m(h);return t.facade=e,g.set(e,t),t},o=function(e){return g.get(e)||{}},a=function(e){return g.has(e)}}else{var y=d("state");p[y]=!0,r=function(e,t){if(c(e,y))throw m(h);return t.facade=e,u(e,y,t),t},o=function(e){return c(e,y)?e[y]:{}},a=function(e){return c(e,y)}}e.exports={set:r,get:o,has:a,enforce:function(e){return a(e)?o(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!s(t)||(n=o(t)).type!==e)throw m("Incompatible receiver, "+e+" required");return n}}}},5409:function(e,t,n){"use strict";var r=n(5537),o=n(3820),a=r("iterator"),i=Array.prototype;e.exports=function(e){return void 0!==e&&(o.Array===e||i[a]===e)}},1113:function(e,t,n){"use strict";var r=n(8555);e.exports=Array.isArray||function(e){return"Array"===r(e)}},1808:function(e,t,n){"use strict";var r=n(1857),o=r.all;e.exports=r.IS_HTMLDDA?function(e){return"function"==typeof e||e===o}:function(e){return"function"==typeof e}},2701:function(e,t,n){"use strict";var r=n(2058),o=n(9645),a=n(1808),i=n(5786),l=n(1553),s=n(449),u=function(){},c=[],f=l("Reflect","construct"),d=/^\s*(?:class|function)\b/,p=r(d.exec),h=!d.exec(u),m=function(e){if(!a(e))return!1;try{return f(u,c,e),!0}catch(t){return!1}},v=function(e){if(!a(e))return!1;switch(i(e)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return h||!!p(d,s(e))}catch(t){return!0}};v.sham=!0,e.exports=!f||o((function(){var e;return m(m.call)||!m(Object)||!m((function(){e=!0}))||e}))?v:m},9168:function(e,t,n){"use strict";var r=n(9645),o=n(1808),a=/#|\.prototype\./,i=function(e,t){var n=s[l(e)];return n===c||n!==u&&(o(t)?r(t):!!t)},l=i.normalize=function(e){return String(e).replace(a,".").toLowerCase()},s=i.data={},u=i.NATIVE="N",c=i.POLYFILL="P";e.exports=i},276:function(e){"use strict";e.exports=function(e){return null==e}},7627:function(e,t,n){"use strict";var r=n(1808),o=n(1857),a=o.all;e.exports=o.IS_HTMLDDA?function(e){return"object"==typeof e?null!==e:r(e)||e===a}:function(e){return"object"==typeof e?null!==e:r(e)}},1566:function(e){"use strict";e.exports=!1},5522:function(e,t,n){"use strict";var r=n(7627),o=n(8555),a=n(5537)("match");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[a])?!!t:"RegExp"===o(e))}},4003:function(e,t,n){"use strict";var r=n(1553),o=n(1808),a=n(8304),i=n(144),l=Object;e.exports=i?function(e){return"symbol"==typeof e}:function(e){var t=r("Symbol");return o(t)&&a(t.prototype,l(e))}},1851:function(e,t,n){"use strict";var r=n(2144),o=n(7725),a=n(9308),i=n(8151),l=n(5409),s=n(2103),u=n(8304),c=n(4431),f=n(9463),d=n(5887),p=TypeError,h=function(e,t){this.stopped=e,this.result=t},m=h.prototype;e.exports=function(e,t,n){var v,g,y,b,w,S,k,x=n&&n.that,E=!(!n||!n.AS_ENTRIES),_=!(!n||!n.IS_RECORD),P=!(!n||!n.IS_ITERATOR),C=!(!n||!n.INTERRUPTED),R=r(t,x),T=function(e){return v&&d(v,"normal",e),new h(!0,e)},O=function(e){return E?(a(e),C?R(e[0],e[1],T):R(e[0],e[1])):C?R(e,T):R(e)};if(_)v=e.iterator;else if(P)v=e;else{if(!(g=f(e)))throw p(i(e)+" is not iterable");if(l(g)){for(y=0,b=s(e);b>y;y++)if((w=O(e[y]))&&u(m,w))return w;return new h(!1)}v=c(e,g)}for(S=_?e.next:v.next;!(k=o(S,v)).done;){try{w=O(k.value)}catch(N){d(v,"throw",N)}if("object"==typeof w&&w&&u(m,w))return w}return new h(!1)}},5887:function(e,t,n){"use strict";var r=n(7725),o=n(9308),a=n(692);e.exports=function(e,t,n){var i,l;o(e);try{if(!(i=a(e,"return"))){if("throw"===t)throw n;return n}i=r(i,e)}catch(s){l=!0,i=s}if("throw"===t)throw n;if(l)throw i;return o(i),n}},2282:function(e,t,n){"use strict";var r=n(8678).IteratorPrototype,o=n(1026),a=n(6373),i=n(1508),l=n(3820),s=function(){return this};e.exports=function(e,t,n,u){var c=t+" Iterator";return e.prototype=o(r,{next:a(+!u,n)}),i(e,c,!1,!0),l[c]=s,e}},8994:function(e,t,n){"use strict";var r=n(8903),o=n(7725),a=n(1566),i=n(2697),l=n(1808),s=n(2282),u=n(6285),c=n(7323),f=n(1508),d=n(859),p=n(6561),h=n(5537),m=n(3820),v=n(8678),g=i.PROPER,y=i.CONFIGURABLE,b=v.IteratorPrototype,w=v.BUGGY_SAFARI_ITERATORS,S=h("iterator"),k="keys",x="values",E="entries",_=function(){return this};e.exports=function(e,t,n,i,h,v,P){s(n,t,i);var C,R,T,O=function(e){if(e===h&&D)return D;if(!w&&e in j)return j[e];switch(e){case k:case x:case E:return function(){return new n(this,e)}}return function(){return new n(this)}},N=t+" Iterator",L=!1,j=e.prototype,I=j[S]||j["@@iterator"]||h&&j[h],D=!w&&I||O(h),M="Array"===t&&j.entries||I;if(M&&(C=u(M.call(new e)))!==Object.prototype&&C.next&&(a||u(C)===b||(c?c(C,b):l(C[S])||p(C,S,_)),f(C,N,!0,!0),a&&(m[N]=_)),g&&h===x&&I&&I.name!==x&&(!a&&y?d(j,"name",x):(L=!0,D=function(){return o(I,this)})),h)if(R={values:O(x),keys:v?D:O(k),entries:O(E)},P)for(T in R)(w||L||!(T in j))&&p(j,T,R[T]);else r({target:t,proto:!0,forced:w||L},R);return a&&!P||j[S]===D||p(j,S,D,{name:h}),m[t]=D,R}},8678:function(e,t,n){"use strict";var r,o,a,i=n(9645),l=n(1808),s=n(7627),u=n(1026),c=n(6285),f=n(6561),d=n(5537),p=n(1566),h=d("iterator"),m=!1;[].keys&&("next"in(a=[].keys())?(o=c(c(a)))!==Object.prototype&&(r=o):m=!0),!s(r)||i((function(){var e={};return r[h].call(e)!==e}))?r={}:p&&(r=u(r)),l(r[h])||f(r,h,(function(){return this})),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:m}},3820:function(e){"use strict";e.exports={}},2103:function(e,t,n){"use strict";var r=n(468);e.exports=function(e){return r(e.length)}},2303:function(e,t,n){"use strict";var r=n(2058),o=n(9645),a=n(1808),i=n(8496),l=n(369),s=n(2697).CONFIGURABLE,u=n(449),c=n(7776),f=c.enforce,d=c.get,p=String,h=Object.defineProperty,m=r("".slice),v=r("".replace),g=r([].join),y=l&&!o((function(){return 8!==h((function(){}),"length",{value:8}).length})),b=String(String).split("String"),w=e.exports=function(e,t,n){"Symbol("===m(p(t),0,7)&&(t="["+v(p(t),/^Symbol\(([^)]*)\)/,"$1")+"]"),n&&n.getter&&(t="get "+t),n&&n.setter&&(t="set "+t),(!i(e,"name")||s&&e.name!==t)&&(l?h(e,"name",{value:t,configurable:!0}):e.name=t),y&&n&&i(n,"arity")&&e.length!==n.arity&&h(e,"length",{value:n.arity});try{n&&i(n,"constructor")&&n.constructor?l&&h(e,"prototype",{writable:!1}):e.prototype&&(e.prototype=void 0)}catch(o){}var r=f(e);return i(r,"source")||(r.source=g(b,"string"==typeof t?t:"")),e};Function.prototype.toString=w((function(){return a(this)&&d(this).source||u(this)}),"toString")},6357:function(e){"use strict";var t=Math.ceil,n=Math.floor;e.exports=Math.trunc||function(e){var r=+e;return(r>0?n:t)(r)}},3586:function(e,t,n){"use strict";var r,o,a,i,l,s=n(7990),u=n(2144),c=n(4086).f,f=n(4657).set,d=n(8390),p=n(7970),h=n(9462),m=n(2573),v=n(8018),g=s.MutationObserver||s.WebKitMutationObserver,y=s.document,b=s.process,w=s.Promise,S=c(s,"queueMicrotask"),k=S&&S.value;if(!k){var x=new d,E=function(){var e,t;for(v&&(e=b.domain)&&e.exit();t=x.get();)try{t()}catch(n){throw x.head&&r(),n}e&&e.enter()};p||v||m||!g||!y?!h&&w&&w.resolve?((i=w.resolve(void 0)).constructor=w,l=u(i.then,i),r=function(){l(E)}):v?r=function(){b.nextTick(E)}:(f=u(f,s),r=function(){f(E)}):(o=!0,a=y.createTextNode(""),new g(E).observe(a,{characterData:!0}),r=function(){a.data=o=!o}),k=function(e){x.head||r(),x.add(e)}}e.exports=k},606:function(e,t,n){"use strict";var r=n(4596),o=TypeError,a=function(e){var t,n;this.promise=new e((function(e,r){if(void 0!==t||void 0!==n)throw o("Bad Promise constructor");t=e,n=r})),this.resolve=r(t),this.reject=r(n)};e.exports.f=function(e){return new a(e)}},6779:function(e,t,n){"use strict";var r=n(369),o=n(2058),a=n(7725),i=n(9645),l=n(8071),s=n(8559),u=n(3740),c=n(6075),f=n(9860),d=Object.assign,p=Object.defineProperty,h=o([].concat);e.exports=!d||i((function(){if(r&&1!==d({b:1},d(p({},"a",{enumerable:!0,get:function(){p(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol("assign detection"),o="abcdefghijklmnopqrst";return e[n]=7,o.split("").forEach((function(e){t[e]=e})),7!==d({},e)[n]||l(d({},t)).join("")!==o}))?function(e,t){for(var n=c(e),o=arguments.length,i=1,d=s.f,p=u.f;o>i;)for(var m,v=f(arguments[i++]),g=d?h(l(v),d(v)):l(v),y=g.length,b=0;y>b;)m=g[b++],r&&!a(p,v,m)||(n[m]=v[m]);return n}:d},1026:function(e,t,n){"use strict";var r,o=n(9308),a=n(8065),i=n(4577),l=n(642),s=n(2086),u=n(4799),c=n(3273),f="prototype",d="script",p=c("IE_PROTO"),h=function(){},m=function(e){return"<"+d+">"+e+""},v=function(e){e.write(m("")),e.close();var t=e.parentWindow.Object;return e=null,t},g=function(){try{r=new ActiveXObject("htmlfile")}catch(a){}var e,t,n;g="undefined"!=typeof document?document.domain&&r?v(r):(t=u("iframe"),n="java"+d+":",t.style.display="none",s.appendChild(t),t.src=String(n),(e=t.contentWindow.document).open(),e.write(m("document.F=Object")),e.close(),e.F):v(r);for(var o=i.length;o--;)delete g[f][i[o]];return g()};l[p]=!0,e.exports=Object.create||function(e,t){var n;return null!==e?(h[f]=o(e),n=new h,h[f]=null,n[p]=e):n=g(),void 0===t?n:a.f(n,t)}},8065:function(e,t,n){"use strict";var r=n(369),o=n(446),a=n(3002),i=n(9308),l=n(7794),s=n(8071);t.f=r&&!o?Object.defineProperties:function(e,t){i(e);for(var n,r=l(t),o=s(t),u=o.length,c=0;u>c;)a.f(e,n=o[c++],r[n]);return e}},3002:function(e,t,n){"use strict";var r=n(369),o=n(6938),a=n(446),i=n(9308),l=n(7171),s=TypeError,u=Object.defineProperty,c=Object.getOwnPropertyDescriptor,f="enumerable",d="configurable",p="writable";t.f=r?a?function(e,t,n){if(i(e),t=l(t),i(n),"function"==typeof e&&"prototype"===t&&"value"in n&&p in n&&!n[p]){var r=c(e,t);r&&r[p]&&(e[t]=n.value,n={configurable:d in n?n[d]:r[d],enumerable:f in n?n[f]:r[f],writable:!1})}return u(e,t,n)}:u:function(e,t,n){if(i(e),t=l(t),i(n),o)try{return u(e,t,n)}catch(r){}if("get"in n||"set"in n)throw s("Accessors not supported");return"value"in n&&(e[t]=n.value),e}},4086:function(e,t,n){"use strict";var r=n(369),o=n(7725),a=n(3740),i=n(6373),l=n(7794),s=n(7171),u=n(8496),c=n(6938),f=Object.getOwnPropertyDescriptor;t.f=r?f:function(e,t){if(e=l(e),t=s(t),c)try{return f(e,t)}catch(n){}if(u(e,t))return i(!o(a.f,e,t),e[t])}},8766:function(e,t,n){"use strict";var r=n(5848),o=n(4577).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,o)}},8559:function(e,t){"use strict";t.f=Object.getOwnPropertySymbols},6285:function(e,t,n){"use strict";var r=n(8496),o=n(1808),a=n(6075),i=n(3273),l=n(6382),s=i("IE_PROTO"),u=Object,c=u.prototype;e.exports=l?u.getPrototypeOf:function(e){var t=a(e);if(r(t,s))return t[s];var n=t.constructor;return o(n)&&t instanceof n?n.prototype:t instanceof u?c:null}},8304:function(e,t,n){"use strict";var r=n(2058);e.exports=r({}.isPrototypeOf)},5848:function(e,t,n){"use strict";var r=n(2058),o=n(8496),a=n(7794),i=n(6039).indexOf,l=n(642),s=r([].push);e.exports=function(e,t){var n,r=a(e),u=0,c=[];for(n in r)!o(l,n)&&o(r,n)&&s(c,n);for(;t.length>u;)o(r,n=t[u++])&&(~i(c,n)||s(c,n));return c}},8071:function(e,t,n){"use strict";var r=n(5848),o=n(4577);e.exports=Object.keys||function(e){return r(e,o)}},3740:function(e,t){"use strict";var n={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,o=r&&!n.call({1:2},1);t.f=o?function(e){var t=r(this,e);return!!t&&t.enumerable}:n},7323:function(e,t,n){"use strict";var r=n(5911),o=n(9308),a=n(9316);e.exports=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=r(Object.prototype,"__proto__","set"))(n,[]),t=n instanceof Array}catch(i){}return function(n,r){return o(n),a(r),t?e(n,r):n.__proto__=r,n}}():void 0)},173:function(e,t,n){"use strict";var r=n(7725),o=n(1808),a=n(7627),i=TypeError;e.exports=function(e,t){var n,l;if("string"===t&&o(n=e.toString)&&!a(l=r(n,e)))return l;if(o(n=e.valueOf)&&!a(l=r(n,e)))return l;if("string"!==t&&o(n=e.toString)&&!a(l=r(n,e)))return l;throw i("Can't convert object to primitive value")}},7464:function(e,t,n){"use strict";var r=n(1553),o=n(2058),a=n(8766),i=n(8559),l=n(9308),s=o([].concat);e.exports=r("Reflect","ownKeys")||function(e){var t=a.f(l(e)),n=i.f;return n?s(t,n(e)):t}},3639:function(e){"use strict";e.exports=function(e){try{return{error:!1,value:e()}}catch(t){return{error:!0,value:t}}}},2862:function(e,t,n){"use strict";var r=n(7990),o=n(9952),a=n(1808),i=n(9168),l=n(449),s=n(5537),u=n(9422),c=n(8194),f=n(1566),d=n(1579),p=o&&o.prototype,h=s("species"),m=!1,v=a(r.PromiseRejectionEvent),g=i("Promise",(function(){var e=l(o),t=e!==String(o);if(!t&&66===d)return!0;if(f&&(!p.catch||!p.finally))return!0;if(!d||d<51||!/native code/.test(e)){var n=new o((function(e){e(1)})),r=function(e){e((function(){}),(function(){}))};if((n.constructor={})[h]=r,!(m=n.then((function(){}))instanceof r))return!0}return!t&&(u||c)&&!v}));e.exports={CONSTRUCTOR:g,REJECTION_EVENT:v,SUBCLASSING:m}},9952:function(e,t,n){"use strict";var r=n(7990);e.exports=r.Promise},1513:function(e,t,n){"use strict";var r=n(9308),o=n(7627),a=n(606);e.exports=function(e,t){if(r(e),o(t)&&t.constructor===e)return t;var n=a.f(e);return(0,n.resolve)(t),n.promise}},5289:function(e,t,n){"use strict";var r=n(9952),o=n(7506),a=n(2862).CONSTRUCTOR;e.exports=a||!o((function(e){r.all(e).then(void 0,(function(){}))}))},3204:function(e,t,n){"use strict";var r=n(3002).f;e.exports=function(e,t,n){n in e||r(e,n,{configurable:!0,get:function(){return t[n]},set:function(e){t[n]=e}})}},8390:function(e){"use strict";var t=function(){this.head=null,this.tail=null};t.prototype={add:function(e){var t={item:e,next:null},n=this.tail;n?n.next=t:this.head=t,this.tail=t},get:function(){var e=this.head;if(e)return null===(this.head=e.next)&&(this.tail=null),e.item}},e.exports=t},9637:function(e,t,n){"use strict";var r=n(7725),o=n(9308),a=n(1808),i=n(8555),l=n(4530),s=TypeError;e.exports=function(e,t){var n=e.exec;if(a(n)){var u=r(n,e,t);return null!==u&&o(u),u}if("RegExp"===i(e))return r(l,e,t);throw s("RegExp#exec called on incompatible receiver")}},4530:function(e,t,n){"use strict";var r,o,a=n(7725),i=n(2058),l=n(158),s=n(323),u=n(8373),c=n(9808),f=n(1026),d=n(7776).get,p=n(7784),h=n(546),m=c("native-string-replace",String.prototype.replace),v=RegExp.prototype.exec,g=v,y=i("".charAt),b=i("".indexOf),w=i("".replace),S=i("".slice),k=(o=/b*/g,a(v,r=/a/,"a"),a(v,o,"a"),0!==r.lastIndex||0!==o.lastIndex),x=u.BROKEN_CARET,E=void 0!==/()??/.exec("")[1];(k||E||x||p||h)&&(g=function(e){var t,n,r,o,i,u,c,p=this,h=d(p),_=l(e),P=h.raw;if(P)return P.lastIndex=p.lastIndex,t=a(g,P,_),p.lastIndex=P.lastIndex,t;var C=h.groups,R=x&&p.sticky,T=a(s,p),O=p.source,N=0,L=_;if(R&&(T=w(T,"y",""),-1===b(T,"g")&&(T+="g"),L=S(_,p.lastIndex),p.lastIndex>0&&(!p.multiline||p.multiline&&"\n"!==y(_,p.lastIndex-1))&&(O="(?: "+O+")",L=" "+L,N++),n=new RegExp("^(?:"+O+")",T)),E&&(n=new RegExp("^"+O+"$(?!\\s)",T)),k&&(r=p.lastIndex),o=a(v,R?n:p,L),R?o?(o.input=S(o.input,N),o[0]=S(o[0],N),o.index=p.lastIndex,p.lastIndex+=o[0].length):p.lastIndex=0:k&&o&&(p.lastIndex=p.global?o.index+o[0].length:r),E&&o&&o.length>1&&a(m,o[0],n,(function(){for(i=1;ib)","g");return"b"!==e.exec("b").groups.a||"bc"!=="b".replace(e,"$c")}))},8622:function(e,t,n){"use strict";var r=n(276),o=TypeError;e.exports=function(e){if(r(e))throw o("Can't call method on "+e);return e}},4004:function(e,t,n){"use strict";var r=n(1553),o=n(4259),a=n(5537),i=n(369),l=a("species");e.exports=function(e){var t=r(e);i&&t&&!t[l]&&o(t,l,{configurable:!0,get:function(){return this}})}},1508:function(e,t,n){"use strict";var r=n(3002).f,o=n(8496),a=n(5537)("toStringTag");e.exports=function(e,t,n){e&&!n&&(e=e.prototype),e&&!o(e,a)&&r(e,a,{configurable:!0,value:t})}},3273:function(e,t,n){"use strict";var r=n(9808),o=n(160),a=r("keys");e.exports=function(e){return a[e]||(a[e]=o(e))}},7322:function(e,t,n){"use strict";var r=n(7990),o=n(1105),a="__core-js_shared__",i=r[a]||o(a,{});e.exports=i},9808:function(e,t,n){"use strict";var r=n(1566),o=n(7322);(e.exports=function(e,t){return o[e]||(o[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.32.1",mode:r?"pure":"global",copyright:"© 2014-2023 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.32.1/LICENSE",source:"https://github.com/zloirock/core-js"})},6178:function(e,t,n){"use strict";var r=n(9308),o=n(7877),a=n(276),i=n(5537)("species");e.exports=function(e,t){var n,l=r(e).constructor;return void 0===l||a(n=r(l)[i])?t:o(n)}},7124:function(e,t,n){"use strict";var r=n(2058),o=n(9163),a=n(158),i=n(8622),l=r("".charAt),s=r("".charCodeAt),u=r("".slice),c=function(e){return function(t,n){var r,c,f=a(i(t)),d=o(n),p=f.length;return d<0||d>=p?e?"":void 0:(r=s(f,d))<55296||r>56319||d+1===p||(c=s(f,d+1))<56320||c>57343?e?l(f,d):r:e?u(f,d,d+2):c-56320+(r-55296<<10)+65536}};e.exports={codeAt:c(!1),charAt:c(!0)}},8956:function(e,t,n){"use strict";var r=n(2058),o=2147483647,a=/[^\0-\u007E]/,i=/[.\u3002\uFF0E\uFF61]/g,l="Overflow: input needs wider integers to process",s=RangeError,u=r(i.exec),c=Math.floor,f=String.fromCharCode,d=r("".charCodeAt),p=r([].join),h=r([].push),m=r("".replace),v=r("".split),g=r("".toLowerCase),y=function(e){return e+22+75*(e<26)},b=function(e,t,n){var r=0;for(e=n?c(e/700):e>>1,e+=c(e/t);e>455;)e=c(e/35),r+=36;return c(r+36*e/(e+38))},w=function(e){var t=[];e=function(e){for(var t=[],n=0,r=e.length;n=55296&&o<=56319&&n=i&&rc((o-u)/S))throw s(l);for(u+=(w-i)*S,i=w,n=0;no)throw s(l);if(r===i){for(var k=u,x=36;;){var E=x<=m?1:x>=m+26?26:x-m;if(k0?o(r(e),9007199254740991):0}},6075:function(e,t,n){"use strict";var r=n(8622),o=Object;e.exports=function(e){return o(r(e))}},9182:function(e,t,n){"use strict";var r=n(7725),o=n(7627),a=n(4003),i=n(692),l=n(173),s=n(5537),u=TypeError,c=s("toPrimitive");e.exports=function(e,t){if(!o(e)||a(e))return e;var n,s=i(e,c);if(s){if(void 0===t&&(t="default"),n=r(s,e,t),!o(n)||a(n))return n;throw u("Can't convert object to primitive value")}return void 0===t&&(t="number"),l(e,t)}},7171:function(e,t,n){"use strict";var r=n(9182),o=n(4003);e.exports=function(e){var t=r(e,"string");return o(t)?t:t+""}},2709:function(e,t,n){"use strict";var r={};r[n(5537)("toStringTag")]="z",e.exports="[object z]"===String(r)},158:function(e,t,n){"use strict";var r=n(5786),o=String;e.exports=function(e){if("Symbol"===r(e))throw TypeError("Cannot convert a Symbol value to a string");return o(e)}},8151:function(e){"use strict";var t=String;e.exports=function(e){try{return t(e)}catch(n){return"Object"}}},160:function(e,t,n){"use strict";var r=n(2058),o=0,a=Math.random(),i=r(1..toString);e.exports=function(e){return"Symbol("+(void 0===e?"":e)+")_"+i(++o+a,36)}},8682:function(e,t,n){"use strict";var r=n(9645),o=n(5537),a=n(369),i=n(1566),l=o("iterator");e.exports=!r((function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,n=new URLSearchParams("a=1&a=2&b=3"),r="";return e.pathname="c%20d",t.forEach((function(e,n){t.delete("b"),r+=n+e})),n.delete("a",2),n.delete("b",void 0),i&&(!e.toJSON||!n.has("a",1)||n.has("a",2)||!n.has("a",void 0)||n.has("b"))||!t.size&&(i||!a)||!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[l]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==r||"x"!==new URL("http://x",void 0).host}))},144:function(e,t,n){"use strict";var r=n(7987);e.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},446:function(e,t,n){"use strict";var r=n(369),o=n(9645);e.exports=r&&o((function(){return 42!==Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},9823:function(e){"use strict";var t=TypeError;e.exports=function(e,n){if(e1?arguments[1]:void 0),t}})},3485:function(e,t,n){"use strict";var r=n(8903),o=n(6039).includes,a=n(9645),i=n(8521);r({target:"Array",proto:!0,forced:a((function(){return!Array(1).includes()}))},{includes:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),i("includes")},6677:function(e,t,n){"use strict";var r=n(7794),o=n(8521),a=n(3820),i=n(7776),l=n(3002).f,s=n(8994),u=n(2526),c=n(1566),f=n(369),d="Array Iterator",p=i.set,h=i.getterFor(d);e.exports=s(Array,"Array",(function(e,t){p(this,{type:d,target:r(e),index:0,kind:t})}),(function(){var e=h(this),t=e.target,n=e.kind,r=e.index++;if(!t||r>=t.length)return e.target=void 0,u(void 0,!0);switch(n){case"keys":return u(r,!1);case"values":return u(t[r],!1)}return u([r,t[r]],!1)}),"values");var m=a.Arguments=a.Array;if(o("keys"),o("values"),o("entries"),!c&&f&&"values"!==m.name)try{l(m,"name",{value:"values"})}catch(v){}},4479:function(e,t,n){"use strict";var r=n(8903),o=n(6138).left,a=n(7437),i=n(1579);r({target:"Array",proto:!0,forced:!n(8018)&&i>79&&i<83||!a("reduce")},{reduce:function(e){var t=arguments.length;return o(this,e,t,t>1?arguments[1]:void 0)}})},382:function(e,t,n){"use strict";var r=n(8903),o=n(2058),a=n(4596),i=n(6075),l=n(2103),s=n(9929),u=n(158),c=n(9645),f=n(626),d=n(7437),p=n(5676),h=n(9619),m=n(1579),v=n(2861),g=[],y=o(g.sort),b=o(g.push),w=c((function(){g.sort(void 0)})),S=c((function(){g.sort(null)})),k=d("sort"),x=!c((function(){if(m)return m<70;if(!(p&&p>3)){if(h)return!0;if(v)return v<603;var e,t,n,r,o="";for(e=65;e<76;e++){switch(t=String.fromCharCode(e),e){case 66:case 69:case 70:case 72:n=3;break;case 68:case 71:n=4;break;default:n=2}for(r=0;r<47;r++)g.push({k:t+r,v:n})}for(g.sort((function(e,t){return t.v-e.v})),r=0;ru(n)?1:-1}}(e)),n=l(o),r=0;r@^][^\s!#%&*+<=>@^]*>/,I=/a/g,D=/a/g,M=new _(I)!==I,z=h.MISSED_STICKY,A=h.UNSUPPORTED_Y,U=r&&(!M||z||k||x||g((function(){return D[E]=!1,_(I)!==I||_(D)===D||"/a/i"!==String(_(I,"i"))})));if(i("RegExp",U)){for(var F=function(e,t){var n,r,o,a,i,u,h=c(P,this),m=f(e),v=void 0===t,g=[],w=e;if(!h&&m&&v&&e.constructor===F)return e;if((m||c(P,e))&&(e=e.source,v&&(t=p(w))),e=void 0===e?"":d(e),t=void 0===t?"":d(t),w=e,k&&"dotAll"in I&&(r=!!t&&N(t,"s")>-1)&&(t=O(t,/s/g,"")),n=t,z&&"sticky"in I&&(o=!!t&&N(t,"y")>-1)&&A&&(t=O(t,/y/g,"")),x&&(a=function(e){for(var t,n=e.length,r=0,o="",a=[],i={},l=!1,s=!1,u=0,c="";r<=n;r++){if("\\"===(t=T(e,r)))t+=T(e,++r);else if("]"===t)l=!1;else if(!l)switch(!0){case"["===t:l=!0;break;case"("===t:R(j,L(e,r+1))&&(r+=2,s=!0),o+=t,u++;continue;case">"===t&&s:if(""===c||y(i,c))throw new C("Invalid capture group name");i[c]=!0,a[a.length]=[c,u],s=!1,c="";continue}s?c+=t:o+=t}return[o,a]}(e),e=a[0],g=a[1]),i=l(_(e,t),h?this:P,F),(r||o||g.length)&&(u=b(i),r&&(u.dotAll=!0,u.raw=F(function(e){for(var t,n=e.length,r=0,o="",a=!1;r<=n;r++)"\\"!==(t=T(e,r))?a||"."!==t?("["===t?a=!0:"]"===t&&(a=!1),o+=t):o+="[\\s\\S]":o+=t+T(e,++r);return o}(e),n)),o&&(u.sticky=!0),g.length&&(u.groups=g)),e!==w)try{s(i,"source",""===w?"(?:)":w)}catch(S){}return i},$=u(_),H=0;$.length>H;)m(F,_,$[H++]);P.constructor=F,F.prototype=P,v(o,"RegExp",F,{constructor:!0})}w("RegExp")},8610:function(e,t,n){"use strict";var r=n(8903),o=n(4530);r({target:"RegExp",proto:!0,forced:/./.exec!==o},{exec:o})},3414:function(e,t,n){"use strict";var r=n(7124).charAt,o=n(158),a=n(7776),i=n(8994),l=n(2526),s="String Iterator",u=a.set,c=a.getterFor(s);i(String,"String",(function(e){u(this,{type:s,string:o(e),index:0})}),(function(){var e,t=c(this),n=t.string,o=t.index;return o>=n.length?l(void 0,!0):(e=r(n,o),t.index+=e.length,l(e,!1))}))},8612:function(e,t,n){"use strict";var r=n(9878),o=n(7725),a=n(2058),i=n(4902),l=n(9645),s=n(9308),u=n(1808),c=n(276),f=n(9163),d=n(468),p=n(158),h=n(8622),m=n(2051),v=n(692),g=n(378),y=n(9637),b=n(5537)("replace"),w=Math.max,S=Math.min,k=a([].concat),x=a([].push),E=a("".indexOf),_=a("".slice),P="$0"==="a".replace(/./,"$0"),C=!!/./[b]&&""===/./[b]("a","$0");i("replace",(function(e,t,n){var a=C?"$":"$0";return[function(e,n){var r=h(this),a=c(e)?void 0:v(e,b);return a?o(a,e,r,n):o(t,p(r),e,n)},function(e,o){var i=s(this),l=p(e);if("string"==typeof o&&-1===E(o,a)&&-1===E(o,"$<")){var c=n(t,i,l,o);if(c.done)return c.value}var h=u(o);h||(o=p(o));var v,b=i.global;b&&(v=i.unicode,i.lastIndex=0);for(var P,C=[];null!==(P=y(i,l))&&(x(C,P),b);){""===p(P[0])&&(i.lastIndex=m(l,d(i.lastIndex),v))}for(var R,T="",O=0,N=0;N=O&&(T+=_(l,O,I)+L,O=I+j.length)}return T+_(l,O)}]}),!!l((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$")}))||!P||C)},1057:function(e,t,n){"use strict";var r=n(8903),o=n(4610).trim;r({target:"String",proto:!0,forced:n(8768)("trim")},{trim:function(){return o(this)}})},9345:function(e,t,n){"use strict";n(650)},565:function(e,t,n){"use strict";var r=n(7990),o=n(8685),a=n(3981),i=n(9320),l=n(859),s=function(e){if(e&&e.forEach!==i)try{l(e,"forEach",i)}catch(t){e.forEach=i}};for(var u in o)o[u]&&s(r[u]&&r[u].prototype);s(a)},5e3:function(e,t,n){"use strict";var r=n(7990),o=n(8685),a=n(3981),i=n(6677),l=n(859),s=n(5537),u=s("iterator"),c=s("toStringTag"),f=i.values,d=function(e,t){if(e){if(e[u]!==f)try{l(e,u,f)}catch(r){e[u]=f}if(e[c]||l(e,c,t),o[t])for(var n in i)if(e[n]!==i[n])try{l(e,n,i[n])}catch(r){e[n]=i[n]}}};for(var p in o)d(r[p]&&r[p].prototype,p);d(a,"DOMTokenList")},3851:function(e,t,n){"use strict";n(6677);var r=n(8903),o=n(7990),a=n(7725),i=n(2058),l=n(369),s=n(8682),u=n(6561),c=n(4259),f=n(8308),d=n(1508),p=n(2282),h=n(7776),m=n(7787),v=n(1808),g=n(8496),y=n(2144),b=n(5786),w=n(9308),S=n(7627),k=n(158),x=n(1026),E=n(6373),_=n(4431),P=n(9463),C=n(9823),R=n(5537),T=n(626),O=R("iterator"),N="URLSearchParams",L=N+"Iterator",j=h.set,I=h.getterFor(N),D=h.getterFor(L),M=Object.getOwnPropertyDescriptor,z=function(e){if(!l)return o[e];var t=M(o,e);return t&&t.value},A=z("fetch"),U=z("Request"),F=z("Headers"),$=U&&U.prototype,H=F&&F.prototype,B=o.RegExp,W=o.TypeError,q=o.decodeURIComponent,V=o.encodeURIComponent,Q=i("".charAt),G=i([].join),K=i([].push),J=i("".replace),Y=i([].shift),X=i([].splice),Z=i("".split),ee=i("".slice),te=/\+/g,ne=Array(4),re=function(e){return ne[e-1]||(ne[e-1]=B("((?:%[\\da-f]{2}){"+e+"})","gi"))},oe=function(e){try{return q(e)}catch(t){return e}},ae=function(e){var t=J(e,te," "),n=4;try{return q(t)}catch(r){for(;n;)t=J(t,re(n--),oe);return t}},ie=/[!'()~]|%20/g,le={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},se=function(e){return le[e]},ue=function(e){return J(V(e),ie,se)},ce=p((function(e,t){j(this,{type:L,iterator:_(I(e).entries),kind:t})}),"Iterator",(function(){var e=D(this),t=e.kind,n=e.iterator.next(),r=n.value;return n.done||(n.value="keys"===t?r.key:"values"===t?r.value:[r.key,r.value]),n}),!0),fe=function(e){this.entries=[],this.url=null,void 0!==e&&(S(e)?this.parseObject(e):this.parseQuery("string"==typeof e?"?"===Q(e,0)?ee(e,1):e:k(e)))};fe.prototype={type:N,bindURL:function(e){this.url=e,this.update()},parseObject:function(e){var t,n,r,o,i,l,s,u=P(e);if(u)for(n=(t=_(e,u)).next;!(r=a(n,t)).done;){if(i=(o=_(w(r.value))).next,(l=a(i,o)).done||(s=a(i,o)).done||!a(i,o).done)throw W("Expected sequence with length 2");K(this.entries,{key:k(l.value),value:k(s.value)})}else for(var c in e)g(e,c)&&K(this.entries,{key:c,value:k(e[c])})},parseQuery:function(e){if(e)for(var t,n,r=Z(e,"&"),o=0;o0?arguments[0]:void 0));l||(this.size=e.entries.length)},pe=de.prototype;if(f(pe,{append:function(e,t){var n=I(this);C(arguments.length,2),K(n.entries,{key:k(e),value:k(t)}),l||this.length++,n.updateURL()},delete:function(e){for(var t=I(this),n=C(arguments.length,1),r=t.entries,o=k(e),a=n<2?void 0:arguments[1],i=void 0===a?a:k(a),s=0;st.key?1:-1})),e.updateURL()},forEach:function(e){for(var t,n=I(this).entries,r=y(e,arguments.length>1?arguments[1]:void 0),o=0;o1?ve(arguments[1]):{})}}),v(U)){var ge=function(e){return m(this,$),new U(e,arguments.length>1?ve(arguments[1]):{})};$.constructor=ge,ge.prototype=$,r({global:!0,constructor:!0,dontCallGetSet:!0,forced:!0},{Request:ge})}}e.exports={URLSearchParams:de,getState:I}},1436:function(e,t,n){"use strict";n(3851)},7828:function(e,t,n){"use strict";n(3414);var r,o=n(8903),a=n(369),i=n(8682),l=n(7990),s=n(2144),u=n(2058),c=n(6561),f=n(4259),d=n(7787),p=n(8496),h=n(6779),m=n(7530),v=n(4501),g=n(7124).codeAt,y=n(8956),b=n(158),w=n(1508),S=n(9823),k=n(3851),x=n(7776),E=x.set,_=x.getterFor("URL"),P=k.URLSearchParams,C=k.getState,R=l.URL,T=l.TypeError,O=l.parseInt,N=Math.floor,L=Math.pow,j=u("".charAt),I=u(/./.exec),D=u([].join),M=u(1..toString),z=u([].pop),A=u([].push),U=u("".replace),F=u([].shift),$=u("".split),H=u("".slice),B=u("".toLowerCase),W=u([].unshift),q="Invalid scheme",V="Invalid host",Q="Invalid port",G=/[a-z]/i,K=/[\d+-.a-z]/i,J=/\d/,Y=/^0x/i,X=/^[0-7]+$/,Z=/^\d+$/,ee=/^[\da-f]+$/i,te=/[\0\t\n\r #%/:<>?@[\\\]^|]/,ne=/[\0\t\n\r #/:<>?@[\\\]^|]/,re=/^[\u0000-\u0020]+/,oe=/(^|[^\u0000-\u0020])[\u0000-\u0020]+$/,ae=/[\t\n\r]/g,ie=function(e){var t,n,r,o;if("number"==typeof e){for(t=[],n=0;n<4;n++)W(t,e%256),e=N(e/256);return D(t,".")}if("object"==typeof e){for(t="",r=function(e){for(var t=null,n=1,r=null,o=0,a=0;a<8;a++)0!==e[a]?(o>n&&(t=r,n=o),r=null,o=0):(null===r&&(r=a),++o);return o>n&&(t=r,n=o),t}(e),n=0;n<8;n++)o&&0===e[n]||(o&&(o=!1),r===n?(t+=n?":":"::",o=!0):(t+=M(e[n],16),n<7&&(t+=":")));return"["+t+"]"}return e},le={},se=h({},le,{" ":1,'"':1,"<":1,">":1,"`":1}),ue=h({},se,{"#":1,"?":1,"{":1,"}":1}),ce=h({},ue,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),fe=function(e,t){var n=g(e,0);return n>32&&n<127&&!p(t,e)?e:encodeURIComponent(e)},de={ftp:21,file:null,http:80,https:443,ws:80,wss:443},pe=function(e,t){var n;return 2===e.length&&I(G,j(e,0))&&(":"===(n=j(e,1))||!t&&"|"===n)},he=function(e){var t;return e.length>1&&pe(H(e,0,2))&&(2===e.length||"/"===(t=j(e,2))||"\\"===t||"?"===t||"#"===t)},me=function(e){return"."===e||"%2e"===B(e)},ve={},ge={},ye={},be={},we={},Se={},ke={},xe={},Ee={},_e={},Pe={},Ce={},Re={},Te={},Oe={},Ne={},Le={},je={},Ie={},De={},Me={},ze=function(e,t,n){var r,o,a,i=b(e);if(t){if(o=this.parse(i))throw T(o);this.searchParams=null}else{if(void 0!==n&&(r=new ze(n,!0)),o=this.parse(i,null,r))throw T(o);(a=C(new P)).bindURL(this),this.searchParams=a}};ze.prototype={type:"URL",parse:function(e,t,n){var o,a,i,l,s,u=this,c=t||ve,f=0,d="",h=!1,g=!1,y=!1;for(e=b(e),t||(u.scheme="",u.username="",u.password="",u.host=null,u.port=null,u.path=[],u.query=null,u.fragment=null,u.cannotBeABaseURL=!1,e=U(e,re,""),e=U(e,oe,"$1")),e=U(e,ae,""),o=m(e);f<=o.length;){switch(a=o[f],c){case ve:if(!a||!I(G,a)){if(t)return q;c=ye;continue}d+=B(a),c=ge;break;case ge:if(a&&(I(K,a)||"+"===a||"-"===a||"."===a))d+=B(a);else{if(":"!==a){if(t)return q;d="",c=ye,f=0;continue}if(t&&(u.isSpecial()!==p(de,d)||"file"===d&&(u.includesCredentials()||null!==u.port)||"file"===u.scheme&&!u.host))return;if(u.scheme=d,t)return void(u.isSpecial()&&de[u.scheme]===u.port&&(u.port=null));d="","file"===u.scheme?c=Te:u.isSpecial()&&n&&n.scheme===u.scheme?c=be:u.isSpecial()?c=xe:"/"===o[f+1]?(c=we,f++):(u.cannotBeABaseURL=!0,A(u.path,""),c=Ie)}break;case ye:if(!n||n.cannotBeABaseURL&&"#"!==a)return q;if(n.cannotBeABaseURL&&"#"===a){u.scheme=n.scheme,u.path=v(n.path),u.query=n.query,u.fragment="",u.cannotBeABaseURL=!0,c=Me;break}c="file"===n.scheme?Te:Se;continue;case be:if("/"!==a||"/"!==o[f+1]){c=Se;continue}c=Ee,f++;break;case we:if("/"===a){c=_e;break}c=je;continue;case Se:if(u.scheme=n.scheme,a===r)u.username=n.username,u.password=n.password,u.host=n.host,u.port=n.port,u.path=v(n.path),u.query=n.query;else if("/"===a||"\\"===a&&u.isSpecial())c=ke;else if("?"===a)u.username=n.username,u.password=n.password,u.host=n.host,u.port=n.port,u.path=v(n.path),u.query="",c=De;else{if("#"!==a){u.username=n.username,u.password=n.password,u.host=n.host,u.port=n.port,u.path=v(n.path),u.path.length--,c=je;continue}u.username=n.username,u.password=n.password,u.host=n.host,u.port=n.port,u.path=v(n.path),u.query=n.query,u.fragment="",c=Me}break;case ke:if(!u.isSpecial()||"/"!==a&&"\\"!==a){if("/"!==a){u.username=n.username,u.password=n.password,u.host=n.host,u.port=n.port,c=je;continue}c=_e}else c=Ee;break;case xe:if(c=Ee,"/"!==a||"/"!==j(d,f+1))continue;f++;break;case Ee:if("/"!==a&&"\\"!==a){c=_e;continue}break;case _e:if("@"===a){h&&(d="%40"+d),h=!0,i=m(d);for(var w=0;w65535)return Q;u.port=u.isSpecial()&&x===de[u.scheme]?null:x,d=""}if(t)return;c=Le;continue}return Q}d+=a;break;case Te:if(u.scheme="file","/"===a||"\\"===a)c=Oe;else{if(!n||"file"!==n.scheme){c=je;continue}switch(a){case r:u.host=n.host,u.path=v(n.path),u.query=n.query;break;case"?":u.host=n.host,u.path=v(n.path),u.query="",c=De;break;case"#":u.host=n.host,u.path=v(n.path),u.query=n.query,u.fragment="",c=Me;break;default:he(D(v(o,f),""))||(u.host=n.host,u.path=v(n.path),u.shortenPath()),c=je;continue}}break;case Oe:if("/"===a||"\\"===a){c=Ne;break}n&&"file"===n.scheme&&!he(D(v(o,f),""))&&(pe(n.path[0],!0)?A(u.path,n.path[0]):u.host=n.host),c=je;continue;case Ne:if(a===r||"/"===a||"\\"===a||"?"===a||"#"===a){if(!t&&pe(d))c=je;else if(""===d){if(u.host="",t)return;c=Le}else{if(l=u.parseHost(d))return l;if("localhost"===u.host&&(u.host=""),t)return;d="",c=Le}continue}d+=a;break;case Le:if(u.isSpecial()){if(c=je,"/"!==a&&"\\"!==a)continue}else if(t||"?"!==a)if(t||"#"!==a){if(a!==r&&(c=je,"/"!==a))continue}else u.fragment="",c=Me;else u.query="",c=De;break;case je:if(a===r||"/"===a||"\\"===a&&u.isSpecial()||!t&&("?"===a||"#"===a)){if(".."===(s=B(s=d))||"%2e."===s||".%2e"===s||"%2e%2e"===s?(u.shortenPath(),"/"===a||"\\"===a&&u.isSpecial()||A(u.path,"")):me(d)?"/"===a||"\\"===a&&u.isSpecial()||A(u.path,""):("file"===u.scheme&&!u.path.length&&pe(d)&&(u.host&&(u.host=""),d=j(d,0)+":"),A(u.path,d)),d="","file"===u.scheme&&(a===r||"?"===a||"#"===a))for(;u.path.length>1&&""===u.path[0];)F(u.path);"?"===a?(u.query="",c=De):"#"===a&&(u.fragment="",c=Me)}else d+=fe(a,ue);break;case Ie:"?"===a?(u.query="",c=De):"#"===a?(u.fragment="",c=Me):a!==r&&(u.path[0]+=fe(a,le));break;case De:t||"#"!==a?a!==r&&("'"===a&&u.isSpecial()?u.query+="%27":u.query+="#"===a?"%23":fe(a,le)):(u.fragment="",c=Me);break;case Me:a!==r&&(u.fragment+=fe(a,se))}f++}},parseHost:function(e){var t,n,r;if("["===j(e,0)){if("]"!==j(e,e.length-1))return V;if(t=function(e){var t,n,r,o,a,i,l,s=[0,0,0,0,0,0,0,0],u=0,c=null,f=0,d=function(){return j(e,f)};if(":"===d()){if(":"!==j(e,1))return;f+=2,c=++u}for(;d();){if(8===u)return;if(":"!==d()){for(t=n=0;n<4&&I(ee,d());)t=16*t+O(d(),16),f++,n++;if("."===d()){if(0===n)return;if(f-=n,u>6)return;for(r=0;d();){if(o=null,r>0){if(!("."===d()&&r<4))return;f++}if(!I(J,d()))return;for(;I(J,d());){if(a=O(d(),10),null===o)o=a;else{if(0===o)return;o=10*o+a}if(o>255)return;f++}s[u]=256*s[u]+o,2!=++r&&4!==r||u++}if(4!==r)return;break}if(":"===d()){if(f++,!d())return}else if(d())return;s[u++]=t}else{if(null!==c)return;f++,c=++u}}if(null!==c)for(i=u-c,u=7;0!==u&&i>0;)l=s[u],s[u--]=s[c+i-1],s[c+--i]=l;else if(8!==u)return;return s}(H(e,1,-1)),!t)return V;this.host=t}else if(this.isSpecial()){if(e=y(e),I(te,e))return V;if(t=function(e){var t,n,r,o,a,i,l,s=$(e,".");if(s.length&&""===s[s.length-1]&&s.length--,(t=s.length)>4)return e;for(n=[],r=0;r1&&"0"===j(o,0)&&(a=I(Y,o)?16:8,o=H(o,8===a?1:2)),""===o)i=0;else{if(!I(10===a?Z:8===a?X:ee,o))return e;i=O(o,a)}A(n,i)}for(r=0;r=L(256,5-t))return null}else if(i>255)return null;for(l=z(n),r=0;r1?arguments[1]:void 0,r=E(t,new ze(e,!1,n));a||(t.href=r.serialize(),t.origin=r.getOrigin(),t.protocol=r.getProtocol(),t.username=r.getUsername(),t.password=r.getPassword(),t.host=r.getHost(),t.hostname=r.getHostname(),t.port=r.getPort(),t.pathname=r.getPathname(),t.search=r.getSearch(),t.searchParams=r.getSearchParams(),t.hash=r.getHash())},Ue=Ae.prototype,Fe=function(e,t){return{get:function(){return _(this)[e]()},set:t&&function(e){return _(this)[t](e)},configurable:!0,enumerable:!0}};if(a&&(f(Ue,"href",Fe("serialize","setHref")),f(Ue,"origin",Fe("getOrigin")),f(Ue,"protocol",Fe("getProtocol","setProtocol")),f(Ue,"username",Fe("getUsername","setUsername")),f(Ue,"password",Fe("getPassword","setPassword")),f(Ue,"host",Fe("getHost","setHost")),f(Ue,"hostname",Fe("getHostname","setHostname")),f(Ue,"port",Fe("getPort","setPort")),f(Ue,"pathname",Fe("getPathname","setPathname")),f(Ue,"search",Fe("getSearch","setSearch")),f(Ue,"searchParams",Fe("getSearchParams")),f(Ue,"hash",Fe("getHash","setHash"))),c(Ue,"toJSON",(function(){return _(this).serialize()}),{enumerable:!0}),c(Ue,"toString",(function(){return _(this).serialize()}),{enumerable:!0}),R){var $e=R.createObjectURL,He=R.revokeObjectURL;$e&&c(Ae,"createObjectURL",s($e,R)),He&&c(Ae,"revokeObjectURL",s(He,R))}w(Ae,"URL"),o({global:!0,constructor:!0,forced:!i,sham:!a},{URL:Ae})},7767:function(e,t,n){"use strict";n(7828)},5795:function(e,t,n){"use strict";t.p2=t.$C=void 0;var r=n(9598);t.$C=r.ScrollHandler;var o=n(1743);t.p2=o.useScrollRestoration},9598:function(e,t,n){"use strict";var r=n(5159);t.__esModule=!0,t.ScrollHandler=t.ScrollContext=void 0;var o=r(n(8540)),a=r(n(3131)),i=function(e,t){if(!t&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var n=u(t);if(n&&n.has(e))return n.get(e);var r={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in e)if("default"!==a&&Object.prototype.hasOwnProperty.call(e,a)){var i=o?Object.getOwnPropertyDescriptor(e,a):null;i&&(i.get||i.set)?Object.defineProperty(r,a,i):r[a]=e[a]}r.default=e,n&&n.set(e,r);return r}(n(959)),l=r(n(507)),s=n(7150);function u(e){if("function"!=typeof WeakMap)return null;var t=new WeakMap,n=new WeakMap;return(u=function(e){return e?n:t})(e)}var c=i.createContext(new s.SessionStorage);t.ScrollContext=c,c.displayName="GatsbyScrollContext";var f=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),a=0;an.e(306).then(n.bind(n,4272)),"component---src-pages-404-js":()=>Promise.all([n.e(532),n.e(883)]).then(n.bind(n,4487)),"component---src-pages-posts-js":()=>Promise.all([n.e(532),n.e(986)]).then(n.bind(n,2553)),"component---src-templates-post-index-js-content-file-path-content-api-gm-md":()=>Promise.all([n.e(532),n.e(146)]).then(n.bind(n,5974)),"component---src-templates-post-index-js-content-file-path-content-api-matching-md":()=>Promise.all([n.e(532),n.e(589)]).then(n.bind(n,6120)),"component---src-templates-post-index-js-content-file-path-content-api-metadata-block-md":()=>Promise.all([n.e(532),n.e(130)]).then(n.bind(n,116)),"component---src-templates-post-index-js-content-file-path-content-faq-index-md":()=>Promise.all([n.e(532),n.e(693)]).then(n.bind(n,117)),"component---src-templates-post-index-js-content-file-path-content-get-it-index-md":()=>Promise.all([n.e(532),n.e(198),n.e(152)]).then(n.bind(n,2145)),"component---src-templates-post-index-js-content-file-path-content-guide-creating-a-userscript-index-md":()=>Promise.all([n.e(532),n.e(559)]).then(n.bind(n,6895)),"component---src-templates-post-index-js-content-file-path-content-guide-keyboard-shortcuts-index-mdx":()=>Promise.all([n.e(532),n.e(410)]).then(n.bind(n,5262)),"component---src-templates-post-index-js-content-file-path-content-guide-observing-dom-index-md":()=>Promise.all([n.e(532),n.e(810)]).then(n.bind(n,3424)),"component---src-templates-post-index-js-content-file-path-content-guide-using-modern-syntax-index-md":()=>Promise.all([n.e(532),n.e(634)]).then(n.bind(n,4905)),"component---src-templates-post-index-js-content-file-path-content-index-md":()=>Promise.all([n.e(532),n.e(198),n.e(125)]).then(n.bind(n,4324)),"component---src-templates-post-index-js-content-file-path-content-localization-index-md":()=>Promise.all([n.e(532),n.e(763)]).then(n.bind(n,2896)),"component---src-templates-post-index-js-content-file-path-content-posts-features-in-userscript-generator-md":()=>Promise.all([n.e(532),n.e(538)]).then(n.bind(n,6326)),"component---src-templates-post-index-js-content-file-path-content-posts-how-to-edit-scripts-with-your-favorite-editor-index-md":()=>Promise.all([n.e(532),n.e(898)]).then(n.bind(n,1949)),"component---src-templates-post-index-js-content-file-path-content-posts-inject-into-context-md":()=>Promise.all([n.e(532),n.e(877)]).then(n.bind(n,967)),"component---src-templates-post-index-js-content-file-path-content-posts-inject-scripts-with-blob-urls-md":()=>Promise.all([n.e(532),n.e(77)]).then(n.bind(n,5866)),"component---src-templates-post-index-js-content-file-path-content-posts-smart-rules-for-blacklist-md":()=>Promise.all([n.e(532),n.e(638)]).then(n.bind(n,2006)),"component---src-templates-post-index-js-content-file-path-content-posts-violentmonkey-workflows-md":()=>Promise.all([n.e(532),n.e(668)]).then(n.bind(n,5956)),"component---src-templates-post-index-js-content-file-path-content-privacy-index-md":()=>Promise.all([n.e(532),n.e(346)]).then(n.bind(n,4297)),"component---src-templates-post-index-js-content-file-path-src-components-install-beta-mdx":()=>Promise.all([n.e(532),n.e(19)]).then(n.bind(n,1516)),"component---src-templates-post-index-js-content-file-path-src-components-install-stable-mdx":()=>Promise.all([n.e(532),n.e(198),n.e(247)]).then(n.bind(n,5634))}},3103:function(e,t,n){e.exports=[{plugin:n(1003),options:{plugins:[],trackingIds:["G-2E0X3LSCBM"],gtagConfig:{anonymize_ip:!0},pluginConfig:{exclude:["/auth_**"],head:!1,respectDNT:!1,origin:"https://www.googletagmanager.com",delayOnRouteUpdate:0}}},{plugin:n(7510),options:{plugins:[],icon:"src/assets/vm.png",legacy:!0,theme_color_in_head:!0,cache_busting_mode:"query",crossOrigin:"anonymous",include_favicon:!0,cacheDigest:"e0d9ed50fb982761b0f7cdea8b093ae9"}},{plugin:n(4647),options:{plugins:[]}},{plugin:n(3005),options:{plugins:[],offsetY:70,className:"anchor"}},{plugin:n(4774),options:{plugins:[],backgroundColor:"transparent",linkImagesToOriginal:!1,maxWidth:650,showCaptions:!1,markdownCaptions:!1,quality:50,withWebp:!1,withAvif:!1,loading:"lazy",decoding:"async",disableBgImageOnAlpha:!1,disableBgImage:!1}},{plugin:n(6041),options:{plugins:[]}},{plugin:n(3128),options:{plugins:[]}},{plugin:n(2010),options:{plugins:[]}}]},6491:function(e,t,n){n(4479),n(6317);const r=n(3103),{getResourceURLsForPathname:o,loadPage:a,loadPageSync:i}=n(677).jN;t.h=(e,t={},n,l)=>{let s=r.map((n=>{if(!n.plugin[e])return;t.getResourceURLsForPathname=o,t.loadPage=a,t.loadPageSync=i;const r=n.plugin[e](t,n.options);return r&&l&&(t=l({args:t,result:r,plugin:n})),r}));return s=s.filter((e=>void 0!==e)),s.length>0?s:n?[n]:[]},t.I=(e,t,n)=>r.reduce(((n,r)=>r.plugin[e]?n.then((()=>r.plugin[e](t,r.options))):n),Promise.resolve())},2933:function(e,t){t.M=()=>""},4937:function(e,t,n){"use strict";n.d(t,{Z:function(){return r}});var r=function(e){return e=e||Object.create(null),{on:function(t,n){(e[t]||(e[t]=[])).push(n)},off:function(t,n){e[t]&&e[t].splice(e[t].indexOf(n)>>>0,1)},emit:function(t,n){(e[t]||[]).slice().map((function(e){e(n)})),(e["*"]||[]).slice().map((function(e){e(t,n)}))}}}()},4772:function(e,t,n){"use strict";n.d(t,{UD:function(){return d},Cj:function(){return h},GA:function(){return p},DS:function(){return f}});n(6677),n(5e3),n(7767),n(1436);var r=n(433),o=n(9317),a=e=>{if(void 0===e)return e;let[t,n=""]=e.split("?");return n&&(n="?"+n),"/"===t?"/"+n:"/"===t.charAt(t.length-1)?t.slice(0,-1)+n:t+n},i=n(3310);const l=new Map;let s=[];const u=e=>{let t=e;if(-1!==e.indexOf("?")){const[n,r]=e.split("?");t=`${n}?${encodeURIComponent(r)}`}const n=decodeURIComponent(t);return(0,o.Z)(n,decodeURIComponent("")).split("#")[0]};function c(e){return e.startsWith("/")||e.startsWith("https://")||e.startsWith("http://")?e:new URL(e,window.location.href+(window.location.href.endsWith("/")?"":"/")).pathname}const f=e=>{s=e},d=e=>{const t=m(e),n=s.map((({path:e,matchPath:t})=>({path:t,originalPath:e}))),o=(0,r.pick)(n,t);return o?a(o.route.originalPath):null},p=e=>{const t=m(e),n=s.map((({path:e,matchPath:t})=>({path:t,originalPath:e}))),o=(0,r.pick)(n,t);return o?o.params:{}},h=e=>{const t=u(c(e));if(l.has(t))return l.get(t);const n=(0,i.J)(e);if(n)return h(n.toPath);let r=d(t);return r||(r=m(e)),l.set(t,r),r},m=e=>{let t=u(c(e));return"/index.html"===t&&(t="/"),t=a(t),t}},7133:function(e,t,n){"use strict";n.r(t),n.d(t,{Link:function(){return l.rU},PageRenderer:function(){return a()},Script:function(){return k.Script},ScriptStrategy:function(){return k.ScriptStrategy},Slice:function(){return b},StaticQuery:function(){return s.i1},StaticQueryContext:function(){return s.B9},collectedScriptsByPage:function(){return k.collectedScriptsByPage},graphql:function(){return E},navigate:function(){return l.c4},parsePath:function(){return l.cP},prefetchPathname:function(){return x},scriptCache:function(){return k.scriptCache},scriptCallbackCache:function(){return k.scriptCallbackCache},useScrollRestoration:function(){return i.p2},useStaticQuery:function(){return s.K2},withAssetPrefix:function(){return l.mc},withPrefix:function(){return l.dq}});var r=n(677),o=n(8710),a=n.n(o),i=n(5795),l=n(9710),s=n(7895),u=(n(6677),n(5e3),n(1057),n(959)),c=n(7880),f=n(2933),d=n(9475);const p=({sliceId:e,children:t})=>{const n=[u.createElement("slice-start",{id:`${e}-1`}),u.createElement("slice-end",{id:`${e}-1`})];return t&&(n.push(t),n.push(u.createElement("slice-start",{id:`${e}-2`}),u.createElement("slice-end",{id:`${e}-2`}))),n},h=["sliceName","allowEmpty","children"],m=e=>{let{sliceName:t,allowEmpty:n,children:r}=e,o=(0,c.Z)(e,h);const a=(0,u.useContext)(d.u0),i=(0,u.useContext)(d.Db),l=a[t];if(!l){if(n)return null;throw new Error(`Slice "${l}" for "${t}" slot not found`)}const s=((e,t)=>Object.keys(t).length?`${e}-${(0,f.M)(t)}`:e)(l,o);let m=i[s];return m?r&&(m.hasChildren=!0):i[s]=m={props:o,sliceName:l,hasChildren:!!r},u.createElement(p,{sliceId:s},r)};var v=n(2319);const g=["sliceName","allowEmpty","children"],y=e=>{let{sliceName:t,allowEmpty:n,children:r}=e,o=(0,c.Z)(e,g);const a=(0,u.useContext)(d.u0),i=(0,u.useContext)(d.m3),l=a[t],s=i.get(l);if(!s){if(n)return null;throw new Error(`Slice "${l}" for "${t}" slot not found`)}return u.createElement(s.component,(0,v.Z)({sliceContext:s.sliceContext,data:s.data},o),r)};function b(e){{const n=Object.assign({},e,{sliceName:e.alias});delete n.alias,delete n.__renderedByLocation;const r=(0,u.useContext)(d.Bs),o=S(e);if(Object.keys(o).length)throw new w("browser"===r.renderEnvironment,n.sliceName,o,e.__renderedByLocation);if("server"===r.renderEnvironment)return u.createElement(m,n);if("browser"===r.renderEnvironment)return u.createElement(y,n);if("engines"===r.renderEnvironment||"dev-ssr"===r.renderEnvironment)return u.createElement(y,n);if("slices"===r.renderEnvironment){let n="";try{n=`\n\nSlice component "${r.sliceRoot.name}" (${r.sliceRoot.componentPath}) tried to render `}catch(t){}throw new Error(`Nested slices are not supported.${n}\n\nSee https://gatsbyjs.com/docs/reference/built-in-components/gatsby-slice#nested-slices`)}throw new Error(`Slice context "${r.renderEnvironment}" is not supported.`)}}class w extends Error{constructor(e,t,n,r){const o=Object.entries(n).map((([e,t])=>`not serializable "${t}" type passed to "${e}" prop`)).join(", "),a="SlicePropsError";let i="",l="";if(e){const e=u.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactDebugCurrentFrame.getCurrentStack().trim().split("\n").slice(1);e[0]=e[0].trim(),i="\n"+e.join("\n"),l=`Slice "${t}" was passed props that are not serializable (${o}).`}else{l=`${a}: Slice "${t}" was passed props that are not serializable (${o}).`;i=`${l}\n${(new Error).stack.trim().split("\n").slice(2).join("\n")}`}super(l),this.name=a,i?this.stack=i:Error.captureStackTrace(this,w),r&&(this.forcedLocation=Object.assign({},r,{functionName:"Slice"}))}}const S=(e,t={},n=[],r=null)=>{for(const[o,a]of Object.entries(e)){if(null==a||!r&&"children"===o)continue;const e=r?`${r}.${o}`:o;"function"==typeof a?t[e]=typeof a:"object"==typeof a&&n.indexOf(a)<=0&&(n.push(a),S(a,t,n,e))}return t};var k=n(8750);const x=r.ZP.enqueue;function E(){throw new Error("It appears like Gatsby is misconfigured. Gatsby related `graphql` calls are supposed to only be evaluated at compile time, and then compiled away. Unfortunately, something went wrong and the query was left in the compiled code.\n\nUnless your site has a complex or custom babel/Gatsby configuration this is likely a bug in Gatsby.")}},677:function(e,t,n){"use strict";n.d(t,{uQ:function(){return u},kL:function(){return y},ZP:function(){return k},Nt:function(){return E},hs:function(){return x},jN:function(){return S},N1:function(){return w}});n(6677),n(5e3),n(6317),n(3485),n(8610),n(8612),n(565);var r=n(3320);const o=function(e){if("undefined"==typeof document)return!1;const t=document.createElement("link");try{if(t.relList&&"function"==typeof t.relList.supports)return t.relList.supports(e)}catch(n){return!1}return!1}("prefetch")?function(e,t){return new Promise(((n,r)=>{if("undefined"==typeof document)return void r();const o=document.createElement("link");o.setAttribute("rel","prefetch"),o.setAttribute("href",e),Object.keys(t).forEach((e=>{o.setAttribute(e,t[e])})),o.onload=n,o.onerror=r;(document.getElementsByTagName("head")[0]||document.getElementsByName("script")[0].parentNode).appendChild(o)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.onload=()=>{200===r.status?t():n()},r.send(null)}))},a={};var i=function(e,t){return new Promise((n=>{a[e]?n():o(e,t).then((()=>{n(),a[e]=!0})).catch((()=>{}))}))},l=n(4937),s=n(4772);const u={Error:"error",Success:"success"},c=e=>{const[t,n]=e.split("?");var r;return`/page-data/${"/"===t?"index":(r="/"===(r=t)[0]?r.slice(1):r).endsWith("/")?r.slice(0,-1):r}/page-data.json${n?`?${n}`:""}`},f=e=>e.startsWith("//");function d(e,t="GET"){return new Promise((n=>{const r=new XMLHttpRequest;r.open(t,e,!0),r.onreadystatechange=()=>{4==r.readyState&&n(r)},r.send(null)}))}const p=/bot|crawler|spider|crawling/i,h=(e,t=null,n)=>{var r;const o={componentChunkName:e.componentChunkName,path:e.path,webpackCompilationHash:e.webpackCompilationHash,matchPath:e.matchPath,staticQueryHashes:e.staticQueryHashes,getServerDataError:e.getServerDataError,slicesMap:null!==(r=e.slicesMap)&&void 0!==r?r:{}};return{component:t,head:n,json:e.result,page:o}};function m(e){return new Promise((t=>{try{const n=e.readRoot();t(n)}catch(n){if(!Object.hasOwnProperty.call(n,"_response")||!Object.hasOwnProperty.call(n,"_status"))throw n;setTimeout((()=>{m(e).then(t)}),200)}}))}class v{constructor(e,t){this.inFlightNetworkRequests=new Map,this.pageDb=new Map,this.inFlightDb=new Map,this.staticQueryDb={},this.pageDataDb=new Map,this.partialHydrationDb=new Map,this.slicesDataDb=new Map,this.sliceInflightDb=new Map,this.slicesDb=new Map,this.isPrefetchQueueRunning=!1,this.prefetchQueued=[],this.prefetchTriggered=new Set,this.prefetchCompleted=new Set,this.loadComponent=e,(0,s.DS)(t)}memoizedGet(e){let t=this.inFlightNetworkRequests.get(e);return t||(t=d(e,"GET"),this.inFlightNetworkRequests.set(e,t)),t.then((t=>(this.inFlightNetworkRequests.delete(e),t))).catch((t=>{throw this.inFlightNetworkRequests.delete(e),t}))}setApiRunner(e){this.apiRunner=e,this.prefetchDisabled=e("disableCorePrefetching").some((e=>e))}fetchPageDataJson(e){const{pagePath:t,retries:n=0}=e,r=c(t);return this.memoizedGet(r).then((r=>{const{status:o,responseText:a}=r;if(200===o)try{const n=JSON.parse(a);if(void 0===n.path)throw new Error("not a valid pageData response");const r=t.split("?")[1];return r&&!n.path.includes(r)&&(n.path+=`?${r}`),Object.assign(e,{status:u.Success,payload:n})}catch(i){}return 404===o||200===o?"/404.html"===t||"/500.html"===t?Object.assign(e,{status:u.Error}):this.fetchPageDataJson(Object.assign(e,{pagePath:"/404.html",notFound:!0})):500===o?this.fetchPageDataJson(Object.assign(e,{pagePath:"/500.html",internalServerError:!0})):n<3?this.fetchPageDataJson(Object.assign(e,{retries:n+1})):Object.assign(e,{status:u.Error})}))}fetchPartialHydrationJson(e){const{pagePath:t,retries:n=0}=e,r=c(t).replace(".json","-rsc.json");return this.memoizedGet(r).then((r=>{const{status:o,responseText:a}=r;if(200===o)try{return Object.assign(e,{status:u.Success,payload:a})}catch(i){}return 404===o||200===o?"/404.html"===t||"/500.html"===t?Object.assign(e,{status:u.Error}):this.fetchPartialHydrationJson(Object.assign(e,{pagePath:"/404.html",notFound:!0})):500===o?this.fetchPartialHydrationJson(Object.assign(e,{pagePath:"/500.html",internalServerError:!0})):n<3?this.fetchPartialHydrationJson(Object.assign(e,{retries:n+1})):Object.assign(e,{status:u.Error})}))}loadPageDataJson(e){const t=(0,s.Cj)(e);if(this.pageDataDb.has(t)){const e=this.pageDataDb.get(t);return Promise.resolve(e)}return this.fetchPageDataJson({pagePath:t}).then((e=>(this.pageDataDb.set(t,e),e)))}loadPartialHydrationJson(e){const t=(0,s.Cj)(e);if(this.partialHydrationDb.has(t)){const e=this.partialHydrationDb.get(t);return Promise.resolve(e)}return this.fetchPartialHydrationJson({pagePath:t}).then((e=>(this.partialHydrationDb.set(t,e),e)))}loadSliceDataJson(e){if(this.slicesDataDb.has(e)){const t=this.slicesDataDb.get(e);return Promise.resolve({sliceName:e,jsonPayload:t})}return d(`/slice-data/${e}.json`,"GET").then((t=>{const n=JSON.parse(t.responseText);return this.slicesDataDb.set(e,n),{sliceName:e,jsonPayload:n}}))}findMatchPath(e){return(0,s.UD)(e)}loadPage(e){const t=(0,s.Cj)(e);if(this.pageDb.has(t)){const e=this.pageDb.get(t);return e.error?Promise.resolve({error:e.error,status:e.status}):Promise.resolve(e.payload)}if(this.inFlightDb.has(t))return this.inFlightDb.get(t);const n=[this.loadAppData(),this.loadPageDataJson(t)];const o=Promise.all(n).then((e=>{const[n,o,a]=e;if(o.status===u.Error||(null==a?void 0:a.status)===u.Error)return{status:u.Error};let i=o.payload;const{componentChunkName:s,staticQueryHashes:c=[],slicesMap:f={}}=i,d={},p=Array.from(new Set(Object.values(f))),v=e=>{if(this.slicesDb.has(e.name))return this.slicesDb.get(e.name);if(this.sliceInflightDb.has(e.name))return this.sliceInflightDb.get(e.name);const t=this.loadComponent(e.componentChunkName).then((t=>{return{component:(n=t,n&&n.default||n),sliceContext:e.result.sliceContext,data:e.result.data};var n}));return this.sliceInflightDb.set(e.name,t),t.then((t=>{this.slicesDb.set(e.name,t),this.sliceInflightDb.delete(e.name)})),t};return Promise.all(p.map((e=>this.loadSliceDataJson(e)))).then((e=>{const f=[],p=[...c];for(const{jsonPayload:t,sliceName:n}of Object.values(e)){f.push(Object.assign({name:n},t));for(const e of t.staticQueryHashes)p.includes(e)||p.push(e)}const g=[Promise.all(f.map(v)),this.loadComponent(s,"head")];g.push(this.loadComponent(s));const y=Promise.all(g).then((e=>{const[t,l,s]=e;d.createdAt=new Date;for(const n of t)(!n||n instanceof Error)&&(d.status=u.Error,d.error=n);let c;if((!s||s instanceof Error)&&(d.status=u.Error,d.error=s),d.status!==u.Error){if(d.status=u.Success,!0!==o.notFound&&!0!==(null==a?void 0:a.notFound)||(d.notFound=!0),i=Object.assign(i,{webpackCompilationHash:n?n.webpackCompilationHash:""}),"string"==typeof(null==a?void 0:a.payload)){c=h(i,null,l),c.partialHydration=a.payload;const e=new ReadableStream({start(e){const t=new TextEncoder;e.enqueue(t.encode(a.payload))},pull(e){e.close()},cancel(){}});return m((0,r.createFromReadableStream)(e)).then((e=>(c.partialHydration=e,c)))}c=h(i,s,l)}return c})),b=Promise.all(p.map((e=>{if(this.staticQueryDb[e]){const t=this.staticQueryDb[e];return{staticQueryHash:e,jsonPayload:t}}return this.memoizedGet(`/page-data/sq/d/${e}.json`).then((t=>{const n=JSON.parse(t.responseText);return{staticQueryHash:e,jsonPayload:n}})).catch((()=>{throw new Error(`We couldn't load "/page-data/sq/d/${e}.json"`)}))}))).then((e=>{const t={};return e.forEach((({staticQueryHash:e,jsonPayload:n})=>{t[e]=n,this.staticQueryDb[e]=n})),t}));return Promise.all([y,b]).then((([e,n])=>{let r;return e&&(r=Object.assign({},e,{staticQueryResults:n}),d.payload=r,l.Z.emit("onPostLoadPageResources",{page:r,pageResources:r})),this.pageDb.set(t,d),d.error?{error:d.error,status:d.status}:r})).catch((e=>({error:e,status:u.Error})))}))}));return o.then((()=>{this.inFlightDb.delete(t)})).catch((e=>{throw this.inFlightDb.delete(t),e})),this.inFlightDb.set(t,o),o}loadPageSync(e,t={}){const n=(0,s.Cj)(e);if(this.pageDb.has(n)){const e=this.pageDb.get(n);if(e.payload)return e.payload;if(null!=t&&t.withErrorDetails)return{error:e.error,status:e.status}}}shouldPrefetch(e){return!!(()=>{if("connection"in navigator&&void 0!==navigator.connection){if((navigator.connection.effectiveType||"").includes("2g"))return!1;if(navigator.connection.saveData)return!1}return!0})()&&((!navigator.userAgent||!p.test(navigator.userAgent))&&!this.pageDb.has(e))}prefetch(e){if(!this.shouldPrefetch(e))return{then:e=>e(!1),abort:()=>{}};if(this.prefetchTriggered.has(e))return{then:e=>e(!0),abort:()=>{}};const t={resolve:null,reject:null,promise:null};t.promise=new Promise(((e,n)=>{t.resolve=e,t.reject=n})),this.prefetchQueued.push([e,t]);const n=new AbortController;return n.signal.addEventListener("abort",(()=>{const t=this.prefetchQueued.findIndex((([t])=>t===e));-1!==t&&this.prefetchQueued.splice(t,1)})),this.isPrefetchQueueRunning||(this.isPrefetchQueueRunning=!0,setTimeout((()=>{this._processNextPrefetchBatch()}),3e3)),{then:(e,n)=>t.promise.then(e,n),abort:n.abort.bind(n)}}_processNextPrefetchBatch(){(window.requestIdleCallback||(e=>setTimeout(e,0)))((()=>{const e=this.prefetchQueued.splice(0,4),t=Promise.all(e.map((([e,t])=>(this.prefetchTriggered.has(e)||(this.apiRunner("onPrefetchPathname",{pathname:e}),this.prefetchTriggered.add(e)),this.prefetchDisabled?t.resolve(!1):this.doPrefetch((0,s.Cj)(e)).then((()=>{this.prefetchCompleted.has(e)||(this.apiRunner("onPostPrefetchPathname",{pathname:e}),this.prefetchCompleted.add(e)),t.resolve(!0)}))))));this.prefetchQueued.length?t.then((()=>{setTimeout((()=>{this._processNextPrefetchBatch()}),3e3)})):this.isPrefetchQueueRunning=!1}))}doPrefetch(e){const t=c(e);return i(t,{crossOrigin:"anonymous",as:"fetch"}).then((()=>this.loadPageDataJson(e)))}hovering(e){this.loadPage(e)}getResourceURLsForPathname(e){const t=(0,s.Cj)(e),n=this.pageDataDb.get(t);if(n){const e=h(n.payload);return[...g(e.page.componentChunkName),c(t)]}return null}isPageNotFound(e){const t=(0,s.Cj)(e),n=this.pageDb.get(t);return!n||n.notFound}loadAppData(e=0){return this.memoizedGet("/page-data/app-data.json").then((t=>{const{status:n,responseText:r}=t;let o;if(200!==n&&e<3)return this.loadAppData(e+1);if(200===n)try{const e=JSON.parse(r);if(void 0===e.webpackCompilationHash)throw new Error("not a valid app-data response");o=e}catch(a){}return o}))}}const g=e=>(window.___chunkMapping[e]||[]).map((e=>""+e));class y extends v{constructor(e,t,n){super(((t,n="components")=>{if(!e[n="components"][t])throw new Error(`We couldn't find the correct component chunk with the name "${t}"`);return e[n][t]().catch((e=>e))}),t),n&&this.pageDataDb.set((0,s.Cj)(n.path),{pagePath:n.path,payload:n,status:"success"})}doPrefetch(e){return super.doPrefetch(e).then((e=>{if(e.status!==u.Success)return Promise.resolve();const t=e.payload,n=t.componentChunkName,r=g(n);return Promise.all(r.map(i)).then((()=>t))}))}loadPageDataJson(e){return super.loadPageDataJson(e).then((t=>t.notFound?f(e)?t:d(e,"HEAD").then((e=>200===e.status?{status:u.Error}:t)):t))}loadPartialHydrationJson(e){return super.loadPartialHydrationJson(e).then((t=>t.notFound?f(e)?t:d(e,"HEAD").then((e=>200===e.status?{status:u.Error}:t)):t))}}let b;const w=e=>{b=e},S={enqueue:e=>b.prefetch(e),getResourceURLsForPathname:e=>b.getResourceURLsForPathname(e),loadPage:e=>b.loadPage(e),loadPageSync:(e,t={})=>b.loadPageSync(e,t),prefetch:e=>b.prefetch(e),isPageNotFound:e=>b.isPageNotFound(e),hovering:e=>b.hovering(e),loadAppData:()=>b.loadAppData()};var k=S;function x(){return b?b.staticQueryDb:{}}function E(){return b?b.slicesDb:{}}},6984:function(e,t,n){"use strict";n.d(t,{Z:function(){return x}});var r=n(959),o=n(507),a=n.n(o),i=n(6491),l=n(4772),s=(n(6677),n(5e3),n(3485),n(7133)),u=n(433),c=n(4686);function f({children:e,callback:t}){return(0,r.useEffect)((()=>{t()})),e}n(565);const d=["link","meta","style","title","base","noscript","script","html","body"];function p(e,t){if(e instanceof HTMLElement&&t instanceof HTMLElement){const n=t.getAttribute("nonce");if(n&&!e.getAttribute("nonce")){const r=t.cloneNode(!0);return r.setAttribute("nonce",""),r.nonce=n,n===e.nonce&&e.isEqualNode(r)}}return e.isEqualNode(t)}function h(e,t={html:{},body:{}}){const n=new Map,r=[];for(const s of e.childNodes){var o,a;const e=s.nodeName.toLowerCase(),u=null===(o=s.attributes)||void 0===o||null===(a=o.id)||void 0===a?void 0:a.value;if(g(s)){if(v(e))if("html"===e||"body"===e)for(const n of s.attributes){const r="style"===n.name;var i;if(t[e]=Object.assign({},t[e]),r||(t[e][n.name]=n.value),r)t[e].style=`${null!==(i=t[e])&&void 0!==i&&i.style?t[e].style:""}${n.value} `}else{let e=s.cloneNode(!0);if(e.setAttribute("data-gatsby-head",!0),"script"===e.nodeName.toLowerCase()&&(e=m(e)),u)if(n.has(u)){var l;const t=n.get(u);null===(l=r[t].parentNode)||void 0===l||l.removeChild(r[t]),r[t]=e}else r.push(e),n.set(u,r.length-1);else r.push(e)}s.childNodes.length&&r.push(...h(s,t).validHeadNodes)}}return{validHeadNodes:r,htmlAndBodyAttributes:t}}function m(e){const t=document.createElement("script");for(const n of e.attributes)t.setAttribute(n.name,n.value);return t.innerHTML=e.innerHTML,t}function v(e){return d.includes(e)}function g(e){return 1===e.nodeType}const y=document.createElement("div"),b={html:[],body:[]},w=()=>{const{validHeadNodes:e,htmlAndBodyAttributes:t}=h(y);b.html=Object.keys(t.html),b.body=Object.keys(t.body),function(e){if(!e)return;const{html:t,body:n}=e,r=document.querySelector("html");r&&Object.entries(t).forEach((([e,t])=>{r.setAttribute(e,t)}));const o=document.querySelector("body");o&&Object.entries(n).forEach((([e,t])=>{o.setAttribute(e,t)}))}(t);const n=document.querySelectorAll("[data-gatsby-head]");if(0===n.length)return void document.head.append(...e);const r=[];!function({oldNodes:e,newNodes:t,onStale:n,onNew:r}){for(const o of e){const e=t.findIndex((e=>p(e,o)));-1===e?n(o):t.splice(e,1)}for(const o of t)r(o)}({oldNodes:n,newNodes:e,onStale:e=>e.parentNode.removeChild(e),onNew:e=>r.push(e)}),document.head.append(...r)};function S({pageComponent:e,staticQueryResults:t,pageComponentProps:n}){(0,r.useEffect)((()=>{if(null!=e&&e.Head){!function(e){if("function"!=typeof e)throw new Error(`Expected "Head" export to be a function got "${typeof e}".`)}(e.Head);const{render:a}=(0,c.U)(),l=r.createElement(e.Head,{location:{pathname:(o=n).location.pathname},params:o.params,data:o.data||{},serverData:o.serverData,pageContext:o.pageContext}),d=(0,i.h)("wrapRootElement",{element:l},l,(({result:e})=>({element:e}))).pop();a(r.createElement(f,{callback:w},r.createElement(s.StaticQueryContext.Provider,{value:t},r.createElement(u.LocationProvider,null,d))),y)}var o;return()=>{!function(){const e=document.querySelectorAll("[data-gatsby-head]");for(const t of e)t.parentNode.removeChild(t)}(),function(e){if(!e)return;const{html:t,body:n}=e;if(t){const e=document.querySelector("html");t.forEach((t=>{e&&e.removeAttribute(t)}))}if(n){const e=document.querySelector("body");n.forEach((t=>{e&&e.removeAttribute(t)}))}}(b)}}))}function k(e){const t=Object.assign({},e,{params:Object.assign({},(0,l.GA)(e.location.pathname),e.pageResources.json.pageContext.__params)});let n;var o;n=e.pageResources.partialHydration?e.pageResources.partialHydration:(0,r.createElement)((o=e.pageResources.component)&&o.default||o,Object.assign({},t,{key:e.path||e.pageResources.page.path}));S({pageComponent:e.pageResources.head,staticQueryResults:e.pageResources.staticQueryResults,pageComponentProps:t});return(0,i.h)("wrapPageElement",{element:n,props:t},n,(({result:e})=>({element:e,props:t}))).pop()}k.propTypes={location:a().object.isRequired,pageResources:a().object.isRequired,data:a().object,pageContext:a().object.isRequired};var x=k},5554:function(e,t,n){"use strict";var r=n(2319),o=(n(3485),n(8610),n(6491)),a=n(959),i=n(433),l=n(5795),s=n(7895),u=n(9475),c=n(507),f=n.n(c),d=n(677),p=n(3310),h=n(4937);const m={id:"gatsby-announcer",style:{position:"absolute",top:0,width:1,height:1,padding:0,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",border:0},"aria-live":"assertive","aria-atomic":"true"};var v=n(9710);function g(e){const t=(0,p.J)(e),{hash:n,search:r}=window.location;return null!=t&&(window.___replace(t.toPath+r+n),!0)}let y="";window.addEventListener("unhandledrejection",(e=>{/loading chunk \d* failed./i.test(e.reason)&&y&&(window.location.pathname=y)}));const b=(e,t)=>{g(e.pathname)||(y=e.pathname,(0,o.h)("onPreRouteUpdate",{location:e,prevLocation:t}))},w=(e,t)=>{g(e.pathname)||(0,o.h)("onRouteUpdate",{location:e,prevLocation:t})},S=(e,t={})=>{if("number"==typeof e)return void i.globalHistory.navigate(e);const{pathname:n,search:r,hash:a}=(0,v.cP)(e),l=(0,p.J)(n);if(l&&(e=l.toPath+r+a),window.___swUpdated)return void(window.location=n+r+a);const s=setTimeout((()=>{h.Z.emit("onDelayedLoadPageResources",{pathname:n}),(0,o.h)("onRouteUpdateDelayed",{location:window.location})}),1e3);d.ZP.loadPage(n+r).then((o=>{if(!o||o.status===d.uQ.Error)return window.history.replaceState({},"",location.href),window.location=n,void clearTimeout(s);o&&o.page.webpackCompilationHash!==window.___webpackCompilationHash&&("serviceWorker"in navigator&&null!==navigator.serviceWorker.controller&&"activated"===navigator.serviceWorker.controller.state&&navigator.serviceWorker.controller.postMessage({gatsbyApi:"clearPathResources"}),window.location=n+r+a),(0,i.navigate)(e,t),clearTimeout(s)}))};function k(e,{location:t}){const{pathname:n,hash:r}=t,a=(0,o.h)("shouldUpdateScroll",{prevRouterProps:e,pathname:n,routerProps:{location:t},getSavedScrollPosition:e=>[0,this._stateStorage.read(e,e.key)]});if(a.length>0)return a[a.length-1];if(e){const{location:{pathname:t}}=e;if(t===n)return r?decodeURI(r.slice(1)):[0,0]}return!0}class x extends a.Component{constructor(e){super(e),this.announcementRef=a.createRef()}componentDidUpdate(e,t){requestAnimationFrame((()=>{let e=`new page at ${this.props.location.pathname}`;document.title&&(e=document.title);const t=document.querySelectorAll("#gatsby-focus-wrapper h1");t&&t.length&&(e=t[0].textContent);const n=`Navigated to ${e}`;if(this.announcementRef.current){this.announcementRef.current.innerText!==n&&(this.announcementRef.current.innerText=n)}}))}render(){return a.createElement("div",(0,r.Z)({},m,{ref:this.announcementRef}))}}const E=(e,t)=>{var n,r;return e.href!==t.href||(null==e||null===(n=e.state)||void 0===n?void 0:n.key)!==(null==t||null===(r=t.state)||void 0===r?void 0:r.key)};class _ extends a.Component{constructor(e){super(e),b(e.location,null)}componentDidMount(){w(this.props.location,null)}shouldComponentUpdate(e){return!!E(this.props.location,e.location)&&(b(e.location,this.props.location),!0)}componentDidUpdate(e){E(e.location,this.props.location)&&w(this.props.location,e.location)}render(){return a.createElement(a.Fragment,null,this.props.children,a.createElement(x,{location:location}))}}_.propTypes={location:f().object.isRequired};var P=n(6984),C=n(4929);function R(e,t){for(var n in e)if(!(n in t))return!0;for(var r in t)if(e[r]!==t[r])return!0;return!1}class T extends a.Component{constructor(e){super();const{location:t,pageResources:n}=e;this.state={location:Object.assign({},t),pageResources:n||d.ZP.loadPageSync(t.pathname+t.search,{withErrorDetails:!0})}}static getDerivedStateFromProps({location:e},t){if(t.location.href!==e.href){return{pageResources:d.ZP.loadPageSync(e.pathname+e.search,{withErrorDetails:!0}),location:Object.assign({},e)}}return{location:Object.assign({},e)}}loadResources(e){d.ZP.loadPage(e).then((t=>{t&&t.status!==d.uQ.Error?this.setState({location:Object.assign({},window.location),pageResources:t}):(window.history.replaceState({},"",location.href),window.location=e)}))}shouldComponentUpdate(e,t){return t.pageResources?this.state.pageResources!==t.pageResources||(this.state.pageResources.component!==t.pageResources.component||(this.state.pageResources.json!==t.pageResources.json||(!(this.state.location.key===t.location.key||!t.pageResources.page||!t.pageResources.page.matchPath&&!t.pageResources.page.path)||function(e,t,n){return R(e.props,t)||R(e.state,n)}(this,e,t)))):(this.loadResources(e.location.pathname+e.location.search),!1)}render(){return this.props.children(this.state)}}var O=T,N=n(9317),L=n(4686);const j=new d.kL(C,[],window.pageData);(0,d.N1)(j),j.setApiRunner(o.h);const{render:I,hydrate:D}=(0,L.U)();window.asyncRequires=C,window.___emitter=h.Z,window.___loader=d.jN,i.globalHistory.listen((e=>{e.location.action=e.action})),window.___push=e=>S(e,{replace:!1}),window.___replace=e=>S(e,{replace:!0}),window.___navigate=(e,t)=>S(e,t);const M="gatsby-reload-compilation-hash-match";(0,o.I)("onClientEntry").then((()=>{(0,o.h)("registerServiceWorker").filter(Boolean).length>0&&n(5101);const e=e=>a.createElement(i.BaseContext.Provider,{value:{baseuri:"/",basepath:"/"}},a.createElement(P.Z,e)),t=a.createContext({}),c={renderEnvironment:"browser"};class f extends a.Component{render(){const{children:e}=this.props;return a.createElement(i.Location,null,(({location:n})=>a.createElement(O,{location:n},(({pageResources:n,location:r})=>{const o=(0,d.hs)(),i=(0,d.Nt)();return a.createElement(s.B9.Provider,{value:o},a.createElement(u.Bs.Provider,{value:c},a.createElement(u.m3.Provider,{value:i},a.createElement(u.u0.Provider,{value:n.page.slicesMap},a.createElement(t.Provider,{value:{pageResources:n,location:r}},e)))))}))))}}class p extends a.Component{render(){return a.createElement(t.Consumer,null,(({pageResources:t,location:n})=>a.createElement(_,{location:n},a.createElement(l.$C,{location:n,shouldUpdateScroll:k},a.createElement(i.Router,{basepath:"",location:n,id:"gatsby-focus-wrapper"},a.createElement(e,(0,r.Z)({path:"/404.html"===t.page.path||"/500.html"===t.page.path?(0,N.Z)(n.pathname,""):encodeURI((t.page.matchPath||t.page.path).split("?")[0])},this.props,{location:n,pageResources:t},t.json)))))))}}const{pagePath:h,location:m}=window;h&&""+h!==m.pathname+(h.includes("?")?m.search:"")&&!(j.findMatchPath((0,N.Z)(m.pathname,""))||h.match(/^\/(404|500)(\/?|.html)$/)||h.match(/^\/offline-plugin-app-shell-fallback\/?$/))&&(0,i.navigate)(""+h+(h.includes("?")?"":m.search)+m.hash,{replace:!0});const v=()=>{try{return sessionStorage}catch(e){return null}};d.jN.loadPage(m.pathname+m.search).then((e=>{var t;const n=v();if(null!=e&&null!==(t=e.page)&&void 0!==t&&t.webpackCompilationHash&&e.page.webpackCompilationHash!==window.___webpackCompilationHash&&("serviceWorker"in navigator&&null!==navigator.serviceWorker.controller&&"activated"===navigator.serviceWorker.controller.state&&navigator.serviceWorker.controller.postMessage({gatsbyApi:"clearPathResources"}),n)){if(!("1"===n.getItem(M)))return n.setItem(M,"1"),void window.location.reload(!0)}if(n&&n.removeItem(M),!e||e.status===d.uQ.Error){const t=`page resources for ${m.pathname} not found. Not rendering React`;if(e&&e.error)throw console.error(t),e.error;throw new Error(t)}const r=(0,o.h)("wrapRootElement",{element:a.createElement(p,null)},a.createElement(p,null),(({result:e})=>({element:e}))).pop(),i=function(){const e=a.useRef(!1);return a.useEffect((()=>{e.current||(e.current=!0,performance.mark&&performance.mark("onInitialClientRender"),(0,o.h)("onInitialClientRender"))}),[]),a.createElement(f,null,r)},l=document.getElementById("gatsby-focus-wrapper");let s=I;l&&l.children.length&&(s=D);const u=(0,o.h)("replaceHydrateFunction",void 0,s)[0];function c(){const e="undefined"!=typeof window?document.getElementById("___gatsby"):null;u(a.createElement(i,null),e)}const h=document;if("complete"===h.readyState||"loading"!==h.readyState&&!h.documentElement.doScroll)setTimeout((function(){c()}),0);else{const e=function(){h.removeEventListener("DOMContentLoaded",e,!1),window.removeEventListener("load",e,!1),c()};h.addEventListener("DOMContentLoaded",e,!1),window.addEventListener("load",e,!1)}}))}))},6957:function(e,t,n){"use strict";n.r(t);var r=n(959),o=n(507),a=n.n(o),i=n(677),l=n(6984);const s=({location:e})=>{const t=i.ZP.loadPageSync(e.pathname);return t?r.createElement(l.Z,Object.assign({location:e,pageResources:t},t.json)):null};s.propTypes={location:a().shape({pathname:a().string.isRequired}).isRequired},t.default=s},8710:function(e,t,n){var r;e.exports=(r=n(6957))&&r.default||r},4686:function(e,t,n){"use strict";n.d(t,{U:function(){return o}});n(6677),n(5e3);const r=new WeakMap;function o(){const e=n(4478);return{render:(t,n)=>{let o=r.get(n);o||r.set(n,o=e.createRoot(n)),o.render(t)},hydrate:(t,n)=>e.hydrateRoot(n,t)}}},3310:function(e,t,n){"use strict";n.d(t,{J:function(){return i}});n(6677),n(5e3),n(565);var r=JSON.parse('[{"fromPath":"/api/","isPermanent":true,"ignoreCase":true,"redirectInBrowser":true,"toPath":"/api/gm/"},{"fromPath":"/2018/11/23/inject-into-context/","isPermanent":true,"ignoreCase":true,"redirectInBrowser":true,"toPath":"/posts/inject-into-context/"},{"fromPath":"/2017/10/28/inject-scripts-with-blob-urls/","isPermanent":true,"ignoreCase":true,"redirectInBrowser":true,"toPath":"/posts/inject-scripts-with-blob-urls/"},{"fromPath":"/2017/04/15/smart-rules-for-blacklist/","isPermanent":true,"ignoreCase":true,"redirectInBrowser":true,"toPath":"/posts/smart-rules-for-blacklist/"},{"fromPath":"/guide/","isPermanent":true,"ignoreCase":true,"redirectInBrowser":true,"toPath":"/guide/creating-a-userscript/"},{"fromPath":"/2017/03/14/how-to-edit-scripts-with-your-favorite-editor/","isPermanent":true,"ignoreCase":true,"redirectInBrowser":true,"toPath":"/posts/how-to-edit-scripts-with-your-favorite-editor/"}]');const o=new Map,a=new Map;function i(e){let t=o.get(e);return t||(t=a.get(e.toLowerCase())),t}r.forEach((e=>{e.ignoreCase?a.set(e.fromPath,e):o.set(e.fromPath,e)}))},5101:function(e,t,n){"use strict";n.r(t);var r=n(6491);"https:"!==window.location.protocol&&"localhost"!==window.location.hostname?console.error("Service workers can only be used over HTTPS, or on localhost for development"):"serviceWorker"in navigator&&navigator.serviceWorker.register("/sw.js").then((function(e){e.addEventListener("updatefound",(()=>{(0,r.h)("onServiceWorkerUpdateFound",{serviceWorker:e});const t=e.installing;console.log("installingWorker",t),t.addEventListener("statechange",(()=>{switch(t.state){case"installed":navigator.serviceWorker.controller?(window.___swUpdated=!0,(0,r.h)("onServiceWorkerUpdateReady",{serviceWorker:e}),window.___failedResources&&(console.log("resources failed, SW updated - reloading"),window.location.reload())):(console.log("Content is now available offline!"),(0,r.h)("onServiceWorkerInstalled",{serviceWorker:e}));break;case"redundant":console.error("The installing service worker became redundant."),(0,r.h)("onServiceWorkerRedundant",{serviceWorker:e});break;case"activated":(0,r.h)("onServiceWorkerActive",{serviceWorker:e})}}))}))})).catch((function(e){console.error("Error during service worker registration:",e)}))},9475:function(e,t,n){"use strict";n.d(t,{Bs:function(){return a},Db:function(){return l},m3:function(){return o},u0:function(){return i}});var r=n(959);const o=r.createContext({}),a=r.createContext({}),i=r.createContext({}),l=r.createContext({})},7895:function(e,t,n){"use strict";n.d(t,{i1:function(){return c},B9:function(){return i},K2:function(){return f}});var r=n(959),o=n(507),a=n.n(o);n(9345);const i=(l="StaticQuery",s={},r.createServerContext?((e,t=null)=>(globalThis.__SERVER_CONTEXT||(globalThis.__SERVER_CONTEXT={}),globalThis.__SERVER_CONTEXT[e]||(globalThis.__SERVER_CONTEXT[e]=r.createServerContext(e,t)),globalThis.__SERVER_CONTEXT[e]))(l,s):r.createContext(s));var l,s;function u({staticQueryData:e,data:t,query:n,render:o}){const a=t?t.data:e[n]&&e[n].data;return r.createElement(r.Fragment,null,a&&o(a),!a&&r.createElement("div",null,"Loading (StaticQuery)"))}const c=e=>{const{data:t,query:n,render:o,children:a}=e;return r.createElement(i.Consumer,null,(e=>r.createElement(u,{data:t,query:n,render:o||a,staticQueryData:e})))};c.propTypes={data:a().object,query:a().string.isRequired,render:a().func,children:a().func};const f=e=>{var t;r.useContext;const n=r.useContext(i);if(isNaN(Number(e)))throw new Error(`useStaticQuery was called with a string but expects to be called using \`graphql\`. Try this:\n\nimport { useStaticQuery, graphql } from 'gatsby';\n\nuseStaticQuery(graphql\`${e}\`);\n`);if(null!==(t=n[e])&&void 0!==t&&t.data)return n[e].data;throw new Error("The result of this StaticQuery could not be fetched.\n\nThis is likely a bug in Gatsby and if refreshing the page does not fix it, please open an issue in https://github.com/gatsbyjs/gatsby/issues")}},9317:function(e,t,n){"use strict";function r(e,t=""){return t?e===t?"/":e.startsWith(`${t}/`)?e.slice(t.length):e:e}n.d(t,{Z:function(){return r}})},3128:function(e,t,n){"use strict";n.r(t),n.d(t,{onRouteUpdate:function(){return o}});n(3485),n(6317);var r=n(1025);function o(){const{hash:e}=window.location;let t;try{t=e&&document.querySelector(e)}catch(n){}if(t){const e=t.getBoundingClientRect(),n=document.scrollingElement;n.scrollTop=n.scrollTop+e.top-70}}n.n(r)().load({google:{families:["Roboto:400,400i,500,700"]}}),document.addEventListener("click",(e=>{var t;const{target:n}=e,r=function(e,t){var n,r,o;const a=null===(n=e.closest("[data-ga-category]"))||void 0===n?void 0:n.dataset.gaCategory,i=null===(r=e.closest("[data-ga-action]"))||void 0===r?void 0:r.dataset.gaAction,l=null===(o=e.closest("[data-ga-label]"))||void 0===o?void 0:o.dataset.gaLabel;return Object.assign({category:"global"},t,a&&{category:a},i&&{action:i},l&&{label:l})}(n,{action:"click"});var o,a;(r.category&&!r.label&&(r.label=null===(t=n.closest("a"))||void 0===t?void 0:t.textContent),r.label)&&(null===(o=(a=window).gtag)||void 0===o||o.call(a,"event","click",{category:r.category,label:r.label}));const i=n.closest("a");(null==i?void 0:i.closest("[data-ga-category=webext-beta]"))&&i.textContent.includes("Firefox")&&(e.preventDefault(),async function(){const{location:e}=window;try{const t=await fetch("https://api.github.com/repos/violentmonkey/violentmonkey/releases"),n=await t.json(),r=n.find((e=>e.prerelease)).assets.find((e=>e.name.endsWith(".xpi")));e.assign(r.browser_download_url)}catch(t){e.assign("https://github.com/violentmonkey/violentmonkey/releases")}}())}))},6041:function(e,t,n){"use strict";n.r(t),n.d(t,{onClientEntry:function(){return s}});var r=n(7133),o=(n(3485),n(8610),n(5287),n(8612),n(5474)),a=n.n(o);const i=e=>"/"===e[0]?e:`/${e}`,l=(e,t)=>n=>{if(window.___failedResources)return!0;if((e=>0!==e.button||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)(n))return!0;if((e=>e.defaultPrevented)(n))return!0;const o=(e=>{for(;e.parentNode;e=e.parentNode)if("a"===e.nodeName.toLowerCase())return e;return null})(n.target);if(null==o)return!0;if(!0===(l=o).hasAttribute("download")||!1===(e=>!1===e.hasAttribute("target")||null==e.target||["_self",""].includes(e.target)||"_parent"===e.target&&(!e.ownerDocument.defaultView.parent||e.ownerDocument.defaultView.parent===e.ownerDocument.defaultView)||"_top"===e.target&&(!e.ownerDocument.defaultView.top||e.ownerDocument.defaultView.top===e.ownerDocument.defaultView))(l))return!0;var l;const s=document.createElement("a");""!==o.href&&(s.href=o.href),"SVGAnimatedString"in window&&o.href instanceof SVGAnimatedString&&(s.href=o.href.animVal);const u=document.createElement("a");if(u.href=window.location.href,!1===((e,t)=>e.protocol===t.protocol&&e.host===t.host)(u,s))return!0;const c=new RegExp(`^${a()((0,r.withPrefix)("/"))}`);if(((e,t)=>!1===t.test(i(e.pathname))||-1!==e.pathname.search(/^.*\.((?!htm)[a-z0-9]{1,5})$/i))(s,c))return!0;if(((e,t)=>""!==t.hash&&(""===t.pathname||t.pathname===e.pathname))(u,s))return!0;if(t.excludePattern){if(new RegExp(t.excludePattern).test(s.pathname))return!0}n.preventDefault();const f=i(s.pathname).replace(c,"/");return e(`${f}${s.search}${s.hash}`),!1};const s=(e,t={})=>{!function(e,t,n){const r=l(n,t);e.addEventListener("click",r)}(window,t,(e=>{(0,r.navigate)(e)}))}},1003:function(e,t,n){"use strict";n(8610),t.onRouteUpdate=function(e,t){var n=e.location;if(void 0===t&&(t={}),"function"!=typeof gtag)return null;var r=t.pluginConfig||{};if(n&&void 0!==window.excludeGtagPaths&&window.excludeGtagPaths.some((function(e){return e.test(n.pathname)})))return null;var o=function(){var e=n?n.pathname+n.search+n.hash:void 0;window.gtag("event","page_view",{page_path:e})},a=r.delayOnRouteUpdate,i=void 0===a?0:a;return"requestAnimationFrame"in window?requestAnimationFrame((function(){requestAnimationFrame((function(){return setTimeout(o,i)}))})):setTimeout(o,32+i),null}},7510:function(e,t,n){"use strict";n.r(t),n.d(t,{onRouteUpdate:function(){return r}});n(7133),n(6528);const r=function({location:e},t){0}},6528:function(e,t,n){"use strict";var r=n(7133)},4647:function(e,t,n){"use strict";n(8610),n(565),n(8612),t.registerServiceWorker=function(){return"true"!=={}.GATSBY_IS_PREVIEW};var r=/^(stylesheet|preload)$/,o=[];function a(e,t){if(!window.___swUpdated&&"serviceWorker"in navigator){var n=navigator.serviceWorker;if(null===n.controller)o.push(e);else{var r=t(e);n.controller.postMessage({gatsbyApi:"setPathResources",path:e,resources:r})}}}t.onServiceWorkerActive=function(e){var t=e.getResourceURLsForPathname,n=e.serviceWorker;if("true"!=={}.GATSBY_IS_PREVIEW)if(window.___swUpdated)n.active.postMessage({gatsbyApi:"clearPathResources"});else{var a=document.querySelectorAll("\n head > script[src],\n head > link[href],\n head > style[data-href]\n "),i=[].slice.call(a).filter((function(e){return"LINK"!==e.tagName||r.test(e.getAttribute("rel"))})).map((function(e){return e.src||e.href||e.getAttribute("data-href")})),l=[];o.forEach((function(e){var r=t(e);l.push.apply(l,r),n.active.postMessage({gatsbyApi:"setPathResources",path:e,resources:r})})),[].concat(i,l).forEach((function(e){var t=document.createElement("link");t.rel="prefetch",t.href=e,t.onload=t.remove,t.onerror=t.remove,document.head.appendChild(t)}))}},t.onRouteUpdate=function(e){var t=e.location,n=e.getResourceURLsForPathname;a(t.pathname.replace("",""),n),"serviceWorker"in navigator&&null!==navigator.serviceWorker.controller&&navigator.serviceWorker.controller.postMessage({gatsbyApi:"enableOfflineShell"})},t.onPostPrefetchPathname=function(e){a(e.pathname,e.getResourceURLsForPathname)}},3005:function(e,t,n){"use strict";n(8610),n(8612);var r=0,o=function(e){var t=window.decodeURI(e.replace("#",""));if(""!==t){var n=document.getElementById(t);if(n){var o=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop,a=document.documentElement.clientTop||document.body.clientTop||0,i=window.getComputedStyle(n),l=i.getPropertyValue("scroll-margin-top")||i.getPropertyValue("scroll-snap-margin-top")||"0px";return n.getBoundingClientRect().top+o-parseInt(l,10)-a-r}}return null};t.onInitialClientRender=function(e,t){t.offsetY&&(r=t.offsetY),requestAnimationFrame((function(){var e=o(window.location.hash);null!==e&&window.scrollTo(0,e)}))},t.shouldUpdateScroll=function(e){var t=e.routerProps.location,n=o(t.hash);return null===n||[0,n]}},3226:function(e,t){"use strict";t.DEFAULT_OPTIONS={maxWidth:650,wrapperStyle:"",backgroundColor:"white",linkImagesToOriginal:!0,showCaptions:!1,markdownCaptions:!1,withWebp:!1,withAvif:!1,tracedSVG:!1,loading:"lazy",decoding:"async",disableBgImageOnAlpha:!1,disableBgImage:!1},t.EMPTY_ALT="GATSBY_EMPTY_ALT",t.imageClass="gatsby-resp-image-image",t.imageWrapperClass="gatsby-resp-image-wrapper",t.imageBackgroundClass="gatsby-resp-image-background-image"},4774:function(e,t,n){"use strict";var r=n(3226),o=r.DEFAULT_OPTIONS,a=r.imageClass,i=r.imageBackgroundClass,l=r.imageWrapperClass;t.onRouteUpdate=function(e,t){for(var n=Object.assign({},o,t),r=document.querySelectorAll("."+l),s=function(){var e=r[u],t=e.querySelector("."+i),o=e.querySelector("."+a),l=function(){t.style.transition="opacity 0.5s 0.5s",o.style.transition="opacity 0.5s",s()},s=function e(){t.style.opacity=0,o.style.opacity=1,o.style.color="inherit",o.style.boxShadow="inset 0px 0px 0px 400px "+n.backgroundColor,o.removeEventListener("load",l),o.removeEventListener("error",e)};o.style.opacity=0,o.addEventListener("load",l),o.addEventListener("error",s),o.complete&&s()},u=0;ub)', 'g') -> /(?b)/g and it causes SyntaxError\nvar $RegExp = global.RegExp;\n\nmodule.exports = fails(function () {\n var re = $RegExp('(?b)', 'g');\n return re.exec('b').groups.a !== 'b' ||\n 'b'.replace(re, '$c') !== 'bc';\n});\n","'use strict';\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\n\nvar $TypeError = TypeError;\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (isNullOrUndefined(it)) throw $TypeError(\"Can't call method on \" + it);\n return it;\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n\n if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {\n defineBuiltInAccessor(Constructor, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n }\n};\n","'use strict';\nvar defineProperty = require('../internals/object-define-property').f;\nvar hasOwn = require('../internals/has-own-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (target, TAG, STATIC) {\n if (target && !STATIC) target = target.prototype;\n if (target && !hasOwn(target, TO_STRING_TAG)) {\n defineProperty(target, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n","'use strict';\nvar shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","'use strict';\nvar global = require('../internals/global');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || defineGlobalProperty(SHARED, {});\n\nmodule.exports = store;\n","'use strict';\nvar IS_PURE = require('../internals/is-pure');\nvar store = require('../internals/shared-store');\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.32.1',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2014-2023 Denis Pushkarev (zloirock.ru)',\n license: 'https://github.com/zloirock/core-js/blob/v3.32.1/LICENSE',\n source: 'https://github.com/zloirock/core-js'\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar aConstructor = require('../internals/a-constructor');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.es/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || isNullOrUndefined(S = anObject(C)[SPECIES]) ? defaultConstructor : aConstructor(S);\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toString = require('../internals/to-string');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar charAt = uncurryThis(''.charAt);\nvar charCodeAt = uncurryThis(''.charCodeAt);\nvar stringSlice = uncurryThis(''.slice);\n\nvar createMethod = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = toString(requireObjectCoercible($this));\n var position = toIntegerOrInfinity(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = charCodeAt(S, position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = charCodeAt(S, position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING\n ? charAt(S, position)\n : first\n : CONVERT_TO_STRING\n ? stringSlice(S, position, position + 2)\n : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nmodule.exports = {\n // `String.prototype.codePointAt` method\n // https://tc39.es/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod(true)\n};\n","'use strict';\n// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nvar maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\nvar base = 36;\nvar tMin = 1;\nvar tMax = 26;\nvar skew = 38;\nvar damp = 700;\nvar initialBias = 72;\nvar initialN = 128; // 0x80\nvar delimiter = '-'; // '\\x2D'\nvar regexNonASCII = /[^\\0-\\u007E]/; // non-ASCII chars\nvar regexSeparators = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\nvar OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';\nvar baseMinusTMin = base - tMin;\n\nvar $RangeError = RangeError;\nvar exec = uncurryThis(regexSeparators.exec);\nvar floor = Math.floor;\nvar fromCharCode = String.fromCharCode;\nvar charCodeAt = uncurryThis(''.charCodeAt);\nvar join = uncurryThis([].join);\nvar push = uncurryThis([].push);\nvar replace = uncurryThis(''.replace);\nvar split = uncurryThis(''.split);\nvar toLowerCase = uncurryThis(''.toLowerCase);\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n */\nvar ucs2decode = function (string) {\n var output = [];\n var counter = 0;\n var length = string.length;\n while (counter < length) {\n var value = charCodeAt(string, counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n // It's a high surrogate, and there is a next character.\n var extra = charCodeAt(string, counter++);\n if ((extra & 0xFC00) === 0xDC00) { // Low surrogate.\n push(output, ((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n push(output, value);\n counter--;\n }\n } else {\n push(output, value);\n }\n }\n return output;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n */\nvar digitToBasic = function (digit) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n */\nvar adapt = function (delta, numPoints, firstTime) {\n var k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n while (delta > baseMinusTMin * tMax >> 1) {\n delta = floor(delta / baseMinusTMin);\n k += base;\n }\n return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n */\nvar encode = function (input) {\n var output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n var inputLength = input.length;\n\n // Initialize the state.\n var n = initialN;\n var delta = 0;\n var bias = initialBias;\n var i, currentValue;\n\n // Handle the basic code points.\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < 0x80) {\n push(output, fromCharCode(currentValue));\n }\n }\n\n var basicLength = output.length; // number of basic code points.\n var handledCPCount = basicLength; // number of code points that have been handled;\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n push(output, delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next larger one:\n var m = maxInt;\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's state to , but guard against overflow.\n var handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n throw $RangeError(OVERFLOW_ERROR);\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < n && ++delta > maxInt) {\n throw $RangeError(OVERFLOW_ERROR);\n }\n if (currentValue === n) {\n // Represent delta as a generalized variable-length integer.\n var q = delta;\n var k = base;\n while (true) {\n var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n if (q < t) break;\n var qMinusT = q - t;\n var baseMinusT = base - t;\n push(output, fromCharCode(digitToBasic(t + qMinusT % baseMinusT)));\n q = floor(qMinusT / baseMinusT);\n k += base;\n }\n\n push(output, fromCharCode(digitToBasic(q)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount === basicLength);\n delta = 0;\n handledCPCount++;\n }\n }\n\n delta++;\n n++;\n }\n return join(output, '');\n};\n\nmodule.exports = function (input) {\n var encoded = [];\n var labels = split(replace(toLowerCase(input), regexSeparators, '\\u002E'), '.');\n var i, label;\n for (i = 0; i < labels.length; i++) {\n label = labels[i];\n push(encoded, exec(regexNonASCII, label) ? 'xn--' + encode(label) : label);\n }\n return join(encoded, '.');\n};\n","'use strict';\nvar PROPER_FUNCTION_NAME = require('../internals/function-name').PROPER;\nvar fails = require('../internals/fails');\nvar whitespaces = require('../internals/whitespaces');\n\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nmodule.exports = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]()\n || non[METHOD_NAME]() !== non\n || (PROPER_FUNCTION_NAME && whitespaces[METHOD_NAME].name !== METHOD_NAME);\n });\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar toString = require('../internals/to-string');\nvar whitespaces = require('../internals/whitespaces');\n\nvar replace = uncurryThis(''.replace);\nvar ltrim = RegExp('^[' + whitespaces + ']+');\nvar rtrim = RegExp('(^|[^' + whitespaces + '])[' + whitespaces + ']+$');\n\n// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\nvar createMethod = function (TYPE) {\n return function ($this) {\n var string = toString(requireObjectCoercible($this));\n if (TYPE & 1) string = replace(string, ltrim, '');\n if (TYPE & 2) string = replace(string, rtrim, '$1');\n return string;\n };\n};\n\nmodule.exports = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.es/ecma262/#sec-string.prototype.trimstart\n start: createMethod(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.es/ecma262/#sec-string.prototype.trimend\n end: createMethod(2),\n // `String.prototype.trim` method\n // https://tc39.es/ecma262/#sec-string.prototype.trim\n trim: createMethod(3)\n};\n","'use strict';\n/* eslint-disable es/no-symbol -- required for testing */\nvar V8_VERSION = require('../internals/engine-v8-version');\nvar fails = require('../internals/fails');\nvar global = require('../internals/global');\n\nvar $String = global.String;\n\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n var symbol = Symbol('symbol detection');\n // Chrome 38 Symbol has incorrect toString conversion\n // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances\n // nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will,\n // of course, fail.\n return !$String(symbol) || !(Object(symbol) instanceof Symbol) ||\n // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances\n !Symbol.sham && V8_VERSION && V8_VERSION < 41;\n});\n","'use strict';\nvar global = require('../internals/global');\nvar apply = require('../internals/function-apply');\nvar bind = require('../internals/function-bind-context');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar fails = require('../internals/fails');\nvar html = require('../internals/html');\nvar arraySlice = require('../internals/array-slice');\nvar createElement = require('../internals/document-create-element');\nvar validateArgumentsLength = require('../internals/validate-arguments-length');\nvar IS_IOS = require('../internals/engine-is-ios');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar set = global.setImmediate;\nvar clear = global.clearImmediate;\nvar process = global.process;\nvar Dispatch = global.Dispatch;\nvar Function = global.Function;\nvar MessageChannel = global.MessageChannel;\nvar String = global.String;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar $location, defer, channel, port;\n\nfails(function () {\n // Deno throws a ReferenceError on `location` access without `--location` flag\n $location = global.location;\n});\n\nvar run = function (id) {\n if (hasOwn(queue, id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\n\nvar runner = function (id) {\n return function () {\n run(id);\n };\n};\n\nvar eventListener = function (event) {\n run(event.data);\n};\n\nvar globalPostMessageDefer = function (id) {\n // old engines have not location.origin\n global.postMessage(String(id), $location.protocol + '//' + $location.host);\n};\n\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!set || !clear) {\n set = function setImmediate(handler) {\n validateArgumentsLength(arguments.length, 1);\n var fn = isCallable(handler) ? handler : Function(handler);\n var args = arraySlice(arguments, 1);\n queue[++counter] = function () {\n apply(fn, undefined, args);\n };\n defer(counter);\n return counter;\n };\n clear = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (IS_NODE) {\n defer = function (id) {\n process.nextTick(runner(id));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(runner(id));\n };\n // Browsers with MessageChannel, includes WebWorkers\n // except iOS - https://github.com/zloirock/core-js/issues/624\n } else if (MessageChannel && !IS_IOS) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = eventListener;\n defer = bind(port.postMessage, port);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (\n global.addEventListener &&\n isCallable(global.postMessage) &&\n !global.importScripts &&\n $location && $location.protocol !== 'file:' &&\n !fails(globalPostMessageDefer)\n ) {\n defer = globalPostMessageDefer;\n global.addEventListener('message', eventListener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in createElement('script')) {\n defer = function (id) {\n html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(runner(id), 0);\n };\n }\n}\n\nmodule.exports = {\n set: set,\n clear: clear\n};\n","'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toIntegerOrInfinity(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","'use strict';\n// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","'use strict';\nvar trunc = require('../internals/math-trunc');\n\n// `ToIntegerOrInfinity` abstract operation\n// https://tc39.es/ecma262/#sec-tointegerorinfinity\nmodule.exports = function (argument) {\n var number = +argument;\n // eslint-disable-next-line no-self-compare -- NaN check\n return number !== number || number === 0 ? 0 : trunc(number);\n};\n","'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toIntegerOrInfinity(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","'use strict';\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar $Object = Object;\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return $Object(requireObjectCoercible(argument));\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar isObject = require('../internals/is-object');\nvar isSymbol = require('../internals/is-symbol');\nvar getMethod = require('../internals/get-method');\nvar ordinaryToPrimitive = require('../internals/ordinary-to-primitive');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $TypeError = TypeError;\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\nmodule.exports = function (input, pref) {\n if (!isObject(input) || isSymbol(input)) return input;\n var exoticToPrim = getMethod(input, TO_PRIMITIVE);\n var result;\n if (exoticToPrim) {\n if (pref === undefined) pref = 'default';\n result = call(exoticToPrim, input, pref);\n if (!isObject(result) || isSymbol(result)) return result;\n throw $TypeError(\"Can't convert object to primitive value\");\n }\n if (pref === undefined) pref = 'number';\n return ordinaryToPrimitive(input, pref);\n};\n","'use strict';\nvar toPrimitive = require('../internals/to-primitive');\nvar isSymbol = require('../internals/is-symbol');\n\n// `ToPropertyKey` abstract operation\n// https://tc39.es/ecma262/#sec-topropertykey\nmodule.exports = function (argument) {\n var key = toPrimitive(argument, 'string');\n return isSymbol(key) ? key : key + '';\n};\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","'use strict';\nvar classof = require('../internals/classof');\n\nvar $String = String;\n\nmodule.exports = function (argument) {\n if (classof(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string');\n return $String(argument);\n};\n","'use strict';\nvar $String = String;\n\nmodule.exports = function (argument) {\n try {\n return $String(argument);\n } catch (error) {\n return 'Object';\n }\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nvar id = 0;\nvar postfix = Math.random();\nvar toString = uncurryThis(1.0.toString);\n\nmodule.exports = function (key) {\n return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36);\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = !fails(function () {\n // eslint-disable-next-line unicorn/relative-url-style -- required for testing\n var url = new URL('b?a=1&b=2&c=3', 'http://a');\n var params = url.searchParams;\n var params2 = new URLSearchParams('a=1&a=2&b=3');\n var result = '';\n url.pathname = 'c%20d';\n params.forEach(function (value, key) {\n params['delete']('b');\n result += key + value;\n });\n params2['delete']('a', 2);\n // `undefined` case is a Chromium 117 bug\n // https://bugs.chromium.org/p/v8/issues/detail?id=14222\n params2['delete']('b', undefined);\n return (IS_PURE && (!url.toJSON || !params2.has('a', 1) || params2.has('a', 2) || !params2.has('a', undefined) || params2.has('b')))\n || (!params.size && (IS_PURE || !DESCRIPTORS))\n || !params.sort\n || url.href !== 'http://a/c%20d?a=1&c=3'\n || params.get('c') !== '3'\n || String(new URLSearchParams('?a=1')) !== 'a=1'\n || !params[ITERATOR]\n // throws in Edge\n || new URL('https://a@b').username !== 'a'\n || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n // not punycoded in Edge\n || new URL('http://тест').host !== 'xn--e1aybc'\n // not escaped in Chrome 62-\n || new URL('http://a#б').hash !== '#%D0%B1'\n // fails in Chrome 66-\n || result !== 'a1c3'\n // throws in Safari\n || new URL('http://x', undefined).host !== 'x';\n});\n","'use strict';\n/* eslint-disable es/no-symbol -- required for testing */\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\n\nmodule.exports = NATIVE_SYMBOL\n && !Symbol.sham\n && typeof Symbol.iterator == 'symbol';\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\n\n// V8 ~ Chrome 36-\n// https://bugs.chromium.org/p/v8/issues/detail?id=3334\nmodule.exports = DESCRIPTORS && fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(function () { /* empty */ }, 'prototype', {\n value: 42,\n writable: false\n }).prototype !== 42;\n});\n","'use strict';\nvar $TypeError = TypeError;\n\nmodule.exports = function (passed, required) {\n if (passed < required) throw $TypeError('Not enough arguments');\n return passed;\n};\n","'use strict';\nvar global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap));\n","'use strict';\nvar global = require('../internals/global');\nvar shared = require('../internals/shared');\nvar hasOwn = require('../internals/has-own-property');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar Symbol = global.Symbol;\nvar WellKnownSymbolsStore = shared('wks');\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!hasOwn(WellKnownSymbolsStore, name)) {\n WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name)\n ? Symbol[name]\n : createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n","'use strict';\n// a string of all valid unicode whitespaces\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002' +\n '\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","'use strict';\nvar $ = require('../internals/export');\nvar flattenIntoArray = require('../internals/flatten-into-array');\nvar aCallable = require('../internals/a-callable');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\n// `Array.prototype.flatMap` method\n// https://tc39.es/ecma262/#sec-array.prototype.flatmap\n$({ target: 'Array', proto: true }, {\n flatMap: function flatMap(callbackfn /* , thisArg */) {\n var O = toObject(this);\n var sourceLen = lengthOfArrayLike(O);\n var A;\n aCallable(callbackfn);\n A = arraySpeciesCreate(O, 0);\n A.length = flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n return A;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $includes = require('../internals/array-includes').includes;\nvar fails = require('../internals/fails');\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\n// FF99+ bug\nvar BROKEN_ON_SPARSE = fails(function () {\n // eslint-disable-next-line es/no-array-prototype-includes -- detection\n return !Array(1).includes();\n});\n\n// `Array.prototype.includes` method\n// https://tc39.es/ecma262/#sec-array.prototype.includes\n$({ target: 'Array', proto: true, forced: BROKEN_ON_SPARSE }, {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('includes');\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar Iterators = require('../internals/iterators');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineProperty = require('../internals/object-define-property').f;\nvar defineIterator = require('../internals/iterator-define');\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar IS_PURE = require('../internals/is-pure');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.es/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.es/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.es/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.es/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n var state = getInternalState(this);\n var target = state.target;\n var kind = state.kind;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = undefined;\n return createIterResultObject(undefined, true);\n }\n switch (kind) {\n case 'keys': return createIterResultObject(index, false);\n case 'values': return createIterResultObject(target[index], false);\n } return createIterResultObject([index, target[index]], false);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.es/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.es/ecma262/#sec-createmappedargumentsobject\nvar values = Iterators.Arguments = Iterators.Array;\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n// V8 ~ Chrome 45- bug\nif (!IS_PURE && DESCRIPTORS && values.name !== 'values') try {\n defineProperty(values, 'name', { value: 'values' });\n} catch (error) { /* empty */ }\n","'use strict';\nvar $ = require('../internals/export');\nvar $reduce = require('../internals/array-reduce').left;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar CHROME_VERSION = require('../internals/engine-v8-version');\nvar IS_NODE = require('../internals/engine-is-node');\n\n// Chrome 80-82 has a critical bug\n// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982\nvar CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;\nvar FORCED = CHROME_BUG || !arrayMethodIsStrict('reduce');\n\n// `Array.prototype.reduce` method\n// https://tc39.es/ecma262/#sec-array.prototype.reduce\n$({ target: 'Array', proto: true, forced: FORCED }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n var length = arguments.length;\n return $reduce(this, callbackfn, length, length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar aCallable = require('../internals/a-callable');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar deletePropertyOrThrow = require('../internals/delete-property-or-throw');\nvar toString = require('../internals/to-string');\nvar fails = require('../internals/fails');\nvar internalSort = require('../internals/array-sort');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar FF = require('../internals/engine-ff-version');\nvar IE_OR_EDGE = require('../internals/engine-is-ie-or-edge');\nvar V8 = require('../internals/engine-v8-version');\nvar WEBKIT = require('../internals/engine-webkit-version');\n\nvar test = [];\nvar nativeSort = uncurryThis(test.sort);\nvar push = uncurryThis(test.push);\n\n// IE8-\nvar FAILS_ON_UNDEFINED = fails(function () {\n test.sort(undefined);\n});\n// V8 bug\nvar FAILS_ON_NULL = fails(function () {\n test.sort(null);\n});\n// Old WebKit\nvar STRICT_METHOD = arrayMethodIsStrict('sort');\n\nvar STABLE_SORT = !fails(function () {\n // feature detection can be too slow, so check engines versions\n if (V8) return V8 < 70;\n if (FF && FF > 3) return;\n if (IE_OR_EDGE) return true;\n if (WEBKIT) return WEBKIT < 603;\n\n var result = '';\n var code, chr, value, index;\n\n // generate an array with more 512 elements (Chakra and old V8 fails only in this case)\n for (code = 65; code < 76; code++) {\n chr = String.fromCharCode(code);\n\n switch (code) {\n case 66: case 69: case 70: case 72: value = 3; break;\n case 68: case 71: value = 4; break;\n default: value = 2;\n }\n\n for (index = 0; index < 47; index++) {\n test.push({ k: chr + index, v: value });\n }\n }\n\n test.sort(function (a, b) { return b.v - a.v; });\n\n for (index = 0; index < test.length; index++) {\n chr = test[index].k.charAt(0);\n if (result.charAt(result.length - 1) !== chr) result += chr;\n }\n\n return result !== 'DGBEFHACIJK';\n});\n\nvar FORCED = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || !STRICT_METHOD || !STABLE_SORT;\n\nvar getSortCompare = function (comparefn) {\n return function (x, y) {\n if (y === undefined) return -1;\n if (x === undefined) return 1;\n if (comparefn !== undefined) return +comparefn(x, y) || 0;\n return toString(x) > toString(y) ? 1 : -1;\n };\n};\n\n// `Array.prototype.sort` method\n// https://tc39.es/ecma262/#sec-array.prototype.sort\n$({ target: 'Array', proto: true, forced: FORCED }, {\n sort: function sort(comparefn) {\n if (comparefn !== undefined) aCallable(comparefn);\n\n var array = toObject(this);\n\n if (STABLE_SORT) return comparefn === undefined ? nativeSort(array) : nativeSort(array, comparefn);\n\n var items = [];\n var arrayLength = lengthOfArrayLike(array);\n var itemsLength, index;\n\n for (index = 0; index < arrayLength; index++) {\n if (index in array) push(items, array[index]);\n }\n\n internalSort(items, getSortCompare(comparefn));\n\n itemsLength = lengthOfArrayLike(items);\n index = 0;\n\n while (index < itemsLength) array[index] = items[index++];\n while (index < arrayLength) deletePropertyOrThrow(array, index++);\n\n return array;\n }\n});\n","'use strict';\n// this method was added to unscopables after implementation\n// in popular engines, so it's moved to a separate module\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('flatMap');\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\n\n// `globalThis` object\n// https://tc39.es/ecma262/#sec-globalthis\n$({ global: true, forced: global.globalThis !== global }, {\n globalThis: global\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar iterate = require('../internals/iterate');\nvar PROMISE_STATICS_INCORRECT_ITERATION = require('../internals/promise-statics-incorrect-iteration');\n\n// `Promise.all` method\n// https://tc39.es/ecma262/#sec-promise.all\n$({ target: 'Promise', stat: true, forced: PROMISE_STATICS_INCORRECT_ITERATION }, {\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapabilityModule.f(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aCallable(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n remaining++;\n call($promiseResolve, C, promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar FORCED_PROMISE_CONSTRUCTOR = require('../internals/promise-constructor-detection').CONSTRUCTOR;\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar defineBuiltIn = require('../internals/define-built-in');\n\nvar NativePromisePrototype = NativePromiseConstructor && NativePromiseConstructor.prototype;\n\n// `Promise.prototype.catch` method\n// https://tc39.es/ecma262/#sec-promise.prototype.catch\n$({ target: 'Promise', proto: true, forced: FORCED_PROMISE_CONSTRUCTOR, real: true }, {\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n});\n\n// makes sure that native promise-based APIs `Promise#catch` properly works with patched `Promise#then`\nif (!IS_PURE && isCallable(NativePromiseConstructor)) {\n var method = getBuiltIn('Promise').prototype['catch'];\n if (NativePromisePrototype['catch'] !== method) {\n defineBuiltIn(NativePromisePrototype, 'catch', method, { unsafe: true });\n }\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar IS_NODE = require('../internals/engine-is-node');\nvar global = require('../internals/global');\nvar call = require('../internals/function-call');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar setSpecies = require('../internals/set-species');\nvar aCallable = require('../internals/a-callable');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar anInstance = require('../internals/an-instance');\nvar speciesConstructor = require('../internals/species-constructor');\nvar task = require('../internals/task').set;\nvar microtask = require('../internals/microtask');\nvar hostReportErrors = require('../internals/host-report-errors');\nvar perform = require('../internals/perform');\nvar Queue = require('../internals/queue');\nvar InternalStateModule = require('../internals/internal-state');\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar PromiseConstructorDetection = require('../internals/promise-constructor-detection');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\n\nvar PROMISE = 'Promise';\nvar FORCED_PROMISE_CONSTRUCTOR = PromiseConstructorDetection.CONSTRUCTOR;\nvar NATIVE_PROMISE_REJECTION_EVENT = PromiseConstructorDetection.REJECTION_EVENT;\nvar NATIVE_PROMISE_SUBCLASSING = PromiseConstructorDetection.SUBCLASSING;\nvar getInternalPromiseState = InternalStateModule.getterFor(PROMISE);\nvar setInternalState = InternalStateModule.set;\nvar NativePromisePrototype = NativePromiseConstructor && NativePromiseConstructor.prototype;\nvar PromiseConstructor = NativePromiseConstructor;\nvar PromisePrototype = NativePromisePrototype;\nvar TypeError = global.TypeError;\nvar document = global.document;\nvar process = global.process;\nvar newPromiseCapability = newPromiseCapabilityModule.f;\nvar newGenericPromiseCapability = newPromiseCapability;\n\nvar DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent);\nvar UNHANDLED_REJECTION = 'unhandledrejection';\nvar REJECTION_HANDLED = 'rejectionhandled';\nvar PENDING = 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\nvar HANDLED = 1;\nvar UNHANDLED = 2;\n\nvar Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && isCallable(then = it.then) ? then : false;\n};\n\nvar callReaction = function (reaction, state) {\n var value = state.value;\n var ok = state.state === FULFILLED;\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (state.rejection === UNHANDLED) onHandleUnhandled(state);\n state.rejection = HANDLED;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // can throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n call(then, result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (error) {\n if (domain && !exited) domain.exit();\n reject(error);\n }\n};\n\nvar notify = function (state, isReject) {\n if (state.notified) return;\n state.notified = true;\n microtask(function () {\n var reactions = state.reactions;\n var reaction;\n while (reaction = reactions.get()) {\n callReaction(reaction, state);\n }\n state.notified = false;\n if (isReject && !state.rejection) onUnhandled(state);\n });\n};\n\nvar dispatchEvent = function (name, promise, reason) {\n var event, handler;\n if (DISPATCH_EVENT) {\n event = document.createEvent('Event');\n event.promise = promise;\n event.reason = reason;\n event.initEvent(name, false, true);\n global.dispatchEvent(event);\n } else event = { promise: promise, reason: reason };\n if (!NATIVE_PROMISE_REJECTION_EVENT && (handler = global['on' + name])) handler(event);\n else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n};\n\nvar onUnhandled = function (state) {\n call(task, global, function () {\n var promise = state.facade;\n var value = state.value;\n var IS_UNHANDLED = isUnhandled(state);\n var result;\n if (IS_UNHANDLED) {\n result = perform(function () {\n if (IS_NODE) {\n process.emit('unhandledRejection', value, promise);\n } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED;\n if (result.error) throw result.value;\n }\n });\n};\n\nvar isUnhandled = function (state) {\n return state.rejection !== HANDLED && !state.parent;\n};\n\nvar onHandleUnhandled = function (state) {\n call(task, global, function () {\n var promise = state.facade;\n if (IS_NODE) {\n process.emit('rejectionHandled', promise);\n } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n });\n};\n\nvar bind = function (fn, state, unwrap) {\n return function (value) {\n fn(state, value, unwrap);\n };\n};\n\nvar internalReject = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n state.value = value;\n state.state = REJECTED;\n notify(state, true);\n};\n\nvar internalResolve = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n try {\n if (state.facade === value) throw TypeError(\"Promise can't be resolved itself\");\n var then = isThenable(value);\n if (then) {\n microtask(function () {\n var wrapper = { done: false };\n try {\n call(then, value,\n bind(internalResolve, wrapper, state),\n bind(internalReject, wrapper, state)\n );\n } catch (error) {\n internalReject(wrapper, error, state);\n }\n });\n } else {\n state.value = value;\n state.state = FULFILLED;\n notify(state, false);\n }\n } catch (error) {\n internalReject({ done: false }, error, state);\n }\n};\n\n// constructor polyfill\nif (FORCED_PROMISE_CONSTRUCTOR) {\n // 25.4.3.1 Promise(executor)\n PromiseConstructor = function Promise(executor) {\n anInstance(this, PromisePrototype);\n aCallable(executor);\n call(Internal, this);\n var state = getInternalPromiseState(this);\n try {\n executor(bind(internalResolve, state), bind(internalReject, state));\n } catch (error) {\n internalReject(state, error);\n }\n };\n\n PromisePrototype = PromiseConstructor.prototype;\n\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n Internal = function Promise(executor) {\n setInternalState(this, {\n type: PROMISE,\n done: false,\n notified: false,\n parent: false,\n reactions: new Queue(),\n rejection: false,\n state: PENDING,\n value: undefined\n });\n };\n\n // `Promise.prototype.then` method\n // https://tc39.es/ecma262/#sec-promise.prototype.then\n Internal.prototype = defineBuiltIn(PromisePrototype, 'then', function then(onFulfilled, onRejected) {\n var state = getInternalPromiseState(this);\n var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));\n state.parent = true;\n reaction.ok = isCallable(onFulfilled) ? onFulfilled : true;\n reaction.fail = isCallable(onRejected) && onRejected;\n reaction.domain = IS_NODE ? process.domain : undefined;\n if (state.state === PENDING) state.reactions.add(reaction);\n else microtask(function () {\n callReaction(reaction, state);\n });\n return reaction.promise;\n });\n\n OwnPromiseCapability = function () {\n var promise = new Internal();\n var state = getInternalPromiseState(promise);\n this.promise = promise;\n this.resolve = bind(internalResolve, state);\n this.reject = bind(internalReject, state);\n };\n\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === PromiseConstructor || C === PromiseWrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n\n if (!IS_PURE && isCallable(NativePromiseConstructor) && NativePromisePrototype !== Object.prototype) {\n nativeThen = NativePromisePrototype.then;\n\n if (!NATIVE_PROMISE_SUBCLASSING) {\n // make `Promise#then` return a polyfilled `Promise` for native promise-based APIs\n defineBuiltIn(NativePromisePrototype, 'then', function then(onFulfilled, onRejected) {\n var that = this;\n return new PromiseConstructor(function (resolve, reject) {\n call(nativeThen, that, resolve, reject);\n }).then(onFulfilled, onRejected);\n // https://github.com/zloirock/core-js/issues/640\n }, { unsafe: true });\n }\n\n // make `.constructor === Promise` work for native promise-based APIs\n try {\n delete NativePromisePrototype.constructor;\n } catch (error) { /* empty */ }\n\n // make `instanceof Promise` work for native promise-based APIs\n if (setPrototypeOf) {\n setPrototypeOf(NativePromisePrototype, PromisePrototype);\n }\n }\n}\n\n$({ global: true, constructor: true, wrap: true, forced: FORCED_PROMISE_CONSTRUCTOR }, {\n Promise: PromiseConstructor\n});\n\nsetToStringTag(PromiseConstructor, PROMISE, false, true);\nsetSpecies(PROMISE);\n","'use strict';\n// TODO: Remove this module from `core-js@4` since it's split to modules listed below\nrequire('../modules/es.promise.constructor');\nrequire('../modules/es.promise.all');\nrequire('../modules/es.promise.catch');\nrequire('../modules/es.promise.race');\nrequire('../modules/es.promise.reject');\nrequire('../modules/es.promise.resolve');\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar iterate = require('../internals/iterate');\nvar PROMISE_STATICS_INCORRECT_ITERATION = require('../internals/promise-statics-incorrect-iteration');\n\n// `Promise.race` method\n// https://tc39.es/ecma262/#sec-promise.race\n$({ target: 'Promise', stat: true, forced: PROMISE_STATICS_INCORRECT_ITERATION }, {\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapabilityModule.f(C);\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aCallable(C.resolve);\n iterate(iterable, function (promise) {\n call($promiseResolve, C, promise).then(capability.resolve, reject);\n });\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar FORCED_PROMISE_CONSTRUCTOR = require('../internals/promise-constructor-detection').CONSTRUCTOR;\n\n// `Promise.reject` method\n// https://tc39.es/ecma262/#sec-promise.reject\n$({ target: 'Promise', stat: true, forced: FORCED_PROMISE_CONSTRUCTOR }, {\n reject: function reject(r) {\n var capability = newPromiseCapabilityModule.f(this);\n call(capability.reject, undefined, r);\n return capability.promise;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar IS_PURE = require('../internals/is-pure');\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar FORCED_PROMISE_CONSTRUCTOR = require('../internals/promise-constructor-detection').CONSTRUCTOR;\nvar promiseResolve = require('../internals/promise-resolve');\n\nvar PromiseConstructorWrapper = getBuiltIn('Promise');\nvar CHECK_WRAPPER = IS_PURE && !FORCED_PROMISE_CONSTRUCTOR;\n\n// `Promise.resolve` method\n// https://tc39.es/ecma262/#sec-promise.resolve\n$({ target: 'Promise', stat: true, forced: IS_PURE || FORCED_PROMISE_CONSTRUCTOR }, {\n resolve: function resolve(x) {\n return promiseResolve(CHECK_WRAPPER && this === PromiseConstructorWrapper ? NativePromiseConstructor : this, x);\n }\n});\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isForced = require('../internals/is-forced');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar isRegExp = require('../internals/is-regexp');\nvar toString = require('../internals/to-string');\nvar getRegExpFlags = require('../internals/regexp-get-flags');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar proxyAccessor = require('../internals/proxy-accessor');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar fails = require('../internals/fails');\nvar hasOwn = require('../internals/has-own-property');\nvar enforceInternalState = require('../internals/internal-state').enforce;\nvar setSpecies = require('../internals/set-species');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar UNSUPPORTED_DOT_ALL = require('../internals/regexp-unsupported-dot-all');\nvar UNSUPPORTED_NCG = require('../internals/regexp-unsupported-ncg');\n\nvar MATCH = wellKnownSymbol('match');\nvar NativeRegExp = global.RegExp;\nvar RegExpPrototype = NativeRegExp.prototype;\nvar SyntaxError = global.SyntaxError;\nvar exec = uncurryThis(RegExpPrototype.exec);\nvar charAt = uncurryThis(''.charAt);\nvar replace = uncurryThis(''.replace);\nvar stringIndexOf = uncurryThis(''.indexOf);\nvar stringSlice = uncurryThis(''.slice);\n// TODO: Use only proper RegExpIdentifierName\nvar IS_NCG = /^\\?<[^\\s\\d!#%&*+<=>@^][^\\s!#%&*+<=>@^]*>/;\nvar re1 = /a/g;\nvar re2 = /a/g;\n\n// \"new\" should create a new object, old webkit bug\nvar CORRECT_NEW = new NativeRegExp(re1) !== re1;\n\nvar MISSED_STICKY = stickyHelpers.MISSED_STICKY;\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;\n\nvar BASE_FORCED = DESCRIPTORS &&\n (!CORRECT_NEW || MISSED_STICKY || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG || fails(function () {\n re2[MATCH] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return NativeRegExp(re1) !== re1 || NativeRegExp(re2) === re2 || String(NativeRegExp(re1, 'i')) !== '/a/i';\n }));\n\nvar handleDotAll = function (string) {\n var length = string.length;\n var index = 0;\n var result = '';\n var brackets = false;\n var chr;\n for (; index <= length; index++) {\n chr = charAt(string, index);\n if (chr === '\\\\') {\n result += chr + charAt(string, ++index);\n continue;\n }\n if (!brackets && chr === '.') {\n result += '[\\\\s\\\\S]';\n } else {\n if (chr === '[') {\n brackets = true;\n } else if (chr === ']') {\n brackets = false;\n } result += chr;\n }\n } return result;\n};\n\nvar handleNCG = function (string) {\n var length = string.length;\n var index = 0;\n var result = '';\n var named = [];\n var names = {};\n var brackets = false;\n var ncg = false;\n var groupid = 0;\n var groupname = '';\n var chr;\n for (; index <= length; index++) {\n chr = charAt(string, index);\n if (chr === '\\\\') {\n chr = chr + charAt(string, ++index);\n } else if (chr === ']') {\n brackets = false;\n } else if (!brackets) switch (true) {\n case chr === '[':\n brackets = true;\n break;\n case chr === '(':\n if (exec(IS_NCG, stringSlice(string, index + 1))) {\n index += 2;\n ncg = true;\n }\n result += chr;\n groupid++;\n continue;\n case chr === '>' && ncg:\n if (groupname === '' || hasOwn(names, groupname)) {\n throw new SyntaxError('Invalid capture group name');\n }\n names[groupname] = true;\n named[named.length] = [groupname, groupid];\n ncg = false;\n groupname = '';\n continue;\n }\n if (ncg) groupname += chr;\n else result += chr;\n } return [result, named];\n};\n\n// `RegExp` constructor\n// https://tc39.es/ecma262/#sec-regexp-constructor\nif (isForced('RegExp', BASE_FORCED)) {\n var RegExpWrapper = function RegExp(pattern, flags) {\n var thisIsRegExp = isPrototypeOf(RegExpPrototype, this);\n var patternIsRegExp = isRegExp(pattern);\n var flagsAreUndefined = flags === undefined;\n var groups = [];\n var rawPattern = pattern;\n var rawFlags, dotAll, sticky, handled, result, state;\n\n if (!thisIsRegExp && patternIsRegExp && flagsAreUndefined && pattern.constructor === RegExpWrapper) {\n return pattern;\n }\n\n if (patternIsRegExp || isPrototypeOf(RegExpPrototype, pattern)) {\n pattern = pattern.source;\n if (flagsAreUndefined) flags = getRegExpFlags(rawPattern);\n }\n\n pattern = pattern === undefined ? '' : toString(pattern);\n flags = flags === undefined ? '' : toString(flags);\n rawPattern = pattern;\n\n if (UNSUPPORTED_DOT_ALL && 'dotAll' in re1) {\n dotAll = !!flags && stringIndexOf(flags, 's') > -1;\n if (dotAll) flags = replace(flags, /s/g, '');\n }\n\n rawFlags = flags;\n\n if (MISSED_STICKY && 'sticky' in re1) {\n sticky = !!flags && stringIndexOf(flags, 'y') > -1;\n if (sticky && UNSUPPORTED_Y) flags = replace(flags, /y/g, '');\n }\n\n if (UNSUPPORTED_NCG) {\n handled = handleNCG(pattern);\n pattern = handled[0];\n groups = handled[1];\n }\n\n result = inheritIfRequired(NativeRegExp(pattern, flags), thisIsRegExp ? this : RegExpPrototype, RegExpWrapper);\n\n if (dotAll || sticky || groups.length) {\n state = enforceInternalState(result);\n if (dotAll) {\n state.dotAll = true;\n state.raw = RegExpWrapper(handleDotAll(pattern), rawFlags);\n }\n if (sticky) state.sticky = true;\n if (groups.length) state.groups = groups;\n }\n\n if (pattern !== rawPattern) try {\n // fails in old engines, but we have no alternatives for unsupported regex syntax\n createNonEnumerableProperty(result, 'source', rawPattern === '' ? '(?:)' : rawPattern);\n } catch (error) { /* empty */ }\n\n return result;\n };\n\n for (var keys = getOwnPropertyNames(NativeRegExp), index = 0; keys.length > index;) {\n proxyAccessor(RegExpWrapper, NativeRegExp, keys[index++]);\n }\n\n RegExpPrototype.constructor = RegExpWrapper;\n RegExpWrapper.prototype = RegExpPrototype;\n defineBuiltIn(global, 'RegExp', RegExpWrapper, { constructor: true });\n}\n\n// https://tc39.es/ecma262/#sec-get-regexp-@@species\nsetSpecies('RegExp');\n","'use strict';\nvar $ = require('../internals/export');\nvar exec = require('../internals/regexp-exec');\n\n// `RegExp.prototype.exec` method\n// https://tc39.es/ecma262/#sec-regexp.prototype.exec\n$({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, {\n exec: exec\n});\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\nvar toString = require('../internals/to-string');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/iterator-define');\nvar createIterResultObject = require('../internals/create-iter-result-object');\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: toString(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.es/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return createIterResultObject(undefined, true);\n point = charAt(string, index);\n state.index += point.length;\n return createIterResultObject(point, false);\n});\n","'use strict';\nvar apply = require('../internals/function-apply');\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar fails = require('../internals/fails');\nvar anObject = require('../internals/an-object');\nvar isCallable = require('../internals/is-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toLength = require('../internals/to-length');\nvar toString = require('../internals/to-string');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar getMethod = require('../internals/get-method');\nvar getSubstitution = require('../internals/get-substitution');\nvar regExpExec = require('../internals/regexp-exec-abstract');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar REPLACE = wellKnownSymbol('replace');\nvar max = Math.max;\nvar min = Math.min;\nvar concat = uncurryThis([].concat);\nvar push = uncurryThis([].push);\nvar stringIndexOf = uncurryThis(''.indexOf);\nvar stringSlice = uncurryThis(''.slice);\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// IE <= 11 replaces $0 with the whole match, as if it was $&\n// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\nvar REPLACE_KEEPS_$0 = (function () {\n // eslint-disable-next-line regexp/prefer-escape-replacement-dollar-char -- required for testing\n return 'a'.replace(/./, '$0') === '$0';\n})();\n\n// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\nvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\n if (/./[REPLACE]) {\n return /./[REPLACE]('a', '$0') === '';\n }\n return false;\n})();\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n // eslint-disable-next-line regexp/no-useless-dollar-replacements -- false positive\n return ''.replace(re, '$') !== '7';\n});\n\n// @@replace logic\nfixRegExpWellKnownSymbolLogic('replace', function (_, nativeReplace, maybeCallNative) {\n var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n return [\n // `String.prototype.replace` method\n // https://tc39.es/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var replacer = isNullOrUndefined(searchValue) ? undefined : getMethod(searchValue, REPLACE);\n return replacer\n ? call(replacer, searchValue, O, replaceValue)\n : call(nativeReplace, toString(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.es/ecma262/#sec-regexp.prototype-@@replace\n function (string, replaceValue) {\n var rx = anObject(this);\n var S = toString(string);\n\n if (\n typeof replaceValue == 'string' &&\n stringIndexOf(replaceValue, UNSAFE_SUBSTITUTE) === -1 &&\n stringIndexOf(replaceValue, '$<') === -1\n ) {\n var res = maybeCallNative(nativeReplace, rx, S, replaceValue);\n if (res.done) return res.value;\n }\n\n var functionalReplace = isCallable(replaceValue);\n if (!functionalReplace) replaceValue = toString(replaceValue);\n\n var global = rx.global;\n var fullUnicode;\n if (global) {\n fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n\n var results = [];\n var result;\n while (true) {\n result = regExpExec(rx, S);\n if (result === null) break;\n\n push(results, result);\n if (!global) break;\n\n var matchStr = toString(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n var matched = toString(result[0]);\n var position = max(min(toIntegerOrInfinity(result.index), S.length), 0);\n var captures = [];\n var replacement;\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) push(captures, maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = concat([matched], captures, position, S);\n if (namedCaptures !== undefined) push(replacerArgs, namedCaptures);\n replacement = toString(apply(replaceValue, undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += stringSlice(S, nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n\n return accumulatedResult + stringSlice(S, nextSourcePosition);\n }\n ];\n}, !REPLACE_SUPPORTS_NAMED_GROUPS || !REPLACE_KEEPS_$0 || REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE);\n","'use strict';\nvar $ = require('../internals/export');\nvar $trim = require('../internals/string-trim').trim;\nvar forcedStringTrimMethod = require('../internals/string-trim-forced');\n\n// `String.prototype.trim` method\n// https://tc39.es/ecma262/#sec-string.prototype.trim\n$({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, {\n trim: function trim() {\n return $trim(this);\n }\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nrequire('../modules/es.global-this');\n","'use strict';\nvar global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar DOMTokenListPrototype = require('../internals/dom-token-list-prototype');\nvar forEach = require('../internals/array-for-each');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nvar handlePrototype = function (CollectionPrototype) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try {\n createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach);\n } catch (error) {\n CollectionPrototype.forEach = forEach;\n }\n};\n\nfor (var COLLECTION_NAME in DOMIterables) {\n if (DOMIterables[COLLECTION_NAME]) {\n handlePrototype(global[COLLECTION_NAME] && global[COLLECTION_NAME].prototype);\n }\n}\n\nhandlePrototype(DOMTokenListPrototype);\n","'use strict';\nvar global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar DOMTokenListPrototype = require('../internals/dom-token-list-prototype');\nvar ArrayIteratorMethods = require('../modules/es.array.iterator');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar ArrayValues = ArrayIteratorMethods.values;\n\nvar handlePrototype = function (CollectionPrototype, COLLECTION_NAME) {\n if (CollectionPrototype) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[ITERATOR] !== ArrayValues) try {\n createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues);\n } catch (error) {\n CollectionPrototype[ITERATOR] = ArrayValues;\n }\n if (!CollectionPrototype[TO_STRING_TAG]) {\n createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);\n }\n if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {\n createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);\n } catch (error) {\n CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];\n }\n }\n }\n};\n\nfor (var COLLECTION_NAME in DOMIterables) {\n handlePrototype(global[COLLECTION_NAME] && global[COLLECTION_NAME].prototype, COLLECTION_NAME);\n}\n\nhandlePrototype(DOMTokenListPrototype, 'DOMTokenList');\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.array.iterator');\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar USE_NATIVE_URL = require('../internals/url-constructor-detection');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar defineBuiltIns = require('../internals/define-built-ins');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createIteratorConstructor = require('../internals/iterator-create-constructor');\nvar InternalStateModule = require('../internals/internal-state');\nvar anInstance = require('../internals/an-instance');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar bind = require('../internals/function-bind-context');\nvar classof = require('../internals/classof');\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar $toString = require('../internals/to-string');\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar validateArgumentsLength = require('../internals/validate-arguments-length');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar arraySort = require('../internals/array-sort');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar URL_SEARCH_PARAMS = 'URLSearchParams';\nvar URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalParamsState = InternalStateModule.getterFor(URL_SEARCH_PARAMS);\nvar getInternalIteratorState = InternalStateModule.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Avoid NodeJS experimental warning\nvar safeGetBuiltIn = function (name) {\n if (!DESCRIPTORS) return global[name];\n var descriptor = getOwnPropertyDescriptor(global, name);\n return descriptor && descriptor.value;\n};\n\nvar nativeFetch = safeGetBuiltIn('fetch');\nvar NativeRequest = safeGetBuiltIn('Request');\nvar Headers = safeGetBuiltIn('Headers');\nvar RequestPrototype = NativeRequest && NativeRequest.prototype;\nvar HeadersPrototype = Headers && Headers.prototype;\nvar RegExp = global.RegExp;\nvar TypeError = global.TypeError;\nvar decodeURIComponent = global.decodeURIComponent;\nvar encodeURIComponent = global.encodeURIComponent;\nvar charAt = uncurryThis(''.charAt);\nvar join = uncurryThis([].join);\nvar push = uncurryThis([].push);\nvar replace = uncurryThis(''.replace);\nvar shift = uncurryThis([].shift);\nvar splice = uncurryThis([].splice);\nvar split = uncurryThis(''.split);\nvar stringSlice = uncurryThis(''.slice);\n\nvar plus = /\\+/g;\nvar sequences = Array(4);\n\nvar percentSequence = function (bytes) {\n return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\\\da-f]{2}){' + bytes + '})', 'gi'));\n};\n\nvar percentDecode = function (sequence) {\n try {\n return decodeURIComponent(sequence);\n } catch (error) {\n return sequence;\n }\n};\n\nvar deserialize = function (it) {\n var result = replace(it, plus, ' ');\n var bytes = 4;\n try {\n return decodeURIComponent(result);\n } catch (error) {\n while (bytes) {\n result = replace(result, percentSequence(bytes--), percentDecode);\n }\n return result;\n }\n};\n\nvar find = /[!'()~]|%20/g;\n\nvar replacements = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+'\n};\n\nvar replacer = function (match) {\n return replacements[match];\n};\n\nvar serialize = function (it) {\n return replace(encodeURIComponent(it), find, replacer);\n};\n\nvar URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n setInternalState(this, {\n type: URL_SEARCH_PARAMS_ITERATOR,\n iterator: getIterator(getInternalParamsState(params).entries),\n kind: kind\n });\n}, 'Iterator', function next() {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var step = state.iterator.next();\n var entry = step.value;\n if (!step.done) {\n step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];\n } return step;\n}, true);\n\nvar URLSearchParamsState = function (init) {\n this.entries = [];\n this.url = null;\n\n if (init !== undefined) {\n if (isObject(init)) this.parseObject(init);\n else this.parseQuery(typeof init == 'string' ? charAt(init, 0) === '?' ? stringSlice(init, 1) : init : $toString(init));\n }\n};\n\nURLSearchParamsState.prototype = {\n type: URL_SEARCH_PARAMS,\n bindURL: function (url) {\n this.url = url;\n this.update();\n },\n parseObject: function (object) {\n var iteratorMethod = getIteratorMethod(object);\n var iterator, next, step, entryIterator, entryNext, first, second;\n\n if (iteratorMethod) {\n iterator = getIterator(object, iteratorMethod);\n next = iterator.next;\n while (!(step = call(next, iterator)).done) {\n entryIterator = getIterator(anObject(step.value));\n entryNext = entryIterator.next;\n if (\n (first = call(entryNext, entryIterator)).done ||\n (second = call(entryNext, entryIterator)).done ||\n !call(entryNext, entryIterator).done\n ) throw TypeError('Expected sequence with length 2');\n push(this.entries, { key: $toString(first.value), value: $toString(second.value) });\n }\n } else for (var key in object) if (hasOwn(object, key)) {\n push(this.entries, { key: key, value: $toString(object[key]) });\n }\n },\n parseQuery: function (query) {\n if (query) {\n var attributes = split(query, '&');\n var index = 0;\n var attribute, entry;\n while (index < attributes.length) {\n attribute = attributes[index++];\n if (attribute.length) {\n entry = split(attribute, '=');\n push(this.entries, {\n key: deserialize(shift(entry)),\n value: deserialize(join(entry, '='))\n });\n }\n }\n }\n },\n serialize: function () {\n var entries = this.entries;\n var result = [];\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n push(result, serialize(entry.key) + '=' + serialize(entry.value));\n } return join(result, '&');\n },\n update: function () {\n this.entries.length = 0;\n this.parseQuery(this.url.query);\n },\n updateURL: function () {\n if (this.url) this.url.update();\n }\n};\n\n// `URLSearchParams` constructor\n// https://url.spec.whatwg.org/#interface-urlsearchparams\nvar URLSearchParamsConstructor = function URLSearchParams(/* init */) {\n anInstance(this, URLSearchParamsPrototype);\n var init = arguments.length > 0 ? arguments[0] : undefined;\n var state = setInternalState(this, new URLSearchParamsState(init));\n if (!DESCRIPTORS) this.size = state.entries.length;\n};\n\nvar URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\ndefineBuiltIns(URLSearchParamsPrototype, {\n // `URLSearchParams.prototype.append` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n append: function append(name, value) {\n var state = getInternalParamsState(this);\n validateArgumentsLength(arguments.length, 2);\n push(state.entries, { key: $toString(name), value: $toString(value) });\n if (!DESCRIPTORS) this.length++;\n state.updateURL();\n },\n // `URLSearchParams.prototype.delete` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n 'delete': function (name /* , value */) {\n var state = getInternalParamsState(this);\n var length = validateArgumentsLength(arguments.length, 1);\n var entries = state.entries;\n var key = $toString(name);\n var $value = length < 2 ? undefined : arguments[1];\n var value = $value === undefined ? $value : $toString($value);\n var index = 0;\n while (index < entries.length) {\n var entry = entries[index];\n if (entry.key === key && (value === undefined || entry.value === value)) {\n splice(entries, index, 1);\n if (value !== undefined) break;\n } else index++;\n }\n if (!DESCRIPTORS) this.size = entries.length;\n state.updateURL();\n },\n // `URLSearchParams.prototype.get` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n get: function get(name) {\n var entries = getInternalParamsState(this).entries;\n validateArgumentsLength(arguments.length, 1);\n var key = $toString(name);\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) return entries[index].value;\n }\n return null;\n },\n // `URLSearchParams.prototype.getAll` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n getAll: function getAll(name) {\n var entries = getInternalParamsState(this).entries;\n validateArgumentsLength(arguments.length, 1);\n var key = $toString(name);\n var result = [];\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) push(result, entries[index].value);\n }\n return result;\n },\n // `URLSearchParams.prototype.has` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n has: function has(name /* , value */) {\n var entries = getInternalParamsState(this).entries;\n var length = validateArgumentsLength(arguments.length, 1);\n var key = $toString(name);\n var $value = length < 2 ? undefined : arguments[1];\n var value = $value === undefined ? $value : $toString($value);\n var index = 0;\n while (index < entries.length) {\n var entry = entries[index++];\n if (entry.key === key && (value === undefined || entry.value === value)) return true;\n }\n return false;\n },\n // `URLSearchParams.prototype.set` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n set: function set(name, value) {\n var state = getInternalParamsState(this);\n validateArgumentsLength(arguments.length, 1);\n var entries = state.entries;\n var found = false;\n var key = $toString(name);\n var val = $toString(value);\n var index = 0;\n var entry;\n for (; index < entries.length; index++) {\n entry = entries[index];\n if (entry.key === key) {\n if (found) splice(entries, index--, 1);\n else {\n found = true;\n entry.value = val;\n }\n }\n }\n if (!found) push(entries, { key: key, value: val });\n if (!DESCRIPTORS) this.size = entries.length;\n state.updateURL();\n },\n // `URLSearchParams.prototype.sort` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n sort: function sort() {\n var state = getInternalParamsState(this);\n arraySort(state.entries, function (a, b) {\n return a.key > b.key ? 1 : -1;\n });\n state.updateURL();\n },\n // `URLSearchParams.prototype.forEach` method\n forEach: function forEach(callback /* , thisArg */) {\n var entries = getInternalParamsState(this).entries;\n var boundFunction = bind(callback, arguments.length > 1 ? arguments[1] : undefined);\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n boundFunction(entry.value, entry.key, this);\n }\n },\n // `URLSearchParams.prototype.keys` method\n keys: function keys() {\n return new URLSearchParamsIterator(this, 'keys');\n },\n // `URLSearchParams.prototype.values` method\n values: function values() {\n return new URLSearchParamsIterator(this, 'values');\n },\n // `URLSearchParams.prototype.entries` method\n entries: function entries() {\n return new URLSearchParamsIterator(this, 'entries');\n }\n}, { enumerable: true });\n\n// `URLSearchParams.prototype[@@iterator]` method\ndefineBuiltIn(URLSearchParamsPrototype, ITERATOR, URLSearchParamsPrototype.entries, { name: 'entries' });\n\n// `URLSearchParams.prototype.toString` method\n// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\ndefineBuiltIn(URLSearchParamsPrototype, 'toString', function toString() {\n return getInternalParamsState(this).serialize();\n}, { enumerable: true });\n\n// `URLSearchParams.prototype.size` getter\n// https://github.com/whatwg/url/pull/734\nif (DESCRIPTORS) defineBuiltInAccessor(URLSearchParamsPrototype, 'size', {\n get: function size() {\n return getInternalParamsState(this).entries.length;\n },\n configurable: true,\n enumerable: true\n});\n\nsetToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\n$({ global: true, constructor: true, forced: !USE_NATIVE_URL }, {\n URLSearchParams: URLSearchParamsConstructor\n});\n\n// Wrap `fetch` and `Request` for correct work with polyfilled `URLSearchParams`\nif (!USE_NATIVE_URL && isCallable(Headers)) {\n var headersHas = uncurryThis(HeadersPrototype.has);\n var headersSet = uncurryThis(HeadersPrototype.set);\n\n var wrapRequestOptions = function (init) {\n if (isObject(init)) {\n var body = init.body;\n var headers;\n if (classof(body) === URL_SEARCH_PARAMS) {\n headers = init.headers ? new Headers(init.headers) : new Headers();\n if (!headersHas(headers, 'content-type')) {\n headersSet(headers, 'content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n return create(init, {\n body: createPropertyDescriptor(0, $toString(body)),\n headers: createPropertyDescriptor(0, headers)\n });\n }\n } return init;\n };\n\n if (isCallable(nativeFetch)) {\n $({ global: true, enumerable: true, dontCallGetSet: true, forced: true }, {\n fetch: function fetch(input /* , init */) {\n return nativeFetch(input, arguments.length > 1 ? wrapRequestOptions(arguments[1]) : {});\n }\n });\n }\n\n if (isCallable(NativeRequest)) {\n var RequestConstructor = function Request(input /* , init */) {\n anInstance(this, RequestPrototype);\n return new NativeRequest(input, arguments.length > 1 ? wrapRequestOptions(arguments[1]) : {});\n };\n\n RequestPrototype.constructor = RequestConstructor;\n RequestConstructor.prototype = RequestPrototype;\n\n $({ global: true, constructor: true, dontCallGetSet: true, forced: true }, {\n Request: RequestConstructor\n });\n }\n}\n\nmodule.exports = {\n URLSearchParams: URLSearchParamsConstructor,\n getState: getInternalParamsState\n};\n","'use strict';\n// TODO: Remove this module from `core-js@4` since it's replaced to module below\nrequire('../modules/web.url-search-params.constructor');\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.string.iterator');\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar USE_NATIVE_URL = require('../internals/url-constructor-detection');\nvar global = require('../internals/global');\nvar bind = require('../internals/function-bind-context');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar anInstance = require('../internals/an-instance');\nvar hasOwn = require('../internals/has-own-property');\nvar assign = require('../internals/object-assign');\nvar arrayFrom = require('../internals/array-from');\nvar arraySlice = require('../internals/array-slice-simple');\nvar codeAt = require('../internals/string-multibyte').codeAt;\nvar toASCII = require('../internals/string-punycode-to-ascii');\nvar $toString = require('../internals/to-string');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar validateArgumentsLength = require('../internals/validate-arguments-length');\nvar URLSearchParamsModule = require('../modules/web.url-search-params.constructor');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar setInternalState = InternalStateModule.set;\nvar getInternalURLState = InternalStateModule.getterFor('URL');\nvar URLSearchParams = URLSearchParamsModule.URLSearchParams;\nvar getInternalSearchParamsState = URLSearchParamsModule.getState;\n\nvar NativeURL = global.URL;\nvar TypeError = global.TypeError;\nvar parseInt = global.parseInt;\nvar floor = Math.floor;\nvar pow = Math.pow;\nvar charAt = uncurryThis(''.charAt);\nvar exec = uncurryThis(/./.exec);\nvar join = uncurryThis([].join);\nvar numberToString = uncurryThis(1.0.toString);\nvar pop = uncurryThis([].pop);\nvar push = uncurryThis([].push);\nvar replace = uncurryThis(''.replace);\nvar shift = uncurryThis([].shift);\nvar split = uncurryThis(''.split);\nvar stringSlice = uncurryThis(''.slice);\nvar toLowerCase = uncurryThis(''.toLowerCase);\nvar unshift = uncurryThis([].unshift);\n\nvar INVALID_AUTHORITY = 'Invalid authority';\nvar INVALID_SCHEME = 'Invalid scheme';\nvar INVALID_HOST = 'Invalid host';\nvar INVALID_PORT = 'Invalid port';\n\nvar ALPHA = /[a-z]/i;\n// eslint-disable-next-line regexp/no-obscure-range -- safe\nvar ALPHANUMERIC = /[\\d+-.a-z]/i;\nvar DIGIT = /\\d/;\nvar HEX_START = /^0x/i;\nvar OCT = /^[0-7]+$/;\nvar DEC = /^\\d+$/;\nvar HEX = /^[\\da-f]+$/i;\n/* eslint-disable regexp/no-control-character -- safe */\nvar FORBIDDEN_HOST_CODE_POINT = /[\\0\\t\\n\\r #%/:<>?@[\\\\\\]^|]/;\nvar FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\\0\\t\\n\\r #/:<>?@[\\\\\\]^|]/;\nvar LEADING_C0_CONTROL_OR_SPACE = /^[\\u0000-\\u0020]+/;\nvar TRAILING_C0_CONTROL_OR_SPACE = /(^|[^\\u0000-\\u0020])[\\u0000-\\u0020]+$/;\nvar TAB_AND_NEW_LINE = /[\\t\\n\\r]/g;\n/* eslint-enable regexp/no-control-character -- safe */\nvar EOF;\n\n// https://url.spec.whatwg.org/#ipv4-number-parser\nvar parseIPv4 = function (input) {\n var parts = split(input, '.');\n var partsLength, numbers, index, part, radix, number, ipv4;\n if (parts.length && parts[parts.length - 1] === '') {\n parts.length--;\n }\n partsLength = parts.length;\n if (partsLength > 4) return input;\n numbers = [];\n for (index = 0; index < partsLength; index++) {\n part = parts[index];\n if (part === '') return input;\n radix = 10;\n if (part.length > 1 && charAt(part, 0) === '0') {\n radix = exec(HEX_START, part) ? 16 : 8;\n part = stringSlice(part, radix === 8 ? 1 : 2);\n }\n if (part === '') {\n number = 0;\n } else {\n if (!exec(radix === 10 ? DEC : radix === 8 ? OCT : HEX, part)) return input;\n number = parseInt(part, radix);\n }\n push(numbers, number);\n }\n for (index = 0; index < partsLength; index++) {\n number = numbers[index];\n if (index === partsLength - 1) {\n if (number >= pow(256, 5 - partsLength)) return null;\n } else if (number > 255) return null;\n }\n ipv4 = pop(numbers);\n for (index = 0; index < numbers.length; index++) {\n ipv4 += numbers[index] * pow(256, 3 - index);\n }\n return ipv4;\n};\n\n// https://url.spec.whatwg.org/#concept-ipv6-parser\n// eslint-disable-next-line max-statements -- TODO\nvar parseIPv6 = function (input) {\n var address = [0, 0, 0, 0, 0, 0, 0, 0];\n var pieceIndex = 0;\n var compress = null;\n var pointer = 0;\n var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n var chr = function () {\n return charAt(input, pointer);\n };\n\n if (chr() === ':') {\n if (charAt(input, 1) !== ':') return;\n pointer += 2;\n pieceIndex++;\n compress = pieceIndex;\n }\n while (chr()) {\n if (pieceIndex === 8) return;\n if (chr() === ':') {\n if (compress !== null) return;\n pointer++;\n pieceIndex++;\n compress = pieceIndex;\n continue;\n }\n value = length = 0;\n while (length < 4 && exec(HEX, chr())) {\n value = value * 16 + parseInt(chr(), 16);\n pointer++;\n length++;\n }\n if (chr() === '.') {\n if (length === 0) return;\n pointer -= length;\n if (pieceIndex > 6) return;\n numbersSeen = 0;\n while (chr()) {\n ipv4Piece = null;\n if (numbersSeen > 0) {\n if (chr() === '.' && numbersSeen < 4) pointer++;\n else return;\n }\n if (!exec(DIGIT, chr())) return;\n while (exec(DIGIT, chr())) {\n number = parseInt(chr(), 10);\n if (ipv4Piece === null) ipv4Piece = number;\n else if (ipv4Piece === 0) return;\n else ipv4Piece = ipv4Piece * 10 + number;\n if (ipv4Piece > 255) return;\n pointer++;\n }\n address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n numbersSeen++;\n if (numbersSeen === 2 || numbersSeen === 4) pieceIndex++;\n }\n if (numbersSeen !== 4) return;\n break;\n } else if (chr() === ':') {\n pointer++;\n if (!chr()) return;\n } else if (chr()) return;\n address[pieceIndex++] = value;\n }\n if (compress !== null) {\n swaps = pieceIndex - compress;\n pieceIndex = 7;\n while (pieceIndex !== 0 && swaps > 0) {\n swap = address[pieceIndex];\n address[pieceIndex--] = address[compress + swaps - 1];\n address[compress + --swaps] = swap;\n }\n } else if (pieceIndex !== 8) return;\n return address;\n};\n\nvar findLongestZeroSequence = function (ipv6) {\n var maxIndex = null;\n var maxLength = 1;\n var currStart = null;\n var currLength = 0;\n var index = 0;\n for (; index < 8; index++) {\n if (ipv6[index] !== 0) {\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n currStart = null;\n currLength = 0;\n } else {\n if (currStart === null) currStart = index;\n ++currLength;\n }\n }\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n return maxIndex;\n};\n\n// https://url.spec.whatwg.org/#host-serializing\nvar serializeHost = function (host) {\n var result, index, compress, ignore0;\n // ipv4\n if (typeof host == 'number') {\n result = [];\n for (index = 0; index < 4; index++) {\n unshift(result, host % 256);\n host = floor(host / 256);\n } return join(result, '.');\n // ipv6\n } else if (typeof host == 'object') {\n result = '';\n compress = findLongestZeroSequence(host);\n for (index = 0; index < 8; index++) {\n if (ignore0 && host[index] === 0) continue;\n if (ignore0) ignore0 = false;\n if (compress === index) {\n result += index ? ':' : '::';\n ignore0 = true;\n } else {\n result += numberToString(host[index], 16);\n if (index < 7) result += ':';\n }\n }\n return '[' + result + ']';\n } return host;\n};\n\nvar C0ControlPercentEncodeSet = {};\nvar fragmentPercentEncodeSet = assign({}, C0ControlPercentEncodeSet, {\n ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n});\nvar pathPercentEncodeSet = assign({}, fragmentPercentEncodeSet, {\n '#': 1, '?': 1, '{': 1, '}': 1\n});\nvar userinfoPercentEncodeSet = assign({}, pathPercentEncodeSet, {\n '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n});\n\nvar percentEncode = function (chr, set) {\n var code = codeAt(chr, 0);\n return code > 0x20 && code < 0x7F && !hasOwn(set, chr) ? chr : encodeURIComponent(chr);\n};\n\n// https://url.spec.whatwg.org/#special-scheme\nvar specialSchemes = {\n ftp: 21,\n file: null,\n http: 80,\n https: 443,\n ws: 80,\n wss: 443\n};\n\n// https://url.spec.whatwg.org/#windows-drive-letter\nvar isWindowsDriveLetter = function (string, normalized) {\n var second;\n return string.length === 2 && exec(ALPHA, charAt(string, 0))\n && ((second = charAt(string, 1)) === ':' || (!normalized && second === '|'));\n};\n\n// https://url.spec.whatwg.org/#start-with-a-windows-drive-letter\nvar startsWithWindowsDriveLetter = function (string) {\n var third;\n return string.length > 1 && isWindowsDriveLetter(stringSlice(string, 0, 2)) && (\n string.length === 2 ||\n ((third = charAt(string, 2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n );\n};\n\n// https://url.spec.whatwg.org/#single-dot-path-segment\nvar isSingleDot = function (segment) {\n return segment === '.' || toLowerCase(segment) === '%2e';\n};\n\n// https://url.spec.whatwg.org/#double-dot-path-segment\nvar isDoubleDot = function (segment) {\n segment = toLowerCase(segment);\n return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n};\n\n// States:\nvar SCHEME_START = {};\nvar SCHEME = {};\nvar NO_SCHEME = {};\nvar SPECIAL_RELATIVE_OR_AUTHORITY = {};\nvar PATH_OR_AUTHORITY = {};\nvar RELATIVE = {};\nvar RELATIVE_SLASH = {};\nvar SPECIAL_AUTHORITY_SLASHES = {};\nvar SPECIAL_AUTHORITY_IGNORE_SLASHES = {};\nvar AUTHORITY = {};\nvar HOST = {};\nvar HOSTNAME = {};\nvar PORT = {};\nvar FILE = {};\nvar FILE_SLASH = {};\nvar FILE_HOST = {};\nvar PATH_START = {};\nvar PATH = {};\nvar CANNOT_BE_A_BASE_URL_PATH = {};\nvar QUERY = {};\nvar FRAGMENT = {};\n\nvar URLState = function (url, isBase, base) {\n var urlString = $toString(url);\n var baseState, failure, searchParams;\n if (isBase) {\n failure = this.parse(urlString);\n if (failure) throw TypeError(failure);\n this.searchParams = null;\n } else {\n if (base !== undefined) baseState = new URLState(base, true);\n failure = this.parse(urlString, null, baseState);\n if (failure) throw TypeError(failure);\n searchParams = getInternalSearchParamsState(new URLSearchParams());\n searchParams.bindURL(this);\n this.searchParams = searchParams;\n }\n};\n\nURLState.prototype = {\n type: 'URL',\n // https://url.spec.whatwg.org/#url-parsing\n // eslint-disable-next-line max-statements -- TODO\n parse: function (input, stateOverride, base) {\n var url = this;\n var state = stateOverride || SCHEME_START;\n var pointer = 0;\n var buffer = '';\n var seenAt = false;\n var seenBracket = false;\n var seenPasswordToken = false;\n var codePoints, chr, bufferCodePoints, failure;\n\n input = $toString(input);\n\n if (!stateOverride) {\n url.scheme = '';\n url.username = '';\n url.password = '';\n url.host = null;\n url.port = null;\n url.path = [];\n url.query = null;\n url.fragment = null;\n url.cannotBeABaseURL = false;\n input = replace(input, LEADING_C0_CONTROL_OR_SPACE, '');\n input = replace(input, TRAILING_C0_CONTROL_OR_SPACE, '$1');\n }\n\n input = replace(input, TAB_AND_NEW_LINE, '');\n\n codePoints = arrayFrom(input);\n\n while (pointer <= codePoints.length) {\n chr = codePoints[pointer];\n switch (state) {\n case SCHEME_START:\n if (chr && exec(ALPHA, chr)) {\n buffer += toLowerCase(chr);\n state = SCHEME;\n } else if (!stateOverride) {\n state = NO_SCHEME;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case SCHEME:\n if (chr && (exec(ALPHANUMERIC, chr) || chr === '+' || chr === '-' || chr === '.')) {\n buffer += toLowerCase(chr);\n } else if (chr === ':') {\n if (stateOverride && (\n (url.isSpecial() !== hasOwn(specialSchemes, buffer)) ||\n (buffer === 'file' && (url.includesCredentials() || url.port !== null)) ||\n (url.scheme === 'file' && !url.host)\n )) return;\n url.scheme = buffer;\n if (stateOverride) {\n if (url.isSpecial() && specialSchemes[url.scheme] === url.port) url.port = null;\n return;\n }\n buffer = '';\n if (url.scheme === 'file') {\n state = FILE;\n } else if (url.isSpecial() && base && base.scheme === url.scheme) {\n state = SPECIAL_RELATIVE_OR_AUTHORITY;\n } else if (url.isSpecial()) {\n state = SPECIAL_AUTHORITY_SLASHES;\n } else if (codePoints[pointer + 1] === '/') {\n state = PATH_OR_AUTHORITY;\n pointer++;\n } else {\n url.cannotBeABaseURL = true;\n push(url.path, '');\n state = CANNOT_BE_A_BASE_URL_PATH;\n }\n } else if (!stateOverride) {\n buffer = '';\n state = NO_SCHEME;\n pointer = 0;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case NO_SCHEME:\n if (!base || (base.cannotBeABaseURL && chr !== '#')) return INVALID_SCHEME;\n if (base.cannotBeABaseURL && chr === '#') {\n url.scheme = base.scheme;\n url.path = arraySlice(base.path);\n url.query = base.query;\n url.fragment = '';\n url.cannotBeABaseURL = true;\n state = FRAGMENT;\n break;\n }\n state = base.scheme === 'file' ? FILE : RELATIVE;\n continue;\n\n case SPECIAL_RELATIVE_OR_AUTHORITY:\n if (chr === '/' && codePoints[pointer + 1] === '/') {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n pointer++;\n } else {\n state = RELATIVE;\n continue;\n } break;\n\n case PATH_OR_AUTHORITY:\n if (chr === '/') {\n state = AUTHORITY;\n break;\n } else {\n state = PATH;\n continue;\n }\n\n case RELATIVE:\n url.scheme = base.scheme;\n if (chr === EOF) {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = arraySlice(base.path);\n url.query = base.query;\n } else if (chr === '/' || (chr === '\\\\' && url.isSpecial())) {\n state = RELATIVE_SLASH;\n } else if (chr === '?') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = arraySlice(base.path);\n url.query = '';\n state = QUERY;\n } else if (chr === '#') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = arraySlice(base.path);\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = arraySlice(base.path);\n url.path.length--;\n state = PATH;\n continue;\n } break;\n\n case RELATIVE_SLASH:\n if (url.isSpecial() && (chr === '/' || chr === '\\\\')) {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n } else if (chr === '/') {\n state = AUTHORITY;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n state = PATH;\n continue;\n } break;\n\n case SPECIAL_AUTHORITY_SLASHES:\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n if (chr !== '/' || charAt(buffer, pointer + 1) !== '/') continue;\n pointer++;\n break;\n\n case SPECIAL_AUTHORITY_IGNORE_SLASHES:\n if (chr !== '/' && chr !== '\\\\') {\n state = AUTHORITY;\n continue;\n } break;\n\n case AUTHORITY:\n if (chr === '@') {\n if (seenAt) buffer = '%40' + buffer;\n seenAt = true;\n bufferCodePoints = arrayFrom(buffer);\n for (var i = 0; i < bufferCodePoints.length; i++) {\n var codePoint = bufferCodePoints[i];\n if (codePoint === ':' && !seenPasswordToken) {\n seenPasswordToken = true;\n continue;\n }\n var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);\n if (seenPasswordToken) url.password += encodedCodePoints;\n else url.username += encodedCodePoints;\n }\n buffer = '';\n } else if (\n chr === EOF || chr === '/' || chr === '?' || chr === '#' ||\n (chr === '\\\\' && url.isSpecial())\n ) {\n if (seenAt && buffer === '') return INVALID_AUTHORITY;\n pointer -= arrayFrom(buffer).length + 1;\n buffer = '';\n state = HOST;\n } else buffer += chr;\n break;\n\n case HOST:\n case HOSTNAME:\n if (stateOverride && url.scheme === 'file') {\n state = FILE_HOST;\n continue;\n } else if (chr === ':' && !seenBracket) {\n if (buffer === '') return INVALID_HOST;\n failure = url.parseHost(buffer);\n if (failure) return failure;\n buffer = '';\n state = PORT;\n if (stateOverride === HOSTNAME) return;\n } else if (\n chr === EOF || chr === '/' || chr === '?' || chr === '#' ||\n (chr === '\\\\' && url.isSpecial())\n ) {\n if (url.isSpecial() && buffer === '') return INVALID_HOST;\n if (stateOverride && buffer === '' && (url.includesCredentials() || url.port !== null)) return;\n failure = url.parseHost(buffer);\n if (failure) return failure;\n buffer = '';\n state = PATH_START;\n if (stateOverride) return;\n continue;\n } else {\n if (chr === '[') seenBracket = true;\n else if (chr === ']') seenBracket = false;\n buffer += chr;\n } break;\n\n case PORT:\n if (exec(DIGIT, chr)) {\n buffer += chr;\n } else if (\n chr === EOF || chr === '/' || chr === '?' || chr === '#' ||\n (chr === '\\\\' && url.isSpecial()) ||\n stateOverride\n ) {\n if (buffer !== '') {\n var port = parseInt(buffer, 10);\n if (port > 0xFFFF) return INVALID_PORT;\n url.port = (url.isSpecial() && port === specialSchemes[url.scheme]) ? null : port;\n buffer = '';\n }\n if (stateOverride) return;\n state = PATH_START;\n continue;\n } else return INVALID_PORT;\n break;\n\n case FILE:\n url.scheme = 'file';\n if (chr === '/' || chr === '\\\\') state = FILE_SLASH;\n else if (base && base.scheme === 'file') {\n switch (chr) {\n case EOF:\n url.host = base.host;\n url.path = arraySlice(base.path);\n url.query = base.query;\n break;\n case '?':\n url.host = base.host;\n url.path = arraySlice(base.path);\n url.query = '';\n state = QUERY;\n break;\n case '#':\n url.host = base.host;\n url.path = arraySlice(base.path);\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n break;\n default:\n if (!startsWithWindowsDriveLetter(join(arraySlice(codePoints, pointer), ''))) {\n url.host = base.host;\n url.path = arraySlice(base.path);\n url.shortenPath();\n }\n state = PATH;\n continue;\n }\n } else {\n state = PATH;\n continue;\n } break;\n\n case FILE_SLASH:\n if (chr === '/' || chr === '\\\\') {\n state = FILE_HOST;\n break;\n }\n if (base && base.scheme === 'file' && !startsWithWindowsDriveLetter(join(arraySlice(codePoints, pointer), ''))) {\n if (isWindowsDriveLetter(base.path[0], true)) push(url.path, base.path[0]);\n else url.host = base.host;\n }\n state = PATH;\n continue;\n\n case FILE_HOST:\n if (chr === EOF || chr === '/' || chr === '\\\\' || chr === '?' || chr === '#') {\n if (!stateOverride && isWindowsDriveLetter(buffer)) {\n state = PATH;\n } else if (buffer === '') {\n url.host = '';\n if (stateOverride) return;\n state = PATH_START;\n } else {\n failure = url.parseHost(buffer);\n if (failure) return failure;\n if (url.host === 'localhost') url.host = '';\n if (stateOverride) return;\n buffer = '';\n state = PATH_START;\n } continue;\n } else buffer += chr;\n break;\n\n case PATH_START:\n if (url.isSpecial()) {\n state = PATH;\n if (chr !== '/' && chr !== '\\\\') continue;\n } else if (!stateOverride && chr === '?') {\n url.query = '';\n state = QUERY;\n } else if (!stateOverride && chr === '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (chr !== EOF) {\n state = PATH;\n if (chr !== '/') continue;\n } break;\n\n case PATH:\n if (\n chr === EOF || chr === '/' ||\n (chr === '\\\\' && url.isSpecial()) ||\n (!stateOverride && (chr === '?' || chr === '#'))\n ) {\n if (isDoubleDot(buffer)) {\n url.shortenPath();\n if (chr !== '/' && !(chr === '\\\\' && url.isSpecial())) {\n push(url.path, '');\n }\n } else if (isSingleDot(buffer)) {\n if (chr !== '/' && !(chr === '\\\\' && url.isSpecial())) {\n push(url.path, '');\n }\n } else {\n if (url.scheme === 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {\n if (url.host) url.host = '';\n buffer = charAt(buffer, 0) + ':'; // normalize windows drive letter\n }\n push(url.path, buffer);\n }\n buffer = '';\n if (url.scheme === 'file' && (chr === EOF || chr === '?' || chr === '#')) {\n while (url.path.length > 1 && url.path[0] === '') {\n shift(url.path);\n }\n }\n if (chr === '?') {\n url.query = '';\n state = QUERY;\n } else if (chr === '#') {\n url.fragment = '';\n state = FRAGMENT;\n }\n } else {\n buffer += percentEncode(chr, pathPercentEncodeSet);\n } break;\n\n case CANNOT_BE_A_BASE_URL_PATH:\n if (chr === '?') {\n url.query = '';\n state = QUERY;\n } else if (chr === '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (chr !== EOF) {\n url.path[0] += percentEncode(chr, C0ControlPercentEncodeSet);\n } break;\n\n case QUERY:\n if (!stateOverride && chr === '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (chr !== EOF) {\n if (chr === \"'\" && url.isSpecial()) url.query += '%27';\n else if (chr === '#') url.query += '%23';\n else url.query += percentEncode(chr, C0ControlPercentEncodeSet);\n } break;\n\n case FRAGMENT:\n if (chr !== EOF) url.fragment += percentEncode(chr, fragmentPercentEncodeSet);\n break;\n }\n\n pointer++;\n }\n },\n // https://url.spec.whatwg.org/#host-parsing\n parseHost: function (input) {\n var result, codePoints, index;\n if (charAt(input, 0) === '[') {\n if (charAt(input, input.length - 1) !== ']') return INVALID_HOST;\n result = parseIPv6(stringSlice(input, 1, -1));\n if (!result) return INVALID_HOST;\n this.host = result;\n // opaque host\n } else if (!this.isSpecial()) {\n if (exec(FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT, input)) return INVALID_HOST;\n result = '';\n codePoints = arrayFrom(input);\n for (index = 0; index < codePoints.length; index++) {\n result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);\n }\n this.host = result;\n } else {\n input = toASCII(input);\n if (exec(FORBIDDEN_HOST_CODE_POINT, input)) return INVALID_HOST;\n result = parseIPv4(input);\n if (result === null) return INVALID_HOST;\n this.host = result;\n }\n },\n // https://url.spec.whatwg.org/#cannot-have-a-username-password-port\n cannotHaveUsernamePasswordPort: function () {\n return !this.host || this.cannotBeABaseURL || this.scheme === 'file';\n },\n // https://url.spec.whatwg.org/#include-credentials\n includesCredentials: function () {\n return this.username !== '' || this.password !== '';\n },\n // https://url.spec.whatwg.org/#is-special\n isSpecial: function () {\n return hasOwn(specialSchemes, this.scheme);\n },\n // https://url.spec.whatwg.org/#shorten-a-urls-path\n shortenPath: function () {\n var path = this.path;\n var pathSize = path.length;\n if (pathSize && (this.scheme !== 'file' || pathSize !== 1 || !isWindowsDriveLetter(path[0], true))) {\n path.length--;\n }\n },\n // https://url.spec.whatwg.org/#concept-url-serializer\n serialize: function () {\n var url = this;\n var scheme = url.scheme;\n var username = url.username;\n var password = url.password;\n var host = url.host;\n var port = url.port;\n var path = url.path;\n var query = url.query;\n var fragment = url.fragment;\n var output = scheme + ':';\n if (host !== null) {\n output += '//';\n if (url.includesCredentials()) {\n output += username + (password ? ':' + password : '') + '@';\n }\n output += serializeHost(host);\n if (port !== null) output += ':' + port;\n } else if (scheme === 'file') output += '//';\n output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + join(path, '/') : '';\n if (query !== null) output += '?' + query;\n if (fragment !== null) output += '#' + fragment;\n return output;\n },\n // https://url.spec.whatwg.org/#dom-url-href\n setHref: function (href) {\n var failure = this.parse(href);\n if (failure) throw TypeError(failure);\n this.searchParams.update();\n },\n // https://url.spec.whatwg.org/#dom-url-origin\n getOrigin: function () {\n var scheme = this.scheme;\n var port = this.port;\n if (scheme === 'blob') try {\n return new URLConstructor(scheme.path[0]).origin;\n } catch (error) {\n return 'null';\n }\n if (scheme === 'file' || !this.isSpecial()) return 'null';\n return scheme + '://' + serializeHost(this.host) + (port !== null ? ':' + port : '');\n },\n // https://url.spec.whatwg.org/#dom-url-protocol\n getProtocol: function () {\n return this.scheme + ':';\n },\n setProtocol: function (protocol) {\n this.parse($toString(protocol) + ':', SCHEME_START);\n },\n // https://url.spec.whatwg.org/#dom-url-username\n getUsername: function () {\n return this.username;\n },\n setUsername: function (username) {\n var codePoints = arrayFrom($toString(username));\n if (this.cannotHaveUsernamePasswordPort()) return;\n this.username = '';\n for (var i = 0; i < codePoints.length; i++) {\n this.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n },\n // https://url.spec.whatwg.org/#dom-url-password\n getPassword: function () {\n return this.password;\n },\n setPassword: function (password) {\n var codePoints = arrayFrom($toString(password));\n if (this.cannotHaveUsernamePasswordPort()) return;\n this.password = '';\n for (var i = 0; i < codePoints.length; i++) {\n this.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n },\n // https://url.spec.whatwg.org/#dom-url-host\n getHost: function () {\n var host = this.host;\n var port = this.port;\n return host === null ? ''\n : port === null ? serializeHost(host)\n : serializeHost(host) + ':' + port;\n },\n setHost: function (host) {\n if (this.cannotBeABaseURL) return;\n this.parse(host, HOST);\n },\n // https://url.spec.whatwg.org/#dom-url-hostname\n getHostname: function () {\n var host = this.host;\n return host === null ? '' : serializeHost(host);\n },\n setHostname: function (hostname) {\n if (this.cannotBeABaseURL) return;\n this.parse(hostname, HOSTNAME);\n },\n // https://url.spec.whatwg.org/#dom-url-port\n getPort: function () {\n var port = this.port;\n return port === null ? '' : $toString(port);\n },\n setPort: function (port) {\n if (this.cannotHaveUsernamePasswordPort()) return;\n port = $toString(port);\n if (port === '') this.port = null;\n else this.parse(port, PORT);\n },\n // https://url.spec.whatwg.org/#dom-url-pathname\n getPathname: function () {\n var path = this.path;\n return this.cannotBeABaseURL ? path[0] : path.length ? '/' + join(path, '/') : '';\n },\n setPathname: function (pathname) {\n if (this.cannotBeABaseURL) return;\n this.path = [];\n this.parse(pathname, PATH_START);\n },\n // https://url.spec.whatwg.org/#dom-url-search\n getSearch: function () {\n var query = this.query;\n return query ? '?' + query : '';\n },\n setSearch: function (search) {\n search = $toString(search);\n if (search === '') {\n this.query = null;\n } else {\n if (charAt(search, 0) === '?') search = stringSlice(search, 1);\n this.query = '';\n this.parse(search, QUERY);\n }\n this.searchParams.update();\n },\n // https://url.spec.whatwg.org/#dom-url-searchparams\n getSearchParams: function () {\n return this.searchParams.facade;\n },\n // https://url.spec.whatwg.org/#dom-url-hash\n getHash: function () {\n var fragment = this.fragment;\n return fragment ? '#' + fragment : '';\n },\n setHash: function (hash) {\n hash = $toString(hash);\n if (hash === '') {\n this.fragment = null;\n return;\n }\n if (charAt(hash, 0) === '#') hash = stringSlice(hash, 1);\n this.fragment = '';\n this.parse(hash, FRAGMENT);\n },\n update: function () {\n this.query = this.searchParams.serialize() || null;\n }\n};\n\n// `URL` constructor\n// https://url.spec.whatwg.org/#url-class\nvar URLConstructor = function URL(url /* , base */) {\n var that = anInstance(this, URLPrototype);\n var base = validateArgumentsLength(arguments.length, 1) > 1 ? arguments[1] : undefined;\n var state = setInternalState(that, new URLState(url, false, base));\n if (!DESCRIPTORS) {\n that.href = state.serialize();\n that.origin = state.getOrigin();\n that.protocol = state.getProtocol();\n that.username = state.getUsername();\n that.password = state.getPassword();\n that.host = state.getHost();\n that.hostname = state.getHostname();\n that.port = state.getPort();\n that.pathname = state.getPathname();\n that.search = state.getSearch();\n that.searchParams = state.getSearchParams();\n that.hash = state.getHash();\n }\n};\n\nvar URLPrototype = URLConstructor.prototype;\n\nvar accessorDescriptor = function (getter, setter) {\n return {\n get: function () {\n return getInternalURLState(this)[getter]();\n },\n set: setter && function (value) {\n return getInternalURLState(this)[setter](value);\n },\n configurable: true,\n enumerable: true\n };\n};\n\nif (DESCRIPTORS) {\n // `URL.prototype.href` accessors pair\n // https://url.spec.whatwg.org/#dom-url-href\n defineBuiltInAccessor(URLPrototype, 'href', accessorDescriptor('serialize', 'setHref'));\n // `URL.prototype.origin` getter\n // https://url.spec.whatwg.org/#dom-url-origin\n defineBuiltInAccessor(URLPrototype, 'origin', accessorDescriptor('getOrigin'));\n // `URL.prototype.protocol` accessors pair\n // https://url.spec.whatwg.org/#dom-url-protocol\n defineBuiltInAccessor(URLPrototype, 'protocol', accessorDescriptor('getProtocol', 'setProtocol'));\n // `URL.prototype.username` accessors pair\n // https://url.spec.whatwg.org/#dom-url-username\n defineBuiltInAccessor(URLPrototype, 'username', accessorDescriptor('getUsername', 'setUsername'));\n // `URL.prototype.password` accessors pair\n // https://url.spec.whatwg.org/#dom-url-password\n defineBuiltInAccessor(URLPrototype, 'password', accessorDescriptor('getPassword', 'setPassword'));\n // `URL.prototype.host` accessors pair\n // https://url.spec.whatwg.org/#dom-url-host\n defineBuiltInAccessor(URLPrototype, 'host', accessorDescriptor('getHost', 'setHost'));\n // `URL.prototype.hostname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hostname\n defineBuiltInAccessor(URLPrototype, 'hostname', accessorDescriptor('getHostname', 'setHostname'));\n // `URL.prototype.port` accessors pair\n // https://url.spec.whatwg.org/#dom-url-port\n defineBuiltInAccessor(URLPrototype, 'port', accessorDescriptor('getPort', 'setPort'));\n // `URL.prototype.pathname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-pathname\n defineBuiltInAccessor(URLPrototype, 'pathname', accessorDescriptor('getPathname', 'setPathname'));\n // `URL.prototype.search` accessors pair\n // https://url.spec.whatwg.org/#dom-url-search\n defineBuiltInAccessor(URLPrototype, 'search', accessorDescriptor('getSearch', 'setSearch'));\n // `URL.prototype.searchParams` getter\n // https://url.spec.whatwg.org/#dom-url-searchparams\n defineBuiltInAccessor(URLPrototype, 'searchParams', accessorDescriptor('getSearchParams'));\n // `URL.prototype.hash` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hash\n defineBuiltInAccessor(URLPrototype, 'hash', accessorDescriptor('getHash', 'setHash'));\n}\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\ndefineBuiltIn(URLPrototype, 'toJSON', function toJSON() {\n return getInternalURLState(this).serialize();\n}, { enumerable: true });\n\n// `URL.prototype.toString` method\n// https://url.spec.whatwg.org/#URL-stringification-behavior\ndefineBuiltIn(URLPrototype, 'toString', function toString() {\n return getInternalURLState(this).serialize();\n}, { enumerable: true });\n\nif (NativeURL) {\n var nativeCreateObjectURL = NativeURL.createObjectURL;\n var nativeRevokeObjectURL = NativeURL.revokeObjectURL;\n // `URL.createObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n if (nativeCreateObjectURL) defineBuiltIn(URLConstructor, 'createObjectURL', bind(nativeCreateObjectURL, NativeURL));\n // `URL.revokeObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n if (nativeRevokeObjectURL) defineBuiltIn(URLConstructor, 'revokeObjectURL', bind(nativeRevokeObjectURL, NativeURL));\n}\n\nsetToStringTag(URLConstructor, 'URL');\n\n$({ global: true, constructor: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS }, {\n URL: URLConstructor\n});\n","'use strict';\n// TODO: Remove this module from `core-js@4` since it's replaced to module below\nrequire('../modules/web.url.constructor');\n","\"use strict\";\n\nexports.__esModule = true;\nexports.useScrollRestoration = exports.ScrollContext = void 0;\nvar _scrollHandler = require(\"./scroll-handler\");\nexports.ScrollContext = _scrollHandler.ScrollHandler;\nvar _useScrollRestoration = require(\"./use-scroll-restoration\");\nexports.useScrollRestoration = _useScrollRestoration.useScrollRestoration;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\nexports.__esModule = true;\nexports.ScrollHandler = exports.ScrollContext = void 0;\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\nvar React = _interopRequireWildcard(require(\"react\"));\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\nvar _sessionStorage = require(\"./session-storage\");\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== \"function\") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\nvar ScrollContext = /*#__PURE__*/React.createContext(new _sessionStorage.SessionStorage());\nexports.ScrollContext = ScrollContext;\nScrollContext.displayName = \"GatsbyScrollContext\";\nvar ScrollHandler = /*#__PURE__*/function (_React$Component) {\n (0, _inheritsLoose2.default)(ScrollHandler, _React$Component);\n function ScrollHandler() {\n var _this;\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n _this._stateStorage = new _sessionStorage.SessionStorage();\n _this._isTicking = false;\n _this._latestKnownScrollY = 0;\n _this.scrollListener = function () {\n _this._latestKnownScrollY = window.scrollY;\n if (!_this._isTicking) {\n _this._isTicking = true;\n requestAnimationFrame(_this._saveScroll.bind((0, _assertThisInitialized2.default)(_this)));\n }\n };\n _this.windowScroll = function (position, prevProps) {\n if (_this.shouldUpdateScroll(prevProps, _this.props)) {\n window.scrollTo(0, position);\n }\n };\n _this.scrollToHash = function (hash, prevProps) {\n var node = document.getElementById(hash.substring(1));\n if (node && _this.shouldUpdateScroll(prevProps, _this.props)) {\n node.scrollIntoView();\n }\n };\n _this.shouldUpdateScroll = function (prevRouterProps, routerProps) {\n var shouldUpdateScroll = _this.props.shouldUpdateScroll;\n if (!shouldUpdateScroll) {\n return true;\n }\n\n // Hack to allow accessing this._stateStorage.\n return shouldUpdateScroll.call((0, _assertThisInitialized2.default)(_this), prevRouterProps, routerProps);\n };\n return _this;\n }\n var _proto = ScrollHandler.prototype;\n _proto._saveScroll = function _saveScroll() {\n var key = this.props.location.key || null;\n if (key) {\n this._stateStorage.save(this.props.location, key, this._latestKnownScrollY);\n }\n this._isTicking = false;\n };\n _proto.componentDidMount = function componentDidMount() {\n window.addEventListener(\"scroll\", this.scrollListener);\n var scrollPosition;\n var _this$props$location = this.props.location,\n key = _this$props$location.key,\n hash = _this$props$location.hash;\n if (key) {\n scrollPosition = this._stateStorage.read(this.props.location, key);\n }\n\n /** If a hash is present in the browser url as the component mounts (i.e. the user is navigating\n * from an external website) then scroll to the hash instead of any previously stored scroll\n * position. */\n if (hash) {\n this.scrollToHash(decodeURI(hash), undefined);\n } else if (scrollPosition) {\n this.windowScroll(scrollPosition, undefined);\n }\n };\n _proto.componentWillUnmount = function componentWillUnmount() {\n window.removeEventListener(\"scroll\", this.scrollListener);\n };\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n var _this$props$location2 = this.props.location,\n hash = _this$props$location2.hash,\n key = _this$props$location2.key;\n var scrollPosition;\n if (key) {\n scrollPosition = this._stateStorage.read(this.props.location, key);\n }\n\n /** There are two pieces of state: the browser url and\n * history state which keeps track of scroll position\n * Native behaviour prescribes that we ought to restore scroll position\n * when a user navigates back in their browser (this is the `POP` action)\n * Currently, reach router has a bug that prevents this at https://github.com/reach/router/issues/228\n * So we _always_ stick to the url as a source of truth — if the url\n * contains a hash, we scroll to it\n */\n\n if (hash) {\n this.scrollToHash(decodeURI(hash), prevProps);\n } else {\n this.windowScroll(scrollPosition, prevProps);\n }\n };\n _proto.render = function render() {\n return /*#__PURE__*/React.createElement(ScrollContext.Provider, {\n value: this._stateStorage\n }, this.props.children);\n };\n return ScrollHandler;\n}(React.Component);\nexports.ScrollHandler = ScrollHandler;\nScrollHandler.propTypes = {\n shouldUpdateScroll: _propTypes.default.func,\n children: _propTypes.default.element.isRequired,\n location: _propTypes.default.object.isRequired\n};","\"use strict\";\n\nexports.__esModule = true;\nexports.SessionStorage = void 0;\nvar STATE_KEY_PREFIX = \"@@scroll|\";\nvar GATSBY_ROUTER_SCROLL_STATE = \"___GATSBY_REACT_ROUTER_SCROLL\";\nvar SessionStorage = /*#__PURE__*/function () {\n function SessionStorage() {}\n var _proto = SessionStorage.prototype;\n _proto.read = function read(location, key) {\n var stateKey = this.getStateKey(location, key);\n try {\n var value = window.sessionStorage.getItem(stateKey);\n return value ? JSON.parse(value) : 0;\n } catch (e) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[gatsby-react-router-scroll] Unable to access sessionStorage; sessionStorage is not available.\");\n }\n if (window && window[GATSBY_ROUTER_SCROLL_STATE] && window[GATSBY_ROUTER_SCROLL_STATE][stateKey]) {\n return window[GATSBY_ROUTER_SCROLL_STATE][stateKey];\n }\n return 0;\n }\n };\n _proto.save = function save(location, key, value) {\n var stateKey = this.getStateKey(location, key);\n var storedValue = JSON.stringify(value);\n try {\n window.sessionStorage.setItem(stateKey, storedValue);\n } catch (e) {\n if (window && window[GATSBY_ROUTER_SCROLL_STATE]) {\n window[GATSBY_ROUTER_SCROLL_STATE][stateKey] = JSON.parse(storedValue);\n } else {\n window[GATSBY_ROUTER_SCROLL_STATE] = {};\n window[GATSBY_ROUTER_SCROLL_STATE][stateKey] = JSON.parse(storedValue);\n }\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[gatsby-react-router-scroll] Unable to save state in sessionStorage; sessionStorage is not available.\");\n }\n }\n };\n _proto.getStateKey = function getStateKey(location, key) {\n var stateKeyBase = \"\" + STATE_KEY_PREFIX + location.pathname;\n return key === null || typeof key === \"undefined\" ? stateKeyBase : stateKeyBase + \"|\" + key;\n };\n return SessionStorage;\n}();\nexports.SessionStorage = SessionStorage;","\"use strict\";\n\nexports.__esModule = true;\nexports.useScrollRestoration = useScrollRestoration;\nvar _scrollHandler = require(\"./scroll-handler\");\nvar _react = require(\"react\");\nvar _reachRouter = require(\"@gatsbyjs/reach-router\");\nfunction useScrollRestoration(identifier) {\n var location = (0, _reachRouter.useLocation)();\n var state = (0, _react.useContext)(_scrollHandler.ScrollContext);\n var ref = (0, _react.useRef)(null);\n (0, _react.useLayoutEffect)(function () {\n if (ref.current) {\n var position = state.read(location, identifier);\n ref.current.scrollTo(0, position || 0);\n }\n }, [location.key]);\n return {\n ref: ref,\n onScroll: function onScroll() {\n if (ref.current) {\n state.save(location, identifier, ref.current.scrollTop);\n }\n }\n };\n}","exports.components = {\n \"component---cache-caches-gatsby-plugin-offline-app-shell-js\": () => import(\"./../../caches/gatsby-plugin-offline/app-shell.js\" /* webpackChunkName: \"component---cache-caches-gatsby-plugin-offline-app-shell-js\" */),\n \"component---src-pages-404-js\": () => import(\"./../../../src/pages/404.js\" /* webpackChunkName: \"component---src-pages-404-js\" */),\n \"component---src-pages-posts-js\": () => import(\"./../../../src/pages/posts.js\" /* webpackChunkName: \"component---src-pages-posts-js\" */),\n \"component---src-templates-post-index-js-content-file-path-content-api-gm-md\": () => import(\"./../../../src/templates/post/index.js?__contentFilePath=/home/runner/work/violentmonkey.github.io/violentmonkey.github.io/content/api/gm.md\" /* webpackChunkName: \"component---src-templates-post-index-js-content-file-path-content-api-gm-md\" */),\n \"component---src-templates-post-index-js-content-file-path-content-api-matching-md\": () => import(\"./../../../src/templates/post/index.js?__contentFilePath=/home/runner/work/violentmonkey.github.io/violentmonkey.github.io/content/api/matching.md\" /* webpackChunkName: \"component---src-templates-post-index-js-content-file-path-content-api-matching-md\" */),\n \"component---src-templates-post-index-js-content-file-path-content-api-metadata-block-md\": () => import(\"./../../../src/templates/post/index.js?__contentFilePath=/home/runner/work/violentmonkey.github.io/violentmonkey.github.io/content/api/metadata-block.md\" /* webpackChunkName: \"component---src-templates-post-index-js-content-file-path-content-api-metadata-block-md\" */),\n \"component---src-templates-post-index-js-content-file-path-content-faq-index-md\": () => import(\"./../../../src/templates/post/index.js?__contentFilePath=/home/runner/work/violentmonkey.github.io/violentmonkey.github.io/content/faq/index.md\" /* webpackChunkName: \"component---src-templates-post-index-js-content-file-path-content-faq-index-md\" */),\n \"component---src-templates-post-index-js-content-file-path-content-get-it-index-md\": () => import(\"./../../../src/templates/post/index.js?__contentFilePath=/home/runner/work/violentmonkey.github.io/violentmonkey.github.io/content/get-it/index.md\" /* webpackChunkName: \"component---src-templates-post-index-js-content-file-path-content-get-it-index-md\" */),\n \"component---src-templates-post-index-js-content-file-path-content-guide-creating-a-userscript-index-md\": () => import(\"./../../../src/templates/post/index.js?__contentFilePath=/home/runner/work/violentmonkey.github.io/violentmonkey.github.io/content/guide/creating-a-userscript/index.md\" /* webpackChunkName: \"component---src-templates-post-index-js-content-file-path-content-guide-creating-a-userscript-index-md\" */),\n \"component---src-templates-post-index-js-content-file-path-content-guide-keyboard-shortcuts-index-mdx\": () => import(\"./../../../src/templates/post/index.js?__contentFilePath=/home/runner/work/violentmonkey.github.io/violentmonkey.github.io/content/guide/keyboard-shortcuts/index.mdx\" /* webpackChunkName: \"component---src-templates-post-index-js-content-file-path-content-guide-keyboard-shortcuts-index-mdx\" */),\n \"component---src-templates-post-index-js-content-file-path-content-guide-observing-dom-index-md\": () => import(\"./../../../src/templates/post/index.js?__contentFilePath=/home/runner/work/violentmonkey.github.io/violentmonkey.github.io/content/guide/observing-dom/index.md\" /* webpackChunkName: \"component---src-templates-post-index-js-content-file-path-content-guide-observing-dom-index-md\" */),\n \"component---src-templates-post-index-js-content-file-path-content-guide-using-modern-syntax-index-md\": () => import(\"./../../../src/templates/post/index.js?__contentFilePath=/home/runner/work/violentmonkey.github.io/violentmonkey.github.io/content/guide/using-modern-syntax/index.md\" /* webpackChunkName: \"component---src-templates-post-index-js-content-file-path-content-guide-using-modern-syntax-index-md\" */),\n \"component---src-templates-post-index-js-content-file-path-content-index-md\": () => import(\"./../../../src/templates/post/index.js?__contentFilePath=/home/runner/work/violentmonkey.github.io/violentmonkey.github.io/content/index.md\" /* webpackChunkName: \"component---src-templates-post-index-js-content-file-path-content-index-md\" */),\n \"component---src-templates-post-index-js-content-file-path-content-localization-index-md\": () => import(\"./../../../src/templates/post/index.js?__contentFilePath=/home/runner/work/violentmonkey.github.io/violentmonkey.github.io/content/localization/index.md\" /* webpackChunkName: \"component---src-templates-post-index-js-content-file-path-content-localization-index-md\" */),\n \"component---src-templates-post-index-js-content-file-path-content-posts-features-in-userscript-generator-md\": () => import(\"./../../../src/templates/post/index.js?__contentFilePath=/home/runner/work/violentmonkey.github.io/violentmonkey.github.io/content/posts/features-in-userscript-generator.md\" /* webpackChunkName: \"component---src-templates-post-index-js-content-file-path-content-posts-features-in-userscript-generator-md\" */),\n \"component---src-templates-post-index-js-content-file-path-content-posts-how-to-edit-scripts-with-your-favorite-editor-index-md\": () => import(\"./../../../src/templates/post/index.js?__contentFilePath=/home/runner/work/violentmonkey.github.io/violentmonkey.github.io/content/posts/how-to-edit-scripts-with-your-favorite-editor/index.md\" /* webpackChunkName: \"component---src-templates-post-index-js-content-file-path-content-posts-how-to-edit-scripts-with-your-favorite-editor-index-md\" */),\n \"component---src-templates-post-index-js-content-file-path-content-posts-inject-into-context-md\": () => import(\"./../../../src/templates/post/index.js?__contentFilePath=/home/runner/work/violentmonkey.github.io/violentmonkey.github.io/content/posts/inject-into-context.md\" /* webpackChunkName: \"component---src-templates-post-index-js-content-file-path-content-posts-inject-into-context-md\" */),\n \"component---src-templates-post-index-js-content-file-path-content-posts-inject-scripts-with-blob-urls-md\": () => import(\"./../../../src/templates/post/index.js?__contentFilePath=/home/runner/work/violentmonkey.github.io/violentmonkey.github.io/content/posts/inject-scripts-with-blob-urls.md\" /* webpackChunkName: \"component---src-templates-post-index-js-content-file-path-content-posts-inject-scripts-with-blob-urls-md\" */),\n \"component---src-templates-post-index-js-content-file-path-content-posts-smart-rules-for-blacklist-md\": () => import(\"./../../../src/templates/post/index.js?__contentFilePath=/home/runner/work/violentmonkey.github.io/violentmonkey.github.io/content/posts/smart-rules-for-blacklist.md\" /* webpackChunkName: \"component---src-templates-post-index-js-content-file-path-content-posts-smart-rules-for-blacklist-md\" */),\n \"component---src-templates-post-index-js-content-file-path-content-posts-violentmonkey-workflows-md\": () => import(\"./../../../src/templates/post/index.js?__contentFilePath=/home/runner/work/violentmonkey.github.io/violentmonkey.github.io/content/posts/violentmonkey-workflows.md\" /* webpackChunkName: \"component---src-templates-post-index-js-content-file-path-content-posts-violentmonkey-workflows-md\" */),\n \"component---src-templates-post-index-js-content-file-path-content-privacy-index-md\": () => import(\"./../../../src/templates/post/index.js?__contentFilePath=/home/runner/work/violentmonkey.github.io/violentmonkey.github.io/content/privacy/index.md\" /* webpackChunkName: \"component---src-templates-post-index-js-content-file-path-content-privacy-index-md\" */),\n \"component---src-templates-post-index-js-content-file-path-src-components-install-beta-mdx\": () => import(\"./../../../src/templates/post/index.js?__contentFilePath=/home/runner/work/violentmonkey.github.io/violentmonkey.github.io/src/components/install-beta.mdx\" /* webpackChunkName: \"component---src-templates-post-index-js-content-file-path-src-components-install-beta-mdx\" */),\n \"component---src-templates-post-index-js-content-file-path-src-components-install-stable-mdx\": () => import(\"./../../../src/templates/post/index.js?__contentFilePath=/home/runner/work/violentmonkey.github.io/violentmonkey.github.io/src/components/install-stable.mdx\" /* webpackChunkName: \"component---src-templates-post-index-js-content-file-path-src-components-install-stable-mdx\" */)\n}\n\n","module.exports = [{\n plugin: require('../node_modules/.pnpm/gatsby-plugin-google-gtag@5.11.0_gatsby@5.11.0_react-dom@18.2.0_react@18.2.0/node_modules/gatsby-plugin-google-gtag/gatsby-browser.js'),\n options: {\"plugins\":[],\"trackingIds\":[\"G-2E0X3LSCBM\"],\"gtagConfig\":{\"anonymize_ip\":true},\"pluginConfig\":{\"exclude\":[\"/auth_**\"],\"head\":false,\"respectDNT\":false,\"origin\":\"https://www.googletagmanager.com\",\"delayOnRouteUpdate\":0}},\n },{\n plugin: require('../node_modules/.pnpm/gatsby-plugin-manifest@5.11.0_gatsby@5.11.0_graphql@16.8.0/node_modules/gatsby-plugin-manifest/gatsby-browser.js'),\n options: {\"plugins\":[],\"icon\":\"src/assets/vm.png\",\"legacy\":true,\"theme_color_in_head\":true,\"cache_busting_mode\":\"query\",\"crossOrigin\":\"anonymous\",\"include_favicon\":true,\"cacheDigest\":\"e0d9ed50fb982761b0f7cdea8b093ae9\"},\n },{\n plugin: require('../node_modules/.pnpm/gatsby-plugin-offline@6.11.0_gatsby@5.11.0_react-dom@18.2.0_react@18.2.0/node_modules/gatsby-plugin-offline/gatsby-browser.js'),\n options: {\"plugins\":[]},\n },{\n plugin: require('../node_modules/.pnpm/gatsby-remark-autolink-headers@6.11.0_gatsby@5.11.0_react-dom@18.2.0_react@18.2.0/node_modules/gatsby-remark-autolink-headers/gatsby-browser.js'),\n options: {\"plugins\":[],\"offsetY\":70,\"className\":\"anchor\"},\n },{\n plugin: require('../node_modules/.pnpm/gatsby-remark-images@7.11.0_gatsby-plugin-sharp@5.11.0_gatsby@5.11.0/node_modules/gatsby-remark-images/gatsby-browser.js'),\n options: {\"plugins\":[],\"backgroundColor\":\"transparent\",\"linkImagesToOriginal\":false,\"maxWidth\":650,\"showCaptions\":false,\"markdownCaptions\":false,\"quality\":50,\"withWebp\":false,\"withAvif\":false,\"loading\":\"lazy\",\"decoding\":\"async\",\"disableBgImageOnAlpha\":false,\"disableBgImage\":false},\n },{\n plugin: require('../node_modules/.pnpm/gatsby-plugin-catch-links@5.11.0_gatsby@5.11.0/node_modules/gatsby-plugin-catch-links/gatsby-browser.js'),\n options: {\"plugins\":[]},\n },{\n plugin: require('../gatsby-browser.js'),\n options: {\"plugins\":[]},\n },{\n plugin: require('../node_modules/.pnpm/gatsby@5.11.0_babel-eslint@10.1.0_react-dom@18.2.0_react@18.2.0_typescript@5.1.6/node_modules/gatsby/dist/internal-plugins/partytown/gatsby-browser.js'),\n options: {\"plugins\":[]},\n }]\n","const plugins = require(`./api-runner-browser-plugins`)\nconst { getResourceURLsForPathname, loadPage, loadPageSync } =\n require(`./loader`).publicLoader\n\nexports.apiRunner = (api, args = {}, defaultReturn, argTransform) => {\n // Hooks for gatsby-cypress's API handler\n if (process.env.CYPRESS_SUPPORT) {\n if (window.___apiHandler) {\n window.___apiHandler(api)\n } else if (window.___resolvedAPIs) {\n window.___resolvedAPIs.push(api)\n } else {\n window.___resolvedAPIs = [api]\n }\n }\n\n let results = plugins.map(plugin => {\n if (!plugin.plugin[api]) {\n return undefined\n }\n\n args.getResourceURLsForPathname = getResourceURLsForPathname\n args.loadPage = loadPage\n args.loadPageSync = loadPageSync\n\n const result = plugin.plugin[api](args, plugin.options)\n if (result && argTransform) {\n args = argTransform({ args, result, plugin })\n }\n return result\n })\n\n // Filter out undefined results.\n results = results.filter(result => typeof result !== `undefined`)\n\n if (results.length > 0) {\n return results\n } else if (defaultReturn) {\n return [defaultReturn]\n } else {\n return []\n }\n}\n\nexports.apiRunnerAsync = (api, args, defaultReturn) =>\n plugins.reduce(\n (previous, next) =>\n next.plugin[api]\n ? previous.then(() => next.plugin[api](args, next.options))\n : previous,\n Promise.resolve()\n )\n","exports.createContentDigest = () => ``\n","import mitt from \"mitt\"\n\nconst emitter = mitt()\nexport default emitter\n","// \n// An event handler can take an optional event argument\n// and should not return a value\n \n \n\n// An array of all currently registered event handlers for a type\n \n \n// A map of event types and their corresponding event handlers.\n \n \n \n \n\n/** Mitt: Tiny (~200b) functional event emitter / pubsub.\n * @name mitt\n * @returns {Mitt}\n */\nfunction mitt(all ) {\n\tall = all || Object.create(null);\n\n\treturn {\n\t\t/**\n\t\t * Register an event handler for the given type.\n\t\t *\n\t\t * @param {String} type\tType of event to listen for, or `\"*\"` for all events\n\t\t * @param {Function} handler Function to call in response to given event\n\t\t * @memberOf mitt\n\t\t */\n\t\ton: function on(type , handler ) {\n\t\t\t(all[type] || (all[type] = [])).push(handler);\n\t\t},\n\n\t\t/**\n\t\t * Remove an event handler for the given type.\n\t\t *\n\t\t * @param {String} type\tType of event to unregister `handler` from, or `\"*\"`\n\t\t * @param {Function} handler Handler function to remove\n\t\t * @memberOf mitt\n\t\t */\n\t\toff: function off(type , handler ) {\n\t\t\tif (all[type]) {\n\t\t\t\tall[type].splice(all[type].indexOf(handler) >>> 0, 1);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Invoke all handlers for the given type.\n\t\t * If present, `\"*\"` handlers are invoked after type-matched handlers.\n\t\t *\n\t\t * @param {String} type The event type to invoke\n\t\t * @param {Any} [evt] Any value (object is recommended and powerful), passed to each handler\n\t\t * @memberOf mitt\n\t\t */\n\t\temit: function emit(type , evt ) {\n\t\t\t(all[type] || []).slice().map(function (handler) { handler(evt); });\n\t\t\t(all['*'] || []).slice().map(function (handler) { handler(type, evt); });\n\t\t}\n\t};\n}\n\nexport default mitt;\n//# sourceMappingURL=mitt.es.js.map\n","export default pathAndSearch => {\n if (pathAndSearch === undefined) {\n return pathAndSearch\n }\n let [path, search = ``] = pathAndSearch.split(`?`)\n if (search) {\n search = `?` + search\n }\n\n if (path === `/`) {\n return `/` + search\n }\n if (path.charAt(path.length - 1) === `/`) {\n return path.slice(0, -1) + search\n }\n return path + search\n}\n","import { pick } from \"@gatsbyjs/reach-router\"\nimport stripPrefix from \"./strip-prefix\"\nimport normalizePagePath from \"./normalize-page-path\"\nimport { maybeGetBrowserRedirect } from \"./redirect-utils.js\"\n\nconst pathCache = new Map()\nlet matchPaths = []\n\nconst trimPathname = rawPathname => {\n let newRawPathname = rawPathname\n const queryIndex = rawPathname.indexOf(`?`)\n\n if (queryIndex !== -1) {\n const [path, qs] = rawPathname.split(`?`)\n newRawPathname = `${path}?${encodeURIComponent(qs)}`\n }\n\n const pathname = decodeURIComponent(newRawPathname)\n\n // Remove the pathPrefix from the pathname.\n const trimmedPathname = stripPrefix(\n pathname,\n decodeURIComponent(__BASE_PATH__)\n )\n // Remove any hashfragment\n .split(`#`)[0]\n\n return trimmedPathname\n}\n\nfunction absolutify(path) {\n // If it's already absolute, return as-is\n if (\n path.startsWith(`/`) ||\n path.startsWith(`https://`) ||\n path.startsWith(`http://`)\n ) {\n return path\n }\n // Calculate path relative to current location, adding a trailing slash to\n // match behavior of @reach/router\n return new URL(\n path,\n window.location.href + (window.location.href.endsWith(`/`) ? `` : `/`)\n ).pathname\n}\n\n/**\n * Set list of matchPaths\n *\n * @param {Array<{path: string, matchPath: string}>} value collection of matchPaths\n */\nexport const setMatchPaths = value => {\n matchPaths = value\n}\n\n/**\n * Return a matchpath url\n * if `match-paths.json` contains `{ \"/foo*\": \"/page1\", ...}`, then\n * `/foo?bar=far` => `/page1`\n *\n * @param {string} rawPathname A raw pathname\n * @return {string|null}\n */\nexport const findMatchPath = rawPathname => {\n const trimmedPathname = cleanPath(rawPathname)\n\n const pickPaths = matchPaths.map(({ path, matchPath }) => {\n return {\n path: matchPath,\n originalPath: path,\n }\n })\n\n const path = pick(pickPaths, trimmedPathname)\n\n if (path) {\n return normalizePagePath(path.route.originalPath)\n }\n\n return null\n}\n\n/**\n * Return a matchpath params from reach/router rules\n * if `match-paths.json` contains `{ \":bar/*foo\" }`, and the path is /baz/zaz/zoo\n * then it returns\n * { bar: baz, foo: zaz/zoo }\n *\n * @param {string} rawPathname A raw pathname\n * @return {object}\n */\nexport const grabMatchParams = rawPathname => {\n const trimmedPathname = cleanPath(rawPathname)\n\n const pickPaths = matchPaths.map(({ path, matchPath }) => {\n return {\n path: matchPath,\n originalPath: path,\n }\n })\n\n const path = pick(pickPaths, trimmedPathname)\n\n if (path) {\n return path.params\n }\n\n return {}\n}\n\n// Given a raw URL path, returns the cleaned version of it (trim off\n// `#` and query params), or if it matches an entry in\n// `match-paths.json`, its matched path is returned\n//\n// E.g. `/foo?bar=far` => `/foo`\n//\n// Or if `match-paths.json` contains `{ \"/foo*\": \"/page1\", ...}`, then\n// `/foo?bar=far` => `/page1`\nexport const findPath = rawPathname => {\n const trimmedPathname = trimPathname(absolutify(rawPathname))\n if (pathCache.has(trimmedPathname)) {\n return pathCache.get(trimmedPathname)\n }\n\n const redirect = maybeGetBrowserRedirect(rawPathname)\n if (redirect) {\n return findPath(redirect.toPath)\n }\n\n let foundPath = findMatchPath(trimmedPathname)\n\n if (!foundPath) {\n foundPath = cleanPath(rawPathname)\n }\n\n pathCache.set(trimmedPathname, foundPath)\n\n return foundPath\n}\n\n/**\n * Clean a url and converts /index.html => /\n * E.g. `/foo?bar=far` => `/foo`\n *\n * @param {string} rawPathname A raw pathname\n * @return {string}\n */\nexport const cleanPath = rawPathname => {\n const trimmedPathname = trimPathname(absolutify(rawPathname))\n\n let foundPath = trimmedPathname\n if (foundPath === `/index.html`) {\n foundPath = `/`\n }\n\n foundPath = normalizePagePath(foundPath)\n\n return foundPath\n}\n","import React from \"react\"\n\nexport const ServerSliceRenderer = ({ sliceId, children }) => {\n const contents = [\n React.createElement(`slice-start`, {\n id: `${sliceId}-1`,\n }),\n React.createElement(`slice-end`, {\n id: `${sliceId}-1`,\n }),\n ]\n\n if (children) {\n // if children exist, we split the slice into a before and after piece\n // see renderSlices in render-html\n contents.push(children)\n contents.push(\n React.createElement(`slice-start`, {\n id: `${sliceId}-2`,\n }),\n React.createElement(`slice-end`, {\n id: `${sliceId}-2`,\n })\n )\n }\n\n return contents\n}\n","import React, { useContext } from \"react\"\nimport { createContentDigest } from \"gatsby-core-utils/create-content-digest\"\nimport { SlicesMapContext, SlicesPropsContext } from \"./context\"\nimport { ServerSliceRenderer } from \"./server-slice-renderer\"\n\nconst getSliceId = (sliceName, sliceProps) => {\n if (!Object.keys(sliceProps).length) {\n return sliceName\n }\n\n const propsString = createContentDigest(sliceProps)\n return `${sliceName}-${propsString}`\n}\n\nexport const ServerSlice = ({\n sliceName,\n allowEmpty,\n children,\n ...sliceProps\n}) => {\n const slicesMap = useContext(SlicesMapContext)\n const slicesProps = useContext(SlicesPropsContext)\n const concreteSliceName = slicesMap[sliceName]\n\n if (!concreteSliceName) {\n if (allowEmpty) {\n return null\n } else {\n throw new Error(\n `Slice \"${concreteSliceName}\" for \"${sliceName}\" slot not found`\n )\n }\n }\n\n const sliceId = getSliceId(concreteSliceName, sliceProps)\n\n // set props on context object for static-entry to return\n let sliceUsage = slicesProps[sliceId]\n if (!sliceUsage) {\n slicesProps[sliceId] = sliceUsage = {\n props: sliceProps,\n sliceName: concreteSliceName,\n hasChildren: !!children,\n }\n } else {\n if (children) {\n sliceUsage.hasChildren = true\n }\n }\n\n return {children}\n}\n","import React, { useContext } from \"react\"\nimport { SlicesMapContext, SlicesResultsContext } from \"./context\"\n\nexport const InlineSlice = ({\n sliceName,\n allowEmpty,\n children,\n ...sliceProps\n}) => {\n const slicesMap = useContext(SlicesMapContext)\n const slicesResultsMap = useContext(SlicesResultsContext)\n const concreteSliceName = slicesMap[sliceName]\n const slice = slicesResultsMap.get(concreteSliceName)\n\n if (!slice) {\n if (allowEmpty) {\n return null\n } else {\n throw new Error(\n `Slice \"${concreteSliceName}\" for \"${sliceName}\" slot not found`\n )\n }\n }\n\n return (\n \n {children}\n \n )\n}\n","\"use client\"\n\nimport React, { useContext } from \"react\"\nimport { ServerSlice } from \"./slice/server-slice\"\nimport { InlineSlice } from \"./slice/inline-slice\"\nimport { SlicesContext } from \"./slice/context\"\n\nexport function Slice(props) {\n if (process.env.GATSBY_SLICES) {\n // we use sliceName internally, so remap alias to sliceName\n const internalProps = {\n ...props,\n sliceName: props.alias,\n }\n delete internalProps.alias\n delete internalProps.__renderedByLocation\n\n const slicesContext = useContext(SlicesContext)\n\n // validate props\n const propErrors = validateSliceProps(props)\n if (Object.keys(propErrors).length) {\n throw new SlicePropsError(\n slicesContext.renderEnvironment === `browser`,\n internalProps.sliceName,\n propErrors,\n props.__renderedByLocation\n )\n }\n\n if (slicesContext.renderEnvironment === `server`) {\n return \n } else if (slicesContext.renderEnvironment === `browser`) {\n // in the browser, we'll just render the component as is\n return \n } else if (\n slicesContext.renderEnvironment === `engines` ||\n slicesContext.renderEnvironment === `dev-ssr`\n ) {\n // if we're in SSR, we'll just render the component as is\n return \n } else if (slicesContext.renderEnvironment === `slices`) {\n // we are not yet supporting nested slices\n\n let additionalContextMessage = ``\n\n // just in case generating additional contextual information fails, we still want the base message to show\n // and not show another cryptic error message\n try {\n additionalContextMessage = `\\n\\nSlice component \"${slicesContext.sliceRoot.name}\" (${slicesContext.sliceRoot.componentPath}) tried to render `\n } catch {\n // don't need to handle it, we will just skip the additional context message if we fail to generate it\n }\n\n throw new Error(\n `Nested slices are not supported.${additionalContextMessage}\\n\\nSee https://gatsbyjs.com/docs/reference/built-in-components/gatsby-slice#nested-slices`\n )\n } else {\n throw new Error(\n `Slice context \"${slicesContext.renderEnvironment}\" is not supported.`\n )\n }\n } else {\n throw new Error(`Slices are disabled.`)\n }\n}\n\nclass SlicePropsError extends Error {\n constructor(inBrowser, sliceName, propErrors, renderedByLocation) {\n const errors = Object.entries(propErrors)\n .map(\n ([key, value]) =>\n `not serializable \"${value}\" type passed to \"${key}\" prop`\n )\n .join(`, `)\n\n const name = `SlicePropsError`\n let stack = ``\n let message = ``\n\n if (inBrowser) {\n // They're just (kinda) kidding, I promise... You can still work here <3\n // https://www.gatsbyjs.com/careers/\n const fullStack =\n React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactDebugCurrentFrame.getCurrentStack()\n\n // remove the first line of the stack trace\n const stackLines = fullStack.trim().split(`\\n`).slice(1)\n stackLines[0] = stackLines[0].trim()\n stack = `\\n` + stackLines.join(`\\n`)\n\n message = `Slice \"${sliceName}\" was passed props that are not serializable (${errors}).`\n } else {\n // we can't really grab any extra info outside of the browser, so just print what we can\n message = `${name}: Slice \"${sliceName}\" was passed props that are not serializable (${errors}).`\n const stackLines = new Error().stack.trim().split(`\\n`).slice(2)\n stack = `${message}\\n${stackLines.join(`\\n`)}`\n }\n\n super(message)\n this.name = name\n if (stack) {\n this.stack = stack\n } else {\n Error.captureStackTrace(this, SlicePropsError)\n }\n\n if (renderedByLocation) {\n this.forcedLocation = { ...renderedByLocation, functionName: `Slice` }\n }\n }\n}\n\nconst validateSliceProps = (\n props,\n errors = {},\n seenObjects = [],\n path = null\n) => {\n // recursively validate all props\n for (const [name, value] of Object.entries(props)) {\n if (\n value === undefined ||\n value === null ||\n (!path && name === `children`)\n ) {\n continue\n }\n\n const propPath = path ? `${path}.${name}` : name\n\n if (typeof value === `function`) {\n errors[propPath] = typeof value\n } else if (typeof value === `object` && seenObjects.indexOf(value) <= 0) {\n seenObjects.push(value)\n validateSliceProps(value, errors, seenObjects, propPath)\n }\n }\n\n return errors\n}\n","import loader from \"./loader\"\n\nconst prefetchPathname = loader.enqueue\n\nfunction graphql() {\n throw new Error(\n `It appears like Gatsby is misconfigured. Gatsby related \\`graphql\\` calls ` +\n `are supposed to only be evaluated at compile time, and then compiled away. ` +\n `Unfortunately, something went wrong and the query was left in the compiled code.\\n\\n` +\n `Unless your site has a complex or custom babel/Gatsby configuration this is likely a bug in Gatsby.`\n )\n}\n\nexport { default as PageRenderer } from \"./public-page-renderer\"\nexport { useScrollRestoration } from \"gatsby-react-router-scroll\"\nexport {\n Link,\n withPrefix,\n withAssetPrefix,\n navigate,\n parsePath,\n} from \"gatsby-link\"\n\nexport { graphql, prefetchPathname }\nexport { StaticQuery, StaticQueryContext, useStaticQuery } from \"./static-query\"\nexport { Slice } from \"./slice\"\nexport * from \"gatsby-script\"\n","const support = function (feature) {\n if (typeof document === `undefined`) {\n return false\n }\n const fakeLink = document.createElement(`link`)\n try {\n if (fakeLink.relList && typeof fakeLink.relList.supports === `function`) {\n return fakeLink.relList.supports(feature)\n }\n } catch (err) {\n return false\n }\n return false\n}\n\nconst linkPrefetchStrategy = function (url, options) {\n return new Promise((resolve, reject) => {\n if (typeof document === `undefined`) {\n reject()\n return\n }\n\n const link = document.createElement(`link`)\n link.setAttribute(`rel`, `prefetch`)\n link.setAttribute(`href`, url)\n\n Object.keys(options).forEach(key => {\n link.setAttribute(key, options[key])\n })\n\n link.onload = resolve\n link.onerror = reject\n\n const parentElement =\n document.getElementsByTagName(`head`)[0] ||\n document.getElementsByName(`script`)[0].parentNode\n parentElement.appendChild(link)\n })\n}\n\nconst xhrPrefetchStrategy = function (url) {\n return new Promise((resolve, reject) => {\n const req = new XMLHttpRequest()\n req.open(`GET`, url, true)\n\n req.onload = () => {\n if (req.status === 200) {\n resolve()\n } else {\n reject()\n }\n }\n\n req.send(null)\n })\n}\n\nconst supportedPrefetchStrategy = support(`prefetch`)\n ? linkPrefetchStrategy\n : xhrPrefetchStrategy\n\nconst preFetched = {}\n\nconst prefetch = function (url, options) {\n return new Promise(resolve => {\n if (preFetched[url]) {\n resolve()\n return\n }\n\n supportedPrefetchStrategy(url, options)\n .then(() => {\n resolve()\n preFetched[url] = true\n })\n .catch(() => {}) // 404s are logged to the console anyway\n })\n}\n\nexport default prefetch\n","import { createFromReadableStream } from \"react-server-dom-webpack\"\nimport prefetchHelper from \"./prefetch\"\nimport emitter from \"./emitter\"\nimport { setMatchPaths, findPath, findMatchPath } from \"./find-path\"\n\n/**\n * Available resource loading statuses\n */\nexport const PageResourceStatus = {\n /**\n * At least one of critical resources failed to load\n */\n Error: `error`,\n /**\n * Resources loaded successfully\n */\n Success: `success`,\n}\n\nconst preferDefault = m => (m && m.default) || m\n\nconst stripSurroundingSlashes = s => {\n s = s[0] === `/` ? s.slice(1) : s\n s = s.endsWith(`/`) ? s.slice(0, -1) : s\n return s\n}\n\nconst createPageDataUrl = rawPath => {\n const [path, maybeSearch] = rawPath.split(`?`)\n const fixedPath = path === `/` ? `index` : stripSurroundingSlashes(path)\n return `${__PATH_PREFIX__}/page-data/${fixedPath}/page-data.json${\n maybeSearch ? `?${maybeSearch}` : ``\n }`\n}\n\n/**\n * Utility to check the path that goes into doFetch for e.g. potential malicious intentions.\n * It checks for \"//\" because with this you could do a fetch request to a different domain.\n */\nconst shouldAbortFetch = rawPath => rawPath.startsWith(`//`)\n\nfunction doFetch(url, method = `GET`) {\n return new Promise(resolve => {\n const req = new XMLHttpRequest()\n req.open(method, url, true)\n req.onreadystatechange = () => {\n if (req.readyState == 4) {\n resolve(req)\n }\n }\n req.send(null)\n })\n}\n\nconst doesConnectionSupportPrefetch = () => {\n if (\n `connection` in navigator &&\n typeof navigator.connection !== `undefined`\n ) {\n if ((navigator.connection.effectiveType || ``).includes(`2g`)) {\n return false\n }\n if (navigator.connection.saveData) {\n return false\n }\n }\n return true\n}\n\n// Regex that matches common search crawlers\nconst BOT_REGEX = /bot|crawler|spider|crawling/i\n\nconst toPageResources = (pageData, component = null, head) => {\n const page = {\n componentChunkName: pageData.componentChunkName,\n path: pageData.path,\n webpackCompilationHash: pageData.webpackCompilationHash,\n matchPath: pageData.matchPath,\n staticQueryHashes: pageData.staticQueryHashes,\n getServerDataError: pageData.getServerDataError,\n slicesMap: pageData.slicesMap ?? {},\n }\n\n return {\n component,\n head,\n json: pageData.result,\n page,\n }\n}\n\nfunction waitForResponse(response) {\n return new Promise(resolve => {\n try {\n const result = response.readRoot()\n resolve(result)\n } catch (err) {\n if (\n Object.hasOwnProperty.call(err, `_response`) &&\n Object.hasOwnProperty.call(err, `_status`)\n ) {\n setTimeout(() => {\n waitForResponse(response).then(resolve)\n }, 200)\n } else {\n throw err\n }\n }\n })\n}\n\nexport class BaseLoader {\n constructor(loadComponent, matchPaths) {\n // Map of pagePath -> Page. Where Page is an object with: {\n // status: PageResourceStatus.Success || PageResourceStatus.Error,\n // payload: PageResources, // undefined if PageResourceStatus.Error\n // }\n // PageResources is {\n // component,\n // json: pageData.result,\n // page: {\n // componentChunkName,\n // path,\n // webpackCompilationHash,\n // staticQueryHashes\n // },\n // staticQueryResults\n // }\n this.pageDb = new Map()\n this.inFlightDb = new Map()\n this.staticQueryDb = {}\n this.pageDataDb = new Map()\n this.partialHydrationDb = new Map()\n this.slicesDataDb = new Map()\n this.sliceInflightDb = new Map()\n this.slicesDb = new Map()\n this.isPrefetchQueueRunning = false\n this.prefetchQueued = []\n this.prefetchTriggered = new Set()\n this.prefetchCompleted = new Set()\n this.loadComponent = loadComponent\n setMatchPaths(matchPaths)\n }\n\n inFlightNetworkRequests = new Map()\n\n memoizedGet(url) {\n let inFlightPromise = this.inFlightNetworkRequests.get(url)\n\n if (!inFlightPromise) {\n inFlightPromise = doFetch(url, `GET`)\n this.inFlightNetworkRequests.set(url, inFlightPromise)\n }\n\n // Prefer duplication with then + catch over .finally to prevent problems in ie11 + firefox\n return inFlightPromise\n .then(response => {\n this.inFlightNetworkRequests.delete(url)\n return response\n })\n .catch(err => {\n this.inFlightNetworkRequests.delete(url)\n throw err\n })\n }\n\n setApiRunner(apiRunner) {\n this.apiRunner = apiRunner\n this.prefetchDisabled = apiRunner(`disableCorePrefetching`).some(a => a)\n }\n\n fetchPageDataJson(loadObj) {\n const { pagePath, retries = 0 } = loadObj\n const url = createPageDataUrl(pagePath)\n return this.memoizedGet(url).then(req => {\n const { status, responseText } = req\n\n // Handle 200\n if (status === 200) {\n try {\n const jsonPayload = JSON.parse(responseText)\n if (jsonPayload.path === undefined) {\n throw new Error(`not a valid pageData response`)\n }\n\n const maybeSearch = pagePath.split(`?`)[1]\n if (maybeSearch && !jsonPayload.path.includes(maybeSearch)) {\n jsonPayload.path += `?${maybeSearch}`\n }\n\n return Object.assign(loadObj, {\n status: PageResourceStatus.Success,\n payload: jsonPayload,\n })\n } catch (err) {\n // continue regardless of error\n }\n }\n\n // Handle 404\n if (status === 404 || status === 200) {\n // If the request was for a 404/500 page and it doesn't exist, we're done\n if (pagePath === `/404.html` || pagePath === `/500.html`) {\n return Object.assign(loadObj, {\n status: PageResourceStatus.Error,\n })\n }\n\n // Need some code here to cache the 404 request. In case\n // multiple loadPageDataJsons result in 404s\n return this.fetchPageDataJson(\n Object.assign(loadObj, { pagePath: `/404.html`, notFound: true })\n )\n }\n\n // handle 500 response (Unrecoverable)\n if (status === 500) {\n return this.fetchPageDataJson(\n Object.assign(loadObj, {\n pagePath: `/500.html`,\n internalServerError: true,\n })\n )\n }\n\n // Handle everything else, including status === 0, and 503s. Should retry\n if (retries < 3) {\n return this.fetchPageDataJson(\n Object.assign(loadObj, { retries: retries + 1 })\n )\n }\n\n // Retried 3 times already, result is an error.\n return Object.assign(loadObj, {\n status: PageResourceStatus.Error,\n })\n })\n }\n\n fetchPartialHydrationJson(loadObj) {\n const { pagePath, retries = 0 } = loadObj\n const url = createPageDataUrl(pagePath).replace(`.json`, `-rsc.json`)\n return this.memoizedGet(url).then(req => {\n const { status, responseText } = req\n\n // Handle 200\n if (status === 200) {\n try {\n return Object.assign(loadObj, {\n status: PageResourceStatus.Success,\n payload: responseText,\n })\n } catch (err) {\n // continue regardless of error\n }\n }\n\n // Handle 404\n if (status === 404 || status === 200) {\n // If the request was for a 404/500 page and it doesn't exist, we're done\n if (pagePath === `/404.html` || pagePath === `/500.html`) {\n return Object.assign(loadObj, {\n status: PageResourceStatus.Error,\n })\n }\n\n // Need some code here to cache the 404 request. In case\n // multiple loadPageDataJsons result in 404s\n return this.fetchPartialHydrationJson(\n Object.assign(loadObj, { pagePath: `/404.html`, notFound: true })\n )\n }\n\n // handle 500 response (Unrecoverable)\n if (status === 500) {\n return this.fetchPartialHydrationJson(\n Object.assign(loadObj, {\n pagePath: `/500.html`,\n internalServerError: true,\n })\n )\n }\n\n // Handle everything else, including status === 0, and 503s. Should retry\n if (retries < 3) {\n return this.fetchPartialHydrationJson(\n Object.assign(loadObj, { retries: retries + 1 })\n )\n }\n\n // Retried 3 times already, result is an error.\n return Object.assign(loadObj, {\n status: PageResourceStatus.Error,\n })\n })\n }\n\n loadPageDataJson(rawPath) {\n const pagePath = findPath(rawPath)\n if (this.pageDataDb.has(pagePath)) {\n const pageData = this.pageDataDb.get(pagePath)\n if (process.env.BUILD_STAGE !== `develop` || !pageData.stale) {\n return Promise.resolve(pageData)\n }\n }\n\n return this.fetchPageDataJson({ pagePath }).then(pageData => {\n this.pageDataDb.set(pagePath, pageData)\n\n return pageData\n })\n }\n\n loadPartialHydrationJson(rawPath) {\n const pagePath = findPath(rawPath)\n if (this.partialHydrationDb.has(pagePath)) {\n const pageData = this.partialHydrationDb.get(pagePath)\n if (process.env.BUILD_STAGE !== `develop` || !pageData.stale) {\n return Promise.resolve(pageData)\n }\n }\n\n return this.fetchPartialHydrationJson({ pagePath }).then(pageData => {\n this.partialHydrationDb.set(pagePath, pageData)\n\n return pageData\n })\n }\n\n loadSliceDataJson(sliceName) {\n if (this.slicesDataDb.has(sliceName)) {\n const jsonPayload = this.slicesDataDb.get(sliceName)\n return Promise.resolve({ sliceName, jsonPayload })\n }\n\n const url = `${__PATH_PREFIX__}/slice-data/${sliceName}.json`\n return doFetch(url, `GET`).then(res => {\n const jsonPayload = JSON.parse(res.responseText)\n\n this.slicesDataDb.set(sliceName, jsonPayload)\n return { sliceName, jsonPayload }\n })\n }\n\n findMatchPath(rawPath) {\n return findMatchPath(rawPath)\n }\n\n // TODO check all uses of this and whether they use undefined for page resources not exist\n loadPage(rawPath) {\n const pagePath = findPath(rawPath)\n if (this.pageDb.has(pagePath)) {\n const page = this.pageDb.get(pagePath)\n if (process.env.BUILD_STAGE !== `develop` || !page.payload.stale) {\n if (page.error) {\n return Promise.resolve({\n error: page.error,\n status: page.status,\n })\n }\n\n return Promise.resolve(page.payload)\n }\n }\n\n if (this.inFlightDb.has(pagePath)) {\n return this.inFlightDb.get(pagePath)\n }\n\n const loadDataPromises = [\n this.loadAppData(),\n this.loadPageDataJson(pagePath),\n ]\n\n if (global.hasPartialHydration) {\n loadDataPromises.push(this.loadPartialHydrationJson(pagePath))\n }\n\n const inFlightPromise = Promise.all(loadDataPromises).then(allData => {\n const [appDataResponse, pageDataResponse, rscDataResponse] = allData\n\n if (\n pageDataResponse.status === PageResourceStatus.Error ||\n rscDataResponse?.status === PageResourceStatus.Error\n ) {\n return {\n status: PageResourceStatus.Error,\n }\n }\n\n let pageData = pageDataResponse.payload\n\n const {\n componentChunkName,\n staticQueryHashes: pageStaticQueryHashes = [],\n slicesMap = {},\n } = pageData\n\n const finalResult = {}\n\n const dedupedSliceNames = Array.from(new Set(Object.values(slicesMap)))\n\n const loadSlice = slice => {\n if (this.slicesDb.has(slice.name)) {\n return this.slicesDb.get(slice.name)\n } else if (this.sliceInflightDb.has(slice.name)) {\n return this.sliceInflightDb.get(slice.name)\n }\n\n const inFlight = this.loadComponent(slice.componentChunkName).then(\n component => {\n return {\n component: preferDefault(component),\n sliceContext: slice.result.sliceContext,\n data: slice.result.data,\n }\n }\n )\n\n this.sliceInflightDb.set(slice.name, inFlight)\n inFlight.then(results => {\n this.slicesDb.set(slice.name, results)\n this.sliceInflightDb.delete(slice.name)\n })\n\n return inFlight\n }\n\n return Promise.all(\n dedupedSliceNames.map(sliceName => this.loadSliceDataJson(sliceName))\n ).then(slicesData => {\n const slices = []\n const dedupedStaticQueryHashes = [...pageStaticQueryHashes]\n\n for (const { jsonPayload, sliceName } of Object.values(slicesData)) {\n slices.push({ name: sliceName, ...jsonPayload })\n for (const staticQueryHash of jsonPayload.staticQueryHashes) {\n if (!dedupedStaticQueryHashes.includes(staticQueryHash)) {\n dedupedStaticQueryHashes.push(staticQueryHash)\n }\n }\n }\n\n const loadChunkPromises = [\n Promise.all(slices.map(loadSlice)),\n this.loadComponent(componentChunkName, `head`),\n ]\n\n if (!global.hasPartialHydration) {\n loadChunkPromises.push(this.loadComponent(componentChunkName))\n }\n\n // In develop we have separate chunks for template and Head components\n // to enable HMR (fast refresh requires single exports).\n // In production we have shared chunk with both exports. Double loadComponent here\n // will be deduped by webpack runtime resulting in single request and single module\n // being loaded for both `component` and `head`.\n // get list of components to get\n const componentChunkPromises = Promise.all(loadChunkPromises).then(\n components => {\n const [sliceComponents, headComponent, pageComponent] = components\n\n finalResult.createdAt = new Date()\n\n for (const sliceComponent of sliceComponents) {\n if (!sliceComponent || sliceComponent instanceof Error) {\n finalResult.status = PageResourceStatus.Error\n finalResult.error = sliceComponent\n }\n }\n\n if (\n !global.hasPartialHydration &&\n (!pageComponent || pageComponent instanceof Error)\n ) {\n finalResult.status = PageResourceStatus.Error\n finalResult.error = pageComponent\n }\n\n let pageResources\n\n if (finalResult.status !== PageResourceStatus.Error) {\n finalResult.status = PageResourceStatus.Success\n if (\n pageDataResponse.notFound === true ||\n rscDataResponse?.notFound === true\n ) {\n finalResult.notFound = true\n }\n pageData = Object.assign(pageData, {\n webpackCompilationHash: appDataResponse\n ? appDataResponse.webpackCompilationHash\n : ``,\n })\n\n if (typeof rscDataResponse?.payload === `string`) {\n pageResources = toPageResources(pageData, null, headComponent)\n\n pageResources.partialHydration = rscDataResponse.payload\n\n const readableStream = new ReadableStream({\n start(controller) {\n const te = new TextEncoder()\n controller.enqueue(te.encode(rscDataResponse.payload))\n },\n pull(controller) {\n // close on next read when queue is empty\n controller.close()\n },\n cancel() {},\n })\n\n return waitForResponse(\n createFromReadableStream(readableStream)\n ).then(result => {\n pageResources.partialHydration = result\n\n return pageResources\n })\n } else {\n pageResources = toPageResources(\n pageData,\n pageComponent,\n headComponent\n )\n }\n }\n\n // undefined if final result is an error\n return pageResources\n }\n )\n\n // get list of static queries to get\n const staticQueryBatchPromise = Promise.all(\n dedupedStaticQueryHashes.map(staticQueryHash => {\n // Check for cache in case this static query result has already been loaded\n if (this.staticQueryDb[staticQueryHash]) {\n const jsonPayload = this.staticQueryDb[staticQueryHash]\n return { staticQueryHash, jsonPayload }\n }\n\n return this.memoizedGet(\n `${__PATH_PREFIX__}/page-data/sq/d/${staticQueryHash}.json`\n )\n .then(req => {\n const jsonPayload = JSON.parse(req.responseText)\n return { staticQueryHash, jsonPayload }\n })\n .catch(() => {\n throw new Error(\n `We couldn't load \"${__PATH_PREFIX__}/page-data/sq/d/${staticQueryHash}.json\"`\n )\n })\n })\n ).then(staticQueryResults => {\n const staticQueryResultsMap = {}\n\n staticQueryResults.forEach(({ staticQueryHash, jsonPayload }) => {\n staticQueryResultsMap[staticQueryHash] = jsonPayload\n this.staticQueryDb[staticQueryHash] = jsonPayload\n })\n\n return staticQueryResultsMap\n })\n\n return (\n Promise.all([componentChunkPromises, staticQueryBatchPromise])\n .then(([pageResources, staticQueryResults]) => {\n let payload\n if (pageResources) {\n payload = { ...pageResources, staticQueryResults }\n finalResult.payload = payload\n emitter.emit(`onPostLoadPageResources`, {\n page: payload,\n pageResources: payload,\n })\n }\n\n this.pageDb.set(pagePath, finalResult)\n\n if (finalResult.error) {\n return {\n error: finalResult.error,\n status: finalResult.status,\n }\n }\n\n return payload\n })\n // when static-query fail to load we throw a better error\n .catch(err => {\n return {\n error: err,\n status: PageResourceStatus.Error,\n }\n })\n )\n })\n })\n\n inFlightPromise\n .then(() => {\n this.inFlightDb.delete(pagePath)\n })\n .catch(error => {\n this.inFlightDb.delete(pagePath)\n throw error\n })\n\n this.inFlightDb.set(pagePath, inFlightPromise)\n\n return inFlightPromise\n }\n\n // returns undefined if the page does not exists in cache\n loadPageSync(rawPath, options = {}) {\n const pagePath = findPath(rawPath)\n if (this.pageDb.has(pagePath)) {\n const pageData = this.pageDb.get(pagePath)\n\n if (pageData.payload) {\n return pageData.payload\n }\n\n if (options?.withErrorDetails) {\n return {\n error: pageData.error,\n status: pageData.status,\n }\n }\n }\n return undefined\n }\n\n shouldPrefetch(pagePath) {\n // Skip prefetching if we know user is on slow or constrained connection\n if (!doesConnectionSupportPrefetch()) {\n return false\n }\n\n // Don't prefetch if this is a crawler bot\n if (navigator.userAgent && BOT_REGEX.test(navigator.userAgent)) {\n return false\n }\n\n // Check if the page exists.\n if (this.pageDb.has(pagePath)) {\n return false\n }\n\n return true\n }\n\n prefetch(pagePath) {\n if (!this.shouldPrefetch(pagePath)) {\n return {\n then: resolve => resolve(false),\n abort: () => {},\n }\n }\n if (this.prefetchTriggered.has(pagePath)) {\n return {\n then: resolve => resolve(true),\n abort: () => {},\n }\n }\n\n const defer = {\n resolve: null,\n reject: null,\n promise: null,\n }\n defer.promise = new Promise((resolve, reject) => {\n defer.resolve = resolve\n defer.reject = reject\n })\n this.prefetchQueued.push([pagePath, defer])\n const abortC = new AbortController()\n abortC.signal.addEventListener(`abort`, () => {\n const index = this.prefetchQueued.findIndex(([p]) => p === pagePath)\n // remove from the queue\n if (index !== -1) {\n this.prefetchQueued.splice(index, 1)\n }\n })\n\n if (!this.isPrefetchQueueRunning) {\n this.isPrefetchQueueRunning = true\n setTimeout(() => {\n this._processNextPrefetchBatch()\n }, 3000)\n }\n\n return {\n then: (resolve, reject) => defer.promise.then(resolve, reject),\n abort: abortC.abort.bind(abortC),\n }\n }\n\n _processNextPrefetchBatch() {\n const idleCallback = window.requestIdleCallback || (cb => setTimeout(cb, 0))\n\n idleCallback(() => {\n const toPrefetch = this.prefetchQueued.splice(0, 4)\n const prefetches = Promise.all(\n toPrefetch.map(([pagePath, dPromise]) => {\n // Tell plugins with custom prefetching logic that they should start\n // prefetching this path.\n if (!this.prefetchTriggered.has(pagePath)) {\n this.apiRunner(`onPrefetchPathname`, { pathname: pagePath })\n this.prefetchTriggered.add(pagePath)\n }\n\n // If a plugin has disabled core prefetching, stop now.\n if (this.prefetchDisabled) {\n return dPromise.resolve(false)\n }\n\n return this.doPrefetch(findPath(pagePath)).then(() => {\n if (!this.prefetchCompleted.has(pagePath)) {\n this.apiRunner(`onPostPrefetchPathname`, { pathname: pagePath })\n this.prefetchCompleted.add(pagePath)\n }\n\n dPromise.resolve(true)\n })\n })\n )\n\n if (this.prefetchQueued.length) {\n prefetches.then(() => {\n setTimeout(() => {\n this._processNextPrefetchBatch()\n }, 3000)\n })\n } else {\n this.isPrefetchQueueRunning = false\n }\n })\n }\n\n doPrefetch(pagePath) {\n const pageDataUrl = createPageDataUrl(pagePath)\n\n if (global.hasPartialHydration) {\n return Promise.all([\n prefetchHelper(pageDataUrl, {\n crossOrigin: `anonymous`,\n as: `fetch`,\n }).then(() =>\n // This was just prefetched, so will return a response from\n // the cache instead of making another request to the server\n this.loadPageDataJson(pagePath)\n ),\n prefetchHelper(pageDataUrl.replace(`.json`, `-rsc.json`), {\n crossOrigin: `anonymous`,\n as: `fetch`,\n }).then(() =>\n // This was just prefetched, so will return a response from\n // the cache instead of making another request to the server\n this.loadPartialHydrationJson(pagePath)\n ),\n ])\n } else {\n return prefetchHelper(pageDataUrl, {\n crossOrigin: `anonymous`,\n as: `fetch`,\n }).then(() =>\n // This was just prefetched, so will return a response from\n // the cache instead of making another request to the server\n this.loadPageDataJson(pagePath)\n )\n }\n }\n\n hovering(rawPath) {\n this.loadPage(rawPath)\n }\n\n getResourceURLsForPathname(rawPath) {\n const pagePath = findPath(rawPath)\n const page = this.pageDataDb.get(pagePath)\n if (page) {\n const pageResources = toPageResources(page.payload)\n\n return [\n ...createComponentUrls(pageResources.page.componentChunkName),\n createPageDataUrl(pagePath),\n ]\n } else {\n return null\n }\n }\n\n isPageNotFound(rawPath) {\n const pagePath = findPath(rawPath)\n const page = this.pageDb.get(pagePath)\n return !page || page.notFound\n }\n\n loadAppData(retries = 0) {\n return this.memoizedGet(`${__PATH_PREFIX__}/page-data/app-data.json`).then(\n req => {\n const { status, responseText } = req\n\n let appData\n\n if (status !== 200 && retries < 3) {\n // Retry 3 times incase of non-200 responses\n return this.loadAppData(retries + 1)\n }\n\n // Handle 200\n if (status === 200) {\n try {\n const jsonPayload = JSON.parse(responseText)\n if (jsonPayload.webpackCompilationHash === undefined) {\n throw new Error(`not a valid app-data response`)\n }\n\n appData = jsonPayload\n } catch (err) {\n // continue regardless of error\n }\n }\n\n return appData\n }\n )\n }\n}\n\nconst createComponentUrls = componentChunkName =>\n (window.___chunkMapping[componentChunkName] || []).map(\n chunk => __PATH_PREFIX__ + chunk\n )\n\nexport class ProdLoader extends BaseLoader {\n constructor(asyncRequires, matchPaths, pageData) {\n const loadComponent = (chunkName, exportType = `components`) => {\n if (!global.hasPartialHydration) {\n exportType = `components`\n }\n\n if (!asyncRequires[exportType][chunkName]) {\n throw new Error(\n `We couldn't find the correct component chunk with the name \"${chunkName}\"`\n )\n }\n\n return (\n asyncRequires[exportType][chunkName]()\n // loader will handle the case when component is error\n .catch(err => err)\n )\n }\n\n super(loadComponent, matchPaths)\n\n if (pageData) {\n this.pageDataDb.set(findPath(pageData.path), {\n pagePath: pageData.path,\n payload: pageData,\n status: `success`,\n })\n }\n }\n\n doPrefetch(pagePath) {\n return super.doPrefetch(pagePath).then(result => {\n if (result.status !== PageResourceStatus.Success) {\n return Promise.resolve()\n }\n const pageData = result.payload\n const chunkName = pageData.componentChunkName\n const componentUrls = createComponentUrls(chunkName)\n return Promise.all(componentUrls.map(prefetchHelper)).then(() => pageData)\n })\n }\n\n loadPageDataJson(rawPath) {\n return super.loadPageDataJson(rawPath).then(data => {\n if (data.notFound) {\n if (shouldAbortFetch(rawPath)) {\n return data\n }\n // check if html file exist using HEAD request:\n // if it does we should navigate to it instead of showing 404\n return doFetch(rawPath, `HEAD`).then(req => {\n if (req.status === 200) {\n // page (.html file) actually exist (or we asked for 404 )\n // returning page resources status as errored to trigger\n // regular browser navigation to given page\n return {\n status: PageResourceStatus.Error,\n }\n }\n\n // if HEAD request wasn't 200, return notFound result\n // and show 404 page\n return data\n })\n }\n return data\n })\n }\n\n loadPartialHydrationJson(rawPath) {\n return super.loadPartialHydrationJson(rawPath).then(data => {\n if (data.notFound) {\n if (shouldAbortFetch(rawPath)) {\n return data\n }\n // check if html file exist using HEAD request:\n // if it does we should navigate to it instead of showing 404\n return doFetch(rawPath, `HEAD`).then(req => {\n if (req.status === 200) {\n // page (.html file) actually exist (or we asked for 404 )\n // returning page resources status as errored to trigger\n // regular browser navigation to given page\n return {\n status: PageResourceStatus.Error,\n }\n }\n\n // if HEAD request wasn't 200, return notFound result\n // and show 404 page\n return data\n })\n }\n return data\n })\n }\n}\n\nlet instance\n\nexport const setLoader = _loader => {\n instance = _loader\n}\n\nexport const publicLoader = {\n enqueue: rawPath => instance.prefetch(rawPath),\n\n // Real methods\n getResourceURLsForPathname: rawPath =>\n instance.getResourceURLsForPathname(rawPath),\n loadPage: rawPath => instance.loadPage(rawPath),\n // TODO add deprecation to v4 so people use withErrorDetails and then we can remove in v5 and change default behaviour\n loadPageSync: (rawPath, options = {}) =>\n instance.loadPageSync(rawPath, options),\n prefetch: rawPath => instance.prefetch(rawPath),\n isPageNotFound: rawPath => instance.isPageNotFound(rawPath),\n hovering: rawPath => instance.hovering(rawPath),\n loadAppData: () => instance.loadAppData(),\n}\n\nexport default publicLoader\n\nexport function getStaticQueryResults() {\n if (instance) {\n return instance.staticQueryDb\n } else {\n return {}\n }\n}\n\nexport function getSliceResults() {\n if (instance) {\n return instance.slicesDb\n } else {\n return {}\n }\n}\n","import { useEffect } from \"react\"\n\n/*\n * Calls callback in an effect and renders children\n */\nexport function FireCallbackInEffect({ children, callback }) {\n useEffect(() => {\n callback()\n })\n\n return children\n}\n","export const VALID_NODE_NAMES = [\n `link`,\n `meta`,\n `style`,\n `title`,\n `base`,\n `noscript`,\n `script`,\n `html`,\n `body`,\n]\n","import { VALID_NODE_NAMES } from \"./constants\"\n\n/**\n * Filter the props coming from a page down to just the ones that are relevant for head.\n * This e.g. filters out properties that are undefined during SSR.\n */\nexport function filterHeadProps(input) {\n return {\n location: {\n pathname: input.location.pathname,\n },\n params: input.params,\n data: input.data || {},\n serverData: input.serverData,\n pageContext: input.pageContext,\n }\n}\n\n/**\n * Throw error if Head export is not a valid function\n */\nexport function headExportValidator(head) {\n if (typeof head !== `function`)\n throw new Error(\n `Expected \"Head\" export to be a function got \"${typeof head}\".`\n )\n}\n\n/**\n * Warn once for same messsage\n */\nlet warnOnce = _ => {}\nif (process.env.NODE_ENV !== `production`) {\n const warnings = new Set()\n warnOnce = msg => {\n if (!warnings.has(msg)) {\n console.warn(msg)\n }\n warnings.add(msg)\n }\n}\n\n/**\n * Warn for invalid tags in Head which may have been directly added or introduced by `wrapRootElement`\n * @param {string} tagName\n */\nexport function warnForInvalidTag(tagName) {\n if (process.env.NODE_ENV !== `production`) {\n const warning = createWarningForInvalidTag(tagName)\n warnOnce(warning)\n }\n}\n\nfunction createWarningForInvalidTag(tagName) {\n return `<${tagName}> is not a valid head element. Please use one of the following: ${VALID_NODE_NAMES.join(\n `, `\n )}.\\n\\nAlso make sure that wrapRootElement in gatsby-ssr/gatsby-browser doesn't contain UI elements: https://gatsby.dev/invalid-head-elements`\n}\n\n/**\n * When a `nonce` is present on an element, browsers such as Chrome and Firefox strip it out of the\n * actual HTML attributes for security reasons *when the element is added to the document*. Thus,\n * given two equivalent elements that have nonces, `Element,isEqualNode()` will return false if one\n * of those elements gets added to the document. Although the `element.nonce` property will be the\n * same for both elements, the one that was added to the document will return an empty string for\n * its nonce HTML attribute value.\n *\n * This custom `isEqualNode()` function therefore removes the nonce value from the `newTag` before\n * comparing it to `oldTag`, restoring it afterwards.\n *\n * For more information, see:\n * https://bugs.chromium.org/p/chromium/issues/detail?id=1211471#c12\n */\nexport function isEqualNode(oldTag, newTag) {\n if (oldTag instanceof HTMLElement && newTag instanceof HTMLElement) {\n const nonce = newTag.getAttribute(`nonce`)\n // Only strip the nonce if `oldTag` has had it stripped. An element's nonce attribute will not\n // be stripped if there is no content security policy response header that includes a nonce.\n if (nonce && !oldTag.getAttribute(`nonce`)) {\n const cloneTag = newTag.cloneNode(true)\n cloneTag.setAttribute(`nonce`, ``)\n cloneTag.nonce = nonce\n return nonce === oldTag.nonce && oldTag.isEqualNode(cloneTag)\n }\n }\n\n return oldTag.isEqualNode(newTag)\n}\n\nexport function diffNodes({ oldNodes, newNodes, onStale, onNew }) {\n for (const existingHeadElement of oldNodes) {\n const indexInNewNodes = newNodes.findIndex(e =>\n isEqualNode(e, existingHeadElement)\n )\n\n if (indexInNewNodes === -1) {\n onStale(existingHeadElement)\n } else {\n // this node is re-created as-is, so we keep old node, and remove it from list of new nodes (as we handled it already here)\n newNodes.splice(indexInNewNodes, 1)\n }\n }\n\n // remaing new nodes didn't have matching old node, so need to be added\n for (const newNode of newNodes) {\n onNew(newNode)\n }\n}\n\nexport function getValidHeadNodesAndAttributes(\n rootNode,\n htmlAndBodyAttributes = {\n html: {},\n body: {},\n }\n) {\n const seenIds = new Map()\n const validHeadNodes = []\n\n // Filter out non-element nodes before looping since we don't care about them\n for (const node of rootNode.childNodes) {\n const nodeName = node.nodeName.toLowerCase()\n const id = node.attributes?.id?.value\n\n if (!isElementType(node)) continue\n\n if (isValidNodeName(nodeName)) {\n // and tags are treated differently, in that we don't render them, we only extract the attributes and apply them separetely\n if (nodeName === `html` || nodeName === `body`) {\n for (const attribute of node.attributes) {\n const isStyleAttribute = attribute.name === `style`\n\n // Merge attributes for same nodeName from previous loop iteration\n htmlAndBodyAttributes[nodeName] = {\n ...htmlAndBodyAttributes[nodeName],\n }\n\n if (!isStyleAttribute) {\n htmlAndBodyAttributes[nodeName][attribute.name] = attribute.value\n }\n\n // If there is already a style attribute, we need to merge them as otherwise the last one will \"win\"\n if (isStyleAttribute) {\n htmlAndBodyAttributes[nodeName].style = `${\n htmlAndBodyAttributes[nodeName]?.style\n ? htmlAndBodyAttributes[nodeName].style\n : ``\n }${attribute.value} `\n }\n }\n } else {\n let clonedNode = node.cloneNode(true)\n clonedNode.setAttribute(`data-gatsby-head`, true)\n\n // // This is hack to make script tags work\n if (clonedNode.nodeName.toLowerCase() === `script`) {\n clonedNode = massageScript(clonedNode)\n }\n // Duplicate ids are not allowed in the head, so we need to dedupe them\n if (id) {\n if (!seenIds.has(id)) {\n validHeadNodes.push(clonedNode)\n seenIds.set(id, validHeadNodes.length - 1)\n } else {\n const indexOfPreviouslyInsertedNode = seenIds.get(id)\n validHeadNodes[\n indexOfPreviouslyInsertedNode\n ].parentNode?.removeChild(\n validHeadNodes[indexOfPreviouslyInsertedNode]\n )\n validHeadNodes[indexOfPreviouslyInsertedNode] = clonedNode\n }\n } else {\n validHeadNodes.push(clonedNode)\n }\n }\n } else {\n warnForInvalidTag(nodeName)\n }\n\n if (node.childNodes.length) {\n validHeadNodes.push(\n ...getValidHeadNodesAndAttributes(node, htmlAndBodyAttributes)\n .validHeadNodes\n )\n }\n }\n\n return { validHeadNodes, htmlAndBodyAttributes }\n}\n\nfunction massageScript(node) {\n const script = document.createElement(`script`)\n for (const attr of node.attributes) {\n script.setAttribute(attr.name, attr.value)\n }\n script.innerHTML = node.innerHTML\n\n return script\n}\n\nexport function isValidNodeName(nodeName) {\n return VALID_NODE_NAMES.includes(nodeName)\n}\n/*\n * For Head, we only care about element nodes(type = 1), so this util is used to skip over non-element nodes\n * For Node type, see https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\n */\nexport function isElementType(node) {\n return node.nodeType === 1\n}\n\n/**\n * Removes all the head elements that were added by `Head`\n */\nexport function removePrevHeadElements() {\n const prevHeadNodes = document.querySelectorAll(`[data-gatsby-head]`)\n for (const node of prevHeadNodes) {\n node.parentNode.removeChild(node)\n }\n}\n\nexport function applyHtmlAndBodyAttributes(htmlAndBodyAttributes) {\n if (!htmlAndBodyAttributes) return\n\n const { html, body } = htmlAndBodyAttributes\n\n const htmlElement = document.querySelector(`html`)\n if (htmlElement) {\n Object.entries(html).forEach(([attributeName, attributeValue]) => {\n htmlElement.setAttribute(attributeName, attributeValue)\n })\n }\n\n const bodyElement = document.querySelector(`body`)\n if (bodyElement) {\n Object.entries(body).forEach(([attributeName, attributeValue]) => {\n bodyElement.setAttribute(attributeName, attributeValue)\n })\n }\n}\n\nexport function removeHtmlAndBodyAttributes(htmlAndBodyattributeList) {\n if (!htmlAndBodyattributeList) return\n\n const { html, body } = htmlAndBodyattributeList\n\n if (html) {\n const htmlElement = document.querySelector(`html`)\n html.forEach(attributeName => {\n if (htmlElement) {\n htmlElement.removeAttribute(attributeName)\n }\n })\n }\n\n if (body) {\n const bodyElement = document.querySelector(`body`)\n body.forEach(attributeName => {\n if (bodyElement) {\n bodyElement.removeAttribute(attributeName)\n }\n })\n }\n}\n","import React from \"react\"\nimport { useEffect } from \"react\"\nimport { StaticQueryContext } from \"gatsby\"\nimport { LocationProvider } from \"@gatsbyjs/reach-router\"\nimport { reactDOMUtils } from \"../react-dom-utils\"\nimport { FireCallbackInEffect } from \"./components/fire-callback-in-effect\"\nimport {\n headExportValidator,\n filterHeadProps,\n diffNodes,\n getValidHeadNodesAndAttributes,\n removePrevHeadElements,\n applyHtmlAndBodyAttributes,\n removeHtmlAndBodyAttributes,\n} from \"./utils\"\nimport { apiRunner } from \"../api-runner-browser\"\n\nconst hiddenRoot = document.createElement(`div`)\nconst keysOfHtmlAndBodyAttributes = {\n html: [],\n body: [],\n}\n\nconst onHeadRendered = () => {\n const { validHeadNodes, htmlAndBodyAttributes } =\n getValidHeadNodesAndAttributes(hiddenRoot)\n\n keysOfHtmlAndBodyAttributes.html = Object.keys(htmlAndBodyAttributes.html)\n keysOfHtmlAndBodyAttributes.body = Object.keys(htmlAndBodyAttributes.body)\n\n applyHtmlAndBodyAttributes(htmlAndBodyAttributes)\n\n /**\n * The rest of the code block below is a diffing mechanism to ensure that\n * the head elements aren't duplicted on every re-render.\n */\n const existingHeadElements = document.querySelectorAll(`[data-gatsby-head]`)\n\n if (existingHeadElements.length === 0) {\n document.head.append(...validHeadNodes)\n return\n }\n\n const newHeadNodes = []\n diffNodes({\n oldNodes: existingHeadElements,\n newNodes: validHeadNodes,\n onStale: node => node.parentNode.removeChild(node),\n onNew: node => newHeadNodes.push(node),\n })\n\n document.head.append(...newHeadNodes)\n}\n\nif (process.env.BUILD_STAGE === `develop`) {\n // sigh ... and elements are not valid descedents of
(our hidden element)\n // react-dom in dev mode will warn about this. There doesn't seem to be a way to render arbitrary\n // user Head without hitting this issue (our hidden element could be just \"new Document()\", but\n // this can only have 1 child, and we don't control what is being rendered so that's not an option)\n // instead we continue to render to
, and just silence warnings for and elements\n // https://github.com/facebook/react/blob/e2424f33b3ad727321fc12e75c5e94838e84c2b5/packages/react-dom-bindings/src/client/validateDOMNesting.js#L498-L520\n const originalConsoleError = console.error.bind(console)\n console.error = (...args) => {\n if (\n Array.isArray(args) &&\n args.length >= 2 &&\n args[0]?.includes?.(`validateDOMNesting(...): %s cannot appear as`) &&\n (args[1] === `` || args[1] === ``)\n ) {\n return undefined\n }\n return originalConsoleError(...args)\n }\n\n /* We set up observer to be able to regenerate after react-refresh\n updates our hidden element.\n */\n const observer = new MutationObserver(onHeadRendered)\n observer.observe(hiddenRoot, {\n attributes: true,\n childList: true,\n characterData: true,\n subtree: true,\n })\n}\n\nexport function headHandlerForBrowser({\n pageComponent,\n staticQueryResults,\n pageComponentProps,\n}) {\n useEffect(() => {\n if (pageComponent?.Head) {\n headExportValidator(pageComponent.Head)\n\n const { render } = reactDOMUtils()\n\n const HeadElement = (\n \n )\n\n const WrapHeadElement = apiRunner(\n `wrapRootElement`,\n { element: HeadElement },\n HeadElement,\n ({ result }) => {\n return { element: result }\n }\n ).pop()\n\n render(\n // just a hack to call the callback after react has done first render\n // Note: In dev, we call onHeadRendered twice( in FireCallbackInEffect and after mutualution observer dectects initail render into hiddenRoot) this is for hot reloading\n // In Prod we only call onHeadRendered in FireCallbackInEffect to render to head\n \n \n {WrapHeadElement}\n \n ,\n hiddenRoot\n )\n }\n\n return () => {\n removePrevHeadElements()\n removeHtmlAndBodyAttributes(keysOfHtmlAndBodyAttributes)\n }\n })\n}\n","import React, { Suspense, createElement } from \"react\"\nimport PropTypes from \"prop-types\"\nimport { apiRunner } from \"./api-runner-browser\"\nimport { grabMatchParams } from \"./find-path\"\nimport { headHandlerForBrowser } from \"./head/head-export-handler-for-browser\"\n\n// Renders page\nfunction PageRenderer(props) {\n const pageComponentProps = {\n ...props,\n params: {\n ...grabMatchParams(props.location.pathname),\n ...props.pageResources.json.pageContext.__params,\n },\n }\n\n const preferDefault = m => (m && m.default) || m\n\n let pageElement\n if (props.pageResources.partialHydration) {\n pageElement = props.pageResources.partialHydration\n } else {\n pageElement = createElement(preferDefault(props.pageResources.component), {\n ...pageComponentProps,\n key: props.path || props.pageResources.page.path,\n })\n }\n\n const pageComponent = props.pageResources.head\n\n headHandlerForBrowser({\n pageComponent,\n staticQueryResults: props.pageResources.staticQueryResults,\n pageComponentProps,\n })\n\n const wrappedPage = apiRunner(\n `wrapPageElement`,\n {\n element: pageElement,\n props: pageComponentProps,\n },\n pageElement,\n ({ result }) => {\n return { element: result, props: pageComponentProps }\n }\n ).pop()\n\n return wrappedPage\n}\n\nPageRenderer.propTypes = {\n location: PropTypes.object.isRequired,\n pageResources: PropTypes.object.isRequired,\n data: PropTypes.object,\n pageContext: PropTypes.object.isRequired,\n}\n\nexport default PageRenderer\n","// This is extracted to separate module because it's shared\n// between browser and SSR code\nexport const RouteAnnouncerProps = {\n id: `gatsby-announcer`,\n style: {\n position: `absolute`,\n top: 0,\n width: 1,\n height: 1,\n padding: 0,\n overflow: `hidden`,\n clip: `rect(0, 0, 0, 0)`,\n whiteSpace: `nowrap`,\n border: 0,\n },\n \"aria-live\": `assertive`,\n \"aria-atomic\": `true`,\n}\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\nimport loader, { PageResourceStatus } from \"./loader\"\nimport { maybeGetBrowserRedirect } from \"./redirect-utils.js\"\nimport { apiRunner } from \"./api-runner-browser\"\nimport emitter from \"./emitter\"\nimport { RouteAnnouncerProps } from \"./route-announcer-props\"\nimport {\n navigate as reachNavigate,\n globalHistory,\n} from \"@gatsbyjs/reach-router\"\nimport { parsePath } from \"gatsby-link\"\n\nfunction maybeRedirect(pathname) {\n const redirect = maybeGetBrowserRedirect(pathname)\n const { hash, search } = window.location\n\n if (redirect != null) {\n window.___replace(redirect.toPath + search + hash)\n return true\n } else {\n return false\n }\n}\n\n// Catch unhandled chunk loading errors and force a restart of the app.\nlet nextRoute = ``\n\nwindow.addEventListener(`unhandledrejection`, event => {\n if (/loading chunk \\d* failed./i.test(event.reason)) {\n if (nextRoute) {\n window.location.pathname = nextRoute\n }\n }\n})\n\nconst onPreRouteUpdate = (location, prevLocation) => {\n if (!maybeRedirect(location.pathname)) {\n nextRoute = location.pathname\n apiRunner(`onPreRouteUpdate`, { location, prevLocation })\n }\n}\n\nconst onRouteUpdate = (location, prevLocation) => {\n if (!maybeRedirect(location.pathname)) {\n apiRunner(`onRouteUpdate`, { location, prevLocation })\n if (\n process.env.GATSBY_QUERY_ON_DEMAND &&\n process.env.GATSBY_QUERY_ON_DEMAND_LOADING_INDICATOR === `true`\n ) {\n emitter.emit(`onRouteUpdate`, { location, prevLocation })\n }\n }\n}\n\nconst navigate = (to, options = {}) => {\n // Support forward/backward navigation with numbers\n // navigate(-2) (jumps back 2 history steps)\n // navigate(2) (jumps forward 2 history steps)\n if (typeof to === `number`) {\n globalHistory.navigate(to)\n return\n }\n\n const { pathname, search, hash } = parsePath(to)\n const redirect = maybeGetBrowserRedirect(pathname)\n\n // If we're redirecting, just replace the passed in pathname\n // to the one we want to redirect to.\n if (redirect) {\n to = redirect.toPath + search + hash\n }\n\n // If we had a service worker update, no matter the path, reload window and\n // reset the pathname whitelist\n if (window.___swUpdated) {\n window.location = pathname + search + hash\n return\n }\n\n // Start a timer to wait for a second before transitioning and showing a\n // loader in case resources aren't around yet.\n const timeoutId = setTimeout(() => {\n emitter.emit(`onDelayedLoadPageResources`, { pathname })\n apiRunner(`onRouteUpdateDelayed`, {\n location: window.location,\n })\n }, 1000)\n\n loader.loadPage(pathname + search).then(pageResources => {\n // If no page resources, then refresh the page\n // Do this, rather than simply `window.location.reload()`, so that\n // pressing the back/forward buttons work - otherwise when pressing\n // back, the browser will just change the URL and expect JS to handle\n // the change, which won't always work since it might not be a Gatsby\n // page.\n if (!pageResources || pageResources.status === PageResourceStatus.Error) {\n window.history.replaceState({}, ``, location.href)\n window.location = pathname\n clearTimeout(timeoutId)\n return\n }\n\n // If the loaded page has a different compilation hash to the\n // window, then a rebuild has occurred on the server. Reload.\n if (process.env.NODE_ENV === `production` && pageResources) {\n if (\n pageResources.page.webpackCompilationHash !==\n window.___webpackCompilationHash\n ) {\n // Purge plugin-offline cache\n if (\n `serviceWorker` in navigator &&\n navigator.serviceWorker.controller !== null &&\n navigator.serviceWorker.controller.state === `activated`\n ) {\n navigator.serviceWorker.controller.postMessage({\n gatsbyApi: `clearPathResources`,\n })\n }\n\n window.location = pathname + search + hash\n }\n }\n reachNavigate(to, options)\n clearTimeout(timeoutId)\n })\n}\n\nfunction shouldUpdateScroll(prevRouterProps, { location }) {\n const { pathname, hash } = location\n const results = apiRunner(`shouldUpdateScroll`, {\n prevRouterProps,\n // `pathname` for backwards compatibility\n pathname,\n routerProps: { location },\n getSavedScrollPosition: args => [\n 0,\n // FIXME this is actually a big code smell, we should fix this\n // eslint-disable-next-line @babel/no-invalid-this\n this._stateStorage.read(args, args.key),\n ],\n })\n if (results.length > 0) {\n // Use the latest registered shouldUpdateScroll result, this allows users to override plugin's configuration\n // @see https://github.com/gatsbyjs/gatsby/issues/12038\n return results[results.length - 1]\n }\n\n if (prevRouterProps) {\n const {\n location: { pathname: oldPathname },\n } = prevRouterProps\n if (oldPathname === pathname) {\n // Scroll to element if it exists, if it doesn't, or no hash is provided,\n // scroll to top.\n return hash ? decodeURI(hash.slice(1)) : [0, 0]\n }\n }\n return true\n}\n\nfunction init() {\n // The \"scroll-behavior\" package expects the \"action\" to be on the location\n // object so let's copy it over.\n globalHistory.listen(args => {\n args.location.action = args.action\n })\n\n window.___push = to => navigate(to, { replace: false })\n window.___replace = to => navigate(to, { replace: true })\n window.___navigate = (to, options) => navigate(to, options)\n}\n\nclass RouteAnnouncer extends React.Component {\n constructor(props) {\n super(props)\n this.announcementRef = React.createRef()\n }\n\n componentDidUpdate(prevProps, nextProps) {\n requestAnimationFrame(() => {\n let pageName = `new page at ${this.props.location.pathname}`\n if (document.title) {\n pageName = document.title\n }\n const pageHeadings = document.querySelectorAll(`#gatsby-focus-wrapper h1`)\n if (pageHeadings && pageHeadings.length) {\n pageName = pageHeadings[0].textContent\n }\n const newAnnouncement = `Navigated to ${pageName}`\n if (this.announcementRef.current) {\n const oldAnnouncement = this.announcementRef.current.innerText\n if (oldAnnouncement !== newAnnouncement) {\n this.announcementRef.current.innerText = newAnnouncement\n }\n }\n })\n }\n\n render() {\n return
\n }\n}\n\nconst compareLocationProps = (prevLocation, nextLocation) => {\n if (prevLocation.href !== nextLocation.href) {\n return true\n }\n\n if (prevLocation?.state?.key !== nextLocation?.state?.key) {\n return true\n }\n\n return false\n}\n\n// Fire on(Pre)RouteUpdate APIs\nclass RouteUpdates extends React.Component {\n constructor(props) {\n super(props)\n onPreRouteUpdate(props.location, null)\n }\n\n componentDidMount() {\n onRouteUpdate(this.props.location, null)\n }\n\n shouldComponentUpdate(nextProps) {\n if (compareLocationProps(this.props.location, nextProps.location)) {\n onPreRouteUpdate(nextProps.location, this.props.location)\n return true\n }\n return false\n }\n\n componentDidUpdate(prevProps) {\n if (compareLocationProps(prevProps.location, this.props.location)) {\n onRouteUpdate(this.props.location, prevProps.location)\n }\n }\n\n render() {\n return (\n \n {this.props.children}\n \n \n )\n }\n}\n\nRouteUpdates.propTypes = {\n location: PropTypes.object.isRequired,\n}\n\nexport { init, shouldUpdateScroll, RouteUpdates, maybeGetBrowserRedirect }\n","// Pulled from react-compat\n// https://github.com/developit/preact-compat/blob/7c5de00e7c85e2ffd011bf3af02899b63f699d3a/src/index.js#L349\nfunction shallowDiffers(a, b) {\n for (var i in a) {\n if (!(i in b)) return true;\n }for (var _i in b) {\n if (a[_i] !== b[_i]) return true;\n }return false;\n}\n\nexport default (function (instance, nextProps, nextState) {\n return shallowDiffers(instance.props, nextProps) || shallowDiffers(instance.state, nextState);\n});","import React from \"react\"\nimport loader, { PageResourceStatus } from \"./loader\"\nimport shallowCompare from \"shallow-compare\"\n\nclass EnsureResources extends React.Component {\n constructor(props) {\n super()\n const { location, pageResources } = props\n this.state = {\n location: { ...location },\n pageResources:\n pageResources ||\n loader.loadPageSync(location.pathname + location.search, {\n withErrorDetails: true,\n }),\n }\n }\n\n static getDerivedStateFromProps({ location }, prevState) {\n if (prevState.location.href !== location.href) {\n const pageResources = loader.loadPageSync(\n location.pathname + location.search,\n {\n withErrorDetails: true,\n }\n )\n\n return {\n pageResources,\n location: { ...location },\n }\n }\n\n return {\n location: { ...location },\n }\n }\n\n loadResources(rawPath) {\n loader.loadPage(rawPath).then(pageResources => {\n if (pageResources && pageResources.status !== PageResourceStatus.Error) {\n this.setState({\n location: { ...window.location },\n pageResources,\n })\n } else {\n window.history.replaceState({}, ``, location.href)\n window.location = rawPath\n }\n })\n }\n\n shouldComponentUpdate(nextProps, nextState) {\n // Always return false if we're missing resources.\n if (!nextState.pageResources) {\n this.loadResources(\n nextProps.location.pathname + nextProps.location.search\n )\n return false\n }\n\n if (\n process.env.BUILD_STAGE === `develop` &&\n nextState.pageResources.stale\n ) {\n this.loadResources(\n nextProps.location.pathname + nextProps.location.search\n )\n return false\n }\n\n // Check if the component or json have changed.\n if (this.state.pageResources !== nextState.pageResources) {\n return true\n }\n if (\n this.state.pageResources.component !== nextState.pageResources.component\n ) {\n return true\n }\n\n if (this.state.pageResources.json !== nextState.pageResources.json) {\n return true\n }\n // Check if location has changed on a page using internal routing\n // via matchPath configuration.\n if (\n this.state.location.key !== nextState.location.key &&\n nextState.pageResources.page &&\n (nextState.pageResources.page.matchPath ||\n nextState.pageResources.page.path)\n ) {\n return true\n }\n return shallowCompare(this, nextProps, nextState)\n }\n\n render() {\n if (\n process.env.NODE_ENV !== `production` &&\n (!this.state.pageResources ||\n this.state.pageResources.status === PageResourceStatus.Error)\n ) {\n const message = `EnsureResources was not able to find resources for path: \"${this.props.location.pathname}\"\nThis typically means that an issue occurred building components for that path.\nRun \\`gatsby clean\\` to remove any cached elements.`\n if (this.state.pageResources?.error) {\n console.error(message)\n throw this.state.pageResources.error\n }\n\n throw new Error(message)\n }\n\n return this.props.children(this.state)\n }\n}\n\nexport default EnsureResources\n","import { apiRunner, apiRunnerAsync } from \"./api-runner-browser\"\nimport React from \"react\"\nimport { Router, navigate, Location, BaseContext } from \"@gatsbyjs/reach-router\"\nimport { ScrollContext } from \"gatsby-react-router-scroll\"\nimport { StaticQueryContext } from \"./static-query\"\nimport {\n SlicesMapContext,\n SlicesContext,\n SlicesResultsContext,\n} from \"./slice/context\"\nimport {\n shouldUpdateScroll,\n init as navigationInit,\n RouteUpdates,\n} from \"./navigation\"\nimport emitter from \"./emitter\"\nimport PageRenderer from \"./page-renderer\"\nimport asyncRequires from \"$virtual/async-requires\"\nimport {\n setLoader,\n ProdLoader,\n publicLoader,\n PageResourceStatus,\n getStaticQueryResults,\n getSliceResults,\n} from \"./loader\"\nimport EnsureResources from \"./ensure-resources\"\nimport stripPrefix from \"./strip-prefix\"\n\n// Generated during bootstrap\nimport matchPaths from \"$virtual/match-paths.json\"\nimport { reactDOMUtils } from \"./react-dom-utils\"\n\nconst loader = new ProdLoader(asyncRequires, matchPaths, window.pageData)\nsetLoader(loader)\nloader.setApiRunner(apiRunner)\n\nconst { render, hydrate } = reactDOMUtils()\n\nwindow.asyncRequires = asyncRequires\nwindow.___emitter = emitter\nwindow.___loader = publicLoader\n\nnavigationInit()\n\nconst reloadStorageKey = `gatsby-reload-compilation-hash-match`\n\napiRunnerAsync(`onClientEntry`).then(() => {\n // Let plugins register a service worker. The plugin just needs\n // to return true.\n if (apiRunner(`registerServiceWorker`).filter(Boolean).length > 0) {\n require(`./register-service-worker`)\n }\n\n // In gatsby v2 if Router is used in page using matchPaths\n // paths need to contain full path.\n // For example:\n // - page have `/app/*` matchPath\n // - inside template user needs to use `/app/xyz` as path\n // Resetting `basepath`/`baseuri` keeps current behaviour\n // to not introduce breaking change.\n // Remove this in v3\n const RouteHandler = props => (\n \n \n \n )\n\n const DataContext = React.createContext({})\n\n const slicesContext = {\n renderEnvironment: `browser`,\n }\n\n class GatsbyRoot extends React.Component {\n render() {\n const { children } = this.props\n return (\n \n {({ location }) => (\n \n {({ pageResources, location }) => {\n const staticQueryResults = getStaticQueryResults()\n const sliceResults = getSliceResults()\n\n return (\n \n \n \n \n \n {children}\n \n \n \n \n \n )\n }}\n \n )}\n \n )\n }\n }\n\n class LocationHandler extends React.Component {\n render() {\n return (\n \n {({ pageResources, location }) => (\n \n \n \n \n \n \n \n )}\n \n )\n }\n }\n\n const { pagePath, location: browserLoc } = window\n\n // Explicitly call navigate if the canonical path (window.pagePath)\n // is different to the browser path (window.location.pathname). SSR\n // page paths might include search params, while SSG and DSG won't.\n // If page path include search params we also compare query params.\n // But only if NONE of the following conditions hold:\n //\n // - The url matches a client side route (page.matchPath)\n // - it's a 404 page\n // - it's the offline plugin shell (/offline-plugin-app-shell-fallback/)\n if (\n pagePath &&\n __BASE_PATH__ + pagePath !==\n browserLoc.pathname + (pagePath.includes(`?`) ? browserLoc.search : ``) &&\n !(\n loader.findMatchPath(stripPrefix(browserLoc.pathname, __BASE_PATH__)) ||\n pagePath.match(/^\\/(404|500)(\\/?|.html)$/) ||\n pagePath.match(/^\\/offline-plugin-app-shell-fallback\\/?$/)\n )\n ) {\n navigate(\n __BASE_PATH__ +\n pagePath +\n (!pagePath.includes(`?`) ? browserLoc.search : ``) +\n browserLoc.hash,\n {\n replace: true,\n }\n )\n }\n\n // It's possible that sessionStorage can throw an exception if access is not granted, see https://github.com/gatsbyjs/gatsby/issues/34512\n const getSessionStorage = () => {\n try {\n return sessionStorage\n } catch {\n return null\n }\n }\n\n publicLoader.loadPage(browserLoc.pathname + browserLoc.search).then(page => {\n const sessionStorage = getSessionStorage()\n\n if (\n page?.page?.webpackCompilationHash &&\n page.page.webpackCompilationHash !== window.___webpackCompilationHash\n ) {\n // Purge plugin-offline cache\n if (\n `serviceWorker` in navigator &&\n navigator.serviceWorker.controller !== null &&\n navigator.serviceWorker.controller.state === `activated`\n ) {\n navigator.serviceWorker.controller.postMessage({\n gatsbyApi: `clearPathResources`,\n })\n }\n\n // We have not matching html + js (inlined `window.___webpackCompilationHash`)\n // with our data (coming from `app-data.json` file). This can cause issues such as\n // errors trying to load static queries (as list of static queries is inside `page-data`\n // which might not match to currently loaded `.js` scripts).\n // We are making attempt to reload if hashes don't match, but we also have to handle case\n // when reload doesn't fix it (possibly broken deploy) so we don't end up in infinite reload loop\n if (sessionStorage) {\n const isReloaded = sessionStorage.getItem(reloadStorageKey) === `1`\n\n if (!isReloaded) {\n sessionStorage.setItem(reloadStorageKey, `1`)\n window.location.reload(true)\n return\n }\n }\n }\n\n if (sessionStorage) {\n sessionStorage.removeItem(reloadStorageKey)\n }\n\n if (!page || page.status === PageResourceStatus.Error) {\n const message = `page resources for ${browserLoc.pathname} not found. Not rendering React`\n\n // if the chunk throws an error we want to capture the real error\n // This should help with https://github.com/gatsbyjs/gatsby/issues/19618\n if (page && page.error) {\n console.error(message)\n throw page.error\n }\n\n throw new Error(message)\n }\n\n const SiteRoot = apiRunner(\n `wrapRootElement`,\n { element: },\n ,\n ({ result }) => {\n return { element: result }\n }\n ).pop()\n\n const App = function App() {\n const onClientEntryRanRef = React.useRef(false)\n\n React.useEffect(() => {\n if (!onClientEntryRanRef.current) {\n onClientEntryRanRef.current = true\n if (performance.mark) {\n performance.mark(`onInitialClientRender`)\n }\n\n apiRunner(`onInitialClientRender`)\n }\n }, [])\n\n return {SiteRoot}\n }\n\n const focusEl = document.getElementById(`gatsby-focus-wrapper`)\n\n // Client only pages have any empty body so we just do a normal\n // render to avoid React complaining about hydration mis-matches.\n let defaultRenderer = render\n if (focusEl && focusEl.children.length) {\n defaultRenderer = hydrate\n }\n\n const renderer = apiRunner(\n `replaceHydrateFunction`,\n undefined,\n defaultRenderer\n )[0]\n\n function runRender() {\n const rootElement =\n typeof window !== `undefined`\n ? document.getElementById(`___gatsby`)\n : null\n\n renderer(, rootElement)\n }\n\n // https://github.com/madrobby/zepto/blob/b5ed8d607f67724788ec9ff492be297f64d47dfc/src/zepto.js#L439-L450\n // TODO remove IE 10 support\n const doc = document\n if (\n doc.readyState === `complete` ||\n (doc.readyState !== `loading` && !doc.documentElement.doScroll)\n ) {\n setTimeout(function () {\n runRender()\n }, 0)\n } else {\n const handler = function () {\n doc.removeEventListener(`DOMContentLoaded`, handler, false)\n window.removeEventListener(`load`, handler, false)\n\n runRender()\n }\n\n doc.addEventListener(`DOMContentLoaded`, handler, false)\n window.addEventListener(`load`, handler, false)\n }\n\n return\n })\n})\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\n\nimport loader from \"./loader\"\nimport InternalPageRenderer from \"./page-renderer\"\n\nconst ProdPageRenderer = ({ location }) => {\n const pageResources = loader.loadPageSync(location.pathname)\n if (!pageResources) {\n return null\n }\n return React.createElement(InternalPageRenderer, {\n location,\n pageResources,\n ...pageResources.json,\n })\n}\n\nProdPageRenderer.propTypes = {\n location: PropTypes.shape({\n pathname: PropTypes.string.isRequired,\n }).isRequired,\n}\n\nexport default ProdPageRenderer\n","const preferDefault = m => (m && m.default) || m\n\nif (process.env.BUILD_STAGE === `develop`) {\n module.exports = preferDefault(require(`./public-page-renderer-dev`))\n} else if (process.env.BUILD_STAGE === `build-javascript`) {\n module.exports = preferDefault(require(`./public-page-renderer-prod`))\n} else {\n module.exports = () => null\n}\n","const map = new WeakMap()\n\nexport function reactDOMUtils() {\n const reactDomClient = require(`react-dom/client`)\n\n const render = (Component, el) => {\n let root = map.get(el)\n if (!root) {\n map.set(el, (root = reactDomClient.createRoot(el)))\n }\n root.render(Component)\n }\n\n const hydrate = (Component, el) => reactDomClient.hydrateRoot(el, Component)\n\n return { render, hydrate }\n}\n","import redirects from \"./redirects.json\"\n\n// Convert to a map for faster lookup in maybeRedirect()\n\nconst redirectMap = new Map()\nconst redirectIgnoreCaseMap = new Map()\n\nredirects.forEach(redirect => {\n if (redirect.ignoreCase) {\n redirectIgnoreCaseMap.set(redirect.fromPath, redirect)\n } else {\n redirectMap.set(redirect.fromPath, redirect)\n }\n})\n\nexport function maybeGetBrowserRedirect(pathname) {\n let redirect = redirectMap.get(pathname)\n if (!redirect) {\n redirect = redirectIgnoreCaseMap.get(pathname.toLowerCase())\n }\n return redirect\n}\n","import { apiRunner } from \"./api-runner-browser\"\n\nif (\n window.location.protocol !== `https:` &&\n window.location.hostname !== `localhost`\n) {\n console.error(\n `Service workers can only be used over HTTPS, or on localhost for development`\n )\n} else if (`serviceWorker` in navigator) {\n navigator.serviceWorker\n .register(`${__BASE_PATH__}/sw.js`)\n .then(function (reg) {\n reg.addEventListener(`updatefound`, () => {\n apiRunner(`onServiceWorkerUpdateFound`, { serviceWorker: reg })\n // The updatefound event implies that reg.installing is set; see\n // https://w3c.github.io/ServiceWorker/#service-worker-registration-updatefound-event\n const installingWorker = reg.installing\n console.log(`installingWorker`, installingWorker)\n installingWorker.addEventListener(`statechange`, () => {\n switch (installingWorker.state) {\n case `installed`:\n if (navigator.serviceWorker.controller) {\n // At this point, the old content will have been purged and the fresh content will\n // have been added to the cache.\n\n // We set a flag so Gatsby Link knows to refresh the page on next navigation attempt\n window.___swUpdated = true\n // We call the onServiceWorkerUpdateReady API so users can show update prompts.\n apiRunner(`onServiceWorkerUpdateReady`, { serviceWorker: reg })\n\n // If resources failed for the current page, reload.\n if (window.___failedResources) {\n console.log(`resources failed, SW updated - reloading`)\n window.location.reload()\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a \"Content is cached for offline use.\" message.\n console.log(`Content is now available offline!`)\n\n // Post to service worker that install is complete.\n // Delay to allow time for the event listener to be added --\n // otherwise fetch is called too soon and resources aren't cached.\n apiRunner(`onServiceWorkerInstalled`, { serviceWorker: reg })\n }\n break\n\n case `redundant`:\n console.error(`The installing service worker became redundant.`)\n apiRunner(`onServiceWorkerRedundant`, { serviceWorker: reg })\n break\n\n case `activated`:\n apiRunner(`onServiceWorkerActive`, { serviceWorker: reg })\n break\n }\n })\n })\n })\n .catch(function (e) {\n console.error(`Error during service worker registration:`, e)\n })\n}\n","import React from \"react\"\n\nconst SlicesResultsContext = React.createContext({})\nconst SlicesContext = React.createContext({})\nconst SlicesMapContext = React.createContext({})\nconst SlicesPropsContext = React.createContext({})\n\nexport {\n SlicesResultsContext,\n SlicesContext,\n SlicesMapContext,\n SlicesPropsContext,\n}\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\nimport { createServerOrClientContext } from \"./context-utils\"\n\nconst StaticQueryContext = createServerOrClientContext(`StaticQuery`, {})\n\nfunction StaticQueryDataRenderer({ staticQueryData, data, query, render }) {\n const finalData = data\n ? data.data\n : staticQueryData[query] && staticQueryData[query].data\n\n return (\n \n {finalData && render(finalData)}\n {!finalData &&
Loading (StaticQuery)
}\n
\n )\n}\n\nlet warnedAboutStaticQuery = false\n\n// TODO(v6): Remove completely\nconst StaticQuery = props => {\n const { data, query, render, children } = props\n\n if (process.env.NODE_ENV === `development` && !warnedAboutStaticQuery) {\n console.warn(\n `The component is deprecated and will be removed in Gatsby v6. Use useStaticQuery instead. Refer to the migration guide for more information: https://gatsby.dev/migrating-4-to-5/#staticquery--is-deprecated`\n )\n warnedAboutStaticQuery = true\n }\n\n return (\n \n {staticQueryData => (\n \n )}\n \n )\n}\n\nStaticQuery.propTypes = {\n data: PropTypes.object,\n query: PropTypes.string.isRequired,\n render: PropTypes.func,\n children: PropTypes.func,\n}\n\nconst useStaticQuery = query => {\n if (\n typeof React.useContext !== `function` &&\n process.env.NODE_ENV === `development`\n ) {\n // TODO(v5): Remove since we require React >= 18\n throw new Error(\n `You're likely using a version of React that doesn't support Hooks\\n` +\n `Please update React and ReactDOM to 16.8.0 or later to use the useStaticQuery hook.`\n )\n }\n\n const context = React.useContext(StaticQueryContext)\n\n // query is a stringified number like `3303882` when wrapped with graphql, If a user forgets\n // to wrap the query in a grqphql, then casting it to a Number results in `NaN` allowing us to\n // catch the misuse of the API and give proper direction\n if (isNaN(Number(query))) {\n throw new Error(`useStaticQuery was called with a string but expects to be called using \\`graphql\\`. Try this:\n\nimport { useStaticQuery, graphql } from 'gatsby';\n\nuseStaticQuery(graphql\\`${query}\\`);\n`)\n }\n\n if (context[query]?.data) {\n return context[query].data\n } else {\n throw new Error(\n `The result of this StaticQuery could not be fetched.\\n\\n` +\n `This is likely a bug in Gatsby and if refreshing the page does not fix it, ` +\n `please open an issue in https://github.com/gatsbyjs/gatsby/issues`\n )\n }\n}\n\nexport { StaticQuery, StaticQueryContext, useStaticQuery }\n","import React from \"react\"\n\n// Ensure serverContext is not created more than once as React will throw when creating it more than once\n// https://github.com/facebook/react/blob/dd2d6522754f52c70d02c51db25eb7cbd5d1c8eb/packages/react/src/ReactServerContext.js#L101\nconst createServerContext = (name, defaultValue = null) => {\n /* eslint-disable no-undef */\n if (!globalThis.__SERVER_CONTEXT) {\n globalThis.__SERVER_CONTEXT = {}\n }\n\n if (!globalThis.__SERVER_CONTEXT[name]) {\n globalThis.__SERVER_CONTEXT[name] = React.createServerContext(\n name,\n defaultValue\n )\n }\n\n return globalThis.__SERVER_CONTEXT[name]\n}\n\nfunction createServerOrClientContext(name, defaultValue) {\n if (React.createServerContext) {\n return createServerContext(name, defaultValue)\n }\n\n return React.createContext(defaultValue)\n}\n\nexport { createServerOrClientContext }\n","/**\n * Remove a prefix from a string. Return the input string if the given prefix\n * isn't found.\n */\n\nexport default function stripPrefix(str, prefix = ``) {\n if (!prefix) {\n return str\n }\n\n if (str === prefix) {\n return `/`\n }\n\n if (str.startsWith(`${prefix}/`)) {\n return str.slice(prefix.length)\n }\n\n return str\n}\n","import WebFont from 'webfontloader';\nimport 'prismjs/themes/prism.css';\n\nWebFont.load({\n google: {\n families: ['Roboto:400,400i,500,700'],\n },\n});\n\ndocument.addEventListener('click', e => {\n const { target } = e;\n const data = collectData(target, {\n action: 'click',\n });\n if (data.category && !data.label) data.label = target.closest('a')?.textContent;\n if (data.label) {\n window.gtag?.('event', 'click', {\n category: data.category,\n label: data.label,\n });\n }\n\n const a = target.closest('a');\n const beta = a?.closest('[data-ga-category=webext-beta]');\n if (beta && a.textContent.includes('Firefox')) {\n e.preventDefault();\n installBetaFirefox();\n }\n});\n\nasync function installBetaFirefox() {\n const { location } = window;\n try {\n const res = await fetch('https://api.github.com/repos/violentmonkey/violentmonkey/releases');\n const data = await res.json();\n const latestBeta = data.find(item => item.prerelease);\n const xpi = latestBeta.assets.find(item => item.name.endsWith('.xpi'));\n location.assign(xpi.browser_download_url);\n } catch {\n location.assign('https://github.com/violentmonkey/violentmonkey/releases');\n }\n}\n\nfunction collectData(target, defaults) {\n const category = target.closest('[data-ga-category]')?.dataset.gaCategory;\n const action = target.closest('[data-ga-action]')?.dataset.gaAction;\n const label = target.closest('[data-ga-label]')?.dataset.gaLabel;\n return {\n category: 'global',\n ...defaults,\n ...category && { category },\n ...action && { action },\n ...label && { label },\n };\n}\n\nexport function onRouteUpdate() {\n const { hash } = window.location;\n let target;\n try {\n target = hash && document.querySelector(hash);\n } catch {\n // ignore\n }\n if (target) {\n const rect = target.getBoundingClientRect();\n const el = document.scrollingElement;\n el.scrollTop = el.scrollTop + rect.top - 70;\n }\n}\n","import escapeStringRegexp from \"escape-string-regexp\";\nimport { withPrefix } from \"gatsby\";\nexport const userIsForcingNavigation = event => event.button !== 0 || event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;\n\n// IE does not include leading slash in anchor.pathname\nexport const slashedPathname = pathname => pathname[0] === `/` ? pathname : `/${pathname}`;\nexport const navigationWasHandledElsewhere = event => event.defaultPrevented;\nexport const findClosestAnchor = node => {\n for (; node.parentNode; node = node.parentNode) {\n if (node.nodeName.toLowerCase() === `a`) {\n return node;\n }\n }\n return null;\n};\nexport const anchorsTargetIsEquivalentToSelf = anchor => /* If target attribute is not present it's treated as _self */\nanchor.hasAttribute(`target`) === false ||\n/**\n * The browser defaults to _self, but, not all browsers set\n * a.target to the string value `_self` by default\n */\n\n/**\n * Assumption: some browsers use null/undefined for default\n * attribute values\n */\nanchor.target == null ||\n/**\n * Some browsers use the empty string to mean _self, check\n * for actual `_self`\n */\n[`_self`, ``].includes(anchor.target) ||\n/**\n * As per https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#attr-target\n */\nanchor.target === `_parent` && (!anchor.ownerDocument.defaultView.parent ||\n// Assumption: This can be falsey\nanchor.ownerDocument.defaultView.parent === anchor.ownerDocument.defaultView) || anchor.target === `_top` && (!anchor.ownerDocument.defaultView.top ||\n// Assumption: This can be falsey\nanchor.ownerDocument.defaultView.top === anchor.ownerDocument.defaultView);\nexport const authorIsForcingNavigation = anchor =>\n/**\n * HTML5 attribute that informs the browser to handle the\n * href as a downloadable file; let the browser handle it\n */\nanchor.hasAttribute(`download`) === true ||\n/**\n * Let the browser handle anything that doesn't look like a\n * target=\"_self\" anchor\n */\nanchorsTargetIsEquivalentToSelf(anchor) === false;\n\n// https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy\nexport const urlsAreOnSameOrigin = (origin, destination) => origin.protocol === destination.protocol && /* a.host includes both hostname and port in the expected format host:port */\norigin.host === destination.host;\nexport const pathIsNotHandledByApp = (destination, pathStartRegEx) => {\n const pathFileExtensionRegEx = /^.*\\.((?!htm)[a-z0-9]{1,5})$/i;\n return (\n /**\n * For when pathPrefix is used in an app and there happens to be a link\n * pointing to the same domain but outside of the app's pathPrefix. For\n * example, a Gatsby app lives at https://example.com/myapp/, with the\n * pathPrefix set to `/myapp`. When adding an absolute link to the same\n * domain but outside of the /myapp path, for example, `` the plugin won't catch it and\n * will navigate to an external link instead of doing a pushState resulting\n * in `https://example.com/myapp/https://example.com/not-my-app`\n */\n pathStartRegEx.test(slashedPathname(destination.pathname)) === false ||\n /**\n * Don't catch links pointed at what look like file extensions (other than\n * .htm/html extensions).\n */\n destination.pathname.search(pathFileExtensionRegEx) !== -1\n );\n};\nexport const hashShouldBeFollowed = (origin, destination) => destination.hash !== `` && (\n/**\n * Dynamically created anchor links (href=\"#my-anchor\") do not always\n * have pathname on IE\n */\ndestination.pathname === `` || /* Don't catch links pointed to the same page but with a hash. */\ndestination.pathname === origin.pathname);\nexport const routeThroughBrowserOrApp = (hrefHandler, pluginOptions) => event => {\n if (window.___failedResources) return true;\n if (userIsForcingNavigation(event)) return true;\n if (navigationWasHandledElsewhere(event)) return true;\n const clickedAnchor = findClosestAnchor(event.target);\n if (clickedAnchor == null) return true;\n if (authorIsForcingNavigation(clickedAnchor)) return true;\n\n // IE clears the host value if the anchor href changed after creation, e.g.\n // in React. Creating a new anchor element to ensure host value is present\n const destination = document.createElement(`a`);\n\n // https://html.spec.whatwg.org/multipage/links.html#concept-hyperlink-url-set\n // If clickedAnchor has no href attribute like `
example`, the href getter returns empty string.\n if (clickedAnchor.href !== ``) {\n destination.href = clickedAnchor.href;\n }\n if (`SVGAnimatedString` in window && clickedAnchor.href instanceof SVGAnimatedString) {\n destination.href = clickedAnchor.href.animVal;\n }\n\n // In IE, the default port is included in the anchor host but excluded from\n // the location host. This affects the ability to directly compare\n // location host to anchor host. For example: http://example.com would\n // have a location.host of 'example.com' and an destination.host of\n // 'example.com:80' Creating anchor from the location.href to normalize the\n // host value.\n const origin = document.createElement(`a`);\n origin.href = window.location.href;\n if (urlsAreOnSameOrigin(origin, destination) === false) return true;\n\n // Regex to test pathname against pathPrefix\n const pathStartRegEx = new RegExp(`^${escapeStringRegexp(withPrefix(`/`))}`);\n if (pathIsNotHandledByApp(destination, pathStartRegEx)) return true;\n if (hashShouldBeFollowed(origin, destination)) return true;\n if (pluginOptions.excludePattern) {\n const excludeRegex = new RegExp(pluginOptions.excludePattern);\n if (excludeRegex.test(destination.pathname)) {\n return true;\n }\n }\n event.preventDefault();\n\n // See issue #8907: destination.pathname already includes pathPrefix added\n // by gatsby-transformer-remark but gatsby-link.navigate needs href without\n const destinationPathname = slashedPathname(destination.pathname).replace(pathStartRegEx, `/`);\n hrefHandler(`${destinationPathname}${destination.search}${destination.hash}`);\n return false;\n};\nexport default function (root, pluginOptions, cb) {\n const clickHandler = routeThroughBrowserOrApp(cb, pluginOptions);\n root.addEventListener(`click`, clickHandler);\n return () => root.removeEventListener(`click`, clickHandler);\n}","import { navigate } from \"gatsby\";\nimport catchLinks from \"./catch-links\";\nexport const onClientEntry = (_, pluginOptions = {}) => {\n catchLinks(window, pluginOptions, href => {\n navigate(href);\n });\n};","\"use strict\";\n\nexports.onRouteUpdate = function (_ref, pluginOptions) {\n var location = _ref.location;\n if (pluginOptions === void 0) {\n pluginOptions = {};\n }\n if (process.env.NODE_ENV !== \"production\" || typeof gtag !== \"function\") {\n return null;\n }\n var pluginConfig = pluginOptions.pluginConfig || {};\n var pathIsExcluded = location && typeof window.excludeGtagPaths !== \"undefined\" && window.excludeGtagPaths.some(function (rx) {\n return rx.test(location.pathname);\n });\n if (pathIsExcluded) return null;\n\n // wrap inside a timeout to make sure react-helmet is done with its changes (https://github.com/gatsbyjs/gatsby/issues/11592)\n var sendPageView = function sendPageView() {\n var pagePath = location ? location.pathname + location.search + location.hash : undefined;\n window.gtag(\"event\", \"page_view\", {\n page_path: pagePath\n });\n };\n var _pluginConfig$delayOn = pluginConfig.delayOnRouteUpdate,\n delayOnRouteUpdate = _pluginConfig$delayOn === void 0 ? 0 : _pluginConfig$delayOn;\n if (\"requestAnimationFrame\" in window) {\n requestAnimationFrame(function () {\n requestAnimationFrame(function () {\n return setTimeout(sendPageView, delayOnRouteUpdate);\n });\n });\n } else {\n // Delay by 32ms to simulate 2 requestOnAnimationFrame calls\n setTimeout(sendPageView, 32 + delayOnRouteUpdate);\n }\n return null;\n};","/* global __MANIFEST_PLUGIN_HAS_LOCALISATION__ */\nimport { withPrefix } from \"gatsby\";\nimport getManifestForPathname from \"./get-manifest-pathname\";\n\n// when we don't have localisation in our manifest, we tree shake everything away\nexport const onRouteUpdate = function onRouteUpdate({\n location\n}, pluginOptions) {\n if (__MANIFEST_PLUGIN_HAS_LOCALISATION__) {\n const {\n localize\n } = pluginOptions;\n const manifestFilename = getManifestForPathname(location.pathname, localize, true);\n const manifestEl = document.head.querySelector(`link[rel=\"manifest\"]`);\n if (manifestEl) {\n manifestEl.setAttribute(`href`, withPrefix(manifestFilename));\n }\n }\n};","\"use strict\";\n\nexports.__esModule = true;\nexports.default = void 0;\nvar _gatsby = require(\"gatsby\");\n/**\n * Get a manifest filename depending on localized pathname\n *\n * @param {string} pathname\n * @param {Array<{start_url: string, lang: string}>} localizedManifests\n * @param {boolean} shouldPrependPathPrefix\n * @return string\n */\nvar _default = (pathname, localizedManifests, shouldPrependPathPrefix = false) => {\n const defaultFilename = `manifest.webmanifest`;\n if (!Array.isArray(localizedManifests)) {\n return defaultFilename;\n }\n const localizedManifest = localizedManifests.find(app => {\n let startUrl = app.start_url;\n if (shouldPrependPathPrefix) {\n startUrl = (0, _gatsby.withPrefix)(startUrl);\n }\n return pathname.startsWith(startUrl);\n });\n if (!localizedManifest) {\n return defaultFilename;\n }\n return `manifest_${localizedManifest.lang}.webmanifest`;\n};\nexports.default = _default;","\"use strict\";\n\nexports.registerServiceWorker = function () {\n return process.env.GATSBY_IS_PREVIEW !== \"true\";\n};\n\n// only cache relevant resources for this page\nvar whiteListLinkRels = /^(stylesheet|preload)$/;\nvar prefetchedPathnames = [];\nexports.onServiceWorkerActive = function (_ref) {\n var getResourceURLsForPathname = _ref.getResourceURLsForPathname,\n serviceWorker = _ref.serviceWorker;\n if (process.env.GATSBY_IS_PREVIEW === \"true\") {\n return;\n }\n\n // if the SW has just updated then clear the path dependencies and don't cache\n // stuff, since we're on the old revision until we navigate to another page\n if (window.___swUpdated) {\n serviceWorker.active.postMessage({\n gatsbyApi: \"clearPathResources\"\n });\n return;\n }\n\n // grab nodes from head of document\n var nodes = document.querySelectorAll(\"\\n head > script[src],\\n head > link[href],\\n head > style[data-href]\\n \");\n\n // get all resource URLs\n var headerResources = [].slice.call(nodes)\n // don't include preconnect/prefetch/prerender resources\n .filter(function (node) {\n return node.tagName !== \"LINK\" || whiteListLinkRels.test(node.getAttribute(\"rel\"));\n }).map(function (node) {\n return node.src || node.href || node.getAttribute(\"data-href\");\n });\n\n // Loop over prefetched pages and add their resources to an array,\n // plus specify which resources are required for those paths.\n var prefetchedResources = [];\n prefetchedPathnames.forEach(function (path) {\n var resources = getResourceURLsForPathname(path);\n prefetchedResources.push.apply(prefetchedResources, resources);\n serviceWorker.active.postMessage({\n gatsbyApi: \"setPathResources\",\n path: path,\n resources: resources\n });\n });\n\n // Loop over all resources and fetch the page component + JSON data\n // to add it to the SW cache.\n var resources = [].concat(headerResources, prefetchedResources);\n resources.forEach(function (resource) {\n // Create a prefetch link for each resource, so Workbox runtime-caches them\n var link = document.createElement(\"link\");\n link.rel = \"prefetch\";\n link.href = resource;\n link.onload = link.remove;\n link.onerror = link.remove;\n document.head.appendChild(link);\n });\n};\nfunction setPathResources(path, getResourceURLsForPathname) {\n // do nothing if the SW has just updated, since we still have old pages in\n // memory which we don't want to be whitelisted\n if (window.___swUpdated) return;\n if (\"serviceWorker\" in navigator) {\n var _navigator = navigator,\n serviceWorker = _navigator.serviceWorker;\n if (serviceWorker.controller === null) {\n // if SW is not installed, we need to record any prefetches\n // that happen so we can then add them to SW cache once installed\n prefetchedPathnames.push(path);\n } else {\n var resources = getResourceURLsForPathname(path);\n serviceWorker.controller.postMessage({\n gatsbyApi: \"setPathResources\",\n path: path,\n resources: resources\n });\n }\n }\n}\nexports.onRouteUpdate = function (_ref2) {\n var location = _ref2.location,\n getResourceURLsForPathname = _ref2.getResourceURLsForPathname;\n var pathname = location.pathname.replace(__BASE_PATH__, \"\");\n setPathResources(pathname, getResourceURLsForPathname);\n if (\"serviceWorker\" in navigator && navigator.serviceWorker.controller !== null) {\n navigator.serviceWorker.controller.postMessage({\n gatsbyApi: \"enableOfflineShell\"\n });\n }\n};\nexports.onPostPrefetchPathname = function (_ref3) {\n var pathname = _ref3.pathname,\n getResourceURLsForPathname = _ref3.getResourceURLsForPathname;\n setPathResources(pathname, getResourceURLsForPathname);\n};","\"use strict\";\n\nvar offsetY = 0;\nvar getTargetOffset = function getTargetOffset(hash) {\n var id = window.decodeURI(hash.replace(\"#\", \"\"));\n if (id !== \"\") {\n var element = document.getElementById(id);\n if (element) {\n var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;\n var clientTop = document.documentElement.clientTop || document.body.clientTop || 0;\n var computedStyles = window.getComputedStyle(element);\n var scrollMarginTop = computedStyles.getPropertyValue(\"scroll-margin-top\") || computedStyles.getPropertyValue(\"scroll-snap-margin-top\") || \"0px\";\n return element.getBoundingClientRect().top + scrollTop - parseInt(scrollMarginTop, 10) - clientTop - offsetY;\n }\n }\n return null;\n};\nexports.onInitialClientRender = function (_, pluginOptions) {\n if (pluginOptions.offsetY) {\n offsetY = pluginOptions.offsetY;\n }\n requestAnimationFrame(function () {\n var offset = getTargetOffset(window.location.hash);\n if (offset !== null) {\n window.scrollTo(0, offset);\n }\n });\n};\nexports.shouldUpdateScroll = function (_ref) {\n var location = _ref.routerProps.location;\n var offset = getTargetOffset(location.hash);\n return offset !== null ? [0, offset] : true;\n};","\"use strict\";\n\nexports.DEFAULT_OPTIONS = {\n maxWidth: 650,\n wrapperStyle: \"\",\n backgroundColor: \"white\",\n linkImagesToOriginal: true,\n showCaptions: false,\n markdownCaptions: false,\n withWebp: false,\n withAvif: false,\n tracedSVG: false,\n loading: \"lazy\",\n decoding: \"async\",\n disableBgImageOnAlpha: false,\n disableBgImage: false\n};\nexports.EMPTY_ALT = \"GATSBY_EMPTY_ALT\";\nexports.imageClass = \"gatsby-resp-image-image\";\nexports.imageWrapperClass = \"gatsby-resp-image-wrapper\";\nexports.imageBackgroundClass = \"gatsby-resp-image-background-image\";","\"use strict\";\n\nvar _require = require(\"./constants\"),\n DEFAULT_OPTIONS = _require.DEFAULT_OPTIONS,\n imageClass = _require.imageClass,\n imageBackgroundClass = _require.imageBackgroundClass,\n imageWrapperClass = _require.imageWrapperClass;\nexports.onRouteUpdate = function (apiCallbackContext, pluginOptions) {\n var options = Object.assign({}, DEFAULT_OPTIONS, pluginOptions);\n var imageWrappers = document.querySelectorAll(\".\" + imageWrapperClass);\n\n // https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\n // for cross-browser looping through NodeList without polyfills\n var _loop = function _loop() {\n var imageWrapper = imageWrappers[i];\n var backgroundElement = imageWrapper.querySelector(\".\" + imageBackgroundClass);\n var imageElement = imageWrapper.querySelector(\".\" + imageClass);\n var onImageLoad = function onImageLoad() {\n backgroundElement.style.transition = \"opacity 0.5s 0.5s\";\n imageElement.style.transition = \"opacity 0.5s\";\n onImageComplete();\n };\n var onImageComplete = function onImageComplete() {\n backgroundElement.style.opacity = 0;\n imageElement.style.opacity = 1;\n imageElement.style.color = \"inherit\";\n imageElement.style.boxShadow = \"inset 0px 0px 0px 400px \" + options.backgroundColor;\n imageElement.removeEventListener(\"load\", onImageLoad);\n imageElement.removeEventListener(\"error\", onImageComplete);\n };\n imageElement.style.opacity = 0;\n imageElement.addEventListener(\"load\", onImageLoad);\n imageElement.addEventListener(\"error\", onImageComplete);\n if (imageElement.complete) {\n onImageComplete();\n }\n };\n for (var i = 0; i < imageWrappers.length; i++) {\n _loop();\n }\n};","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n if (process.env.NODE_ENV !== 'production') {\n if (format === undefined) {\n throw new Error('invariant requires an error message argument');\n }\n }\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error(\n 'Minified exception occurred; use the non-minified dev environment ' +\n 'for the full error message and additional helpful warnings.'\n );\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error(\n format.replace(/%s/g, function() { return args[argIndex++]; })\n );\n error.name = 'Invariant Violation';\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n};\n\nmodule.exports = invariant;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","/**\n * @license React\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var aa=require(\"react\"),ca=require(\"scheduler\");function p(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;cb}return!1}function v(a,b,c,d,e,f,g){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f;this.removeEmptyString=g}var z={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){z[a]=new v(a,0,!1,a,null,!1,!1)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];z[b]=new v(b,1,!1,a[1],null,!1,!1)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){z[a]=new v(a,2,!1,a.toLowerCase(),null,!1,!1)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){z[a]=new v(a,2,!1,a,null,!1,!1)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){z[a]=new v(a,3,!1,a.toLowerCase(),null,!1,!1)});\n[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){z[a]=new v(a,3,!0,a,null,!1,!1)});[\"capture\",\"download\"].forEach(function(a){z[a]=new v(a,4,!1,a,null,!1,!1)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){z[a]=new v(a,6,!1,a,null,!1,!1)});[\"rowSpan\",\"start\"].forEach(function(a){z[a]=new v(a,5,!1,a.toLowerCase(),null,!1,!1)});var ra=/[\\-:]([a-z])/g;function sa(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(ra,\nsa);z[b]=new v(b,1,!1,a,null,!1,!1)});\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/1999/xlink\",!1,!1)});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\",!1,!1)});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!1,!1)});\nz.xlinkHref=new v(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0,!1);[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!0,!0)});\nfunction ta(a,b,c,d){var e=z.hasOwnProperty(b)?z[b]:null;if(null!==e?0!==e.type:d||!(2h||e[g]!==f[h]){var k=\"\\n\"+e[g].replace(\" at new \",\" at \");a.displayName&&k.includes(\"\")&&(k=k.replace(\"\",a.displayName));return k}while(1<=g&&0<=h)}break}}}finally{Na=!1,Error.prepareStackTrace=c}return(a=a?a.displayName||a.name:\"\")?Ma(a):\"\"}\nfunction Pa(a){switch(a.tag){case 5:return Ma(a.type);case 16:return Ma(\"Lazy\");case 13:return Ma(\"Suspense\");case 19:return Ma(\"SuspenseList\");case 0:case 2:case 15:return a=Oa(a.type,!1),a;case 11:return a=Oa(a.type.render,!1),a;case 1:return a=Oa(a.type,!0),a;default:return\"\"}}\nfunction Qa(a){if(null==a)return null;if(\"function\"===typeof a)return a.displayName||a.name||null;if(\"string\"===typeof a)return a;switch(a){case ya:return\"Fragment\";case wa:return\"Portal\";case Aa:return\"Profiler\";case za:return\"StrictMode\";case Ea:return\"Suspense\";case Fa:return\"SuspenseList\"}if(\"object\"===typeof a)switch(a.$$typeof){case Ca:return(a.displayName||\"Context\")+\".Consumer\";case Ba:return(a._context.displayName||\"Context\")+\".Provider\";case Da:var b=a.render;a=a.displayName;a||(a=b.displayName||\nb.name||\"\",a=\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");return a;case Ga:return b=a.displayName||null,null!==b?b:Qa(a.type)||\"Memo\";case Ha:b=a._payload;a=a._init;try{return Qa(a(b))}catch(c){}}return null}\nfunction Ra(a){var b=a.type;switch(a.tag){case 24:return\"Cache\";case 9:return(b.displayName||\"Context\")+\".Consumer\";case 10:return(b._context.displayName||\"Context\")+\".Provider\";case 18:return\"DehydratedFragment\";case 11:return a=b.render,a=a.displayName||a.name||\"\",b.displayName||(\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");case 7:return\"Fragment\";case 5:return b;case 4:return\"Portal\";case 3:return\"Root\";case 6:return\"Text\";case 16:return Qa(b);case 8:return b===za?\"StrictMode\":\"Mode\";case 22:return\"Offscreen\";\ncase 12:return\"Profiler\";case 21:return\"Scope\";case 13:return\"Suspense\";case 19:return\"SuspenseList\";case 25:return\"TracingMarker\";case 1:case 0:case 17:case 2:case 14:case 15:if(\"function\"===typeof b)return b.displayName||b.name||null;if(\"string\"===typeof b)return b}return null}function Sa(a){switch(typeof a){case \"boolean\":case \"number\":case \"string\":case \"undefined\":return a;case \"object\":return a;default:return\"\"}}\nfunction Ta(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction Ua(a){var b=Ta(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"undefined\"!==typeof c&&\"function\"===typeof c.get&&\"function\"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=\"\"+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function Va(a){a._valueTracker||(a._valueTracker=Ua(a))}function Wa(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=Ta(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Xa(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}\nfunction Ya(a,b){var c=b.checked;return A({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}function Za(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=Sa(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function ab(a,b){b=b.checked;null!=b&&ta(a,\"checked\",b,!1)}\nfunction bb(a,b){ab(a,b);var c=Sa(b.value),d=b.type;if(null!=c)if(\"number\"===d){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);else if(\"submit\"===d||\"reset\"===d){a.removeAttribute(\"value\");return}b.hasOwnProperty(\"value\")?cb(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&cb(a,b.type,Sa(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction db(a,b,c){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\")){var d=b.type;if(!(\"submit\"!==d&&\"reset\"!==d||void 0!==b.value&&null!==b.value))return;b=\"\"+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;\"\"!==c&&(a.name=\"\");a.defaultChecked=!!a._wrapperState.initialChecked;\"\"!==c&&(a.name=c)}\nfunction cb(a,b,c){if(\"number\"!==b||Xa(a.ownerDocument)!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}var eb=Array.isArray;\nfunction fb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e\"+b.valueOf().toString()+\"\";for(b=mb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction ob(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}\nvar pb={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,\nzoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},qb=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(pb).forEach(function(a){qb.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);pb[b]=pb[a]})});function rb(a,b,c){return null==b||\"boolean\"===typeof b||\"\"===b?\"\":c||\"number\"!==typeof b||0===b||pb.hasOwnProperty(a)&&pb[a]?(\"\"+b).trim():b+\"px\"}\nfunction sb(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\"),e=rb(c,b[c],d);\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var tb=A({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction ub(a,b){if(b){if(tb[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(p(137,a));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(p(60));if(\"object\"!==typeof b.dangerouslySetInnerHTML||!(\"__html\"in b.dangerouslySetInnerHTML))throw Error(p(61));}if(null!=b.style&&\"object\"!==typeof b.style)throw Error(p(62));}}\nfunction vb(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}var wb=null;function xb(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}var yb=null,zb=null,Ab=null;\nfunction Bb(a){if(a=Cb(a)){if(\"function\"!==typeof yb)throw Error(p(280));var b=a.stateNode;b&&(b=Db(b),yb(a.stateNode,a.type,b))}}function Eb(a){zb?Ab?Ab.push(a):Ab=[a]:zb=a}function Fb(){if(zb){var a=zb,b=Ab;Ab=zb=null;Bb(a);if(b)for(a=0;a>>=0;return 0===a?32:31-(pc(a)/qc|0)|0}var rc=64,sc=4194304;\nfunction tc(a){switch(a&-a){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return a&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return a&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;\ndefault:return a}}function uc(a,b){var c=a.pendingLanes;if(0===c)return 0;var d=0,e=a.suspendedLanes,f=a.pingedLanes,g=c&268435455;if(0!==g){var h=g&~e;0!==h?d=tc(h):(f&=g,0!==f&&(d=tc(f)))}else g=c&~e,0!==g?d=tc(g):0!==f&&(d=tc(f));if(0===d)return 0;if(0!==b&&b!==d&&0===(b&e)&&(e=d&-d,f=b&-b,e>=f||16===e&&0!==(f&4194240)))return b;0!==(d&4)&&(d|=c&16);b=a.entangledLanes;if(0!==b)for(a=a.entanglements,b&=d;0c;c++)b.push(a);return b}\nfunction Ac(a,b,c){a.pendingLanes|=b;536870912!==b&&(a.suspendedLanes=0,a.pingedLanes=0);a=a.eventTimes;b=31-oc(b);a[b]=c}function Bc(a,b){var c=a.pendingLanes&~b;a.pendingLanes=b;a.suspendedLanes=0;a.pingedLanes=0;a.expiredLanes&=b;a.mutableReadLanes&=b;a.entangledLanes&=b;b=a.entanglements;var d=a.eventTimes;for(a=a.expirationTimes;0=be),ee=String.fromCharCode(32),fe=!1;\nfunction ge(a,b){switch(a){case \"keyup\":return-1!==$d.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"focusout\":return!0;default:return!1}}function he(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var ie=!1;function je(a,b){switch(a){case \"compositionend\":return he(b);case \"keypress\":if(32!==b.which)return null;fe=!0;return ee;case \"textInput\":return a=b.data,a===ee&&fe?null:a;default:return null}}\nfunction ke(a,b){if(ie)return\"compositionend\"===a||!ae&&ge(a,b)?(a=nd(),md=ld=kd=null,ie=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=Je(c)}}function Le(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Le(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}\nfunction Me(){for(var a=window,b=Xa();b instanceof a.HTMLIFrameElement;){try{var c=\"string\"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=Xa(a.document)}return b}function Ne(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}\nfunction Oe(a){var b=Me(),c=a.focusedElem,d=a.selectionRange;if(b!==c&&c&&c.ownerDocument&&Le(c.ownerDocument.documentElement,c)){if(null!==d&&Ne(c))if(b=d.start,a=d.end,void 0===a&&(a=b),\"selectionStart\"in c)c.selectionStart=b,c.selectionEnd=Math.min(a,c.value.length);else if(a=(b=c.ownerDocument||document)&&b.defaultView||window,a.getSelection){a=a.getSelection();var e=c.textContent.length,f=Math.min(d.start,e);d=void 0===d.end?f:Math.min(d.end,e);!a.extend&&f>d&&(e=d,d=f,f=e);e=Ke(c,f);var g=Ke(c,\nd);e&&g&&(1!==a.rangeCount||a.anchorNode!==e.node||a.anchorOffset!==e.offset||a.focusNode!==g.node||a.focusOffset!==g.offset)&&(b=b.createRange(),b.setStart(e.node,e.offset),a.removeAllRanges(),f>d?(a.addRange(b),a.extend(g.node,g.offset)):(b.setEnd(g.node,g.offset),a.addRange(b)))}b=[];for(a=c;a=a.parentNode;)1===a.nodeType&&b.push({element:a,left:a.scrollLeft,top:a.scrollTop});\"function\"===typeof c.focus&&c.focus();for(c=0;c=document.documentMode,Qe=null,Re=null,Se=null,Te=!1;\nfunction Ue(a,b,c){var d=c.window===c?c.document:9===c.nodeType?c:c.ownerDocument;Te||null==Qe||Qe!==Xa(d)||(d=Qe,\"selectionStart\"in d&&Ne(d)?d={start:d.selectionStart,end:d.selectionEnd}:(d=(d.ownerDocument&&d.ownerDocument.defaultView||window).getSelection(),d={anchorNode:d.anchorNode,anchorOffset:d.anchorOffset,focusNode:d.focusNode,focusOffset:d.focusOffset}),Se&&Ie(Se,d)||(Se=d,d=oe(Re,\"onSelect\"),0Tf||(a.current=Sf[Tf],Sf[Tf]=null,Tf--)}function G(a,b){Tf++;Sf[Tf]=a.current;a.current=b}var Vf={},H=Uf(Vf),Wf=Uf(!1),Xf=Vf;function Yf(a,b){var c=a.type.contextTypes;if(!c)return Vf;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}\nfunction Zf(a){a=a.childContextTypes;return null!==a&&void 0!==a}function $f(){E(Wf);E(H)}function ag(a,b,c){if(H.current!==Vf)throw Error(p(168));G(H,b);G(Wf,c)}function bg(a,b,c){var d=a.stateNode;b=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in b))throw Error(p(108,Ra(a)||\"Unknown\",e));return A({},c,d)}\nfunction cg(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Vf;Xf=H.current;G(H,a);G(Wf,Wf.current);return!0}function dg(a,b,c){var d=a.stateNode;if(!d)throw Error(p(169));c?(a=bg(a,b,Xf),d.__reactInternalMemoizedMergedChildContext=a,E(Wf),E(H),G(H,a)):E(Wf);G(Wf,c)}var eg=null,fg=!1,gg=!1;function hg(a){null===eg?eg=[a]:eg.push(a)}function ig(a){fg=!0;hg(a)}\nfunction jg(){if(!gg&&null!==eg){gg=!0;var a=0,b=C;try{var c=eg;for(C=1;a>=g;e-=g;rg=1<<32-oc(b)+e|c<w?(x=u,u=null):x=u.sibling;var n=r(e,u,h[w],k);if(null===n){null===u&&(u=x);break}a&&u&&null===n.alternate&&b(e,u);g=f(n,g,w);null===m?l=n:m.sibling=n;m=n;u=x}if(w===h.length)return c(e,u),I&&tg(e,w),l;if(null===u){for(;ww?(x=m,m=null):x=m.sibling;var t=r(e,m,n.value,k);if(null===t){null===m&&(m=x);break}a&&m&&null===t.alternate&&b(e,m);g=f(t,g,w);null===u?l=t:u.sibling=t;u=t;m=x}if(n.done)return c(e,\nm),I&&tg(e,w),l;if(null===m){for(;!n.done;w++,n=h.next())n=q(e,n.value,k),null!==n&&(g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);I&&tg(e,w);return l}for(m=d(e,m);!n.done;w++,n=h.next())n=y(m,e,w,n.value,k),null!==n&&(a&&null!==n.alternate&&m.delete(null===n.key?w:n.key),g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);a&&m.forEach(function(a){return b(e,a)});I&&tg(e,w);return l}function J(a,d,f,h){\"object\"===typeof f&&null!==f&&f.type===ya&&null===f.key&&(f=f.props.children);if(\"object\"===typeof f&&null!==f){switch(f.$$typeof){case va:a:{for(var k=\nf.key,l=d;null!==l;){if(l.key===k){k=f.type;if(k===ya){if(7===l.tag){c(a,l.sibling);d=e(l,f.props.children);d.return=a;a=d;break a}}else if(l.elementType===k||\"object\"===typeof k&&null!==k&&k.$$typeof===Ha&&uh(k)===l.type){c(a,l.sibling);d=e(l,f.props);d.ref=sh(a,l,f);d.return=a;a=d;break a}c(a,l);break}else b(a,l);l=l.sibling}f.type===ya?(d=Ah(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=yh(f.type,f.key,f.props,null,a.mode,h),h.ref=sh(a,d,f),h.return=a,a=h)}return g(a);case wa:a:{for(l=f.key;null!==\nd;){if(d.key===l)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=zh(f,a.mode,h);d.return=a;a=d}return g(a);case Ha:return l=f._init,J(a,d,l(f._payload),h)}if(eb(f))return n(a,d,f,h);if(Ka(f))return t(a,d,f,h);th(a,f)}return\"string\"===typeof f&&\"\"!==f||\"number\"===typeof f?(f=\"\"+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):\n(c(a,d),d=xh(f,a.mode,h),d.return=a,a=d),g(a)):c(a,d)}return J}var Bh=vh(!0),Ch=vh(!1),Dh={},Eh=Uf(Dh),Fh=Uf(Dh),Gh=Uf(Dh);function Hh(a){if(a===Dh)throw Error(p(174));return a}function Ih(a,b){G(Gh,b);G(Fh,a);G(Eh,Dh);a=b.nodeType;switch(a){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:lb(null,\"\");break;default:a=8===a?b.parentNode:b,b=a.namespaceURI||null,a=a.tagName,b=lb(b,a)}E(Eh);G(Eh,b)}function Jh(){E(Eh);E(Fh);E(Gh)}\nfunction Kh(a){Hh(Gh.current);var b=Hh(Eh.current);var c=lb(b,a.type);b!==c&&(G(Fh,a),G(Eh,c))}function Lh(a){Fh.current===a&&(E(Eh),E(Fh))}var M=Uf(0);\nfunction Mh(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||\"$?\"===c.data||\"$!\"===c.data))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.flags&128))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}return null}var Nh=[];\nfunction Oh(){for(var a=0;ac?c:4;a(!0);var d=Qh.transition;Qh.transition={};try{a(!1),b()}finally{C=c,Qh.transition=d}}function Fi(){return di().memoizedState}\nfunction Gi(a,b,c){var d=lh(a);c={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(Hi(a))Ii(b,c);else if(c=Yg(a,b,c,d),null!==c){var e=L();mh(c,a,d,e);Ji(c,b,d)}}\nfunction ri(a,b,c){var d=lh(a),e={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(Hi(a))Ii(b,e);else{var f=a.alternate;if(0===a.lanes&&(null===f||0===f.lanes)&&(f=b.lastRenderedReducer,null!==f))try{var g=b.lastRenderedState,h=f(g,c);e.hasEagerState=!0;e.eagerState=h;if(He(h,g)){var k=b.interleaved;null===k?(e.next=e,Xg(b)):(e.next=k.next,k.next=e);b.interleaved=e;return}}catch(l){}finally{}c=Yg(a,b,e,d);null!==c&&(e=L(),mh(c,a,d,e),Ji(c,b,d))}}\nfunction Hi(a){var b=a.alternate;return a===N||null!==b&&b===N}function Ii(a,b){Th=Sh=!0;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}function Ji(a,b,c){if(0!==(c&4194240)){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nvar ai={readContext:Vg,useCallback:Q,useContext:Q,useEffect:Q,useImperativeHandle:Q,useInsertionEffect:Q,useLayoutEffect:Q,useMemo:Q,useReducer:Q,useRef:Q,useState:Q,useDebugValue:Q,useDeferredValue:Q,useTransition:Q,useMutableSource:Q,useSyncExternalStore:Q,useId:Q,unstable_isNewReconciler:!1},Yh={readContext:Vg,useCallback:function(a,b){ci().memoizedState=[a,void 0===b?null:b];return a},useContext:Vg,useEffect:vi,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return ti(4194308,\n4,yi.bind(null,b,a),c)},useLayoutEffect:function(a,b){return ti(4194308,4,a,b)},useInsertionEffect:function(a,b){return ti(4,2,a,b)},useMemo:function(a,b){var c=ci();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=ci();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};d.queue=a;a=a.dispatch=Gi.bind(null,N,a);return[d.memoizedState,a]},useRef:function(a){var b=\nci();a={current:a};return b.memoizedState=a},useState:qi,useDebugValue:Ai,useDeferredValue:function(a){return ci().memoizedState=a},useTransition:function(){var a=qi(!1),b=a[0];a=Ei.bind(null,a[1]);ci().memoizedState=a;return[b,a]},useMutableSource:function(){},useSyncExternalStore:function(a,b,c){var d=N,e=ci();if(I){if(void 0===c)throw Error(p(407));c=c()}else{c=b();if(null===R)throw Error(p(349));0!==(Rh&30)||ni(d,b,c)}e.memoizedState=c;var f={value:c,getSnapshot:b};e.queue=f;vi(ki.bind(null,d,\nf,a),[a]);d.flags|=2048;li(9,mi.bind(null,d,f,c,b),void 0,null);return c},useId:function(){var a=ci(),b=R.identifierPrefix;if(I){var c=sg;var d=rg;c=(d&~(1<<32-oc(d)-1)).toString(32)+c;b=\":\"+b+\"R\"+c;c=Uh++;0\\x3c/script>\",a=a.removeChild(a.firstChild)):\n\"string\"===typeof d.is?a=g.createElement(c,{is:d.is}):(a=g.createElement(c),\"select\"===c&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,c);a[Of]=b;a[Pf]=d;Aj(a,b,!1,!1);b.stateNode=a;a:{g=vb(c,d);switch(c){case \"dialog\":D(\"cancel\",a);D(\"close\",a);e=d;break;case \"iframe\":case \"object\":case \"embed\":D(\"load\",a);e=d;break;case \"video\":case \"audio\":for(e=0;eHj&&(b.flags|=128,d=!0,Ej(f,!1),b.lanes=4194304)}else{if(!d)if(a=Mh(g),null!==a){if(b.flags|=128,d=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.flags|=4),Ej(f,!0),null===f.tail&&\"hidden\"===f.tailMode&&!g.alternate&&!I)return S(b),null}else 2*B()-f.renderingStartTime>Hj&&1073741824!==c&&(b.flags|=128,d=!0,Ej(f,!1),b.lanes=4194304);f.isBackwards?(g.sibling=b.child,b.child=g):(c=f.last,null!==c?c.sibling=g:b.child=g,f.last=g)}if(null!==f.tail)return b=f.tail,f.rendering=\nb,f.tail=b.sibling,f.renderingStartTime=B(),b.sibling=null,c=M.current,G(M,d?c&1|2:c&1),b;S(b);return null;case 22:case 23:return Ij(),d=null!==b.memoizedState,null!==a&&null!==a.memoizedState!==d&&(b.flags|=8192),d&&0!==(b.mode&1)?0!==(gj&1073741824)&&(S(b),b.subtreeFlags&6&&(b.flags|=8192)):S(b),null;case 24:return null;case 25:return null}throw Error(p(156,b.tag));}\nfunction Jj(a,b){wg(b);switch(b.tag){case 1:return Zf(b.type)&&$f(),a=b.flags,a&65536?(b.flags=a&-65537|128,b):null;case 3:return Jh(),E(Wf),E(H),Oh(),a=b.flags,0!==(a&65536)&&0===(a&128)?(b.flags=a&-65537|128,b):null;case 5:return Lh(b),null;case 13:E(M);a=b.memoizedState;if(null!==a&&null!==a.dehydrated){if(null===b.alternate)throw Error(p(340));Ig()}a=b.flags;return a&65536?(b.flags=a&-65537|128,b):null;case 19:return E(M),null;case 4:return Jh(),null;case 10:return Rg(b.type._context),null;case 22:case 23:return Ij(),\nnull;case 24:return null;default:return null}}var Kj=!1,U=!1,Lj=\"function\"===typeof WeakSet?WeakSet:Set,V=null;function Mj(a,b){var c=a.ref;if(null!==c)if(\"function\"===typeof c)try{c(null)}catch(d){W(a,b,d)}else c.current=null}function Nj(a,b,c){try{c()}catch(d){W(a,b,d)}}var Oj=!1;\nfunction Pj(a,b){Cf=dd;a=Me();if(Ne(a)){if(\"selectionStart\"in a)var c={start:a.selectionStart,end:a.selectionEnd};else a:{c=(c=a.ownerDocument)&&c.defaultView||window;var d=c.getSelection&&c.getSelection();if(d&&0!==d.rangeCount){c=d.anchorNode;var e=d.anchorOffset,f=d.focusNode;d=d.focusOffset;try{c.nodeType,f.nodeType}catch(F){c=null;break a}var g=0,h=-1,k=-1,l=0,m=0,q=a,r=null;b:for(;;){for(var y;;){q!==c||0!==e&&3!==q.nodeType||(h=g+e);q!==f||0!==d&&3!==q.nodeType||(k=g+d);3===q.nodeType&&(g+=\nq.nodeValue.length);if(null===(y=q.firstChild))break;r=q;q=y}for(;;){if(q===a)break b;r===c&&++l===e&&(h=g);r===f&&++m===d&&(k=g);if(null!==(y=q.nextSibling))break;q=r;r=q.parentNode}q=y}c=-1===h||-1===k?null:{start:h,end:k}}else c=null}c=c||{start:0,end:0}}else c=null;Df={focusedElem:a,selectionRange:c};dd=!1;for(V=b;null!==V;)if(b=V,a=b.child,0!==(b.subtreeFlags&1028)&&null!==a)a.return=b,V=a;else for(;null!==V;){b=V;try{var n=b.alternate;if(0!==(b.flags&1024))switch(b.tag){case 0:case 11:case 15:break;\ncase 1:if(null!==n){var t=n.memoizedProps,J=n.memoizedState,x=b.stateNode,w=x.getSnapshotBeforeUpdate(b.elementType===b.type?t:Lg(b.type,t),J);x.__reactInternalSnapshotBeforeUpdate=w}break;case 3:var u=b.stateNode.containerInfo;1===u.nodeType?u.textContent=\"\":9===u.nodeType&&u.documentElement&&u.removeChild(u.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(p(163));}}catch(F){W(b,b.return,F)}a=b.sibling;if(null!==a){a.return=b.return;V=a;break}V=b.return}n=Oj;Oj=!1;return n}\nfunction Qj(a,b,c){var d=b.updateQueue;d=null!==d?d.lastEffect:null;if(null!==d){var e=d=d.next;do{if((e.tag&a)===a){var f=e.destroy;e.destroy=void 0;void 0!==f&&Nj(b,c,f)}e=e.next}while(e!==d)}}function Rj(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.create;c.destroy=d()}c=c.next}while(c!==b)}}function Sj(a){var b=a.ref;if(null!==b){var c=a.stateNode;switch(a.tag){case 5:a=c;break;default:a=c}\"function\"===typeof b?b(a):b.current=a}}\nfunction Tj(a){var b=a.alternate;null!==b&&(a.alternate=null,Tj(b));a.child=null;a.deletions=null;a.sibling=null;5===a.tag&&(b=a.stateNode,null!==b&&(delete b[Of],delete b[Pf],delete b[of],delete b[Qf],delete b[Rf]));a.stateNode=null;a.return=null;a.dependencies=null;a.memoizedProps=null;a.memoizedState=null;a.pendingProps=null;a.stateNode=null;a.updateQueue=null}function Uj(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction Vj(a){a:for(;;){for(;null===a.sibling;){if(null===a.return||Uj(a.return))return null;a=a.return}a.sibling.return=a.return;for(a=a.sibling;5!==a.tag&&6!==a.tag&&18!==a.tag;){if(a.flags&2)continue a;if(null===a.child||4===a.tag)continue a;else a.child.return=a,a=a.child}if(!(a.flags&2))return a.stateNode}}\nfunction Wj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=Bf));else if(4!==d&&(a=a.child,null!==a))for(Wj(a,b,c),a=a.sibling;null!==a;)Wj(a,b,c),a=a.sibling}\nfunction Xj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(Xj(a,b,c),a=a.sibling;null!==a;)Xj(a,b,c),a=a.sibling}var X=null,Yj=!1;function Zj(a,b,c){for(c=c.child;null!==c;)ak(a,b,c),c=c.sibling}\nfunction ak(a,b,c){if(lc&&\"function\"===typeof lc.onCommitFiberUnmount)try{lc.onCommitFiberUnmount(kc,c)}catch(h){}switch(c.tag){case 5:U||Mj(c,b);case 6:var d=X,e=Yj;X=null;Zj(a,b,c);X=d;Yj=e;null!==X&&(Yj?(a=X,c=c.stateNode,8===a.nodeType?a.parentNode.removeChild(c):a.removeChild(c)):X.removeChild(c.stateNode));break;case 18:null!==X&&(Yj?(a=X,c=c.stateNode,8===a.nodeType?Kf(a.parentNode,c):1===a.nodeType&&Kf(a,c),bd(a)):Kf(X,c.stateNode));break;case 4:d=X;e=Yj;X=c.stateNode.containerInfo;Yj=!0;\nZj(a,b,c);X=d;Yj=e;break;case 0:case 11:case 14:case 15:if(!U&&(d=c.updateQueue,null!==d&&(d=d.lastEffect,null!==d))){e=d=d.next;do{var f=e,g=f.destroy;f=f.tag;void 0!==g&&(0!==(f&2)?Nj(c,b,g):0!==(f&4)&&Nj(c,b,g));e=e.next}while(e!==d)}Zj(a,b,c);break;case 1:if(!U&&(Mj(c,b),d=c.stateNode,\"function\"===typeof d.componentWillUnmount))try{d.props=c.memoizedProps,d.state=c.memoizedState,d.componentWillUnmount()}catch(h){W(c,b,h)}Zj(a,b,c);break;case 21:Zj(a,b,c);break;case 22:c.mode&1?(U=(d=U)||null!==\nc.memoizedState,Zj(a,b,c),U=d):Zj(a,b,c);break;default:Zj(a,b,c)}}function bk(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new Lj);b.forEach(function(b){var d=ck.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}\nfunction dk(a,b){var c=b.deletions;if(null!==c)for(var d=0;de&&(e=g);d&=~f}d=e;d=B()-d;d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*mk(d/1960))-d;if(10a?16:a;if(null===xk)var d=!1;else{a=xk;xk=null;yk=0;if(0!==(K&6))throw Error(p(331));var e=K;K|=4;for(V=a.current;null!==V;){var f=V,g=f.child;if(0!==(V.flags&16)){var h=f.deletions;if(null!==h){for(var k=0;kB()-gk?Lk(a,0):sk|=c);Ek(a,b)}function Zk(a,b){0===b&&(0===(a.mode&1)?b=1:(b=sc,sc<<=1,0===(sc&130023424)&&(sc=4194304)));var c=L();a=Zg(a,b);null!==a&&(Ac(a,b,c),Ek(a,c))}function vj(a){var b=a.memoizedState,c=0;null!==b&&(c=b.retryLane);Zk(a,c)}\nfunction ck(a,b){var c=0;switch(a.tag){case 13:var d=a.stateNode;var e=a.memoizedState;null!==e&&(c=e.retryLane);break;case 19:d=a.stateNode;break;default:throw Error(p(314));}null!==d&&d.delete(b);Zk(a,c)}var Wk;\nWk=function(a,b,c){if(null!==a)if(a.memoizedProps!==b.pendingProps||Wf.current)Ug=!0;else{if(0===(a.lanes&c)&&0===(b.flags&128))return Ug=!1,zj(a,b,c);Ug=0!==(a.flags&131072)?!0:!1}else Ug=!1,I&&0!==(b.flags&1048576)&&ug(b,ng,b.index);b.lanes=0;switch(b.tag){case 2:var d=b.type;jj(a,b);a=b.pendingProps;var e=Yf(b,H.current);Tg(b,c);e=Xh(null,b,d,a,e,c);var f=bi();b.flags|=1;\"object\"===typeof e&&null!==e&&\"function\"===typeof e.render&&void 0===e.$$typeof?(b.tag=1,b.memoizedState=null,b.updateQueue=\nnull,Zf(d)?(f=!0,cg(b)):f=!1,b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null,ah(b),e.updater=nh,b.stateNode=e,e._reactInternals=b,rh(b,d,a,c),b=kj(null,b,d,!0,f,c)):(b.tag=0,I&&f&&vg(b),Yi(null,b,e,c),b=b.child);return b;case 16:d=b.elementType;a:{jj(a,b);a=b.pendingProps;e=d._init;d=e(d._payload);b.type=d;e=b.tag=$k(d);a=Lg(d,a);switch(e){case 0:b=dj(null,b,d,a,c);break a;case 1:b=ij(null,b,d,a,c);break a;case 11:b=Zi(null,b,d,a,c);break a;case 14:b=aj(null,b,d,Lg(d.type,a),c);break a}throw Error(p(306,\nd,\"\"));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Lg(d,e),dj(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Lg(d,e),ij(a,b,d,e,c);case 3:a:{lj(b);if(null===a)throw Error(p(387));d=b.pendingProps;f=b.memoizedState;e=f.element;bh(a,b);gh(b,d,null,c);var g=b.memoizedState;d=g.element;if(f.isDehydrated)if(f={element:d,isDehydrated:!1,cache:g.cache,pendingSuspenseBoundaries:g.pendingSuspenseBoundaries,transitions:g.transitions},b.updateQueue.baseState=\nf,b.memoizedState=f,b.flags&256){e=Ki(Error(p(423)),b);b=mj(a,b,d,c,e);break a}else if(d!==e){e=Ki(Error(p(424)),b);b=mj(a,b,d,c,e);break a}else for(yg=Lf(b.stateNode.containerInfo.firstChild),xg=b,I=!0,zg=null,c=Ch(b,null,d,c),b.child=c;c;)c.flags=c.flags&-3|4096,c=c.sibling;else{Ig();if(d===e){b=$i(a,b,c);break a}Yi(a,b,d,c)}b=b.child}return b;case 5:return Kh(b),null===a&&Eg(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,g=e.children,Ef(d,e)?g=null:null!==f&&Ef(d,f)&&(b.flags|=32),\nhj(a,b),Yi(a,b,g,c),b.child;case 6:return null===a&&Eg(b),null;case 13:return pj(a,b,c);case 4:return Ih(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Bh(b,null,d,c):Yi(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Lg(d,e),Zi(a,b,d,e,c);case 7:return Yi(a,b,b.pendingProps,c),b.child;case 8:return Yi(a,b,b.pendingProps.children,c),b.child;case 12:return Yi(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;f=b.memoizedProps;\ng=e.value;G(Mg,d._currentValue);d._currentValue=g;if(null!==f)if(He(f.value,g)){if(f.children===e.children&&!Wf.current){b=$i(a,b,c);break a}}else for(f=b.child,null!==f&&(f.return=b);null!==f;){var h=f.dependencies;if(null!==h){g=f.child;for(var k=h.firstContext;null!==k;){if(k.context===d){if(1===f.tag){k=ch(-1,c&-c);k.tag=2;var l=f.updateQueue;if(null!==l){l=l.shared;var m=l.pending;null===m?k.next=k:(k.next=m.next,m.next=k);l.pending=k}}f.lanes|=c;k=f.alternate;null!==k&&(k.lanes|=c);Sg(f.return,\nc,b);h.lanes|=c;break}k=k.next}}else if(10===f.tag)g=f.type===b.type?null:f.child;else if(18===f.tag){g=f.return;if(null===g)throw Error(p(341));g.lanes|=c;h=g.alternate;null!==h&&(h.lanes|=c);Sg(g,c,b);g=f.sibling}else g=f.child;if(null!==g)g.return=f;else for(g=f;null!==g;){if(g===b){g=null;break}f=g.sibling;if(null!==f){f.return=g.return;g=f;break}g=g.return}f=g}Yi(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,d=b.pendingProps.children,Tg(b,c),e=Vg(e),d=d(e),b.flags|=1,Yi(a,b,d,c),\nb.child;case 14:return d=b.type,e=Lg(d,b.pendingProps),e=Lg(d.type,e),aj(a,b,d,e,c);case 15:return cj(a,b,b.type,b.pendingProps,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Lg(d,e),jj(a,b),b.tag=1,Zf(d)?(a=!0,cg(b)):a=!1,Tg(b,c),ph(b,d,e),rh(b,d,e,c),kj(null,b,d,!0,a,c);case 19:return yj(a,b,c);case 22:return ej(a,b,c)}throw Error(p(156,b.tag));};function Gk(a,b){return ac(a,b)}\nfunction al(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.subtreeFlags=this.flags=0;this.deletions=null;this.childLanes=this.lanes=0;this.alternate=null}function Bg(a,b,c,d){return new al(a,b,c,d)}function bj(a){a=a.prototype;return!(!a||!a.isReactComponent)}\nfunction $k(a){if(\"function\"===typeof a)return bj(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===Da)return 11;if(a===Ga)return 14}return 2}\nfunction wh(a,b){var c=a.alternate;null===c?(c=Bg(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.type=a.type,c.flags=0,c.subtreeFlags=0,c.deletions=null);c.flags=a.flags&14680064;c.childLanes=a.childLanes;c.lanes=a.lanes;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{lanes:b.lanes,firstContext:b.firstContext};\nc.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}\nfunction yh(a,b,c,d,e,f){var g=2;d=a;if(\"function\"===typeof a)bj(a)&&(g=1);else if(\"string\"===typeof a)g=5;else a:switch(a){case ya:return Ah(c.children,e,f,b);case za:g=8;e|=8;break;case Aa:return a=Bg(12,c,b,e|2),a.elementType=Aa,a.lanes=f,a;case Ea:return a=Bg(13,c,b,e),a.elementType=Ea,a.lanes=f,a;case Fa:return a=Bg(19,c,b,e),a.elementType=Fa,a.lanes=f,a;case Ia:return qj(c,e,f,b);default:if(\"object\"===typeof a&&null!==a)switch(a.$$typeof){case Ba:g=10;break a;case Ca:g=9;break a;case Da:g=11;\nbreak a;case Ga:g=14;break a;case Ha:g=16;d=null;break a}throw Error(p(130,null==a?a:typeof a,\"\"));}b=Bg(g,c,b,e);b.elementType=a;b.type=d;b.lanes=f;return b}function Ah(a,b,c,d){a=Bg(7,a,d,b);a.lanes=c;return a}function qj(a,b,c,d){a=Bg(22,a,d,b);a.elementType=Ia;a.lanes=c;a.stateNode={isHidden:!1};return a}function xh(a,b,c){a=Bg(6,a,null,b);a.lanes=c;return a}\nfunction zh(a,b,c){b=Bg(4,null!==a.children?a.children:[],a.key,b);b.lanes=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\nfunction bl(a,b,c,d,e){this.tag=b;this.containerInfo=a;this.finishedWork=this.pingCache=this.current=this.pendingChildren=null;this.timeoutHandle=-1;this.callbackNode=this.pendingContext=this.context=null;this.callbackPriority=0;this.eventTimes=zc(0);this.expirationTimes=zc(-1);this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0;this.entanglements=zc(0);this.identifierPrefix=d;this.onRecoverableError=e;this.mutableSourceEagerHydrationData=\nnull}function cl(a,b,c,d,e,f,g,h,k){a=new bl(a,b,c,h,k);1===b?(b=1,!0===f&&(b|=8)):b=0;f=Bg(3,null,null,b);a.current=f;f.stateNode=a;f.memoizedState={element:d,isDehydrated:c,cache:null,transitions:null,pendingSuspenseBoundaries:null};ah(f);return a}function dl(a,b,c){var d=3>>1,e=a[d];if(0>>1;dg(C,c))ng(x,C)?(a[d]=x,a[n]=c,d=n):(a[d]=C,a[m]=c,d=m);else if(ng(x,c))a[d]=x,a[n]=c,d=n;else break a}}return b}\nfunction g(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}if(\"object\"===typeof performance&&\"function\"===typeof performance.now){var l=performance;exports.unstable_now=function(){return l.now()}}else{var p=Date,q=p.now();exports.unstable_now=function(){return p.now()-q}}var r=[],t=[],u=1,v=null,y=3,z=!1,A=!1,B=!1,D=\"function\"===typeof setTimeout?setTimeout:null,E=\"function\"===typeof clearTimeout?clearTimeout:null,F=\"undefined\"!==typeof setImmediate?setImmediate:null;\n\"undefined\"!==typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function G(a){for(var b=h(t);null!==b;){if(null===b.callback)k(t);else if(b.startTime<=a)k(t),b.sortIndex=b.expirationTime,f(r,b);else break;b=h(t)}}function H(a){B=!1;G(a);if(!A)if(null!==h(r))A=!0,I(J);else{var b=h(t);null!==b&&K(H,b.startTime-a)}}\nfunction J(a,b){A=!1;B&&(B=!1,E(L),L=-1);z=!0;var c=y;try{G(b);for(v=h(r);null!==v&&(!(v.expirationTime>b)||a&&!M());){var d=v.callback;if(\"function\"===typeof d){v.callback=null;y=v.priorityLevel;var e=d(v.expirationTime<=b);b=exports.unstable_now();\"function\"===typeof e?v.callback=e:v===h(r)&&k(r);G(b)}else k(r);v=h(r)}if(null!==v)var w=!0;else{var m=h(t);null!==m&&K(H,m.startTime-b);w=!1}return w}finally{v=null,y=c,z=!1}}var N=!1,O=null,L=-1,P=5,Q=-1;\nfunction M(){return exports.unstable_now()-Qa||125d?(a.sortIndex=c,f(t,a),null===h(r)&&a===h(t)&&(B?(E(L),L=-1):B=!0,K(H,c-d))):(a.sortIndex=e,f(r,a),A||z||(A=!0,I(J)));return a};\nexports.unstable_shouldYield=M;exports.unstable_wrapCallback=function(a){var b=y;return function(){var c=y;y=b;try{return a.apply(this,arguments)}finally{y=c}}};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/scheduler.production.min.js');\n} else {\n module.exports = require('./cjs/scheduler.development.js');\n}\n","function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}\nmodule.exports = _assertThisInitialized, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var setPrototypeOf = require(\"./setPrototypeOf.js\");\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}\nmodule.exports = _inheritsLoose, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n \"default\": obj\n };\n}\nmodule.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _setPrototypeOf(o, p) {\n module.exports = _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n return _setPrototypeOf(o, p);\n}\nmodule.exports = _setPrototypeOf, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nconst PartytownSnippet = \"/* Partytown 0.7.6 - MIT builder.io */\\n!function(t,e,n,i,r,o,a,d,s,c,p,l){function u(){l||(l=1,\\\"/\\\"==(a=(o.lib||\\\"/~partytown/\\\")+(o.debug?\\\"debug/\\\":\\\"\\\"))[0]&&(s=e.querySelectorAll('script[type=\\\"text/partytown\\\"]'),i!=t?i.dispatchEvent(new CustomEvent(\\\"pt1\\\",{detail:t})):(d=setTimeout(f,1e4),e.addEventListener(\\\"pt0\\\",w),r?h(1):n.serviceWorker?n.serviceWorker.register(a+(o.swPath||\\\"partytown-sw.js\\\"),{scope:a}).then((function(t){t.active?h():t.installing&&t.installing.addEventListener(\\\"statechange\\\",(function(t){\\\"activated\\\"==t.target.state&&h()}))}),console.error):f())))}function h(t){c=e.createElement(t?\\\"script\\\":\\\"iframe\\\"),t||(c.setAttribute(\\\"style\\\",\\\"display:block;width:0;height:0;border:0;visibility:hidden\\\"),c.setAttribute(\\\"aria-hidden\\\",!0)),c.src=a+\\\"partytown-\\\"+(t?\\\"atomics.js?v=0.7.6\\\":\\\"sandbox-sw.html?\\\"+Date.now()),e.body.appendChild(c)}function f(n,r){for(w(),i==t&&(o.forward||[]).map((function(e){delete t[e.split(\\\".\\\")[0]]})),n=0;n {\n const { forward = [], ...filteredConfig } = config || {};\n const configStr = JSON.stringify(filteredConfig, (k, v) => {\n if (typeof v === 'function') {\n v = String(v);\n if (v.startsWith(k + '(')) {\n v = 'function ' + v;\n }\n }\n return v;\n });\n return [\n `!(function(w,p,f,c){`,\n Object.keys(filteredConfig).length > 0\n ? `c=w[p]=Object.assign(w[p]||{},${configStr});`\n : `c=w[p]=w[p]||{};`,\n `c[f]=(c[f]||[])`,\n forward.length > 0 ? `.concat(${JSON.stringify(forward)})` : ``,\n `})(window,'partytown','forward');`,\n snippetCode,\n ].join('');\n};\n\n/**\n * The `type` attribute for Partytown scripts, which does two things:\n *\n * 1. Prevents the `Violentmonkey + + \ No newline at end of file diff --git a/components/install-stable/index.html b/components/install-stable/index.html new file mode 100644 index 00000000..0d8743f4 --- /dev/null +++ b/components/install-stable/index.html @@ -0,0 +1,148 @@ +Violentmonkey + + \ No newline at end of file diff --git a/faq/index.html b/faq/index.html new file mode 100644 index 00000000..55c87975 --- /dev/null +++ b/faq/index.html @@ -0,0 +1,90 @@ +Violentmonkey

FAQ

Table of Contents

Why does Violentmonkey require clipboard permission?

+

To make GM_setClipboard work on different browsers.

+

First of all, the required permission is named clipboardWrite, which means it just allows writing to clipboard, but not reading from clipboard.

+

Secondly, there is a function used in userscripts named GM_setClipboard. It writes to clipboard, just exactly what clipboardWrite allows.

+

On Chrome, the extension can write to clipboard in the background even without clipboardWrite permission. But on Firefox, this won't work without the permission. So clipboardWrite permission is required to make the extension work on different browsers.

+

Why are third-party sync services used instead of native ones?

+

Because browser.storage.sync is designed to sync preferences instead of large data, and it cannot sync data between different browsers. In some browsers there is no such API implemented.

+

According to the document, browser.storage.sync is designed to store preferences and sync them to different instances of the same browser with the same user logged in. And something more, up to 100KB of data can be stored and synced.

+

So the limitations are:

+
    +
  1. Up to 100KB of data can be stored, even smaller than size of a feature-rich script.
  2. +
  3. Only sync on the same browser, no share between Chrome and Firefox.
  4. +
+

With third-party sync services (Dropbox, Google Drive, etc.):

+
    +
  1. More data can be stored.
  2. +
  3. Scripts can be shared in Chrome, Firefox, Vivaldi, Maxthon, etc. Your scripts are synced to different browsers if only Violentmonkey is installed.
  4. +
+

Where are the userscripts stored?

+

They are stored in the local storage area of the browser extension. The storage may have different implementations in different browsers, so we can't tell exactly where or in what format is the data stored.

+

In other words, you won't be able to find your scripts as normal files in your disk. They may be stored in some database maintained by the browser you use.

+

Why is the release minified?

+

The short answer for this question is to make the code clean and efficient.

+

To be clear, our extension is minified but not obfuscated in release. It is a very common workflow to compile and minify code for web apps, and we are using popular tools that are used all over the world. See this post to learn more about the workflows.


Open Chat
+ + \ No newline at end of file diff --git a/favicon-32x32.png b/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..ff4fe4f8738aac454e1c3e00aa96c8f0dfddb6bf GIT binary patch literal 2497 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 LNkvXXu0mjfnNY>L literal 0 HcmV?d00001 diff --git a/get-it/index.html b/get-it/index.html new file mode 100644 index 00000000..3808a3fc --- /dev/null +++ b/get-it/index.html @@ -0,0 +1,251 @@ +Violentmonkey

Get Violentmonkey

Table of Contents

Violentmonkey is built with WebExtension APIs. It supports a lot of browsers.

+

You can either install it from web stores or build from source code.

+

WebExtension-compatible browsers

+

Chrome, Firefox 57+, Edge, Chromium, Opera 15+, Vivaldi, QQBrowser, etc.

+

Stable Release

+ +

Note

+
    +
  • Opera users please install from Chrome Web Store because the Opera team no longer reviews the extension because they think Violentmonkey is too complicated and they don't have time to review it. 😞
  • +
+

Beta Release

+

The beta version is published more frequently than the stable release, with bug fixes and new features that will be included in the next stable release. +However it may have bugs and lead to data loss. Please back up your data and use it at your own risk.

+ +
+

Maxthon

+

Maxthon 4 and 5.

+ +
+

Not above?

+

Unfortunately your browser may be unable to support such extensions. +You are welcome to help improve it.


Open Chat
+ + \ No newline at end of file diff --git a/guide/creating-a-userscript/index.html b/guide/creating-a-userscript/index.html new file mode 100644 index 00000000..ca6d1f41 --- /dev/null +++ b/guide/creating-a-userscript/index.html @@ -0,0 +1,119 @@ +Violentmonkey

Creating a userscript

Table of Contents

Assuming you already know what a userscript is, we will talk about how to create your own userscript here.

+

With the help of a userscript manager, such as Violentmonkey, you can easily create your own script.

+

Create a userscript for the active tab

+

First make sure you have Violentmonkey installed.

+

Then you'll find a monkey icon on the toolbar of your browser.

+

Click on the toolbar icon, and then click on the Plus icon to create a new script for the site of the active tab.

+ + + easy 1 + +

What makes up a userscript

+

A userscript consists of two parts: the metadata and your program.

+

The metadata declares the basic information of a script:

+
    +
  • descriptive fields, like name, description, author, etc.;
  • +
  • APIs and permissions, like in which URLs the script is allowed to run;
  • +
+

For more details, see Metadata Block and GM functions.

+
// ==UserScript==
+// @name        New script
+// @namespace   Violentmonkey Scripts
+// @match       *://*/*
+// @grant       none
+// @version     1.0
+// @author      -
+// @description 3/8/2020, 8:42:28 PM
+// ==/UserScript==
+
+

The rest part of the code runs in target webpages as usual JavaScript assets.

+

Userscript code

+

Please note that the code executes directly in the browser, so the syntax in this script must be supported by the browser natively.

+

For example, ESNext features that are not supported by the browser will fail as SyntaxError.

+

Modern browsers like Chrome, Firefox, Edge support most of ES 6 features, so it is safe to use most of them if you are not targetting last century users.

+

However there are exceptions. For example ES modules won't work in userscripts because they are supposed to inject into webpage as single-file scripts.

+

If you want to write userscripts with some awesome features that are not supported by browsers yet or won't be supported, such as ES modules, CSS modules, please check out How to use modern syntax in a userscript.


Open Chat
+ + \ No newline at end of file diff --git a/guide/keyboard-shortcuts/index.html b/guide/keyboard-shortcuts/index.html new file mode 100644 index 00000000..2a0f73bb --- /dev/null +++ b/guide/keyboard-shortcuts/index.html @@ -0,0 +1,109 @@ +Violentmonkey

Keyboard Shortcuts

Table of Contents

It is a common case to provide a keyboard shortcut for a function in a userscript.

+

We provided an easy way to achieve this by introducing @violentmonkey/shortcut.

+

Note: @violentmonkey/shortcut is a library provided by the Violentmonkey team, but it is just JavaScript and can be used with other script managers as well. You can find the API reference in its README page.

+

Preparation

+

Option 1. @require

+

Add @violentmonkey/shortcut to the meta block of our script:

+
// ==UserScript==
+// ...
+// @require https://cdn.jsdelivr.net/npm/@violentmonkey/shortcut@1
+// ==/UserScript==
+
+

And access all exports under VM.shortcut:

+
VM.shortcut.register('c-i', () => {/* c-i pressed */});
+
+

Option 2. Installation

+

Another way to use this library is to install it with NPM and import it. TypeScript IntelliSense should work out of box in this way, but we will need a bundler to compile our script.

+

It is highly recommended to use our generator to initiate a userscript project with modern syntax support.

+

If we are done with the bundler, we can install @violentmonkey/shortcut as a dependency:

+
$ npm i @violentmonkey/shortcut
+
+

And use it in our code:

+
import { register } from '@violentmonkey/shortcut';
+
+register('c-i', () => {/* c-i pressed */});
+
+

Usage

+

Now we can easily register a keyboard shortcut:

+
VM.shortcut.register('c-i', () => {
+  console.log('You just pressed Ctrl-I');
+});
+
+

We can even register a key sequence:

+
VM.shortcut.register('c-a c-b', () => {
+  console.log('You just pressed Ctrl-A Ctrl-B sequence');
+});
+
+

We can disable and enable all key bindings at any time:

+
// Disable all key bindings temporarily
+VM.shortcut.disable();
+
+// Re-enable key bindings
+VM.shortcut.enable();
+

Open Chat
+ + \ No newline at end of file diff --git a/guide/observing-dom/index.html b/guide/observing-dom/index.html new file mode 100644 index 00000000..0e5d63c3 --- /dev/null +++ b/guide/observing-dom/index.html @@ -0,0 +1,127 @@ +Violentmonkey

Observing DOM

Table of Contents

Background

+

It is a common case to operate on elements that are created dynamically, which may not be ready even on document-end.

+

In earlier userscripts we can see authors using timers to detect DOM elements periodically, which works in most browsers but is less effective, and there is likely obvious lag after the elements appear and before the operations are performed.

+

A better way to do stuff when certain element is ready is to use MutationObserver instead of timers. MutationObserver is well supported in modern browsers, including those Violentmonkey works on, as defined here.

+

You can stop reading this now if you are familiar with MutationObserver and prefer native APIs.

+

Introducing @violentmonkey/dom

+

If you are looking for an easy and friendly way to observe elements, @violentmonkey/dom might be what you want.

+

@violentmonkey/dom is a library provided by the Violentmonkey team. Nevertheless, it is just pure JavaScript and can be used with other script managers.

+

Once the library is required, we can use its methods under the VM namespace. See the documentation for more details.

+

Requirements

+

Add @violentmonkey/dom to the meta block of your script:

+
// ==UserScript==
+// ...
+// @require https://cdn.jsdelivr.net/npm/@violentmonkey/dom@2
+// ==/UserScript==
+
+

If the project is initiated from our generator, it's likely that the dependency is already included.

+

Observing

+

After preparing the requirements, we can observe elements by VM.observe (doc), which utilizes MutationObserver under the hood.

+

For example, prepend <h1>Profile</h1> to the dynamically created <div class="profile">:

+
const disconnect = VM.observe(document.body, () => {
+  // Find the target node
+  const node = document.querySelector('.profile');
+
+  if (node) {
+    const h1 = document.createElement('h1');
+    h1.textContent = 'Profile';
+    node.prepend(h1);
+
+    // disconnect observer
+    return true;
+  }
+});
+
+// You can also disconnect the observer explicitly when it's not used any more
+disconnect();
+
+

Note that return true in the end is needed to disconnect the observer once we find the target node. Otherwise the detection continues and makes useless callbacks.

+

To observe document.body we must make sure document.body exists. This should not be a problem if @run-at is omitted or set to a value other than document-start.

+

(Optionally) Using jQuery

+

This is not recommended though, we put it here just in case some people are big fans of jQuery.

+

It is quite simple to integrate jQuery with the observer. Before we begin we must include jQuery as a dependency:

+
// ==UserScript==
+// ...
+// @require https://cdn.jsdelivr.net/npm/@violentmonkey/dom@1
+// @require https://cdn.jsdelivr.net/npm/jquery@3/dist/jquery.min.js
+// ==/UserScript==
+
+

Then we can wrap the node with jQuery and operate it the jQuery way:

+
VM.observe(document.body, () => {
+  // Find the target node
+  const $node = $('.profile');
+
+  if ($node.length) {
+    $node.prepend('<h1>Profile</h1>');
+
+    // disconnect observer
+    return true;
+  }
+});
+

Open Chat
+ + \ No newline at end of file diff --git a/guide/using-modern-syntax/index.html b/guide/using-modern-syntax/index.html new file mode 100644 index 00000000..dfa8e707 --- /dev/null +++ b/guide/using-modern-syntax/index.html @@ -0,0 +1,122 @@ +Violentmonkey

Modern Syntax

Table of Contents

Violentmonkey itself is built for modern browsers, to be precise, for Chrome >= 57 and Firefox >= 57. So if your browser has Violentmonkey, it is likely it also supports many ES6 features natively, for example, async / await, block-scoped variables, etc.

+

However, there are many more cool features that are not fully supported by browsers, or some features such as TypeScript and ES modules that won't be supported in userscripts natively.

+

In this tutorial we are going to create a project to compile ESNext and other modern syntax to browser compliant code.

+

Prerequisites

+
    +
  • Node >= 18
  • +
  • NPM >= 8.15.0
  • +
+

Initialization

+

Create a new directory for your script:

+
$ mkdir my-script
+$ cd my-script
+
+

Thanks to npx, we can generate the new project with a one-line command:

+
$ npx -p github:violentmonkey/generator-userscript -p yo yo @violentmonkey/userscript
+
+

Under the hood, we use Yeoman to create a project with JavaScript toolchain, compiling source code with Babel, and bundling them with Rollup. See the source code at GitHub.

+

Now we should get a project with the following structure:

+
├── dist
+├── src
+│  ├── app.tsx
+│  ├── index.ts
+│  ├── meta.js
+│  ├── style.css
+│  └── style.module.css
+├── babel.config.js
+├── package.json
+├── postcss.config.cjs
+├── rollup.config.mjs
+├── tsconfig.json
+├── uno.config.ts
+└── README.md
+
+

Source code files are kept in src, and will be compiled to dist/index.user.js.

+

src/meta.js contains the metadata of our script, see Metadata Block for more details. Do not add actual code to this file.

+

src/index.ts is the entrance of our script, other files in src can be imported.

+

Development

+
$ npm run dev
+
+

Source code will be watched by the compiler and compiled to dist once changed.

+

By installing the compiled userscript from dist, we can test and keep up with the latest code of our userscript. See also How to edit scripts with your favorite editor.

+

Building

+
$ npm run build
+
+

In this way the source code will be compiled exactly once, and saved in dist.

+

The version and author of our userscript will be synced with that in package.json.

+

Features

+

We have quite a few lovely features enabled by default:

+
    +
  • TypeScript
  • +
  • CSS modules (applied to files ending with .module.css)
  • +
  • UnoCSS
  • +
  • SolidJS
  • +
+

Of course you don't have to use all these features. If you don't like them, you can simply ignore them or opt out by removing the plugins.

+

To learn more about each feature, check Features in Userscript Generator.


Open Chat
+ + \ No newline at end of file diff --git a/icons/icon-144x144.png b/icons/icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..8690b693c0b8d501587bbefaa4e83e56faecaf5c GIT binary patch literal 15586 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

-uB-J?7H3B<; zYx0*qlmqS(rbMFJj2UN`!FAu-v2fu##c8eS#SKG+g!ih<7Pv8)B8wF9bWWwUV6mQ^xyV!L{5r{+p^gHK6$)JW_468X zP)F`==$c5KQiJ8Q(PuLJ%5sJ!r8Jf2R$2(4z$^5bChm|6HLe^WgA|Z)IKYN*por{{ zd0c=X4t)h@Cp4o+7xmzsZj`iIDkWH}jG>I23MG5us17a&PD5aNUR;+Y*)tTl%%`{K zSL6b;c|n`X)FvsAD*BkxyWeSQK3p3uhuOg?zYo>1tXmN*TQr3r1eSzqM)}dq7O~Pz zwy%HTeFXVtiP$aL&2oBNV|r#~Kl*6TbU~JWb7EPJOK=Msg7J63)q&!ph4HPe%NG>U!CEj?3YSF$uiB%&8`kSRJmv?iS%+lU_LqyOFQ6X{zv0%Sn0mQtWxQi?CZ zzkbSnerTQ)wJuI;OUFjkl^zSJv*<|M{GQp-tPF|2MmLC*9uBi?&j&2aSmHH@(wFE$ z<22eSAJCMqNeMw-)VD^c#07AL4j0l}oPU6t4QXIK6lG6v>7d zL{HcBc%dww4(2g}k>!H2|9D}&{2v^h2>##QK8Y277(KGEn-sO6_{f&!*TrR?<^(tq zl$Jy4L{Ms|x6#lJd6s3C=J5G%*g~-kRErliRbrY$R#D~=gMTu6K*2OCMHz#k z447gLe;BD#Of`og0CEi%3B%sC zVspXnpcVp%2oeB>t5cNnXX^yE*!e+f9PH~x<(y2g4WM`1vjmo&8vOf~xqk_wEli*R zs{o2FQY&Z}>ra!LR+6R~FijNIXkS#IY%rU_5YCKmLYJnuk&^-O0(Mlm6Bzsqx)u!h zLr{rbSDhFfR3BHT#<$=zI-TR57^zqM4DJaEba*W?QXlV`DOnk~VDH>DQG(Rh?-;|U z(MWok-w)XuDEKog`wRWx6H9taM(dFU-K1&@YIztflpcQzGCClqH41};DLzh4K+xez z!rw=*+d3(bD&*w&e_+XG>7*(8d&er}g*mc78ltQ0Z(vZ8L%gN43_I73%qoHs-EX5? zl-nS57m1Z=XYWK67!I#P=O(qF2YI)BdPQI9PD8Qn)!Rp~(vG6H?i|af#sqqYeQ(S@ zgF6C4!Pocho+>|sdxH5{IAM^HdXi(1M;CS%L%VNgJE0gv+7^YpWBh)HvZ~YmfoXCt zyLu-n>64_CJddImwac3;zOhjt%d?4}-K^de@s|Jq22x2xK~xqoR4=Byk>3Y43u#U? zw4|5f=j~W|7ET2Wa(~MgbNo{EvJStL$1MNBzY~w5bkDuXp@EW`p*Ep0_gATHi`{fh ztO-omS=#YBRtciXP1K11$nFsxPgFc(FjGPuCu5urhU_wlzC-uUM{@1l$)+HDkL==V zCzsvaY)7|6!3*>8@jSNnOraU9_-JBD5BK2>#N_f|WD%JBkm>nXQkdLqt0l`$P35M+ zK`MnaxJ83&hfBH?C&C^HbPMMpx>ZF%m(ygoN34X6VRZdSsu}4=F3y_a?jX&KjRY+-EsIKzU#%ZcV|DFc=Zw}}%xxRTq z1scvD{_2hiq8P|}z#S-PZrRN&1}UvkE#KHRQAQJip*bPg%iPcZlI5hPX7pkMab$UJ zkp);TXxTA?3YiS>QVMn*WL%5dR;JB8l4)mV6>$p;N{`}XjY?aLtWLH*jtCuf+j>@oCblTQCg=TVq+p$WpKu6GCsq^$eKG9Tm2Ou_o z?G_(W;aHj$$I^%8Hcc^93#JIHbeL4$G9i%q)d;02O)E*jj9?kA1F$eqC>VvkGD!B2 zY+c#mzG42dF?etz$2iF946Yp}+&tC7eT9BfujHav7cd4is}I-I3F%;I`fysb zuc;h2=2ZQMMNS0_Z|jjBLbF@N$}HP0>>_RJl_HcMMh3}Xvo?xsCFwF5*WW)Nx4>nC zdvh1>^1$oBzhB5M-GEwQR3p-leBDi)L~#3l(f?L7s!!K$!FjxnW%&Zc8YE4C@S+JH zkc!t>{z3N{G9n;#3h;8FxIj;8R5^h9R1c+T&0=T+8w9XM$8ahPR&WcP3`F9^3y|PBt9Cd|XdEpHxTIaYpixm! z+RZ1#A@RR6B;5!<{HP(i@|p|2XZ-w_F2{#t$TbuaGeu6JW$oi>E}uw~nncS`k?v_B zqV%ASiDe@VkhVn49J7O12kA^;^#`*wU zLyJ)$jaVnTJp0)}l*uOq3QDtBNmq7E;FBUrFf}6GljwHdt+8W+0v@tO|B4J0es+6z z^}8rcZDheU;DU{55Gg$m?NfpT?1!RWkdLWSi=x$EnsRThvV6tzHp?-V@tVTzII=p9 zWz~Yh_-cx-5n#LKno=gD2_M&V`bM}H$f3j4P{dWvf=KoEauo#)FYh5cb0WJX2(YV1 z__DG1u@VPRQ{K6;dpE4?PjxGm7k|BKm=7ga^cIHfi1O|f%&rUyRJbOt4QPi4$0xu# z=>RnYs_-1k9+s(^f+#2H_l`+Cj;xMj6??%~2H>uarr3>9T*G)D_|(82J;L&`reN7u zG}SC(qArA?fF@83#jPCqxw}YJ8p@3sY2GHqb~0CN^Bo@U%%_^l+`s@4xbI_G%Q9J0 zQ3s1CTaIQ$wY(%m1q;D>_!$TcG~Hj*B1~MI;26Xb%JyDMnNN zH!7>mG&K|g*(TH=5Ri^y8LcTsYy{spSuiI7?p8gP3{7RIz=#p5UmNe?tG}niuXn7Q zX2DR(w-QBs5_gD3= zZ)>+^t9EOqXS%n$pPpxxT z0BOyC7o0Ik5*Ywc0SfP=G`(|)i^dE`CsWIrtSf6uEX z^Ty!Fc;9yVf3#>wdVrwy@3pu3%;I43tM|w3GQ3Lgt^UG$7QJ~Hog^5>b&;KP7>B{9 zJ|sWxAYNkz@qF0j9Ft#m5D)b4n>)245U8I)Cjl6`i07Rwf|G{l{guP$u!((^2SJd2 zzjJ>{|2`c}LgQ}BJgvJ_$eIR?T-@lb!|z&W{@f`gC^O6?&i~VvKFx=AL1XII*)!XR zBuS9oo17}qoCQJh_+7sz?aaH2YtoCO3q_X28XnEpTfX+_FYEn*>jIgk3!DV+;e82t9c@xzl8%;NzZ=|I0`r(z$Wy)gs@T%X`s+ z%cRAapvj>nsrVI2Hq;R!K|H@Zf8^iEn2Vl<`~wGeo=o|;3UR!2U`#YBlz$ymiO|J| zi-u2()Gs69;@lV9GBel)DRw=7nxwDGbXR1iX2XkCxc}yp`{pGhDM9or8LhGtPPkj) zfpdqK6=SGsZu3$DIOJ7D=$_lRm2WYw9F7)88s;Bt(l+&p^~|>rX_9R`Va6VcL!(V; zmTF}`>`*SY$BBP@2}9$!-__;{-IYyFAb-K)@Bjr9oykGp5}JpreR;Ky^l)TJOtLw$ zf^i5^HU{JWPne#rQHORShp)S zl_gn#S4cj5jg&@!#MZvpf)HBNn#2V;*?D9E%S;!m<9^raOw?peSHTPoTDlcOH$F(~ z+kDk@?o^D$q6^KcZx1*p17-$o9cn&KiE}@9uy=Y*n)_#11p`27PO2%VXd_0V4fy7#e??qX8!_`DNS$1;8n!6XClHyOdnj`lKHcQ8b(B~E zhH)>SXl{M^Q&jNAsGvKj+#9%wnlwc~ZU6A|!PeuG}U!J zogt{vWHlM)CJ&~_wrK(rAI`G|Rcm&NluVA^uo6lpOcnZ~>dlELIP$dBV8W3M8(;c( ztJ9Ey$2Lh-$puJ-=K>xXcri2)6G1Plzp@g6+xD#a zIybt6zf3ISXTL{K3);i5Bz&nU24_Co59PUBUkl1H2xvpi{V&n%5ZsW&sD2RrjbMB= z#XbkM3xkdMQnG-115GAoo(0WxmJj|)o`H6UiU;um)w=H#35H33gfa45KU9c*Wh^c% zl_we4x3;LUHn+DmZI2zQQo?XFbke$u8p7ft%@o@y1x;ynsPcFq8p) z)wIsNIw|{wp9VH|N;sPGz5#ahg8aPs5#SUi@~XD0?#h%-f8K0AntzfdqXwH0ZG{pb zr;}Np3?=n$T+gGbVGO(bJCf_Zw`#0nt%`LGn;y*#rZJU6>X@5;zif1}r{@SPIbZXt z{%-83K*krJ28yo`s(A+n82Pv%j9blr_7}zMy(i&0%*gaf=a27EwsqPqMPS~=+q_X(@(P=c^TA?B2sds1uh?>i3O_o9 zN4vh|+bO}TaBDX#TOWbfFui;I*32s^sYW!&>o{3c{ctnbUE2Ig4B|*)th3`GuS&;c zLhGdH1h`XU3K(gSfhf9L@;-IUY<--|rnA)h^{3%AvYx;)NIy$)NQH928*^g7wWrQv zkO>_5MTtjONxTuC%2(<>) zJ__<6YBQ_Y@jxos45-`z10aZa-^&a5$;7{pO5`jyy%HFt-oOxP)7s9dG6^Q zzbSTX`K?ZC0<=V0!)Xc*by4`@2ouk5>M_>Qb0AN16d8X|1k`QDL+o39oj+l^4SIO@ zV9EYQIYaoqPVp+s_#xsy%djL32>u&%szHxq^1M{fUqbz3}zmCDRU7Ur)s`1 z$KFH?3nS^eUnOS1iK{_(tb32wF!iQVGIKKgayX2T0OWBojgLe`Qm7dG`&H#95@|8p z*s|Dfg76*_t{hODyD|_#k}dJ%z9Yfe(JD5og|#ABe~MzML2W9;ZIl(+6vw zk=IBBS9|yA$m0gw9?N~X>lK8Km9IjFx=BUR{iA6>n}?wWoFKS!EhLkV4`y-0-`jH1 z;pB-$I1aPRhs2Wo^R!6Lu5c16Zyj!_<77z;@XYb-t^WYcna@agy&PNvZ*SKSWv~=O zF=!F*WJFF^pI|ATQGJ%-LbGGNhYP2~`NAjNQN74Y0+7<|b8a+*k$5j(&vw1yyEp%> za8_R?D?USa_DFS$xqAn%OmM26?*-hYh^E?JHH;i5-rsJkHt9p&YJ$^(~B@%EXl-!n_$sJhI4!&TGCa=`av zoW5P5CwujHZ{1)eyDZo^YhNSgP>HV)B-yd#P%7@oYImhv<)f2h*(mVk{pP5(0d1T7!U~#E1zcpK?nP{ zEd%n4F^B<%FxoBh2wqkeV@`$0wGRKyAUi1BZoQ@H2am^IvGE?%S)lSn%ZT{1Je9AM z3{sy&swizkWo6f#T7_Q|FefbLRxpFo@gdU)lh~Zj|aElo=)lW;h2Wkj)Hh!rT%L&^l&pJGhR|6h((Q}^zVHi zV8P3hpN9Ati3g|FGFMq72RwKuL<~yel=Em86^NAi`@PLz@0x4^wqtt1XpT zN3l0a3j{y`SW}bNPI8P3HdSZfX+=$vQJx8;D6I5I62y~UDRKa^?dPk((U;Mown9z` zYJ;LxcBLqQBni610kTN#^+xfzwZQ!MR4hnT1lRy57#T+ZIQNjMwlE5@I4o%_d!x$;H2HjoCx92C-_8Ib|pIRjI0tIO+Pbq^Vvej*vTy5$q zJw^kEgSdvij-nMKH}lD@&1|7Z7L&voLbHX5uj=a6pKYu)nP4L7;v5A>1P~{uXTpEr z!xcSGWM_v9Bc)o*_yj7N-<8izvE6&ns- z4+uv03+heE1+`#kPd^IqQiz!81CTzJiepn5y0E{Db6q!P11G^jBQ`=@Y=zNMf>KW^ zwp?MPocIe$nFugy^3cSj;BOA=B@$&+uM1?w^0z_5iP&GErjxk?Ptm>5!{h9U_sD^g zz?ef)QYt|9oe)zAmnZtx>VmOCwyxX6hCGu)abFr&Rzmkle(wk_idnf$@tVZD0@=s} zpr2|7Cv|vdm*mwrc0wr=P$fBGlSBP`_6JYGOvn%Rt;^0HQP3C!hAn1~TY~<+PIILI z6EmJB^QpRDZtejsV~nD;Cip=E|I&@Mm*C zlBJLxsFM0cC?xm=l^&HV%p%JgFFXwCeEr)wK?C9lwu^XJzKV}{|0?Qe>z`e~&L+o< z-E{B$Sf=BWx8TM2Ho1uUhG>pKY@Pm0QFa8|i7}^U7!pG}^$Dtj)TbYW8i0CqOZXNF zIHZ467LtMMx;?ToKw;8#+xLzvLZ6#2@+w9!-?k`jKW`l8QOnS2;L^@q<$C&nB6aXsxme)K(rhijA16J_JF6b7;Ot67?d2r=bvvGuiT~<-{>obAtC>t+68A?{K;!Yh zn9UEZO@5{(x}_NJYAfYeLtL}O%0chuh+fmia4$EU6h$J{&CKNP zFx8NKg;?%^7p`B^RLyt_f`}__Hj1Hg!&-(?$ey1GeIa9H=0N z@m9>(IAUjh1o_?RN#0-08)7#177D&))P#xZa(k{v^bBPQ-~I9}Y=9{Q^s{dQp~OJB&BhkIaOUxVgOEZrM*RBq)d(!TGzW!m()F%qB&1n zN8}K@nw!4NGK^`1Zjt03%k{T9n33*o_HUkmhRtdjPFO^QMKVF-stE&tDHT$7203%B z_|9#*dsX)6c84k*@2`+=P}>YD@>uw(f$l#vz9cAVlhPy~!Oe0fuo?=@_txNK-r`in zzyj3^HLEi=Nn_ulB%!?A(Nqb%Q@CcVb_pv&^?fsvHvwo=B5e;r13VTxAfLkDS$@kK zhlU0OqK}D%JxFP#hJJZnZW%1e(B`T>fHZ z^fiyT?ntqa8esOtUXK0a{Iw8%2EmPT?pk5;MDB}f%$5j972)=+8}ghtF*@oQiK^9b zETfQ;a*SAvl0`GRV8Y>ZSB*gZ;Ghl72QhTbXg_i_{nTaeMBU}Qyzr znjesH5$;i()xPG9{8TyeZ$O`^LF49O4nrAk!6lYq6vBRkjf~QF+BP5c^z^C!%STC0 zTF^n-ED}rqk4R_YH}&fsMu&PwlJgCsL5k7K&%0fJ8_Y)v4Y~#zELY}Y+fPRfURLiN zO-FumO&wqohPj;4M#Hi7vEbqAGO|y7w82_mue@a)CG=&(`Dn4ZPggcJE0!bS?Rmu8 zCfE-r6a3Y)ssBxCeknP`@i}3aMFN$DszN4!pA30wZ}&M{GiD$jHnN<{}ai zPH{Tny-2jKVwYiV{!8_Tm(*zsCi=Km`ylGPbbBi*G7!Hn^e2o(?65k7#p^R;jPLAB z+h{}G=B>ZUdV4wu`$UX;;)u6)z2MH1!6~(6p`$Css9X=`UbAXO^yCm^h57xG#G6nP zL;g*&MOdx7Lj&5vrzmQa5JC{tN^Zd3;-|1iS`W6;`B8z^zb`fmXt84E4#fX3`|IjZ z6Msn_q_Y%TDzr%4#sbg0nJ%K zKr6I&a6d$bJpF(0nF=$WzR~`#Y;upo@LCv2iJKUZWE5Q{t@xCm^FFHi z(!?mjBc422G!e&-%!5zXqkE|&b}K#b~RFykt-B>gfV36>FA7jJlfAy z6}N4R;b~iH?){{~Nj~b^{?qRpmXc)(+P3{w_&DTEa$I{eE=nayp2zL{b<|uMH%pCL z|HV$>1TlmxKHL(A?)vHjWT=J%30d}$g*G3w1=Uwyu2ScH2kjn zqRFsgYI+AF-a(YS_bF(9mu1=Y;r+iB4+csj9nZKQG$L}d>A6LAhwjUtQ@#$Z@3U?1 zjm|O;ST!bXHY^OE&mV7vaXdX1ejl@3MZmkwKK(c31zvBvYrDodko_a$oCleBEVqX) zMg7VAr{SZP7+CQBfwRXfH0Clh(={hO1YISRPz z++qW6#xF&-bbPUtP|$+Bnz3))90r`Bs1(u=Le#$45nVpca+*cYz#<@Z zFn-*I&5L7?`Icj!4%=u!hr)P8g+lMI35Ai6Dun@`JVlp7EgCHFv~M|1&4%TXfp5r} z^!!wIX*{-mg}=VK^@hPteDzSKc1Xe#~%dv?OzqJtu{wV*foN#3+mW-!|rNVU=CA*rx6A&l=g^8C>Ub zZd?z(DZAeOX15ETR?WH$vXGT9FF+c`tB4$&vX30$Ig~pP5^MC#6m`UyqZxS|0loM8 zy1GwYw(FJDw&TfZ{DD;H<9L!^k58$nqu}n>JV9A2fq@c+YOg#KNAo8soXKxvA`t_F zZEk}#Cr2X|X%VX~gMGazN4IA$8!etn%73yf2wbHj3wBGz1-Yil;vg&=AX7}b_zOY z`3HDc`3G3!`Uje(`Tw+!Y7bh3_qmMFyQmlXwaYP6@JwF7}-w~*7XEh3uL7`Trx ziPeS=+mRYNgTDs&2Z@k%Mi?Nd63qcgzPLf0NINbKEDZ)J0uwnQLCS41%$R?6|J*RH zD{P7_1u3Xt3Qe=j^DA^hS6tX z&KA9Ho^F;ke;$jy0PJ833X1MOgaib?$B=kR^$_)zSro+HN6LPQfLjw;euUUW;qJMY zG62q)G~HX}tBAX15;T78IOS};Y!5RmMRkEc+3K}a-U|` zXk(~;)Uom!y;IKT>Y+NjZ#-uf=Z}sK#idA8+VWR-tC~MPHJ*^o<6r4LoEuk_?Q1}J z?zGA0h}h^AVNcSj$)Z=ueDqkz!G~|rSF_9MkgRBJ@voDcqkhVz&WWQV7Czc_k)TemuZrbF7n{pB?YU3R!^WReRQsCV zJk3)=&ptK{bG&ff&DX>+obPswTn8p$-}e%1@)@>zsd));ccgLs@YW_C!L?By6gBuQ z{(uFbo(I~VLXga#C1<1)a_izYRY~$Bs!MrTDpdPAe^G^TV=tB_fPk(FCH%%vS$;aJo#Fz6EwwL%WI(o%ok?MKdb3sAM@fdIp0!7Og z=x98w_xsq6b*M-?AIZD}ihqJs2iOhkz$f#PKH+TW#PZ@M&TT7vZ1d+2XFFp#ADcrO8`VUUnpjUdNL7<;^XOWMy>5r%O*;QL;zr_1Lwa!)tB^mG%Owl&7^9joP;&skRO@x2 zo-LE2ntWCyr0adP80-fIG_RwSNi=%MY6Y^ERxFqOFnw`^Ld~uftd`9`O208ksG+F5 zwnk4TF4o&Z&bav-Mp%7Ev1;%IXzphaVW@r$3r1$o#CQ{0CsJOVhn)fvXi%(P6^r!~E5G^dX^{HCZ zG)X@E4J8F0Buivd5dUN?eYpYzPUw?$L0>NZ4NF~2rlm~BJ$pmd**F4z`h8ELyI3bD zviI2!A2Z*6=@Yv$TOlsV`R%xR{q7$28fEb+*k_6OJ1^ztsqPA=cahmsyd3iw5-Pz3 zq%yRzPvUs}%Y45&B8bCCot9CQH`Uo1O06>QX#YOkzi9cgLmkPgOj-H!ubeSYI?9;g zkPt|eh+=i z91lRh z?{VO6jvk2Hy4+;0v4M%x+GYh(cJsqqt-A?ws^whi5yit9o5VDU;%dEF%;5LJg-@xo zoREi){ZvD@e(4kBcTg|(3~PZ{?mC|lszBP$(5zj>O4wGm*@0HzA?PbNNq@`j$xKC= zEmLOPhQsNyS^j7kmQHRO*g+FSHBv6^exM$B-cfU=X>{yhf8c~Jqu4%)~j0v_PJ(E3u0^m7NqW(V3*@FM(11A z7pDX#wCR5HD*P@6)IRar_aGsp!7%h1{k zzQl5ybR9t$9xdi)YN?A`=($oNy3JQz(bVp+dAw2SBXSw?@vFC)#BvUbef{n z?|lJ7AN|Ascn(xVfFCZzw9_k(3sa*jEI7rtboL4E>8jd*d18J5u`KMtu5^`=xNgbK z%In#AppRtt90(i)K8_czbuV<)`m{?c${5{_MpsCS+OY}`wsOSkY}n1#X@{;hg!u+- z1xw)VElzwpFBdyKwP^)Q*q`yOAcp2!x zcW)mU$*@D3ggh<0AWEySV(9J%Y0jQOQ>e1d-z*udPL8^6N!OWGh)}Gex(oe%x!5IVV+cd_-EOKNqU^eJ$EnE@k46L~Cw9JOj*aR! zxZw^RVj;@gmHMc^7_xr6r?=I-(s*NtnO>g^FVRSl!V+gCSrrw|+6%#vW*LR3PT-_^ z$o(R{{sgvsWhxR?f$0MCqC(vzty-XH0DY%u2a%*#NUuHqdu2J&RpO{(%2lbB(>}J% z#_Jp8E_U+63~}}$g7Kb6E_f)(w%AeIGVwK#^D7d!;F|bI%Bt>7*q7DZf8}>@(grw1 z-#^K(!SCs1E_OzzBgE`rE6GHZ21Z-!#X@8HmOSMJJW>feZZ!0@rfpjaxl|@L^ocOv zqWjLfv>nBbWcGPTsK|^=9Y)&Q+wa|4_W_AAYa(@9)n88yLHB?9g0TI2m5x4DNLWLE zm)$R&%Mb8rIujdr>&VSo9<;QP{cSTPRJub+=4`y3j1zDBX~6d>zQRzniw97WFg~1@ zqS<|Vt5-MLFxut|mz$z!Q}cXmo5(6mbS%DE-{CpNd(88TOUE0jTP%@Mc_Ce$yP1Kb zzB))-aM!RtqSO5XrN%^LY~W_V2da#ad3^x@L)NqiObz+qWWSM-JiT|FMba?oW1X>BRp;`FncegLKP zO2e4|kWuMa9>y%0(DiqM*L+Cw_L2(CWS(C(DfBxrphNIEkx<*t8=-?LPE0qOi);F@ zmXIyhg2n0LX}L=`WJ$Or{HwQv;-;n(@3OzYc;GzF@xw49(5q*Wnjd((*|3P5=~%z> zuvkpXfg==N6JLos?N@ZYf#kPagR%b$TLSw{##X2tinat#OYlToaQ#N_$OF>>j%2nU zKQR}OT5Qth+se)UAESt4bd2U;@Rgz|G;~ z)SUx9@YIcgi*bG?zx?-nxjT!nX1F=-Y!*4i4bW7feyZO_81ZsKP`#(obvw#JdXbq|FU`vr&De(Vou5`u)m~U~ zbPD5YPhHI-CkNpKL4W}(xp5)K^t@xGhWr;c(_bMQ%skk4N^`3!irKnx*%AmOh1lGa z(jRf@tRvSfOCp{(W}_~KXEc5`Bw<`xi+|7&yxq=uW8S=1{FzCxF}~F%`u$rF3QZug zel?PK3TYTR(>y*ELyutOr7?ml;Ke@mMj+MUJ1Jo8Ov0#7D49r%^m|Ya_J8q`M1g~&pOyikvbTOkLg#*QyK0Vexu4R677!_NX$7|hs7|m z2xDeCZwyCPANt3=r{+qNEnjx zjLw_2t&?Sr`>B_#8GlrN_3DFx4ScJ|eR)eHFK*p)2c&L23s&BAk`naBHCsK+RM?Dt zX?7;_b)}uQG_WD-iq=HH%UvDBC_s7gOxYBBo8{D7sgdw22jwROZ*J1z%{W#nIVAWI zK>=A5BSGr;ScTp7v&20-MPfk2xUw4S$9XaoTbEE~8Oxpv=HF_a^j_Ej7o$7bT@=`@*RWgP zwnDBu-_Wup33f6{37=;pzf{qNlQ;=E3pT~y2w~!J1TULf z7$<$oJJ3#k(t_J)0jte+wQ$B166aKi$5c#~k+B=>TyM0 zZ^~OTTL}^CZ>GqZhbS9PtCgXzKezkzI>aT-t1XX{GdZn^T;_U{9Cgn2R^*o4(&D@| zp43S31#dK5hn)q5IXN(byMGEYkynB7cXaZJ;r-3FHvaeRcUnGV?3-hWAg|#&<@*RJ zkJ^@1HqN>_ifr~xA*0omwCrzT1Z!FG?Gv?LUJmUsYq2)P6yk4>zbAgYJh_cmcB&HD zC!HJ9+;jK*>x<~6oeF!iJmjHlMuIaJV16(X=oav(K5F7D$&w0h`PM=eJ|2(w@I~qN zNFcUL##E;^rEZzL3BilaUi8%RL#lh$H ziTy!D&tpI5=*kCqKFwG_5m6$r9Nt=6ZICc1&^e7h_=Kza{Ka-`8|!R`=5Vl%x^XMX zSZf=boMrg1YGg=+O>qSIgW|AUoZ?_)-236j5AXN8I#x<^L>F7?MgRTECZo{T@O+an zsl(Ng*1ANCu0|0_{iO-FyDIQ7LP!znxda{+Vc<(Qx|;fGFU&=yK(VhTn|GqFmv^YC zU~Fe1W$dV9{4!A(DmvAYEV{xbbs`XPJeWv3k6QE1#RvO?6Vok8?-zqOwWzRl59w_< zXs9bYrcv8~#dUy7L}eif97e&0j*<;g^!&s@d<#-?5Qk%KLCIhP^_$xS?09a2$;Kba zJHE33C+{s6bo{SqnT{+pIhgD^^@Sy4Tt0uf+Eo{cs)L;squUFTl}XkMefLWHvH|=h zCl9C(epsjD(whSQy>MF7BELpw{+jy3$X`72I7MDI#eNJwjwudd&!7+1XkC;rchPOl zKx^!Xl71PaC&|TLkdYB!_+(ZM9Em5Z-vr8*DKK%m40=6siMAF!a9qK;DKj9?Y08A3 zZ}`L1I|`oE`MUC8DpB{_U$euvpw}@&20OwOd=aM;gH%bo6hS&Aqc@GKp`=WpZU$6M zSH`RojQ321GjDMMsh*_;FjDhx38KB*#ieH&I%=xrkgAm+)4jR-dLT*E#Q5$IuIb}i zLWBZLu@SiPUU5{A4QS_gypke0D)<1-CbaL*njJ#y2xLdIe=j3g`JhLZJ!b@9KH%|GXREMDpqcs@r{m`Q zj(mG|S17THq3iPgC5@0cOIC$SAE~?kWmbdG)b26tqXP+9f?EW~#_`wPf7TKmmaR17 z?ntHghKp^j81|alcBxD_!Xk-vW=8)--I@(Z6ZqZ)dWs01E{NraFG)jCI_|&NZv|zE zj)00CBCLa5P_Dsm3-A1e>A@t)SA9btFQC-;YD%wlk=5U;<{M8Li&}}$1A+z-|Lu0$ zlb6B^9aswa^`Uiik4>qVAVpPTAz10m3{;aYQ-l6i;`4Pnne4L6gnbl$k~* zY2u@YQk^Qy<%Li&klkPi?kqq?P3+K4hiIBRDh#lg0!>O22g=2}D9w&)7Z6(Rp+5hh z3)ju-v8m#lx~!^{jyc=Ixbk|U z!uq=vul#9N{Z1^Y%Bj@`>KmUrNszeHmNm`fPggbaE==;wlb>eFfa|u@0+$Q=Y4()V zdpf_jqGNMn;5!gi+7nfZKSH4hUA{Lv)I=Pje4lE89I?nMp&({xw)E)iH9YMKZ!*pF zja`8K=L!ejM=5PZezB{*gg@i?3)hKfG&{Rw|L%MFEWZ2juHI2#&V-V8$`y5UnoEYr z8OWpxCG;;NI}_1n(QFHqE=gkX{QB*kh|O`xl0ZsBe5DDkzJmiM!jN32&V(nsjQ1zh z%qI3XUu5dMR?gsWE*vO=#jW~4s*}32d|XW&sAPpYvaCY1cm^*?`R3PILX&?dPHQ=?uTBNufHsYMjn1;iw-wMVm}7+Niq^o z?eQ_drK5(Cmt^u33tLtm&o6kFA|pJc5XAca@2P@2Azx96|C?=jNP1}lZEc0hrm?g9u=(<+x3!YH2u2+>Xo*{>>X!!7K zgJR!eiG}~Yt;~2_{r4kzZ?EeH|MvE~xn@49 z_GS}*#?Z_x2DMHbL@<;ian36QPJV(y_wbN7IhgWBGVz&lRiZUKr z-B;K)2uMC>dSNxz(ewMxG10O3{>!{JJVyvU9_($jIyKH2P5&#MqO8Qfu+AWsf2^+1 zS*5p!K_tjR0pvH27a)dUxRH@W%OhCvd17@?AWk|oiR|6D%$5XnYRIzfTh64obU`}` zdGDN6(8)l`7-f`nJxavEiA}C2h$SNvyX2pw?sJQ8U|4sclOWk!yH+W6;oH!&Rgt)# z0_tzI6?0~0`WvoH!Ej883}qxCFW1A2n?qIocmP>gu@3QiSKnMIHs8O(URzl zqub_u>`Ny)uS8U|-V+ruQ5Lk6NuYhMJ@qyHXeA@FQ_!K*ot=x|erzBd76i$^!7)TQ z5nSyGP$I{3oz@6j<ri#$Nwo~!9T->~G z28!*X;1>>>FUZajoEOWdQh?FX7|)0ipHpqwU@6%~C;u;Sd%AzqU+T*_nJ@t#L^fos zI;3F2j|(Pnh_b(d+7x&@pW#(0TSZ~sAJy%X)$N$FZ!Lg8MOGYnyB}tGOS*8%lI1*? zhD#nPQz1MX)NUqMehos%lD62%36iIBgH~S4i3`ywsD*%>F?aote48$lBdv}t4PIOh z??oeSu5T#r-YZ>{^*~crBtM6miu#RX7N>gsT>iD(z0x5}j~5sRndXTy)`>hF`jom^ zdbkBe1z(8t$@r{rQFkxXBm5&Jfp;)rG@&rYBgS64O1p?V2lAGA6;Eg4>pVadz;>6s z56~SUVXJHCg81N2s`ri&fhmg%7*8qsad|PTK%cW`MZm4770k230>g{0F_4>mrL8U` z+>)MpwYWSYlWsGd+=dQgpTG!d$lEXfU8}Ub5nH5n&#>Oj-S1N;E?76SS{!z*stXgD z0uvLC<>o`>X@KR^%K-n=yzfmg(sI@;M`QQL4Qn<}PmxpmPa{J~xE}CBqYSecGmb;@ z9y9ybrV~xEbCa|2s5dWv_dv-U6?5yZKmjS7fY`qg&jgB`8GQ=F1p_Z9tv!q#AbBiG zm#9SumzWQ5zg64l#X0jz4f;@XuyA6~F6lUg8~X_RxP=OJ%-sDjCXtgi&;T)wPU?k- z3%vDl-JZae$7CVYz5pT7sG}8_+xw zU`F{uWc1gW7-75^zkXLji-n5Av%Fm7;@G_<>k(3^+^bw%&@Fs?vt{*ZDgw`G4qwFX zSYh+W=M9=lwa@9{hpO*PJHB1~KxH}Ex0dNGx?HedMK&!M1p@(C{dXawz0VQ{jGNyy zKPZj>M-=vP-CCdRZQ=bt#-I(SsI_=^s@7u1N({t}@~Vr3zibV%%f{Wf78knn|J@{W z4&X%MQzS}-yB@KD;J0^ox@R-IwFGQ%hSZyc;&OMzE;laVDRb?a3Y4#Fsy}rB)=M$@ z1R2C<7$rPJJTjedlX2R%o=24=_1)J9&X^59E8>ns2S9UY#toCv8|ceJJm$dNQ@IPO zPpd&F8D(nmYLKfL(TCAiMMey^!DE@QQ*aZDFf!|yJJ#oxjz5` zs${zD@zYN(_GlY2ZH**Hr$*)qk=s@Oc7MCf`-Z4PFs&Kn?TO=MZnjz8Fl$@9aL-;O ziZ?eCX7<-M=TR{4$#R_(-&WKKA;#4lb0D@P5@yyRdO^+|EsHl_cw=0Pd?4DA(BVVL?u!SMJ!U2bBBSP?al4kfkPR z1`>FggPgb+j~glPuD1I_F>W+2Mw^{VvYe}}>f_C7$M&}`%vg?s8WzS&+-kP{C&jpZ zWT&ZW`ptl|j~W?%j|bvQsj<`q&l>dUYwyD4?x`KVCIy_Q2@0R5)GxkHweBxMoEpV< z0Q|J}0RLV)eCra*SI-a&9;D-*l_)gGw}I7`tM4W;%f}$t=`N?K#71BaNv6e#O2E8G z_)*Yq;`er9QIl0uHAFZZSq)rP@j7lG9>rR!jCt~#A{Ub$=fuu?Fb2d*{b-ugvm({H z7wALY;^tDDNxm=ft4bCo!rbnn8NFGrBmv$SbO*1t@zslzJyIC|X3)k~)2*fO(=-y| zukeoMiQ$njNvy@_SU7qb{hKovrFmE~x%Gp`y3_E& z#;#$*zN%n%%AP=ai!%VEY764DUZ%YBFEppKlv_At*;B9#8}`SRto3uL`$lwn(?--# z@sy#SgWUE>l`U(TT`F6XnS=yBhX^F`wquVVc*(SEU_5_H8^jo6xWJ~C_DYBLRZEyR z)S=$YPB9y&*%LMpaQ7%k!TM8JzXzsqCgS?3W-;tdN#eA|Q-q<3BKb$n1Q{%o6&Lha z8OWve3Rp69uzJj8?1uB!8&l2pGPzh|wP+x)b&LM8IjcWFZChZybyjHUiQe?s$5pxM zbeVpXrPZ=*=F2vE-uvksjsW-^iMgI@)Aj;{$8XAN%h#(mM%v3S8ldFZ3sRN--QaHU zVWMt6A?s!xjQ?3|II@-@WfL`EWuDEEgx|D)1$j0(uTe3a9?mw)#JX4)uNH(XudL#b485sJeBI2OHjb3k zUIsffqn#reAE`>c&kN$-g|fraxRAhz^2#Rm8p?V5`g+QwAo+C-^6seQ4Tdy~ty}`XFNM_c%v&<9qH7Q}#7&sQSTfOs=BUDg1^!d}36YKK8Mh zVbCyb0bGmPJRA~QI-CJx9gQV>lUkzW|8W6s;bo_RJ3Oa?2&7pwIWotST#c_xIxl(a zd>%;M%g;ZUP>^VsrXW)P$ZcD;SMMYWI)Ad83uZDn`>N?6Hsjo;9HDXVzSGIPv_=kL zP2J^>SLa`q>Hl)VUx;$`3S?$er=BZ@Kphna_n(Q@e7o-?{vQB1LC3z-v#Q+Nx0;+V z@&4XnHRX1ggpCoo%P9V%=Dwi(co=r#PzDV^2n#cn17=M|k~Ti8!gOpJfM&L-EY(XD z(B2r&8UX75l*cQ@P$#o>4e{&%(NDc>%=)Kg01ixUCa33jk=L(vK%nTc>Y_O8){fhd zY3@@*kc!U&`Cl}Kz?TZ2u;MnH;+5+at+yO077GPCgae3`0U2fN=%Apa{Qu>a%ff? z**m?t>^2_VPI&RmbwQ2-L(*LfI?H{Fd&=W02dS&hSTRBvofw=+*Z(Jf8ZgN}<_l0s z&>Y1%;sG4+0YMD?7}2Dh)GAxh8Gt_;xx+~B80uuUEnvZ`JfA28A^CUp;93EN%@2q(EC)W;DgdbCAsK=9y z|KaqxF(o))2#hyE9tHaCr`8Tr`0d@supKvs;K;O=IusKO!J{h&DADU1*G`v@?zlw0 zIux1Q#ZLhU_H2b~QljNS?v5F4O@q%;zo-#5aW?Gp|3jk1}k?TFb z{0IBVutw#SHr!DoWw+pp9-7iz2|Sp07i|L&oFjLICI^XEfxA+Me=|HJ6dnS3J~VNu1tRgc@M4!h9ry~c#9A3xL7_jo&#Nm zs=Vy{Su9^#8uoR{{inG90D?5_sp3qXtraR+WAV3$~q+m1`- z6rWEp5V-%85qYk$0{)~Wt{Opa!1j^#WKjJwq2)j@0g&eukD-1>eKqhx$U>PN*sQXh z9f;eXUFE;j3;+)Yunz9^cPD%TBT`c{hpC4c+rH+jkqQXw^@Ag0XyJW0){dBM8 zbm+Bg4Y`(W{>t?S+11Unh7ky1$KT6b!l})b zc!Zn*W6cR45E{e?!I({1p}M0zI|JZ? zTyy~*G4f|4(x7}{oq}@3083?+UFE+s41m8=+_SKoCa{QMd7-j8lP)gNmB6_8;~VAE zy~~yKlO5W{?1TU|ylbotUnnml$6!sSL5OL=EaR{36>$3>yC}v9%|6p>Dj62^`KD-#RZZLWjYlY z$C#8+gF~W`Tmv2h<>QR<3^-4BUGF3r-ng99EE6aP0*u@2Ssu*`awV((cdTAQ)|#7e z+erJs_Ql8m1ek#)H`85$9Rc_Mmnc^QvMN8EbT#?dpGz#nmHpV6fpWv_q>R75(qj#|EFpP`Wa4r&cl-Ga#Tsl0Bpg95K4CTuas>ychB*ny zHvr7b!~-S_@T>uN&&YPqPS(00*CNlBJM@CP*D57j2iDRi32sR2sKNdD^keOOdI%)G zS4N%aAOhnO8POgKqlk3;0p~{XAT6cql1c#XIv^z~JN$g4lcyXXAQmM}as{UsbhaL4 zI>006>4JTs^OZ!nuM;3+LC6k?p^ipvfdK#j6zKo&Td$1VJfd#QT>q4!W1daC2T1y8RZuDON)gH;+Kf%9}31PU{7+p5JwNkIvb$Hz`hqqhopwgHHVCz3Nq4jJ6A ztn4y3DOUCW)C>ThGzLKt9vn(}ZdC)^3;e~A4f4_cHS+19b>=19lx@vGu@;w{1#Cnd z{@AL)YP1R6K0k1oe0MxDY{=n?3q{`XXAcC(N7D!eoPhxRwy|#w>6{b*1TjI23fasU z>S@$g1<#fM^yOxcW#Us1Q zyulsh(lI^c=7l5V;jMG!!@ZZOCxB$-cL zc%j4ZRl9U3BJfMkhRPSzV)q9GM1n)vf1v(?9$5{*IpP60At?wredHMjE z(x;e8eTOa_ zCTuTg0Pq4<#!gkEvzQLl*~oq)Qqb)FNu>+Qj5d|@Mw}}lKximH`H0dH^&snO{Vm2ElCxV?Hp31V18*?yNWCs)lKfce5U;I&dbzm_~o9A88CK!l>fOK z7s>S(4U=ho+en9o)umQKS*cpCq|~cgUi!7Jryj?j_N@*mKuoF;cUh0%r*i-$$vF^) zy>-JZpNZ(~a|l2L5&}~S%$GaB4M2|!p>m;EDQh%V6(d7EI~hod7sw-xDi)D>9kQ1J zC}W{O15GT^)kdu89&juT0Es?6ubMqrY8z$DmnRv+Y(N?(RnlGh-p#WD3Y}2{@YT@` za^1Y4(!v;&VucEvaf}=}a>(Rft>o$J7RncgEo<*j=SX*Atix7_?`%9=?A^X)ddaI^qnNO7h4F12?iN%!p*SSKmR{E470H6COHPzN! zhJ1d!dzreLu09-#7wlgTU8A3CCiXT;nLkzKM+)Z4E6r*q$Tf3@Xujardws)|&JNA4 zkH_$*{j23ZV>~AJZk4L?JL%D^w%oB~j0s6Baxzw-z_}vM1Nr*!I^{Qbbj1LDm(rR> zeAJ&8FsWrloeUh(7<7xTGkLOEPouW#8JTV5VIxwZSU%}oql7H!ns`nc04D*6u(9MX z8Hm0ds zOn0;UC!F;dgd3a-IfBsN|Gi2u{J27M0noMa{-k99T46yse!T>BA-TkbJ>7-r# zYMQ)z_J&3Bi#b=9LpVcD1r5NLM>fdy^M`3dv3TLMcYmZ&^@?)QkdB&f;P-#K@7zXC zW|t^8g7FpsD4i`C=nMeEae)I<8T0S$ZX>O{3y3Kgt}{5#;6BsQ;C5YXHg=FCtx<)Rfy7kJjG7k=X;rr^Dv9S>eI8+A0QtEG|4JUa_es+TM% z0~?f))xFLa15iiBdIH_F=NyI}`2H;;&em+HIlCOd`pNyIbkV};DyWwuhmwT6>?-}DMTsd=)bZAgLEDwVOA)&%USI!B1Ppp;iT#%oAZbI0P z?!CB&!j#Wu00M2n!9*a0IS}WR%{~>4?rLjfqmh@4=oH|gjmpZ}-m&EY$f$%?2SA?D zU_w_}b|LUw72uk=L#2LV1x@yOVJK?9$Dz1~(y0?EeTxul#9O_yot`{Tq_zvu^OQmKfPD456H+oMMM8L60U z8XD!*(X(T~UNa)K$`+E5P0A}fDmUOj3=BXrmKYV=JH9i7F@}HBhvr*u{?5N!64BO5 zaQWogVcJv9Ku(ZoV9%M(6O9)uvx-Vt5X9gETkQ1Xl&(6tfiI4%mvxi+NQII`!}?BS zKwD$HS51<4?pSUOO9t@<7pl0>@S|Oem2<$2Cfk*U0a(~EL0TjfmC}U*2Ay&_W%DZ8 zrJ&JXU5#Al*+GaJ?~H9$L2=NrG63NSQ+H@FWwbQorTFCU2PQSqffE=4k~~mHfg1c^ z$0F@Ki zu$3Q~6vqLa)c~Z$Q;^aCT->ROw5eK5>B0Pad%-aS_4Mrcqj!x+{qlvi_PM!#&1^9M zZnt+kJbZB|FtpoP=ld?{sn~yJ_rdhSuFl|&=Z#Xs6wCk)fE|4Dce1;*fATZHKJftF zyY(Wa#a3AAUD0{5T%G-;TNleM3r9-#X0^gn)O>k!8)H#cuAVbk(R%-S=xSeKeN6qK zwesjy^JHwdW?_9_4ljpPELBWajq52N?p+=Dp5H4kL0Sgj^Zl!o<(YR&4M2+CfWv1D z3JEX+ftLX{Q#0E%G|H=wkzGbUFrsq+seNwAW-71%@du-*OdQYHXq5TYYo_Ug3Q%tw zSDqe#a2aFB0r0aXRxR!zFqDk+tU2c9FW+4DTxKzBhb1|J^q>@0N6cvAahUV5}W09<`0 z&XSE~Fa-)v=H9&!v3@BtBQA+|_okULZ*WIxSiNFcic5dMpAW7L^ai+YLA(i?en>2) z_Z|83=8-uA+iO|z+Y_mm6@TyIx<@G!6B<6e{OktcQeyym)GDO_IsZOCW@NsRhS{g0 z(Or}@?lkfzBiaZwqirRfl^#h0;9~tf{@85d`=?Dj4{sYK8FqRoq%50@<$??4fnyiX z&KY}|701T&{+?BGZ0%GT*0FI|z@P;~JISXe-gk&VX8`_i^CfcQg5l}r6hH=oF1&I6 zaQV`B5)S(N!#QwI&QQWrK9iBTS9m;>Q28^}4v>*|ZJ4GU2Ol3;6TnAA>bVCDz~R+e z9eQNN*$u!_V*p?Wu2?K!03If&&`gPn@<#w9sRQLy`*gM^h<)5jOd~Y;9_={RDAvRWwPheanip{y|e!Q z`HKB_)d`4Ap1FRZY&GG_^nPvRhWW$f^&QL9nDPIS@?=~%NJvRuiRALx48Y>9iPABt zL}(K50V7k5)Xq*NjppiRhUY zv<^#B&f)g6iyNXn1sb0dCYjN`L6E|TNxrl_)Gyl7!= zRi~=dty)f&jqWC|ZeJo_`x`{04Zv4N*2*903S2oLRRa(x19qt@ZL1ZRvPA+0;2zIX z=qF{foO?)hf!h^M>lrI|JYZrC}FbGqF#qor-t zu%8@QD-Um*D_6}KEE9XSkY+V2OR1uTl3mx#{%y6D`8z*p8#x0IoFBj#_(xX`JgWg% z*r|%NtWqo#2z1iOa3fW-TT!F67<9nE0|p;R%`%0Q1!bL&1kADrz;{e(uKm~V+%#9d zIJ7#z;Bz4x0d{a+`Y(*~zI@vfjpIiePoRNOcFKM^bLNoz`SNI6@5RHrD3>4cdP*dq z?FHB@_nQBw({OP6M$*1Pb!7p9b_|9gLWEb$Zs~T~m|b(oZjT{DxF*<-p1gK}A``Ek zGenV(qq{Vf_Vp7bp;TeXm5Nt0y>A;0f4&d-?pPRr`5i4ac*%kR1905PKqHl6q^}WQ zt&OZT@`4emUaFuBYEV{I_sUu?Kyb!eGdVrKi_V6_`kyN#p4lbN6@O><3OTuPx;FpN z&YM`Fq`JD0hNAo*+__4BE+vVldttvaUK5DGBWtF}rfL0k_dK+Ek{XxLe>&^w1zmLP6I}l6`ahrJ6Mdp#00;*t z%l*+P`TbjF%PosW%9fb}75#U5(+vIhZ;qWk8H!=R6L@#mO5IJV^S`}oxyHzUzyGRi z-}x<{;gxnCfr;z2dcpbaUa9Uq4Nh0g7$Eb9c9dZq8cEAqm8C-Q2EcvK7Y8oWhOqz;C<8&60|MQUj1dQqWLH zFSY*HuAZt%zjJMXM|R5(etZnjhuZhQ{1};--|p_|zu@jWzz9$`SDwHq8&rqTW4GsA zIcIi!5{|^^R33mGZ=BjsK}ZAJ)RQLFD}=htDy7SomsYLY$cT|6W%1(0a_zO(%F&}o z<-Pablg~f@T-L8&FJ;OEDY)kt1Mr^lCVo1#C2$@QF#tZqnkm!tkKDVcn@v`yGypy$ z(DXKyO;}t&3gihGfSpE~87UGQb&dR@o;l6PgGRL8*`ay~S==QtQwCu77<(fb&;0C$ zQS#xAi<8~>xSZdDBD#JD<{yy21f*1@Y>CvX9EA!=Qc{u(88SpRZ{92qKm4$K_0?DM zuYdhZLf2JSU6srOm}`s)V5(pzB^nv&*)~ThRVa@%Pbex2I#x-R3<=-$x5<80BoFTU^8Y!zM_L6CRT1)R1wWV%Cnb7!Hyd1eCp=zSE@6b`kjTSrGf@vPHV$Bl!U1 zl0A|Vp||~#QR?Eit(Pbzix!mJxz60}3lu0I4I4I;i4!Nvb=O@dPd@pieEs#;@}K|w zCsm~nUE~5vmJH0{)9MIg)Eu57Qt!`Cz5#gm=6Tw23O>bpuJz6^0DO*YTu$=mPIj$Z zj1-NDrbcNI%e3%pOR#Zua!BQ3`E)iqyy$K~LPiY0-tmp(ne`*(%R_6TM!*r5tV!4i zy)iu$tkbnglGLnNQu5{qDtzvI`6aP>4e8pgyG))uMOLp~E!($mm;3I!Pu_a#E&1Vx zAJSEPx3+HGD#eNw3w-zdAsy8C1bP}GWB`8l4ZvGB%+>@TBj?osI8MOv4FaJr141c@ z=gJY73Gh!NYrG3+CIBm!XW31F1KY-u0=ab}%AJ`o07}(8xtW&!r~}j36YG~fE@?|f z5qeID*ITx1DKlowklSv%OKOUS}Xu}%2 z@!(+^fIzcP6FE7zqr7&_H2Dj=%oHtFwxDaB{~```bTwQJW(o;)_z&Yw58EFaTd zzCN~5{_()o5j6n6nD-HH!qS4bQAH1ZkKNzz7+qf*;^+kQ@44Q#BE5>$5E&mJg)ues3Koi$bo(0QIiiLt^$6D-J7e_Ccx#-MC4_L-=XNLqQYx-H8}6J z2pa$`V;)|sC2D|bDFHzHeFJcvdG{C52$T?DV*bLjm9i1BQP1cvNDklx__q=1oK#Xf z0!f5~TE=t@fN`tnv4(C*4Zz)T0}u;w?ZhPYp14&)CeO`dGe!ASF32}*3j`TrwDcVt!+ zpHDz(fPi433awf>ar_ro4yY;9TUU}s6#_$E;LKz!Sl`&FXY|)(&rS#W*@(1FEUxnb zZyIKA(EfCYL7V|NZVUjOe{lLm!T|i>zs$e-*=lyU-*ZWkdyy=A|Byu#lGXoc|7v9r zVy6eB1Gxr$^^<$GR8GPARm&Oox?nP;FJ7v&v}oB%h7BJs7him_Tz&P`a`^CJdG5LA z)UU?m4_aBNQRFbspnHTZw>_(MVi#~M;}r6g_42Jk%yM0&IWwI9~HKt zPm;F9*De$Aj@~eGjc5A+F35#zbGMN%jY!kVMYR#)sxY|$qh$c%lDdxW; zs5fAC!IbT@=ezvq$MR(D+2w!pyX_nX|LfzMG=cZTHS^`@nkjPgq7j-fyJ&Dn8QHn9 zbZS^lYF8?i9G!>c$|J=}l$6|gY;#Vza^+O{DZk-@XQXBy$wdX>mRoL-PF=d{c_o%D zDl_`EQC>jq$8Qm0HFode`?oHTCoUTj7zwr~m5D%<0wDrnB2cLy5y<_X^^z}`c>pOF zmTiUSw*}J^02dmZXbOx-rz%=UWi)Jg&P@A($M!$LeETy17oYqiKzXxEdiT|sV z$gd@F|6anJ%@nONu~5$JSP7n;c?RW?6wI4TYLqD`Guu_x1YmlApkNgM-oJj@Yn>GX z;4J^Wn`dc#x^tr%l2oy@Cb1yUB%96XtIrOvSKK<19o=zR5m%Gfjy`ty`)nMq-GL^S zCv(rw0LXdm_GR+8+2!xrFkRz$z&Xpu_Rz6o{ae?S<~1v&%BDk1U%z1^>Cv;7Oq@7L zR<2y7jW!!LY>-213#b49AOJ~3K~$MDXG)zqb@b#&FiRF0FZ?k*kQ)cTQQ0cxd-n3LtE$StibhVm!HwUt@LSCS864c)!zCXL0D=s zDO$9s)T&iW`uFcI%a$#Z-Me?o^UpsoKmGKRqVs^}(s0wJO&k6B+O=zITkca&Jrz>} zaN@)X89aEflqzFqDRyg8L$+TsTAPo!FOhn#Y($KPd+zeFN=xsW)`9?_;GZdf!-)}c ze}DCC{GU6!l`^|m2_u_~{LKRdk~4?&t5;fX7*;1x222kRuuo~f+v}i@AF_Z1bjhC+ z>!<0iSG_{A2cpw=nSujz%ylL#cwoyM?H)ss*hzIq^_gmLBYBaCts_S*6^z%F_2=#@ zbysJ{VrM6I*WKN($GhHtn1AVWr=6B_Ca-bZ#iNuVh#ekw-_c!~7z0;Jclqk&ic9f= z$pJcf^B0tas@0TDXUNc@N~W=H-8zk>j~_p-Zv6)zd>}vn{BuCjsNd6-*S@_SGK#Ud zuQq##QkR`fK}YA=6LM${{F<}I#!O^lD7O;JNbL-8-SaJ z*Olcxs!5x~008Lko*kS!BL?~yleNIepFQjLNXP0WWNq&xxou?lcmNPqWLmlLnKb~e z4fMS|E7b^$>e4jT+BE|)nj}?{MZ-EP=N_yy?4;+)FidwI-Cm9MB$g{F1@h%dbB9Oxzw+hFOWU?>W%A_7a^;m*%02hoqqTZ)_-9*hzWJth z=(TItE?@vC`_Zu%s|5%MjsUzDca3w50VK!cazI(l@dV}o99kpq-?l(I08=mj+4uVL z{xxM{%Zf?^=ARR~aKy;q>{Y|qtudaRf2OFwCKZdy>~;x(QDN!f0RUEju!3v>(8W)g zBm!|eH9IEMP`6z&N`{-=0pbZSg<=#j;Xz|#1o;0sgWAiAaXqvKe*5Cla%}AsovsVV zJi7`n6ua@iAHGImrdF=D;^XB1nTGr;r7=YRJ6EMt(GLsnzxjm zy?V>|2@_<=k|o+TcjujV$^#EPAg{jqs*-DjQ>(`STz~!b$vgm{y`cMIwZ8oFOS#y1 zA-Vh^su=TC<9lkdGvejHJz-Ll9$?iqMgVsi_-fwVX;0mSZkt%Sdd1SxrAbYh z)T^bep3qBnEE%n?<=Z<~s8Px6`LLsta{yt-PQU$bUS>DH~AOq(`Msj~L$*&{E!@Pd+QWEPl14&a6xZU`6v zj!ckgh4SXqOnKAl6{JVg8ZxSL6D74+KBk8b+F)0P z%kJ`N{WbG^#f*V+rHRFvuFH#f&D^1KopIG~Fv2cQoW6c?AN~D>Lpy7|dR+JBGPHdI z>D|1xbTYeo3lq0f%Bo(jm}2Zp7S1mP^CgerbLP&gNw3;<>q*=89c193K{92^R87il z+O$b-zWHW3c<`WtbI8(v_~D0HZoZ*`=f)dv)TSQKHvkJ3EYK``EY_d?^e5T7cdzv9 z-P;Zq70#*w4NtfAfyzvVY}7 zH3E5Zo#_b>Cp$^`e+auUxr8DG^J~``$;67Kib+D55>nN~;UpVtRw|>rQT@aU8d@;s zn_V21+mb~J>Tz>;X~*hm3Fkx|zFD(on)zl226{{44tJg%K3YgT3;;<$X8>x{s3G&` z&ySe_ph5wGNaLo>?D>>0p-jN1Hcr>)oN_=)Rzd(aAwtsqsb&Ai1rdPTl>nrSCcph> z_J2mU8Yz_>ig&IoM-Xy@XK#SkL#c~WA5D)W)RBThw(#7hF-i+YCN{IVfKUT~CqOa{ zBXHA#5i+Pv7-zgGDL=t7%82*c9W!OLx z8L601MQYWlt1orS)@@Au-a^WjEANLU#v3u`Ho>^OJ9qBX#x5qpMCb3{Px># zQB}Bi-g!qo3ugcz>b&Tpi(+N~xc*V2MoGDfmGpet)Jc#nGX}`h*GH!Q??OD3pLY0@@Grh0 zVQLJ+CkC}^kc^*>-Ibl~)?07YZZ_iHxpU`ghZ`W6;>FVs9l{ZYSdfwDJISn5e;+@7 zyzc62)~wO&Hb5IP_WXSQ{Q0#8Pdp!sg#n;Uh;ih6s#mYB0Gvl3eKaQLgAr`ryt(Ae zWAPmW+SJuaM+`f0pze}Mi=E&1n?+Sd%OtwgxZgYCaG#ex67VEg~m zTeFP3<5?awX`5I~R`jSQHxI9y%yOO~0cxd2a%@&xd3oDp`JO4j5i$VQ6JXNL93l}Yt`6eEo zXLiK7bLYwI*>jZjX4>=_GG*#i<-40Yb(+kYHCsz(t5&U&%P+rNfi=)!k(K9I_uhN2 zmeoku(M^YIKXm9&JuiqgFaR{Z#A0Cpxc*L^It2^>hA|cf0DQv64I2V;0CME;WNM#Q zT1EN#SY)OF6Z_)@ko*Ih4n#e*Q^W%lUr3(Hz~AkdbV;PaLZ>ljFhhquL;SzM+S)F5Mr-xU#hL6DW~s}?MB(5 zq7GgE{onsBfBW0t^d5SN%?|ALC*K~*lKMx^B zdfaz^|NGzNjW^!VOujp(#*G`xjvYIqsat6-t_Ne)xpQYd7bf!nAcE2>JD0mJa0$Bm zQlwx$1wnm&czuuqFsmDd5B+`h>S;>-P5hr)^3R2|i@Q{n4%LfG`J#d5A9`Zwjk#dE z|I%CSypXBE2_^DN?>eOvCFSa-=@|fSHp3S`xP6h%W4EzcWV-h-0E7dS^e_Ts?0dJY zE5-aNu7!#el`dVn$hNIpwFH(PH8ubLzyJHcY9J`Jk&OGtKmMVyIiwXBjf^Dd_&$sY zO6K`5dfmEpRS9FUFkUeBa!)vy#Kc77>CDza9oe}+D8eP!qel;$lr_SHWZIai^!y`2 z{r|jYF#nK;f}}R(&hG?>JK(mNfeAo?P2?`mZh{H1QNP$P+8&92{=dC5fv&PT*Z&TX zFoY=~kU&BbLJ~4Sm}d}~36l&m$|$1@f+CZQP6(pZsm`d(L+f0utwq~fZK=K9Yj3aB z)(dL2dh68xYVYk`|9jWkcmLk~?UOHokc8x%6X1K-dKWGU$;mn2e)l^(@ALe?xJW&9 zZqr26QvGw&@}~i|RCsaK5PfRrY++%swOP$#_FX1$>Y+9Iq196*2>3=gQiHPy6X~TF zM|HK#PjzL|ZaVSNu=n13Phht$0Ayrj$Z`;59Fa7B9zVBzc8=}-w@whu1i&di$Leyjdx81A!Db|;3Bc*AHMzS>}jAM{kV4wCdbrAd8(NxC=g{L=s% zagQzPt$(y`w5$hz32wfIX~HEFFi!1A5V&i}ReE^04(7wG=XL1grS@h)2EKY2Xd-10 zY|s=`-b0m^mL_PtXc%S9w=_z(O)J245-IeN9nkU+jm zdE-Fz(I#|iRjF~HtF?dygTCU!fQ>d>B%y!x9vm7;Ao2(T{!9Si%bYoL^b0S%5LS*m zzcJTm;l{lNFaXT`qhSO9I`1G1l@|aOELafH0KmQi6B5V&4=#d5FBYRdbL$?PIb{ z5GXwVG{Bb$9Guft|8(nQ8OeMeCYf-T34kLf2<*9Tq8{J3qi)&MQ98w#v@=_R0HZk2 zb>TM9dt@H&y#wY8mOmOs0HF4U1xR@TfCgox0sx1f=?L$?dp}yYXsWl&9;r_s+7_Do zS9ghv@!y}1Z`Y@G%@Nk0@|u5#W?AN+JICgT3RYps^3PYsUpGE88V9a6+Fa!$3#AW$ zX8NvimE#I@y?_%p3>P@&>3!=%A5=Ip0f!S{IcNWdS$fjI&ZRW!TO=jPD2#>}c=T`@ zO+>H&?q|c!!(<{FM)M7h02crNCC#5dUzUm@VQw37pf`pDrhP?Gd(j-^^Qvz1FU0z5 zE*LJF*S1WQ^uFxYU#R=4HBq8-WZ+Sq`pa) z67-tEnUY3TBpylzK=eJfu(#+1Ko>3?_F*ao++IF70fNBZwKMhn;@&zpwM62nc|xKd zIck&$Qqmj@7xOKRKvG`!bHM^Ye^nW=%$hbb9x@--eJ23Sn>Q~a0f65ZoW$6%V|8MZ zo&BRK46_qNrlkFUt7h{Lq$$r8hac?8i>qwyUw#1Sq#rk>>>P9ZXCyZC3xLw}=JwBu z%4w^G#v3ui_=^fitEt;sHjdLXySLVRrx#W%AMQ)NjxOjaJOM=Muc`?RuJD2IGK|xQ zw(67jEEly|`0$l?7-Qq&1P_lS6^A2S7@UMq3J9~Vw?A;^@K#ybT{ms0?pu(d8^+pkPfVS%F zntB_95s2+O7XVUIQ>7jccL0E|02Jn=Nt4a{Z37_-Snxc)^XOXrg-7mMUF4rt{Mn-4 z+Hs9!n@>C9nliQjL38u-tU`CcxL=wsN)6Ti|EX-23n5P9XdJZKY%$70gWpy5jgqFx z+@6(320H%r7p@;H%E5o!YdPP-oe8)H>kCg0kM&#xYDR4+hM zF%yjs&$pzZ|9tNv*%63D03aK1^wKa1gB4(t&|eZ{X0_|~muGclY2fGG&L2jTpSvAB$$9oh>2!q4x$Ub3_5GXF^JZ$4ix zls9jip`TlRg*w0o zo;`cywsk)PU=X_pkv0Or!Gi~7D^hs@fbB&Vn8IN|sM(_cY~*?%@F*-O?jzzZpB}%( z2Iy+e{lD>Q|9}3@LjA(Z!2FJ5)8M5*q2^5;8=p$Bz$V! zOucAKKV6j7TF1Dc)*?w47Z*#@ircZehZPnc7H^dI{n^21>4*tIB#oa5%h0G%qe1~- z=FFL43ji!o(eUijwX6I*L_Z-`*=@2f#9sdTl9%~i;M~9D!nj>7l3(09O|r|f2jAcI zCsSqa&r(}KN=Wk$2JC+_zC_u6S6~&`JmbGK{;hGH*D795@0y}-EzY(8iwZac-3J77 zF#UjcOym}XV1zXU2?G4w7jIuAs=4$9R0$4TNHZx3;H|Gt&CU)!9Q^M4QV#>l3AgBG zSqo|Kc>w?}gBdes2r)-Z8~6u)?=D@s=-B#}T(ck}SueY4pnl=DMe_bv8}siqk3TuI zNknK~SzBx`m~v`=H?2bQt7m#sofIFUX@mQc&i{}ooTZD>`Y5|4NYs=v0C3Rq0qK$f zRMZRbj|UIW?=C#;ENy&tY-Z_V8rOGtoC}+ zq)F1qgEPU7atA zzi|HfMt>+_vGtc0o#S-z8QN%ogV0KoHxbIPNkz%}5mN>@5z&1W1c1;~VC9witvhCV z)M4SD3Y7J4eLDmXteh;o0)FHm;2mb>to72-h7X`B=9q8X_ha@>dd!M(B#i)Y^ytx0 z06-jc+O%o<`RAXnv7Z6p=hkUI;49cri zFW@N;AxP7PQUE0(!3LNNKr(>{Y5e_F6nJ-8;Y||+p15g-zHa;g=~llA_C&(YoH-*mvkL$$CUHwMqpu00OoHf>*3^D#t!UA!h zuPy`0uW%S6laPQ&`=my)DY&JQ`T?P)pvN3U8b=o3Xv8C}`s=#U1cF~bv_|j(z4J44 zV$;wAV;|_kLaF0vog@)sjvHkTM_pQ>O9Nk{(eZEk4h(GFn*34NqchjZw)&A$;`~QvcoyG@7 zRA{(XLOyk6WlO$Zh$gb4cr03Y5nOZ)4eZJVrr|H$>WDd_bAA{7YG zp!-&|{VdB6bLt1KpDbh*ee%@sjEBW<;g)tbr;UTufF=K+=D^g&FsB#V~aSO zJbAK^VnmXc0E6-jjzY*wc^zOANY$$w0ANsJ(FmC`4u5O|yM5Uvv9ZXxL*dTYm6<+7-xAmx?6&AY{cjR(0Ge97JvZ2M1$9&yZ}HjqGqp-If^egUBF>!M&uI> zM1)XzKWmER_ssr{0wM$NZ^z2#?)v-p{ckS4?~ngKW#zsSqi}96DMK)UEZ`&Mk%sh2 zZ>Dd&GE?6_DNp(Uhbrg=_?v>10xx<{;ScxTWVZ$*+!VAA+YbHr6L;yqzr0)a2u|L; zTu4T)9o-ffn9r6THd-vVDWw)MYn}68{ECC12p#iypxrsTDku-kZGtWGu z$Bi2o3II$vE;Inp!+>ph$BrFx_?sozMW05oF?vYX98qlk9f$uJ`+k01&D5XTpS^*1 zA6TkiSywE}K4gwghvHnRKd3+0eko1cB|2UR!LYohtlU?fD4dx~&L$gw-uR!4>x_hk zdQ^Ur-dIWU(6aadCoc}616|%|WdQzQz@Hx--X^u|#+k!)QC1tNZJAoC(=AAkI@9CjA~*vx~noS;xugAtjmXZ`y1r6wFWT8Mys zc&}V0Rh{?Weg2e%H2y%4f+Q`k=Jy8xq`u&;pz-Hx=u)z7HQqZKhvibV0^=);|4d04 zP*-P~XgjleioS1>od{5eRU|7e0f0H~i~@aNb{BnO%?OzcKp+wcq+oeY>I!Ix{=g?k zZ!smoa(&Oz2_ib$H9J+uhTx=ibXNOp;Tc%9dbN;mkP*Pe&*;x}#v$a06eE$}n9o!1 zj~_oi6aXenm{8>a;Kqp{8sYY<7iX8M8k+;g&5y<+hu_ux-&QmA2kOi1f7;vge`(ba zyXRj{*Po>{GEYX*$l9ay+q6L`S@{FT2dT?U?kk)IYbxxiu&BbPCS$=qnazZ4g;Kx) zF{+XYIHce|?OC9|fIpyy*@Q3D2?R6=f3Rb*UOR1w?vuex|e!R%DS6AZ8L{|a_3~7)3VeQhx8xCtII~{Gg3xFaH+BoVUZI{ zZW1S;3)U_n4mnhXQov;chs=llqYY!M$mqdMaubA$NvPsf)awnryj%bM#BTk^{hLK@ z9Q9yEU4u>Po8GcSr?75peVvt^qdOH92@)_NAwe34tm6^@SkH~5v6oNt(FFir5C2_J z0AMSU*9vnGo&K?=gh=+v89bv^GwJrD)yR?$<30|5bprssANkh@7}*enn0083YO=NXMnQcHxJ*WA6`9GUo)(S&d*3WDbL2y+h)%q0Ca`Z-kpux0hDZa?9N6gf1k3{x#Reg3#qSx=pmcvhT*gg~I z4gjS7WSTdajB{XCf^OL)6sR2H52hbh+Jnx27>!-(smhWo2u!#^Y#kw8oZB;1cmpb1 z3Y6^$kp3a^Ku-YL=P#={R*Ggu04x}JZf5e(hSM-)KLGB$aIFaw0GLQPu~I0?8A%d^ z%6=VC=QV5A$TlBe=YQ=?KiHhyKDSuE^VnMHhxmX0n!5Sj;eU47!1LbxE~9+X zkW>o7t!&qSi?W!Nz`|f<2^3&dK~n4mOfo`Jun0E}vaM3e>|-xK&RKO34d$`R^%sLvKhBY&OlkqAKZmy z0*H+8V1N_&)8Q>84^foy0+r7Qk_9QJe7CCdWd>;WLEO1=#S? z0Ku35$<1EQxX+*Zqf|AgXKS62(7;dc4K9UC=xP>OLOpfdxJz9I8;$auxs&ny<*}(fyxf-*iPrP zNh~W$shc!Q(7Ac}`pO|g^z<1s^okWL^o9)^MNkEVf;B|(SDg_p35K@M99Dg6e`QMg4m*bI0Y$LpvcP^Dwdg=K7dT6&?otcs- z^K^BN%s_c)Lk=!md@u|lc*<%oH#ndi=*9^UY~)eDqe_hO4;TbG|1=(1OJ;weQKLqs zv8DLKk625e2Vd7%GP7LNrQU2W9!EH+CFKrr~z5yzH6*XYt=G=0`qT*^mEGx zNwes;4=mLm9oXp6i|vfc4nbuy0-R3yhX=PvI*nez<7=ktJIrBQJ$aCxF{GOw(j{Az za}wj@$_)sy^&9GDi7j-Sw&^-MH&1u!+(mcm(NlNs+D&fs_BkDNdS;eRX_KZ~v`iMP zexoKPy{}vHJ<)eSJ25XUNe}3lsV5ESq?e5Cr?<`-rJr0kQ~&fkD}}`4ZzpyEQxmN0 z%dHOxs=DjE&H?y<>G=G6w}^E7shxB5i5rLOBiHtnTfe*jK*mVsNCtWP=o~$+V=J9v z4!=*?_ibeteFCU&EwM~xg8(U6=$0ASK0$9DktH-ua-&x=0GulzfDK1>>|gF%EJ473 zv($DEY1)|-n4oa-o)!9`)l>DV$yW+HQOC>_xsmI~)+;v{T!<$$Zlnt`QsigAiTIu6 z6D1fymP%(o+?kX^cG|-~Tfekws9XXSVfcO4c>k-{^%|XxC6Z&_Q z3}dmmhHEY`CM4}hScMYTc!#_G!S2I z{_<*mE(n(`vTlBD?=;CIo0Q=EKQ?|u+2yoG(R$beE8h?nxl4IXK^#KSiAAmK($F=f z=ekvOcXI$50XfFQ#Ym~P9sa5x8vEzx=2m7S5p^TPO<>pEXAbYZ%O~ku=8cvBf!x;m z8N>AUdBu9?qH*$fDDZH|4{x5UpSyLTe%++?@0#xcHMiWv5q^L8JosEdcEadGAIJas zmFNEb{!PQP1nlD@_QWCgc%|1e^zG+0+a;5-Ze+21Uzsq8>r2tfy)f2wc*ZV=itA7c(?w?EBEMsm_Jd_ z@b2*^Wdw{y{N39RuaUI=w|h6}-#@)ce|&Vi z1QotN-?_$m05^+s~=I0AO!@dl|4&zG_g09?>C52xok>-oVWt zP?p#;A(9VuVAV6o7}hJhqA5Wjwr(Ar(zL#wSd^^q8lS75m|j?|oCh~P@EOr`2GOEpY(^|m7wN#vhJS$S=mcu zx(XJ2E=ud6ET7S`d2i(FI9T>pggNz61badAWcwp-c&;=81zTC-wZ{+G72S z+olPpJh0P0AKfOs0b!o01xUh+&v%5n`%b8n01L%C+naCPI#u>JsP~`rRC~`C1P*z7 zB8YgR<9BWERM{gz%}3dT|3AuJ98Vdasm@mO4Um2pk)bjKoft$S-zXoCz~G!jVRL2V zgDR@E5gd zqU*$z>h^Q^4;i1R0x{1^!T@b7GJe?j8D%59Zf(i|(mr$scAJvGvI=#oGIY3XZ@}pg z@L+;DKe=hVKDBd}{@sJigm;crh-3;1t{>UznvphzEE*h|Jzzu7%c##97>XdkxP?x7q1$QJ$n zW2^L=x6csHz9SxOS7mSfQ0hP1viNQ^ho2HKvxLUmIfoyJZ{H|Aqk)ClP-jJ@6(}dN zO@bIqXc()zrZ&;jyQS!@BeV1)Q}XR?QAz2s^4x8jF@L7daBN|3*)T++>=(CB7vhnB zdw7K`sR#jyue1GCC^NYDvjeBN3rP3#dHVYR6Y5u?5yGX`* zuWlSG-F+eKoMF|TDysEy-giDrGP^w!I_Q-H(*+&M;rFfees27PvPe=6f3qk(pMgcd zNaGmkpxH(c2;BhLNsRXtQXrkpL;ZwzdmWh5Reyg;KWP?{6})L~ zIG~CM!6;xQ~ptUS2ao|9JfvxfPMC`sI$9`t9BGM7WYH;eB(MI8=yPf<9zCM#GF$ z`p@R3{rvcLxpfH~7L>F@G6Zh)lAVPeLchh=0cB>s&i4XbLvMobkA~tOp1483|JZ6l zIZ*gB)Z6!JQD=QFhRH``ve!3GV^D2@W;sIa1jiW)3o& zkfiCT=dxq}{PIDPt{-32TOYZ$htR22mVBiq-M`JZWki-9nb*Rm{3RQG)cdEErIE{1 zmQgCOz{HY`U#0AX;2q^D5jQqLAkPE=#7GzPNtHFx2PWqWnoQJTXLSlKlho8rx+4Q-6*cEG?Qo$UTtbiGzh?wvqOG# zj#qzPz;AU-FnAS;Pw%mKM`{8<}G_8pYL{-8#>SX-uWRG9e$qMg7n|seh=q? z-|y{g9P#G*K)9iNBQq;D8Cp@B#)9YfaraTqQSU#dY_qp8I*(Lf7n{K;KuN$B7-ORM zl_x`ngBxdGyk~kd!IIzMH3=(AKOT7XoB;di)B?R>XgfW=V=Kwb$k0^jTOZnP6nl0U zzfuJ$e_$72na0N`OaIKshzIH`TS4*lGj)DCf}ABt zzW-G=)n`J(xRxazn4f|TzQCelvBtX_U#;v)DJf}aVnCgmp3qQVnVqQT_e#}UN45_& z3Tu*q=wfz)!IS3j-+fiCC_A%}*(J3}*;Ltz31?%1$)J2FKANsSQ+A$zgYgk6;O7sl78;Ew#7S5( z0aA=Yku(YY-pHi0sU{%M%?7s0#dElYo^PL-)H=JWrKkTl_(Ed+_G_;?$9b;bmu{`5eydg zNfSA0I^Vm- zkC{EY60A{E=CDl(SgK2#CX)HYpWV&(-}b*#R)7;3E@a*S@dT-UU>B{?Bt%S-{Q{uH zYmDzPeoWaB76hfCfWW8=JUa-t&gQ^?cH{7HYjS&1FViU7Xad9bQQ0zC;Fe|oeeVpb zc4V`K&ic4TQq1WsurLSqi}cz_8Clnhh5r04~`Q{|SGlEEBEcHu*cM>Tb` zo3#HauXbna?$+XLQPNr3KTXf-(OOUF)JnuOIqcx_6QzN7&U)TY$^oRB0QjKsYn2`4 z1qVK`%fbi(t(6@g!a;DIveN?&15j4>*6A61q`XOj@|cQPLP}{8C;D}{E#pP+kb^fM ztGTJGTL_;a2XcxD4s_OMn)I7PO7;Mn4k#@;2un>S0ZAtFcCv~k{nF(2X0vXd`MNpg z>-l&5dwLVha0k95;Ne=r9$|Cl5D=XUu zWOu0X4$4ka0t@W2G^Piz(*R+GnTRx)p27E(4FrEtK5RinPN0C`l;#?@aVrxr7(-?x zG!T_!8jp0|QN&^1PF6vh&h5>*GmvJo4VsjUA1ReD!SFnIxEy4DGQL|&~Gw6 z&3G?m8JOyZ@%;=eu#3`YcCm(xk`X-vGz{2irZ_!GvzXZ(l8f39qB;CB5~S;m_X zfr;Pin1Dd-O&P%m5?M5YLvvG;bHK?enwbB`?ag8ndkqAU^Bj1f&jcm<7u4{-GJaB7 zdTk`NzN>6Kze?HNiBZOTDyy;AG+b|9V1Zq#7N;!E9k3D0E(8TcEC>qRt{gm8mDx+6 zu_gp2VetP{c8c*^We+_43l94&##b7jp=?TzJUi@4fue3;fz_bFR)k(1gqF<3uTZv` zh~ycV_~pt51`Z^_foa42${x~3l+7TXQg*&huK~m&83hNKn;Y^I0t(y*>^D51ETDhtjKwyCdREa^zI|LS3U^QT*;oQhH8386iZo;^Y zUIU0lG716(hn%26jZXRw-C+@ZKNP`psw3Satr@2&5T zS;?A7M((|5pMCb(6Q!;yhw+x=EdT((P>=^{0swG9|F$>CustOst$nZ$R5y784*-C) z{@(^?N|Hnd08jxGK$6-Yb5HY7GIf@g?gXUIdwjyVd3cZH^{}yzdO|}YBQg9?knsHo z)3#!I=rpWiOz`+*Q!3nCEp$aYF@l8 zP&l`#*iyc%`{MWSIo&~MD}m#pJ+VC3-7*sIT8jel0@OSc4v&iDh%>nSx5Fy>>JQ20 zJ{5(=de~B)>xLJ^OnF!6efuF+CF0fz!b5_p>ozLnrNg=BMv zzn*px1qIYqmt$OUdkj3YUQOE`UT*pSn-TU9oDy`<)T>p>G2lh*ni6t@WRGdaDm>ls z5KK}EZa~5x7vt?b#|e7_it{x_w=ET9`!841oxOsYDwm>2o$w@^h{ zpgd`|v`Dn8weeYC#-UMBA5UHTpN2zCX!g$k4h>%aB>eOD(`~qCqibns(V<8jPeE$@ zAvIYQhNWPOON5!~LyNG%uwJ6(wkCj&ZJaA!G4bIM7^xxSr7{jW97E?!C3%1^S<-WJD?O74&?<9{zPh;m<8n+nqTw}7! z6oeHZx`%^Ha|J-J<(d!Z>s78c>-ApjB3)JiBGqzMewycH-tNocw-see^my{jsBm~l z4p&Cd(Y@cCzm1L3FFM_(qIQm)f-X8I$X4KHXT#wU%14HHzDdR@-e-owBAe(fj`)R? zwC#{?nSyMx<@(WPUf?1V;vElSUZF+829!pue1ot{6%3IT!k- zWTu=dTToU}&pynVMGNAu2O$@@&?BQ13*BO{hJ(d}LW+4Rr#vGup@oDcSs1RBQm1ti zm_7v#qEc?jHj%OOM}uQPQu4~J6O7kqro)tBLAq37->ujp!BYNJEI=Kt+g4e`Z*%4L zC!*n6lnKdNZ>{5+ZY%4$W92G)6AaR5n?>-PYHV;dt8x)DF!B zCJ*gDk{DKQ8JDI$&xZ(m|7Iu&6ntHD=hy;?@4 zyTXje?`e;%+wU`Bw}&gC-(4zM_s@G}k#0My^>Q1P^&)SXxEfY^3`fx>WQRdlxJN2$ zp=+6F+KDKFO&~%*A$aR2)w{CZA|| zFw-#?iuo^-(xA%b;!dzbh%@aU6safwb|ARv32Z%JI=u z*X7NY2B$Z~JDKTO)Csre;opcBMpD>`uBawGNlJkH~d1ZVtoChpro!&Lft4C>*ABpvg^a3a0-S3&Nb{b5vW=9$B-l`UTC ziQh@+=I76K-dB^;-kaC)-e-%>e$ac&+wT^&WK!}pC&)`I_6+996E<${srpQxxZK)i z1v71-y!mJtF6qmOF1sKH+1Ju0LBO_&}1s)m88ui|8{YpewXlJXIu&VHjsbX0O;^-P0)J+2SQ9w zW3R|e)Z>{NK8hGr{{87y<5@rZM~ywB!jLjT=H-kl7+_@Qqq`~8-n_|R_8}*=bZVE2 z{KSc2w#b{Fuf|4;nGU$#Kjo1F7Q^}YF+1y;SPvV>yKrRVjQzLr&R2cm?x>gIqho7{1wig_Qr&vlJ>lBF!lqv`A5xlUve{ z3I&^3xq^6SbAU=iDIz}WU4%8BRUGt}gt|~ERq~nH)8BhACr+$|nU|DEx0kM6x0Nbk zw~g*R+{NonGR6+ov{+eM-ez$l`C4!Ml!Ly`YnvrEDUdpM5S5dcfGgVe;Y3S&mk&rL z`2nLHM-&)XuUS|#<)E!{K&*PUy-`Q8xmA~!T%0w*oQ!mx!3HGPr3dTR1rGQFrhI+* zPl4v@9BhgIl4@Z|te)fI&MUJTS!5BFsW>%WK|H1cDI`Uf{>e9=JAPTbs!~9C5ZuOH zw{h+LENGt^KUrt@K4bLLW=p)`OCd_bCtb#Fo3^Je2U*5$N&LYsL$YC9u9lIBZBGZy zsUOw4)T-n-Dmzj_l4gKIhpr#I^G?Besip{Sy6W<;HHM8fWO802l}^%rw~4y9k6`i^ zf3FO(lhQ$>b>dCZN<8!510vOtkJ){8!r4y7eUT#su(75hISaXc=mf{f@kJBKH{5}$ zc}=U8c;9;Gy;`L{?`XPGkT%>35J#Ax2qCibB(a3IaMDwAqmDDaCqD3O5i+cH|K#V~ zEqwcIWyFez5A7Tf0r0(Cp0i(iEq|-?PGDN?uhMWiD=N-8LYK@aTY48h_K?P9^K&{* z8KHtf;}-ShZ_GSizkKMH0(Bcy_|{otVftuk#gzM7T#wFluoc8&lXJ_4T`R${q=nGf zCqfM`0R(Pmg|fBMdbKuExHvKvzH30e(Z2r zHb$*iD8u5#S;0@1Qb-C*m<^)?%x-EMjq+%)fVabReP)*{|la`6sK>jV+MVMWIzhWF>p)z zars!75$IP0Sp86dCFrW;R(@rm8BnbtJk3f?I0tEkN$EGFbyE&nS_&1bi=c#LgMP5Y zmZ0LE?TeTLE+zVeDk{SR<5r? zz!yA7&lzuf5yO%s+5*VqGNam-V;$-Tb;~jB>!uXZi5F@>^Ip}uqb3AJU44*)U| zdm@IILRl(WL4AWr29^r4afQ@i;P+>QUo)z4Rjc4UQhQ?i8&sFGO)Zf%7Z2fT*?=H< z@SFAhCy^mI0L~ZjkkKc1p@dI8*-Qb5E$FS96Osi*rdJ~>1n|ynQ~~H@#_yr#HGK&t zcvD~9s>lS0$Grn51%ozwKS&y!)C{nnfys}VO%UTgU}4Y?ei!0OkUZj0mqmfi&umCx z5f=8JB~hwJopAo(33*R5)g&H|VRg-%t)HZ|KB{B7+-+zPZRzr@QR!Mu!v@+)n~O3+ zNMTd2M0#BSS5!E1nh*poBkJTeV3)X6~lXEh!D%Qs>`0-|VNd%C^k8 zk6&O;qb3S9G~tBm@Ov2%+E9lV?hso_3e%(K_P>HD}I@7 zy<+yEJ|DtR4mAW6p1}>jkElpMlo5s#ree8y*sCTkxLg#x{ zGdpa=;Mu?$@AD=nON`_sj8!(iH7-?WyfpnwK{{2{mJ`{wn5fXj>$1R;FdS8hGD4`I z9R#pd^nt4cU9pkWJX^2~Eg}jbGq-k**OwCoNF1q&BkS|`TGcV~J;jgkvJ)Q|xqGTJ zZM{7H<{z39nZv*_N;bfPEedv?zs)=Aw z=QJGXLdVCL{ER$h7&X?lUK@uO>Le_G=wteNoPgG%sT(YD^AF9(=odSQzlG37T&h@J zye;A$7xR%HQrpV~u0%@fpGRc&H=BvH^@y2${veAbFo_u85%-O-BhY$d+H9QYD$WDG zvpj;9o3G)TH#tlEWvw=%#@?^3!h+G;#e7DhE$zGL6%;_jh@BSZhU}kkYFjDTkhJRM zQVv=2wCs>t4MVu^r(~T@`URpK!!)| zagb`I>R>+6+GFP^H>J+hxK!VTMTak^vRzgmXhsM82ZfqUa6VX2#v7ZC;FXFSv*FG5 z^orI%k0|+dhnBdx?PJo+b^ldMk))c-3+r{X@Xjb*k{SbyDtiMaLOvc1HV*`4Y$zh| zsb$hjbk3dV{zE#cUDy&_koYl&0rL95G;0AuJ}|3y{YOz&ul_5fc5G#fy%BCgU#v${o2><@~E@TCfjd&xHs>C+nn_1g9k4(u5}jvkAzic zucZ$;v3H!6gzs_gUzQRlxzbp?lx_$&8!OJqUXy1eQ3f9!)NFnf zu3cGy4A#uBMz!~YBL{x_)jOxfwIL)lV(Mw^BtldDH9c6_aqJ5eaS7ovoUI^xRp2MG z22yr3Tl8lX;-SFKaIw9Q2iMMQ@r_>Jqh#s4KM65Te>qW-MWVaD&-JYnMT(O#kU>n! z3aT-5+F0Z(Edb*FD@~;ow0jF0-{c|CIV+l>gDx}MyznsR`~KHTlwj>E#k*7{A8`8N7OZ_6x=omTpM^L(&L`GmHm+N+)8v2K{LSdWW$E@u-Aba&#bmuu@?9R)G*b$EJ0f|@m|(PH zdNYXi-4RxU2I~>PQKzXVXL+#)aPS0Wjzt*V!~%ZEO0*%oadLfXt+L6PcmjqWBq@V7 zh>XhoRx>8?UH1TP`a(rKu^!f_-a3k=WbdzM(C2FNl4}j-AzAUSc7Yyf8Xt!LAb8F8 zzGY&?*5#6CQu3ooSN|9RPsa;eL|>9ecS1bjFov$rmU$_n%-5IfSUT#`gY`Rbi6;>- zOf@Lrg~#uL#7w!k7dV91G}TUrubW6i3k&ueKhBFJ9@7U5bdD*c5N zP-Z*jF{!d?&D(a3$5@yQG};Cp9-u>TK!t&H?u)yE0Gcwbd>~Wf z2NfDswl(0`BRv_2FeT+}A4^EFsa(8=AQY53z`A{?{T3MvU*JMSMmk&8hH09nP}>~p z9Q-RtSOouFgDHGvEV@&p2%sz)tnKy(5Qv1M-6 zpV(nhA$g9jaT@6HWlrj@;fZRQ{Wpl#4#?0CjvKGc*9#2M#4csb)eH)OsgWi9QgliL z01Hz8d!nCe*K3gN(Go!(H5de+pI580qNiArlpNi4P<(@nV z9CA8Y7)s>!SO`{{m89chf>06J5X#T?R%t6^0_YaJCBC4k@PxV)#M*z;^`g%Z#6aM? zvv~34YE&-Ho^lj?L)G#sSKOv^rs%CsD$uC>5Fu|$ZYMdbxR&pxy{wF)CRA0ZYM1do zCs|A~)h7mw{{u(GQ=g0y7Jl$(Q_2Lrp))9D#I)Si75HMURYOlyY49^ePQF1)Uju55Oh^-!SsgvZ6B1 zj5X#pEBOJ-s(}l6^5unkEE|MvjWGxh{-Aebh#No#U@Os@ zKLxbikJ*}jNVA5E8CGD%2(9kqA(ErqxqHzEvT@-7k|?ykQT}| zURv|=M6F#q<0n$L)dr(=N-NzJk`sY>n>QFtNSmNkv6{HNrQ$}_o9|a2HjDupyh;37 z0BMH?@b_Wqqx~F2LiK7xVQMr&bz!ogb%tNz-`(KVjdFdQokX-_1taMLodql2G$Ouy z9nEJ$`goWz=T%jb(x-De#DS42`()bJ{n3hzmL(D40&ijxk&S#-in_C3a@GEqlH@l5 z<+^fGJ!H!Qj#E?^qRAH`BDlwc4{-?woD4#J#r(YLMSE*Wc#ePNyft5JyB|J#W;gmq zWogCpqw(x`O;|^hB!|c-x8DQ8m8$6;{CxV}{L1Ku_xiXw^KjJ05qbZ>3J~iTVo~6S zytByP=?Tu&k)^^q6C+V8Zt%+Y@F_N?A@1+GeP7?!q$x8vX6CPySIWMw+Y;7F;HU^~ z^RHrk8RO#8UhY5V=bvVt6R~K-!nnp{5UM5nSLh?*UhIKVx~L$6q0eSC7G>66IZM~M zAZFS=OseUL^W&X7ucnWd8R57~dTllnCA|D#QRfBtc*U_V&U@!`UE|bQUZ=SfDlLV% zswn--CSQO2Jf1r{(;xeIEQErsNAjJLco~a|6ma+Yo}@3%QM<(?=SPE;FrWIoKztnT z^Z>Tj0~lZ}oOq^kyw-o~xU1`->yEi&^lFgAEGdoAxivuW``f~*~=Hi%ByI*~Ec_qS!MHtHuJvokp_;m$}`{Qd(b#>%6 zaLP;YwIu=<_2XUGWzoMW^;gQXIKqPUYb!9RvPwIqjIUWT-Y<9&TGBz>t4ZqB@)ndvodrOUs^eX$ zRi zi9nD{=#^g4cH|4C+bEoiBXhT%r9gk|-)2LKhMHX^Akl~H@p6zxtu>r@)s)umuV7S9 z?*xW5KsflC;^M{~eciTn9nN$11r&-P7!(`Jt+=pJ>)>Uh3~Nr5{wCd`T=K9W1G?*2 z%dsm->TtCh(fXyL7h{yE%pC$tMkz0!TBfwQNL!a*E)W%l z<@W4~sD-dpq{p4V~8G2yHXPZ&z`e?GFri~Rt1a{dR2oAi0-owVx3V-R!ie4IjF&DN! z8}QCjFEiW4?vments7fi3)>>{V4~jzjN5gPqY?#r<1(>0TBh?4(*Eo&q8NE0>yP`q z`HKwvT@1F8?Q02TG7~>j{+}1%oOAjU3d;W|$d~}xS*O?>P9%#NGrikOy{fv$)fq*k(}|Ycjr$1<@TyL4r)@qysv4`f#_Lf93k8LDk^!d__gyj= zmd+3#vVQ)RYuAIKJJ|`_;{4BpI=sdH4vkwMx~VvlI z!322Ek&f6M{itrcsRH4nJTWCIw>iN@Y#i^FjLT^wR_wo!0f;f(CIsJBSQ^O5aKZEw zlECamn~&XJpbs!MF8>`!dWMDUTYdNu z4|(7p36-~CMkfaBS@H%Gb3fX(zTMxz|E=-)Z3adEV!Q(wAR@LcM)uq-pMy|B(_OvGjsYyzf^RQAFl$_rdeK3S%2dd5`>2 zi6rjBV#-cyR2#FvTq*x%_+a_{o?C+ABNLZmO6kJ?xxD-0%K4b-}T z#9UcsZR|e2I*XZ?FsQN{;GgIb(IAX%r7;y)Yq25atxvxTUj$d9jV%b!r3>-v`>3Cj z$`^6u1~^6Y_P@JHJ3uC}ok6dP4>AlV$MAQZt(R0eZ;><^nrS?Ro}U{!?fV-LB^in#8|N$8-( zaTbQXvy>Gri3mQ6kg)xV{3>eyH;6}(5Ai|20j5U_7|k;CH;0*fyABMxFuka0oau!p z1t0C)Ua|Xw8DI0jypwL*tVr(3Z;Kp~DyVMl+*Y}EG9^iwx7GXs)igQ%$J$My+)hrY zh?oWB9%y~``@k+QZ^kc~+)&_Do|V)x$OEf+Vv{RbX=74vo}A7qV-?eivh-1)(32r zm;ABN$f=|OzE)N_8-i?fj`m=yR=O^4$2Q^glqdey;--^TnC^R=OmrUzeC51HWQkzg zy&W^~?iPqW@&?SQ6RVi!&QIY9+Y3eF#=?SUt1Ixg)#^SuxhFAaBg6+jV`9b56kZMx zAfRGlFG_XYz0sj!af&w0i@E=9TneUDOG?$|qi#DxX{x}y7m0_}5MqqjK>V9> z)qY(LyQlU_n~duZw)GU7x)ao23PYz|c6fgh^yn2iUHm1)ba7Gpr=>4f_L47_wVf?j zrE|n)`D#o1IllfO7`IVP7AM()>)AFKY&L4YE+n85vs%m*8W)3~ATSKUKR<6~)<1A}3;qGIyCRNcS@=-WS6}w03 zT6`{_L{GrBcGoPf`UdZzIZlb|9y>oP6M={cnYd)S)oSe_vcoDVYKH$Qk^~_}YXCJ7 zHJ7KPl<3)3Q6d1+pKkcts~G#rj+@l1-AhOFCyqz>NQmWNHa3~-v6K9t*zd_7+(h`7 zkYvx=>J#Yo4_i<#z%MO0QgeKe7R~N^V3KOCE?`eiZ$c zv5T(54w&sAkwD&dX&q;>T5U(0FArzBkRpiBn3DGbgs%V4Ey0Y@|NS*x93{v#b@_Wk zGnCNEXEXEG8z%32-2q_Dn3p2V&k5V0HX)U3ER-qaXoqouK1}oSZRS|361a^r*LQhQ zk>Z5nB2-P+h*XtUeDs(h=)pJHjcmabaEV*?miPG3CP~F$l{i+6WSms?!l!>a#4uH= zU*u_!hbGj_azp!^VUChi@1PvCgUxSAlCI?T%R>v$@4>ER83RowZ;Eatho-UR4upT|17Q))F;nYt*>d-^MM{ei|(-b1TF}60njB%;cBlkaG*0^H`BdXoIJqZ36Lu3 zwWS~DI&rmjVKMoo2k6oknah6CxzpK#s#Gl97mtU+uS;o`!fA@kWhGwCK2^Cq#4~Zw z_4Q_y_SqSx-uH#E_F7SoYKQu2Ns62)m+w?daSXg%Mr3tb4U8FDCHfC$E>@Ny7>Q!6 zU6R-EP$r;ZW+DSa&jn@xnTeNkW)QyQW4u5C*)4zj`e{jcckch*dwzoio)DLZS(KldQkMl>;?uHLqe*U^*>!n~XFm77v#2dvA+#yYs zQ&zg4=dsqPeG9<`R)llu5I7WIe3DK&bCSrv4E8|q(XZkU7Ji;9S;-ahoLJHOm>0?G zbB2L(Emgy;+g-gGe9~D4^t7Djq~xX2{Z6%mCb^ zq8Gp@ffHrNmbUA#f!Nv))+VgtLP1S4Xm|g~6P#bs`kddik(Eq-(cS&aYv}~RGfh_5 z03i+vYy7XnIJ-k-WGtL1Bh0bK`y#e@DtUVOK5HFE-()2Z`>IFqaK{dSmxy*DA+xZkjWHTa^|w5)$Yr*oJLF zuB{c;a#TFsVMkRAqg5#0eV;mmbSdQc%Gub2%{VA<#+-LYg5X?uY*<4WP}KWsT5 zelQ!yZPJ&`(*Q;an-9r{I1n}TSOwXrY&f!f6E&VN`w#)apr0^8BYKGfo!aA5F{$9B zDaO$8R)xvqRU%gEXr;e;N3=Z7FRpN&jUq;W39=mNFt)TRp|myNb@Mg^41-(hvlO!M;$3aulg`P;iG&AT0w88i_dMhW&!${2%DJWjbv@*pmA#f@DwBt^Zec~i zI*Fi)?gix`?-D0V3aQs^jq*HL6U)%)mG=~ykF+oN$i;iM{Fs*db}a9Rx|$~svRkd} zf>1wfkZ4eotQ>zi-{OkF2OO<2lG*KVytBweZ^3qMKqM4I@Wupi2(Ah`M%mK4-~A&6 zsGOojtjL`oM}3I}Mu)$eIyRqY8;2UByXsUX7J7X?zT^GG=vntcjeOR4f*;-0@KtK^vrXyY3mvh+x_RED)uIo2^UELPIuYYLZyf zYsW^flMpkP_#;iK${MHl$}7c_E-gV zx4$d5x0YjcI|e^_C^_;!%@FY6BgvL&P`9#y(ot*f-$CJVh~%;;0l_~81?3V|QPig; z(Bfi?*%{Foh)DMGG1~Gat;DrGBVRvDyo&JFt&k;q?$n=D zC7~$vlb;E22#rjj?LRer{9!eCItg*6gk=;x|01 zJe+1G#Imp@SQx5WdhB_6IxmnNQGM*$>W{SQ(OSPg7{%M{XCPoyQlB#$BfgDp?pP$V9J3(*sQh}aDp2TA)P zoO4ZV1W!%lhb}RV6e_VQ_>rZeeIizxnVqml|JwgGfIH<2q%cF3v+mQBvNTmMT9H&3 zE_mOq8P~$Cc+MK>96b(RISPb1^^N~#ZOF;$)eqx&d+D-XXAEB)gX3UZqR7FP31y3d zh9lvWD?2^(cOmn7gP}|gy@Lpyi&i(EW;SwmxALUpkbnsB86}(H_Mulw0zv!HwwD5^ zSY1L;?x#LiOisjs{11EN5bijhX@l_?&{SZSKjeUNea*D^303&lI^5nqcH4bcXa!rO zG?mfNQS&F4OhLFrt0^a)Mdu(*^H1z(rPfH-`CHua)|iS>6far3pGL71Bi$Jxon3ve z4@OPfu08Ukg#NtY{rJxy|L*cva8i~y0RR1ry**+vG4 zFVL57&JD)GB-?3KIafdgB~hR^8}`K@Mq(d4Je&SPk20_l-}J@nfo+IF5-D!HS9TMK zIP|Ym>vg@!tcGtcj(~WH3rJI4umO4#03`uONpj4RV25bn5^WWJ<$&4H%sl+&8u+_v zj5E^jTfeAYodftE4%K(V8r|mzUhfL`w79#3WE)WKaL{&{r*=1((US6*FBxSadV(mk zLc4%#kFWc-Zmt|F3E_cjh9}aamfKc0EoDeGvnM5If?!} zTO$yeW6Lz8#9!S>gg+TVbH{z>@*wP;g^1(di}H!}-j;Hyct6L3RU^*_JrH-v59yKD ziK2}eeS5&fH>(h_ZRoS#<)rTW*#(k4KX%^a3JgtwlE$u;4q=8c2j2GnMLZq1=0@$% zoG1t($dPD&5U|D(GFsOgk?MLk4u~!(KjV z2y59&)G^mD>)zBXBIUt>hOhV_-0L6KJ>l zJl)ZKw8|C-8e-AzLZS)2YWkTf(-+;I61%J(DsRe`Q=jiCY4nRHILP6J`r|0Z? zhVO#B9}Tb+rL7Tb05;x$mBWzUc-zU zSs#pPeQE;0SJQiFdIk+kAN)*}ldE#zLX8ZAT~3|Jq?6?Lp9 zJI8f2#-b1IXkWjH{Y(h9Dr}i3ut^UT5A|33VxL12h;L$^_)t)Z^VxcXfK5}ejJ%V$ zYJdpPaN*KN5S( zt2{MVcFmsr$y8i);h*7&Vza7Dl|`>QlZfW2K2ZE4#hX}t@lZU#l59y_((uaf3yFhI zg~rlHzw#Nv-3ITM>olkNs|^$mG~<(jZ(eAz6)$MH8dYV#*9@Vq-lY8s13Cat3~_mN zw7Oz^btcxM_s93V0k8aH=J8Ov6Tno`Vo-lA6x4xJrG(wH3G(YE__~3lTd>kyT5lR zSYnH&s;70)(JpgZ#f{szAVlpLXbw3mSzjMX26>A#`e@}D37UiyEx<^&5;E`dCsc2S zt7e!n)&WYAedVfBtpuSWmW+Gbru*)0QkL}G(m?6DW?r3v)L{1vg;-cDdX`dfi2nQZ zf-=q8j_lxtm2si+{pgT=5|1a2qL7O%myN>OXb^_~$<7hVc--J69^}GedXH6rYOy<% z=VT=qRx(+uIw05Z+K`Zeh65HFy5w{r}JdsgdjG9CRH)*^KUpNdCn%{=?+{MJQIoYbC{UE5H@@t_)d%wQB4qw8}+MnMKv`= zSh~MyJ!Je-SfLs0<&NLsWv|1YB7irkorE7#nBuZFo?~hh?yiq_bkQVEsX&MWG?nH>Vp)$& zLkL!JN_FPDEbwrVKi(wLkoK?IA!QEvUFS2xdvweRfIczd;J;$dDMCKv8p zwneE*r60A~j35pvd3B1S$*a2MgxK!g7h-bKscJT%GCaB-`l3#M5NSJNK$qO@WNa;y zC?dLa2{Wd-tQ#Prn&G@}S{McXZIq<+ec?x2&L%NBr!Sv=s9^^lqBf{O#_(C`fN#KN0fkKQ#+wqZGwd4c|Y6prCowQo^TNx6D^EN4BZ!g0F{ge7sF%V zNzy86{;j$)NkghJzKEKmf@iP=QmwkQsCY{kXa#22oyU2C*#I5aK0*r8Z;J|Dc%uQ2 z5O;i623L+=ZYq!F4P}_mz`Q<<^z*|g|7|XHZK}IP@;BteTvrvR3R?T00-U?{o(NhH zarv;4bS~81JeazoP^KZbU{pjhODO7zBj)Bn`d3?en`_vf)jPnOu-v1I!P6<4B5kqr zclFEH=PBDotL?ix@rc||!G3U=v;eu|0jbukq;-*X3Dul#Oe4fiD}nL*^gEMs`)lJ% zfAwq&IV59HYRYu-Xh58(nW&FqoY;sB`5~sna?|F5$wB4IfyhCJ^6FfEN10H3aMW!n zLeBb_9ACp*zVPt!G4U9OIK`+)a;d)7E5cR zQmdVT5Ry#NKF)=&GJ1BAxO0y!&fOGw**426M+IG<4b!2x+3Qok1sfwaI}0*4TN~Op z1KcT>#9|(+ew%o6zeP+lUIvtodtw|6I;( zG~VNUJuAII!ss=I}>M&Xl@f?Rm?@feVv-z*qSCIn+rln;RcsjkCJ3T zMDJs1Ab~UAdv9N~P*zYfFx#;5!Lb3?HHB3Pd1A^pe{2TNu%^L}gC24#lwSojU#HGR zKdzaBk>#op3R@beeG|eoL_y^J*QX&u!5i`Bl+f3|U_cUHWTKsak6wJ%K=`nhH}3F0pfg%x?yXjs54j3ewOm=+nRAfw48TE*+?3 z3H>?aj1J=}x6K58{3&XyFkG@!nZk!Gn9CjVD*K-M*V89Jg3Y_^?_h{%d z;TN=Ga z{L%%g-}M`*Odn)Q*@TemP)0&sGfr)uo`3&dJG}X`d|2`|d((}=nAP)6s@z)PIX_?S zV08Nr$+z_0+YQ&J)bTb@DYqF%Os=OxYW&YThC7y#?=^rsf7Y=sD4K1@0dwPG+EZST z-8Vs0hE?i9BMC7^SnmGAImMu_VJGryo&2*Kt{gBlYhOfoUA;V+zsZC8(G4CwR*E(l z&%EIps5LDaO=UCLyQlooSayPVF=z&XjLYf7(~)2wnf3-zA!xT;0gX~T&Nx;A2U)v2m zey!ziHuU!fT#elxw12hS?sRGVJA77N)$2EcTVK9<_uKgRn&aB@uR!16_P0+9Qcn=C ztFvmo8C{e=DetsSn=@1z)J%9G;?&c@cf)fVebzxlv%QXVTw!F4NxV3o7CfP;9(QxT z+VQ(~L?&BU#VTd)uRmYh#fqHmA_Mj&txVFP%{i2Lf!_iyziYUk7N0E;CbZ5N3vY@0 zJb<2_-=&aLlLaqp<+73z^-t(6*U zFgc%+{8V~!mNZxdK_K>r0gn~86U{K zGn~N&9R3KL(mZ(F!Im&bG9XOl z;*L$AZtE2d+I16U%QDAnb)4eg8DS_~`n7wQC`H$GG|li=nkK=0S$39iEit&O{*Jz= zyR1ta4>a?2$8~s;mIzZBLly#1EoI|n z^Ze*Y0y0*KOUvCrE-={2h4ZWC}UbUahH1^>$27BBe-7p?Ki8G$R4t-%9{e#|o z$Nsx~I?BpaptOhNj7B8rXtmC`xCi6IGZ#K?*41Ysn{iz=^PTs?126ZuO?gq4lZ;BT zJSGW$TAhBa2-HbvkgdT#T^XtBqC^xw-E7*eZg2Rt{msi=KIhM^KDayao1QeSrH=-Y$NM4D6KLRQXhZ-K_>A9k)=a$l7 zWQqopwR#m~G2VHJ#8wYInqDCDr2!9CZoS^Y-i)d6{(k`DKpekHILH0Y@yBVZi+h-H zpHk6G_q-B#fh3|y%<9y>Eo&&en`wNrZ#f8n;TQ@GW z@7{Tu8nHiazr=pF_bU6e#Gm;kzP{(b$|QKBiGt*9=+CnDX;nYeOIYt z`2FS!)zR?2Z_4|>BFBLvdP1_0hfhC7k8{U~luR75XiFYwqJ7Uj7lKLtCOUVT(Uf8+ z&(NfPaOoiX_}N1>LZ`I#!j)6)%d2MESFf3EU%zgi{n?Et*|%qY7uKiR$9ezxaI`^9}L?HBj2lJi?>KiRWfuOsL9yY=UaLpW1k z;#c}-LoDq^G9IF|~{ipV~drt0acgpd)QdxH`9mUIJDd(F; zhY)uFKs5*90WRu3IuxxZ~~zmlm^Kw>PMKwgR+_08(iO{VPN}pau(b@ z4W~hEYug#!8*42OBmpHDKHPX}S<((5s%xSccZ~dnLmgshkvu5u>OFI?Yy95jA)h7j zFhmh=)Xe4I)S363+{Zq&bcmKPo)d%f%IaBS;1*~U`|G>UR3r7_mJ2mn|8(z__R9xX ztMUHk5vN~2l9wYmm{W+1f6@W)Jzo1WaRMLjzCw)TrTV_V#YoC=ynFj;8eyw5km&nK zvVyaQYH5bvghLZ$yGY)bhBl-OsQE^%D8><^N#EgNIrqoUK2Dv>GnYAIkK_C4_4Bp7 zMQQ6jG0?vhBme8W&#>=HME{%h%QT|@K#V=d_y;lg81+Ai^ZHn_9*q2Fa;?6&f2IBM zfz|e_2d`GA`K5gQ;(?WV9XUs?DVY?n!E2Er@cO@6dqzsB?5&#?+MnHUl9tO}TQk?b zyn3dVlqe-}+>goe8}2Q4Oaz;!*T`)A%f1V@Z$$5{RKI zwwI0T+)(+0E*+k!&DYKT+1NTONi|;D4j@7sk&!Taz|6qh-i^hX)k-*lSUCu=3BVJa z02BV85h0Q*U+h-$2ovZXF#bS2nVf|%ih-(xH>Rn?LX^ddop-4vk-yR+&)PTLE6E!x zj^Noa-7oj>vjp5^l!i#1d3e^BAgUwb06ZFn@9mZdk}|_HmrhXQ@+&cLly@+`lxZ+h z7&8nOhWT?bXkR?AN)2^E^$V{D{JFd~??EQ;*?m{)`||!o(v*%cvL9@^K+7m^iE)1M zs%h%D=vB~&CDL_Bo4g!Ajx&m442hJfvHxJ%aQm#B`^&3lsdJ%EL8jv(_+(k@Y8fGPN;|bo8r-CAnBjQbx6XFW;{?XP z1dmlwEtEVY>ffRD?fz;2sXPDl`V%GcJWFf#7~`*eq|R3&R~Nl{L!E~~OQ*)2LiFBI zw(!-%SKH6!cRt>=+OOedAZ;?g zuwttHnVkE(cP!P2{*Pi{G0dFzw~r<>lf<>q>yf-BiEHDd`~5k!6wU4Ya=ljcKDo0c zlw=#gM*BUMTOEZn1_>q^Y3Wf z4p27vz|+rC2iP}l`HV7(*X=DSCXlmpk8Q1yf3)GKI62dcV*GjF62w|DB+|BGKGrDW zC-T$uTMXjvllv;F=cx-vYpLUn>*m>C+;*zg+qJ$g#!rn-qNI~Fc#(n2)2O9Q^D>Or zBpd+8qrC!&pmA2z+bNe&s-ZOU!ip)1u6c~o(5d|$ibf2+_BNIb(mFaQqgPhXOl@jQ zL{0f7QR3qLA_wqDYAI`fjv&8IAob@5G5(LFmdYXr!1wrjj+g9!20EpqU)-@o%SEqW zJ6E$KpthVdjbxkw_klw_CFd)O;s~Oi7w}ZT50rXPaQ%AE`R8&=njFABuvb0ybd2mV*5@iOnvnDye*%q^M>$A2glbn( zs*8+_#Qp;aA7LTbVBG$XI;CMa4+o(MOfv;O?$yR^>0-Hr(m2DJ17`<(J7YUHuooTI zTBmQqVm-gd!h|oB&MZs;>wl?n z6c33FK}`A9t5(5wYEn&Mlr)(b-XO||>WU7BpFal>-4y#!9K^@=Q%3o7(GuhnXI+v; zKdw=ulPHgen`zXCPamSC00y@h%p&@w!I&_DQE9{1`AgfV6~+NjqQQ{!Ga9v=Bd8rB zV4ML%X<+g{+H#R*4X&?{TGC0BxQac(Pm|^@mHB=_RJ!7OG|)L`%0u)^xCay~mwF^I>=qpt&w2v#o9eitdp}OIv7rFZY}^6F%R$T( z;RI&&Y;1eAsG*b=Cbb^`l{6)5Xz9rU=wpV4a6SaIPb=eg(U#Nm?L@aIX^Rlpk|&@=6WD9_}|m>Ptm+fM4$RH8Q0+tTQAnZ zH0}px41TceIE4Xo??mv~(zv(x?*M$if`Cs9|F(IKdV^BdRwy%|%b4wEA2w3Dp#AI;1|!x7}Zxj8->ex&>0#DRB$6ah67AzQw;20x!hFkTXgqjnD4JtJLpWaoewGz%w;Q)H2*l5K5J-_`DThdAZMo=86z;ipiXYRT z*(qNOvNh88k;H}sze`uWF-UzMiUxqrA7y{+xm!?(%_x~XeaTq;J_AQTJa?qtcyPf$ z;uZ1HtWR?ztuV$vI!FG^gTr7H+%%wkK*xY`A^O8OMyQrUsll6egXbMUDw=7{_pZ#9 zuIrI-hW`B=e|1q({?u;_tDmi6#ziC3%vJ@>rQlY5$8pNg58rrQ$8I) zL?Vge04M{oNNQ-ix;C?Jm1q+nU=~uU?4F65TJ0+3 zwBtU%cM~=KEMcJrs7oR8S@xmijf%aqW8zn8m9EcP!j)CZjfKxzQp6eFSLK$ zafuEBeYE{z`_VS^BKzUi3+)FR&eaLow{KbGAa#-%JaVSzqmgW&C@E%941cn`<;p%_ z-r?I%7=Jl-YQPa)L+Kl#pofGe2L0A(4+QuqsIYf#J5>zk6m1UgI-2`RGBWq%Mt)Gp!PBL3R8^Mf-ACRN*4PVns zD;X3Vt2|2ZJdwd~@#U`kIDlxr2nN&ZJ*~^E?u~ViK#fY}q7|6vUqxRMJzum#>6q0+ zUn1lW6whOgTf)p#onsJ`lnT7Jgq6V*DtbtLa)bseVVOr8* zFox9e?VA@VE%9&eU8Vyx++>Ock4EzMu5e@dP!Q}{uA}%g&pz0Ao^sN>bL%OIsmmXF z8UkwWpeahCei}zH@qb{R4@g$S1SmW{WHBF!L;F;Yorv$71WfV}Fg`&`UB8SufUo>e zolaJ7I$xc@E30Pdpdf>DKt-blZCYt0q9H~3H_r}bSV}qEyYL|q$^U8R<%-yf?%@dC zlv^VQfHR2rq=Ad19L|ViJd*TrEV0f zU$sJRL=c3PHyT$4YGB-aQ$Pg8B#!(!)400X=V1Mzd8i4^L*r_8R*xpSTxGN849^dB za{}Qr&6Rwh^Mz9P<<&E^#Pb^+e7eYSyLf&X&?0cSe13nDza>>2UrWT*qFgY$F1LS> zn+ragSJ%wZ6qB;j4o^r{5)L3jCz0XM{L&#O#krrZ#|9GS%h&^dWS2jJ?xVSpQ*y8K zJaF$&av^f2|3#MTwra(YG-r}CW+t#s52ei;FS#;o8x{@zU@hn#gfg+fa&tsDE zy?EtR`|cg5YKiC5Jr4h!#7QTcf(O(1sJ@FduF=eag(ftsZ~(y5O3DFn!*24?6V%NZ zf3liCY`sKp{)on*)D2D0Ltdl%JDP#uIU#a>?V7o|2LYHU&y>KD@7o{Kg!>4s? zY%d_Pf{2dbwZJ==UGhneK!ufRXReIwm9-c$Mzyv+C zHQ@jvP9u3vn3g7+1X=T>1~~oop3?<9%$XGN{!Y%~IFEgqna?_?h@Z+eNugs?aOf>RJd$7k2q zIi=YCZ+OdoV;q~oO5+yF*D57jdq@g(vH7C+8)y9SnEz&p1f?Gx_!`vGUOl>?C5-QVaszFO zqN6nNlH{e)@S1aUJ?%qF2Wgs4x=v|}WBcmCl4I=*diZH{?@$^AbwinxAO~;(Mlu=} zOIH~vf@TxAf#oM~`}wVlwagkdeT!Vaj0JKL4L4;W&_d9Iu-BUT0hbAM@#U_4vz*+B zpyeYob>G484)tui`UynPzr9WSt+#R5x<;j9X%A6pZ(NuBRpS`-w2Mypr(f$@x-ezs z@$Ed?r-8ZiXiaZ)Zb}@K6$}tMG=rn0(DE2c#4Ssj!HnftYqgEI#o+Enc6$i z|9U@FT-**ovHo(SK6KhZG5%xhYis5x+Tqi^D-s+q!T1L)tR{j7Zzy3%1px`osZ(KiLBQ)i(kJbHy0|;7JO_V+TzX3rIOffaguozf< znx_%1bb4lB9Lk8-#0ZlGuNuu?Wz;n>V6Vd)IwjQcCAceY0P@#=pot}=LC+(^^x#mFc>k~xHW1&68#ol zZKi(fS1YeW6$|<{RlW@xzXwD9fFD*gf=<8ow?A1vSuy$=G2HKn&eCEKqrQRs8>d2Q zN{ULV8b=Qlmjj5Gxpqt5NmAjGmh(w)san&n+rJN1kXq5XPI%)|68JehfJw~q)jw`N9EMB z%Z9Yn?z%#)=H~4HB15}5HbM?h51Xw>=O~4I^-$_EjY8chG2{;^D2qcd{%_s9P#dp% z!AE<v|8CdmR|uZYf3PcW_*a72>CL66Fs$Gb#dHZC>#S7nL* z>7K*+L-c>eh)nISN1gTqHh$#;V)^xB%Z^jBD7bsLLBI5M|8yV+A~G>jP}mc}{6DvR zlF~rHD-y@!7ncKwXsIbR(ez~s85o<=IoSNZ~zZqty}TPsv&}WXz5_3QYY(< z>`h)7z)p61&+V)$FqaK!Wk+|cZ@Wqs(5QMv9cmRD_pRvj#`Qd*iiY~;h$M+4^&t%c z8~Z2Ge~A8v^=dtu*RZpCG}h+t4dXg!cYW&tC?BE^L?NH254KNVHr~E*y{r9ylFnLT zY&eD{D~mbgd}he8_MPaH4HfDPenJ0o-I1ixN67| zC#^)!6MfzI1@9=7&x12-+p`9@RO1iN26aW(Y0sPXA);UglT7sg(yAFs90gJV*jTiz zyRZ%*74N^wp?)@=r*KQ4VnjVr>RT)t7oedzyU=Y z?9y^x{DNrR7D5$Wr9#Me5R3c(TrkzV1!{9s1;bF`0V8ql}T`urn|*R|2(5(BC{Z};ysCifT_KA*J;XW z60I;iJhoT`{XS^agv9|can5>8>hnK1H+4WP9nVD+b*J?C6y*kkF`70UVTNRp$(8rAS7~K-DUijrIgk@qq5;PSHummBWuH z0rz^8ad_AS>nGZzW<@)xOGA78*ba8r+^*VGIS}PT+yOv?@YF?PwQfgE{9|7ePnQGW zMyE0KD@hAqy?TzK5{Sm{o#OTemxKc#1!nURrKh)Vak%JD_FNepK+qD`cwhuq4^Du- z8;e)SiX(Q~wDkc{zj1G~7+JWs7)E>lp0o8?kFWJC%5xBR07{8{>#6potETIssQfyB zb$%Y;vf*v)yx!~$u4!vH2k^hf?K$~{=r-f_1T-uiGhFgg#w$$^YG1b*$CT&SJ(jU; z>Q%Ngx;M5rjnA@s#P~z}b}$DJEpDet!>(JR^FJyFPI?+dQA$Wn@KbSE7IC z=2$9iBNjA$8kK@z)?^-rY&HGQgAaygrP;@{@1RVrPVDMaI!X9}&XD z8x41205+M8WSeHDj}Lvn>K9~hKe4BM^vq%Q_3P#->!{o5T6*-(c}4OOvDRn0 zNGDpNvqB#xB1FC)Ipzbs&S9?yV3|G8b z0c@GoMP9$RLNtGT@pxqor3{ryWnJ*|NtXk-SB~)(31rVbrjf^}x)V{-de z@fiL%HLgzl%DF*l&2CiSr%X4O#>8)u3j3M_7t+^$yO>T;?scq+Y+hmr5402mYS8)W zicR@GKmSa361&%N8=M@=BmXZdN#7x>iEHPV(?7f>aSfwYhEenigX>qG!aFjq5q)vW zGW$c|S|!QU)@b0R(8;T&>$7s-DMxD-urZBUa@?8VTp)dfI-1h#`}Z!>`>QCE|0xbY z?qLvx(5$eO{$LJ(CN*dvSP3Wt-7zU!w-^p>U)R>IQXU8JU*ocXuSK6RZvT1HQnJS- zE|ovVT1j;RvC_qT zD^-(l%QXpy|Fys7@se6;pO@?NT%$ZXAn<;A?R@*pCF3>6_3|p3z{B$406HZc043YICg<3ThPKhcR__2{2E_?5 z5cZtt>7va_#~hcuR29t<9V2?FaU;=RF(KEedIg0_jn1jB^bdt|0Imn{-d$(7-Jy(% zKd`cJ8Gvu768!@;19uGmm>Ym{Oi4Nb;H?azyuN0RIwQ(IM9`(<09;AT?M1#^o9!QN zxkw{?9MgMuvTJpbeM218%d2PF=dYYzOZtdedU^2`u(@%=TPoav*lss8sj*K z+<0BLjx&kqI1~(AQ8a!Ix=J**MwHSb=S~Cjk6SO+z0JRuYx%qN=cwXLKa%g0Il+I! z@9O$e`FmYmy7$nyR#Bs$&+qpe#c1BLSb20FJ8P&S*NV#ltoP+#oDAr=7gkJDVn*&O z-G5y~2k=`z?f*Q}{*r-jD}V#w|I9I6a$FlbJk3mt8n*)Xh;jfOMJE_H1HksL zui5<7q((*Cy;%)AzHU`U_}!=x95p5LZ}?ZK5n|f+ zS8GpK0xFGU{{4M$=;Z@q{+sO`9&JX-w$|AVkjQ|4F?j}6|@IY zJ&Qpg!h7MWY4$nEzMhsW<;jc3*dLxh%070^aQl!%O%I(t)IK8V^JC|Z(C_nepo089 z*Ot_s#vvI4wAvUtvI$+)`8}qyPRW$yJjiyqcJSChQuyATr)j+$T4k;yB}PgO7*25K zC{w5mJb|zO+4U#szKM5lKTZ2w7&#onr#={n){>USwbG`41eM+bRQe2Etirqs0SwRQ zhBVCtq-FrwijV^qx@Tb@aX826b>m*bxkBks5Eg*MB(N`M!E>ajzw?i`_b={$z)4_r z05g-rs`LZaP48r{7}3^_%&uqaI0q0ZeE^1F&k=22I_9|KC2{~zp{@{p(s&2Zv}Q%y zvw00Wu}cGc-mwL908w-S7Y}LLODkt8bn8Qjo@hiyP{jOtew@Z1w_ofwA6-AsJ|RX6 zL_;FwEY5~+Om#o1ycbiy>@og8jH7F6U!7R)Ufdd$E1dCPWj~gvip4i?-n76zbJ+y@ zs9f&{mJGDJ7xmR8I6F>qy8Wb{cAGr-TVuNIq#pWxe$MYwvfFiXZ*8hScJ@$>vM`3f zl}v(27nG1&)w$+->j0F8%9n14)-l>ds2E2u?9X00PVcWr<@|w8GUNy88TZ>RF=%}D z4=foZ(dV)D2g^p-A740D4II09nRj7Qm2w*QLsUj99S7io5haL|<6*OwX3lbMJG}!) z*HBpQ=ResG5PLDdrw(i}rT^iU3ljHm;#d!IZIb2w)EKk&0^JDCI zU@1iavwY)*6a8qr!!)Ol>pcIu)iZv+zGkkLTcYv%FG~#XztW+g4VkibN-vefUTdABiAy^ z-YeJTUhX$0%;oxSmFyFT@W8196^+8yIkG2uLNr~8x?TCKbgot00Wg$BS&$6zDR~w_ z0u`47*e76`?)m}GN^nAkr5O_UP(Cwe*K=__77#_S3Op{3mtaLVpB)6!nvwyqB}|Uz z@)4PKWY#_ofO&v7jO&FSF%Ezk0D1spMK3e12cQn1agB<$TeIqRT&McFO((w&K%IcE z$77`V@QDD3Cb(jRF=-?5J!akMr zr=N1I6B++mj7UkWc#QWJqU9K5L)1b+cQA|E4GoeHo2 z;+50Y5zzC%xGAd3BZNxZupi6_e&ON6G`YE#*ha_a$1oAW3G~AEpEl6$lIVWB+^?I( z_^+RLl)Xm`#@d-VcCB2?wQ^n7%Kdh?TpPZ>POi^J$#A!lHOW13pZq-zlaeQMAvgjU zGC{5InSJ@-s$|)-1bYMO^hD`zP(HyB)0=af`igN{er7ICFmaMEt(>liIamR3Ob6SJ z7i~QI%9lFn#k{h5rbhoR@;~@7z*vgvZW7VErsUX*hP6>}ORNWgMm>PD%n{TB00qPr z90-suG>!>Wo4~A2V|l^}IrZ(?1!w}N7)@OQf0XisP_u)lpJ@Is;sCzgj|0dZ73?$3 zI5(PREc(9F{Adcb^`fJdX_O`^OE4nNpLA_OI*1FP`01g!){?f3ZpLPi}PELBb94#?;J7qdObTjm1}dae4n53I~(~s`J2u1 z@2&C~U|cB?0TLi1c<0u|`k8$mm-1yT>L<^R zTOh;z^U3Zj5=g6q*#VpwP4-{kbEZ>|68Nd+2!nyP5gle+^8*;DI)M6BE7+Vy)$E9@y7tULg>?X(bY-N%CeIjR zU%h&kqEo)OKeh-y*Te8-tnQDq0HO#=<*5tDD85*Cfy&KWTzLO|9e|5swkq^gbwoe?sYa!aYllNXWLwt z{ru?MQEEUr|3B?YBD;#p_fnkKO-mq~T_cp{E%(yi#r>1@V;rBH>t^VU<=X9-)WPl& z-90Hww1Zxg`^UFa#aZt5Ki@gY{r*<@+f7s2yT+;*J)Ftzll{i5tEMS#o#-_JL6o!u z(7BL@R%D+_??DND&FFS^$$;i|K$}{&W^xiZHx;KnKC{;Q(^q1iDCC((7j~9jC^ehXLamVX6~pps)9R^XMA;>3vr!a_G$) z7wRt5IXqGvt(cJBuE4f%ck?y2Ki*+))jV|PwyXE#v$rmy2^ zukSx~pzdYGkp9v`V3T|=hXy+6%NV5vpAjX8pWm`ro4lZ4_MSRGo8X!$Vf@9}ZJXHM z-Zwha{y;LLr^P8gKcty`VNg^1@}MT_Fu9hmiM}EZ^hNppbMo`2k8N&$bX-gO@Tk^y z*Z55BrQ9p`JDgWEJx>6wlB* zYyS*@0$B)IfbxTZpnD*>+gOkLLFcqMZdO5p(t7I_pr4cN!$3dtNo}oUa5w-;cGEj5 zo5Avtnf9bUO>Li+HI?edIP?$E|J%kfA+Qhqh#`Z+0nqU1Z`=qpyD`5gpHW69fm_$9 zYzJl5woCdqx3@_&RB#87_abR!%@ilVhx<(&DWNy(8r47VzFeDDz!-_VcgD8=6f4iq zJ`SLRMjJrqo)p7}1N%Ut7oDC>1GDLVA6!3Fq{d$&AO>JStB`@z_MRv%l?JTb%*f z!K2~?wu@t-oV3ng6QVDg@K0ShTH%nS<@9yF@e{G7?EsRLAuHARgXgCy`-0qe59*4< zZgwMcBb2zfkHs)-m&ow`v2E>B!&<5n#987bf1gv+{xPe%T*qqmlXg|@$D)6dYxH4G z4f~rewd{NUpS|k)VnVtQhV zNla4{YfSt8|Np*k{yFpByIc?zl-&i~`#kfAh_KwPP zk)58{Oh^f@?UvHn*cNv(Qf7s+-$9$mj_Guw7RJ zg^AU&HqkVxK?HTJ7%cNm?^HSHOPX>8dqz`)n8!vA+C@{pY`muI&~|WK&CdYf;p`-~ zX^>4FP(4&MG#(ZJL^mHs(u38p7(+57_wTn&5fCsB>+t5ddSIR$`H)~hw*z=UXT*3h z*^2eE*`)fpXFxS!+FTG*``Jok=b-hLeGCA&vTu$g|4&yB6%INEjaz$_Qw$%ldHCM$ z=~#-6wTzTD&->Mb>03_zNbq-xI@6z_D*iweb-6qE^M8dDpuahO4|5S9_^z~%oEl!M zSCo!(Rg8AWRwOqZxjDH(dIRkzFkdj&k)(ELVU9Qf829a}Srea=4Fm%*k6PC;iq?0G zmUbDyZEw36I?BJ}i+u0is}am6BtQC@lRoaljc|9qC$97--zVcf-r1cjGS?JA&l)o|FTW}9V9(aeJKX?x#`S0jmA=CDj1^^(i z0JgA2Bn?jtqt;~tsdTU>c`5*a5L|jg7=JtEW1C-41H~M`Py=1ZaV4LokyAd6JYDir zY++C8Q5ka3F-i=sSGg*MSVli(9g%7fI9Li*3UkE z<6xMqo^0FEJ_2u zX+isjCJ3z)$$xYEDB8`5`Uw9{FYxb%*3M^@0_a;#=D);v(=`T9BzYu%%RLI=dl=#@ z_Xt3Vf4^43T}}qLR~IVy(Rn_3y;irV4BPkc_fP4hT(dSZ7~p=1bs{I=3u{Mk(K_(&<^*tQ$Dua z1yQ)F9LqU=)J%pjMGLu7hjKx*v{keWfp=$d25|S25-&?fIL=|Bj|x&2MD*$(eM+=h z(Cb+ze0O+l#A9u`@`4JrHFudN1*Ad^hE%0#Q z&!+Z~o&*9(kb@=-0e6P?(!~Op%-k07= z43X2ot`4yb0_r3HHr4*2wS-A^F1ecw^8r$ZrjRWF04E}BH=~#VIm4P>+4p)+ZPs5q zIK>`h5WuPS>y6{+3cyf*oS6T8xqgg*6~G&`mkz{^!bs*|I{md`Q0V%f1k|2c}G7@;bWY>Fhh8)ZWtYFQBqDCDQE}5 zo3>viI>;dK{L~imS~4nMTb%&x2>_P&RyUnkkrX3^6?RNyuC{rSv{tb*0hQYGEBecF z9v&;^Z|1$9hXH_R+Q-s}#4u_Q?MKmp9^}t?4P+P2aW^$313jOkBS#rcEyzB0SA?dv z;DCmIYYG7V3$84*v!MrsIlzV_h2mRvnbnL;;qMijOx)dVLY1o~l{L7*I0|Cf3%V)Q(1vcuW4sDgZ#f9ssbSZ4C9P z8bakmy~*FhnXv5YlrJB09AuzDet{88HBET|xY{QL+xNm80GqKd2r= zKXLMxc27~43|keC5|Z3F&>q2H7!@il1ca<3eW(k;~V9x@r zGcdN+ffNC$WCkUO31Ug?d!131Dvgl6C#UoP02UCudpCD8+N$<@f5~zs7l8l)SV_J* ztG%2i0SK5AV&mT^$W;EwWa2l)j$X)9Whl8tl*rnI6>_6|rVaInJm zl7a1ffenAh*tL2&9??54o&t znxY>lo0gy-CrS)E!FV}eEr`xEj*!h^Yzw2ZP2o54A+FXS zsD>nCF94AHhDA9}a*$-$54t1FPq4?)KAH}+iInR9vx)%%YSQ-Msy{pKRr;9uEw4WuZ=(Xvk=a^lzxcy6@ZGs7_HaR7icEmnSh;2nNoZ~`40Ri93cZ%oI> zG?Wg&R-^5cl(omX6=CrJC{3$7DHE86(SGFXo<{!%@fF7+j>?*%#Xq(eCf|)UB?^ay zFw6q}aVd~bbb)YmYF#FXCf19fHGD&14T*v9{oKLs`y!Aeo7xV-NdU3ER|P?O`8PWp zQ568FUL%g{&@=~a740ch<>0(40Lb3uuhgZuC9?Sl?lY=b%tChaDP#-ZBUJxj!8JtQ!MJZPG%QB%*U;}91E&E158E!g7XY9Ygjot&XQ0!* z&?ubtw~nH%?W1TT0|2(lk8+ZOj?*VAhsaLMWy?}w_7)Zv065M7utNs`V-YNii8Z@J zOxt_J%YrA!9yl4nu?*^~c<-6ti<$nO-4*q7M^7dH@JxqTnO|c0t7^E9!TmS8fPw!H z6@)1Jq}`lzd20#URPH~FUn)uhek-}VBxDSyKvT8GkkgXLI3W4(@yekh?<@+R{Dy$$ z%yv$?Cz?jkIj$QdyIU5?{#4xpg2c; zP02zW($EIVr;bVmobpkGuRFEnQvlYf*CoYS{5H4ht~-yCbj@MU7i3xhs3hzk^(GxF zgITe*v^D_joJk)%IZz}Ypjndw&tnFFot((dHYz5IN8p}cjr5TAOlqZWJpcd?{%@|9 z!E$-8MiDyHCR*AEP!C000~FPlXLk^JYTP4RnWUQm09(IMEIm1)DeVSmGJr#{4UDOm z>W7K!1(vt2mvEOB&F}ia*IEE@y|^1cPd@T|L0aN)^Wvf#l)?b8cUU5w=I0m11tc|O z8On+Pfcqm-5PV8QdnKm;fcgDzv|b-Y;nz3;ASZ$O10hQ&8pGTw#K%>JznUVspu+*} zvw0j%w8xP9pZ+Sq;l&Zo(Sl>8rf!m9nI@FbgyMy0K#fqE+pMHWM9ZYTSLS4*@Badb zvxrC8`^Bhq@ndBOg=+F+C^~ZW58k$-8d?Vcj7kj#9-@0bwvm{%Z0cQsHgZ)2UODKC z=>4OL1^*mFMu9o{|jW7TJr;MNY#PkI}U(gUb z&Zjq=;ba6d*94Z}3JKKJ?D&hH%aev!^j;63|b-AQjpy;pYFQC$#MD zZ>Qhb#6b1P2&H?z9%5El!eanXE_n5@!vxnJIzP{KFD-J;VBx$`Cq!tUvf*3IdZ#4; zWBp_S0022hf`@pJnXhdDvc88M~PJP)50H*ID#ma$&baB%JnP;Kb zE=5ib0f3C(hiT(MU%$;F`^?XKQfZ-mj_2yXag6_eVQ=e{FU{Z=IStC6L$t@7`gyMl zS{Pk8ws3sN@f*kgK_o87+l9&&@uH@s{AqZtFk03+T9o#-n%Y5+G#9Y@3r_(6DkQv7 z@P>gO!LNEUvjqTH5}7`%dk)JpIskxM{(b3!me!9w008QtFE$DndE{;F;W(xM04Lurc@B}rcy2VkGON9`>+%`^sJ4&N z{8`#Mh9=dIpe_}Hg}maSHhzsjN8j^6AXc$WvWLNvSpdM#gGk!vmHb6`4kj}@WGO6`wle^n zoY+i^Y9Mm}l}F_oW}U5I^YdT~oFN>BEpns6UE76|EuR7ow2Kxx=H+Nl`5mmmm`Z=Y z5K1pdsjOoDfH}lY2643WHutSSy9QJheW&wJ^cBF&PWtRMU7{RqI55}nd|=TElxDOx za|;061qP+97i~AYdVTL@eTF$C_rU`z5WZCh(R@r%CsH+pL_enGYFL9CnalJ z!Z|5KypCT~hlV8z7atWlXoirfwk7}|`CmV}SX5G_l0~n!b8K1wNDQH$V!W07KsHer zvkCxMaI$O#w@n3r6BC=#xg|a6i?t(_f3S@J0ErGi>#Gf8>6JMhWqTV54g=~feD4mo zi4vJ-&@v72J6kke1zQzu*PV0d?nW930g(pj?w0Nb=~DX8-6ehKZjeyAyCqaYy1VN; z&v#w#Pnenep1tdA3*)+JWg6`!pY!LR(EU z;)U3&)IUXkJI-MwUD8wzpZw>zgV$Vb;b#^5K`}Z^BTyy3(dM1hT!xrqOpTb)s6c~D zjL3B@AuK|Spp;>y9~s+zF43!0wt?9^EL)gS`4jL7k!P9_2jH{v1G;aK04gu>LE`p( zCfl&?4_A6Q1vK|8=u~8M0krwg#Zv%`*wI44cQXBoQR*H+_;xzZ|I^-hN}Bu22Fwulok+fxpc(bcgO$FUv06`bi4PHPSXEOB z4LP?@|KU@SP;kY}ex%Y~Fv0UR4K3^y41`eEIwlg3&|R`*^VM0!T&gYRE?kb zw@t<{R{HtlJ12xKT-rR7m)7h{3?4rpEjICM+UGJ0$VV@}U0#NOZ=JpsyXd%@J06Xsk>wD@sQ^JN2q<7~~?E<|&(+V@9Gcuj3tHuw@ zWo*?W)>Ftp2%?^l>=xs9i7oU&t{n4_nup#io~!+e4fz!ao=Qb$tcNW$ta`7wI%>Bw zKsJaD)f9C8Ss5cxVh>5V|IY7Z$pqO~h7!Cve{Pr|enm~kMOseHPS??bQAJZC@Lu^d z{n%&hdc60+N5o**%bKN6U=K_|d3a6W3GA2C3SBrt0KQTzddA_&^nO|r-VJg3_H($z z=@GV5ybj)D>!$`=e-^5n80vi{SblE;>MQ>5g>J|uj!#K#^^Nx1_f5fIzEN9L_}m4} zk9%bxbRqps(X+1vuG1?qyzKuRI0wBD@Mt{3k z$|mhm06QFeKs$WG_H;edfK@B00%u`!Ic(#~#nKO_s;Jb_z|0R|*Asg&q9Nz1_SIq%yzaOM`% z^7TVkGPWW^W*MwLbx-yzNNt@iEFW9)z4HOIz(54CSqZ$FLj;Tku`e za_wGvv%@C)6s;#cv-N<}do8mX*x#7;{W!RdzR7?3L5z&-Q7OLo*K48CWF|N;irkNj zo&bb#Ov&{IKKt?=rD@r*DVu6~yxH-;V98)}-@nKpI9XW}CzGs`IonerU1Q0_` zn;{6GN9A6FMCk!KI7YqR5BpRMjSg^?QTXr`GT+kP9g44UaZLZJvio4oeswZ4$*27; zVg)gW_hU(9hl3-|kln@aGA=doP4_&n}l@b7wi= za&Kykcq&uKWDyYcdD0Qk5e;Jyhtd5idz$FDAbV=0D!LKSp7Rl4WQ8{W{U`Z3AWzlm z$LuYW#?@NipqaC)YbG@VgY#iey-H$oa?&(_WK72;e?MKDc(CO@go;aw2y{~d^3`jp ztdhH*@k`S0b}4Oi#Y6U~5b6UY9lZVZ-g#Tgsi^sP{Pc+%=fE%KCIgu)DxOP21ehh) zsoK+YRsLpUGYL%K*;A@cBtC7ZtTUYj`1pT(f3^Fr8#FvX@t?48RWmVp)+A^mX`vgg;8qrAWUPdRa93RVU8idu6FI` z_9Oq0i_(Z-%NC>kCV58b`*C=7u_3w+?jgyz*v#2q0JbPk??nidJ7ksoo4D#09P;>Q z3ML^z^I)Ct5pJl!FwlznhC(;pD03!F*vqP}OmPJa)Evf;psV)S-0$u8%xduqmVg`v z)-icvV4ZzH7UMZMj4s#|;a*1PhP0R1FTe)K*OQ*@FNZ6Qr)8CgZ7r|==iFTEgrElg zbeZH|9>)G19vB<3{XXmo5%;lD=Uf>p<+}sfZ#;f)@u17GQ#VLa1ZA_kzjBhL_l|dt zftk@WVKcirZ&QK3^~M%IE{8yJccfu4?V`<1vaz_xdQO)G8l(=!-v9s!I(1+lO?Yxs zpGnQ=E?7KS-InwtX0;&JFztCaJ!ZCVllEn>V9`2L{f@knDX}FfQ(}ku_j?EsvKhoB zh37C-FR#H%sb0CSrmH8u4I`-Ay31Au`tz;d#8_TMc6NZekJLki_h;0uEgdKbibWcVS;Gcq*(ZfC=;xH*!wnQjc9 z>Nb`_m3;>nta$f_VtcDg!Pn7z0N0gBd)e8&uj66fx3=Lg`|heKo$~M-la2l0?dJi* zgR`>sf86ybw^ioo$BvW|rCEeT)|_>2Cn5Z3$QBI1`lfyZ=t!ApjIe;0gq=F0KGazM zu+DER-dyHX-t6)||Er>6O7d7O;c|>jD{L3CdGf$#qE0wM1l7Mu3#*Yr?|?cPB!C_5 zhZZ_vCWD@E$y3l)JZAqCxi$Bv6f+|fDL9$+h)APwLL;$|~JE}g@Z=*4? zEYfKDdy{7TH~``&BGjGFW;!C{JAm`2MaQ;~>*s~Oz2b~xSa~Ala5s$a_D6VFiB*iD zQnulB4~tHWpxFBCQ!DwFa&wA(;U#eB_>ntkU$QZ&K&A=d?QWgUmi!HNUW!rnjP!S1 zG2Z^oPE&-w>~R37*rROy*HLGM-|?e}0XCA=T%n*j1*zByyHMERDLKt!rf$XDEGv;9 z|Il6G)pfZ2cFKK1k_#tmB~iOySP|&{y?&J~*emX+JEizJ7|)_J_<+(ay7FGI*mIeOT?(vEWqq!vi9((V^OjBX!fxpt~A zFemb98#4C}%*HF5dpe>JMW;hP$P%_Qymsjiq$H61goyl$BFXA{{4G7FRZg?nUyU(B zpjdvJcD+3}O1#f&+^j?P_V+yAdS;DJu#czhBiF;z@`f3UKj1)xcpa-672?hhw^aTX z=gLvMF56CY4xW4d?iqt=*JrI!v$RQM{I<2sRas)~HS4P}_uaOSXW1t?epb^*qP{gD zgUCG6+9N8{T({8VSEulXePNSFA_Vxnw{;On*Hc(p=n0^@VUaC$0K3f#^9USMWf(&` zc&DM5z;N%?ihM4qAOwP(Vl9)x%3qTTv#;R$s!!$v4+Uu@ucwk?tCN})bqoueTWgi_ zIGHPDt#q&4Io%X;hWp=d(I(IVlO_|(muoM%Y+30gav;VF@Fy&bJ);#R_+sHMv?2s0 zWoY{PA!2QnI_$6+(IOb`C_o6Z@tNX$<%T3vDwC zKKtqB&RG=-P3-Zsy(|IRdSPdEgp?+l0BL`-2|$v^>0Qp6_2G z2vz>282L6xnttev{8^)_V`5~soHB`dk900=ROIxkj63Jm6yThhdTjjHn3op>A^ve_ z2(|}LIS|SP+lAn84Vwl1l+0GwaFc1u4Oqb64X7(wnTs2XN}tgVPGL@w(6+IA-`zlc zbQri%TRJRxRf9`|TdklkgGPWqVw?t>d?Zi<>(-_T;k=w&j;fY@&Io5<1O_$= zA5-WkC9(S>IiKG)N0%f|$PX*S-N3Qe4G8rKb$4|8wRtTH&7EfXPdPiCH$zj!&oA{m zt)ZEn24BG$bN{aFI$)Uy z1o>0UNV5YCog9~Up?Cr(7$-9r&$-m+a8xX}EZ?C=Qlfhp>R5bgCTwnHmU8?#AXqHu z`Za2#@FpJek6Tl{@AJlB6Vw4qY{#cM2)d}- zewoNz$f^d3)PxPTGMLd8h7}iTBPVs&PlybaI0v*l(9m=>=z=FJK;&0@onle#5&(bW#k-3QtDfD zIOD6Q^X%czQO5cSg!~*06mV9&8&70zxNt{}hs~}UYh9u}Ks;!?9{L;fMB@>}Ssxw*mhuFPCM1ziQ>Oy=h<7>N*xNKf_5CT;Z#Ik@G=OGQ5ja#RyqY1V(Ot zE8*?`9T3`w&pWues%1VZu3o}g?~e!+2S1iIw_ehbQ>xnr|(nPM9JH+y1^2>A4xi_hUloHt3+ zsS(ro$b9{4RnDfgttBPs=D*y2j-7ujqJoa8HGjhm&048zwei}N(~$mfWBp`-45TTo zyEY}`{p~T0yz13#MzJUMTx-Gu40wzDZYKy9-<8RTUtfgUR_`tCA@;(g3M~cG=!^Lm zN7zz7R-~h@x^WP}5eYdP{bByXigHHP+M3MIM0cmwWCVp8v3>i*4E4cJ*Q4w7(ht>S zAF?(i+di9c3kbGT2#GWkbPPlyl+wrw8~h>=iG{Z~-3nOro2zF0VE=r21$oM@@D(eQX+>G~rLFq(l?qrI z^RloESLdqpR;w^TM}e_Z(&yC&gZAkPzuu!gMqBL8HyuKKn6eE-)sySi* z21E!Wj~3eA&_@R9-Oa_3Bt0GHtW)AIUOk2p5_7bF{F4{^AoM$-M@V76@Pzx} zNuBS^&DqWX4`hXmVzjjtAXV`~ueBVf1wdnr`|l5zH+fFgQ`NSiYoNJJ*l!FL>%)U`H)^*ex@0t03Ed2S3qdt6lFAYu8%8 zZAnnF(J}LH_h!^i!?P^&KAsj=_}7)D0CWSDhv?uWMh%lhzNA&-Rh6<%8;3W$A(1?b zpmD7jA0B8_(=VRu9iLwkAmGF_%4I5S9zS3BN#rRYo0wYc{3OX}_HCanN~#D2T5jXv z@;HqGci)G((8uZMx!=fj4oDD>5x@DVM^Lw?3sFpZ8%;afG$MG8U0^u)PbwPmcm)+) zY$*HJS8=T2dII~oa#g4(YtE%AvjuO;ODw*lC|I`aD{sKLY= z$~nlY@h_RQdRH(Y`)vhDS^=2>pXEhV58#rB2oSTqxG!hjr^`d{4i;hOQv2!ZBG3)E zf7A|NA3WV`e7PXKQPk^zF5lE+Ct@o3_-O81l&6_n?GBdgJ zZ7mS-J3m4OS>nSq6|>{A4L=?hL84`OPvm}s3nHRqkBEFdy?2&wi+|*v$FYI-)OvT^ zUmk3%u$6p=(!*6Bg!}a^^0_Tvk$>xDgLCIn5GJJ=v-1o!rWQK-(A>NL9{xL zcfGxHf5UPOr?Q>k^9Ygg>G7R%B@94jS-5_iF63r7@#qJB61HW?2tElk*$Q@p~|2FtI-vLV|WJ<<#WC_K`HKfS~!aD5_k zD5q1F;6-|N`_owaD>l&wWU0|+o&AT}J=`Y@BEtpwXa4eKnBU;5BmP>Wi#wAg>hm~5 zedXi4v*3iAIXB9AC?N)2(;grV+#Yu@BcF;~d*qDJIVhhzSPAOMs$x$tS~L=~z8zbv zmbBk$4lJ>o8loMtBFri61Ti8Ya6;J^dj#uE1Yy>s0DKvwI3@Bf zNI*1(318pva7!)9-p zX>gqaVg`lamPUnsbIPm;-3i+^B~;l^R#3cx(IAHF8k8$vY@Y4?WtVp+ZUKnWEdr#q z37F<)J4T_-TFcuZq4AaEd7Fxp&aNYY`1Q{=N{lYBB>KT~G~Mf@_r~d4$@e4Jm(4tL z-gx=MUj;>nxCs89duL=};PwV^*BX!PfU6w&@JgdSu&!esVRO2bn$d59977_&Ik>*G zM@07aU~m^bEQ{`liO}GOi z-9?sneZITK!2dR!=&r*?;ec1hvtbBSOA+q&?d>w>3921jRJ1yfSSc7vpD$^t~_&onU5+$o!*_R>3#JBmZ%E{BN0(}fVr^_^BLO*hg zebNZw&-|+V^cu$5?_8jNL(<-S6Zx7$L29IrTmREvi2lg9sk%c{FnUo_J?5bF$xEecarp z0Wxzf0TO6!BR5XrcfDNY{w^E)X7``1YqCIlK(`a_UKvCSB@LO!`2%}@-KW((E%Fmf z{k@Sry|=UsL7AJm#Tc-fSMxPW7v3f>oL}wT)Y?~tk8k}J@=yV0rdlE(LdysICTzqxd zI4w1%qTCdGw+!BjlyxL2KBDkB@QiOm2CxSc(3}X%f`T;O>*r*>MFxng!7>9!$of*5 zJ*S;svq}ByM70yo5_a-QE$HU?s}(I@r&q*`DNraKNXwE)uZ-^$piwg1Sh1yF(ylaF zN=r3+k;qUvw!Z!iXt7LUtfZmhK{BMR%Ug#>dYi&ts)a!y4Fe|iG8a6a@2otq?U?nX z05H9>_6mo=>Q%x=)B^O1kD>X$+3Wq`n`5zX`@S-U6uj$c+b0}SAXngPcTJhoBpZf3 z9KwD0B>5rN!VAtll2Z#M$#uf1W}8_ z2HnS15D-_V_6@1agqHeT{NjFmYe#*6EbKHYEdv!G?u=^PIFl3*%8z6ZJ=1$RD+e_^ zLQaD%UY>uIi+_1JXR}%&pYaplfGbIc4~UuC=r|k8Z5n5?VcSsgeScKc{T>Vr(!#Yu zV63S7oc!>Wk^-1E6ivLhFXhXeDTBW*BNz9edF~JIS8_mD+xZ%8-ki3A=&B3CJ zbmwsL3x5E$SK$>+JC_tE)W#&X=>n_m4WP<@{6Nr`SyHW{9Vy3(fK)%MX!aO)#whThXR-T zMnw>x!NdXEC9A<{@>j%O_-;U$@RaSCHriuJqq~4q8Sd*JM196eMQTn!l+cW#ismz6 zv6Tym1N}x7fEYrs_`ci8H$yRHs6TE`3c3)?q`XYID5+IRzLqBZ;G|DGE5?Z&=)b^u zevLI88y;N!Wq=IWrik6g(v3os^@nF*o}$AgjyUore5+tpu(R~L-k11Y7qsA1cpC5u z%lj#NnQ)n3YC%rw=R?C6L}9JrVGD%cF>%=hv+BFUig{#xM6*wDwI5~2m;AbK2?upZ z+dnfS6K4%($h{y!B3MgLlpsO~**Z`Scw3LAP@~LM>7OJwSaR4Iv8=P5vnp^I@StL} zeuTG3D-$EE1^w(44p0uMpBC6vOomkBOjveyj>|e4%!6@<)bAB%dH`=-jRleMZ?A9w zWdHHb8|O;%$C5$etJ^7KwT!MIMSH>CNw8!1=J_TvfQ$g3q8~l$P_(cs2Kq1Ye8TXT zVTx9uQ`&gCJS31XB)&00j+R7&ivAl&>g+4viT&kB_YI-B8uK4M<2%rwe;!g3Lb zctCOLGA1Z5iH~=nBb7R3Iibg;+B-B3WSbEyCb7`G9*hfTEfR_mLM!Bkrxr#}qHYGI z%|xEZZq3tFL94O>MW8MaWFqyOI0NpgLOp~z{9aWI0l*HECBKDe#ur8 zz`0xC{1s?l!flCX%@LLq^&S%g0jN1)Nn*~;2AV7u4?$g@@ z!se)?PV&~aw#JJoVgQ@ZC@*(f^PwDO&?`~+U8>tZTUCB%Gu4_8*RAvvhy7+wB!24e z2K*xfLjdi}Y6AdqprrNBB>@2GuZjTp={XGqv|$z{vkG~ZKk=7${iwoX7*}@plz(TN z*WG|m{-mOfQ5v1az#*%cOh{i;v+%23uJgAv%IoS>^1fu)?O0&wY$mKxfBz~xu@B^# zc-~YqO4#@1J&K*G0En81JQt7nZbS6d1(ukRUUU}w{JhV#CErAC;KaU{)RsiB{CA^< zMOkJQQK1pNt2Og%!Vzg=K+PAy&fYiU?Kj41>>XBf?#)gvXMerQFTlW^@aVt@ zjemcdr6O{aNgIzBzde?+e?>4faLl=n8}PC#xK$?9A zxTbk7PXGhsj4r6Hy)K#N5jzQC{(ER<^6N8ZDCmCN^q?G-LbFcC`8Houy;UCR{d!c>)p_FDY`nq2w71wt=vM)p>;#E zsbMh_^CwlzjL%b3pXVbeJHGO|@IVwI2_OX$=KNI}BQbVJZ5(g zoZ?kV-Rg2QAR=9Ac>5`iNm}a3Z+LAeSsc!{%wR;-E>9<}#KTEa|E)*5#Um#}VOJ4% z)3|#6Yo=2C)SWP|d&2!8zILL)b64L;z+#MWldp|_=AUM2I8B;ZJL4?E8z(s?4e!}y z%f3B4#6aVl$#}Tzkdz|+NhV&u1qhr8yb&S+BYBUS>@Pq5K4S#Ny$EBNw zS=(Xk2;i)Lnq|DgA8xc;;eT1=$d&KrSMkO;>F3|M(PP5(U6FPh?B*KXuo8D$+25tt zMYq2cp?Nps+KNt{y>}m_=tXumwd$bDrrqyN z+gHzdcQakcQ2rUFaqTmtd*#jD=ocyeII;gX1~0(Fu2-Z>-JMt}96{}?sR%R0k&4Sk zk7lJk%E3ZwMN`FOHR%vUXzD^IrUTJu?RGq@c$%HnbXyu=53gT?RBy%SQ4|p?(;mqF zAjrDQP{aOPp&%hagdAP=W|W{L;YSCkb6W?>^iF>$H5BclTnDJEVG_a^u6&8I0I()u znz)Kjz3E|e_yhnu{=-Et_FWAgL>NmnG${2Z-MSf1U&>y)fa8aYqJ!Fw5g?m(gJF}h z_e^X1y^`QP%IeTu&c*JRb~IRlKq16nk;Gt@p4+?eu$fqzyt;@=||=9g0Z!&v0Id+si^?#@dVYho-Z<$t!V=L2@)892z89fZM6MV zLZ|=4sEFh5m?C1FxyTgpZj6uF7E=YnVtA4%z_TznkG;)4#BI%B3C1JXle;c_4)t%o z_y7V}){aPYa^hkgL~AEc82@~}vJP0lTX1S?A_%d#!@7G$2UAw(NuoVALl263N5-CO z><(&%r$%^amf}f2MWuqyCrLW?dv|Pm`vUL*_LhX2F?+L`Y<8<#7+@Vup?Za7`RtwE zF8K=nEi*s9X!188GJS7qgYJoE^@i7t6W9ub84iwF$9aW~g@PvOzmz6#l2!)RIT|JF z0$&>(Vj|Rgvr*YX?`PYCg(ecA#mqrFjZ)x=W1_3Zo>!;Q54suxqKk&D2WVHW`K>1J z?ev%-(u*jipWetvN=!}Wdf@>qLo+9qQcU=8m7C_IqhaiOUzaej{Zb`H-ZpwZc8ze5 ztdAG5A^=oycnK)XOtgt=?jjSPKX%pFYKrNemW%a#Jm(RfwFo2WhplRD;k-zP# zbh=m=3$Hc1_}fbM(7G?AX8woVr>L#bHKyS2nh$4NLko3g=o5!?*_e~ZD!YryP|7b; z^(-yh(sh&XOq=Q~=DZf|)v!Yy|0DUMzP;g!gW6^40uX$qT4rj^%u8I&D73Rf+B}Z% zdnt_y=ruPz638q%S&74jt;+_meKvz?C`2$(?bQaTQCOTkMFxfni-eWWIA_B%m z>rl*Go<4}KU-j>}JG!VK1|}ZRb-%Y76Qn}=3434w5|E?IM&b0U`LV1aOEf zfl6hsUqJwTE6)WQUT_6mAFhdDcn_ zZO;ht_7)8J&)tc|IQ%khY0h-UA?t27BoPZgjSGXm?U^S?jMvp;*qX zSRRbV-`;XFDo=TaU~FxI0IM1f?^LAlU$|D&zw6?+PtjD6b@C3ra}Oo8q$ zVqn$yqZ(t1X<%prIxMWUMzhh~g><Wr|vC)5WhlezzRw zxZI)otK3WI&p%AYZ&ySvz7hlf6he?0CywW`<5-9pp%$_-TUWc=F36jHL220TL92R8 zv6$#e*p4DQj#;Od{#`d<6WY zidyGCU;zKpgNXLqBtejE6ap~1;{~vbQgM$Cmz){Z=qPg{|1`HnQcCYRn}Btw30~j& z0acb^-Z5Z(#{fbT^jz*3%1Am>!*iTDqi;d-!e6|Dh6M(SSu*WODqfqcDLU@@ok2wn z0}{ihC?d}cqU!k|9o*O6Nd#?7SRn$`p$ z9~3<%74n50Y0wO*VCEH@(HVAWjhCItUrIS%n_xh5Yp_V9=ojM#-yyxhsc+*dHb|f2Z^T(;ZsP^Z&n~lOSI#AYH>iJnRF(0Ih2mvcA zZ*6b9rJAnNBWER>4O`X!Xw=!&WDvvq+(8j;Py0UU`^>;`<6h3frtMt6<9xFbJu357 z&NUti%+i?lW4>1Q685hxL_^{SsKQ}_QN}bX8zk@Rk@HwfN>NcNG=Mz>1bw?(%x=t^ z7|H_zvU}QXD~cV^gWfE{v3<4C+Sr?_SJ%iSZ4s+y-q;muru8eA*{0ztbaBy}`*2bZ z5A16k1T!}UQ_cC;BANYYB+_6z7DxpDGU(?1&c@|wd1lW{9)>Ds z6q9qp7~+px0|E5ULj5S{9N3&$DNyble1M9A0jT@QZW=PD)Ew-IRmN;ob>-y8W*FO|E&{S^>onKtw zTs_C>au^Us*!P`;w1^j2 zQQW>_F>h_y1KqWm7aTIw`nno7-)pocbG-h6f%z@s{Bov;ADNf{cHn31O&Pz+(CH&V z5KugKeRE1l;)i9=>NuT>jsP#cNQ7c*&u7Mm{z-;@hg(7Ssu<_8!HF1vz&|aQlwVy% zV9qy4lQ0|6iI$}xTv#8|LH8HFbX=&3GyVP0kVqCW&%;4S35cs; zIH|B!rtb``zmKPWl@LTkkEt(4pJ~sT^OWbY=LRNID63nAFH|0UFpc`?d6e) zP?LIA*trb?L4}D*60`H_s_ei(88P}VO))eNI3&R0A9H`=@P{;W&LOY3kJF$i%!{JI zdJq@XTP<_0sc5*K=H6*a3NWE_yZ*;)sVl_GgN-x0xk#i=cL&>fd>lmJ(HNU!hg7{= z+w&UyZGla=vw%KCURtqz*P{d`R3uao%toc!_3^58b!@k?Mi|m$im<#IfI*h^{na{- z)OZ&8P`{3mV$nbr2IDU^OEZWE%VnsnBui1sY@{r3riHJ${#3q(+7FVhVWSK@{`u#@ zo=Fe6x+0-4TaCpSVoSb8bog}XA;Xw-y&lJyZfV^RPyd=&-t*bxMpo>m1?Jgkl_v*! z*wg4>5ueLzJ0(zMXB;I>AEpLVJ4bCi;jizDv&r|uPnsZcZQB|}7k(?DJNfT6D~=u7 z$;%UnJ5#zofq)36Be@API9t_N_C!-yWlQ@6P$ALXR>6s8E1&)pL0&(N%G81hk#9rG zufOMR(@noD(=dk>UlUpDj&=3iIKHmK3vlO0o@I;Z%;brgRLMSO-Xb0m%=*v#Z8E87 z2(H{tJhs#5K%G$!6j6K}m>AHdqj5$hUglBjWZ-)a5M9DZnh96`LXU22N*6GWVx;#W zXwbckR^(%)$Rhd6D#dJAFAE5IQGGQdIkCwm{X;p;@!1EH z0FY(cd1UEDHfbd@Fk{>$-aM*1&^qWMtKrHsY>ktthv;U2)d~PQdAXzY(VON3jkS!2OdV40JwkIVBpKuHsjuQ zwk(C@2%Mh!E#d)w0*MmzDsVZ_SPW|!6A=Ti5ok((5h%ZUnuCMLQo60DI9t2`2WwTN z2!x}522VR^3hLft*ky=@?_gk?jB%Pdd$EiI&bEj6iQ0jZTuY+5AV@trFd>hinn9DR z$;S$iZxBz-Bov11zyN}wKY1*lmF=kZC1;#Sy$PrT!^R0qVu6qhloJCur_(@oz$YFulAI(Ep;{7)wyx*f{`yUJ?Q0Ts=coU%i;-M z)t%Kiy2rjF#-DbJZXe?q%R+0PCc8|g+n|M#g%BoioKmoMmJxdgQp3yH`gDRoqG7_A z-dm@FALDMuk0dyKxDqJ@ywCIqli!D|7#O0enyv*E%wQ2>lDBtrJ?viLRe%@${BY_V zpB#5tyq%8WS2)_pJgSY=;MW=++-8_Zhc@Rnq66&xh)+4y=%xTT2dLNX&3=m)k|NlOO*+6{CfAnJ}s;uja{T@pD-;`!j$l36G&-a%B!WAd_O!hoAu;5CMox4>E_wx(fz?iW~G~E4C{Ak zF=BT1ccs*XuFb>N1755k7{)LqW+8u~{o;0JT7&xyHreOO=M0|~uE6hO80efBFoykI z{a~!MD~-m^u`_-!{`KWp*j#eoZ;c;%mXxRfmErN`hBAFLylUlv<=%+tamdQUWBowJ zZ)wkv30e%`%x5p?BsfO=NDMHMokj-cqt|=6RIeaWcRIj2j9D1Ba&DSU>C7ng(11~w z03bSUp+wD??Ew$`BLPf0*~4(YxM0EoZdpi?{*|l$de~8pbN<3r$f51-l|8sysiVm~ zmGQtdQB-~ncHhWFW^&tFZNYx&98$PHS_51Pq~Vi-@7Bh{{z{M0mI9)7 z@1%9v{kzYlfP_+7l;?f7cL6TQSq@)(5=z+S`?;}?_7j;w+Oz~Xom zPT3B#EMZX1_xGJ>1@R8+AUn*H+4mv5FsCHO6joUx(a79b`3OIwigj(=k-hu1E&j9I z?cPM}4~zk|HB={eXygTmB@F!{qT}o3kQXL{`|yfqML65q$}r5-4h@C&`z#*EJfwT` z#tB|D>uGZI%5EVD z_ww9v$3}Eekt@k6K{)sK{|wzE#oULQa%WqH{;Zn$!#x2i!4y{6quM|>}>{LO}-Er)>I?K zEl)(`*pW6+M2@>o+cXOs1=5e~O!@%;;-v;9E?|O0Voamie`KU5Y_NlR=VfCX`5`uE zS&K)m1W6-0@17%NbTl^6WBt3$bf2MpYSzs$l;?>_8P z8E9}q@W_qbo)CZttn-q%ZL~R^ao}hk%)$4Rb=|!?{T`lPgZbrN?&_sMxR*&#%-GqI2{6UtYYkvd|h2#?rVy_Om&r9S+!<#?C_1SgaO)Oy1 zI%6>qM4JR~q)F?bPXc<`@9YmorqGWK}H-O3brcn1Rtj2uGNWfe#HJ*JbIp0{~@r zD5?3-W^8HdkCmfUC3>FAA*U*G+6RTDBt%&q_(%Jj)(L=JL$AqXBQPolmZ2d8AOh}m zdg&NNs8Su}vSQkaq9EL5#zK?qyWK&yWory!Hm2R9g;X{CY5r^C+B^p@fg;M1`5 zgnb^gQ|YUAOTTXwnj4=J4X8){Ou%}tY(9R`N*64HnnUX(D+#r{+;B^_8G-)Ntc7iL zC17Th<2CLa2LU`mmdN7-!ie<&uxnCM19y3u>(#(;_B3mHHGk$Q4mZK_%(b+bMXD8r z!_df@{9`U_DhB7>$j`l}Vm(3I48d|phib*wI|}m~7neu$_5=x`i$m6%dC4Cc|^wPj0*`@@oGFBM0`|BwvK=qOk0tOtl9!TA7tHjed$7vp zQr|hs5G4Rn?=f;M4F82%ct1e`2rvOlrrT2Ng~x>t&)Y@YZq7C|Il1$SdcxA%@f&PL zI$^^pbx!aA`NMl%6gtA<>9+ZTX_S^)f$f4a8$$BFIt;-M8FO!^33%Jr2>$U63qvHt z5i8h-r(;9zfe{AL-rO~#kn&c49qp=iMg3LkvJS=h$Ng#sll+7t%N^F(21)U4Aaomp;} zbV-P`bc1vw-7U4>KJRgSfA;t6?#$fRnU@2c^Fj(y;+LKQ8T4`;h|tAYC_xykZef@@ z>u1CwSrT+<_-)t>sxxJifA{X!Q==WkJ^O31UUKc*gK1@Hauit;lmR%9Ma$VM5J$sQ z7C<*_(x{4B!6#`XIXsifRZKF*$gQ|&Ki&D$D(nGB!D#DZ!4!ipjH&!HInz`934O#j zH7svIJ)m+RxoT3NZn5RvO%^calPmQ(@bkEj2-gouaq$N6y!Iolv`4~nvo=L{`Owj< z+O&?O`-!rHHd$k)FLr$}dCP|UX#wF5fY_kJQq%XRsl!C(kTLjfWm9w%x^E>R;w)3M z;n~^)n=>Ebg!?yn+%x8-e%RacPf2Oun&RS$C#AV+YQ7H5Isd)X+qW>TJCmX$5VDj%uU z5$3}kyCGOsTW3VWm$o7pG~49kwIvdOA%JfrWqLAXr3*roYbVu}?9EG7 z`J2vlv|i5h_GBX|o(VgN-g95VW2)APuF4XAHE}CTSQECDKnPYVW zgN+nMb^c|}ag1wsPuoksAKqJxfb-Smd%?3G^;O|Vudb$|sMI?tH*4`r9!Y+_1B$Pm zPqPuIYX?!Z&JKPFj3(m?g~jcJ<(32Xl{kiBz0aLPegD>ZmecER>;Rz=00Nukk=SYc z5xPGcf`Grsn$hy~5n6#0DnlAUR2YCd5wKV${0uY%^x)wMIx)ix+duf%@EU9&$n$Ym zMP>qSAeC?4%xr<+rl9yZ7v@ZHVnMZ(f$EK`gRhcIVc`lXquC<+!C15H z=9Ow`2Bo|55p>@UbbqE6gZ~H|DcF*@R1hqlhksDE=K1Xo8^e<4!4L_PIEtcgR8T*@ zAoTiiI=OFoHmvxO@27Ji{R`rY@zk<=4kGk@jw27_Li)`!Ke`u zuu4>U;^YS&2O-V&G_#+u?N;v>2-S}XN z?|jKjZtgztX*Wew-(>9l-Wp3O6-b0rMqUyJ(|-m)t)Hpbf>!-(%B5?2?xd90tw{Ts)*_G8*tux)sj`Z%K+k- zL7mpk;&4O(dK*~3a{#giH4o_ppL)hjDADx`)jH!>qXlLa!lGVgW`rfDGWdzzt-osF z0WU)flL=y-KZlltPsbShHx$$jfEgG9Pv0SB&*x1xwm}7?l%>sNg07U%0a5-)Cbv{h z*LY=$K;hh7pPZdke>kS-i%(@n3;`7%2k7{!wcODGn;$GcdCc_RPt-+-jtx_rbx>E4 zND&Kaq!7mzwC$8XS3fg~w@%GuLL8ZscuAP{^Rg6~h%igz@H=LrEl=%nnV9Iy=Zi#@ z3nRL-hPY4E=5_q0JWGgfQ@jw=5%Qd~Sw%ry(ZMa)_Hk49gI%QP8V|f>2vV6ulUnoJ z|FnrK`c~nY-jqa(=-Ovp$N|;2!&|5JdXtQNg{E|$_Gk5GS?hHe+L^yGpRh%#tE4@z ziTy0MuXn4|>qKg{Uy9D;cal=;9o9FWmo$AQ^@Qotgf zuP@}%&J7T-?aK4h1(bV+_wtoUyZg0RvwVl^Mq2xZ9$;}1B7OUunhfRau$`{WuR3%_ z@b7A)j^tw14~Vs?5!&}0=to2_yLjMEd`A-{?E=hAusu`#Mzo^L{qx2PAn^H74wPMgHI)q#w*4h z7aGw`!9hBS<6J9u94T*vUX_7#3^8YEjcLbw8ykAzj@DuaI80kWXqYJmhOS_X$OrZA z89He(ZraxkvxQ|z5P)1;0AQ;Z*)P$g)(?T1C=daCJ~^vkEX~-`gVPCtiITP}c%a|Y z3q~CDtH1!#)Ka9fApQy!z)b$NJ^Fgd!0&bpv6dANHrxvD?dUxJX4wVj;U=W9%}l9H0_ zXNr}YoL2<={(jRxIG8Ttb6FLNPDo%P)?erVfa(%zPZXfoNXC0Og`t=fK$>G_6_Jwr zX^Lt?hz~f;q+o!&0Vx-EK#Gy$;KSw+2vv7TT1xYf@rGX}aP^%lLOXe)h3Q)$|G;1g z4*0z(SmOWltjsuhLe)`zKktBTkF|^PJtrCR>|ngoM6sx+!p7OR;1VjwP@f8*zYjrb zId%B_Q9Y!7^TU_yr6;pu-=Bv!KCuHoy10kLOO3?LoiZ7FKmVtYwK#}}Yw_2*dM*VX zthKT>S5hhP@AR^;_9viynA)Dc64jQ{n1J$krk^U=H!t_t6-s5l z1xp0?KNn2qQA$gmW-@GR`AiGJs%ucsEq;GL&22=6&zECMXW;z+CllL_AYPN*!xNfjIwn;Zsh z`KW92;1u|ojk;btWukLdsq{%UvJBd&9XgmG10dfH%?u09B_t|srd1dmTKQd6bTrM@ zDDov$ayPqRg_HAthFJAWn&H2rPkX~BJ1a0r>wC&!gD9M+YI(s~)|$qgGSg=VW^|9{ z5u&mrx#ywLaR%px$+Wy|QRuTz`}?BBNEW0jCub+%F5{D7}Yc1eb=ikeWMUR z)#kZ>kmdU8YZ!RvH)ea_lfcWr{k)r6@Jr0=bslsT9|(FpWHM@T%4mX&0XV&|Q$+2p zpXHL9rQ_OMwUjd^fb)?+&L9X3hDDq@C2DzdNEXuXFe{~3{8AfF;McGLy{5Q=;;SB= zv4uE%aHjuba;ZTqA)mtEyb|jp!E?IWmb~t>gZcRSbbeUd_1bQi)U|QDlOQ=W zQ=(E4@bBu7sD}XP7RL;qKc#^6v(-?ras<_RgqIwL0v6Z^fX8IRAMQC?i7(LvUP|D+ zuGtiFgY0U2dzUUQmcjm?LJG$5aTNMf`kupi2?1;9ngL&kVYSqBFM>DQ7dB4g9KhzA zjrHL9!)Dl`Y=n3uW zKr4s0K0^_dA<+&_fk)C@_OA{c=1zVyvq#F8W-i2GX%RB-a9}SvdZ{AO`2$Jm%K;7c zVTbq<2jdC=&}N&UST6Nv+dGJ$4ljC#}<;?p9o97tFzLQJ-L+gpAlmV$kPn?3WGb z3-!x=7c}qyA25*mFp|=C4B~1qEzCCQ|8BTZE~qZm(!OCeIszwY(d1unYF=SfvZNP_;Z`CzX;tLUi5s=1e3x^dY>LG2LTkLPlYk*UBjRqE(gHKik| z)|uE=8Fk@VRE!qx;F|^Oe`ANh{liWuSAqGwl_W2?jsM+?&{I=f9(=_Oy!}d__9kW5 z<2B&lnd4=vug^$BDp(2#k5o`3FLmGfZE|^EYS?It8jk->qC69OW!rZu{BAk~5#2^> z?D+xEvljh>i%*Hs3>C8k0}xWNFVz09`pT>YWH^8zgjSBX+7i`~V26{=EmQgV;aVg9 z2W*r=ZT8(8lO+}iA@+RE&tOBL)^{}L_>$TZpIWqdrT_={hRk0PKR^$lJK+#w5U7wM zQ!?IXZYZ&=mecX&_{PKG(#F(dDNBqu(Zu_2KQ)nAHmhExs#+#r$=RC!6l~gYSpVtU z4K|sBC=OA>ress1lkxgbXiRx^ zD7Q;^fXh~AU_b`Y4Fk?o_0yO)M_ugFh(dui-TS!A1Pe^xQi*OJ+HrL_(PBJ#KK{cV zgxV`3qeNV2@?q6~ni*3ezJuHI2>70H+uxa8@hL+}*@aYX#XnU|7Gb=Sd(4*GKdMnt zqVM!LyrTL57LOiwQ$&(epnOZCAQnJVpW*-f<5sR3tp2tPJi%VJ^87fW=+SmBPM@~M zV}D7*wHOx_Rl=y2H4?$G%&GX0_~GGZR^u>|Iw=3+LJevRaugKyErW`QCPO*Ka2Yjn zRR^NO%Y3s--b7E0<*L1#!sd+!lYm?o4Ky{>0Sw>=2_SXjW9QB(@o%9ZCHL~Pl4N>h z*OxfhCmjcNBfl+i9#Er3lj zQ-`xbhq+NP)NdkdhV~h0!c<<+~7V9Uqh1*HS&sStp=ic@9sl)hf z;lQp>tewquQmy-K+|8uoO+kuD>I#v|c5ausmtOg@YPZ;FmI`7T! z;!4&0&N~;BG*mOj=(S(3vtA@WZunCt6ox$JTCD&3b!{mfaK7e$zixNhyl_Of9aRMi zs0P&;(?iC6zc%rShW##ms*@_|%my@HWRb`opm6mu{dZITb3a2f zHqOd{Z%is$T)CV%tI8ZGH`i_sysN9cD*_RL&DBk`R^Vob#Gw#$rS;roOi8V<*XB!=fC`J>;zd1mf! z^d0_y&PIN9b63#%fHn91Gc_3_{A(C0zC%w4qSyV}=SG~Bff!=`)j$yRyV}u_l_dvI zhBk(tKd8xX3GeIY`_Zf`G>+j@40gdh-E?Q0u{r==jR0MQdYnqh4pdEQtDqh3wyGDl zcSQpfWLE2GP}aNIBvrHE+>DO(qCLu{DX9vg zC+>PM(NmWdl=`A2w}7Jx8AO5QL%~7v2p}u0zk?@9n^1;muv00!x@zHfvm&4m)z!8) zhwtbFKn1Ho5c3^>Shj1x)8)`$S%@Ximgvq(DFOo*!y4f~#xO%H=X7}ZPg2zwEz1*q%D{mQF#|S0tkNAyZK851Uyk zfD~EXXF~W_)G{($Fc;`g&r1BsnBnmOcD-bh%}YbG6?V#Q24i1)58^Y%gat9ZaN{e- z9n=#C6=+@QcX@46Hu>U=NcV9A4ppj}nY@Fa^zL*;EnSq%r_79qjFDe+<#~J2s^&^k zXOmLMv0xkQu|sgjh!lf7r68wnH$wC+$SIL{=kd3ETvnSrdz;foyGcJWs@&YF!PycO zVpe8mi_SouC)h-6Cr+h$(DE%jEL3~2p8fSV?zQtp|Q;8?vrSHR{C%pnC{|7!CL z{<;`A;Qb5J{W{+8Vw#=sDU2RlZr?uuN^%3;oS)q z&{gr-gC2feFOO-GWzohjXEhT=B}GrOW0su;&>({Ztdu40kfgpqmj2Q35>iN%N?b@+ zQ4E`$+@R)tELBQcp2p5^-S^JUZ)56C*E-Vvl5&;A(8O$FD@C+43?*V!ZG)u_qHEh-l5W(>C7;NdykV$pp{heX8gkI{^seit!LW3zQG-CW~8l*JvIhI zBBExqNLOy|V#(?)#P4R4s&L{Z4Zqe9Y}xin0NdiPrY8&ZOQ=qzi=k+NKgY27j zToFBd7o$l|4HulE==jQapYxLlVCm{cs=*q|X^Lm;ANQbck^7GZ$5g@lM-nX&)uU^W z_Te$gB{1YLOBwz_jy{|-fwNT5d%Uo#DoaseKf%g>#IWy4)1gaeL_MZ(P7xe^3n=ATK?oe^Dajb;7ixHRI{%do7P06n0`-1yJH(=M#ZU z0%gP&jO|~8UjOa0ll*YsksleR?0@a{aZOZ-*Z`8Yf`#84cD`IcT=)M;8^)TGq&;}R zRJFJpFBBAvD=RyWm>sC-G(;rXcJ;5df=4*VCDC*yCzHE=Lh^h*#65b~!|_KfpLG}` ze}7<|W0+vdOX*HXu!`KIdvX&UVp-Rv*zoH&wE!JlzwgQ=dv{7KV3dI`FS_gw-;KnG zT5Gt74KLFjfl0fG$WPMzLGAIbso64zv0ZeT!>E;!Db4ZbGgtQQFBGHmvpf~ovs~Fp z=ZuMwEQS5J!nnfaJmVCl4@(XyIb>>41robEj*~vW=E52r-X(q2`|E1cpBkmEu1-Kq zJUC(WA9U0%Q+H>GW2KIpzpI=2+^xeMYk5KScyp?7hZWEBdTyf@nAE%Y3B$33n&M|5 z>gF;2w(tsnj+q&6CRL7LI!nGnKH!%Fa?_y)NVLXJ2!}421~zizDhU{-%<0?A+l-P( zrBIVj-0TemTQ`ePDKLL?bpg zZ<@KDmTU69{0TIL@<%#fVG113M<0Qs&dE_^C!q0n^O{Wsp=w%4yQg&(KyQ{fFrQ8` zevqs8t%~#}Gg5(%etOiQJU)`O`Zs+$?-g`tQ0lnO`++%YY7)-hPE(NeFj=)N$Ew`l z1cw3S`yP_jsf_N_t~NIGXFd3YGG}N`^-n^uacX2F@^@Rh2iY`aI06Foi@REew$(pG z>I{j|@>e0+2KQ9rZE2Qt>vs7a;$Zb_dE1!`h7UIdiseTR`qZdW#sJm>w8NNbn)lP2 z0}nN#4k#tnH=5brEJ8@kJc>qdq>aaC@X?!Xjj%7WLQBk=>l#TX=I}>;E%cMzhR5QL z>(b~FnNzd5%y;Vb<~UETQzDn28j70$WU}R+P}_T~!ncUg;x=qA!Q@Pkr`r@DT`KaGw)q{89)n#@yYPfjOJw#6J9|H)Ye*dDUc- zcx7Zc^Jiz^q8OzUm4epgb)K=ImW~d=-@kvS3*}B9${~uR&GrH zp$hFXEk{45hKBmTNN!;X=y3-bild{*ZraZ~vgi-jgMZM6VX2UqI8y3v$%OIAB7dga zV*J0bHF2#K&!OJ%nrapTf8}^y^H{gBP0*Z=0wLf;n}3hWN~w*=G1D^VTGv=cT<;<5 zUcvM#-+QSah?gjSXVZ!Iv(U_hGkyR~?G;1|kEt<2VrF>`Q6nH;qwq2~@V}nthZ$}r z*4xBhyTEsf5>(iV2_?Zfu!>CzbAu74;2(EmmMHK>+*}Xx?;n&9^q+k#X`NAF*RPJR zsPJc{M@c2(lg&6~tDQrmcefhY_eoVEsz7;7pgEB!&9;$Wgz@bEy#T>VK?^=d6qJh6 zW)rbHD&tb3rF%pa7blbyLjwcf5F|nZWn|z#9nD4g-5w2Oidoz|JU%9U{fcWC(+^bV zHZ<@oH#y*YJ_MKi7z}6GvCH+1*ibMu6dqvkqCsc-*uce&SM~;*byD5>+P5`0&~NvS z0Z@hh@>?+QbJGKh=q^QFf(`e!j!-uZDk#jSJlU1*O6@hs8ya=|gyqSoEpFJZ84MBU zEI{C7^fQYftIywdeIboj=F%;43zX}?P%mLlphL1ysx(1ObFUjFa?i|x#5j$?w+TF0 z{bQy2>H{^knG|tqLJ^@gaznhod;qiDgYU(JBFbM$*}qW*wCTRGSP$3MF{Hhk$Z4<|9G?ofz$F>9P>W@LOVDPgdNTK|r9xJLyDrWB}r!;X%Qm?go? z;SmZ$O4DOu?|TCsW;R`#tRK15>+&c~hcs7e{Zs)Q?|1MI+ZSSf?rPRAdEW<73BD;P z42%EP72e|Glg@t4W}hE1Uz=iIq45?}!g~Fk)Pu2CO4PvAelS!zRQc5ZIx(b}#Kz>V z4HwF$ep%QtP=B&};NyMdpa!qWD-jPK9MwK}F2)cDg%f-jwMOS7?5qAMjoV5CK^)q0 z)_OrOBUu*zT8PlOn7#6QCWL)_d}v}hDPWC)=YhKnbb0eKq;Pee*9q zOV~T|BtuagzmFN#`oo)!xEG)EP1rD`c{bLty`M}>VE1@mfrah@n@TL5$+I8?bwJJH zUv1|dnXCwoLZ27A4cTUOR(AH-1$GjUB<=3btu3AxaHW(J-E`<-iGqpq2S(!dJCq6f z{(Ja}`$)Cj4-y>_e)BlBwXCI@5&nu>L*8O$YnB26J}yjRjhEQz#}@PIuBFJ-Iqc|T zJ}=`MpRR^3YN zDapT0v7#u7!ckBrzbpGLGU}c9S^t0!j>hec6fN8;uP-y^8J-3#17Y*=!!&*OqOtK8 zw7G<6UTyosbhxp6fE`4H7(!-I;HtjB-Cs}<+pO9L8>%OoCF=san-X3C`L>CI?eE;-|(el|1&XPQkVD>uGp`Qgd_ zDF(fi8H~NRC;0jdcS@3x$(sWALODfN(1XBKot{o|wA#k|cW=+5IpJ_MNA&YdI65&2 zI=uz=~ED0$2c2SE(m-`xr1zuBF!^eUvwDWUczmN(&rJE6p7`w0A1 zm>J6rp5vX%pr|6_d!$7OreY}m_Yg@@^7y?EL8xJF%OO+YcxKNbs+*j62!58GJP25h0x>nIIa~Xg{GP ztw>GkqdcPVGYu7ayVNoA;XUgFo^ zN17Rh^EzkuH8WfuLAn zl2g@$UCYFCQV_)n8?v|UZ>+ItUeO3%CUK6b&=7HoCHl3QrVO-=p|BH*90M!iU$S(! z2TL(X*rasut0WN~Q%$De1yiw`u#w z{4vNqfcs-VhPby{zPDHq>TI{e9MNt73>Dj)z>43YR&3SxNp;+X^+qe7l z5LOcGS!yF08;^_Hvcy-9TGcnY9I|wUI755As>5OG2nzDG0+5m2L5; zFi4jIFLB(8-GCAb-bmy}75nSr03)$>N%F!3yt0z)8-pV}d{u5~GmJx@4xz-zhv#fL zE*UwrE)#U^Hv*(dnL00c8Ck}OX+H!Rybh!c4VPAnb0onM&TH*)6FH&^8sfKnA1}He zKs{6!ks`&25&_n;Ui6`Y8v)5|yBWN8SEvA{1wWkBFn(vqAeDb?{mmV$)Br@n#vq(w zIy5&qqZV*x-S2Q5U@Dw9^GjU2Ofc`1da_z)mwI;-x)dyoaVfzgn088CEAsNaTVhc( zQjT|ot4N=Q(CeZYL@nCT%%#N!t^L*tDzz%G!GX*Uhg2O2)pIIcA!BWoKnv0HsAxuI z=5De7vST*?B3A+$&@A|Js5ZiLjm_TWQCEI=*xxtCfUCfua?+75k4OZ?f1yEYJi(&< z6$=$~J z2*Zp!yYZtyXL}&y&R_xzWZCr(J1lq&5PyD0T}d&eq?19ph$GJ39|^yjGc?hFs&0&Z z`~~=6>!PIhN5JNz>tvIvkUfl5(XzK^E-5aq(-PT?h3Oa`p+vBQTH=X4s{(Shn288p zgHgyi@f5-ygN(qCb~gy=T;b{Z?%u6%*mv!4x}#F~Vzjj@D0Y({Rch7KoT8@W{4S)bw3fo3ea%Q9#c)ZMCf>*fK{-|37>wcn*?dAK+QwKdzT+tXW(wj6E}G( zGmGxe6Z7G=)nr-Bm-#e{KdB_LhX($7`|l~QP*?HE2Dy3#Vlk+nP)ySx0pjW z=H1wMLp>98K;N-eQ`UA0g}yDW5bB^G!$Nb_g@;bCg_NBw7d4Qg|= zm@kFJ@ho$l3fLp0=_+qxV%nt9Ns+p_xs)R-MoLuD48X{;>fN`v&&H#Z`uKo4&}chu z_21EGfr5d$IjunLtdA=7Lcs+>LSq&Ko}XXH1NOLsb9F>{l5;nB;xzmoGhbh{dS19+ zo=#!2^X0D$r@NcoBzRkZl0$8~w^kS%uzh82lrxT$pRQV$7W*9b@68R>w?p$G$?|#0 zy>AxQ$N61#5Br8gmFYFcw8OLB)X^^;&28Mg!H-c@vD)29CpdQ~5PN)Y74qI}0F90W zJ&YTJK$@F1zB1VTig&avsyHUf0wk}qQ|>3NCMHyt&bCa2TChz&)x^Ti5(q~RN6v=s zK~x5(VJB*ff#}<&X;LTnv8JfrBy}xnU`Q`++>({0^)w+y3VroC##)60&+4NLZn-hp zX7F%h^p0-JV<2><&;mwl=;}P#oABClR{9+5=hOOlY>|l2z`xv8^ckqw`7QyO=BsI? zfA907;c^C8n4&ypteM}?hT+Kuwi%wC9(BjEWQS2Wv!{Q67boJit}y(;{>eDTk$N>? zio^fzL`fDMZBhJti#HXUQ?8JE2)9qGp|rmOzcO+YLcC}QMSc#s`-}{H_oSSRG`@iv zz{tob#-?dtpvb0QV^gZ>uM9k}U#xd~g=kXJ=etM0m-MVF7l{FN76t&FjOt}$Q!~l% zU{5RVm@e@j4e3!-c1&JHvPF3OIv0C*Kq)xk^2U{311b|plT-#C9~ujb;YHEu zeZ`%ZOpoSHl75wDLN{!VSxoL>^ z4Hb_>o+ER8rhLT=`u$zhcIMi+Y!?5sM(ODH!I+U>u~?IATTylg`&DG3iA1S4)`0;! zw;v20_m0y`@b-pAXf{e0)>~#9lhuqN$7%74Fr}lm_JrkeRwu>4As%Shf4VM;j|< z8L!_WyMhRwn&@M?q?-Xoy;Q&GC~#$X#ioIh_YxerVg{N3o&E>b*4m*7oX8FZiiLPK z;+hg(I35r|4;RkQVCstT5(>&3K znUExQ7a2~L@zN6ON9~-&(Gd@OUtcW2%$`!XaBQxz%n|7(muDIy$sjKM6LQAAY5Dqd zBLBd7i&v`Wj)4-x=f;ok-15ZeLk)%OK}5G_in1Mp+Ad}GM+@8`e$gYpRJ;HNSlv=U zKC;|nt7cuKkge!SQb#Di@QP71>rBYlcqaPmZ>O-c?LFz>9$GQq$wL%M3__`d>EAc>%7p)M)|p%BDkM!^0> z78#|sLYx861+chC&A_%@L1L(J$2%4dy}dq~3TvXCpw6x?Jz1|t}2x1^UbzU=w^bQmaqeS^g7!ePJQS=OESi6mk8{& zc7gIcg|ak+7VG{ESxGC+Iu=oO&Y&f$5NEWyRBJ`kCsg1;vaY+RDB1Vj^WRS&Znn-2 zZ%SI-e~IfVNP5V6mSDNOZzgTY2EX3hrLpw7B|B_X(P8B)!ndT3_en3Tl=qIsG34g9 z5D&W7S%_sj4KK`pg%>wvULA}pL=Yntf$yK;UQN)zs`wh5LPa>F>qG1whOAG8r6(>L zrsb-Y6Iwqf$PhixiCjFO3BKg#6%HxLbz8ANXsN4X2|96yg-JDe z?sM24ThyT~iiQxxPD|^8st^kJK}L1nIN98R=r5F}4(H{l02hAd$TBLRW~Yk0^KNDx z4|t?4fBo>1SCNvs9))@2e)?>3QeNAtp=qCOz-6?$pb3~(>mzEaUhTAn+@E{0$@AQJ zCL(l|KPvFaqPlv)Lw+wF1#hL~ZL0r@SId>gd4HC=dt@FS6zfHW2@M<7NkZ=JW%x$` zvAy__jv|i-kTV~Gt+8gVx8AH%O%z(Y7tYzp!W_4?Pl^C;8DG3iYifYW!7iuEp2 zgMo3&slQwoh@M}gUvpRlred7f$FsyyNn!w0B{)%0(Nw|+EX-J;?Cc!Fxar=R=vcM! z^p}~34M$gskFb64NW{gl&g{D^>YJ@7e{jTM7&%0U`5Vg7uNtg?v3q=TaXE;B#gCTO zXfj(~!k;!yy|v?Wt4TR^>~eD0;*=m<72I7l)$z=q`U(mP(b3U1&XgDX)2;J&0|TJ5 z7|vfqPL!aB7MgPJGDZLv7i^VBAXhE@Qf|-Fh_f*Bu8>4hu#{~F~fACrH|q6;ld z1JUHZ8G{S(cVxN0nOYIm`Z`iYo&9hxsQ>SKmmUSuJx0Rc!;KSWeUD~`Lb&il^G#^P zp*ba|jqWE_A=#v|5bl5iRFkPah&*x=ti)JEq!LC8O~EIW_LW45psCd`tn6R#sOa#absDFJnOl-JjwAa>5FG7V}n zJ|8aY`cNe7g4og^@rE8$I|HYlGt7)G?m!bw#X~q$Q1(5kf607eq(kk+gv}zclq~_s~1yEQI zUS=O>v{ld#bE@%uAz{t^u9vFa^DZX7dKL_MpzcVp*9(2nmwcjVdW+dF8!mQsqtQwB z^y+yMIp6Ew8n@K3X`lY|)iE+setEnt>hGs7Jy=>^K9sy@yeh$LYj4w%vY;90?~kU* zQzj)Po$G=Em&=jU2i(@_-*_En=>N>Y@#86HLi{gy+1c5dHJ^?7JkHyXIU>Aqc5zK` zzjV*_oX<;Fky{=gI98xa&5xY_sm@}AgSj^wDfk`OIw}gcoIHsl%{gi;^vS9P`j6N|0 z0FzJqTRTkUOH%}B%DuUe zN?jZrRCpcfN(GdDey8;o=xgOayMu={JmBKA_ zE0^@<>XFCKsRyV1^LuQGEptw|iyK!dyYRV z9pUx&cUajf3au!<#n`})f7UrIDJiP(x*;LsEsg!Hr*m;%NQ=_`hEW#I8K~)j#sJtQ zsycBH*^5k=b#|;4JM`TmNjrRTXg80|5RQj;YTyTMzHp1EWGpOs1}`oO#DagR@`9EY3D5O% z3&DDf4_!p4n>p3*f0(Vl}3XsdM84ST?IDG=UORax5Vd>4@p2h zEHMLp186&23PPx|#ihhXO%0x)Mib^IFQUr1ui^LSC+mfe8g6BLVE-%61{(CG=NCbx zT-jbRyuBo@Je%~_`JMM=AzuSIl|2MrDVHg>($V5QJ|w3P7#3s?=!z%&p@*1~ps{I2 z^b+k|g0=()iMbh};=Jfyc|en^J>Pf`z93(dms^UwHHnLENuV~%%tmNg2*cl=&_O3v zCw9U(ieX*BkjqDFg_%#I)bf%$S1y-%BJvpIYWE&+F)9hGR8^6-6?^>AX}sf7yO=A5)N$59toA z&7sGc(`^1eFPem;!>KE|LT>s1#AWo13guS24B?WD)>b&H?gH*`_@E{?o^6D_qv2)lJc z?yy(U3ZSn4-8#M9hz&JIgwJ)0lGi$Q)xvVViwy!(DHvcEr0+Yc)k**aau-bxkpSvs z%R_$!PQLSH+?;zK{-I8pQ?M};#AnNbMsaiYYUF3}iBS6;Elni71+6~wRj9qAvUE?6 zi6Oi(l31v6Cj&a1f&b1>tqVQq(;IHS^@r=MjM4#USuc8`TzO@sVt9X*k>=$xw zN(%=82Iz^T0U+3JoIY;^WDl$Ein3~$fu(v%zt@KUQS$N<)yCn&z-+yl`X4b21My<= z4scJ%^?9^*mRWh8T^je({%Fzl;hOV2`wI|Q+qwGST=}>p1eZ;b(>)QA2=2adZ7qMT zR{i_C>Z<$T9NDW{*s!i33u?_%8z z9_Q(z{GEvYTFxsEXIfSd^-1RMIEFC6+@?o3 z>GHqFxVpKr^mVrP96 zqutRqX}H)dz+aFt$;79Yg72bp{?OO7eT!3s|2md~EO*l#jIg>ZSJeELgRm67IE)ov z8c9dz_N7~a*yz!Mpa6T?j0msW|GaZBIz#by{*Ox3?v0JS680%_;7uj$uaLd{8>vzc2&ei-w z^<{Ufb`QThn9dpXi_kJZdnVCcav6BdDGN4mL8%|WAvP$_KR#3#k>i-jAX6=oWKwv{ zv$b?3Gr)N8{N}bTG2B>sw<5D1A;jz|#j;WUrJJLO`oeaDa{RKoKYAiOqKe)kGI)^v z(+E^qdnc&6(-*5h02Yt6i=@wkTZ_yEXbn%gqM9T7eK$RP4neJHASaiWhMHQ*?eT)A zc~K`jKO7*a&`8Whga_=Z!bBE7dw)fsuBCrfelVVrTnH@9Xk(D@E|oKQ5+Q)Y=6I0s z9b7=52X`m((mt%Dw_pk3z)6?*665nG{>!`{fSmqFIp`81idJO!>}(_t z+@gGzNJKY3vQ!Z}E_Le2pAalas`&S~#_K`(AItOv<3NarmQ|jI7=2)*fQN9N1g0_5WUg zJ4#Ul0XR+c%$D}|JwKm}Jn38x z_Txb4$R+zzx5Q67uk+^;M&M@f)z3?!^H+V+>wD2J45smEWp1>e`Iqd1e#u=7Mr6^{ zfqh~Vlx_=jz{t0JFW@9GFSKWvfs>6P^xiegAkiX+Vc3v#DZ};M9U9iBJ(gdX+abLS zPOe(9POs}p1$FXnIKQmE>|TcdyP0TlOih*JeLxofmuYrdx)2d+QTvdZ1UjoEllfqH zI43OfW%Z=GiR%5EKSK(55Jn06LShaR3(9~x|K;V7IRpzfHz-53R49wBkauvzvKbLP z6CNPp%J&y$TpZsHgq2>si$vXO$pog-q_2tZ(U2b8pgul6_BBx@Z7giV9L$G$) zQ?>6))VzfM#Z*rm1bDj%`1_e>FGo78LfmVao&t&us9t+lr$(~51i+*O`xBZxd~x)` z51}vDrHhgM97!;C#@R|b6k*9A2km#tI=EozD_z6A{nvs0d(18RI%CjPsGtx*1U-OT zfoykY7uDOkeR1)C{==!&(be>)`KB^k(CCHCZ&JUn z+);M9dtNazA$BpO(O>I_1rwS_3tpMM^{2;s>w0Pe|K>%6 ze(!1jCf+JWbVCv^O&^cmtZVXmDB^cTgC8Fh+NN98gJ4eIlzQ>ScT_A6f$)ocvH4h4 z3|9}mVtyY2g&Q$oE6x4l*W*E&P#X5Kt~F%uDaTjw*!jFAq3{<_rANnmWgEa)!SQJ~ z)7XHk37#3gia?VCt|I>*+ApxN0ZKYbw8gNZQ7t7^dtzGmrlG&#sW{y8<0z*XB~~Zn z%~uh6#s(9?n#k`t441ouz+0%%W?Vz(FXe8AUkz^_f4hry^o`}o z_~thRkKtRx8^QA-f1U0GW>Bl(xknBByfBfR$K#N!=oW}|oKSG#Skd4A^^A;6z*r@%BVD^Yo|MB9Nx*eQT!1Hp;8Tt5nau1j(-iWt%^fxkQ?hmelAr7Hj!# zWZ#a|C<9Ix9dMfT1|BbomGmg3t_8J|3hdZA6-4_S8+5)aequh+st5BE36_*pp#C3C zXTcR!+qU7EVThrnyQD!%Qo6glOS%zhn4!BRr9rwu>5}e}6eL8tyZPpM*ZO_|i?#Ob z``*`ioX2I_FJDCcy&e^2*9}F%&&$R7MKRG!*+Y-IlBaBHT&x@xFu;D(I6-z^S zcz6o|HY}qtxA|5G5_YEQN|nUoS>XI^q%#-QgwvmVq-Ip$6-sAG+&cq9ZJbVb72dR< zj1@$D@u|Gj*vQr7!-A`9;n*C3S`TG+ zba0ltgh>SnrR>=1`w%!kx~qUGu0SZGi@S?}1FrC7iTXC0_eUtziL%>z*(S53Y77iB zA7|OsnKi|lD$?b+;;9rxhAN#&&Jg}cc&z#Pq^=#@i?gauBz=e+G4~4{dO)!yg{h<5 z@_HKCDRHD#U!A&SSr_PtfW~Gn2U0^p#A`A+@)~%_ga6aV_&Z8-zF>}S!cM?h0M?J> zH~p^Ie4#~q-aZu;WTx`)A*ZBio?d@+gi+Y~P9T8Sj7rOtBYQ~Z)7`{c_d3l0QyNKv;B)orBryExga_<8!~gqfu&^00$*`vR`D)}3iLd8?oc<|PizaX3me72N+vRb%Vai?9HNEVKlU-|$1%_Ji zcv@us(sPG6VT$)9KTyJtRVlA`qRyb%)y+EcxtP|{vjz5w@V2a|RygixPx_ND@=Tlf z8=-x#w_G!R_)#d@Z}*n1rcpEkLhxm#of0E$FU+#F$9JYikErTsyYPlCu=?dU;0e~A zs}n?-Y&Fi#FaC#4#UMmpW^i>$Qo4dSqChoa=j<33Dt0MV7aJ92mk2jI^f>_RzZ_eY zLjbHK=<2;hvOI0Q#qWvqy;b+#G^K)JbCmqAuIYUv90GJTh(nKw~<6OLyS|WJlG>8aqzzBA-nh z6K}(@d{pFBGugO1m%uNEwr?Ei1WIa>7)3#SBQC#l_`-MtogRj`)$eEm!UZ|D;$q^D z)(tXkd4N5<7vrJMSJOvizJXSpoz0e90RjHzU*!Q9DhSbefcU>>meLwxre?pn^;JIb zaKWBdbG&0sXHgqm??=hGBav&coANC~dcbmGrf3kr7s(|Fg*Y7ef)7~vO7y?K*E)Vm z02pA?Ovl(*d9BThf!#&_64{Z9-A3?$g7Rlr|BTN!qvzMliw_Tyj>cTjv)JddCE-Hk z+uljLtJxKeHlvgQ-`98ZPXa%)M9+opcnT^hRiDG#43bj5Gi7Gkdc1D(fyy(PlB+(L zm7eBX>%B8ogB-KnIF{$Wxl+9XW;=~D{#*;s3844FGHXPx3o;l(u{R?XpwFC)rahB8 z7W)y`KT$>xFvjX^ItWt7lL8_J(S`o$v5_U1{SS%D&7#Q??!fxz8DGQ*y+yhNB_}}; zks>&R-#D8;-W*$oV+RL!*%tEqnCW4pbSLY8dLW3GXc>52`ulbP@3Qj&rQ$~z@)$r< zWdL@&qy$XR&`=)G1HXca^A?-xi2eYl#wy|O4TWmZJe3)MU&-epW>UOVcf_TJMM9p7 zSoUQ5o?2aabYJ&+gJRG3o_al;Exgn-=r|5{?HK^a7N>O*$fi6T*)u^zs-*5s+;nBA zqhIJTV zJ3oX-6MNg<<{jmYER|X_-|;G=m|kzHCj+|z{VL+6+y4CKO9{~qC((y3kCY^SaoEL0$&>GVvSPY>98F6su2o5GI) z2AC$s4%pcSq&5+BMlyXTeK9nheGGzhjM^h?wnh24%0&_PfZ zX5p%Q{myo*vXd5&ed0Rm2QQBfeE%bTe=j*QGt#j`5}9y{#~#LJ^Jq-w;_P!h-NPsJ%rtOrA4_o0);xDf$xp6_y&f+%t=wlZBrYhh`tn zL&`10Yz94_*T_g{fwF|UN#I$#?ct>HiHLGRJn1*ZNnnrq9s z9ytmN&ppMa2rz(6n3WRf5OhNcwxkBZiq(l zKvx-8=44X+0dCu;7Et<|&Scj2xMhos)_Tn!&GitPsv~HZxhcq>Uunj?&VCdHgR!#y zyoD)KdJ+syo4U^YEV+$x|1_R-SjFA(#z*e;A*;5%jT3b(MF0yNO$ zjWA36WxIpSbTRc>xvB>LeX9U(*%K>kwO$$!=ySAGZ7E7z` zg+$ubQx^@El;`Piae(g^O3wnEWzFcpClcPG-U%>6c)D}z(N3_@X*m=>lfh}ps1An8 z+7MbtP~Sbat!UQvyJlsli_6-})}!CE6YA89C#g)B;EhC_N}Gq-9L^y$Y$KGxZ@`dj z^E?6$=n`24cdj~S+^GkE zdFdb7PP;cq$@UzjjR%ry8AoF5--j&o5jp1nM}7Q)m=8~G@uSj7$jOX7!&05NfVM8& zk#0D5iwK8AL(-Bik4+L;G!z%(@kw|an@ZLtgBUo#F@@5S*|J%Un(6;|VC$oN5?%8G z!}>&kT2!I=!OqSC6)={RFP@kO9;mBj!pYp#pS#E|HdoqIx)@6n>JD3re^!EL3qebP z9+%sohp{&Mho>crl7Isic$Dc5L4IvMDKE51!>}1p&FB=nEVW9;Iyc(uWkih+%8@2J z^J<{-Q^cJ=z16MH!+)fxXX#f-`sf~I{=E?~D$=9Aa^TO~8y1UKOqs-@R3^lBJ$0Ef zT;-z!)vuR@8Cc^On>sf@e#pjRv=2IcD5YVBtc!C^;S}bi`7MW8k?x9_sF)xSfC&n~ znx2k`4#$@2+<~i!eo{nz!P}X${V*G8v?feMF+4VAdE^T}J{-3&E8e=^8`f_Kh2^2; zkU1I34P&RLr@uD>p&aPYlN-OI1;`n0yfD*rzxHS;vh`TTxg*$kF#iH&CGWdV(fIIE zsH4-d6vs_*Ss5cQcaUQr0+!K^!mUnATmdoUQ2g$ny&tHhy}hv<;h zaYPJ88|Md|MRSjuoPPIP(?-5NYqo8)xtwC6(+@)sqkxyJ+9#`K_Te6?yY&=GdHBsy zqg#&fqRxT;k!B>swCqLv5quT0;Zhgi7=b3C%-=>0LC5p^O3UYYP$}nj{s{lB4(_6E zD&h#oj1{9}M}A$%2LA$bl8FNmbKaB!Y?FnW3+1#}QuZq0h<_Vhv*5JpD|cOR!X+&9 z?9odq^%my6!KXZ0)NtgXKp@|DpOg?dqDHOi`|0 zgsSfUiovuj{}qGPvbqtLN0YG*!VB<_y6p$z7hGDnsth}|3h2j?Jn;OImf(3TmVDRJ zD*_%E-POp()L=n0mIYyzmLw`t2Q#v~B1Bdpr5}TtAt-$@&O8$(mEfUIU`_L%^9?P4 zkU>mh<5T0<(uu&;*$QNptmfTlvAJ-{9rwnG*%}pu=xdgynjGWx@$ZC+!33KUwCxa6 z?@dI^ZN8tgz^-oSYhaCnq@*NIBVZ317U%JF=a#D`gWFb(6-o^h>muP8Gxl1Wr-DB- z;#RmXL;Ul5EI=wZizT#hF*%WpW>=3Ym#449r0TI{PqJ4kh4}ag`lq`oZ_)5pq2E=I zyJ}WhzIOaAJ|EaL@O62l^)=Uq7}x9%?I=|!Jzi&up07TI{nj;pRU3S1q%me%oyhu^ zJMj1fAHiK+cP%jtP`n+PPB34iMk|H6S>&Z}V~WajyynFXzts7Y5*^Cmwm-~VycGE3 z@E2wcHYsp&>lBfUru^I*j!FSk;A_1zjn)JZq4RUW2MYNwwj!;5~TZDvv zbYY(Gjqc`uf0DC}qBeeY_S{L=*I>X4z*0M$WfuJ05 z+6e)Xc*ahM#@<^CDD#czJEgecp_%0Bx0io~ZLMp?(jr?5!1 zTF$fUgK&3WZxzf>FA4Gc!y2sblmX*UZx|k~LumBSSeK`AH%-M14XoJ{Vmft>Eb0a2 zkaniXzjOSIi}_%1)J~VVbB*Qk!b!MsXe*wBKz?tFV$OIy>|F!_bi#E%Jt{p+8}Na5 zi?5H1U#Hos>Mp*oEvX8U_nq3mpv@p!m^o!Ox`;?qVtFC*Zkn30KD2^pI_iO5R_#kI zseYC%9q=tK0al0~UaU3MI=T?$gbes+nw-*GAS`8)Ae0=At5jDDP46Bl-QV9g`Q17% zAb_-f5hx#jCoHST$Q^t{oXk(a*keRg}f*Ey)E&(&Zeku#%{ET}yzbiiYOc;3pW!4m-z8?SZI^c$3w={tm z_>KlS_wQPtrLDXt<6|%kSSBXQ9D3hL>kyHu*iegtCyFtiCuqBAu~oRW6_5Y;Wl2;% z8r<-WA0mcW$1xLv+=m$#`T{*wiD1Db07Sh(OlTFM{N!|vaIk=VU~6jtA( zY&7WMwIh9pU+jE=sKR)VZ7r)0!n{zF7~OzC*Z4xhrm6|}*CR7`k2uuGK=IYzRah0f zyCWbR1+U0f-i{alBdrFUyl!1GOv#k*+vLR6)I=rdMJfe~Q4wwV{*B|~_m=dcz*ezj z6J_3G_{P*`-b{`X0+8QNs9jg2*T!Kz2Yk#4HeVo^YyMtgZ2ny9xN;fh1EXh+he@ue*ha_g&gJEWT_L&NN20=@c2OlIbkBRu8uU{{LzWs;E+t*dzFqav0Xw z6_RAW4;6@9(>JWeqmaBbTm@6{?42}X%D-?j3nIM1%u|0+!GsFvA_?p6Q zj!!^-j9-Rl@R2I8nUf;{6cS7#@o7*7Z|hhAk(k`}vozb9Az#|OdAC68m(~|(d;V|S z3g(nx8vt`&qEJx3!N|aphR;Mnb$m z>}c>YZk9QxM(1+7`C2bphRMzT1 za|QMijkkBrA2$@WudIp))$eO3F-k{>fnSI>CE#_{I6sZ`r~tX6B#WWwW111{dh@kS zMV>fuoSp$>yij|wa0V&YizdFIq;sg|0F&8qzUzuQ$`nj5&ZZ|W8{Cuv%n)Z_p524% zb}+V!{(-_G88Nd>q#9}bcoK9%s$OP_o>Acl~6Udhhc{%)gU*wK>EK23WM_*OHHz`}@-!v;6dC|5KSIvk-UHfQ(*MO+0{0v&w)PVUqhjv z?3sic?U;{q1cI#-_LM`~`qdrt30no0lH30#L` z7`T9}o;zU>8S{?UAD>cVF|jr|0L-r^AGC@f;QT~s8(VAiJvznOR*z_TX^HnP*6MJ) z{r_12>SHp(ZRvr4A~N z3)Fy~F94WM(GuUM`xh6`4*eF=WPCJ8{V zoM5F5=BOWv2{1UqqSdDf=2TZgrH>w^=39sx8tO%rI1?=#M?UKArLGUZn1OgyG~f#J z+W{C;iQV*Nm7J;AFsJTVos9%nK|dh~LXGYV(Nt*GN5;^EMdj?F~mQdC^~hCzwJl z$db1cDdDsKQd6%6YnHeAf9SnIFq)W7s5udyUw8xmUH9n963#{x0^kWYF=>aGELvgo z%GAU>2NXX|+t1_d&Ui)iOLR)7_s{j;y%KoD*lgSyJW#RMF4H5cWY&8#+ozYP^sh_L z{U(ez#P#dAkESHJJ}jCGs3f`D@+?U3LYjx%KCo2_k|!+l$hv59DLS)U(5?<=7jwC@9c@9O~1x2trYR*x=&+?!OM?=_m&giQWW5xU`C z)4}KGa<9PR#L2D>=eMofc)dVg4Fv90!7Yb9q7UF0W6-6O}-5U_&X+{jJ;3_w@BEJx- zpSu+i1z<{R?#+`o@}swKFz{Kz2$a6<-Wph-xuky^9 zs0IN^{5{b#0KEER8-H~c48s-sq=D^C=`DIE;0-;)khvs1C`@z@&*R8Y7ZK_D=%~T| z$7JqQ=9+}$>&Ppl%Iok>)we}nEsnpta2-Rq z^x^%>V(;^J901jdHbS3m7JoIuL)3YLws7D)My)BHw_!g8%}6O!>6wJ28@d%{0&oUt zfm)dIajz>nQrv%wTu zDUwsQ%mvNOI&(G=JIp&5l`HdgOYlEiXXTFw|LB`Z|1m#3fS=mrW&NhQV))y>q@R6$ z0i&pwdtj+521CzR)|_Q<=t+GZP8sHAhx#F2)1Rq z8vN1^K8fu`9Q#Z$P}wY&yi=(6xq6Bc&e0PuZJ;y7CYTvH|W>LGKzA<78( zg5XH{eZugUla=+T2!^?c^M8sVnQO&w?=(^O2CC;Wx5^d#DrYf2bS^Oamj?x;&Fn@v z>`y5F6}U6a&Xs3inQaBE^dXoo?mT{)*4CSUGAti*=SFHkF$nIhtx<$qth~@EgwKc>zTIHNGAZ<*iqj>h`rNWW|~ftDfOOv z8aGRem$`(ry_I#=V3QEJ7@f!30h@USw9?1q>hs2$tm}>7<7V~gPLBQgDQYjQ*DRRP z{Nc_4r$^xgLIpH?9V7_RjR=>yQ7IWOMo~aHr-sMeT%7hqcU8wnBfl5(EVj1F9hy(L zIlQoSN2cHW6aspLaF~Ttp&AbAn)rmV*mJ92e|sA``ZB?{{*e+vOgA5@F#7S6g$0eK z3Fn&sdcf^@KZh^ror#_tXos1dQc-_-8IK%S(GyceIk>yD2&4UbkiB4_8KD8!hp#u2 z%!NZIS^X*|E3Q*h*d}x5&qZy%1-AD(tKAtF0e**4zHQDejP4I-Lg*)6+I*FCEut+i z-aCK+3%$m|6s*U`pPOS96t~F#a7(>g0DtI4dPR+r3n=@zs;mja`#IjA=~a zKqUNS2o3=1Fyfa{EKmKCV(4h^8i!Jt<$2D5F=du~Ets#D>U&^Ql&qUV$}{fnt#@%UlxV zhE0baB?aq^WpEa=!nuR5mCJ{1j}_MtWSQbfC;+L zGzrPhl%LDcp1zUzY{zQv7D!>B^`P=2A`Y^?ASx!LfX%o~BM7A{F*CDavt9;CN@EWGeXF2`QX=8CVqBrT zB$w^sFHl>Dy-?@7WCk1-EyGv0SA!fy0lu#IC+(TLptDWE-xUIPqWpeOhYpL2CTxpNVO0-TY3Z9f{VF3yt02YZnKr;!xE3SZn zU}uiyaCAS!c<#U0ii^s@)$Z-A9+Ya89*n!>uE`rdqc`X-eJk z9hYwgzF{S@NRjMXA*HcIsqjH} zq*bKTXGhsm&-#i!L9avtkNipm0)lPV%+yEF)1MJA*QG$V$>=Sd* zLuU++)-&*7SagKrH!cr47Un-ERDmok!#nu}-O>3skoz6`*0dl-YYxTxN8TfOJv zYN3(k!8El1J9ETMYXWoC{y&kH8cyqJPJK$+Dvf>Z1y_Q4>me5ST43qBmVB|qH<8n#MmEKF0 zuyD1REvd8Sm{FmiyHDVb-5*M&jc__+fhnx1jyr}K*|VV6_-~n_BewKIYf3^T!sRBp zlhj5t2mazz***39;5a6hqS4WFEp474 zc+1WeHk7yfZ})xwT&*d=_0e*Sz(cv6-Ip)FlBziirb6V6hqo^-7L2lCoIY$JZ2kC zN}8A!UaSkGhP+y$g-_o{5myC$ucQjj>8wF}#G6+Xsw6Rj84Z2D`F27bANy!&V9Mzk z(TgTUE`Bf7%d6n%5`cu>*Y=*UzmSSNj=ElU;H7fuH6r5IXk#5C0sDr%eej#g$8jKUEiJhKUhx>A+FU ze7uQpaQxgMLisP;8*4icKd+8jp;mOAElx-bVn6orARD)e4yj#H$$%@h>#-G)%FNva zO~&jK5m7D0Q>U*|>{TQKw+HtJ=oD8!1K$1qV1j(3{$L-G+JhB|uXZ?|E6&ZakV7o$ zdajw(wbZT1_1C6!371y?-yH0bbU~S&XqYxqSm`J=d5e;&Jfndhawnj#;n~D8ae^=R zHC$@;#GEr$`%fga=bD$qCVzsQUDdpqc38gK^Oj!#LT1XSYV@bMWUV#!JN=T89T=-V zDUwDs&MfjHKr|SxVl2@0n*2yV{%`)T08>@@_%}OAKdzKAn+UaN$Q52xPg>RZ*I`7y z#yEarv)P6I@oaNiG)0GorUq(72hxVR2KrBmEL`uKKXM9MYJT!zUR?U}O5TChlqtCK zyMHMIewH#V&4op*Q+>tAv@R>HAr+0p9H$szGgi|Mu)K8)gnH*;yY~4F*%aBc@B5ck zp6`IE9CQQN17H73fo&XkSo}oz9RN8Li~5=HZR(Zjv#JQi(S`PF`6yX)f|1m^Vzm=z z&(xdldPg|_e8MKvTTN&}&DUno?g}cG&XbQQ>tvJh5w$h#tf^=pRvJO(PI*)Y?9Mtw zBdb;ZSMw@}9K&LN(c`$iQO)e{<}oaZ9T2szNY#U$^Ti~NwRPGCAe&XJCgF3yZF&H7 z)UB4(Pi-1^chK9I@cx-(wiYYZ$ z#dCYpc5M315--f+sCxWA-6x#{t8yH%0_YIs_o`I5Q;&2r0W{$ewC-SIH~2c)yAliy zPpSTP=d*B>h-5pozLxo~zI_l0?)l({t0;Fh$Bc2qrwdjrR7~ntp00*zc20_BUn4a3 zUw=v(`(oZ1jOcYWr`5-{j$X>1$@blD3Lq?luHj4W${yYtaBt7w!C6`E{P`7;UajOK zWn$_{^vTohu?zD>ec-wCrt`qGE0S!)nkMM)v>Gc;?W|MQBm(L>e?yxutBZe~o; zi7W>DSj+Kdn+Szd7->pRIp>bXQe-=-86&(rl!C6GJk<$YALZ89WPB|3Re{D*BISV#pu z@!~XU<}`ItfBpzY{8{3O(U)e2FI5db;m*zOY-&hWVJDG9wkDkW!4!r*z)GGoF@Fzd z?4*PDl!_ipG~DvyJ7jO+dzZ6SxZPZJv$FDfy#uOIj)+VQbr$k;5=i9^E0E>}5BygI z0{F>ubtQHW24^K57+mv_jlz2QhTlWIT}1+Df?sxr2+kdl#zUA54Xq7-hbg~CHH*Oe zV-|15GDMpTGX~I4bAE-CkDayKx=;O}0+uBowo9F@^V23U!wkcO&h;EP)B#l4@blUcX2COx{OBLuha>C9*g*f3vW3MsN~KB`B>UjU zl9Br@Ep@s7IK}@A*LzPIAHJ8xlFkuIOZbRsU7tyK%g_>gp9a$6%q+t1ZDwuBs?1Q^ zibo!jC~N&j*)*pX^4_l2xJO9hRJtr7$JO0dmO30B2Ugj#=st61S-Uu#*roCVeRe;G z{Iqk7790@KXRq78fO^*{=u-v_AP^(TI7WpQOd-3tWez)*d3o~o{>Tx zxqiR4Kt7Qgo126;+$-(teJquPS8-Pii!&ANa1Q1d)`|(`%*_46otoQi^P#iJ38|At zg%IV=4fxRWqHKInv|ir(GXIE=ZcLXK{)C`l=7MP=s)t7h&Fy@6@gl zk{?Ve^`YM~7xPuuaw`L^4N`WF*8S`uSTtP?f#|onRNC%^LUEYs^t}1P&3HEg+!{`I zgPc{ZMc6bh1>8b2DO(+mBg-qX)H>3Ch;zFrnWxC}^Md~O|9&u;h>JyV2z6(C0J`Gz zDc@uLNC~xT{l@hCdNV21b?`9yxDJ3&Q`6E?hth_=`zVPb$k+mFzy~kWIl2LpqFaIr z%gS1)3}Uu4@QYbdTbe9}KFk^X-uKA@wUv*u`S=A? zr-ITtZ7P^{XT6dJS>GQ|O+^(?s$YH==`O7YUK;Epz2NmqP!5_Er1;33`QV1BVw#8$ zFJRQ6r{0?u{pEFgbbT!H~!-3mFCa_)``!3v7FwRh`LXLp`J>Ad@OQU zDY|_9iqwRHNb))W9niWxo%?nIS*>eXMU!0m=i%TFev7U1p2wL1M;+lBeg^BH-=%)( zSB>!=%fmuK8~#C;;xYw!`TMw46LEaxsmP0Alb(SImwd4`#c0YHD&FGhN`}kAzvDm8 zE6we>7c>d8{r>r8%_+(vzj_UW_Dq{#D2;cx;MhjT&B-x2;9p7W&F-y{*?Qm+>b==m z#EVbo`!lOdG%{_jvs};lqrK;w;^vUW`6GvaJ_?}e0k)=+r+b+bjXHQIbpqVFf%q7E zySVFP3W|ClB?;W{o7WFGjujVnRF<#tcZO*S($aCEyllKgc2Lji*?@K^t8$3k-w^Uc zM{RLn#QkP^X#@E+se~VYN6kxnUbp^Ca&>#>IW|*K-Ih;PGT2<V%xBYSzb2_X zkQss)3MkCFUn84}?%tyUipgLoL8#EcTX)D4x}T|Q7{V!eB$D8kuZXPs(Bgd;ojeVg z40;y$MVOsT)0trrZ=|QW*g+@z_|jA+hKV~c*EKLq-N%OQ_S>BB*ATl9LjhLN1=#G2H>?Uq{W{#0u#o5&WfcY z4kF!E(}wUIVP>;LZNwd?E6Db2I;Z*50{tJi*JxiF+H_tM$^;Uc~5m z0T767>4N0Y7ct3uqc$hRg?ogwo}OaM9|};rTLZp7@26Sa{5!OfPe)l$ohCGSeM9DA zhk3J1?#C|5R*}o&E@_#G_JWH{u>2w|@H6}UNRR5wRhK&C#(1)px8gXj=7hN7#q4;p zjcD!72Ff*3(aJUlVVSk9os;zt`tM3Zn`P%Gg@AfvAN#O1?$5AJs7m#;)IO*z&ET+3 zsSyGYrndX*AYByc3{yy;J|E*7ZxU^FDtI0cCX^EcV0ybuAw3R-eEkT!KQBPx<^M8D zhDt8+c-B8HuyqQ>ljo()&vju+f9(uFz3u@1YP<&Bz878Be%@Ustj(kmq}6)HM#+uD z{BasdfSJGz#JDLcfig1j>A4^%jq%y7L-S>3!0_@cqqLiD`k@_}xtg zt@6r@5=X4g(}p~Dbh?34X!PDnCZdllW7jN;EWbOM3?HA2mDEEv}k5oiwrQh~S`S$_OfhAPp=rz7}nXTQR@|JEFiOy(1mpC@=g*s-SYjYO^!~I0tkhY!E7+Uv8N(N?h*N+ zX=%R1<{`L}e3F#MGkebaWxtN^?R7jmUvq&Eg?nJkrO%{;()10)6GW=57{^BGZ(iippS*Asti1^AU6orji#E zeewWng--PmwOL08+&^SCDBT?7#2mACc_xV=tAWiilhEZrQHN^mt2r<-9NELaITCW{ z?|c>gz%P$`--JH;up2BrY=>1xnX~npHhc1oioHUQT1G#+rnl!UGV7k3GJeXXT=mX< zK4~j&7!Qj@z!&}9VPdF&)1%%aEWcz^_fur1Zt?H)QIApuQ$vWtC#R_n*4A%k$-Q}& zY_%U=OVnGhiDi6V?wy{4FbJx?$I&MK?O54!CEAZX<$sNfIzh9MYKOZXwYdumzvc)R zOS#Uz+r|9Sd)7<;EJi*S#<>o$jaf&xEVBzmnIPBW)H&OP{}$|_-g9J+bMHKmDvw<} zYf>7&PzqIk9e{t{;Hd)EQPpM$6+ls7?9B&?-w8OdjmMgY(%IMJlfz;|zsufvHhojZ zW*U=a@7%pB=wrkCWHqcYBSowTUlG-R-7E(>LF@usFVj!He#gtt@Ut67utc@%m~ibZ zF30Vvl#KYs`BPxh<+;rHi|Yi-lDw7LqMosAH<%n3sM-Hw~E0s+6|uf}PDdAzvCRpOPfR={qfDP$yE%*`={#Qj}#9 zTHaR9X4e^-J%R=8V)^)O4v8>L?XOAzedZs4_poW2F{Av5Nko!}^c7P2>l7@)D%4~# z`1(0-8t+2lg~T37w*0$q4IwOp!y>(2HT*+?r)|Vs>@dyAnTKYIhl*9YyIbQ584^`c zcC`@eo#?vKnM-xgx`F%#BTnzoeiT(2x=4JTUvZkKzjb5fg?9MnZA}A%9hZk}%Ew?X_nPG7Kb3+y}%Z~bCvDyp4=#jL7=1k z9y;12kcWqlV6~{{emCgx==9cpSdmpyc)qV^k?3B_%cx{eP_otu47nlf9sM2 zfs(-a`;Akp#_OemfAx;VGMwe2 z)<3xK1;^C?e$#yU-hkWx;KteVy`swJ*6vH|riwJf^OsMMPV4EFr%I(ybG4Up6RoEbXmmo>1qpeGvk^*INR`O`XK87EgGf| z9RJ*7`QZx|tUVip;T}fk0(>C&V89S!Ygj%ww9X9A7!D8W)zwa}Efz)5tuw2IA;h-u zz9ns+0FvGUJQT@L0}-Jf35$rN@YIDPBOj%Z(WT?+Se{l zCWJ@Vx}bZd{hu!IQYBL@(?JlJfk@ul8zl)61cOnR95gZ9DsU5*(EjpV3?6d7=JyHu ze{hvM|L$E0_Sea^D-H5jiY^Y15A^c759;oDaSiL|TbBz9ia`F8&5IdwtAGURXOpj;50s!Q~0!RPgGf<&ql^&i;!=iSvC@A1U8I59#c6 zL7(rhX!A64g{wK(?u)qJNAU@O_ZR~1=MsTG*jnYX8ADGXk$>H`!d2QU1tNL# z!AphmNEHrr@+()BQ=L<#Q?0{}A!$&>F@t9%o z_&_hnWBmA*`SQHDhV}9dv!tWp{xa1$T@LdP*iq={P^EK`?dcU`?E!FkFnREJXqQU{ z3nU}MSoi%%@de(~tNGN5-pewyR*+8*`0@9VbQtb2(DHfMb)WaS_Z`FD^%MKrr6YUU zv3>JxNnTc5%pvus+@eNIFM1C zn`LWDaz$2}eSwR{mfLG4^p#`~myy7ISFrnd%m>maq&wp9M3ewjqFSG`m!a72D&c1? zIZdIX%O^ES@A_6j%H_! z8Ju5hwLVu^GXk}^e-C?x0XD2A9uM9;j}P=haAz}`=S3CI5|vc)u8WaC@18d_ORD+( zQNXA3p$kf{)(QR|vUw~$0W^~cb~FR&#Bu%41M9RH{9}XNeG$aSuOD?q2DIc2=k&Li zoYvbe99Aka&g`yK6m(9%-UZX=U89SSz?&?nQ2wR6xtUZpx+xy0Bzj`B)xe^;_zek3LC*J zVxXze(J+BLJba`+QalMIjf}x0&LikVeRRTsSJY#0%SB1J<*CEqmXXQFY*Oe&eED#B zUVFVSQ-+QB(g>E3V6OpRgT4m-Zyt8*;nTl2NAi6;7M_v-B8hU~M!HSzSTKvC0IBWS zRhAclC=od9kgDSkwHZltq|v81?`w3kH{90r9wv$e6%oD3CH~L z7Clx)e`a9*e)5_%dS16(%w9EfK+WH0fu%5mNz5@cs>~%@8HvN0;oG| zc5r0D|1*OAXFx5@CxP1L6F>_|;E5RHrrF@%juJqe$M2y-et&y(su6e*m~qaK5_?uv zp&e4z)%Nb5?K;rRbV&y&%mn`L8{O|2=a-d~+u!O=m4+z9>|shhq3W^}m=tt;eCh8o5D zp*shrPq1KLz|cqWNdPL{%SKn}xi7$S4Y!9A7soiT0bA&t>LR;rRGCz9sEZ0)XhFSb z3+-HV_#)Zy4o1P-AmBH835UUvc8@M{u~)KvUY&G|H%%E}FFCcso;#>S2D}s%ojRsK zJ-pvgv;D+qM+#X1mJb^Kjm`%f)$k7%ELbZT-9TTXkPy`si2zvWpiw2o_lzcjgp@>4 zZkDYo&atB_^M$DaV}lj_8z%R+_spuck1VK{fRJ458Pcv`q2R3?_@kijD}CTVj%SL=!!G@xPqaVoiV6~EFRXoPO{7e|CorI-{@r?#pXI!yC_I*GOFY`)hNxgxa~d~ z!GfLq=C6z~97aL{t#q`6E;K5m`$OlyGm)N92e~*#tL|Z;EL&ZYYsd93u!}~NibU@{ zvudQ(r~Ti*tie7N62M9Aevyj=01OBm$f5Ravuo|f$^GobW6R|z(coTPWv0Z=2~rO1 zpQIgXXUO}{Mo*oxxOlG7px?)6;0Nz#!7+%p1q*hJjD)~^0H#or(L*zA5Yvj22pGsE zV4;j?Sj_P5G?KvZQmOWCnKnQe9_Y5S;IqT)3pEC4=tTFH7rE+XY4E|hb@r|qy2#Zu zy39^-U1ELDT*3KGGT8sW=zYXO7jPq#WORI>Ctqu{;z!FTh`0p{*2YGa#cY6K8&%k9 z=eIlGWt52lBZEW`NlIkcuGyLdhL-2q2?Gm7u2&YxToAZ(`alu%B2chDz%cO1WrL5~ zGFkA?8TjK+&r-h-sJEq=|J*yPTI9u7kMAwl=cxKQ)`IeEac-vY`Asqb&{6*0sATyw zMhlH~&KDc)KnIwh^i%0gd zrw`~ZL;>I)U_!QdnH_aVW%e-O{fSY@a#U;2F*@Ky$ETao*;J_hg9U3RMj}91ZnpEA zjaF^owOk&9Itp`xA)ag&vr$X{7+R5MXP(kSs=}M5^p|!2ZF6ev!}IHeF~os-*dp-& z)0UUXf;SWB8{>?gQxY8-T2MfFB=SdH#sAQ}dI|iuP8%SLT#X}2?fCxPZDnB>!T2+h z_`ZjG=o+c|8S?(E^9P-;GIz4pHn9lB!S;ENcKlsLqH9CLWj_HK|faE z?^~*J;0$#SELW(9{e%b6=66Y)MZl}h(nYSh4L$9|>Ox8OTJM5KIhObSgGl_L)YnFYPe8NCtm90Sk5Rr20bLx^%MT z1=+TtyqoB{bI*0{84Qc7ge|h;e1(QI0W>5MKwuBGVG@WXfW6T@hyzgq;P)SLT^ln7-M7l{zT_=|IFkFJ>l|7CT|ke_?nA{Sla3r4kjmKvoTgYnZAdGampJA{j6zP{vS(?ht?vi{j|uo^qF%Wik>0mE{AjBcRG8*f3ZG zBJz4eo^`T2#z0BH740B^ws%k0<=GwoUPgaM4zEYcTl^e2z|PHR0{``s`pLbB^M{qn zS;ir~l*^x!RO)1r%U|c>=l@%y>@j9WTKyz zf>{D83f)5ULEqojjaByP@Q#Pv`1_9to2SNZnp!1^nFT)?AOl8fdc6&I1dP450DB z?6}{kW;>N&itIGZkS>`WZP(77Y*9|8t;p|et9#_wQI*|29>y1^#0&3MSy#P1v|;DyYsO|E5EJI4>^CsXm!Z_ zR-~ta3BZRXF=Rx{A*xD-#%B!Z?yAn7cBShGu05xp2#5g@-FIHCoC*|}$T?8OqYFHn zD0#JPcREzm0&H}mK}YG&z1i0nd+q!iSXPfm>>Vn67+BjQcn3xn{QWyzw{_!`{`T@S zDuv29#U1fL+fM~bhY#8&Ig*n>vBqKO{+xd@;-XQ=dma~*5Vh*7QNu}AZsEbGka1QXC>Oz5t&>U(SRW7gu zv_p93Kowigt+v}{*T~FZ*P>IR;blVt-VnGb1{wLzA<;c7j_o6~BgRoGUOzaciuaYg zzpV9Sw3sC@S?qQ5+Q9UI(nz3mRKRN-U%702Z(;E)9#JaEc4}R*%w`Du)jgEQ-|cWl z4+)zDPQd37`*)r1F$(*!$i=P*9UvFz^4sYB7A#n>c4U5$jFunF7uo62Mw0=#XRk$O2oLl;1>$%-H%pa!bX?m3-osp|{|xTMffmM5^pG#9M69tBhZ9r0#Yz24&j z+&5fDK+q!q9ypTVA3;a$bs;U4kDq+b=}91-0KD&AGDO%_u&fCD>nHY;nQ?+YlukCnA2&(`W_uTAPmR&UPX`FQ zCt&@-f&~+UKHAs$8Af*q*eKp*G?2V*bXfep^N)-|3x`QjLoqDO$rM=P6xSV`+P6TU ziunzt_QKI+a;S#t_KxWTWsnJb1&HH;xwRr!4QvGb0c=FK039f2g z80OR9nNRm*H^TGbdGY*M!g?%%a(Mm<=hO=nri`6Bd%t_V_sy=A*MHZHYP)HQ4s(Ih z7_!f(?;-FSk{ttza-`d$>uLt#`QJt{eVAN`w4n;i0d`I?GT^_*D3>3p5Qe*<+7A{i z*rysD0m_aejNWoR-zYqEqfrQ9m(h6vSh7D=NfJm@pmYaRsUi+_)Ks?%hL+mpqsk=kU3Pk<>k|4%1-#KE2wcILW1wUXwVFd zbTD$yhd;19IXq2xjG5Gu?~i-z-yTTwgG~+M`=jM6o)5vFfY0+JsR8AX6r4fGv)ik_X${ypbxy0>AsI0 zGY*4z=)Ms9L#hE9ClC(-f09u~PhX?gxPWGUz<>})1Y9TM7QrT? zLt_FFvjV83Ktyx}KoW5_5sZ|C4v~ol$^^Y~7X(qGY$)q02W;pPfQ<;443(FUE|UvY zm!DZ_*SkuZi&b<743_ViStD1h=o0*Y@0+dub@5tpFm|A(`(yq<=oDB~q6%h+Tv3p1`xhx}M0WrVKFTEp4&H-{ zpIu#Kr?{ZX)hYt)+=f!SaA>InTp$&86PAqZC8sb+96&7>Ip^RBP}8c@ddrX%;k&O! z&aYREtB@qak{hfW?kP7pr+QyDvP`}vU;BLb7$l|nLwnlULwbsK5<#Bxn`aIvw5Pd1 zPZFcTX9hyRXCaHAPqoj29Z4@cGbQ+Y<_>s136$y{_RbHCYB=q4{)kb!F4wo#npB8~ z!7del(CP^mEZ8wKAOtT#4MapTfI);jFme+}2uv`#ZA@jl$*7tn_hONspn3%^O3+H< zGSxsvUY7{i2q*+d1mUv$2tF!siGpiYRM5akW%=16ZU$zKymfU+j$r5{kHM~^80HcP zcWp;kcC%w$5*gR8yGS9QSyd>wJ5FLj2oDS%-JFr`??SU|DAyof-_r&1l3e-P{oP|Q z*C@~L>=KqPUKK^piRZ`jj6*p&5uB6lA)St1b~!^BRmP+&Xo2bflTl3`j;?TEovm%O zd8Qd3jZ=#xP&z6)E8v|jt?;u67A#n>V`_fE zjB1s0fv`|W2(XD5QUYI~MKs9ysYY?^_LEp zYRbTq!6yf8kTPI1nS&*8-x(|eBasw-AM-y%{(j_tj2y_t!%ZJX{^!{L`#<|r2SL&RPX}UR zpt{Rw5`j_klu;Pw>FB>uDuJP>*6BQ+FiLMFkUtWAJ-+U?=y7;Fpc?`_3v%e|AfG|v zf}KNkkE8}r&RIq~onb~VwZWkBQVfBz87x?^FRj5U0@?uL0O}wa0DAx%Ax-QT(SSvO zkB}@TcmgB!HCjb8AVtuQsv6wGU(EQB7Q&S1P1Y(~km^qLv(8B?4Vuyi*L1j)r9~J#R=Q9cFNF-CK6W9sr z9+xLE1p&2S!GZ;Ahvqv9pAh05g-;Ar=OhO@iE@*y+|#ReU$OIb=uimyp<)jfELgC1 zY9xRTk#~%|Q{*IttjIez%z*0mbmPCx$TabWA2O$~@ zDt5(+1&uu#D~R-}pkj$7Mw9$8u_Q6Ee6}x!C_q(pb%plaM0=f^yRorB zZ@vG#@y0^8-~pi1s)?1E$$2}g+7D^mM>}V#Jr1URhq{gS{Eb>d)?kj2q2YcyzJs}% zxjLrCg^LC_p|ic!V>+Fv_n)zTj`dOB+$2YP{zd`F{0`{c${KxL8%Z?I4-OXdNmF{X z!tVHX)jgaVg3c58Mv^x7^N%-Kd)DqvEUp#DdSOy`d(^FMw2S6O zjp%HL?Xh0UZD9(uX;|k9&3UwKVo{MF?TNX4+Ayfi+W)^X00wilG_o)?`gGM07nFU_ zP8sH7tE8zj3GcK-Zj>hqqP;L!VN*?WrxOWaQH-Z5ZJ0Y88kk?8IWz5}-UyZWrL}or zYHXO!oG*;=RIUneQJWYUO0#;mMoy#$S;1S-i)mIA<0X;sQg(y~+S%2sGI-+5CjYeX zMsuGyv286Qqc0giUbLqwHN+i673rhF&R{_q#8iI=>60K=brzkchbkmKIyI`pQA&hV zXq2HJR^{`*Z5b0h{SfA>&{hKjgL-tBqp+=e-@d*XNMMPDB>};Xx;4}t8N~l|>RI6) z$e_-1c|@x@}((^#B)2%nhZ?|{iY9Iz|CotmlUZd>;OJ#&el zy}g-M;11Ly3^aMfQV-ng3C}-N3s}%$o}IPX=x97?cw4AKogJY-E@^dUuhtmk zZiAc%59TvDq#M#gT(N6HPn=vHi*p+jL_e`C24#u8G=K=e?(seF`JDH0d`Sep{U{no z<^+oC+0pF?kh1_umQlY;ikU{%p-3g=hP$itBNgg2qU2jGtvKw)z6ykn>qdqKJ16+r zqa?=T5z#`G7w0QwMtG|8B0ZD^(Vog};R+#qc2ql@S^FXG>|BC-yFbF6T}ws3%VU~5 zzi}KcY#J}dJg499>|Bapa%SO+`9lRrwnla&y(`K?nHB9L6_0uc^j`8KS5+3h&(pT< zBNEN$WgujZ1rGLTjN)j8a{CxRTuz^Y%I%AAcKulKB6h@d>RD0VxRf>t_sW*z*7k+k zzCdrhPzcU|^yl<@RY?l&?^%wYJ{co?hM${C7X5DZ2c(c?xLLe_tQLiWC{JZ_KSz*; z^Ir%+jy4viCi_>s=ZvEG4l35r-Cd+H65`Oz_mDIOROQ*;OUidf~y(f8sT@3_s4D0t}G~P`eN2} zoZggxpYvzquHH3Sa2Dov=@MMdNy6paBpRoPIr-Z4{JF@D?La=~F5Y!GDL}k~-+z>7 zmJ{YG^>=H`zRHV$$ zwpcLM^qI}$aj2Uu9yT+aGqg%lTzSuXpFVaI?)%<=+m{&=}x;2#kj1#}##le~*f|L>F zE~Qa)5J^dB-$iJNO)I!d{5-lO9Ov6w;9-l}sA_GFKbxE4t1eCPLt3Kn2?kI_THH6f z8>(8=!u?j})Xh-U(iHnfbj7WmDHJ3$mfAu0u(GyklOS7tOK@9>BA+_IL(pep4OyRQ zGO7>l8<=55fD30;iOT~9v4yn5G+_GN)N1zB`q4P*+X&URwFHRYZB4LufFrKt&JvEz z0QmlcGX~*;qZz6R;3Mi6+td~`Vv4Y1U(1?_tVj)2a}UY1;YFI)Z!)i( z+BUZMb2Do{Od)ajlmQ$fLD<~-k%k5Nyt55{bhpHQe>;4&BvQnAInuD7T+N<=-H|>x z>1~BmURKx@>V-?0(*?~KASXYWsxpYJ)Qe-hlws{{89=;NwwG3}^2PC^y0$>caBn4- z4BNB-n4e{dJ)d?^5}=a$cN@my%Vp6xn>LX^Eyhi~C{!Ur?PC0rKL^KG#o_B!!*MNd zHd$zi?w*2pUu+6&gG|c!IWa!M-%^LV@|r@mn${Xr8SG`j=Dwnw5Zt2rzF_GfXK+?z zGwMuA56z8jk6+1&h2SDYY6Q4PRJc!;`Hi$$y??oeKHD`R^d9m2k9{;p|KWS?(>?ru z*?Bn!F#ms8GZI&~O%oaVU#W@MHSS%mu|ye8jJRf?seoThBY9_`k%j3unmf-7kiHPpq5$Ctfq$rgl=1y*$jKy&S@oNEvO>JJ# z&k>x_g%SuD2MCeCXk1Y=A9?Y<64gZL;!vMgdTnY@{i!CSGIwlP=aS%km_n^Dyh!yF ziI}V3Qzov`%eps;7U1!LmH1?QF!L2dySKxGJsMx}b+s3B2bYZ&a}2gpFGI_eyk3~B z^P39F5nQHxu`pE16-i7uvhV8vuy$`+_qw*WSL>I=Ts^W69Go!_pUn!u#ng#9DzQ+% zlW+$}NJB$IA@J!8~hv_FaXz=`G7&N78%9dvQqZYoFgf?2 zetocd?I$R|Q31Ir)e-{w^~AZ<$s#1n0FKTJQf~`!fmic-l?Jb|rz$71*@@j-ft*Ll zl^{Qi`N~eVenK#&hxOFN_PtDnHG&SxgR8}n!SQ`pGH0SJIU324JxOREgbW#k$e36R z7&KTXv?NJTDwSgVbNR1$-@h}J9?8PD#5#hGyA%9W9}jUtLkrWdSTMYzl#sdAxu(??lA0gJG~me6!p0g-Ep0I&*dNIeJ+N{_f2{d%Am-6H;k~ypxQhaP{kkAJ zDhkV1uEDpbz86AXym%4AV`Iel@#Dt=fJ&tj=cQ$P5#O&PDPol`O&9rhhKq!U!8!|>s;IC0{H z7(aUSNH@e!T)cd?{E^iNax;t$m%=6NPbasW($S)ZE(aoWYZC46od+ zlRez~trqnj=SO>S6)JtddW5h7J2Hd#oj_d4O2RwtEy)5)gdo+`)#4Zz7l&iVjy+?6 z%a<=BG&J;y<7$D8OPq{FF};N!-6+&(|BD5~kQeT%9Nx+9wblVI0+G&Epyiw@JBErl zsvvn?D~D3fs&^@5M*Fuz(9jTEBS+*mX3Q9rm6bgM;L4RNIsj}LZrgX3!QaP4_!m1a zTj1xc8OVw97TRxNZFb4vRYlxO0JwQKw|tPNwZcxS4&@SBmk&x7;W25B`RnWDiozW` zF>%r)l$Mt2oK+U~(xpoX2?^0zVDEv$=;+~$pHio4lh;B~VwWWJKw+ditpl2|_DB6y z?aNL6!`x7xrr18*TeT_3S*%ejwVD!%O)lgJ#D%TXC<=9jT~ixDi>f>KAn9|xyj=Le zt*YCYmNXlF-cC5PWs0Crs9nqGbAu;Q=P&P6>+RGTmhhGz zflzLI-x<3n_>+^((=9FKI_M73fGg4;woJvekayAl?e+)>4#I?qlaR7>84@NWqD^ZD z^y%7Odi>J3!NH?yjJonCEUgAsqZ$sigwtYdPH7dgcQf-R9x zE2wiD5(Ef&kBGI%B{2)d;jogx9r*Uh2=*LUnj89`0W$inJpG`IcnH{ zOZb`~Y)nmzj*RTWAMm`Dxlta%FL)bd@1)*1wIWWeuFCV~P&k|?b|g6Y@e=V0EfsnF zaBkx`e7|M{Rk(pDBEfmjrzl#XOd04*v@yL!@96g57G7@Rf%f+H{9$gruf3JTlwxb- zM0zMUQ`x1De%Y;wMY)33*N!%I{!L-=q`9dv@9$5g-qAo?+h}(}{_)SO`t6x7i`vElvUVF7 jJo%ul-x&Pg7X1GKmO~8u0f(!e00000NkvXXu0mjfpM_rm literal 0 HcmV?d00001 diff --git a/icons/icon-512x512.png b/icons/icon-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..610193d8a703bb8e3d1adfece5d685b5f6e901d1 GIT binary patch literal 146516 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


ls?xavTUI=-w#7L7;G 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
    I{(d-uXM`jMFCDeY=?s~3bZ;jF};Tg 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 literal 0 HcmV?d00001 diff --git a/icons/icon-96x96.png b/icons/icon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..a8819206142050824ee95175cf6be7ee9dedcb22 GIT binary patch literal 10493 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 literal 0 HcmV?d00001 diff --git a/idb-keyval-3.2.0-iife.min.js b/idb-keyval-3.2.0-iife.min.js new file mode 100644 index 00000000..067a966f --- /dev/null +++ b/idb-keyval-3.2.0-iife.min.js @@ -0,0 +1 @@ +var idbKeyval=function(e){"use strict";class t{constructor(e="keyval-store",t="keyval"){this.storeName=t,this._dbp=new Promise((r,n)=>{const o=indexedDB.open(e,1);o.onerror=(()=>n(o.error)),o.onsuccess=(()=>r(o.result)),o.onupgradeneeded=(()=>{o.result.createObjectStore(t)})})}_withIDBStore(e,t){return this._dbp.then(r=>new Promise((n,o)=>{const s=r.transaction(this.storeName,e);s.oncomplete=(()=>n()),s.onabort=s.onerror=(()=>o(s.error)),t(s.objectStore(this.storeName))}))}}let r;function n(){return r||(r=new t),r}return e.Store=t,e.get=function(e,t=n()){let r;return t._withIDBStore("readonly",t=>{r=t.get(e)}).then(()=>r.result)},e.set=function(e,t,r=n()){return r._withIDBStore("readwrite",r=>{r.put(t,e)})},e.del=function(e,t=n()){return t._withIDBStore("readwrite",t=>{t.delete(e)})},e.clear=function(e=n()){return e._withIDBStore("readwrite",e=>{e.clear()})},e.keys=function(e=n()){const t=[];return e._withIDBStore("readonly",e=>{(e.openKeyCursor||e.openCursor).call(e).onsuccess=function(){this.result&&(t.push(this.result.key),this.result.continue())}}).then(()=>t)},e}({}); \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..76998337 --- /dev/null +++ b/index.html @@ -0,0 +1,186 @@ +Violentmonkey + + \ No newline at end of file diff --git a/localization/index.html b/localization/index.html new file mode 100644 index 00000000..f92498ad --- /dev/null +++ b/localization/index.html @@ -0,0 +1,89 @@ +Violentmonkey

    Localization

    Table of Contents

    It is highly recommended to update the translations on Transifex, to utilize the powerful features provided by the platform and for better maintenance.

    +

    We have automated weekly synchronization from Transifex, so the translations will be updated to the code soon.

    + +

    👉🏻 Start translating or fix an existing translation. +

    +

    Pull Requests

    +

    Please consider using Transifex first.

    +
      +
    1. +

      Fork Violentmonkey from GitHub.

      +
    2. +
    3. +

      Copy src/_locales/en/messages.yml into src/_locales/<your_locale>/messages.yml.

      +
    4. +
    5. +

      Translate messages in the created messages.yml or the one you'd like to modify.

      +

      Make sure the modified messages.yml is valid yaml.

      +

      If you are not sure how to do this, please use Transifex instead.

      +
    6. +
    7. +

      Commit changes and create a pull request.

      +
    8. +

    Open Chat
    + + \ No newline at end of file diff --git a/manifest.webmanifest b/manifest.webmanifest new file mode 100644 index 00000000..c8247615 --- /dev/null +++ b/manifest.webmanifest @@ -0,0 +1 @@ +{"icons":[{"src":"icons/icon-48x48.png?v=e0d9ed50fb982761b0f7cdea8b093ae9","sizes":"48x48","type":"image/png"},{"src":"icons/icon-72x72.png?v=e0d9ed50fb982761b0f7cdea8b093ae9","sizes":"72x72","type":"image/png"},{"src":"icons/icon-96x96.png?v=e0d9ed50fb982761b0f7cdea8b093ae9","sizes":"96x96","type":"image/png"},{"src":"icons/icon-144x144.png?v=e0d9ed50fb982761b0f7cdea8b093ae9","sizes":"144x144","type":"image/png"},{"src":"icons/icon-192x192.png?v=e0d9ed50fb982761b0f7cdea8b093ae9","sizes":"192x192","type":"image/png"},{"src":"icons/icon-256x256.png?v=e0d9ed50fb982761b0f7cdea8b093ae9","sizes":"256x256","type":"image/png"},{"src":"icons/icon-384x384.png?v=e0d9ed50fb982761b0f7cdea8b093ae9","sizes":"384x384","type":"image/png"},{"src":"icons/icon-512x512.png?v=e0d9ed50fb982761b0f7cdea8b093ae9","sizes":"512x512","type":"image/png"}]} \ No newline at end of file diff --git a/offline-plugin-app-shell-fallback/index.html b/offline-plugin-app-shell-fallback/index.html new file mode 100644 index 00000000..30989b8c --- /dev/null +++ b/offline-plugin-app-shell-fallback/index.html @@ -0,0 +1,67 @@ +
    + + \ No newline at end of file diff --git a/page-data/404.html/page-data.json b/page-data/404.html/page-data.json new file mode 100644 index 00000000..86234214 --- /dev/null +++ b/page-data/404.html/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-404-js","path":"/404.html","result":{"pageContext":{}},"staticQueryHashes":["1116475411","1700780748","2344890832","3202921338"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/404/page-data.json b/page-data/404/page-data.json new file mode 100644 index 00000000..b48f20a8 --- /dev/null +++ b/page-data/404/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-404-js","path":"/404/","result":{"pageContext":{}},"staticQueryHashes":["1116475411","1700780748","2344890832","3202921338"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/api/gm/page-data.json b/page-data/api/gm/page-data.json new file mode 100644 index 00000000..d02bdd41 --- /dev/null +++ b/page-data/api/gm/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-index-js-content-file-path-content-api-gm-md","path":"/api/gm/","result":{"data":{"mdx":{"fields":{"slug":"api/gm/"},"frontmatter":{"title":"GM_* APIs","date":"April 25, 2018","sidebar":{"match":"/api/","order":0}},"tableOfContents":{"items":[{"url":"#gm_","title":"GM_*","items":[{"url":"#gm_info","title":"GM_info"},{"url":"#gm_getvalue","title":"GM_getValue"},{"url":"#gm_setvalue","title":"GM_setValue"},{"url":"#gm_deletevalue","title":"GM_deleteValue"},{"url":"#gm_listvalues","title":"GM_listValues"},{"url":"#gm_addvaluechangelistener","title":"GM_addValueChangeListener"},{"url":"#gm_removevaluechangelistener","title":"GM_removeValueChangeListener"},{"url":"#gm_getresourcetext","title":"GM_getResourceText"},{"url":"#gm_getresourceurl","title":"GM_getResourceURL"},{"url":"#gm_addelement","title":"GM_addElement"},{"url":"#gm_addstyle","title":"GM_addStyle"},{"url":"#gm_openintab","title":"GM_openInTab"},{"url":"#gm_registermenucommand","title":"GM_registerMenuCommand"},{"url":"#gm_unregistermenucommand","title":"GM_unregisterMenuCommand"},{"url":"#gm_notification","title":"GM_notification"},{"url":"#gm_setclipboard","title":"GM_setClipboard"},{"url":"#gm_xmlhttprequest","title":"GM_xmlhttpRequest"},{"url":"#gm_download","title":"GM_download"}]},{"url":"#gm","title":"GM.*"}]}}},"pageContext":{"id":"b5a05c86-b9ba-5449-b559-173e9ad36184","frontmatter":{"title":"GM_* APIs","date":"2018-04-25T15:15:15.000Z","path":"/api/gm/","redirect_from":["/api/"],"sidebar":{"match":"/api/","order":0}}}},"staticQueryHashes":["1116475411","1700780748","2344890832","3202921338"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/api/matching/page-data.json b/page-data/api/matching/page-data.json new file mode 100644 index 00000000..8dbf0cc9 --- /dev/null +++ b/page-data/api/matching/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-index-js-content-file-path-content-api-matching-md","path":"/api/matching/","result":{"data":{"mdx":{"fields":{"slug":"api/matching/"},"frontmatter":{"title":"Matching","date":"December 2, 2017","sidebar":{"match":"/api/","order":2}},"tableOfContents":{"items":[{"url":"#match--exclude-match","title":"@match / @exclude-match"},{"url":"#include--exclude","title":"@include / @exclude"},{"url":"#how-does-a-script-match","title":"How does a script match?"}]}}},"pageContext":{"id":"f4e48511-90b2-5443-a660-71fc3318f4af","frontmatter":{"title":"Matching","date":"2017-12-02T22:32:50.000Z","path":"/api/matching/","sidebar":{"match":"/api/","order":2}}}},"staticQueryHashes":["1116475411","1700780748","2344890832","3202921338"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/api/metadata-block/page-data.json b/page-data/api/metadata-block/page-data.json new file mode 100644 index 00000000..df5284e7 --- /dev/null +++ b/page-data/api/metadata-block/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-index-js-content-file-path-content-api-metadata-block-md","path":"/api/metadata-block/","result":{"data":{"mdx":{"fields":{"slug":"api/metadata-block/"},"frontmatter":{"title":"Metadata Block","date":"December 2, 2017","sidebar":{"match":"/api/","order":1}},"tableOfContents":{"items":[{"url":"#name","title":"@name"},{"url":"#namespace","title":"@namespace"},{"url":"#match--exclude-match","title":"@match / @exclude-match"},{"url":"#include--exclude","title":"@include / @exclude"},{"url":"#version","title":"@version"},{"url":"#description","title":"@description"},{"url":"#icon","title":"@icon"},{"url":"#require","title":"@require"},{"url":"#resource","title":"@resource"},{"url":"#run-at","title":"@run-at"},{"url":"#noframes","title":"@noframes"},{"url":"#grant","title":"@grant"},{"url":"#inject-into","title":"@inject-into"},{"url":"#downloadurl","title":"@downloadURL"},{"url":"#supporturl","title":"@supportURL"},{"url":"#homepageurl","title":"@homepageURL"},{"url":"#unwrap","title":"@unwrap"}]}}},"pageContext":{"id":"df6f63cf-e376-5f88-87e5-e380a70ac562","frontmatter":{"title":"Metadata Block","date":"2017-12-02T21:20:04.000Z","path":"/api/metadata-block/","sidebar":{"match":"/api/","order":1}}}},"staticQueryHashes":["1116475411","1700780748","2344890832","3202921338"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/app-data.json b/page-data/app-data.json new file mode 100644 index 00000000..e075f96e --- /dev/null +++ b/page-data/app-data.json @@ -0,0 +1 @@ +{"webpackCompilationHash":"dd1c861f24b09df77ded"} diff --git a/page-data/components/install-beta/page-data.json b/page-data/components/install-beta/page-data.json new file mode 100644 index 00000000..401a5059 --- /dev/null +++ b/page-data/components/install-beta/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-index-js-content-file-path-src-components-install-beta-mdx","path":"/components/install-beta/","result":{"data":{"mdx":{"fields":{"slug":"components/install-beta/"},"frontmatter":{"title":null,"date":null,"sidebar":null},"tableOfContents":{}}},"pageContext":{"id":"e8d8965b-abea-583e-b50e-3ab42c3e3333","frontmatter":{}}},"staticQueryHashes":["1116475411","1700780748","2344890832","3202921338"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/components/install-stable/page-data.json b/page-data/components/install-stable/page-data.json new file mode 100644 index 00000000..6bb1f441 --- /dev/null +++ b/page-data/components/install-stable/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-index-js-content-file-path-src-components-install-stable-mdx","path":"/components/install-stable/","result":{"data":{"mdx":{"fields":{"slug":"components/install-stable/"},"frontmatter":{"title":null,"date":null,"sidebar":null},"tableOfContents":{}}},"pageContext":{"id":"d5c14f23-6fa5-5264-92e1-82d28b3c4c1c","frontmatter":{}}},"staticQueryHashes":["1116475411","1700780748","2344890832","3202921338"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/faq/page-data.json b/page-data/faq/page-data.json new file mode 100644 index 00000000..9af135db --- /dev/null +++ b/page-data/faq/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-index-js-content-file-path-content-faq-index-md","path":"/faq/","result":{"data":{"mdx":{"fields":{"slug":"faq/"},"frontmatter":{"title":"FAQ","date":"September 22, 2017","sidebar":null},"tableOfContents":{"items":[{"url":"#why-does-violentmonkey-require-clipboard-permission","title":"Why does Violentmonkey require clipboard permission?"},{"url":"#why-are-third-party-sync-services-used-instead-of-native-ones","title":"Why are third-party sync services used instead of native ones?"},{"url":"#where-are-the-userscripts-stored","title":"Where are the userscripts stored?"},{"url":"#why-is-the-release-minified","title":"Why is the release minified?"}]}}},"pageContext":{"id":"6b2051a9-8ea3-51e1-af5b-a87239ce4adc","frontmatter":{"title":"FAQ","date":"2017-09-22T14:41:11.000Z"}}},"staticQueryHashes":["1116475411","1700780748","2344890832","3202921338"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/get-it/page-data.json b/page-data/get-it/page-data.json new file mode 100644 index 00000000..3eebb446 --- /dev/null +++ b/page-data/get-it/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-index-js-content-file-path-content-get-it-index-md","path":"/get-it/","result":{"data":{"mdx":{"fields":{"slug":"get-it/"},"frontmatter":{"title":"Get Violentmonkey","date":"March 13, 2017","sidebar":null},"tableOfContents":{"items":[{"url":"#webextension-compatible-browsers","title":"WebExtension-compatible browsers","items":[{"url":"#stable-release","title":"Stable Release"},{"url":"#beta-release","title":"Beta Release"}]},{"url":"#maxthon","title":"Maxthon"},{"url":"#not-above","title":"Not above?"}]}}},"pageContext":{"id":"347a5dcd-75bd-555b-ab32-422e83798547","frontmatter":{"title":"Get Violentmonkey","date":"2017-03-13T18:16:24.000Z"}}},"staticQueryHashes":["1116475411","1700780748","2344890832","3202921338"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/guide/creating-a-userscript/page-data.json b/page-data/guide/creating-a-userscript/page-data.json new file mode 100644 index 00000000..661daa93 --- /dev/null +++ b/page-data/guide/creating-a-userscript/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-index-js-content-file-path-content-guide-creating-a-userscript-index-md","path":"/guide/creating-a-userscript/","result":{"data":{"mdx":{"fields":{"slug":"guide/creating-a-userscript/"},"frontmatter":{"title":"Creating a userscript","date":"March 8, 2020","sidebar":{"match":"/guide/","order":0}},"tableOfContents":{"items":[{"url":"#create-a-userscript-for-the-active-tab","title":"Create a userscript for the active tab"},{"url":"#what-makes-up-a-userscript","title":"What makes up a userscript"},{"url":"#userscript-code","title":"Userscript code"}]}}},"pageContext":{"id":"29499453-39d5-5d36-9a68-f83c43297775","frontmatter":{"title":"Creating a userscript","date":"2020-03-08 18:33:51+0800","redirect_from":["/guide/"],"sidebar":{"match":"/guide/","order":0}}}},"staticQueryHashes":["1116475411","1700780748","2344890832","3202921338"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/guide/keyboard-shortcuts/page-data.json b/page-data/guide/keyboard-shortcuts/page-data.json new file mode 100644 index 00000000..286400bf --- /dev/null +++ b/page-data/guide/keyboard-shortcuts/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-index-js-content-file-path-content-guide-keyboard-shortcuts-index-mdx","path":"/guide/keyboard-shortcuts/","result":{"data":{"mdx":{"fields":{"slug":"guide/keyboard-shortcuts/"},"frontmatter":{"title":"Keyboard Shortcuts","date":"July 28, 2022","sidebar":{"match":"/guide/","order":3}},"tableOfContents":{"items":[{"url":"#preparation","title":"Preparation","items":[{"url":"#option-1-require","title":"Option 1. @require"},{"url":"#option-2-installation","title":"Option 2. Installation"}]},{"url":"#usage","title":"Usage"}]}}},"pageContext":{"id":"8fd78997-ab82-5d2e-8d26-2e74a137739a","frontmatter":{"title":"Keyboard Shortcuts","date":"2022-07-29 01:03:04+0800","sidebar":{"match":"/guide/","order":3}}}},"staticQueryHashes":["1116475411","1700780748","2344890832","3202921338"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/guide/observing-dom/page-data.json b/page-data/guide/observing-dom/page-data.json new file mode 100644 index 00000000..12c0bec5 --- /dev/null +++ b/page-data/guide/observing-dom/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-index-js-content-file-path-content-guide-observing-dom-index-md","path":"/guide/observing-dom/","result":{"data":{"mdx":{"fields":{"slug":"guide/observing-dom/"},"frontmatter":{"title":"Observing DOM","date":"February 17, 2021","sidebar":{"match":"/guide/","order":2}},"tableOfContents":{"items":[{"url":"#background","title":"Background"},{"url":"#introducing-violentmonkeydom","title":"Introducing @violentmonkey/dom"},{"url":"#requirements","title":"Requirements"},{"url":"#observing","title":"Observing"},{"url":"#optionally-using-jquery","title":"(Optionally) Using jQuery"}]}}},"pageContext":{"id":"4323ca82-d793-5f92-8add-5e612cad900f","frontmatter":{"title":"Observing DOM","date":"2021-02-17 23:16:49+0800","sidebar":{"match":"/guide/","order":2}}}},"staticQueryHashes":["1116475411","1700780748","2344890832","3202921338"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/guide/using-modern-syntax/page-data.json b/page-data/guide/using-modern-syntax/page-data.json new file mode 100644 index 00000000..2cf97312 --- /dev/null +++ b/page-data/guide/using-modern-syntax/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-index-js-content-file-path-content-guide-using-modern-syntax-index-md","path":"/guide/using-modern-syntax/","result":{"data":{"mdx":{"fields":{"slug":"guide/using-modern-syntax/"},"frontmatter":{"title":"Modern Syntax","date":"August 23, 2023","sidebar":{"match":"/guide/","order":1}},"tableOfContents":{"items":[{"url":"#prerequisites","title":"Prerequisites"},{"url":"#initialization","title":"Initialization","items":[{"url":"#development","title":"Development"},{"url":"#building","title":"Building"}]},{"url":"#features","title":"Features"}]}}},"pageContext":{"id":"b0d1201f-e7bd-551a-b468-561a20e9625e","frontmatter":{"title":"Modern Syntax","date":"2023-08-23 23:31:12+0800","sidebar":{"match":"/guide/","order":1}}}},"staticQueryHashes":["1116475411","1700780748","2344890832","3202921338"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/index/page-data.json b/page-data/index/page-data.json new file mode 100644 index 00000000..4861b70f --- /dev/null +++ b/page-data/index/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-index-js-content-file-path-content-index-md","path":"/","result":{"data":{"mdx":{"fields":{"slug":""},"frontmatter":{"title":"Violentmonkey","date":"March 13, 2017","sidebar":null},"tableOfContents":{"items":[{"url":"#features","title":"Features"},{"url":"#installation","title":"Installation"},{"url":"#contribution","title":"Contribution"}]}}},"pageContext":{"id":"7255ffc3-b6fb-54b9-a0c2-c0cbfe07d701","frontmatter":{"title":"Violentmonkey","date":"2017-03-13T18:15:24.000Z"}}},"staticQueryHashes":["1116475411","1700780748","2344890832","3202921338"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/localization/page-data.json b/page-data/localization/page-data.json new file mode 100644 index 00000000..e74e3d80 --- /dev/null +++ b/page-data/localization/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-index-js-content-file-path-content-localization-index-md","path":"/localization/","result":{"data":{"mdx":{"fields":{"slug":"localization/"},"frontmatter":{"title":"Localization","date":"March 13, 2017","sidebar":null},"tableOfContents":{"items":[{"url":"#transifex-recommended","title":"Transifex (Recommended)"},{"url":"#pull-requests","title":"Pull Requests"}]}}},"pageContext":{"id":"8cf248bf-ce96-529c-b1ee-aedbd68aa83f","frontmatter":{"title":"Localization","date":"2017-03-13T20:07:10.000Z"}}},"staticQueryHashes":["1116475411","1700780748","2344890832","3202921338"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/offline-plugin-app-shell-fallback/page-data.json b/page-data/offline-plugin-app-shell-fallback/page-data.json new file mode 100644 index 00000000..117f9dc5 --- /dev/null +++ b/page-data/offline-plugin-app-shell-fallback/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---cache-caches-gatsby-plugin-offline-app-shell-js","path":"/offline-plugin-app-shell-fallback/","result":{"pageContext":{}},"staticQueryHashes":[],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/posts/features-in-userscript-generator/page-data.json b/page-data/posts/features-in-userscript-generator/page-data.json new file mode 100644 index 00000000..2d357878 --- /dev/null +++ b/page-data/posts/features-in-userscript-generator/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-index-js-content-file-path-content-posts-features-in-userscript-generator-md","path":"/posts/features-in-userscript-generator/","result":{"data":{"mdx":{"fields":{"slug":"posts/features-in-userscript-generator/"},"frontmatter":{"title":"Features in Userscript Generator","date":"August 24, 2023","sidebar":null},"tableOfContents":{"items":[{"url":"#css-modules","title":"CSS modules"},{"url":"#unocss","title":"UnoCSS"},{"url":"#solidjs","title":"SolidJS"},{"url":"#summary","title":"Summary"}]}}},"pageContext":{"id":"912e62d9-a74d-555b-b376-9b1c49ae78b9","frontmatter":{"title":"Features in Userscript Generator","date":"2023-08-24 20:00:58+0800","path":"/posts/features-in-userscript-generator/"}}},"staticQueryHashes":["1116475411","1700780748","2344890832","3202921338"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/posts/how-to-edit-scripts-with-your-favorite-editor/page-data.json b/page-data/posts/how-to-edit-scripts-with-your-favorite-editor/page-data.json new file mode 100644 index 00000000..34a80a33 --- /dev/null +++ b/page-data/posts/how-to-edit-scripts-with-your-favorite-editor/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-index-js-content-file-path-content-posts-how-to-edit-scripts-with-your-favorite-editor-index-md","path":"/posts/how-to-edit-scripts-with-your-favorite-editor/","result":{"data":{"mdx":{"fields":{"slug":"posts/how-to-edit-scripts-with-your-favorite-editor/"},"frontmatter":{"title":"How to edit scripts with your favorite editor?","date":"March 14, 2017","sidebar":null},"tableOfContents":{"items":[{"url":"#save-to-a-file","title":"Save to a file"},{"url":"#install-a-local-script","title":"Install a local script"},{"url":"#edit-and-sync","title":"Edit and sync"},{"url":"#known-issues","title":"Known issues"}]}}},"pageContext":{"id":"5c6f42dc-6e5f-56f5-8606-26dc8c62288d","frontmatter":{"title":"How to edit scripts with your favorite editor?","date":"2017-03-14T14:37:09.000Z","tags":["editor","crx","nex","oex","mx"],"path":"/posts/how-to-edit-scripts-with-your-favorite-editor/","redirect_from":["/2017/03/14/How-to-edit-scripts-with-your-favorite-editor/"]}}},"staticQueryHashes":["1116475411","1700780748","2344890832","3202921338"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/posts/inject-into-context/page-data.json b/page-data/posts/inject-into-context/page-data.json new file mode 100644 index 00000000..f422cdd6 --- /dev/null +++ b/page-data/posts/inject-into-context/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-index-js-content-file-path-content-posts-inject-into-context-md","path":"/posts/inject-into-context/","result":{"data":{"mdx":{"fields":{"slug":"posts/inject-into-context/"},"frontmatter":{"title":"Inject scripts into different contexts","date":"November 23, 2018","sidebar":null},"tableOfContents":{"items":[{"url":"#contexts","title":"Contexts"},{"url":"#injection-modes","title":"Injection Modes","items":[{"url":"#mode-page","title":"Mode: page"},{"url":"#mode-content","title":"Mode: content"},{"url":"#mode-auto","title":"Mode: auto"}]},{"url":"#violentmonkey-settings","title":"Violentmonkey Settings"}]}}},"pageContext":{"id":"8680c6c6-054d-51c6-9ede-bfbf886af325","frontmatter":{"title":"Inject scripts into different contexts","date":"2018-11-23T23:35:11.000Z","tags":["inject"],"path":"/posts/inject-into-context/","redirect_from":["/2018/11/23/inject-into-context/"]}}},"staticQueryHashes":["1116475411","1700780748","2344890832","3202921338"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/posts/inject-scripts-with-blob-urls/page-data.json b/page-data/posts/inject-scripts-with-blob-urls/page-data.json new file mode 100644 index 00000000..0e2d997d --- /dev/null +++ b/page-data/posts/inject-scripts-with-blob-urls/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-index-js-content-file-path-content-posts-inject-scripts-with-blob-urls-md","path":"/posts/inject-scripts-with-blob-urls/","result":{"data":{"mdx":{"fields":{"slug":"posts/inject-scripts-with-blob-urls/"},"frontmatter":{"title":"Inject scripts with Blob URLs","date":"October 28, 2017","sidebar":null},"tableOfContents":{"items":[{"url":"#before","title":"Before"},{"url":"#now","title":"Now"},{"url":"#problem","title":"Problem"},{"url":"#conclusion","title":"Conclusion"}]}}},"pageContext":{"id":"fc322ef7-5d0d-5d1e-a7e5-58ef89831432","frontmatter":{"title":"Inject scripts with Blob URLs","date":"2017-10-28T13:48:00.000Z","tags":["inject","blob"],"path":"/posts/inject-scripts-with-blob-urls/","redirect_from":["/2017/10/28/Inject-scripts-with-BLOB-URLs/"]}}},"staticQueryHashes":["1116475411","1700780748","2344890832","3202921338"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/posts/page-data.json b/page-data/posts/page-data.json new file mode 100644 index 00000000..1f50a3e8 --- /dev/null +++ b/page-data/posts/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-posts-js","path":"/posts/","result":{"pageContext":{}},"staticQueryHashes":["1116475411","1700780748","2344890832","3202921338","3798213247"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/posts/smart-rules-for-blacklist/page-data.json b/page-data/posts/smart-rules-for-blacklist/page-data.json new file mode 100644 index 00000000..06e2e88c --- /dev/null +++ b/page-data/posts/smart-rules-for-blacklist/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-index-js-content-file-path-content-posts-smart-rules-for-blacklist-md","path":"/posts/smart-rules-for-blacklist/","result":{"data":{"mdx":{"fields":{"slug":"posts/smart-rules-for-blacklist/"},"frontmatter":{"title":"Smart rules for blacklist","date":"April 15, 2017","sidebar":null},"tableOfContents":{"items":[{"url":"#blacklist-use-cases","title":"Blacklist use cases"},{"url":"#blacklist-patterns","title":"Blacklist patterns"},{"url":"#whitelist-patterns","title":"Whitelist patterns"}]}}},"pageContext":{"id":"2bfe8994-cc2e-5ee6-a58d-3efc8764f97b","frontmatter":{"title":"Smart rules for blacklist","date":"2017-04-15T21:44:21.000Z","tags":["blacklist","exclude","match"],"path":"/posts/smart-rules-for-blacklist/","redirect_from":["/2017/04/15/Smart-rules-for-blacklist/"]}}},"staticQueryHashes":["1116475411","1700780748","2344890832","3202921338"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/posts/violentmonkey-workflows/page-data.json b/page-data/posts/violentmonkey-workflows/page-data.json new file mode 100644 index 00000000..ee0b991a --- /dev/null +++ b/page-data/posts/violentmonkey-workflows/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-index-js-content-file-path-content-posts-violentmonkey-workflows-md","path":"/posts/violentmonkey-workflows/","result":{"data":{"mdx":{"fields":{"slug":"posts/violentmonkey-workflows/"},"frontmatter":{"title":"Violentmonkey Workflows","date":"February 19, 2021","sidebar":null},"tableOfContents":{"items":[{"url":"#workflows","title":"Workflows","items":[{"url":"#development","title":"Development"},{"url":"#release","title":"Release"},{"url":"#publication","title":"Publication"}]},{"url":"#why-is-the-source-code-compiled","title":"Why is the source code compiled?"},{"url":"#why-is-the-generated-code-minified","title":"Why is the generated code minified?"},{"url":"#how-to-build-the-code-by-yourself","title":"How to build the code by yourself?"}]}}},"pageContext":{"id":"f6f4bc0f-afdd-51e2-be80-02872646c104","frontmatter":{"title":"Violentmonkey Workflows","date":"2021-02-19 21:21:04+0800","tags":["development"],"path":"/posts/violentmonkey-workflows/"}}},"staticQueryHashes":["1116475411","1700780748","2344890832","3202921338"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/privacy/page-data.json b/page-data/privacy/page-data.json new file mode 100644 index 00000000..f15f9b39 --- /dev/null +++ b/page-data/privacy/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-post-index-js-content-file-path-content-privacy-index-md","path":"/privacy/","result":{"data":{"mdx":{"fields":{"slug":"privacy/"},"frontmatter":{"title":"Privacy Policy","date":"April 27, 2019","sidebar":null},"tableOfContents":{"items":[{"url":"#service-providers","title":"Service Providers"},{"url":"#links-to-other-sites","title":"Links To Other Sites"},{"url":"#changes-to-this-privacy-policy","title":"Changes To This Privacy Policy"},{"url":"#contact-us","title":"Contact Us"}]}}},"pageContext":{"id":"99707d83-2a85-5149-8586-d8d71c432710","frontmatter":{"title":"Privacy Policy","date":"2019-04-27T00:00:00.000Z"}}},"staticQueryHashes":["1116475411","1700780748","2344890832","3202921338"],"slicesMap":{}} \ No newline at end of file diff --git a/page-data/sq/d/1116475411.json b/page-data/sq/d/1116475411.json new file mode 100644 index 00000000..6f06d20d --- /dev/null +++ b/page-data/sq/d/1116475411.json @@ -0,0 +1 @@ +{"data":{"allMdx":{"nodes":[{"fields":{"slug":"components/install-beta/"},"frontmatter":{"title":null,"sidebar":null}},{"fields":{"slug":"components/install-stable/"},"frontmatter":{"title":null,"sidebar":null}},{"fields":{"slug":""},"frontmatter":{"title":"Violentmonkey","sidebar":null}},{"fields":{"slug":"api/gm/"},"frontmatter":{"title":"GM_* APIs","sidebar":{"match":"/api/","order":0}}},{"fields":{"slug":"api/matching/"},"frontmatter":{"title":"Matching","sidebar":{"match":"/api/","order":2}}},{"fields":{"slug":"api/metadata-block/"},"frontmatter":{"title":"Metadata Block","sidebar":{"match":"/api/","order":1}}},{"fields":{"slug":"faq/"},"frontmatter":{"title":"FAQ","sidebar":null}},{"fields":{"slug":"get-it/"},"frontmatter":{"title":"Get Violentmonkey","sidebar":null}},{"fields":{"slug":"localization/"},"frontmatter":{"title":"Localization","sidebar":null}},{"fields":{"slug":"posts/features-in-userscript-generator/"},"frontmatter":{"title":"Features in Userscript Generator","sidebar":null}},{"fields":{"slug":"posts/inject-into-context/"},"frontmatter":{"title":"Inject scripts into different contexts","sidebar":null}},{"fields":{"slug":"posts/inject-scripts-with-blob-urls/"},"frontmatter":{"title":"Inject scripts with Blob URLs","sidebar":null}},{"fields":{"slug":"posts/smart-rules-for-blacklist/"},"frontmatter":{"title":"Smart rules for blacklist","sidebar":null}},{"fields":{"slug":"posts/violentmonkey-workflows/"},"frontmatter":{"title":"Violentmonkey Workflows","sidebar":null}},{"fields":{"slug":"privacy/"},"frontmatter":{"title":"Privacy Policy","sidebar":null}},{"fields":{"slug":"guide/creating-a-userscript/"},"frontmatter":{"title":"Creating a userscript","sidebar":{"match":"/guide/","order":0}}},{"fields":{"slug":"guide/keyboard-shortcuts/"},"frontmatter":{"title":"Keyboard Shortcuts","sidebar":{"match":"/guide/","order":3}}},{"fields":{"slug":"guide/observing-dom/"},"frontmatter":{"title":"Observing DOM","sidebar":{"match":"/guide/","order":2}}},{"fields":{"slug":"guide/using-modern-syntax/"},"frontmatter":{"title":"Modern Syntax","sidebar":{"match":"/guide/","order":1}}},{"fields":{"slug":"posts/how-to-edit-scripts-with-your-favorite-editor/"},"frontmatter":{"title":"How to edit scripts with your favorite editor?","sidebar":null}}]}}} \ No newline at end of file diff --git a/page-data/sq/d/1700780748.json b/page-data/sq/d/1700780748.json new file mode 100644 index 00000000..f1bdea03 --- /dev/null +++ b/page-data/sq/d/1700780748.json @@ -0,0 +1 @@ +{"data":{"site":{"siteMetadata":{"menu":[{"label":"Get it","path":"/get-it/"},{"label":"Guide","path":"/guide/"},{"label":"API","path":"/api/"},{"label":"FAQ","path":"/faq/"},{"label":"Blog","path":"/posts/"}]}},"allMdx":{"nodes":[{"fields":{"slug":"api/gm/"},"frontmatter":{"redirect_from":["/api/"]}},{"fields":{"slug":"posts/inject-into-context/"},"frontmatter":{"redirect_from":["/2018/11/23/inject-into-context/"]}},{"fields":{"slug":"posts/inject-scripts-with-blob-urls/"},"frontmatter":{"redirect_from":["/2017/10/28/Inject-scripts-with-BLOB-URLs/"]}},{"fields":{"slug":"posts/smart-rules-for-blacklist/"},"frontmatter":{"redirect_from":["/2017/04/15/Smart-rules-for-blacklist/"]}},{"fields":{"slug":"guide/creating-a-userscript/"},"frontmatter":{"redirect_from":["/guide/"]}},{"fields":{"slug":"posts/how-to-edit-scripts-with-your-favorite-editor/"},"frontmatter":{"redirect_from":["/2017/03/14/How-to-edit-scripts-with-your-favorite-editor/"]}}]}}} \ No newline at end of file diff --git a/page-data/sq/d/2344890832.json b/page-data/sq/d/2344890832.json new file mode 100644 index 00000000..5f500264 --- /dev/null +++ b/page-data/sq/d/2344890832.json @@ -0,0 +1 @@ +{"data":{"site":{"siteMetadata":{"copyright":"© All rights reserved.","footer":[{"label":"Privacy Policy","path":"/privacy/"}]}}}} \ No newline at end of file diff --git a/page-data/sq/d/3202921338.json b/page-data/sq/d/3202921338.json new file mode 100644 index 00000000..96968fc1 --- /dev/null +++ b/page-data/sq/d/3202921338.json @@ -0,0 +1 @@ +{"data":{"site":{"siteMetadata":{"title":"Violentmonkey","subtitle":"An open source userscript manager."}}}} \ No newline at end of file diff --git a/page-data/sq/d/3798213247.json b/page-data/sq/d/3798213247.json new file mode 100644 index 00000000..7cfb7eef --- /dev/null +++ b/page-data/sq/d/3798213247.json @@ -0,0 +1 @@ +{"data":{"allMdx":{"nodes":[{"fields":{"slug":"posts/features-in-userscript-generator/"},"frontmatter":{"title":"Features in Userscript Generator","date":"August 24, 2023","tags":null}},{"fields":{"slug":"posts/inject-into-context/"},"frontmatter":{"title":"Inject scripts into different contexts","date":"November 23, 2018","tags":["inject"]}},{"fields":{"slug":"posts/inject-scripts-with-blob-urls/"},"frontmatter":{"title":"Inject scripts with Blob URLs","date":"October 28, 2017","tags":["inject","blob"]}},{"fields":{"slug":"posts/smart-rules-for-blacklist/"},"frontmatter":{"title":"Smart rules for blacklist","date":"April 15, 2017","tags":["blacklist","exclude","match"]}},{"fields":{"slug":"posts/violentmonkey-workflows/"},"frontmatter":{"title":"Violentmonkey Workflows","date":"February 19, 2021","tags":["development"]}},{"fields":{"slug":"posts/how-to-edit-scripts-with-your-favorite-editor/"},"frontmatter":{"title":"How to edit scripts with your favorite editor?","date":"March 14, 2017","tags":["editor","crx","nex","oex","mx"]}}]}}} \ No newline at end of file diff --git a/polyfill-c7af91edbbea3673745d.js b/polyfill-c7af91edbbea3673745d.js new file mode 100644 index 00000000..ac1128f7 --- /dev/null +++ b/polyfill-c7af91edbbea3673745d.js @@ -0,0 +1,2 @@ +(self.webpackChunkviolentmonkey_github_io=self.webpackChunkviolentmonkey_github_io||[]).push([[920],{2050:function(t,e,r){!function(){var t="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==r.g?r.g:"undefined"!=typeof self?self:{};function e(t){var e={exports:{}};return t(e,e.exports),e.exports}var n,o,i=function(t){return t&&t.Math==Math&&t},a=i("object"==typeof globalThis&&globalThis)||i("object"==typeof window&&window)||i("object"==typeof self&&self)||i("object"==typeof t&&t)||function(){return this}()||t||Function("return this")(),u=function(t){try{return!!t()}catch(t){return!0}},c=!u((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),s=!u((function(){var t=function(){}.bind();return"function"!=typeof t||t.hasOwnProperty("prototype")})),f=Function.prototype.call,l=s?f.bind(f):function(){return f.apply(f,arguments)},h={}.propertyIsEnumerable,p=Object.getOwnPropertyDescriptor,d=p&&!h.call({1:2},1)?function(t){var e=p(this,t);return!!e&&e.enumerable}:h,v={f:d},g=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}},y=Function.prototype,b=y.call,m=s&&y.bind.bind(b,b),w=s?m:function(t){return function(){return b.apply(t,arguments)}},S=w({}.toString),E=w("".slice),O=function(t){return E(S(t),8,-1)},x=Object,j=w("".split),T=u((function(){return!x("z").propertyIsEnumerable(0)}))?function(t){return"String"==O(t)?j(t,""):x(t)}:x,A=function(t){return null==t},R=TypeError,_=function(t){if(A(t))throw R("Can't call method on "+t);return t},P=function(t){return T(_(t))},I="object"==typeof document&&document.all,k={all:I,IS_HTMLDDA:void 0===I&&void 0!==I},M=k.all,C=k.IS_HTMLDDA?function(t){return"function"==typeof t||t===M}:function(t){return"function"==typeof t},N=k.all,L=k.IS_HTMLDDA?function(t){return"object"==typeof t?null!==t:C(t)||t===N}:function(t){return"object"==typeof t?null!==t:C(t)},F=function(t,e){return arguments.length<2?C(r=a[t])?r:void 0:a[t]&&a[t][e];var r},D=w({}.isPrototypeOf),U="undefined"!=typeof navigator&&String(navigator.userAgent)||"",B=a.process,z=a.Deno,W=B&&B.versions||z&&z.version,G=W&&W.v8;G&&(o=(n=G.split("."))[0]>0&&n[0]<4?1:+(n[0]+n[1])),!o&&U&&(!(n=U.match(/Edge\/(\d+)/))||n[1]>=74)&&(n=U.match(/Chrome\/(\d+)/))&&(o=+n[1]);var K=o,$=a.String,V=!!Object.getOwnPropertySymbols&&!u((function(){var t=Symbol();return!$(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&K&&K<41})),q=V&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,H=Object,Y=q?function(t){return"symbol"==typeof t}:function(t){var e=F("Symbol");return C(e)&&D(e.prototype,H(t))},X=String,J=function(t){try{return X(t)}catch(t){return"Object"}},Q=TypeError,Z=function(t){if(C(t))return t;throw Q(J(t)+" is not a function")},tt=function(t,e){var r=t[e];return A(r)?void 0:Z(r)},et=TypeError,rt=Object.defineProperty,nt=function(t,e){try{rt(a,t,{value:e,configurable:!0,writable:!0})}catch(n){a[t]=e}return e},ot="__core-js_shared__",it=a[ot]||nt(ot,{}),at=e((function(t){(t.exports=function(t,e){return it[t]||(it[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.30.2",mode:"global",copyright:"© 2014-2023 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.30.2/LICENSE",source:"https://github.com/zloirock/core-js"})})),ut=Object,ct=function(t){return ut(_(t))},st=w({}.hasOwnProperty),ft=Object.hasOwn||function(t,e){return st(ct(t),e)},lt=0,ht=Math.random(),pt=w(1..toString),dt=function(t){return"Symbol("+(void 0===t?"":t)+")_"+pt(++lt+ht,36)},vt=a.Symbol,gt=at("wks"),yt=q?vt.for||vt:vt&&vt.withoutSetter||dt,bt=function(t){return ft(gt,t)||(gt[t]=V&&ft(vt,t)?vt[t]:yt("Symbol."+t)),gt[t]},mt=TypeError,wt=bt("toPrimitive"),St=function(t,e){if(!L(t)||Y(t))return t;var r,n=tt(t,wt);if(n){if(void 0===e&&(e="default"),r=l(n,t,e),!L(r)||Y(r))return r;throw mt("Can't convert object to primitive value")}return void 0===e&&(e="number"),function(t,e){var r,n;if("string"===e&&C(r=t.toString)&&!L(n=l(r,t)))return n;if(C(r=t.valueOf)&&!L(n=l(r,t)))return n;if("string"!==e&&C(r=t.toString)&&!L(n=l(r,t)))return n;throw et("Can't convert object to primitive value")}(t,e)},Et=function(t){var e=St(t,"string");return Y(e)?e:e+""},Ot=a.document,xt=L(Ot)&&L(Ot.createElement),jt=function(t){return xt?Ot.createElement(t):{}},Tt=!c&&!u((function(){return 7!=Object.defineProperty(jt("div"),"a",{get:function(){return 7}}).a})),At=Object.getOwnPropertyDescriptor,Rt={f:c?At:function(t,e){if(t=P(t),e=Et(e),Tt)try{return At(t,e)}catch(t){}if(ft(t,e))return g(!l(v.f,t,e),t[e])}},_t=c&&u((function(){return 42!=Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype})),Pt=String,It=TypeError,kt=function(t){if(L(t))return t;throw It(Pt(t)+" is not an object")},Mt=TypeError,Ct=Object.defineProperty,Nt=Object.getOwnPropertyDescriptor,Lt="enumerable",Ft="configurable",Dt="writable",Ut={f:c?_t?function(t,e,r){if(kt(t),e=Et(e),kt(r),"function"==typeof t&&"prototype"===e&&"value"in r&&Dt in r&&!r[Dt]){var n=Nt(t,e);n&&n[Dt]&&(t[e]=r.value,r={configurable:Ft in r?r[Ft]:n[Ft],enumerable:Lt in r?r[Lt]:n[Lt],writable:!1})}return Ct(t,e,r)}:Ct:function(t,e,r){if(kt(t),e=Et(e),kt(r),Tt)try{return Ct(t,e,r)}catch(t){}if("get"in r||"set"in r)throw Mt("Accessors not supported");return"value"in r&&(t[e]=r.value),t}},Bt=c?function(t,e,r){return Ut.f(t,e,g(1,r))}:function(t,e,r){return t[e]=r,t},zt=Function.prototype,Wt=c&&Object.getOwnPropertyDescriptor,Gt=ft(zt,"name"),Kt={EXISTS:Gt,PROPER:Gt&&"something"===function(){}.name,CONFIGURABLE:Gt&&(!c||c&&Wt(zt,"name").configurable)},$t=w(Function.toString);C(it.inspectSource)||(it.inspectSource=function(t){return $t(t)});var Vt,qt,Ht,Yt=it.inspectSource,Xt=a.WeakMap,Jt=C(Xt)&&/native code/.test(String(Xt)),Qt=at("keys"),Zt=function(t){return Qt[t]||(Qt[t]=dt(t))},te={},ee="Object already initialized",re=a.TypeError;if(Jt||it.state){var ne=it.state||(it.state=new(0,a.WeakMap));ne.get=ne.get,ne.has=ne.has,ne.set=ne.set,Vt=function(t,e){if(ne.has(t))throw re(ee);return e.facade=t,ne.set(t,e),e},qt=function(t){return ne.get(t)||{}},Ht=function(t){return ne.has(t)}}else{var oe=Zt("state");te[oe]=!0,Vt=function(t,e){if(ft(t,oe))throw re(ee);return e.facade=t,Bt(t,oe,e),e},qt=function(t){return ft(t,oe)?t[oe]:{}},Ht=function(t){return ft(t,oe)}}var ie,ae={set:Vt,get:qt,has:Ht,enforce:function(t){return Ht(t)?qt(t):Vt(t,{})},getterFor:function(t){return function(e){var r;if(!L(e)||(r=qt(e)).type!==t)throw re("Incompatible receiver, "+t+" required");return r}}},ue=e((function(t){var e=Kt.CONFIGURABLE,r=ae.enforce,n=ae.get,o=String,i=Object.defineProperty,a=w("".slice),s=w("".replace),f=w([].join),l=c&&!u((function(){return 8!==i((function(){}),"length",{value:8}).length})),h=String(String).split("String"),p=t.exports=function(t,n,u){"Symbol("===a(o(n),0,7)&&(n="["+s(o(n),/^Symbol\(([^)]*)\)/,"$1")+"]"),u&&u.getter&&(n="get "+n),u&&u.setter&&(n="set "+n),(!ft(t,"name")||e&&t.name!==n)&&(c?i(t,"name",{value:n,configurable:!0}):t.name=n),l&&u&&ft(u,"arity")&&t.length!==u.arity&&i(t,"length",{value:u.arity});try{u&&ft(u,"constructor")&&u.constructor?c&&i(t,"prototype",{writable:!1}):t.prototype&&(t.prototype=void 0)}catch(t){}var p=r(t);return ft(p,"source")||(p.source=f(h,"string"==typeof n?n:"")),t};Function.prototype.toString=p((function(){return C(this)&&n(this).source||Yt(this)}),"toString")})),ce=function(t,e,r,n){n||(n={});var o=n.enumerable,i=void 0!==n.name?n.name:e;if(C(r)&&ue(r,i,n),n.global)o?t[e]=r:nt(e,r);else{try{n.unsafe?t[e]&&(o=!0):delete t[e]}catch(t){}o?t[e]=r:Ut.f(t,e,{value:r,enumerable:!1,configurable:!n.nonConfigurable,writable:!n.nonWritable})}return t},se=Math.ceil,fe=Math.floor,le=Math.trunc||function(t){var e=+t;return(e>0?fe:se)(e)},he=function(t){var e=+t;return e!=e||0===e?0:le(e)},pe=Math.max,de=Math.min,ve=function(t,e){var r=he(t);return r<0?pe(r+e,0):de(r,e)},ge=Math.min,ye=function(t){return t>0?ge(he(t),9007199254740991):0},be=function(t){return ye(t.length)},me=function(t){return function(e,r,n){var o,i=P(e),a=be(i),u=ve(n,a);if(t&&r!=r){for(;a>u;)if((o=i[u++])!=o)return!0}else for(;a>u;u++)if((t||u in i)&&i[u]===r)return t||u||0;return!t&&-1}},we={includes:me(!0),indexOf:me(!1)},Se=we.indexOf,Ee=w([].push),Oe=function(t,e){var r,n=P(t),o=0,i=[];for(r in n)!ft(te,r)&&ft(n,r)&&Ee(i,r);for(;e.length>o;)ft(n,r=e[o++])&&(~Se(i,r)||Ee(i,r));return i},xe=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],je=xe.concat("length","prototype"),Te={f:Object.getOwnPropertyNames||function(t){return Oe(t,je)}},Ae={f:Object.getOwnPropertySymbols},Re=w([].concat),_e=F("Reflect","ownKeys")||function(t){var e=Te.f(kt(t)),r=Ae.f;return r?Re(e,r(t)):e},Pe=function(t,e,r){for(var n=_e(e),o=Ut.f,i=Rt.f,a=0;a2?arguments[2]:void 0,u=We((void 0===a?n:ve(a,n))-i,n-o),c=1;for(i0;)i in r?r[o]=r[i]:ze(r,o),o+=c,i+=c;return r},Ke=Object.keys||function(t){return Oe(t,xe)},$e=c&&!_t?Object.defineProperties:function(t,e){kt(t);for(var r,n=P(e),o=Ke(e),i=o.length,a=0;i>a;)Ut.f(t,r=o[a++],n[r]);return t},Ve={f:$e},qe=F("document","documentElement"),He="prototype",Ye="script",Xe=Zt("IE_PROTO"),Je=function(){},Qe=function(t){return"<"+Ye+">"+t+""},Ze=function(t){t.write(Qe("")),t.close();var e=t.parentWindow.Object;return t=null,e},tr=function(){try{ie=new ActiveXObject("htmlfile")}catch(t){}var t,e,r;tr="undefined"!=typeof document?document.domain&&ie?Ze(ie):(e=jt("iframe"),r="java"+Ye+":",e.style.display="none",qe.appendChild(e),e.src=String(r),(t=e.contentWindow.document).open(),t.write(Qe("document.F=Object")),t.close(),t.F):Ze(ie);for(var n=xe.length;n--;)delete tr[He][xe[n]];return tr()};te[Xe]=!0;var er=Object.create||function(t,e){var r;return null!==t?(Je[He]=kt(t),r=new Je,Je[He]=null,r[Xe]=t):r=tr(),void 0===e?r:Ve.f(r,e)},rr=Ut.f,nr=bt("unscopables"),or=Array.prototype;null==or[nr]&&rr(or,nr,{configurable:!0,value:er(null)});var ir=function(t){or[nr][t]=!0};Ue({target:"Array",proto:!0},{copyWithin:Ge}),ir("copyWithin");var ar=function(t,e){return w(a[t].prototype[e])};ar("Array","copyWithin"),Ue({target:"Array",proto:!0},{fill:function(t){for(var e=ct(this),r=be(e),n=arguments.length,o=ve(n>1?arguments[1]:void 0,r),i=n>2?arguments[2]:void 0,a=void 0===i?r:ve(i,r);a>o;)e[o++]=t;return e}}),ir("fill"),ar("Array","fill");var ur=function(t){if("Function"===O(t))return w(t)},cr=ur(ur.bind),sr=function(t,e){return Z(t),void 0===e?t:s?cr(t,e):function(){return t.apply(e,arguments)}},fr=Array.isArray||function(t){return"Array"==O(t)},lr={};lr[bt("toStringTag")]="z";var hr="[object z]"===String(lr),pr=bt("toStringTag"),dr=Object,vr="Arguments"==O(function(){return arguments}()),gr=hr?O:function(t){var e,r,n;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(r=function(t,e){try{return t[e]}catch(t){}}(e=dr(t),pr))?r:vr?O(e):"Object"==(n=O(e))&&C(e.callee)?"Arguments":n},yr=function(){},br=[],mr=F("Reflect","construct"),wr=/^\s*(?:class|function)\b/,Sr=w(wr.exec),Er=!wr.exec(yr),Or=function(t){if(!C(t))return!1;try{return mr(yr,br,t),!0}catch(t){return!1}},xr=function(t){if(!C(t))return!1;switch(gr(t)){case"AsyncFunction":case"GeneratorFunction":case"AsyncGeneratorFunction":return!1}try{return Er||!!Sr(wr,Yt(t))}catch(t){return!0}};xr.sham=!0;var jr=!mr||u((function(){var t;return Or(Or.call)||!Or(Object)||!Or((function(){t=!0}))||t}))?xr:Or,Tr=bt("species"),Ar=Array,Rr=function(t,e){return new(function(t){var e;return fr(t)&&(jr(e=t.constructor)&&(e===Ar||fr(e.prototype))||L(e)&&null===(e=e[Tr]))&&(e=void 0),void 0===e?Ar:e}(t))(0===e?0:e)},_r=w([].push),Pr=function(t){var e=1==t,r=2==t,n=3==t,o=4==t,i=6==t,a=7==t,u=5==t||i;return function(c,s,f,l){for(var h,p,d=ct(c),v=T(d),g=sr(s,f),y=be(v),b=0,m=l||Rr,w=e?m(c,y):r||a?m(c,0):void 0;y>b;b++)if((u||b in v)&&(p=g(h=v[b],b,d),t))if(e)w[b]=p;else if(p)switch(t){case 3:return!0;case 5:return h;case 6:return b;case 2:_r(w,h)}else switch(t){case 4:return!1;case 7:_r(w,h)}return i?-1:n||o?o:w}},Ir={forEach:Pr(0),map:Pr(1),filter:Pr(2),some:Pr(3),every:Pr(4),find:Pr(5),findIndex:Pr(6),filterReject:Pr(7)},kr=Ir.find,Mr="find",Cr=!0;Mr in[]&&Array(1)[Mr]((function(){Cr=!1})),Ue({target:"Array",proto:!0,forced:Cr},{find:function(t){return kr(this,t,arguments.length>1?arguments[1]:void 0)}}),ir(Mr),ar("Array","find");var Nr=Ir.findIndex,Lr="findIndex",Fr=!0;Lr in[]&&Array(1)[Lr]((function(){Fr=!1})),Ue({target:"Array",proto:!0,forced:Fr},{findIndex:function(t){return Nr(this,t,arguments.length>1?arguments[1]:void 0)}}),ir(Lr),ar("Array","findIndex");var Dr=TypeError,Ur=function(t){if(t>9007199254740991)throw Dr("Maximum allowed index exceeded");return t},Br=function(t,e,r,n,o,i,a,u){for(var c,s,f=o,l=0,h=!!a&&sr(a,u);l0&&fr(c)?(s=be(c),f=Br(t,e,c,s,f,i-1)-1):(Ur(f+1),t[f]=c),f++),l++;return f},zr=Br;Ue({target:"Array",proto:!0},{flatMap:function(t){var e,r=ct(this),n=be(r);return Z(t),(e=Rr(r,0)).length=zr(e,r,r,n,0,1,t,arguments.length>1?arguments[1]:void 0),e}}),ir("flatMap"),ar("Array","flatMap"),Ue({target:"Array",proto:!0},{flat:function(){var t=arguments.length?arguments[0]:void 0,e=ct(this),r=be(e),n=Rr(e,0);return n.length=zr(n,e,e,r,0,void 0===t?1:he(t)),n}}),ir("flat"),ar("Array","flat");var Wr,Gr,Kr,$r=String,Vr=function(t){if("Symbol"===gr(t))throw TypeError("Cannot convert a Symbol value to a string");return $r(t)},qr=w("".charAt),Hr=w("".charCodeAt),Yr=w("".slice),Xr=function(t){return function(e,r){var n,o,i=Vr(_(e)),a=he(r),u=i.length;return a<0||a>=u?t?"":void 0:(n=Hr(i,a))<55296||n>56319||a+1===u||(o=Hr(i,a+1))<56320||o>57343?t?qr(i,a):n:t?Yr(i,a,a+2):o-56320+(n-55296<<10)+65536}},Jr={codeAt:Xr(!1),charAt:Xr(!0)},Qr=!u((function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype})),Zr=Zt("IE_PROTO"),tn=Object,en=tn.prototype,rn=Qr?tn.getPrototypeOf:function(t){var e=ct(t);if(ft(e,Zr))return e[Zr];var r=e.constructor;return C(r)&&e instanceof r?r.prototype:e instanceof tn?en:null},nn=bt("iterator"),on=!1;[].keys&&("next"in(Kr=[].keys())?(Gr=rn(rn(Kr)))!==Object.prototype&&(Wr=Gr):on=!0);var an=!L(Wr)||u((function(){var t={};return Wr[nn].call(t)!==t}));an&&(Wr={}),C(Wr[nn])||ce(Wr,nn,(function(){return this}));var un={IteratorPrototype:Wr,BUGGY_SAFARI_ITERATORS:on},cn=Ut.f,sn=bt("toStringTag"),fn=function(t,e,r){t&&!r&&(t=t.prototype),t&&!ft(t,sn)&&cn(t,sn,{configurable:!0,value:e})},ln={},hn=un.IteratorPrototype,pn=function(){return this},dn=function(t,e,r){try{return w(Z(Object.getOwnPropertyDescriptor(t,e)[r]))}catch(t){}},vn=String,gn=TypeError,yn=function(t){if("object"==typeof t||C(t))return t;throw gn("Can't set "+vn(t)+" as a prototype")},bn=Object.setPrototypeOf||("__proto__"in{}?function(){var t,e=!1,r={};try{(t=dn(Object.prototype,"__proto__","set"))(r,[]),e=r instanceof Array}catch(t){}return function(r,n){return kt(r),yn(n),e?t(r,n):r.__proto__=n,r}}():void 0),mn=Kt.PROPER,wn=Kt.CONFIGURABLE,Sn=un.IteratorPrototype,En=un.BUGGY_SAFARI_ITERATORS,On=bt("iterator"),xn="keys",jn="values",Tn="entries",An=function(){return this},Rn=function(t,e,r,n,o,i,a){!function(t,e,r,n){var o=e+" Iterator";t.prototype=er(hn,{next:g(1,r)}),fn(t,o,!1),ln[o]=pn}(r,e,n);var u,c,s,f=function(t){if(t===o&&y)return y;if(!En&&t in d)return d[t];switch(t){case xn:case jn:case Tn:return function(){return new r(this,t)}}return function(){return new r(this)}},h=e+" Iterator",p=!1,d=t.prototype,v=d[On]||d["@@iterator"]||o&&d[o],y=!En&&v||f(o),b="Array"==e&&d.entries||v;if(b&&(u=rn(b.call(new t)))!==Object.prototype&&u.next&&(rn(u)!==Sn&&(bn?bn(u,Sn):C(u[On])||ce(u,On,An)),fn(u,h,!0)),mn&&o==jn&&v&&v.name!==jn&&(wn?Bt(d,"name",jn):(p=!0,y=function(){return l(v,this)})),o)if(c={values:f(jn),keys:i?y:f(xn),entries:f(Tn)},a)for(s in c)(En||p||!(s in d))&&ce(d,s,c[s]);else Ue({target:e,proto:!0,forced:En||p},c);return d[On]!==y&&ce(d,On,y,{name:o}),ln[e]=y,c},_n=function(t,e){return{value:t,done:e}},Pn=Jr.charAt,In="String Iterator",kn=ae.set,Mn=ae.getterFor(In);Rn(String,"String",(function(t){kn(this,{type:In,string:Vr(t),index:0})}),(function(){var t,e=Mn(this),r=e.string,n=e.index;return n>=r.length?_n(void 0,!0):(t=Pn(r,n),e.index+=t.length,_n(t,!1))}));var Cn=function(t,e,r){var n,o;kt(t);try{if(!(n=tt(t,"return"))){if("throw"===e)throw r;return r}n=l(n,t)}catch(t){o=!0,n=t}if("throw"===e)throw r;if(o)throw n;return kt(n),r},Nn=function(t,e,r,n){try{return n?e(kt(r)[0],r[1]):e(r)}catch(e){Cn(t,"throw",e)}},Ln=bt("iterator"),Fn=Array.prototype,Dn=function(t){return void 0!==t&&(ln.Array===t||Fn[Ln]===t)},Un=function(t,e,r){var n=Et(e);n in t?Ut.f(t,n,g(0,r)):t[n]=r},Bn=bt("iterator"),zn=function(t){if(!A(t))return tt(t,Bn)||tt(t,"@@iterator")||ln[gr(t)]},Wn=TypeError,Gn=function(t,e){var r=arguments.length<2?zn(t):e;if(Z(r))return kt(l(r,t));throw Wn(J(t)+" is not iterable")},Kn=Array,$n=bt("iterator"),Vn=!1;try{var qn=0,Hn={next:function(){return{done:!!qn++}},return:function(){Vn=!0}};Hn[$n]=function(){return this},Array.from(Hn,(function(){throw 2}))}catch(t){}var Yn=function(t,e){if(!e&&!Vn)return!1;var r=!1;try{var n={};n[$n]=function(){return{next:function(){return{done:r=!0}}}},t(n)}catch(t){}return r},Xn=!Yn((function(t){Array.from(t)}));Ue({target:"Array",stat:!0,forced:Xn},{from:function(t){var e=ct(t),r=jr(this),n=arguments.length,o=n>1?arguments[1]:void 0,i=void 0!==o;i&&(o=sr(o,n>2?arguments[2]:void 0));var a,u,c,s,f,h,p=zn(e),d=0;if(!p||this===Kn&&Dn(p))for(a=be(e),u=r?new this(a):Kn(a);a>d;d++)h=i?o(e[d],d):e[d],Un(u,d,h);else for(f=(s=Gn(e,p)).next,u=r?new this:[];!(c=l(f,s)).done;d++)h=i?Nn(s,o,[c.value,d],!0):c.value,Un(u,d,h);return u.length=d,u}});var Jn=a,Qn=we.includes,Zn=u((function(){return!Array(1).includes()}));Ue({target:"Array",proto:!0,forced:Zn},{includes:function(t){return Qn(this,t,arguments.length>1?arguments[1]:void 0)}}),ir("includes"),ar("Array","includes");var to=Ut.f,eo="Array Iterator",ro=ae.set,no=ae.getterFor(eo),oo=Rn(Array,"Array",(function(t,e){ro(this,{type:eo,target:P(t),index:0,kind:e})}),(function(){var t=no(this),e=t.target,r=t.kind,n=t.index++;return!e||n>=e.length?(t.target=void 0,_n(void 0,!0)):_n("keys"==r?n:"values"==r?e[n]:[n,e[n]],!1)}),"values"),io=ln.Arguments=ln.Array;if(ir("keys"),ir("values"),ir("entries"),c&&"values"!==io.name)try{to(io,"name",{value:"values"})}catch(t){}hr||ce(Object.prototype,"toString",hr?{}.toString:function(){return"[object "+gr(this)+"]"},{unsafe:!0}),ar("Array","values");var ao=Array,uo=u((function(){function t(){}return!(ao.of.call(t)instanceof t)}));Ue({target:"Array",stat:!0,forced:uo},{of:function(){for(var t=0,e=arguments.length,r=new(jr(this)?this:ao)(e);e>t;)Un(r,t,arguments[t++]);return r.length=e,r}});var co=bt("hasInstance"),so=Function.prototype;co in so||Ut.f(so,co,{value:ue((function(t){if(!C(this)||!L(t))return!1;var e=this.prototype;if(!L(e))return t instanceof this;for(;t=rn(t);)if(e===t)return!0;return!1}),co)}),bt("hasInstance");var fo=function(t,e,r){return r.get&&ue(r.get,e,{getter:!0}),r.set&&ue(r.set,e,{setter:!0}),Ut.f(t,e,r)},lo=Kt.EXISTS,ho=Function.prototype,po=w(ho.toString),vo=/function\b(?:\s|\/\*[\S\s]*?\*\/|\/\/[^\n\r]*[\n\r]+)*([^\s(/]*)/,go=w(vo.exec);c&&!lo&&fo(ho,"name",{configurable:!0,get:function(){try{return go(vo,po(this))[1]}catch(t){return""}}});var yo=Array,bo=Math.max,mo=function(t,e,r){for(var n=be(t),o=ve(e,n),i=ve(void 0===r?n:r,n),a=yo(bo(i-o,0)),u=0;oi;i++)if((u=y(t[i]))&&D(Po,u))return u;return new _o(!1)}n=Gn(t,o)}for(c=h?t.next:n.next;!(s=l(c,n)).done;){try{u=y(s.value)}catch(t){Cn(n,"throw",t)}if("object"==typeof u&&u&&D(Po,u))return u}return new _o(!1)},ko=TypeError,Mo=function(t,e){if(D(e,t))return t;throw ko("Incorrect invocation")},Co=function(t,e,r){var n,o;return bn&&C(n=e.constructor)&&n!==r&&L(o=n.prototype)&&o!==r.prototype&&bn(t,o),t},No=function(t,e,r){var n=-1!==t.indexOf("Map"),o=-1!==t.indexOf("Weak"),i=n?"set":"add",c=a[t],s=c&&c.prototype,f=c,l={},h=function(t){var e=w(s[t]);ce(s,t,"add"==t?function(t){return e(this,0===t?0:t),this}:"delete"==t?function(t){return!(o&&!L(t))&&e(this,0===t?0:t)}:"get"==t?function(t){return o&&!L(t)?void 0:e(this,0===t?0:t)}:"has"==t?function(t){return!(o&&!L(t))&&e(this,0===t?0:t)}:function(t,r){return e(this,0===t?0:t,r),this})};if(Fe(t,!C(c)||!(o||s.forEach&&!u((function(){(new c).entries().next()})))))f=r.getConstructor(e,t,n,i),Ao.enable();else if(Fe(t,!0)){var p=new f,d=p[i](o?{}:-0,1)!=p,v=u((function(){p.has(1)})),g=Yn((function(t){new c(t)})),y=!o&&u((function(){for(var t=new c,e=5;e--;)t[i](e,e);return!t.has(-0)}));g||((f=e((function(t,e){Mo(t,s);var r=Co(new c,t,f);return A(e)||Io(e,r[i],{that:r,AS_ENTRIES:n}),r}))).prototype=s,s.constructor=f),(v||y)&&(h("delete"),h("has"),n&&h("get")),(y||d)&&h(i),o&&s.clear&&delete s.clear}return l[t]=f,Ue({global:!0,constructor:!0,forced:f!=c},l),fn(f,t),o||r.setStrong(f,t,n),f},Lo=function(t,e,r){for(var n in e)ce(t,n,e[n],r);return t},Fo=bt("species"),Do=function(t){var e=F(t);c&&e&&!e[Fo]&&fo(e,Fo,{configurable:!0,get:function(){return this}})},Uo=Ao.fastKey,Bo=ae.set,zo=ae.getterFor,Wo={getConstructor:function(t,e,r,n){var o=t((function(t,o){Mo(t,i),Bo(t,{type:e,index:er(null),first:void 0,last:void 0,size:0}),c||(t.size=0),A(o)||Io(o,t[n],{that:t,AS_ENTRIES:r})})),i=o.prototype,a=zo(e),u=function(t,e,r){var n,o,i=a(t),u=s(t,e);return u?u.value=r:(i.last=u={index:o=Uo(e,!0),key:e,value:r,previous:n=i.last,next:void 0,removed:!1},i.first||(i.first=u),n&&(n.next=u),c?i.size++:t.size++,"F"!==o&&(i.index[o]=u)),t},s=function(t,e){var r,n=a(t),o=Uo(e);if("F"!==o)return n.index[o];for(r=n.first;r;r=r.next)if(r.key==e)return r};return Lo(i,{clear:function(){for(var t=a(this),e=t.index,r=t.first;r;)r.removed=!0,r.previous&&(r.previous=r.previous.next=void 0),delete e[r.index],r=r.next;t.first=t.last=void 0,c?t.size=0:this.size=0},delete:function(t){var e=this,r=a(e),n=s(e,t);if(n){var o=n.next,i=n.previous;delete r.index[n.index],n.removed=!0,i&&(i.next=o),o&&(o.previous=i),r.first==n&&(r.first=o),r.last==n&&(r.last=i),c?r.size--:e.size--}return!!n},forEach:function(t){for(var e,r=a(this),n=sr(t,arguments.length>1?arguments[1]:void 0);e=e?e.next:r.first;)for(n(e.value,e.key,this);e&&e.removed;)e=e.previous},has:function(t){return!!s(this,t)}}),Lo(i,r?{get:function(t){var e=s(this,t);return e&&e.value},set:function(t,e){return u(this,0===t?0:t,e)}}:{add:function(t){return u(this,t=0===t?0:t,t)}}),c&&fo(i,"size",{configurable:!0,get:function(){return a(this).size}}),o},setStrong:function(t,e,r){var n=e+" Iterator",o=zo(e),i=zo(n);Rn(t,e,(function(t,e){Bo(this,{type:n,target:t,state:o(t),kind:e,last:void 0})}),(function(){for(var t=i(this),e=t.kind,r=t.last;r&&r.removed;)r=r.previous;return t.target&&(t.last=r=r?r.next:t.state.first)?_n("keys"==e?r.key:"values"==e?r.value:[r.key,r.value],!1):(t.target=void 0,_n(void 0,!0))}),r?"entries":"values",!r,!0),Do(e)}};No("Map",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),Wo);var Go={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0},Ko=jt("span").classList,$o=Ko&&Ko.constructor&&Ko.constructor.prototype,Vo=$o===Object.prototype?void 0:$o,qo=bt("iterator"),Ho=bt("toStringTag"),Yo=oo.values,Xo=function(t,e){if(t){if(t[qo]!==Yo)try{Bt(t,qo,Yo)}catch(e){t[qo]=Yo}if(t[Ho]||Bt(t,Ho,e),Go[e])for(var r in oo)if(t[r]!==oo[r])try{Bt(t,r,oo[r])}catch(e){t[r]=oo[r]}}};for(var Jo in Go)Xo(a[Jo]&&a[Jo].prototype,Jo);Xo(Vo,"DOMTokenList");var Qo=TypeError,Zo=function(t){if(jr(t))return t;throw Qo(J(t)+" is not a constructor")},ti=[].push,ei=function(t){var e,r,n,o,i=arguments.length,a=i>1?arguments[1]:void 0;return Zo(this),(e=void 0!==a)&&Z(a),A(t)?new this:(r=[],e?(n=0,o=sr(a,i>2?arguments[2]:void 0),Io(t,(function(t){l(ti,r,o(t,n++))}))):Io(t,ti,{that:r}),new this(r))};Ue({target:"Map",stat:!0,forced:!0},{from:ei});var ri=w([].slice),ni=function(){return new this(ri(arguments))};Ue({target:"Map",stat:!0,forced:!0},{of:ni});var oi=Map.prototype,ii={Map:Map,set:w(oi.set),get:w(oi.get),has:w(oi.has),remove:w(oi.delete),proto:oi},ai=ii.has,ui=function(t){return ai(t),t},ci=ii.remove;Ue({target:"Map",proto:!0,real:!0,forced:!0},{deleteAll:function(){for(var t,e=ui(this),r=!0,n=0,o=arguments.length;n1?arguments[1]:void 0);return!1!==bi(e,(function(t,n){if(!r(t,n,e))return!1}),!0)}});var mi=ii.Map,wi=ii.set;Ue({target:"Map",proto:!0,real:!0,forced:!0},{filter:function(t){var e=ui(this),r=sr(t,arguments.length>1?arguments[1]:void 0),n=new mi;return bi(e,(function(t,o){r(t,o,e)&&wi(n,o,t)})),n}}),Ue({target:"Map",proto:!0,real:!0,forced:!0},{find:function(t){var e=ui(this),r=sr(t,arguments.length>1?arguments[1]:void 0),n=bi(e,(function(t,n){if(r(t,n,e))return{value:t}}),!0);return n&&n.value}}),Ue({target:"Map",proto:!0,real:!0,forced:!0},{findKey:function(t){var e=ui(this),r=sr(t,arguments.length>1?arguments[1]:void 0),n=bi(e,(function(t,n){if(r(t,n,e))return{key:n}}),!0);return n&&n.key}});var Si=ii.Map,Ei=w([].push);Ue({target:"Map",stat:!0,forced:!0},{groupBy:function(t,e){var r=new(C(this)?this:Si);Z(e);var n=Z(r.has),o=Z(r.get),i=Z(r.set);return Io(t,(function(t){var a=e(t);l(n,r,a)?Ei(l(o,r,a),t):l(i,r,a,[t])})),r}}),Ue({target:"Map",proto:!0,real:!0,forced:!0},{includes:function(t){return!0===bi(ui(this),(function(e){if((r=e)===(n=t)||r!=r&&n!=n)return!0;var r,n}),!0)}});var Oi=ii.Map;Ue({target:"Map",stat:!0,forced:!0},{keyBy:function(t,e){var r=new(C(this)?this:Oi);Z(e);var n=Z(r.set);return Io(t,(function(t){l(n,r,e(t),t)})),r}}),Ue({target:"Map",proto:!0,real:!0,forced:!0},{keyOf:function(t){var e=bi(ui(this),(function(e,r){if(e===t)return{key:r}}),!0);return e&&e.key}});var xi=ii.Map,ji=ii.set;Ue({target:"Map",proto:!0,real:!0,forced:!0},{mapKeys:function(t){var e=ui(this),r=sr(t,arguments.length>1?arguments[1]:void 0),n=new xi;return bi(e,(function(t,o){ji(n,r(t,o,e),t)})),n}});var Ti=ii.Map,Ai=ii.set;Ue({target:"Map",proto:!0,real:!0,forced:!0},{mapValues:function(t){var e=ui(this),r=sr(t,arguments.length>1?arguments[1]:void 0),n=new Ti;return bi(e,(function(t,o){Ai(n,o,r(t,o,e))})),n}});var Ri=ii.set;Ue({target:"Map",proto:!0,real:!0,arity:1,forced:!0},{merge:function(t){for(var e=ui(this),r=arguments.length,n=0;n1?arguments[1]:void 0);return!0===bi(e,(function(t,n){if(r(t,n,e))return!0}),!0)}});var Pi=TypeError,Ii=ii.get,ki=ii.has,Mi=ii.set;Ue({target:"Map",proto:!0,real:!0,forced:!0},{update:function(t,e){var r=ui(this),n=arguments.length;Z(e);var o=ki(r,t);if(!o&&n<3)throw Pi("Updating absent value");var i=o?Ii(r,t):Z(n>2?arguments[2]:void 0)(t,r);return Mi(r,t,e(i,t,r)),r}});var Ci=TypeError,Ni=function(t,e){var r,n=kt(this),o=Z(n.get),i=Z(n.has),a=Z(n.set),u=arguments.length>2?arguments[2]:void 0;if(!C(e)&&!C(u))throw Ci("At least one callback required");return l(i,n,t)?(r=l(o,n,t),C(e)&&(r=e(r),l(a,n,t,r))):C(u)&&(r=u(),l(a,n,t,r)),r};Ue({target:"Map",proto:!0,real:!0,forced:!0},{upsert:Ni}),Ue({target:"Map",proto:!0,real:!0,name:"upsert",forced:!0},{updateOrInsert:Ni}),No("Set",(function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}}),Wo);var Li=Set.prototype,Fi={Set:Set,add:w(Li.add),has:w(Li.has),remove:w(Li.delete),proto:Li},Di=Fi.has,Ui=function(t){return Di(t),t},Bi=Fi.Set,zi=Fi.proto,Wi=w(zi.forEach),Gi=w(zi.keys),Ki=Gi(new Bi).next,$i=function(t,e,r){return r?hi(Gi(t),e,Ki):Wi(t,e)},Vi=Fi.Set,qi=Fi.add,Hi=function(t){var e=new Vi;return $i(t,(function(t){qi(e,t)})),e},Yi=dn(Fi.proto,"size","get")||function(t){return t.size},Xi=TypeError,Ji=Math.max,Qi=function(t,e,r,n){this.set=t,this.size=e,this.has=r,this.keys=n};Qi.prototype={getIterator:function(){return kt(l(this.keys,this.set))},includes:function(t){return l(this.has,this.set,t)}};var Zi=function(t){kt(t);var e=+t.size;if(e!=e)throw Xi("Invalid size");return new Qi(t,Ji(he(e),0),Z(t.has),Z(t.keys))},ta=Fi.has,ea=Fi.remove,ra=function(t){var e=Ui(this),r=Zi(t),n=Hi(e);return Yi(e)<=r.size?$i(e,(function(t){r.includes(t)&&ea(n,t)})):hi(r.getIterator(),(function(t){ta(e,t)&&ea(n,t)})),n},na=function(t){try{return(new(F("Set")))[t]({size:0,has:function(){return!1},keys:function(){return{next:function(){return{done:!0}}}}}),!0}catch(t){return!1}};Ue({target:"Set",proto:!0,real:!0,forced:!na("difference")},{difference:ra});var oa=Fi.Set,ia=Fi.add,aa=Fi.has,ua=function(t){var e=Ui(this),r=Zi(t),n=new oa;return Yi(e)>r.size?hi(r.getIterator(),(function(t){aa(e,t)&&ia(n,t)})):$i(e,(function(t){r.includes(t)&&ia(n,t)})),n},ca=!na("intersection")||u((function(){return"3,2"!=Array.from(new Set([1,2,3]).intersection(new Set([3,2])))}));Ue({target:"Set",proto:!0,real:!0,forced:ca},{intersection:ua});var sa=Fi.has,fa=function(t){var e=Ui(this),r=Zi(t);if(Yi(e)<=r.size)return!1!==$i(e,(function(t){if(r.includes(t))return!1}),!0);var n=r.getIterator();return!1!==hi(n,(function(t){if(sa(e,t))return Cn(n,"normal",!1)}))};Ue({target:"Set",proto:!0,real:!0,forced:!na("isDisjointFrom")},{isDisjointFrom:fa});var la=function(t){var e=Ui(this),r=Zi(t);return!(Yi(e)>r.size)&&!1!==$i(e,(function(t){if(!r.includes(t))return!1}),!0)};Ue({target:"Set",proto:!0,real:!0,forced:!na("isSubsetOf")},{isSubsetOf:la});var ha=Fi.has,pa=function(t){var e=Ui(this),r=Zi(t);if(Yi(e)1?arguments[1]:void 0);return!1!==$i(e,(function(t){if(!r(t,t,e))return!1}),!0)}});var Ea=bt("iterator"),Oa=Object,xa=F("Set"),ja=function(t){return function(t){return L(t)&&"number"==typeof t.size&&C(t.has)&&C(t.keys)}(t)?t:function(t){if(A(t))return!1;var e=Oa(t);return void 0!==e[Ea]||"@@iterator"in e||ft(ln,gr(e))}(t)?new xa(t):t};Ue({target:"Set",proto:!0,real:!0,forced:!0},{difference:function(t){return l(ra,this,ja(t))}});var Ta=Fi.Set,Aa=Fi.add;Ue({target:"Set",proto:!0,real:!0,forced:!0},{filter:function(t){var e=Ui(this),r=sr(t,arguments.length>1?arguments[1]:void 0),n=new Ta;return $i(e,(function(t){r(t,t,e)&&Aa(n,t)})),n}}),Ue({target:"Set",proto:!0,real:!0,forced:!0},{find:function(t){var e=Ui(this),r=sr(t,arguments.length>1?arguments[1]:void 0),n=$i(e,(function(t){if(r(t,t,e))return{value:t}}),!0);return n&&n.value}}),Ue({target:"Set",proto:!0,real:!0,forced:!0},{intersection:function(t){return l(ua,this,ja(t))}}),Ue({target:"Set",proto:!0,real:!0,forced:!0},{isDisjointFrom:function(t){return l(fa,this,ja(t))}}),Ue({target:"Set",proto:!0,real:!0,forced:!0},{isSubsetOf:function(t){return l(la,this,ja(t))}}),Ue({target:"Set",proto:!0,real:!0,forced:!0},{isSupersetOf:function(t){return l(pa,this,ja(t))}});var Ra=w([].join),_a=w([].push);Ue({target:"Set",proto:!0,real:!0,forced:!0},{join:function(t){var e=Ui(this),r=void 0===t?",":Vr(t),n=[];return $i(e,(function(t){_a(n,t)})),Ra(n,r)}});var Pa=Fi.Set,Ia=Fi.add;Ue({target:"Set",proto:!0,real:!0,forced:!0},{map:function(t){var e=Ui(this),r=sr(t,arguments.length>1?arguments[1]:void 0),n=new Pa;return $i(e,(function(t){Ia(n,r(t,t,e))})),n}});var ka=TypeError;Ue({target:"Set",proto:!0,real:!0,forced:!0},{reduce:function(t){var e=Ui(this),r=arguments.length<2,n=r?void 0:arguments[1];if(Z(t),$i(e,(function(o){r?(r=!1,n=o):n=t(n,o,o,e)})),r)throw ka("Reduce of empty set with no initial value");return n}}),Ue({target:"Set",proto:!0,real:!0,forced:!0},{some:function(t){var e=Ui(this),r=sr(t,arguments.length>1?arguments[1]:void 0);return!0===$i(e,(function(t){if(r(t,t,e))return!0}),!0)}}),Ue({target:"Set",proto:!0,real:!0,forced:!0},{symmetricDifference:function(t){return l(ya,this,ja(t))}}),Ue({target:"Set",proto:!0,real:!0,forced:!0},{union:function(t){return l(ma,this,ja(t))}});var Ma=Ao.getWeakData,Ca=ae.set,Na=ae.getterFor,La=Ir.find,Fa=Ir.findIndex,Da=w([].splice),Ua=0,Ba=function(t){return t.frozen||(t.frozen=new za)},za=function(){this.entries=[]},Wa=function(t,e){return La(t.entries,(function(t){return t[0]===e}))};za.prototype={get:function(t){var e=Wa(this,t);if(e)return e[1]},has:function(t){return!!Wa(this,t)},set:function(t,e){var r=Wa(this,t);r?r[1]=e:this.entries.push([t,e])},delete:function(t){var e=Fa(this.entries,(function(e){return e[0]===t}));return~e&&Da(this.entries,e,1),!!~e}};var Ga,Ka={getConstructor:function(t,e,r,n){var o=t((function(t,o){Mo(t,i),Ca(t,{type:e,id:Ua++,frozen:void 0}),A(o)||Io(o,t[n],{that:t,AS_ENTRIES:r})})),i=o.prototype,a=Na(e),u=function(t,e,r){var n=a(t),o=Ma(kt(e),!0);return!0===o?Ba(n).set(e,r):o[n.id]=r,t};return Lo(i,{delete:function(t){var e=a(this);if(!L(t))return!1;var r=Ma(t);return!0===r?Ba(e).delete(t):r&&ft(r,e.id)&&delete r[e.id]},has:function(t){var e=a(this);if(!L(t))return!1;var r=Ma(t);return!0===r?Ba(e).has(t):r&&ft(r,e.id)}}),Lo(i,r?{get:function(t){var e=a(this);if(L(t)){var r=Ma(t);return!0===r?Ba(e).get(t):r?r[e.id]:void 0}},set:function(t,e){return u(this,t,e)}}:{add:function(t){return u(this,t,!0)}}),o}},$a=ae.enforce,Va=Object,qa=Array.isArray,Ha=Va.isExtensible,Ya=Va.isFrozen,Xa=Va.isSealed,Ja=Va.freeze,Qa=Va.seal,Za={},tu={},eu=!a.ActiveXObject&&"ActiveXObject"in a,ru=function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},nu=No("WeakMap",ru,Ka),ou=nu.prototype,iu=w(ou.set);if(Jt)if(eu){Ga=Ka.getConstructor(ru,"WeakMap",!0),Ao.enable();var au=w(ou.delete),uu=w(ou.has),cu=w(ou.get);Lo(ou,{delete:function(t){if(L(t)&&!Ha(t)){var e=$a(this);return e.frozen||(e.frozen=new Ga),au(this,t)||e.frozen.delete(t)}return au(this,t)},has:function(t){if(L(t)&&!Ha(t)){var e=$a(this);return e.frozen||(e.frozen=new Ga),uu(this,t)||e.frozen.has(t)}return uu(this,t)},get:function(t){if(L(t)&&!Ha(t)){var e=$a(this);return e.frozen||(e.frozen=new Ga),uu(this,t)?cu(this,t):e.frozen.get(t)}return cu(this,t)},set:function(t,e){if(L(t)&&!Ha(t)){var r=$a(this);r.frozen||(r.frozen=new Ga),uu(this,t)?iu(this,t,e):r.frozen.set(t,e)}else iu(this,t,e);return this}})}else To&&u((function(){var t=Ja([]);return iu(new nu,t,1),!Ya(t)}))&&Lo(ou,{set:function(t,e){var r;return qa(t)&&(Ya(t)?r=Za:Xa(t)&&(r=tu)),iu(this,t,e),r==Za&&Ja(t),r==tu&&Qa(t),this}});var su=WeakMap.prototype,fu={WeakMap:WeakMap,set:w(su.set),get:w(su.get),has:w(su.has),remove:w(su.delete)},lu=fu.has,hu=function(t){return lu(t),t},pu=fu.get,du=fu.has,vu=fu.set;Ue({target:"WeakMap",proto:!0,real:!0,forced:!0},{emplace:function(t,e){var r,n,o=hu(this);return du(o,t)?(r=pu(o,t),"update"in e&&(r=e.update(r,t,o),vu(o,t,r)),r):(n=e.insert(t,o),vu(o,t,n),n)}}),Ue({target:"WeakMap",stat:!0,forced:!0},{from:ei}),Ue({target:"WeakMap",stat:!0,forced:!0},{of:ni});var gu=fu.remove;Ue({target:"WeakMap",proto:!0,real:!0,forced:!0},{deleteAll:function(){for(var t,e=hu(this),r=!0,n=0,o=arguments.length;n2)if(s=Mu(s),43===(e=Uu(s,0))||45===e){if(88===(r=Uu(s,2))||120===r)return NaN}else if(48===e){switch(Uu(s,1)){case 66:case 98:n=2,o=49;break;case 79:case 111:n=8,o=55;break;default:return+s}for(a=(i=Du(s,2)).length,u=0;uo)return NaN;return parseInt(i,n)}return+s}(e)}(t));return D(Lu,e=this)&&u((function(){Ou(e)}))?Co(Object(r),this,zu):r};zu.prototype=Lu,Bu&&(Lu.constructor=zu),Ue({global:!0,constructor:!0,wrap:!0,forced:Bu},{Number:zu}),Bu&&function(t,e){for(var r,n=c?Pu(e):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,isFinite,isInteger,isNaN,isSafeInteger,parseFloat,parseInt,fromString,range".split(","),o=0;n.length>o;o++)ft(e,r=n[o])&&!ft(t,r)&&ku(t,r,Iu(e,r))}(Jn[Cu],Nu),Ue({target:"Number",stat:!0,nonConfigurable:!0,nonWritable:!0},{EPSILON:Math.pow(2,-52)});var Wu=a.isFinite;Ue({target:"Number",stat:!0},{isFinite:Number.isFinite||function(t){return"number"==typeof t&&Wu(t)}});var Gu=Math.floor,Ku=Number.isInteger||function(t){return!L(t)&&isFinite(t)&&Gu(t)===t};Ue({target:"Number",stat:!0},{isInteger:Ku}),Ue({target:"Number",stat:!0},{isNaN:function(t){return t!=t}});var $u=Math.abs;Ue({target:"Number",stat:!0},{isSafeInteger:function(t){return Ku(t)&&$u(t)<=9007199254740991}}),Ue({target:"Number",stat:!0,nonConfigurable:!0,nonWritable:!0},{MAX_SAFE_INTEGER:9007199254740991}),Ue({target:"Number",stat:!0,nonConfigurable:!0,nonWritable:!0},{MIN_SAFE_INTEGER:-9007199254740991});var Vu=w(v.f),qu=w([].push),Hu=function(t){return function(e){for(var r,n=P(e),o=Ke(n),i=o.length,a=0,u=[];i>a;)r=o[a++],c&&!Vu(n,r)||qu(u,t?[r,n[r]]:n[r]);return u}},Yu={entries:Hu(!0),values:Hu(!1)},Xu=Yu.entries;Ue({target:"Object",stat:!0},{entries:function(t){return Xu(t)}}),Ue({target:"Object",stat:!0,sham:!c},{getOwnPropertyDescriptors:function(t){for(var e,r,n=P(t),o=Rt.f,i=_e(n),a={},u=0;i.length>u;)void 0!==(r=o(n,e=i[u++]))&&Un(a,e,r);return a}});var Ju=Object.is||function(t,e){return t===e?0!==t||1/t==1/e:t!=t&&e!=e};Ue({target:"Object",stat:!0},{is:Ju});var Qu=u((function(){Ke(1)}));Ue({target:"Object",stat:!0,forced:Qu},{keys:function(t){return Ke(ct(t))}});var Zu=Yu.values;Ue({target:"Object",stat:!0},{values:function(t){return Zu(t)}});var tc=Jr.codeAt;Ue({target:"String",proto:!0},{codePointAt:function(t){return tc(this,t)}}),ar("String","codePointAt");var ec,rc=bt("match"),nc=function(t){var e;return L(t)&&(void 0!==(e=t[rc])?!!e:"RegExp"==O(t))},oc=TypeError,ic=function(t){if(nc(t))throw oc("The method doesn't accept regular expressions");return t},ac=bt("match"),uc=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[ac]=!1,"/./"[t](e)}catch(t){}}return!1},cc=Rt.f,sc=ur("".endsWith),fc=ur("".slice),lc=Math.min,hc=uc("endsWith"),pc=!(hc||(ec=cc(String.prototype,"endsWith"),!ec||ec.writable));Ue({target:"String",proto:!0,forced:!pc&&!hc},{endsWith:function(t){var e=Vr(_(this));ic(t);var r=arguments.length>1?arguments[1]:void 0,n=e.length,o=void 0===r?n:lc(ye(r),n),i=Vr(t);return sc?sc(e,i,o):fc(e,o-i.length,o)===i}}),ar("String","endsWith");var dc=RangeError,vc=String.fromCharCode,gc=String.fromCodePoint,yc=w([].join);Ue({target:"String",stat:!0,arity:1,forced:!!gc&&1!=gc.length},{fromCodePoint:function(t){for(var e,r=[],n=arguments.length,o=0;n>o;){if(e=+arguments[o++],ve(e,1114111)!==e)throw dc(e+" is not a valid code point");r[o]=e<65536?vc(e):vc(55296+((e-=65536)>>10),e%1024+56320)}return yc(r,"")}});var bc=w("".indexOf);Ue({target:"String",proto:!0,forced:!uc("includes")},{includes:function(t){return!!~bc(Vr(_(this)),Vr(ic(t)),arguments.length>1?arguments[1]:void 0)}}),ar("String","includes"),w(ln.String);var mc=RangeError,wc=function(t){var e=Vr(_(this)),r="",n=he(t);if(n<0||1/0==n)throw mc("Wrong number of repetitions");for(;n>0;(n>>>=1)&&(e+=e))1&n&&(r+=e);return r},Sc=w(wc),Ec=w("".slice),Oc=Math.ceil,xc=function(t){return function(e,r,n){var o,i,a=Vr(_(e)),u=ye(r),c=a.length,s=void 0===n?" ":Vr(n);return u<=c||""==s?a:((i=Sc(s,Oc((o=u-c)/s.length))).length>o&&(i=Ec(i,0,o)),t?a+i:i+a)}},jc={start:xc(!1),end:xc(!0)},Tc=/Version\/10(?:\.\d+){1,2}(?: [\w./]+)?(?: Mobile\/\w+)? Safari\//.test(U),Ac=jc.start;Ue({target:"String",proto:!0,forced:Tc},{padStart:function(t){return Ac(this,t,arguments.length>1?arguments[1]:void 0)}}),ar("String","padStart");var Rc=jc.end;Ue({target:"String",proto:!0,forced:Tc},{padEnd:function(t){return Rc(this,t,arguments.length>1?arguments[1]:void 0)}}),ar("String","padEnd");var _c=w([].push),Pc=w([].join);Ue({target:"String",stat:!0},{raw:function(t){var e=P(ct(t).raw),r=be(e);if(!r)return"";for(var n=arguments.length,o=[],i=0;;){if(_c(o,Vr(e[i++])),i===r)return Pc(o,"");i1?arguments[1]:void 0,e.length)),n=Vr(t);return kc?kc(e,n,r):Mc(e,r,r+n.length)===n}}),ar("String","startsWith");var Fc=Kt.PROPER,Dc=function(t){return u((function(){return!!xu[t]()||"​…᠎"!=="​…᠎"[t]()||Fc&&xu[t].name!==t}))},Uc=_u.start,Bc=Dc("trimStart")?function(){return Uc(this)}:"".trimStart;Ue({target:"String",proto:!0,name:"trimStart",forced:"".trimLeft!==Bc},{trimLeft:Bc}),Ue({target:"String",proto:!0,name:"trimStart",forced:"".trimStart!==Bc},{trimStart:Bc}),ar("String","trimLeft");var zc=_u.end,Wc=Dc("trimEnd")?function(){return zc(this)}:"".trimEnd;Ue({target:"String",proto:!0,name:"trimEnd",forced:"".trimRight!==Wc},{trimRight:Wc}),Ue({target:"String",proto:!0,name:"trimEnd",forced:"".trimEnd!==Wc},{trimEnd:Wc}),ar("String","trimRight");var Gc=Function.prototype,Kc=Gc.apply,$c=Gc.call,Vc="object"==typeof Reflect&&Reflect.apply||(s?$c.bind(Kc):function(){return $c.apply(Kc,arguments)}),qc=!u((function(){Reflect.apply((function(){}))}));Ue({target:"Reflect",stat:!0,forced:qc},{apply:function(t,e,r){return Vc(Z(t),e,kt(r))}});var Hc=Function,Yc=w([].concat),Xc=w([].join),Jc={},Qc=s?Hc.bind:function(t){var e=Z(this),r=e.prototype,n=ri(arguments,1),o=function(){var r=Yc(n,ri(arguments));return this instanceof o?function(t,e,r){if(!ft(Jc,e)){for(var n=[],o=0;ob)","g");return"b"!==t.exec("b").groups.a||"bc"!=="b".replace(t,"$c")})),af=Te.f,uf=ae.enforce,cf=bt("match"),sf=a.RegExp,ff=sf.prototype,lf=a.SyntaxError,hf=w(ff.exec),pf=w("".charAt),df=w("".replace),vf=w("".indexOf),gf=w("".slice),yf=/^\?<[^\s\d!#%&*+<=>@^][^\s!#%&*+<=>@^]*>/,bf=/a/g,mf=/a/g,wf=new sf(bf)!==bf,Sf=Qs.MISSED_STICKY,Ef=Qs.UNSUPPORTED_Y,Of=c&&(!wf||Sf||rf||of||u((function(){return mf[cf]=!1,sf(bf)!=bf||sf(mf)==mf||"/a/i"!=sf(bf,"i")})));if(Fe("RegExp",Of)){for(var xf=function(t,e){var r,n,o,i,a,u,c=D(ff,this),s=nc(t),f=void 0===e,l=[],h=t;if(!c&&s&&f&&t.constructor===xf)return t;if((s||D(ff,t))&&(t=t.source,f&&(e=qs(h))),t=void 0===t?"":Vr(t),e=void 0===e?"":Vr(e),h=t,rf&&"dotAll"in bf&&(n=!!e&&vf(e,"s")>-1)&&(e=df(e,/s/g,"")),r=e,Sf&&"sticky"in bf&&(o=!!e&&vf(e,"y")>-1)&&Ef&&(e=df(e,/y/g,"")),of&&(i=function(t){for(var e,r=t.length,n=0,o="",i=[],a={},u=!1,c=!1,s=0,f="";n<=r;n++){if("\\"===(e=pf(t,n)))e+=pf(t,++n);else if("]"===e)u=!1;else if(!u)switch(!0){case"["===e:u=!0;break;case"("===e:hf(yf,gf(t,n+1))&&(n+=2,c=!0),o+=e,s++;continue;case">"===e&&c:if(""===f||ft(a,f))throw new lf("Invalid capture group name");a[f]=!0,i[i.length]=[f,s],c=!1,f="";continue}c?f+=e:o+=e}return[o,i]}(t),t=i[0],l=i[1]),a=Co(sf(t,e),c?this:ff,xf),(n||o||l.length)&&(u=uf(a),n&&(u.dotAll=!0,u.raw=xf(function(t){for(var e,r=t.length,n=0,o="",i=!1;n<=r;n++)"\\"!==(e=pf(t,n))?i||"."!==e?("["===e?i=!0:"]"===e&&(i=!1),o+=e):o+="[\\s\\S]":o+=e+pf(t,++n);return o}(t),r)),o&&(u.sticky=!0),l.length&&(u.groups=l)),t!==h)try{Bt(a,"source",""===h?"(?:)":h)}catch(t){}return a},jf=af(sf),Tf=0;jf.length>Tf;)tf(xf,sf,jf[Tf++]);ff.constructor=xf,xf.prototype=ff,ce(a,"RegExp",xf,{constructor:!0})}Do("RegExp");var Af=Kt.PROPER,Rf="toString",_f=RegExp.prototype[Rf];(u((function(){return"/a/b"!=_f.call({source:"a",flags:"b"})}))||Af&&_f.name!=Rf)&&ce(RegExp.prototype,Rf,(function(){var t=kt(this);return"/"+Vr(t.source)+"/"+Vr(qs(t))}),{unsafe:!0});var Pf=ae.get,If=RegExp.prototype,kf=TypeError;c&&rf&&fo(If,"dotAll",{configurable:!0,get:function(){if(this!==If){if("RegExp"===O(this))return!!Pf(this).dotAll;throw kf("Incompatible receiver, RegExp required")}}});var Mf=ae.get,Cf=at("native-string-replace",String.prototype.replace),Nf=RegExp.prototype.exec,Lf=Nf,Ff=w("".charAt),Df=w("".indexOf),Uf=w("".replace),Bf=w("".slice),zf=function(){var t=/a/,e=/b*/g;return l(Nf,t,"a"),l(Nf,e,"a"),0!==t.lastIndex||0!==e.lastIndex}(),Wf=Qs.BROKEN_CARET,Gf=void 0!==/()??/.exec("")[1];(zf||Gf||Wf||rf||of)&&(Lf=function(t){var e,r,n,o,i,a,u,c=this,s=Mf(c),f=Vr(t),h=s.raw;if(h)return h.lastIndex=c.lastIndex,e=l(Lf,h,f),c.lastIndex=h.lastIndex,e;var p=s.groups,d=Wf&&c.sticky,v=l($s,c),g=c.source,y=0,b=f;if(d&&(v=Uf(v,"y",""),-1===Df(v,"g")&&(v+="g"),b=Bf(f,c.lastIndex),c.lastIndex>0&&(!c.multiline||c.multiline&&"\n"!==Ff(f,c.lastIndex-1))&&(g="(?: "+g+")",b=" "+b,y++),r=new RegExp("^(?:"+g+")",v)),Gf&&(r=new RegExp("^"+g+"$(?!\\s)",v)),zf&&(n=c.lastIndex),o=l(Nf,d?r:c,b),d?o?(o.input=Bf(o.input,y),o[0]=Bf(o[0],y),o.index=c.lastIndex,c.lastIndex+=o[0].length):c.lastIndex=0:zf&&o&&(c.lastIndex=c.global?o.index+o[0].length:n),Gf&&o&&o.length>1&&l(Cf,o[0],r,(function(){for(i=1;i]*>)/g,hl=/\$([$&'`]|\d{1,2})/g,pl=function(t,e,r,n,o,i){var a=r+t.length,u=n.length,c=hl;return void 0!==o&&(o=ct(o),c=ll),sl(i,c,(function(i,c){var s;switch(cl(c,0)){case"$":return"$";case"&":return t;case"`":return fl(e,0,r);case"'":return fl(e,a);case"<":s=o[fl(c,1,-1)];break;default:var f=+c;if(0===f)return i;if(f>u){var l=ul(f/10);return 0===l?i:l<=u?void 0===n[l-1]?cl(c,1):n[l-1]+cl(c,1):i}s=n[f-1]}return void 0===s?"":s}))},dl=bt("replace"),vl=Math.max,gl=Math.min,yl=w([].concat),bl=w([].push),ml=w("".indexOf),wl=w("".slice),Sl="$0"==="a".replace(/./,"$0"),El=!!/./[dl]&&""===/./[dl]("a","$0"),Ol=!u((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:"7"},t},"7"!=="".replace(t,"$")}));rl("replace",(function(t,e,r){var n=El?"$":"$0";return[function(t,r){var n=_(this),o=A(t)?void 0:tt(t,dl);return o?l(o,t,n,r):l(e,Vr(n),t,r)},function(t,o){var i=kt(this),a=Vr(t);if("string"==typeof o&&-1===ml(o,n)&&-1===ml(o,"$<")){var u=r(e,i,a,o);if(u.done)return u.value}var c=C(o);c||(o=Vr(o));var s=i.global;if(s){var f=i.unicode;i.lastIndex=0}for(var l=[];;){var h=al(i,a);if(null===h)break;if(bl(l,h),!s)break;""===Vr(h[0])&&(i.lastIndex=ol(a,ye(i.lastIndex),f))}for(var p,d="",v=0,g=0;g=v&&(d+=wl(a,v,b)+O,v=b+y.length)}return d+wl(a,v)}]}),!Ol||!Sl||El),rl("search",(function(t,e,r){return[function(e){var r=_(this),n=A(e)?void 0:tt(e,t);return n?l(n,e,r):new RegExp(e)[t](Vr(r))},function(t){var n=kt(this),o=Vr(t),i=r(e,n,o);if(i.done)return i.value;var a=n.lastIndex;Ju(a,0)||(n.lastIndex=0);var u=al(n,o);return Ju(n.lastIndex,a)||(n.lastIndex=a),null===u?-1:u.index}]}));var xl=bt("species"),jl=function(t,e){var r,n=kt(t).constructor;return void 0===n||A(r=kt(n)[xl])?e:Zo(r)},Tl=Qs.UNSUPPORTED_Y,Al=4294967295,Rl=Math.min,_l=[].push,Pl=w(/./.exec),Il=w(_l),kl=w("".slice),Ml=!u((function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var r="ab".split(t);return 2!==r.length||"a"!==r[0]||"b"!==r[1]}));rl("split",(function(t,e,r){var n;return n="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(t,r){var n=Vr(_(this)),o=void 0===r?Al:r>>>0;if(0===o)return[];if(void 0===t)return[n];if(!nc(t))return l(e,n,t,o);for(var i,a,u,c=[],s=0,f=new RegExp(t.source,(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":"")+"g");(i=l(Kf,f,n))&&!((a=f.lastIndex)>s&&(Il(c,kl(n,s,i.index)),i.length>1&&i.index=o));)f.lastIndex===i.index&&f.lastIndex++;return s===n.length?!u&&Pl(f,"")||Il(c,""):Il(c,kl(n,s)),c.length>o?mo(c,0,o):c}:"0".split(void 0,0).length?function(t,r){return void 0===t&&0===r?[]:l(e,this,t,r)}:e,[function(e,r){var o=_(this),i=A(e)?void 0:tt(e,t);return i?l(i,e,o,r):l(n,Vr(o),e,r)},function(t,o){var i=kt(this),a=Vr(t),u=r(n,i,a,o,n!==e);if(u.done)return u.value;var c=jl(i,RegExp),s=i.unicode,f=new c(Tl?"^(?:"+i.source+")":i,(i.ignoreCase?"i":"")+(i.multiline?"m":"")+(i.unicode?"u":"")+(Tl?"g":"y")),l=void 0===o?Al:o>>>0;if(0===l)return[];if(0===a.length)return null===al(f,a)?[a]:[];for(var h=0,p=0,d=[];p=51||!u((function(){var t=[];return t[Nl]=!1,t.concat()[0]!==t})),Fl=function(t){if(!L(t))return!1;var e=t[Nl];return void 0!==e?!!e:fr(t)},Dl=!(Ll&&(K>=51||!u((function(){var t=[];return(t.constructor={})[Cl]=function(){return{foo:1}},1!==t.concat(Boolean).foo}))));Ue({target:"Array",proto:!0,arity:1,forced:Dl},{concat:function(t){var e,r,n,o,i,a=ct(this),u=Rr(a,0),c=0;for(e=-1,n=arguments.length;e2&&(n=r,L(o=arguments[2])&&"cause"in o&&Bt(n,"cause",o.cause));var c=[];return Io(t,dp,{that:c}),Bt(r,"errors",c),r};bn?bn(vp,pp):Pe(vp,pp,{name:!0});var gp=vp.prototype=er(pp.prototype,{constructor:g(1,vp),message:g(1,""),name:g(1,"AggregateError")});Ue({global:!0,constructor:!0,arity:2},{AggregateError:vp});var yp,bp,mp,wp,Sp="undefined"!=typeof process&&"process"==O(process),Ep=TypeError,Op=/(?:ipad|iphone|ipod).*applewebkit/i.test(U),xp=a.setImmediate,jp=a.clearImmediate,Tp=a.process,Ap=a.Dispatch,Rp=a.Function,_p=a.MessageChannel,Pp=a.String,Ip=0,kp={},Mp="onreadystatechange";u((function(){yp=a.location}));var Cp=function(t){if(ft(kp,t)){var e=kp[t];delete kp[t],e()}},Np=function(t){return function(){Cp(t)}},Lp=function(t){Cp(t.data)},Fp=function(t){a.postMessage(Pp(t),yp.protocol+"//"+yp.host)};xp&&jp||(xp=function(t){!function(t,e){if(t<1)throw Ep("Not enough arguments")}(arguments.length);var e=C(t)?t:Rp(t),r=ri(arguments,1);return kp[++Ip]=function(){Vc(e,void 0,r)},bp(Ip),Ip},jp=function(t){delete kp[t]},Sp?bp=function(t){Tp.nextTick(Np(t))}:Ap&&Ap.now?bp=function(t){Ap.now(Np(t))}:_p&&!Op?(wp=(mp=new _p).port2,mp.port1.onmessage=Lp,bp=sr(wp.postMessage,wp)):a.addEventListener&&C(a.postMessage)&&!a.importScripts&&yp&&"file:"!==yp.protocol&&!u(Fp)?(bp=Fp,a.addEventListener("message",Lp,!1)):bp=Mp in jt("script")?function(t){qe.appendChild(jt("script"))[Mp]=function(){qe.removeChild(this),Cp(t)}}:function(t){setTimeout(Np(t),0)});var Dp={set:xp,clear:jp},Up=function(){this.head=null,this.tail=null};Up.prototype={add:function(t){var e={item:t,next:null},r=this.tail;r?r.next=e:this.head=e,this.tail=e},get:function(){var t=this.head;if(t)return null===(this.head=t.next)&&(this.tail=null),t.item}};var Bp,zp,Wp,Gp,Kp,$p=Up,Vp=/ipad|iphone|ipod/i.test(U)&&"undefined"!=typeof Pebble,qp=/web0s(?!.*chrome)/i.test(U),Hp=Dp.set,Yp=a.MutationObserver||a.WebKitMutationObserver,Xp=a.document,Jp=a.process,Qp=a.Promise,Zp=(0,Rt.f)(a,"queueMicrotask"),td=Zp&&Zp.value;if(!td){var ed=new $p,rd=function(){var t,e;for(Sp&&(t=Jp.domain)&&t.exit();e=ed.get();)try{e()}catch(t){throw ed.head&&Bp(),t}t&&t.enter()};Op||Sp||qp||!Yp||!Xp?!Vp&&Qp&&Qp.resolve?((Gp=Qp.resolve(void 0)).constructor=Qp,Kp=sr(Gp.then,Gp),Bp=function(){Kp(rd)}):Sp?Bp=function(){Jp.nextTick(rd)}:(Hp=sr(Hp,a),Bp=function(){Hp(rd)}):(zp=!0,Wp=Xp.createTextNode(""),new Yp(rd).observe(Wp,{characterData:!0}),Bp=function(){Wp.data=zp=!zp}),td=function(t){ed.head||Bp(),ed.add(t)}}var nd,od,id,ad=td,ud=function(t){try{return{error:!1,value:t()}}catch(t){return{error:!0,value:t}}},cd=a.Promise,sd="object"==typeof Deno&&Deno&&"object"==typeof Deno.version,fd=!sd&&!Sp&&"object"==typeof window&&"object"==typeof document,ld=bt("species"),hd=!1,pd=C(a.PromiseRejectionEvent),dd=Fe("Promise",(function(){var t=Yt(cd),e=t!==String(cd);if(!e&&66===K)return!0;if(!K||K<51||!/native code/.test(t)){var r=new cd((function(t){t(1)})),n=function(t){t((function(){}),(function(){}))};if((r.constructor={})[ld]=n,!(hd=r.then((function(){}))instanceof n))return!0}return!e&&(fd||sd)&&!pd})),vd={CONSTRUCTOR:dd,REJECTION_EVENT:pd,SUBCLASSING:hd},gd=TypeError,yd=function(t){var e,r;this.promise=new t((function(t,n){if(void 0!==e||void 0!==r)throw gd("Bad Promise constructor");e=t,r=n})),this.resolve=Z(e),this.reject=Z(r)},bd={f:function(t){return new yd(t)}},md=Dp.set,wd="Promise",Sd=vd.CONSTRUCTOR,Ed=vd.REJECTION_EVENT,Od=vd.SUBCLASSING,xd=ae.getterFor(wd),jd=ae.set,Td=cd&&cd.prototype,Ad=cd,Rd=Td,_d=a.TypeError,Pd=a.document,Id=a.process,kd=bd.f,Md=kd,Cd=!!(Pd&&Pd.createEvent&&a.dispatchEvent),Nd="unhandledrejection",Ld=function(t){var e;return!(!L(t)||!C(e=t.then))&&e},Fd=function(t,e){var r,n,o,i=e.value,a=1==e.state,u=a?t.ok:t.fail,c=t.resolve,s=t.reject,f=t.domain;try{u?(a||(2===e.rejection&&Wd(e),e.rejection=1),!0===u?r=i:(f&&f.enter(),r=u(i),f&&(f.exit(),o=!0)),r===t.promise?s(_d("Promise-chain cycle")):(n=Ld(r))?l(n,r,c,s):c(r)):s(i)}catch(t){f&&!o&&f.exit(),s(t)}},Dd=function(t,e){t.notified||(t.notified=!0,ad((function(){for(var r,n=t.reactions;r=n.get();)Fd(r,t);t.notified=!1,e&&!t.rejection&&Bd(t)})))},Ud=function(t,e,r){var n,o;Cd?((n=Pd.createEvent("Event")).promise=e,n.reason=r,n.initEvent(t,!1,!0),a.dispatchEvent(n)):n={promise:e,reason:r},!Ed&&(o=a["on"+t])?o(n):t===Nd&&function(t,e){try{1==arguments.length?console.error(t):console.error(t,e)}catch(t){}}("Unhandled promise rejection",r)},Bd=function(t){l(md,a,(function(){var e,r=t.facade,n=t.value;if(zd(t)&&(e=ud((function(){Sp?Id.emit("unhandledRejection",n,r):Ud(Nd,r,n)})),t.rejection=Sp||zd(t)?2:1,e.error))throw e.value}))},zd=function(t){return 1!==t.rejection&&!t.parent},Wd=function(t){l(md,a,(function(){var e=t.facade;Sp?Id.emit("rejectionHandled",e):Ud("rejectionhandled",e,t.value)}))},Gd=function(t,e,r){return function(n){t(e,n,r)}},Kd=function(t,e,r){t.done||(t.done=!0,r&&(t=r),t.value=e,t.state=2,Dd(t,!0))},$d=function(t,e,r){if(!t.done){t.done=!0,r&&(t=r);try{if(t.facade===e)throw _d("Promise can't be resolved itself");var n=Ld(e);n?ad((function(){var r={done:!1};try{l(n,e,Gd($d,r,t),Gd(Kd,r,t))}catch(e){Kd(r,e,t)}})):(t.value=e,t.state=1,Dd(t,!1))}catch(e){Kd({done:!1},e,t)}}};if(Sd&&(Ad=function(t){Mo(this,Rd),Z(t),l(nd,this);var e=xd(this);try{t(Gd($d,e),Gd(Kd,e))}catch(t){Kd(e,t)}},(nd=function(t){jd(this,{type:wd,done:!1,notified:!1,parent:!1,reactions:new $p,rejection:!1,state:0,value:void 0})}).prototype=ce(Rd=Ad.prototype,"then",(function(t,e){var r=xd(this),n=kd(jl(this,Ad));return r.parent=!0,n.ok=!C(t)||t,n.fail=C(e)&&e,n.domain=Sp?Id.domain:void 0,0==r.state?r.reactions.add(n):ad((function(){Fd(n,r)})),n.promise})),od=function(){var t=new nd,e=xd(t);this.promise=t,this.resolve=Gd($d,e),this.reject=Gd(Kd,e)},bd.f=kd=function(t){return t===Ad||void 0===t?new od(t):Md(t)},C(cd)&&Td!==Object.prototype)){id=Td.then,Od||ce(Td,"then",(function(t,e){var r=this;return new Ad((function(t,e){l(id,r,t,e)})).then(t,e)}),{unsafe:!0});try{delete Td.constructor}catch(t){}bn&&bn(Td,Rd)}Ue({global:!0,constructor:!0,wrap:!0,forced:Sd},{Promise:Ad}),fn(Ad,wd,!1),Do(wd);var Vd=vd.CONSTRUCTOR||!Yn((function(t){cd.all(t).then(void 0,(function(){}))}));Ue({target:"Promise",stat:!0,forced:Vd},{all:function(t){var e=this,r=bd.f(e),n=r.resolve,o=r.reject,i=ud((function(){var r=Z(e.resolve),i=[],a=0,u=1;Io(t,(function(t){var c=a++,s=!1;u++,l(r,e,t).then((function(t){s||(s=!0,i[c]=t,--u||n(i))}),o)})),--u||n(i)}));return i.error&&o(i.value),r.promise}});var qd=cd&&cd.prototype;if(Ue({target:"Promise",proto:!0,forced:vd.CONSTRUCTOR,real:!0},{catch:function(t){return this.then(void 0,t)}}),C(cd)){var Hd=F("Promise").prototype.catch;qd.catch!==Hd&&ce(qd,"catch",Hd,{unsafe:!0})}Ue({target:"Promise",stat:!0,forced:Vd},{race:function(t){var e=this,r=bd.f(e),n=r.reject,o=ud((function(){var o=Z(e.resolve);Io(t,(function(t){l(o,e,t).then(r.resolve,n)}))}));return o.error&&n(o.value),r.promise}}),Ue({target:"Promise",stat:!0,forced:vd.CONSTRUCTOR},{reject:function(t){var e=bd.f(this);return l(e.reject,void 0,t),e.promise}});var Yd=function(t,e){if(kt(t),L(e)&&e.constructor===t)return e;var r=bd.f(t);return(0,r.resolve)(e),r.promise};Ue({target:"Promise",stat:!0,forced:vd.CONSTRUCTOR},{resolve:function(t){return Yd(this,t)}}),Ue({target:"Promise",stat:!0,forced:Vd},{allSettled:function(t){var e=this,r=bd.f(e),n=r.resolve,o=r.reject,i=ud((function(){var r=Z(e.resolve),o=[],i=0,a=1;Io(t,(function(t){var u=i++,c=!1;a++,l(r,e,t).then((function(t){c||(c=!0,o[u]={status:"fulfilled",value:t},--a||n(o))}),(function(t){c||(c=!0,o[u]={status:"rejected",reason:t},--a||n(o))}))})),--a||n(o)}));return i.error&&o(i.value),r.promise}});var Xd="No one promise resolved";Ue({target:"Promise",stat:!0,forced:Vd},{any:function(t){var e=this,r=F("AggregateError"),n=bd.f(e),o=n.resolve,i=n.reject,a=ud((function(){var n=Z(e.resolve),a=[],u=0,c=1,s=!1;Io(t,(function(t){var f=u++,h=!1;c++,l(n,e,t).then((function(t){h||s||(s=!0,o(t))}),(function(t){h||s||(h=!0,a[f]=t,--c||i(new r(a,Xd)))}))})),--c||i(new r(a,Xd))}));return a.error&&i(a.value),n.promise}});var Jd=cd&&cd.prototype,Qd=!!cd&&u((function(){Jd.finally.call({then:function(){}},(function(){}))}));if(Ue({target:"Promise",proto:!0,real:!0,forced:Qd},{finally:function(t){var e=jl(this,F("Promise")),r=C(t);return this.then(r?function(r){return Yd(e,t()).then((function(){return r}))}:t,r?function(r){return Yd(e,t()).then((function(){throw r}))}:t)}}),C(cd)){var Zd=F("Promise").prototype.finally;Jd.finally!==Zd&&ce(Jd,"finally",Zd,{unsafe:!0})}Ue({target:"Promise",stat:!0,forced:!0},{try:function(t){var e=bd.f(this),r=ud(t);return(r.error?e.reject:e.resolve)(r.value),e.promise}});var tv=Ir.forEach,ev=function(t,e){var r=[].forEach;return!!r&&u((function(){r.call(null,(function(){return 1}),1)}))}(),rv=ev?[].forEach:function(t){return tv(this,t,arguments.length>1?arguments[1]:void 0)},nv=function(t){if(t&&t.forEach!==rv)try{Bt(t,"forEach",rv)}catch(e){t.forEach=rv}};for(var ov in Go)Go[ov]&&nv(a[ov]&&a[ov].prototype);nv(Vo);const iv="undefined"!=typeof globalThis&&globalThis||"undefined"!=typeof self&&self||void 0!==t&&t;function av(t){try{new t}catch(t){return!1}return!0}"function"==typeof iv.Event&&av(iv.Event)||(iv.Event=function(t,e){this.bubbles=!!e&&!!e.bubbles,this.cancelable=!!e&&!!e.cancelable,this.composed=!!e&&!!e.composed,this.type=t}),void 0!==iv.EventTarget&&av(iv.Event)||(iv.EventTarget=function(){function t(){this.__listeners=new Map}return(t.prototype=Object.create(Object.prototype)).addEventListener=function(t,e,r){if(arguments.length<2)throw new TypeError(`TypeError: Failed to execute 'addEventListener' on 'EventTarget': 2 arguments required, but only ${arguments.length} present.`);const n=this.__listeners,o=t.toString();n.has(o)||n.set(o,new Map);const i=n.get(o);i.has(e)||i.set(e,r)},t.prototype.removeEventListener=function(t,e,r){if(arguments.length<2)throw new TypeError(`TypeError: Failed to execute 'addEventListener' on 'EventTarget': 2 arguments required, but only ${arguments.length} present.`);const n=this.__listeners,o=t.toString();if(n.has(o)){const t=n.get(o);t.has(e)&&t.delete(e)}},t.prototype.dispatchEvent=function(t){if(!(t instanceof Event))throw new TypeError("Failed to execute 'dispatchEvent' on 'EventTarget': parameter 1 is not of type 'Event'.");const e=this.__listeners.get(t.type);if(e)for(const[r,n]of e.entries()){try{"function"==typeof r?r.call(this,t):r&&"function"==typeof r.handleEvent&&r.handleEvent(t)}catch(t){setTimeout((()=>{throw t}))}n&&n.once&&e.delete(r)}return!0},t}());const uv="undefined"!=typeof globalThis&&globalThis||"undefined"!=typeof self&&self||void 0!==t&&t;if(void 0===uv.AbortController){const t={};uv.AbortSignal=function(){function e(e){if(e!==t)throw new TypeError("Illegal constructor.");EventTarget.call(this),this._aborted=!1}return(e.prototype=Object.create(EventTarget.prototype)).constructor=e,Object.defineProperty(e.prototype,"onabort",{get:function(){return this._onabort},set:function(t){const e=this._onabort;e&&this.removeEventListener("abort",e),this._onabort=t,this.addEventListener("abort",t)}}),Object.defineProperty(e.prototype,"aborted",{get:function(){return this._aborted}}),e}(),uv.AbortController=function(){function e(){this._signal=new AbortSignal(t)}return e.prototype=Object.create(Object.prototype),Object.defineProperty(e.prototype,"signal",{get:function(){return this._signal}}),e.prototype.abort=function(){const t=this.signal;t.aborted||(t._aborted=!0,t.dispatchEvent(new Event("abort")))},e}()}var cv="undefined"!=typeof globalThis&&globalThis||"undefined"!=typeof self&&self||void 0!==cv&&cv,sv="URLSearchParams"in cv,fv="Symbol"in cv&&"iterator"in Symbol,lv="FileReader"in cv&&"Blob"in cv&&function(){try{return new Blob,!0}catch(t){return!1}}(),hv="FormData"in cv,pv="ArrayBuffer"in cv;if(pv)var dv=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]"],vv=ArrayBuffer.isView||function(t){return t&&dv.indexOf(Object.prototype.toString.call(t))>-1};function gv(t){if("string"!=typeof t&&(t=String(t)),/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(t)||""===t)throw new TypeError('Invalid character in header field name: "'+t+'"');return t.toLowerCase()}function yv(t){return"string"!=typeof t&&(t=String(t)),t}function bv(t){var e={next:function(){var e=t.shift();return{done:void 0===e,value:e}}};return fv&&(e[Symbol.iterator]=function(){return e}),e}function mv(t){this.map={},t instanceof mv?t.forEach((function(t,e){this.append(e,t)}),this):Array.isArray(t)?t.forEach((function(t){this.append(t[0],t[1])}),this):t&&Object.getOwnPropertyNames(t).forEach((function(e){this.append(e,t[e])}),this)}function wv(t){if(t.bodyUsed)return Promise.reject(new TypeError("Already read"));t.bodyUsed=!0}function Sv(t){return new Promise((function(e,r){t.onload=function(){e(t.result)},t.onerror=function(){r(t.error)}}))}function Ev(t){var e=new FileReader,r=Sv(e);return e.readAsArrayBuffer(t),r}function Ov(t){if(t.slice)return t.slice(0);var e=new Uint8Array(t.byteLength);return e.set(new Uint8Array(t)),e.buffer}function xv(){return this.bodyUsed=!1,this._initBody=function(t){var e;this.bodyUsed=this.bodyUsed,this._bodyInit=t,t?"string"==typeof t?this._bodyText=t:lv&&Blob.prototype.isPrototypeOf(t)?this._bodyBlob=t:hv&&FormData.prototype.isPrototypeOf(t)?this._bodyFormData=t:sv&&URLSearchParams.prototype.isPrototypeOf(t)?this._bodyText=t.toString():pv&&lv&&(e=t)&&DataView.prototype.isPrototypeOf(e)?(this._bodyArrayBuffer=Ov(t.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):pv&&(ArrayBuffer.prototype.isPrototypeOf(t)||vv(t))?this._bodyArrayBuffer=Ov(t):this._bodyText=t=Object.prototype.toString.call(t):this._bodyText="",this.headers.get("content-type")||("string"==typeof t?this.headers.set("content-type","text/plain;charset=UTF-8"):this._bodyBlob&&this._bodyBlob.type?this.headers.set("content-type",this._bodyBlob.type):sv&&URLSearchParams.prototype.isPrototypeOf(t)&&this.headers.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"))},lv&&(this.blob=function(){var t=wv(this);if(t)return t;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error("could not read FormData body as blob");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?wv(this)||(ArrayBuffer.isView(this._bodyArrayBuffer)?Promise.resolve(this._bodyArrayBuffer.buffer.slice(this._bodyArrayBuffer.byteOffset,this._bodyArrayBuffer.byteOffset+this._bodyArrayBuffer.byteLength)):Promise.resolve(this._bodyArrayBuffer)):this.blob().then(Ev)}),this.text=function(){var t=wv(this);if(t)return t;if(this._bodyBlob)return function(t){var e=new FileReader,r=Sv(e);return e.readAsText(t),r}(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(function(t){for(var e=new Uint8Array(t),r=new Array(e.length),n=0;n-1?e:t}(e.method||this.method||"GET"),this.mode=e.mode||this.mode||null,this.signal=e.signal||this.signal,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&r)throw new TypeError("Body not allowed for GET or HEAD requests");if(this._initBody(r),!("GET"!==this.method&&"HEAD"!==this.method||"no-store"!==e.cache&&"no-cache"!==e.cache)){var n=/([?&])_=[^&]*/;n.test(this.url)?this.url=this.url.replace(n,"$1_="+(new Date).getTime()):this.url+=(/\?/.test(this.url)?"&":"?")+"_="+(new Date).getTime()}}function Av(t){var e=new FormData;return t.trim().split("&").forEach((function(t){if(t){var r=t.split("="),n=r.shift().replace(/\+/g," "),o=r.join("=").replace(/\+/g," ");e.append(decodeURIComponent(n),decodeURIComponent(o))}})),e}function Rv(t,e){if(!(this instanceof Rv))throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.');e||(e={}),this.type="default",this.status=void 0===e.status?200:e.status,this.ok=this.status>=200&&this.status<300,this.statusText=void 0===e.statusText?"":""+e.statusText,this.headers=new mv(e.headers),this.url=e.url||"",this._initBody(t)}Tv.prototype.clone=function(){return new Tv(this,{body:this._bodyInit})},xv.call(Tv.prototype),xv.call(Rv.prototype),Rv.prototype.clone=function(){return new Rv(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new mv(this.headers),url:this.url})},Rv.error=function(){var t=new Rv(null,{status:0,statusText:""});return t.type="error",t};var _v=[301,302,303,307,308];Rv.redirect=function(t,e){if(-1===_v.indexOf(e))throw new RangeError("Invalid status code");return new Rv(null,{status:e,headers:{location:t}})};var Pv=cv.DOMException;try{new Pv}catch(t){(Pv=function(t,e){this.message=t,this.name=e;var r=Error(t);this.stack=r.stack}).prototype=Object.create(Error.prototype),Pv.prototype.constructor=Pv}function Iv(t,e){return new Promise((function(r,n){var o=new Tv(t,e);if(o.signal&&o.signal.aborted)return n(new Pv("Aborted","AbortError"));var i=new XMLHttpRequest;function a(){i.abort()}i.onload=function(){var t,e,n={status:i.status,statusText:i.statusText,headers:(t=i.getAllResponseHeaders()||"",e=new mv,t.replace(/\r?\n[\t ]+/g," ").split("\r").map((function(t){return 0===t.indexOf("\n")?t.substr(1,t.length):t})).forEach((function(t){var r=t.split(":"),n=r.shift().trim();if(n){var o=r.join(":").trim();e.append(n,o)}})),e)};n.url="responseURL"in i?i.responseURL:n.headers.get("X-Request-URL");var o="response"in i?i.response:i.responseText;setTimeout((function(){r(new Rv(o,n))}),0)},i.onerror=function(){setTimeout((function(){n(new TypeError("Network request failed"))}),0)},i.ontimeout=function(){setTimeout((function(){n(new TypeError("Network request failed"))}),0)},i.onabort=function(){setTimeout((function(){n(new Pv("Aborted","AbortError"))}),0)},i.open(o.method,function(t){try{return""===t&&cv.location.href?cv.location.href:t}catch(e){return t}}(o.url),!0),"include"===o.credentials?i.withCredentials=!0:"omit"===o.credentials&&(i.withCredentials=!1),"responseType"in i&&(lv?i.responseType="blob":pv&&o.headers.get("Content-Type")&&-1!==o.headers.get("Content-Type").indexOf("application/octet-stream")&&(i.responseType="arraybuffer")),!e||"object"!=typeof e.headers||e.headers instanceof mv?o.headers.forEach((function(t,e){i.setRequestHeader(e,t)})):Object.getOwnPropertyNames(e.headers).forEach((function(t){i.setRequestHeader(t,yv(e.headers[t]))})),o.signal&&(o.signal.addEventListener("abort",a),i.onreadystatechange=function(){4===i.readyState&&o.signal.removeEventListener("abort",a)}),i.send(void 0===o._bodyInit?null:o._bodyInit)}))}Iv.polyfill=!0,cv.fetch||(cv.fetch=Iv,cv.Headers=mv,cv.Request=Tv,cv.Response=Rv),function(t){var e=function(){try{return!!Symbol.iterator}catch(t){return!1}}(),r=function(t){var r={next:function(){var e=t.shift();return{done:void 0===e,value:e}}};return e&&(r[Symbol.iterator]=function(){return r}),r},n=function(t){return encodeURIComponent(t).replace(/%20/g,"+")},o=function(t){return decodeURIComponent(String(t).replace(/\+/g," "))};(function(){try{var e=t.URLSearchParams;return"a=1"===new e("?a=1").toString()&&"function"==typeof e.prototype.set&&"function"==typeof e.prototype.entries}catch(t){return!1}})()||function(){var o=function(t){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var e=typeof t;if("undefined"===e);else if("string"===e)""!==t&&this._fromString(t);else if(t instanceof o){var r=this;t.forEach((function(t,e){r.append(e,t)}))}else{if(null===t||"object"!==e)throw new TypeError("Unsupported input's type for URLSearchParams");if("[object Array]"===Object.prototype.toString.call(t))for(var n=0;ne[0]?1:0})),t._entries&&(t._entries={});for(var r=0;r1?o(n[1]):"")}})}(void 0!==t?t:"undefined"!=typeof window?window:"undefined"!=typeof self?self:t),function(t){var e,r,n;if(function(){try{var e=new t.URL("b","http://a");return e.pathname="c d","http://a/c%20d"===e.href&&e.searchParams}catch(t){return!1}}()||(e=t.URL,r=function(e,r){"string"!=typeof e&&(e=String(e)),r&&"string"!=typeof r&&(r=String(r));var n,o=document;if(r&&(void 0===t.location||r!==t.location.href)){r=r.toLowerCase(),(n=(o=document.implementation.createHTMLDocument("")).createElement("base")).href=r,o.head.appendChild(n);try{if(0!==n.href.indexOf(r))throw new Error(n.href)}catch(t){throw new Error("URL unable to set base "+r+" due to "+t)}}var i=o.createElement("a");i.href=e,n&&(o.body.appendChild(i),i.href=i.href);var a=o.createElement("input");if(a.type="url",a.value=e,":"===i.protocol||!/:/.test(i.href)||!a.checkValidity()&&!r)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:i});var u=new t.URLSearchParams(this.search),c=!0,s=!0,f=this;["append","delete","set"].forEach((function(t){var e=u[t];u[t]=function(){e.apply(u,arguments),c&&(s=!1,f.search=u.toString(),s=!0)}})),Object.defineProperty(this,"searchParams",{value:u,enumerable:!0});var l=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==l&&(l=this.search,s&&(c=!1,this.searchParams._fromString(this.search),c=!0))}})},n=r.prototype,["hash","host","hostname","port","protocol"].forEach((function(t){!function(t){Object.defineProperty(n,t,{get:function(){return this._anchorElement[t]},set:function(e){this._anchorElement[t]=e},enumerable:!0})}(t)})),Object.defineProperty(n,"search",{get:function(){return this._anchorElement.search},set:function(t){this._anchorElement.search=t,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(n,{toString:{get:function(){var t=this;return function(){return t.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(t){this._anchorElement.href=t,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(t){this._anchorElement.pathname=t},enumerable:!0},origin:{get:function(){return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(this._anchorElement.port!={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol]&&""!==this._anchorElement.port?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(t){},enumerable:!0},username:{get:function(){return""},set:function(t){},enumerable:!0}}),r.createObjectURL=function(t){return e.createObjectURL.apply(e,arguments)},r.revokeObjectURL=function(t){return e.revokeObjectURL.apply(e,arguments)},t.URL=r),void 0!==t.location&&!("origin"in t.location)){var o=function(){return t.location.protocol+"//"+t.location.hostname+(t.location.port?":"+t.location.port:"")};try{Object.defineProperty(t.location,"origin",{get:o,enumerable:!0})}catch(e){setInterval((function(){t.location.origin=o()}),100)}}}(void 0!==t?t:"undefined"!=typeof window?window:"undefined"!=typeof self?self:t);var kv=Object.getOwnPropertySymbols,Mv=Object.prototype.hasOwnProperty,Cv=Object.prototype.propertyIsEnumerable,Nv=function(){try{if(!Object.assign)return!1;var t=new String("abc");if(t[5]="de","5"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},r=0;r<10;r++)e["_"+String.fromCharCode(r)]=r;if("0123456789"!==Object.getOwnPropertyNames(e).map((function(t){return e[t]})).join(""))return!1;var n={};return"abcdefghijklmnopqrst".split("").forEach((function(t){n[t]=t})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},n)).join("")}catch(t){return!1}}()?Object.assign:function(t,e){for(var r,n,o=function(t){if(null==t)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}(t),i=1;i0&&r[0]<4?1:+(r[0]+r[1])),!n&&D&&(!(r=D.match(/Edge\\/(\\d+)/))||r[1]>=74)&&(r=D.match(/Chrome\\/(\\d+)/))&&(n=+r[1]);var G=n,K=i.String,$=!!Object.getOwnPropertySymbols&&!a(function(){var t=Symbol();return!K(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&G&&G<41}),V=$&&!Symbol.sham&&\"symbol\"==typeof Symbol.iterator,q=Object,H=V?function(t){return\"symbol\"==typeof t}:function(t){var e=L(\"Symbol\");return k(e)&&F(e.prototype,q(t))},Y=String,X=function(t){try{return Y(t)}catch(t){return\"Object\"}},J=TypeError,Q=function(t){if(k(t))return t;throw J(X(t)+\" is not a function\")},Z=function(t,e){var r=t[e];return T(r)?void 0:Q(r)},tt=TypeError,et=Object.defineProperty,rt=function(t,e){try{et(i,t,{value:e,configurable:!0,writable:!0})}catch(r){i[t]=e}return e},nt=\"__core-js_shared__\",ot=i[nt]||rt(nt,{}),it=e(function(t){(t.exports=function(t,e){return ot[t]||(ot[t]=void 0!==e?e:{})})(\"versions\",[]).push({version:\"3.30.2\",mode:\"global\",copyright:\"© 2014-2023 Denis Pushkarev (zloirock.ru)\",license:\"https://github.com/zloirock/core-js/blob/v3.30.2/LICENSE\",source:\"https://github.com/zloirock/core-js\"})}),at=Object,ut=function(t){return at(R(t))},ct=m({}.hasOwnProperty),st=Object.hasOwn||function(t,e){return ct(ut(t),e)},ft=0,lt=Math.random(),ht=m(1..toString),pt=function(t){return\"Symbol(\"+(void 0===t?\"\":t)+\")_\"+ht(++ft+lt,36)},dt=i.Symbol,vt=it(\"wks\"),gt=V?dt.for||dt:dt&&dt.withoutSetter||pt,yt=function(t){return st(vt,t)||(vt[t]=$&&st(dt,t)?dt[t]:gt(\"Symbol.\"+t)),vt[t]},bt=TypeError,mt=yt(\"toPrimitive\"),wt=function(t,e){if(!N(t)||H(t))return t;var r,n=Z(t,mt);if(n){if(void 0===e&&(e=\"default\"),r=f(n,t,e),!N(r)||H(r))return r;throw bt(\"Can't convert object to primitive value\")}return void 0===e&&(e=\"number\"),function(t,e){var r,n;if(\"string\"===e&&k(r=t.toString)&&!N(n=f(r,t)))return n;if(k(r=t.valueOf)&&!N(n=f(r,t)))return n;if(\"string\"!==e&&k(r=t.toString)&&!N(n=f(r,t)))return n;throw tt(\"Can't convert object to primitive value\")}(t,e)},St=function(t){var e=wt(t,\"string\");return H(e)?e:e+\"\"},Et=i.document,Ot=N(Et)&&N(Et.createElement),xt=function(t){return Ot?Et.createElement(t):{}},jt=!u&&!a(function(){return 7!=Object.defineProperty(xt(\"div\"),\"a\",{get:function(){return 7}}).a}),Tt=Object.getOwnPropertyDescriptor,At={f:u?Tt:function(t,e){if(t=P(t),e=St(e),jt)try{return Tt(t,e)}catch(t){}if(st(t,e))return v(!f(d.f,t,e),t[e])}},Rt=u&&a(function(){return 42!=Object.defineProperty(function(){},\"prototype\",{value:42,writable:!1}).prototype}),Pt=String,_t=TypeError,It=function(t){if(N(t))return t;throw _t(Pt(t)+\" is not an object\")},Mt=TypeError,kt=Object.defineProperty,Ct=Object.getOwnPropertyDescriptor,Nt=\"enumerable\",Lt=\"configurable\",Ft=\"writable\",Dt={f:u?Rt?function(t,e,r){if(It(t),e=St(e),It(r),\"function\"==typeof t&&\"prototype\"===e&&\"value\"in r&&Ft in r&&!r[Ft]){var n=Ct(t,e);n&&n[Ft]&&(t[e]=r.value,r={configurable:Lt in r?r[Lt]:n[Lt],enumerable:Nt in r?r[Nt]:n[Nt],writable:!1})}return kt(t,e,r)}:kt:function(t,e,r){if(It(t),e=St(e),It(r),jt)try{return kt(t,e,r)}catch(t){}if(\"get\"in r||\"set\"in r)throw Mt(\"Accessors not supported\");return\"value\"in r&&(t[e]=r.value),t}},Ut=u?function(t,e,r){return Dt.f(t,e,v(1,r))}:function(t,e,r){return t[e]=r,t},Bt=Function.prototype,zt=u&&Object.getOwnPropertyDescriptor,Wt=st(Bt,\"name\"),Gt={EXISTS:Wt,PROPER:Wt&&\"something\"===function(){}.name,CONFIGURABLE:Wt&&(!u||u&&zt(Bt,\"name\").configurable)},Kt=m(Function.toString);k(ot.inspectSource)||(ot.inspectSource=function(t){return Kt(t)});var $t,Vt,qt,Ht=ot.inspectSource,Yt=i.WeakMap,Xt=k(Yt)&&/native code/.test(String(Yt)),Jt=it(\"keys\"),Qt=function(t){return Jt[t]||(Jt[t]=pt(t))},Zt={},te=\"Object already initialized\",ee=i.TypeError;if(Xt||ot.state){var re=ot.state||(ot.state=new(0,i.WeakMap));re.get=re.get,re.has=re.has,re.set=re.set,$t=function(t,e){if(re.has(t))throw ee(te);return e.facade=t,re.set(t,e),e},Vt=function(t){return re.get(t)||{}},qt=function(t){return re.has(t)}}else{var ne=Qt(\"state\");Zt[ne]=!0,$t=function(t,e){if(st(t,ne))throw ee(te);return e.facade=t,Ut(t,ne,e),e},Vt=function(t){return st(t,ne)?t[ne]:{}},qt=function(t){return st(t,ne)}}var oe,ie={set:$t,get:Vt,has:qt,enforce:function(t){return qt(t)?Vt(t):$t(t,{})},getterFor:function(t){return function(e){var r;if(!N(e)||(r=Vt(e)).type!==t)throw ee(\"Incompatible receiver, \"+t+\" required\");return r}}},ae=e(function(t){var e=Gt.CONFIGURABLE,r=ie.enforce,n=ie.get,o=String,i=Object.defineProperty,c=m(\"\".slice),s=m(\"\".replace),f=m([].join),l=u&&!a(function(){return 8!==i(function(){},\"length\",{value:8}).length}),h=String(String).split(\"String\"),p=t.exports=function(t,n,a){\"Symbol(\"===c(o(n),0,7)&&(n=\"[\"+s(o(n),/^Symbol\\(([^)]*)\\)/,\"$1\")+\"]\"),a&&a.getter&&(n=\"get \"+n),a&&a.setter&&(n=\"set \"+n),(!st(t,\"name\")||e&&t.name!==n)&&(u?i(t,\"name\",{value:n,configurable:!0}):t.name=n),l&&a&&st(a,\"arity\")&&t.length!==a.arity&&i(t,\"length\",{value:a.arity});try{a&&st(a,\"constructor\")&&a.constructor?u&&i(t,\"prototype\",{writable:!1}):t.prototype&&(t.prototype=void 0)}catch(t){}var p=r(t);return st(p,\"source\")||(p.source=f(h,\"string\"==typeof n?n:\"\")),t};Function.prototype.toString=p(function(){return k(this)&&n(this).source||Ht(this)},\"toString\")}),ue=function(t,e,r,n){n||(n={});var o=n.enumerable,i=void 0!==n.name?n.name:e;if(k(r)&&ae(r,i,n),n.global)o?t[e]=r:rt(e,r);else{try{n.unsafe?t[e]&&(o=!0):delete t[e]}catch(t){}o?t[e]=r:Dt.f(t,e,{value:r,enumerable:!1,configurable:!n.nonConfigurable,writable:!n.nonWritable})}return t},ce=Math.ceil,se=Math.floor,fe=Math.trunc||function(t){var e=+t;return(e>0?se:ce)(e)},le=function(t){var e=+t;return e!=e||0===e?0:fe(e)},he=Math.max,pe=Math.min,de=function(t,e){var r=le(t);return r<0?he(r+e,0):pe(r,e)},ve=Math.min,ge=function(t){return t>0?ve(le(t),9007199254740991):0},ye=function(t){return ge(t.length)},be=function(t){return function(e,r,n){var o,i=P(e),a=ye(i),u=de(n,a);if(t&&r!=r){for(;a>u;)if((o=i[u++])!=o)return!0}else for(;a>u;u++)if((t||u in i)&&i[u]===r)return t||u||0;return!t&&-1}},me={includes:be(!0),indexOf:be(!1)},we=me.indexOf,Se=m([].push),Ee=function(t,e){var r,n=P(t),o=0,i=[];for(r in n)!st(Zt,r)&&st(n,r)&&Se(i,r);for(;e.length>o;)st(n,r=e[o++])&&(~we(i,r)||Se(i,r));return i},Oe=[\"constructor\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toLocaleString\",\"toString\",\"valueOf\"],xe=Oe.concat(\"length\",\"prototype\"),je={f:Object.getOwnPropertyNames||function(t){return Ee(t,xe)}},Te={f:Object.getOwnPropertySymbols},Ae=m([].concat),Re=L(\"Reflect\",\"ownKeys\")||function(t){var e=je.f(It(t)),r=Te.f;return r?Ae(e,r(t)):e},Pe=function(t,e,r){for(var n=Re(e),o=Dt.f,i=At.f,a=0;a2?arguments[2]:void 0,u=ze((void 0===a?n:de(a,n))-i,n-o),c=1;for(i0;)i in r?r[o]=r[i]:Be(r,o),o+=c,i+=c;return r},Ge=Object.keys||function(t){return Ee(t,Oe)},Ke=u&&!Rt?Object.defineProperties:function(t,e){It(t);for(var r,n=P(e),o=Ge(e),i=o.length,a=0;i>a;)Dt.f(t,r=o[a++],n[r]);return t},$e={f:Ke},Ve=L(\"document\",\"documentElement\"),qe=\"prototype\",He=\"script\",Ye=Qt(\"IE_PROTO\"),Xe=function(){},Je=function(t){return\"<\"+He+\">\"+t+\"\"},Qe=function(t){t.write(Je(\"\")),t.close();var e=t.parentWindow.Object;return t=null,e},Ze=function(){try{oe=new ActiveXObject(\"htmlfile\")}catch(t){}var t,e,r;Ze=\"undefined\"!=typeof document?document.domain&&oe?Qe(oe):(e=xt(\"iframe\"),r=\"java\"+He+\":\",e.style.display=\"none\",Ve.appendChild(e),e.src=String(r),(t=e.contentWindow.document).open(),t.write(Je(\"document.F=Object\")),t.close(),t.F):Qe(oe);for(var n=Oe.length;n--;)delete Ze[qe][Oe[n]];return Ze()};Zt[Ye]=!0;var tr=Object.create||function(t,e){var r;return null!==t?(Xe[qe]=It(t),r=new Xe,Xe[qe]=null,r[Ye]=t):r=Ze(),void 0===e?r:$e.f(r,e)},er=Dt.f,rr=yt(\"unscopables\"),nr=Array.prototype;null==nr[rr]&&er(nr,rr,{configurable:!0,value:tr(null)});var or=function(t){nr[rr][t]=!0};De({target:\"Array\",proto:!0},{copyWithin:We}),or(\"copyWithin\");var ir=function(t,e){return m(i[t].prototype[e])};ir(\"Array\",\"copyWithin\"),De({target:\"Array\",proto:!0},{fill:function(t){for(var e=ut(this),r=ye(e),n=arguments.length,o=de(n>1?arguments[1]:void 0,r),i=n>2?arguments[2]:void 0,a=void 0===i?r:de(i,r);a>o;)e[o++]=t;return e}}),or(\"fill\"),ir(\"Array\",\"fill\");var ar=function(t){if(\"Function\"===E(t))return m(t)},ur=ar(ar.bind),cr=function(t,e){return Q(t),void 0===e?t:c?ur(t,e):function(){return t.apply(e,arguments)}},sr=Array.isArray||function(t){return\"Array\"==E(t)},fr={};fr[yt(\"toStringTag\")]=\"z\";var lr=\"[object z]\"===String(fr),hr=yt(\"toStringTag\"),pr=Object,dr=\"Arguments\"==E(function(){return arguments}()),vr=lr?E:function(t){var e,r,n;return void 0===t?\"Undefined\":null===t?\"Null\":\"string\"==typeof(r=function(t,e){try{return t[e]}catch(t){}}(e=pr(t),hr))?r:dr?E(e):\"Object\"==(n=E(e))&&k(e.callee)?\"Arguments\":n},gr=function(){},yr=[],br=L(\"Reflect\",\"construct\"),mr=/^\\s*(?:class|function)\\b/,wr=m(mr.exec),Sr=!mr.exec(gr),Er=function(t){if(!k(t))return!1;try{return br(gr,yr,t),!0}catch(t){return!1}},Or=function(t){if(!k(t))return!1;switch(vr(t)){case\"AsyncFunction\":case\"GeneratorFunction\":case\"AsyncGeneratorFunction\":return!1}try{return Sr||!!wr(mr,Ht(t))}catch(t){return!0}};Or.sham=!0;var xr=!br||a(function(){var t;return Er(Er.call)||!Er(Object)||!Er(function(){t=!0})||t})?Or:Er,jr=yt(\"species\"),Tr=Array,Ar=function(t,e){return new(function(t){var e;return sr(t)&&(xr(e=t.constructor)&&(e===Tr||sr(e.prototype))||N(e)&&null===(e=e[jr]))&&(e=void 0),void 0===e?Tr:e}(t))(0===e?0:e)},Rr=m([].push),Pr=function(t){var e=1==t,r=2==t,n=3==t,o=4==t,i=6==t,a=7==t,u=5==t||i;return function(c,s,f,l){for(var h,p,d=ut(c),v=j(d),g=cr(s,f),y=ye(v),b=0,m=l||Ar,w=e?m(c,y):r||a?m(c,0):void 0;y>b;b++)if((u||b in v)&&(p=g(h=v[b],b,d),t))if(e)w[b]=p;else if(p)switch(t){case 3:return!0;case 5:return h;case 6:return b;case 2:Rr(w,h)}else switch(t){case 4:return!1;case 7:Rr(w,h)}return i?-1:n||o?o:w}},_r={forEach:Pr(0),map:Pr(1),filter:Pr(2),some:Pr(3),every:Pr(4),find:Pr(5),findIndex:Pr(6),filterReject:Pr(7)},Ir=_r.find,Mr=\"find\",kr=!0;Mr in[]&&Array(1)[Mr](function(){kr=!1}),De({target:\"Array\",proto:!0,forced:kr},{find:function(t){return Ir(this,t,arguments.length>1?arguments[1]:void 0)}}),or(Mr),ir(\"Array\",\"find\");var Cr=_r.findIndex,Nr=\"findIndex\",Lr=!0;Nr in[]&&Array(1)[Nr](function(){Lr=!1}),De({target:\"Array\",proto:!0,forced:Lr},{findIndex:function(t){return Cr(this,t,arguments.length>1?arguments[1]:void 0)}}),or(Nr),ir(\"Array\",\"findIndex\");var Fr=TypeError,Dr=function(t){if(t>9007199254740991)throw Fr(\"Maximum allowed index exceeded\");return t},Ur=function(t,e,r,n,o,i,a,u){for(var c,s,f=o,l=0,h=!!a&&cr(a,u);l0&&sr(c)?(s=ye(c),f=Ur(t,e,c,s,f,i-1)-1):(Dr(f+1),t[f]=c),f++),l++;return f},Br=Ur;De({target:\"Array\",proto:!0},{flatMap:function(t){var e,r=ut(this),n=ye(r);return Q(t),(e=Ar(r,0)).length=Br(e,r,r,n,0,1,t,arguments.length>1?arguments[1]:void 0),e}}),or(\"flatMap\"),ir(\"Array\",\"flatMap\"),De({target:\"Array\",proto:!0},{flat:function(){var t=arguments.length?arguments[0]:void 0,e=ut(this),r=ye(e),n=Ar(e,0);return n.length=Br(n,e,e,r,0,void 0===t?1:le(t)),n}}),or(\"flat\"),ir(\"Array\",\"flat\");var zr,Wr,Gr,Kr=String,$r=function(t){if(\"Symbol\"===vr(t))throw TypeError(\"Cannot convert a Symbol value to a string\");return Kr(t)},Vr=m(\"\".charAt),qr=m(\"\".charCodeAt),Hr=m(\"\".slice),Yr=function(t){return function(e,r){var n,o,i=$r(R(e)),a=le(r),u=i.length;return a<0||a>=u?t?\"\":void 0:(n=qr(i,a))<55296||n>56319||a+1===u||(o=qr(i,a+1))<56320||o>57343?t?Vr(i,a):n:t?Hr(i,a,a+2):o-56320+(n-55296<<10)+65536}},Xr={codeAt:Yr(!1),charAt:Yr(!0)},Jr=!a(function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype}),Qr=Qt(\"IE_PROTO\"),Zr=Object,tn=Zr.prototype,en=Jr?Zr.getPrototypeOf:function(t){var e=ut(t);if(st(e,Qr))return e[Qr];var r=e.constructor;return k(r)&&e instanceof r?r.prototype:e instanceof Zr?tn:null},rn=yt(\"iterator\"),nn=!1;[].keys&&(\"next\"in(Gr=[].keys())?(Wr=en(en(Gr)))!==Object.prototype&&(zr=Wr):nn=!0);var on=!N(zr)||a(function(){var t={};return zr[rn].call(t)!==t});on&&(zr={}),k(zr[rn])||ue(zr,rn,function(){return this});var an={IteratorPrototype:zr,BUGGY_SAFARI_ITERATORS:nn},un=Dt.f,cn=yt(\"toStringTag\"),sn=function(t,e,r){t&&!r&&(t=t.prototype),t&&!st(t,cn)&&un(t,cn,{configurable:!0,value:e})},fn={},ln=an.IteratorPrototype,hn=function(){return this},pn=function(t,e,r){try{return m(Q(Object.getOwnPropertyDescriptor(t,e)[r]))}catch(t){}},dn=String,vn=TypeError,gn=function(t){if(\"object\"==typeof t||k(t))return t;throw vn(\"Can't set \"+dn(t)+\" as a prototype\")},yn=Object.setPrototypeOf||(\"__proto__\"in{}?function(){var t,e=!1,r={};try{(t=pn(Object.prototype,\"__proto__\",\"set\"))(r,[]),e=r instanceof Array}catch(t){}return function(r,n){return It(r),gn(n),e?t(r,n):r.__proto__=n,r}}():void 0),bn=Gt.PROPER,mn=Gt.CONFIGURABLE,wn=an.IteratorPrototype,Sn=an.BUGGY_SAFARI_ITERATORS,En=yt(\"iterator\"),On=\"keys\",xn=\"values\",jn=\"entries\",Tn=function(){return this},An=function(t,e,r,n,o,i,a){!function(t,e,r,n){var o=e+\" Iterator\";t.prototype=tr(ln,{next:v(1,r)}),sn(t,o,!1),fn[o]=hn}(r,e,n);var u,c,s,l=function(t){if(t===o&&y)return y;if(!Sn&&t in d)return d[t];switch(t){case On:case xn:case jn:return function(){return new r(this,t)}}return function(){return new r(this)}},h=e+\" Iterator\",p=!1,d=t.prototype,g=d[En]||d[\"@@iterator\"]||o&&d[o],y=!Sn&&g||l(o),b=\"Array\"==e&&d.entries||g;if(b&&(u=en(b.call(new t)))!==Object.prototype&&u.next&&(en(u)!==wn&&(yn?yn(u,wn):k(u[En])||ue(u,En,Tn)),sn(u,h,!0)),bn&&o==xn&&g&&g.name!==xn&&(mn?Ut(d,\"name\",xn):(p=!0,y=function(){return f(g,this)})),o)if(c={values:l(xn),keys:i?y:l(On),entries:l(jn)},a)for(s in c)(Sn||p||!(s in d))&&ue(d,s,c[s]);else De({target:e,proto:!0,forced:Sn||p},c);return d[En]!==y&&ue(d,En,y,{name:o}),fn[e]=y,c},Rn=function(t,e){return{value:t,done:e}},Pn=Xr.charAt,_n=\"String Iterator\",In=ie.set,Mn=ie.getterFor(_n);An(String,\"String\",function(t){In(this,{type:_n,string:$r(t),index:0})},function(){var t,e=Mn(this),r=e.string,n=e.index;return n>=r.length?Rn(void 0,!0):(t=Pn(r,n),e.index+=t.length,Rn(t,!1))});var kn=function(t,e,r){var n,o;It(t);try{if(!(n=Z(t,\"return\"))){if(\"throw\"===e)throw r;return r}n=f(n,t)}catch(t){o=!0,n=t}if(\"throw\"===e)throw r;if(o)throw n;return It(n),r},Cn=function(t,e,r,n){try{return n?e(It(r)[0],r[1]):e(r)}catch(e){kn(t,\"throw\",e)}},Nn=yt(\"iterator\"),Ln=Array.prototype,Fn=function(t){return void 0!==t&&(fn.Array===t||Ln[Nn]===t)},Dn=function(t,e,r){var n=St(e);n in t?Dt.f(t,n,v(0,r)):t[n]=r},Un=yt(\"iterator\"),Bn=function(t){if(!T(t))return Z(t,Un)||Z(t,\"@@iterator\")||fn[vr(t)]},zn=TypeError,Wn=function(t,e){var r=arguments.length<2?Bn(t):e;if(Q(r))return It(f(r,t));throw zn(X(t)+\" is not iterable\")},Gn=Array,Kn=yt(\"iterator\"),$n=!1;try{var Vn=0,qn={next:function(){return{done:!!Vn++}},return:function(){$n=!0}};qn[Kn]=function(){return this},Array.from(qn,function(){throw 2})}catch(t){}var Hn=function(t,e){if(!e&&!$n)return!1;var r=!1;try{var n={};n[Kn]=function(){return{next:function(){return{done:r=!0}}}},t(n)}catch(t){}return r},Yn=!Hn(function(t){Array.from(t)});De({target:\"Array\",stat:!0,forced:Yn},{from:function(t){var e=ut(t),r=xr(this),n=arguments.length,o=n>1?arguments[1]:void 0,i=void 0!==o;i&&(o=cr(o,n>2?arguments[2]:void 0));var a,u,c,s,l,h,p=Bn(e),d=0;if(!p||this===Gn&&Fn(p))for(a=ye(e),u=r?new this(a):Gn(a);a>d;d++)h=i?o(e[d],d):e[d],Dn(u,d,h);else for(l=(s=Wn(e,p)).next,u=r?new this:[];!(c=f(l,s)).done;d++)h=i?Cn(s,o,[c.value,d],!0):c.value,Dn(u,d,h);return u.length=d,u}});var Xn=i,Jn=me.includes,Qn=a(function(){return!Array(1).includes()});De({target:\"Array\",proto:!0,forced:Qn},{includes:function(t){return Jn(this,t,arguments.length>1?arguments[1]:void 0)}}),or(\"includes\"),ir(\"Array\",\"includes\");var Zn=Dt.f,to=\"Array Iterator\",eo=ie.set,ro=ie.getterFor(to),no=An(Array,\"Array\",function(t,e){eo(this,{type:to,target:P(t),index:0,kind:e})},function(){var t=ro(this),e=t.target,r=t.kind,n=t.index++;return!e||n>=e.length?(t.target=void 0,Rn(void 0,!0)):Rn(\"keys\"==r?n:\"values\"==r?e[n]:[n,e[n]],!1)},\"values\"),oo=fn.Arguments=fn.Array;if(or(\"keys\"),or(\"values\"),or(\"entries\"),u&&\"values\"!==oo.name)try{Zn(oo,\"name\",{value:\"values\"})}catch(t){}lr||ue(Object.prototype,\"toString\",lr?{}.toString:function(){return\"[object \"+vr(this)+\"]\"},{unsafe:!0}),ir(\"Array\",\"values\");var io=Array,ao=a(function(){function t(){}return!(io.of.call(t)instanceof t)});De({target:\"Array\",stat:!0,forced:ao},{of:function(){for(var t=0,e=arguments.length,r=new(xr(this)?this:io)(e);e>t;)Dn(r,t,arguments[t++]);return r.length=e,r}});var uo=yt(\"hasInstance\"),co=Function.prototype;uo in co||Dt.f(co,uo,{value:ae(function(t){if(!k(this)||!N(t))return!1;var e=this.prototype;if(!N(e))return t instanceof this;for(;t=en(t);)if(e===t)return!0;return!1},uo)}),yt(\"hasInstance\");var so=function(t,e,r){return r.get&&ae(r.get,e,{getter:!0}),r.set&&ae(r.set,e,{setter:!0}),Dt.f(t,e,r)},fo=Gt.EXISTS,lo=Function.prototype,ho=m(lo.toString),po=/function\\b(?:\\s|\\/\\*[\\S\\s]*?\\*\\/|\\/\\/[^\\n\\r]*[\\n\\r]+)*([^\\s(/]*)/,vo=m(po.exec);u&&!fo&&so(lo,\"name\",{configurable:!0,get:function(){try{return vo(po,ho(this))[1]}catch(t){return\"\"}}});var go=Array,yo=Math.max,bo=function(t,e,r){for(var n=ye(t),o=de(e,n),i=de(void 0===r?n:r,n),a=go(yo(i-o,0)),u=0;oi;i++)if((u=y(t[i]))&&F(Po,u))return u;return new Ro(!1)}n=Wn(t,o)}for(c=h?t.next:n.next;!(s=f(c,n)).done;){try{u=y(s.value)}catch(t){kn(n,\"throw\",t)}if(\"object\"==typeof u&&u&&F(Po,u))return u}return new Ro(!1)},Io=TypeError,Mo=function(t,e){if(F(e,t))return t;throw Io(\"Incorrect invocation\")},ko=function(t,e,r){var n,o;return yn&&k(n=e.constructor)&&n!==r&&N(o=n.prototype)&&o!==r.prototype&&yn(t,o),t},Co=function(t,e,r){var n=-1!==t.indexOf(\"Map\"),o=-1!==t.indexOf(\"Weak\"),u=n?\"set\":\"add\",c=i[t],s=c&&c.prototype,f=c,l={},h=function(t){var e=m(s[t]);ue(s,t,\"add\"==t?function(t){return e(this,0===t?0:t),this}:\"delete\"==t?function(t){return!(o&&!N(t))&&e(this,0===t?0:t)}:\"get\"==t?function(t){return o&&!N(t)?void 0:e(this,0===t?0:t)}:\"has\"==t?function(t){return!(o&&!N(t))&&e(this,0===t?0:t)}:function(t,r){return e(this,0===t?0:t,r),this})};if(Le(t,!k(c)||!(o||s.forEach&&!a(function(){(new c).entries().next()}))))f=r.getConstructor(e,t,n,u),To.enable();else if(Le(t,!0)){var p=new f,d=p[u](o?{}:-0,1)!=p,v=a(function(){p.has(1)}),g=Hn(function(t){new c(t)}),y=!o&&a(function(){for(var t=new c,e=5;e--;)t[u](e,e);return!t.has(-0)});g||((f=e(function(t,e){Mo(t,s);var r=ko(new c,t,f);return T(e)||_o(e,r[u],{that:r,AS_ENTRIES:n}),r})).prototype=s,s.constructor=f),(v||y)&&(h(\"delete\"),h(\"has\"),n&&h(\"get\")),(y||d)&&h(u),o&&s.clear&&delete s.clear}return l[t]=f,De({global:!0,constructor:!0,forced:f!=c},l),sn(f,t),o||r.setStrong(f,t,n),f},No=function(t,e,r){for(var n in e)ue(t,n,e[n],r);return t},Lo=yt(\"species\"),Fo=function(t){var e=L(t);u&&e&&!e[Lo]&&so(e,Lo,{configurable:!0,get:function(){return this}})},Do=To.fastKey,Uo=ie.set,Bo=ie.getterFor,zo={getConstructor:function(t,e,r,n){var o=t(function(t,o){Mo(t,i),Uo(t,{type:e,index:tr(null),first:void 0,last:void 0,size:0}),u||(t.size=0),T(o)||_o(o,t[n],{that:t,AS_ENTRIES:r})}),i=o.prototype,a=Bo(e),c=function(t,e,r){var n,o,i=a(t),c=s(t,e);return c?c.value=r:(i.last=c={index:o=Do(e,!0),key:e,value:r,previous:n=i.last,next:void 0,removed:!1},i.first||(i.first=c),n&&(n.next=c),u?i.size++:t.size++,\"F\"!==o&&(i.index[o]=c)),t},s=function(t,e){var r,n=a(t),o=Do(e);if(\"F\"!==o)return n.index[o];for(r=n.first;r;r=r.next)if(r.key==e)return r};return No(i,{clear:function(){for(var t=a(this),e=t.index,r=t.first;r;)r.removed=!0,r.previous&&(r.previous=r.previous.next=void 0),delete e[r.index],r=r.next;t.first=t.last=void 0,u?t.size=0:this.size=0},delete:function(t){var e=this,r=a(e),n=s(e,t);if(n){var o=n.next,i=n.previous;delete r.index[n.index],n.removed=!0,i&&(i.next=o),o&&(o.previous=i),r.first==n&&(r.first=o),r.last==n&&(r.last=i),u?r.size--:e.size--}return!!n},forEach:function(t){for(var e,r=a(this),n=cr(t,arguments.length>1?arguments[1]:void 0);e=e?e.next:r.first;)for(n(e.value,e.key,this);e&&e.removed;)e=e.previous},has:function(t){return!!s(this,t)}}),No(i,r?{get:function(t){var e=s(this,t);return e&&e.value},set:function(t,e){return c(this,0===t?0:t,e)}}:{add:function(t){return c(this,t=0===t?0:t,t)}}),u&&so(i,\"size\",{configurable:!0,get:function(){return a(this).size}}),o},setStrong:function(t,e,r){var n=e+\" Iterator\",o=Bo(e),i=Bo(n);An(t,e,function(t,e){Uo(this,{type:n,target:t,state:o(t),kind:e,last:void 0})},function(){for(var t=i(this),e=t.kind,r=t.last;r&&r.removed;)r=r.previous;return t.target&&(t.last=r=r?r.next:t.state.first)?Rn(\"keys\"==e?r.key:\"values\"==e?r.value:[r.key,r.value],!1):(t.target=void 0,Rn(void 0,!0))},r?\"entries\":\"values\",!r,!0),Fo(e)}};Co(\"Map\",function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},zo);var Wo={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0},Go=xt(\"span\").classList,Ko=Go&&Go.constructor&&Go.constructor.prototype,$o=Ko===Object.prototype?void 0:Ko,Vo=yt(\"iterator\"),qo=yt(\"toStringTag\"),Ho=no.values,Yo=function(t,e){if(t){if(t[Vo]!==Ho)try{Ut(t,Vo,Ho)}catch(e){t[Vo]=Ho}if(t[qo]||Ut(t,qo,e),Wo[e])for(var r in no)if(t[r]!==no[r])try{Ut(t,r,no[r])}catch(e){t[r]=no[r]}}};for(var Xo in Wo)Yo(i[Xo]&&i[Xo].prototype,Xo);Yo($o,\"DOMTokenList\");var Jo=TypeError,Qo=function(t){if(xr(t))return t;throw Jo(X(t)+\" is not a constructor\")},Zo=[].push,ti=function(t){var e,r,n,o,i=arguments.length,a=i>1?arguments[1]:void 0;return Qo(this),(e=void 0!==a)&&Q(a),T(t)?new this:(r=[],e?(n=0,o=cr(a,i>2?arguments[2]:void 0),_o(t,function(t){f(Zo,r,o(t,n++))})):_o(t,Zo,{that:r}),new this(r))};De({target:\"Map\",stat:!0,forced:!0},{from:ti});var ei=m([].slice),ri=function(){return new this(ei(arguments))};De({target:\"Map\",stat:!0,forced:!0},{of:ri});var ni=Map.prototype,oi={Map:Map,set:m(ni.set),get:m(ni.get),has:m(ni.has),remove:m(ni.delete),proto:ni},ii=oi.has,ai=function(t){return ii(t),t},ui=oi.remove;De({target:\"Map\",proto:!0,real:!0,forced:!0},{deleteAll:function(){for(var t,e=ai(this),r=!0,n=0,o=arguments.length;n1?arguments[1]:void 0);return!1!==yi(e,function(t,n){if(!r(t,n,e))return!1},!0)}});var bi=oi.Map,mi=oi.set;De({target:\"Map\",proto:!0,real:!0,forced:!0},{filter:function(t){var e=ai(this),r=cr(t,arguments.length>1?arguments[1]:void 0),n=new bi;return yi(e,function(t,o){r(t,o,e)&&mi(n,o,t)}),n}}),De({target:\"Map\",proto:!0,real:!0,forced:!0},{find:function(t){var e=ai(this),r=cr(t,arguments.length>1?arguments[1]:void 0),n=yi(e,function(t,n){if(r(t,n,e))return{value:t}},!0);return n&&n.value}}),De({target:\"Map\",proto:!0,real:!0,forced:!0},{findKey:function(t){var e=ai(this),r=cr(t,arguments.length>1?arguments[1]:void 0),n=yi(e,function(t,n){if(r(t,n,e))return{key:n}},!0);return n&&n.key}});var wi=oi.Map,Si=m([].push);De({target:\"Map\",stat:!0,forced:!0},{groupBy:function(t,e){var r=new(k(this)?this:wi);Q(e);var n=Q(r.has),o=Q(r.get),i=Q(r.set);return _o(t,function(t){var a=e(t);f(n,r,a)?Si(f(o,r,a),t):f(i,r,a,[t])}),r}}),De({target:\"Map\",proto:!0,real:!0,forced:!0},{includes:function(t){return!0===yi(ai(this),function(e){if((r=e)===(n=t)||r!=r&&n!=n)return!0;var r,n},!0)}});var Ei=oi.Map;De({target:\"Map\",stat:!0,forced:!0},{keyBy:function(t,e){var r=new(k(this)?this:Ei);Q(e);var n=Q(r.set);return _o(t,function(t){f(n,r,e(t),t)}),r}}),De({target:\"Map\",proto:!0,real:!0,forced:!0},{keyOf:function(t){var e=yi(ai(this),function(e,r){if(e===t)return{key:r}},!0);return e&&e.key}});var Oi=oi.Map,xi=oi.set;De({target:\"Map\",proto:!0,real:!0,forced:!0},{mapKeys:function(t){var e=ai(this),r=cr(t,arguments.length>1?arguments[1]:void 0),n=new Oi;return yi(e,function(t,o){xi(n,r(t,o,e),t)}),n}});var ji=oi.Map,Ti=oi.set;De({target:\"Map\",proto:!0,real:!0,forced:!0},{mapValues:function(t){var e=ai(this),r=cr(t,arguments.length>1?arguments[1]:void 0),n=new ji;return yi(e,function(t,o){Ti(n,o,r(t,o,e))}),n}});var Ai=oi.set;De({target:\"Map\",proto:!0,real:!0,arity:1,forced:!0},{merge:function(t){for(var e=ai(this),r=arguments.length,n=0;n1?arguments[1]:void 0);return!0===yi(e,function(t,n){if(r(t,n,e))return!0},!0)}});var Pi=TypeError,_i=oi.get,Ii=oi.has,Mi=oi.set;De({target:\"Map\",proto:!0,real:!0,forced:!0},{update:function(t,e){var r=ai(this),n=arguments.length;Q(e);var o=Ii(r,t);if(!o&&n<3)throw Pi(\"Updating absent value\");var i=o?_i(r,t):Q(n>2?arguments[2]:void 0)(t,r);return Mi(r,t,e(i,t,r)),r}});var ki=TypeError,Ci=function(t,e){var r,n=It(this),o=Q(n.get),i=Q(n.has),a=Q(n.set),u=arguments.length>2?arguments[2]:void 0;if(!k(e)&&!k(u))throw ki(\"At least one callback required\");return f(i,n,t)?(r=f(o,n,t),k(e)&&(r=e(r),f(a,n,t,r))):k(u)&&(r=u(),f(a,n,t,r)),r};De({target:\"Map\",proto:!0,real:!0,forced:!0},{upsert:Ci}),De({target:\"Map\",proto:!0,real:!0,name:\"upsert\",forced:!0},{updateOrInsert:Ci}),Co(\"Set\",function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},zo);var Ni=Set.prototype,Li={Set:Set,add:m(Ni.add),has:m(Ni.has),remove:m(Ni.delete),proto:Ni},Fi=Li.has,Di=function(t){return Fi(t),t},Ui=Li.Set,Bi=Li.proto,zi=m(Bi.forEach),Wi=m(Bi.keys),Gi=Wi(new Ui).next,Ki=function(t,e,r){return r?li(Wi(t),e,Gi):zi(t,e)},$i=Li.Set,Vi=Li.add,qi=function(t){var e=new $i;return Ki(t,function(t){Vi(e,t)}),e},Hi=pn(Li.proto,\"size\",\"get\")||function(t){return t.size},Yi=TypeError,Xi=Math.max,Ji=function(t,e,r,n){this.set=t,this.size=e,this.has=r,this.keys=n};Ji.prototype={getIterator:function(){return It(f(this.keys,this.set))},includes:function(t){return f(this.has,this.set,t)}};var Qi=function(t){It(t);var e=+t.size;if(e!=e)throw Yi(\"Invalid size\");return new Ji(t,Xi(le(e),0),Q(t.has),Q(t.keys))},Zi=Li.has,ta=Li.remove,ea=function(t){var e=Di(this),r=Qi(t),n=qi(e);return Hi(e)<=r.size?Ki(e,function(t){r.includes(t)&&ta(n,t)}):li(r.getIterator(),function(t){Zi(e,t)&&ta(n,t)}),n},ra=function(t){try{return(new(L(\"Set\")))[t]({size:0,has:function(){return!1},keys:function(){return{next:function(){return{done:!0}}}}}),!0}catch(t){return!1}};De({target:\"Set\",proto:!0,real:!0,forced:!ra(\"difference\")},{difference:ea});var na=Li.Set,oa=Li.add,ia=Li.has,aa=function(t){var e=Di(this),r=Qi(t),n=new na;return Hi(e)>r.size?li(r.getIterator(),function(t){ia(e,t)&&oa(n,t)}):Ki(e,function(t){r.includes(t)&&oa(n,t)}),n},ua=!ra(\"intersection\")||a(function(){return\"3,2\"!=Array.from(new Set([1,2,3]).intersection(new Set([3,2])))});De({target:\"Set\",proto:!0,real:!0,forced:ua},{intersection:aa});var ca=Li.has,sa=function(t){var e=Di(this),r=Qi(t);if(Hi(e)<=r.size)return!1!==Ki(e,function(t){if(r.includes(t))return!1},!0);var n=r.getIterator();return!1!==li(n,function(t){if(ca(e,t))return kn(n,\"normal\",!1)})};De({target:\"Set\",proto:!0,real:!0,forced:!ra(\"isDisjointFrom\")},{isDisjointFrom:sa});var fa=function(t){var e=Di(this),r=Qi(t);return!(Hi(e)>r.size)&&!1!==Ki(e,function(t){if(!r.includes(t))return!1},!0)};De({target:\"Set\",proto:!0,real:!0,forced:!ra(\"isSubsetOf\")},{isSubsetOf:fa});var la=Li.has,ha=function(t){var e=Di(this),r=Qi(t);if(Hi(e)1?arguments[1]:void 0);return!1!==Ki(e,function(t){if(!r(t,t,e))return!1},!0)}});var Sa=yt(\"iterator\"),Ea=Object,Oa=L(\"Set\"),xa=function(t){return function(t){return N(t)&&\"number\"==typeof t.size&&k(t.has)&&k(t.keys)}(t)?t:function(t){if(T(t))return!1;var e=Ea(t);return void 0!==e[Sa]||\"@@iterator\"in e||st(fn,vr(e))}(t)?new Oa(t):t};De({target:\"Set\",proto:!0,real:!0,forced:!0},{difference:function(t){return f(ea,this,xa(t))}});var ja=Li.Set,Ta=Li.add;De({target:\"Set\",proto:!0,real:!0,forced:!0},{filter:function(t){var e=Di(this),r=cr(t,arguments.length>1?arguments[1]:void 0),n=new ja;return Ki(e,function(t){r(t,t,e)&&Ta(n,t)}),n}}),De({target:\"Set\",proto:!0,real:!0,forced:!0},{find:function(t){var e=Di(this),r=cr(t,arguments.length>1?arguments[1]:void 0),n=Ki(e,function(t){if(r(t,t,e))return{value:t}},!0);return n&&n.value}}),De({target:\"Set\",proto:!0,real:!0,forced:!0},{intersection:function(t){return f(aa,this,xa(t))}}),De({target:\"Set\",proto:!0,real:!0,forced:!0},{isDisjointFrom:function(t){return f(sa,this,xa(t))}}),De({target:\"Set\",proto:!0,real:!0,forced:!0},{isSubsetOf:function(t){return f(fa,this,xa(t))}}),De({target:\"Set\",proto:!0,real:!0,forced:!0},{isSupersetOf:function(t){return f(ha,this,xa(t))}});var Aa=m([].join),Ra=m([].push);De({target:\"Set\",proto:!0,real:!0,forced:!0},{join:function(t){var e=Di(this),r=void 0===t?\",\":$r(t),n=[];return Ki(e,function(t){Ra(n,t)}),Aa(n,r)}});var Pa=Li.Set,_a=Li.add;De({target:\"Set\",proto:!0,real:!0,forced:!0},{map:function(t){var e=Di(this),r=cr(t,arguments.length>1?arguments[1]:void 0),n=new Pa;return Ki(e,function(t){_a(n,r(t,t,e))}),n}});var Ia=TypeError;De({target:\"Set\",proto:!0,real:!0,forced:!0},{reduce:function(t){var e=Di(this),r=arguments.length<2,n=r?void 0:arguments[1];if(Q(t),Ki(e,function(o){r?(r=!1,n=o):n=t(n,o,o,e)}),r)throw Ia(\"Reduce of empty set with no initial value\");return n}}),De({target:\"Set\",proto:!0,real:!0,forced:!0},{some:function(t){var e=Di(this),r=cr(t,arguments.length>1?arguments[1]:void 0);return!0===Ki(e,function(t){if(r(t,t,e))return!0},!0)}}),De({target:\"Set\",proto:!0,real:!0,forced:!0},{symmetricDifference:function(t){return f(ga,this,xa(t))}}),De({target:\"Set\",proto:!0,real:!0,forced:!0},{union:function(t){return f(ba,this,xa(t))}});var Ma=To.getWeakData,ka=ie.set,Ca=ie.getterFor,Na=_r.find,La=_r.findIndex,Fa=m([].splice),Da=0,Ua=function(t){return t.frozen||(t.frozen=new Ba)},Ba=function(){this.entries=[]},za=function(t,e){return Na(t.entries,function(t){return t[0]===e})};Ba.prototype={get:function(t){var e=za(this,t);if(e)return e[1]},has:function(t){return!!za(this,t)},set:function(t,e){var r=za(this,t);r?r[1]=e:this.entries.push([t,e])},delete:function(t){var e=La(this.entries,function(e){return e[0]===t});return~e&&Fa(this.entries,e,1),!!~e}};var Wa,Ga={getConstructor:function(t,e,r,n){var o=t(function(t,o){Mo(t,i),ka(t,{type:e,id:Da++,frozen:void 0}),T(o)||_o(o,t[n],{that:t,AS_ENTRIES:r})}),i=o.prototype,a=Ca(e),u=function(t,e,r){var n=a(t),o=Ma(It(e),!0);return!0===o?Ua(n).set(e,r):o[n.id]=r,t};return No(i,{delete:function(t){var e=a(this);if(!N(t))return!1;var r=Ma(t);return!0===r?Ua(e).delete(t):r&&st(r,e.id)&&delete r[e.id]},has:function(t){var e=a(this);if(!N(t))return!1;var r=Ma(t);return!0===r?Ua(e).has(t):r&&st(r,e.id)}}),No(i,r?{get:function(t){var e=a(this);if(N(t)){var r=Ma(t);return!0===r?Ua(e).get(t):r?r[e.id]:void 0}},set:function(t,e){return u(this,t,e)}}:{add:function(t){return u(this,t,!0)}}),o}},Ka=ie.enforce,$a=Object,Va=Array.isArray,qa=$a.isExtensible,Ha=$a.isFrozen,Ya=$a.isSealed,Xa=$a.freeze,Ja=$a.seal,Qa={},Za={},tu=!i.ActiveXObject&&\"ActiveXObject\"in i,eu=function(t){return function(){return t(this,arguments.length?arguments[0]:void 0)}},ru=Co(\"WeakMap\",eu,Ga),nu=ru.prototype,ou=m(nu.set);if(Xt)if(tu){Wa=Ga.getConstructor(eu,\"WeakMap\",!0),To.enable();var iu=m(nu.delete),au=m(nu.has),uu=m(nu.get);No(nu,{delete:function(t){if(N(t)&&!qa(t)){var e=Ka(this);return e.frozen||(e.frozen=new Wa),iu(this,t)||e.frozen.delete(t)}return iu(this,t)},has:function(t){if(N(t)&&!qa(t)){var e=Ka(this);return e.frozen||(e.frozen=new Wa),au(this,t)||e.frozen.has(t)}return au(this,t)},get:function(t){if(N(t)&&!qa(t)){var e=Ka(this);return e.frozen||(e.frozen=new Wa),au(this,t)?uu(this,t):e.frozen.get(t)}return uu(this,t)},set:function(t,e){if(N(t)&&!qa(t)){var r=Ka(this);r.frozen||(r.frozen=new Wa),au(this,t)?ou(this,t,e):r.frozen.set(t,e)}else ou(this,t,e);return this}})}else jo&&a(function(){var t=Xa([]);return ou(new ru,t,1),!Ha(t)})&&No(nu,{set:function(t,e){var r;return Va(t)&&(Ha(t)?r=Qa:Ya(t)&&(r=Za)),ou(this,t,e),r==Qa&&Xa(t),r==Za&&Ja(t),this}});var cu=WeakMap.prototype,su={WeakMap:WeakMap,set:m(cu.set),get:m(cu.get),has:m(cu.has),remove:m(cu.delete)},fu=su.has,lu=function(t){return fu(t),t},hu=su.get,pu=su.has,du=su.set;De({target:\"WeakMap\",proto:!0,real:!0,forced:!0},{emplace:function(t,e){var r,n,o=lu(this);return pu(o,t)?(r=hu(o,t),\"update\"in e&&(r=e.update(r,t,o),du(o,t,r)),r):(n=e.insert(t,o),du(o,t,n),n)}}),De({target:\"WeakMap\",stat:!0,forced:!0},{from:ti}),De({target:\"WeakMap\",stat:!0,forced:!0},{of:ri});var vu=su.remove;De({target:\"WeakMap\",proto:!0,real:!0,forced:!0},{deleteAll:function(){for(var t,e=lu(this),r=!0,n=0,o=arguments.length;n2)if(s=Mu(s),43===(e=Du(s,0))||45===e){if(88===(r=Du(s,2))||120===r)return NaN}else if(48===e){switch(Du(s,1)){case 66:case 98:n=2,o=49;break;case 79:case 111:n=8,o=55;break;default:return+s}for(a=(i=Fu(s,2)).length,u=0;uo)return NaN;return parseInt(i,n)}return+s}(e)}(t));return F(Nu,e=this)&&a(function(){Eu(e)})?ko(Object(r),this,Bu):r};Bu.prototype=Nu,Uu&&(Nu.constructor=Bu),De({global:!0,constructor:!0,wrap:!0,forced:Uu},{Number:Bu}),Uu&&function(t,e){for(var r,n=u?Pu(e):\"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,isFinite,isInteger,isNaN,isSafeInteger,parseFloat,parseInt,fromString,range\".split(\",\"),o=0;n.length>o;o++)st(e,r=n[o])&&!st(t,r)&&Iu(t,r,_u(e,r))}(Xn[ku],Cu),De({target:\"Number\",stat:!0,nonConfigurable:!0,nonWritable:!0},{EPSILON:Math.pow(2,-52)});var zu=i.isFinite;De({target:\"Number\",stat:!0},{isFinite:Number.isFinite||function(t){return\"number\"==typeof t&&zu(t)}});var Wu=Math.floor,Gu=Number.isInteger||function(t){return!N(t)&&isFinite(t)&&Wu(t)===t};De({target:\"Number\",stat:!0},{isInteger:Gu}),De({target:\"Number\",stat:!0},{isNaN:function(t){return t!=t}});var Ku=Math.abs;De({target:\"Number\",stat:!0},{isSafeInteger:function(t){return Gu(t)&&Ku(t)<=9007199254740991}}),De({target:\"Number\",stat:!0,nonConfigurable:!0,nonWritable:!0},{MAX_SAFE_INTEGER:9007199254740991}),De({target:\"Number\",stat:!0,nonConfigurable:!0,nonWritable:!0},{MIN_SAFE_INTEGER:-9007199254740991});var $u=m(d.f),Vu=m([].push),qu=function(t){return function(e){for(var r,n=P(e),o=Ge(n),i=o.length,a=0,c=[];i>a;)r=o[a++],u&&!$u(n,r)||Vu(c,t?[r,n[r]]:n[r]);return c}},Hu={entries:qu(!0),values:qu(!1)},Yu=Hu.entries;De({target:\"Object\",stat:!0},{entries:function(t){return Yu(t)}}),De({target:\"Object\",stat:!0,sham:!u},{getOwnPropertyDescriptors:function(t){for(var e,r,n=P(t),o=At.f,i=Re(n),a={},u=0;i.length>u;)void 0!==(r=o(n,e=i[u++]))&&Dn(a,e,r);return a}});var Xu=Object.is||function(t,e){return t===e?0!==t||1/t==1/e:t!=t&&e!=e};De({target:\"Object\",stat:!0},{is:Xu});var Ju=a(function(){Ge(1)});De({target:\"Object\",stat:!0,forced:Ju},{keys:function(t){return Ge(ut(t))}});var Qu=Hu.values;De({target:\"Object\",stat:!0},{values:function(t){return Qu(t)}});var Zu=Xr.codeAt;De({target:\"String\",proto:!0},{codePointAt:function(t){return Zu(this,t)}}),ir(\"String\",\"codePointAt\");var tc,ec=yt(\"match\"),rc=function(t){var e;return N(t)&&(void 0!==(e=t[ec])?!!e:\"RegExp\"==E(t))},nc=TypeError,oc=function(t){if(rc(t))throw nc(\"The method doesn't accept regular expressions\");return t},ic=yt(\"match\"),ac=function(t){var e=/./;try{\"/./\"[t](e)}catch(r){try{return e[ic]=!1,\"/./\"[t](e)}catch(t){}}return!1},uc=At.f,cc=ar(\"\".endsWith),sc=ar(\"\".slice),fc=Math.min,lc=ac(\"endsWith\"),hc=!(lc||(tc=uc(String.prototype,\"endsWith\"),!tc||tc.writable));De({target:\"String\",proto:!0,forced:!hc&&!lc},{endsWith:function(t){var e=$r(R(this));oc(t);var r=arguments.length>1?arguments[1]:void 0,n=e.length,o=void 0===r?n:fc(ge(r),n),i=$r(t);return cc?cc(e,i,o):sc(e,o-i.length,o)===i}}),ir(\"String\",\"endsWith\");var pc=RangeError,dc=String.fromCharCode,vc=String.fromCodePoint,gc=m([].join);De({target:\"String\",stat:!0,arity:1,forced:!!vc&&1!=vc.length},{fromCodePoint:function(t){for(var e,r=[],n=arguments.length,o=0;n>o;){if(e=+arguments[o++],de(e,1114111)!==e)throw pc(e+\" is not a valid code point\");r[o]=e<65536?dc(e):dc(55296+((e-=65536)>>10),e%1024+56320)}return gc(r,\"\")}});var yc=m(\"\".indexOf);De({target:\"String\",proto:!0,forced:!ac(\"includes\")},{includes:function(t){return!!~yc($r(R(this)),$r(oc(t)),arguments.length>1?arguments[1]:void 0)}}),ir(\"String\",\"includes\"),m(fn.String);var bc=RangeError,mc=function(t){var e=$r(R(this)),r=\"\",n=le(t);if(n<0||Infinity==n)throw bc(\"Wrong number of repetitions\");for(;n>0;(n>>>=1)&&(e+=e))1&n&&(r+=e);return r},wc=m(mc),Sc=m(\"\".slice),Ec=Math.ceil,Oc=function(t){return function(e,r,n){var o,i,a=$r(R(e)),u=ge(r),c=a.length,s=void 0===n?\" \":$r(n);return u<=c||\"\"==s?a:((i=wc(s,Ec((o=u-c)/s.length))).length>o&&(i=Sc(i,0,o)),t?a+i:i+a)}},xc={start:Oc(!1),end:Oc(!0)},jc=/Version\\/10(?:\\.\\d+){1,2}(?: [\\w./]+)?(?: Mobile\\/\\w+)? Safari\\//.test(D),Tc=xc.start;De({target:\"String\",proto:!0,forced:jc},{padStart:function(t){return Tc(this,t,arguments.length>1?arguments[1]:void 0)}}),ir(\"String\",\"padStart\");var Ac=xc.end;De({target:\"String\",proto:!0,forced:jc},{padEnd:function(t){return Ac(this,t,arguments.length>1?arguments[1]:void 0)}}),ir(\"String\",\"padEnd\");var Rc=m([].push),Pc=m([].join);De({target:\"String\",stat:!0},{raw:function(t){var e=P(ut(t).raw),r=ye(e);if(!r)return\"\";for(var n=arguments.length,o=[],i=0;;){if(Rc(o,$r(e[i++])),i===r)return Pc(o,\"\");i1?arguments[1]:void 0,e.length)),n=$r(t);return Ic?Ic(e,n,r):Mc(e,r,r+n.length)===n}}),ir(\"String\",\"startsWith\");var Lc=Gt.PROPER,Fc=function(t){return a(function(){return!!Ou[t]()||\"​…᠎\"!==\"​…᠎\"[t]()||Lc&&Ou[t].name!==t})},Dc=Ru.start,Uc=Fc(\"trimStart\")?function(){return Dc(this)}:\"\".trimStart;De({target:\"String\",proto:!0,name:\"trimStart\",forced:\"\".trimLeft!==Uc},{trimLeft:Uc}),De({target:\"String\",proto:!0,name:\"trimStart\",forced:\"\".trimStart!==Uc},{trimStart:Uc}),ir(\"String\",\"trimLeft\");var Bc=Ru.end,zc=Fc(\"trimEnd\")?function(){return Bc(this)}:\"\".trimEnd;De({target:\"String\",proto:!0,name:\"trimEnd\",forced:\"\".trimRight!==zc},{trimRight:zc}),De({target:\"String\",proto:!0,name:\"trimEnd\",forced:\"\".trimEnd!==zc},{trimEnd:zc}),ir(\"String\",\"trimRight\");var Wc=Function.prototype,Gc=Wc.apply,Kc=Wc.call,$c=\"object\"==typeof Reflect&&Reflect.apply||(c?Kc.bind(Gc):function(){return Kc.apply(Gc,arguments)}),Vc=!a(function(){Reflect.apply(function(){})});De({target:\"Reflect\",stat:!0,forced:Vc},{apply:function(t,e,r){return $c(Q(t),e,It(r))}});var qc=Function,Hc=m([].concat),Yc=m([].join),Xc={},Jc=c?qc.bind:function(t){var e=Q(this),r=e.prototype,n=ei(arguments,1),o=function(){var r=Hc(n,ei(arguments));return this instanceof o?function(t,e,r){if(!st(Xc,e)){for(var n=[],o=0;ob)\",\"g\");return\"b\"!==t.exec(\"b\").groups.a||\"bc\"!==\"b\".replace(t,\"$c\")}),of=je.f,af=ie.enforce,uf=yt(\"match\"),cf=i.RegExp,sf=cf.prototype,ff=i.SyntaxError,lf=m(sf.exec),hf=m(\"\".charAt),pf=m(\"\".replace),df=m(\"\".indexOf),vf=m(\"\".slice),gf=/^\\?<[^\\s\\d!#%&*+<=>@^][^\\s!#%&*+<=>@^]*>/,yf=/a/g,bf=/a/g,mf=new cf(yf)!==yf,wf=Js.MISSED_STICKY,Sf=Js.UNSUPPORTED_Y,Ef=u&&(!mf||wf||ef||nf||a(function(){return bf[uf]=!1,cf(yf)!=yf||cf(bf)==bf||\"/a/i\"!=cf(yf,\"i\")}));if(Le(\"RegExp\",Ef)){for(var Of=function(t,e){var r,n,o,i,a,u,c=F(sf,this),s=rc(t),f=void 0===e,l=[],h=t;if(!c&&s&&f&&t.constructor===Of)return t;if((s||F(sf,t))&&(t=t.source,f&&(e=Vs(h))),t=void 0===t?\"\":$r(t),e=void 0===e?\"\":$r(e),h=t,ef&&\"dotAll\"in yf&&(n=!!e&&df(e,\"s\")>-1)&&(e=pf(e,/s/g,\"\")),r=e,wf&&\"sticky\"in yf&&(o=!!e&&df(e,\"y\")>-1)&&Sf&&(e=pf(e,/y/g,\"\")),nf&&(i=function(t){for(var e,r=t.length,n=0,o=\"\",i=[],a={},u=!1,c=!1,s=0,f=\"\";n<=r;n++){if(\"\\\\\"===(e=hf(t,n)))e+=hf(t,++n);else if(\"]\"===e)u=!1;else if(!u)switch(!0){case\"[\"===e:u=!0;break;case\"(\"===e:lf(gf,vf(t,n+1))&&(n+=2,c=!0),o+=e,s++;continue;case\">\"===e&&c:if(\"\"===f||st(a,f))throw new ff(\"Invalid capture group name\");a[f]=!0,i[i.length]=[f,s],c=!1,f=\"\";continue}c?f+=e:o+=e}return[o,i]}(t),t=i[0],l=i[1]),a=ko(cf(t,e),c?this:sf,Of),(n||o||l.length)&&(u=af(a),n&&(u.dotAll=!0,u.raw=Of(function(t){for(var e,r=t.length,n=0,o=\"\",i=!1;n<=r;n++)\"\\\\\"!==(e=hf(t,n))?i||\".\"!==e?(\"[\"===e?i=!0:\"]\"===e&&(i=!1),o+=e):o+=\"[\\\\s\\\\S]\":o+=e+hf(t,++n);return o}(t),r)),o&&(u.sticky=!0),l.length&&(u.groups=l)),t!==h)try{Ut(a,\"source\",\"\"===h?\"(?:)\":h)}catch(t){}return a},xf=of(cf),jf=0;xf.length>jf;)Zs(Of,cf,xf[jf++]);sf.constructor=Of,Of.prototype=sf,ue(i,\"RegExp\",Of,{constructor:!0})}Fo(\"RegExp\");var Tf=Gt.PROPER,Af=\"toString\",Rf=RegExp.prototype[Af];(a(function(){return\"/a/b\"!=Rf.call({source:\"a\",flags:\"b\"})})||Tf&&Rf.name!=Af)&&ue(RegExp.prototype,Af,function(){var t=It(this);return\"/\"+$r(t.source)+\"/\"+$r(Vs(t))},{unsafe:!0});var Pf=ie.get,_f=RegExp.prototype,If=TypeError;u&&ef&&so(_f,\"dotAll\",{configurable:!0,get:function(){if(this!==_f){if(\"RegExp\"===E(this))return!!Pf(this).dotAll;throw If(\"Incompatible receiver, RegExp required\")}}});var Mf=ie.get,kf=it(\"native-string-replace\",String.prototype.replace),Cf=RegExp.prototype.exec,Nf=Cf,Lf=m(\"\".charAt),Ff=m(\"\".indexOf),Df=m(\"\".replace),Uf=m(\"\".slice),Bf=function(){var t=/a/,e=/b*/g;return f(Cf,t,\"a\"),f(Cf,e,\"a\"),0!==t.lastIndex||0!==e.lastIndex}(),zf=Js.BROKEN_CARET,Wf=void 0!==/()??/.exec(\"\")[1];(Bf||Wf||zf||ef||nf)&&(Nf=function(t){var e,r,n,o,i,a,u,c=this,s=Mf(c),l=$r(t),h=s.raw;if(h)return h.lastIndex=c.lastIndex,e=f(Nf,h,l),c.lastIndex=h.lastIndex,e;var p=s.groups,d=zf&&c.sticky,v=f(Ks,c),g=c.source,y=0,b=l;if(d&&(v=Df(v,\"y\",\"\"),-1===Ff(v,\"g\")&&(v+=\"g\"),b=Uf(l,c.lastIndex),c.lastIndex>0&&(!c.multiline||c.multiline&&\"\\n\"!==Lf(l,c.lastIndex-1))&&(g=\"(?: \"+g+\")\",b=\" \"+b,y++),r=new RegExp(\"^(?:\"+g+\")\",v)),Wf&&(r=new RegExp(\"^\"+g+\"$(?!\\\\s)\",v)),Bf&&(n=c.lastIndex),o=f(Cf,d?r:c,b),d?o?(o.input=Uf(o.input,y),o[0]=Uf(o[0],y),o.index=c.lastIndex,c.lastIndex+=o[0].length):c.lastIndex=0:Bf&&o&&(c.lastIndex=c.global?o.index+o[0].length:n),Wf&&o&&o.length>1&&f(kf,o[0],r,function(){for(i=1;i]*>)/g,ll=/\\$([$&'`]|\\d{1,2})/g,hl=function(t,e,r,n,o,i){var a=r+t.length,u=n.length,c=ll;return void 0!==o&&(o=ut(o),c=fl),cl(i,c,function(i,c){var s;switch(ul(c,0)){case\"$\":return\"$\";case\"&\":return t;case\"`\":return sl(e,0,r);case\"'\":return sl(e,a);case\"<\":s=o[sl(c,1,-1)];break;default:var f=+c;if(0===f)return i;if(f>u){var l=al(f/10);return 0===l?i:l<=u?void 0===n[l-1]?ul(c,1):n[l-1]+ul(c,1):i}s=n[f-1]}return void 0===s?\"\":s})},pl=yt(\"replace\"),dl=Math.max,vl=Math.min,gl=m([].concat),yl=m([].push),bl=m(\"\".indexOf),ml=m(\"\".slice),wl=\"$0\"===\"a\".replace(/./,\"$0\"),Sl=!!/./[pl]&&\"\"===/./[pl](\"a\",\"$0\"),El=!a(function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:\"7\"},t},\"7\"!==\"\".replace(t,\"$\")});el(\"replace\",function(t,e,r){var n=Sl?\"$\":\"$0\";return[function(t,r){var n=R(this),o=T(t)?void 0:Z(t,pl);return o?f(o,t,n,r):f(e,$r(n),t,r)},function(t,o){var i=It(this),a=$r(t);if(\"string\"==typeof o&&-1===bl(o,n)&&-1===bl(o,\"$<\")){var u=r(e,i,a,o);if(u.done)return u.value}var c=k(o);c||(o=$r(o));var s=i.global;if(s){var f=i.unicode;i.lastIndex=0}for(var l=[];;){var h=il(i,a);if(null===h)break;if(yl(l,h),!s)break;\"\"===$r(h[0])&&(i.lastIndex=nl(a,ge(i.lastIndex),f))}for(var p,d=\"\",v=0,g=0;g=v&&(d+=ml(a,v,b)+O,v=b+y.length)}return d+ml(a,v)}]},!El||!wl||Sl),el(\"search\",function(t,e,r){return[function(e){var r=R(this),n=T(e)?void 0:Z(e,t);return n?f(n,e,r):new RegExp(e)[t]($r(r))},function(t){var n=It(this),o=$r(t),i=r(e,n,o);if(i.done)return i.value;var a=n.lastIndex;Xu(a,0)||(n.lastIndex=0);var u=il(n,o);return Xu(n.lastIndex,a)||(n.lastIndex=a),null===u?-1:u.index}]});var Ol=yt(\"species\"),xl=function(t,e){var r,n=It(t).constructor;return void 0===n||T(r=It(n)[Ol])?e:Qo(r)},jl=Js.UNSUPPORTED_Y,Tl=4294967295,Al=Math.min,Rl=[].push,Pl=m(/./.exec),_l=m(Rl),Il=m(\"\".slice),Ml=!a(function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var r=\"ab\".split(t);return 2!==r.length||\"a\"!==r[0]||\"b\"!==r[1]});el(\"split\",function(t,e,r){var n;return n=\"c\"==\"abbc\".split(/(b)*/)[1]||4!=\"test\".split(/(?:)/,-1).length||2!=\"ab\".split(/(?:ab)*/).length||4!=\".\".split(/(.?)(.?)/).length||\".\".split(/()()/).length>1||\"\".split(/.?/).length?function(t,r){var n=$r(R(this)),o=void 0===r?Tl:r>>>0;if(0===o)return[];if(void 0===t)return[n];if(!rc(t))return f(e,n,t,o);for(var i,a,u,c=[],s=0,l=new RegExp(t.source,(t.ignoreCase?\"i\":\"\")+(t.multiline?\"m\":\"\")+(t.unicode?\"u\":\"\")+(t.sticky?\"y\":\"\")+\"g\");(i=f(Gf,l,n))&&!((a=l.lastIndex)>s&&(_l(c,Il(n,s,i.index)),i.length>1&&i.index=o));)l.lastIndex===i.index&&l.lastIndex++;return s===n.length?!u&&Pl(l,\"\")||_l(c,\"\"):_l(c,Il(n,s)),c.length>o?bo(c,0,o):c}:\"0\".split(void 0,0).length?function(t,r){return void 0===t&&0===r?[]:f(e,this,t,r)}:e,[function(e,r){var o=R(this),i=T(e)?void 0:Z(e,t);return i?f(i,e,o,r):f(n,$r(o),e,r)},function(t,o){var i=It(this),a=$r(t),u=r(n,i,a,o,n!==e);if(u.done)return u.value;var c=xl(i,RegExp),s=i.unicode,f=new c(jl?\"^(?:\"+i.source+\")\":i,(i.ignoreCase?\"i\":\"\")+(i.multiline?\"m\":\"\")+(i.unicode?\"u\":\"\")+(jl?\"g\":\"y\")),l=void 0===o?Tl:o>>>0;if(0===l)return[];if(0===a.length)return null===il(f,a)?[a]:[];for(var h=0,p=0,d=[];p=51||!a(function(){var t=[];return t[Cl]=!1,t.concat()[0]!==t}),Ll=function(t){if(!N(t))return!1;var e=t[Cl];return void 0!==e?!!e:sr(t)},Fl=!(Nl&&(G>=51||!a(function(){var t=[];return(t.constructor={})[kl]=function(){return{foo:1}},1!==t.concat(Boolean).foo})));De({target:\"Array\",proto:!0,arity:1,forced:Fl},{concat:function(t){var e,r,n,o,i,a=ut(this),u=Ar(a,0),c=0;for(e=-1,n=arguments.length;e2&&(n=r,N(o=arguments[2])&&\"cause\"in o&&Ut(n,\"cause\",o.cause));var c=[];return _o(t,pp,{that:c}),Ut(r,\"errors\",c),r};yn?yn(dp,hp):Pe(dp,hp,{name:!0});var vp=dp.prototype=tr(hp.prototype,{constructor:v(1,dp),message:v(1,\"\"),name:v(1,\"AggregateError\")});De({global:!0,constructor:!0,arity:2},{AggregateError:dp});var gp,yp,bp,mp,wp=\"undefined\"!=typeof process&&\"process\"==E(process),Sp=TypeError,Ep=/(?:ipad|iphone|ipod).*applewebkit/i.test(D),Op=i.setImmediate,xp=i.clearImmediate,jp=i.process,Tp=i.Dispatch,Ap=i.Function,Rp=i.MessageChannel,Pp=i.String,_p=0,Ip={},Mp=\"onreadystatechange\";a(function(){gp=i.location});var kp=function(t){if(st(Ip,t)){var e=Ip[t];delete Ip[t],e()}},Cp=function(t){return function(){kp(t)}},Np=function(t){kp(t.data)},Lp=function(t){i.postMessage(Pp(t),gp.protocol+\"//\"+gp.host)};Op&&xp||(Op=function(t){!function(t,e){if(t<1)throw Sp(\"Not enough arguments\")}(arguments.length);var e=k(t)?t:Ap(t),r=ei(arguments,1);return Ip[++_p]=function(){$c(e,void 0,r)},yp(_p),_p},xp=function(t){delete Ip[t]},wp?yp=function(t){jp.nextTick(Cp(t))}:Tp&&Tp.now?yp=function(t){Tp.now(Cp(t))}:Rp&&!Ep?(mp=(bp=new Rp).port2,bp.port1.onmessage=Np,yp=cr(mp.postMessage,mp)):i.addEventListener&&k(i.postMessage)&&!i.importScripts&&gp&&\"file:\"!==gp.protocol&&!a(Lp)?(yp=Lp,i.addEventListener(\"message\",Np,!1)):yp=Mp in xt(\"script\")?function(t){Ve.appendChild(xt(\"script\"))[Mp]=function(){Ve.removeChild(this),kp(t)}}:function(t){setTimeout(Cp(t),0)});var Fp={set:Op,clear:xp},Dp=function(){this.head=null,this.tail=null};Dp.prototype={add:function(t){var e={item:t,next:null},r=this.tail;r?r.next=e:this.head=e,this.tail=e},get:function(){var t=this.head;if(t)return null===(this.head=t.next)&&(this.tail=null),t.item}};var Up,Bp,zp,Wp,Gp,Kp=Dp,$p=/ipad|iphone|ipod/i.test(D)&&\"undefined\"!=typeof Pebble,Vp=/web0s(?!.*chrome)/i.test(D),qp=Fp.set,Hp=i.MutationObserver||i.WebKitMutationObserver,Yp=i.document,Xp=i.process,Jp=i.Promise,Qp=(0,At.f)(i,\"queueMicrotask\"),Zp=Qp&&Qp.value;if(!Zp){var td=new Kp,ed=function(){var t,e;for(wp&&(t=Xp.domain)&&t.exit();e=td.get();)try{e()}catch(t){throw td.head&&Up(),t}t&&t.enter()};Ep||wp||Vp||!Hp||!Yp?!$p&&Jp&&Jp.resolve?((Wp=Jp.resolve(void 0)).constructor=Jp,Gp=cr(Wp.then,Wp),Up=function(){Gp(ed)}):wp?Up=function(){Xp.nextTick(ed)}:(qp=cr(qp,i),Up=function(){qp(ed)}):(Bp=!0,zp=Yp.createTextNode(\"\"),new Hp(ed).observe(zp,{characterData:!0}),Up=function(){zp.data=Bp=!Bp}),Zp=function(t){td.head||Up(),td.add(t)}}var rd,nd,od,id=Zp,ad=function(t){try{return{error:!1,value:t()}}catch(t){return{error:!0,value:t}}},ud=i.Promise,cd=\"object\"==typeof Deno&&Deno&&\"object\"==typeof Deno.version,sd=!cd&&!wp&&\"object\"==typeof window&&\"object\"==typeof document,fd=yt(\"species\"),ld=!1,hd=k(i.PromiseRejectionEvent),pd=Le(\"Promise\",function(){var t=Ht(ud),e=t!==String(ud);if(!e&&66===G)return!0;if(!G||G<51||!/native code/.test(t)){var r=new ud(function(t){t(1)}),n=function(t){t(function(){},function(){})};if((r.constructor={})[fd]=n,!(ld=r.then(function(){})instanceof n))return!0}return!e&&(sd||cd)&&!hd}),dd={CONSTRUCTOR:pd,REJECTION_EVENT:hd,SUBCLASSING:ld},vd=TypeError,gd=function(t){var e,r;this.promise=new t(function(t,n){if(void 0!==e||void 0!==r)throw vd(\"Bad Promise constructor\");e=t,r=n}),this.resolve=Q(e),this.reject=Q(r)},yd={f:function(t){return new gd(t)}},bd=Fp.set,md=\"Promise\",wd=dd.CONSTRUCTOR,Sd=dd.REJECTION_EVENT,Ed=dd.SUBCLASSING,Od=ie.getterFor(md),xd=ie.set,jd=ud&&ud.prototype,Td=ud,Ad=jd,Rd=i.TypeError,Pd=i.document,_d=i.process,Id=yd.f,Md=Id,kd=!!(Pd&&Pd.createEvent&&i.dispatchEvent),Cd=\"unhandledrejection\",Nd=function(t){var e;return!(!N(t)||!k(e=t.then))&&e},Ld=function(t,e){var r,n,o,i=e.value,a=1==e.state,u=a?t.ok:t.fail,c=t.resolve,s=t.reject,l=t.domain;try{u?(a||(2===e.rejection&&zd(e),e.rejection=1),!0===u?r=i:(l&&l.enter(),r=u(i),l&&(l.exit(),o=!0)),r===t.promise?s(Rd(\"Promise-chain cycle\")):(n=Nd(r))?f(n,r,c,s):c(r)):s(i)}catch(t){l&&!o&&l.exit(),s(t)}},Fd=function(t,e){t.notified||(t.notified=!0,id(function(){for(var r,n=t.reactions;r=n.get();)Ld(r,t);t.notified=!1,e&&!t.rejection&&Ud(t)}))},Dd=function(t,e,r){var n,o;kd?((n=Pd.createEvent(\"Event\")).promise=e,n.reason=r,n.initEvent(t,!1,!0),i.dispatchEvent(n)):n={promise:e,reason:r},!Sd&&(o=i[\"on\"+t])?o(n):t===Cd&&function(t,e){try{1==arguments.length?console.error(t):console.error(t,e)}catch(t){}}(\"Unhandled promise rejection\",r)},Ud=function(t){f(bd,i,function(){var e,r=t.facade,n=t.value;if(Bd(t)&&(e=ad(function(){wp?_d.emit(\"unhandledRejection\",n,r):Dd(Cd,r,n)}),t.rejection=wp||Bd(t)?2:1,e.error))throw e.value})},Bd=function(t){return 1!==t.rejection&&!t.parent},zd=function(t){f(bd,i,function(){var e=t.facade;wp?_d.emit(\"rejectionHandled\",e):Dd(\"rejectionhandled\",e,t.value)})},Wd=function(t,e,r){return function(n){t(e,n,r)}},Gd=function(t,e,r){t.done||(t.done=!0,r&&(t=r),t.value=e,t.state=2,Fd(t,!0))},Kd=function(t,e,r){if(!t.done){t.done=!0,r&&(t=r);try{if(t.facade===e)throw Rd(\"Promise can't be resolved itself\");var n=Nd(e);n?id(function(){var r={done:!1};try{f(n,e,Wd(Kd,r,t),Wd(Gd,r,t))}catch(e){Gd(r,e,t)}}):(t.value=e,t.state=1,Fd(t,!1))}catch(e){Gd({done:!1},e,t)}}};if(wd&&(Td=function(t){Mo(this,Ad),Q(t),f(rd,this);var e=Od(this);try{t(Wd(Kd,e),Wd(Gd,e))}catch(t){Gd(e,t)}},(rd=function(t){xd(this,{type:md,done:!1,notified:!1,parent:!1,reactions:new Kp,rejection:!1,state:0,value:void 0})}).prototype=ue(Ad=Td.prototype,\"then\",function(t,e){var r=Od(this),n=Id(xl(this,Td));return r.parent=!0,n.ok=!k(t)||t,n.fail=k(e)&&e,n.domain=wp?_d.domain:void 0,0==r.state?r.reactions.add(n):id(function(){Ld(n,r)}),n.promise}),nd=function(){var t=new rd,e=Od(t);this.promise=t,this.resolve=Wd(Kd,e),this.reject=Wd(Gd,e)},yd.f=Id=function(t){return t===Td||void 0===t?new nd(t):Md(t)},k(ud)&&jd!==Object.prototype)){od=jd.then,Ed||ue(jd,\"then\",function(t,e){var r=this;return new Td(function(t,e){f(od,r,t,e)}).then(t,e)},{unsafe:!0});try{delete jd.constructor}catch(t){}yn&&yn(jd,Ad)}De({global:!0,constructor:!0,wrap:!0,forced:wd},{Promise:Td}),sn(Td,md,!1),Fo(md);var $d=dd.CONSTRUCTOR||!Hn(function(t){ud.all(t).then(void 0,function(){})});De({target:\"Promise\",stat:!0,forced:$d},{all:function(t){var e=this,r=yd.f(e),n=r.resolve,o=r.reject,i=ad(function(){var r=Q(e.resolve),i=[],a=0,u=1;_o(t,function(t){var c=a++,s=!1;u++,f(r,e,t).then(function(t){s||(s=!0,i[c]=t,--u||n(i))},o)}),--u||n(i)});return i.error&&o(i.value),r.promise}});var Vd=ud&&ud.prototype;if(De({target:\"Promise\",proto:!0,forced:dd.CONSTRUCTOR,real:!0},{catch:function(t){return this.then(void 0,t)}}),k(ud)){var qd=L(\"Promise\").prototype.catch;Vd.catch!==qd&&ue(Vd,\"catch\",qd,{unsafe:!0})}De({target:\"Promise\",stat:!0,forced:$d},{race:function(t){var e=this,r=yd.f(e),n=r.reject,o=ad(function(){var o=Q(e.resolve);_o(t,function(t){f(o,e,t).then(r.resolve,n)})});return o.error&&n(o.value),r.promise}}),De({target:\"Promise\",stat:!0,forced:dd.CONSTRUCTOR},{reject:function(t){var e=yd.f(this);return f(e.reject,void 0,t),e.promise}});var Hd=function(t,e){if(It(t),N(e)&&e.constructor===t)return e;var r=yd.f(t);return(0,r.resolve)(e),r.promise};De({target:\"Promise\",stat:!0,forced:dd.CONSTRUCTOR},{resolve:function(t){return Hd(this,t)}}),De({target:\"Promise\",stat:!0,forced:$d},{allSettled:function(t){var e=this,r=yd.f(e),n=r.resolve,o=r.reject,i=ad(function(){var r=Q(e.resolve),o=[],i=0,a=1;_o(t,function(t){var u=i++,c=!1;a++,f(r,e,t).then(function(t){c||(c=!0,o[u]={status:\"fulfilled\",value:t},--a||n(o))},function(t){c||(c=!0,o[u]={status:\"rejected\",reason:t},--a||n(o))})}),--a||n(o)});return i.error&&o(i.value),r.promise}});var Yd=\"No one promise resolved\";De({target:\"Promise\",stat:!0,forced:$d},{any:function(t){var e=this,r=L(\"AggregateError\"),n=yd.f(e),o=n.resolve,i=n.reject,a=ad(function(){var n=Q(e.resolve),a=[],u=0,c=1,s=!1;_o(t,function(t){var l=u++,h=!1;c++,f(n,e,t).then(function(t){h||s||(s=!0,o(t))},function(t){h||s||(h=!0,a[l]=t,--c||i(new r(a,Yd)))})}),--c||i(new r(a,Yd))});return a.error&&i(a.value),n.promise}});var Xd=ud&&ud.prototype,Jd=!!ud&&a(function(){Xd.finally.call({then:function(){}},function(){})});if(De({target:\"Promise\",proto:!0,real:!0,forced:Jd},{finally:function(t){var e=xl(this,L(\"Promise\")),r=k(t);return this.then(r?function(r){return Hd(e,t()).then(function(){return r})}:t,r?function(r){return Hd(e,t()).then(function(){throw r})}:t)}}),k(ud)){var Qd=L(\"Promise\").prototype.finally;Xd.finally!==Qd&&ue(Xd,\"finally\",Qd,{unsafe:!0})}De({target:\"Promise\",stat:!0,forced:!0},{try:function(t){var e=yd.f(this),r=ad(t);return(r.error?e.reject:e.resolve)(r.value),e.promise}});var Zd=_r.forEach,tv=function(t,e){var r=[].forEach;return!!r&&a(function(){r.call(null,function(){return 1},1)})}(),ev=tv?[].forEach:function(t){return Zd(this,t,arguments.length>1?arguments[1]:void 0)},rv=function(t){if(t&&t.forEach!==ev)try{Ut(t,\"forEach\",ev)}catch(e){t.forEach=ev}};for(var nv in Wo)Wo[nv]&&rv(i[nv]&&i[nv].prototype);rv($o);const ov=\"undefined\"!=typeof globalThis&&globalThis||\"undefined\"!=typeof self&&self||void 0!==t&&t;function iv(t){try{new t}catch(t){return!1}return!0}\"function\"==typeof ov.Event&&iv(ov.Event)||(ov.Event=function(t,e){this.bubbles=!!e&&!!e.bubbles,this.cancelable=!!e&&!!e.cancelable,this.composed=!!e&&!!e.composed,this.type=t}),void 0!==ov.EventTarget&&iv(ov.Event)||(ov.EventTarget=function(){function t(){this.__listeners=new Map}return(t.prototype=Object.create(Object.prototype)).addEventListener=function(t,e,r){if(arguments.length<2)throw new TypeError(`TypeError: Failed to execute 'addEventListener' on 'EventTarget': 2 arguments required, but only ${arguments.length} present.`);const n=this.__listeners,o=t.toString();n.has(o)||n.set(o,new Map);const i=n.get(o);i.has(e)||i.set(e,r)},t.prototype.removeEventListener=function(t,e,r){if(arguments.length<2)throw new TypeError(`TypeError: Failed to execute 'addEventListener' on 'EventTarget': 2 arguments required, but only ${arguments.length} present.`);const n=this.__listeners,o=t.toString();if(n.has(o)){const t=n.get(o);t.has(e)&&t.delete(e)}},t.prototype.dispatchEvent=function(t){if(!(t instanceof Event))throw new TypeError(\"Failed to execute 'dispatchEvent' on 'EventTarget': parameter 1 is not of type 'Event'.\");const e=this.__listeners.get(t.type);if(e)for(const[r,n]of e.entries()){try{\"function\"==typeof r?r.call(this,t):r&&\"function\"==typeof r.handleEvent&&r.handleEvent(t)}catch(t){setTimeout(()=>{throw t})}n&&n.once&&e.delete(r)}return!0},t}());const av=\"undefined\"!=typeof globalThis&&globalThis||\"undefined\"!=typeof self&&self||void 0!==t&&t;if(void 0===av.AbortController){const t={};av.AbortSignal=function(){function e(e){if(e!==t)throw new TypeError(\"Illegal constructor.\");EventTarget.call(this),this._aborted=!1}return(e.prototype=Object.create(EventTarget.prototype)).constructor=e,Object.defineProperty(e.prototype,\"onabort\",{get:function(){return this._onabort},set:function(t){const e=this._onabort;e&&this.removeEventListener(\"abort\",e),this._onabort=t,this.addEventListener(\"abort\",t)}}),Object.defineProperty(e.prototype,\"aborted\",{get:function(){return this._aborted}}),e}(),av.AbortController=function(){function e(){this._signal=new AbortSignal(t)}return e.prototype=Object.create(Object.prototype),Object.defineProperty(e.prototype,\"signal\",{get:function(){return this._signal}}),e.prototype.abort=function(){const t=this.signal;t.aborted||(t._aborted=!0,t.dispatchEvent(new Event(\"abort\")))},e}()}var uv=\"undefined\"!=typeof globalThis&&globalThis||\"undefined\"!=typeof self&&self||void 0!==uv&&uv,cv={searchParams:\"URLSearchParams\"in uv,iterable:\"Symbol\"in uv&&\"iterator\"in Symbol,blob:\"FileReader\"in uv&&\"Blob\"in uv&&function(){try{return new Blob,!0}catch(t){return!1}}(),formData:\"FormData\"in uv,arrayBuffer:\"ArrayBuffer\"in uv};if(cv.arrayBuffer)var sv=[\"[object Int8Array]\",\"[object Uint8Array]\",\"[object Uint8ClampedArray]\",\"[object Int16Array]\",\"[object Uint16Array]\",\"[object Int32Array]\",\"[object Uint32Array]\",\"[object Float32Array]\",\"[object Float64Array]\"],fv=ArrayBuffer.isView||function(t){return t&&sv.indexOf(Object.prototype.toString.call(t))>-1};function lv(t){if(\"string\"!=typeof t&&(t=String(t)),/[^a-z0-9\\-#$%&'*+.^_`|~!]/i.test(t)||\"\"===t)throw new TypeError('Invalid character in header field name: \"'+t+'\"');return t.toLowerCase()}function hv(t){return\"string\"!=typeof t&&(t=String(t)),t}function pv(t){var e={next:function(){var e=t.shift();return{done:void 0===e,value:e}}};return cv.iterable&&(e[Symbol.iterator]=function(){return e}),e}function dv(t){this.map={},t instanceof dv?t.forEach(function(t,e){this.append(e,t)},this):Array.isArray(t)?t.forEach(function(t){this.append(t[0],t[1])},this):t&&Object.getOwnPropertyNames(t).forEach(function(e){this.append(e,t[e])},this)}function vv(t){if(t.bodyUsed)return Promise.reject(new TypeError(\"Already read\"));t.bodyUsed=!0}function gv(t){return new Promise(function(e,r){t.onload=function(){e(t.result)},t.onerror=function(){r(t.error)}})}function yv(t){var e=new FileReader,r=gv(e);return e.readAsArrayBuffer(t),r}function bv(t){if(t.slice)return t.slice(0);var e=new Uint8Array(t.byteLength);return e.set(new Uint8Array(t)),e.buffer}function mv(){return this.bodyUsed=!1,this._initBody=function(t){var e;this.bodyUsed=this.bodyUsed,this._bodyInit=t,t?\"string\"==typeof t?this._bodyText=t:cv.blob&&Blob.prototype.isPrototypeOf(t)?this._bodyBlob=t:cv.formData&&FormData.prototype.isPrototypeOf(t)?this._bodyFormData=t:cv.searchParams&&URLSearchParams.prototype.isPrototypeOf(t)?this._bodyText=t.toString():cv.arrayBuffer&&cv.blob&&(e=t)&&DataView.prototype.isPrototypeOf(e)?(this._bodyArrayBuffer=bv(t.buffer),this._bodyInit=new Blob([this._bodyArrayBuffer])):cv.arrayBuffer&&(ArrayBuffer.prototype.isPrototypeOf(t)||fv(t))?this._bodyArrayBuffer=bv(t):this._bodyText=t=Object.prototype.toString.call(t):this._bodyText=\"\",this.headers.get(\"content-type\")||(\"string\"==typeof t?this.headers.set(\"content-type\",\"text/plain;charset=UTF-8\"):this._bodyBlob&&this._bodyBlob.type?this.headers.set(\"content-type\",this._bodyBlob.type):cv.searchParams&&URLSearchParams.prototype.isPrototypeOf(t)&&this.headers.set(\"content-type\",\"application/x-www-form-urlencoded;charset=UTF-8\"))},cv.blob&&(this.blob=function(){var t=vv(this);if(t)return t;if(this._bodyBlob)return Promise.resolve(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(new Blob([this._bodyArrayBuffer]));if(this._bodyFormData)throw new Error(\"could not read FormData body as blob\");return Promise.resolve(new Blob([this._bodyText]))},this.arrayBuffer=function(){return this._bodyArrayBuffer?vv(this)||(ArrayBuffer.isView(this._bodyArrayBuffer)?Promise.resolve(this._bodyArrayBuffer.buffer.slice(this._bodyArrayBuffer.byteOffset,this._bodyArrayBuffer.byteOffset+this._bodyArrayBuffer.byteLength)):Promise.resolve(this._bodyArrayBuffer)):this.blob().then(yv)}),this.text=function(){var t=vv(this);if(t)return t;if(this._bodyBlob)return function(t){var e=new FileReader,r=gv(e);return e.readAsText(t),r}(this._bodyBlob);if(this._bodyArrayBuffer)return Promise.resolve(function(t){for(var e=new Uint8Array(t),r=new Array(e.length),n=0;n-1?e:t}(e.method||this.method||\"GET\"),this.mode=e.mode||this.mode||null,this.signal=e.signal||this.signal,this.referrer=null,(\"GET\"===this.method||\"HEAD\"===this.method)&&r)throw new TypeError(\"Body not allowed for GET or HEAD requests\");if(this._initBody(r),!(\"GET\"!==this.method&&\"HEAD\"!==this.method||\"no-store\"!==e.cache&&\"no-cache\"!==e.cache)){var n=/([?&])_=[^&]*/;n.test(this.url)?this.url=this.url.replace(n,\"$1_=\"+(new Date).getTime()):this.url+=(/\\?/.test(this.url)?\"&\":\"?\")+\"_=\"+(new Date).getTime()}}function Ev(t){var e=new FormData;return t.trim().split(\"&\").forEach(function(t){if(t){var r=t.split(\"=\"),n=r.shift().replace(/\\+/g,\" \"),o=r.join(\"=\").replace(/\\+/g,\" \");e.append(decodeURIComponent(n),decodeURIComponent(o))}}),e}function Ov(t,e){if(!(this instanceof Ov))throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.');e||(e={}),this.type=\"default\",this.status=void 0===e.status?200:e.status,this.ok=this.status>=200&&this.status<300,this.statusText=void 0===e.statusText?\"\":\"\"+e.statusText,this.headers=new dv(e.headers),this.url=e.url||\"\",this._initBody(t)}Sv.prototype.clone=function(){return new Sv(this,{body:this._bodyInit})},mv.call(Sv.prototype),mv.call(Ov.prototype),Ov.prototype.clone=function(){return new Ov(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new dv(this.headers),url:this.url})},Ov.error=function(){var t=new Ov(null,{status:0,statusText:\"\"});return t.type=\"error\",t};var xv=[301,302,303,307,308];Ov.redirect=function(t,e){if(-1===xv.indexOf(e))throw new RangeError(\"Invalid status code\");return new Ov(null,{status:e,headers:{location:t}})};var jv=uv.DOMException;try{new jv}catch(t){(jv=function(t,e){this.message=t,this.name=e;var r=Error(t);this.stack=r.stack}).prototype=Object.create(Error.prototype),jv.prototype.constructor=jv}function Tv(t,e){return new Promise(function(r,n){var o=new Sv(t,e);if(o.signal&&o.signal.aborted)return n(new jv(\"Aborted\",\"AbortError\"));var i=new XMLHttpRequest;function a(){i.abort()}i.onload=function(){var t,e,n={status:i.status,statusText:i.statusText,headers:(t=i.getAllResponseHeaders()||\"\",e=new dv,t.replace(/\\r?\\n[\\t ]+/g,\" \").split(\"\\r\").map(function(t){return 0===t.indexOf(\"\\n\")?t.substr(1,t.length):t}).forEach(function(t){var r=t.split(\":\"),n=r.shift().trim();if(n){var o=r.join(\":\").trim();e.append(n,o)}}),e)};n.url=\"responseURL\"in i?i.responseURL:n.headers.get(\"X-Request-URL\");var o=\"response\"in i?i.response:i.responseText;setTimeout(function(){r(new Ov(o,n))},0)},i.onerror=function(){setTimeout(function(){n(new TypeError(\"Network request failed\"))},0)},i.ontimeout=function(){setTimeout(function(){n(new TypeError(\"Network request failed\"))},0)},i.onabort=function(){setTimeout(function(){n(new jv(\"Aborted\",\"AbortError\"))},0)},i.open(o.method,function(t){try{return\"\"===t&&uv.location.href?uv.location.href:t}catch(e){return t}}(o.url),!0),\"include\"===o.credentials?i.withCredentials=!0:\"omit\"===o.credentials&&(i.withCredentials=!1),\"responseType\"in i&&(cv.blob?i.responseType=\"blob\":cv.arrayBuffer&&o.headers.get(\"Content-Type\")&&-1!==o.headers.get(\"Content-Type\").indexOf(\"application/octet-stream\")&&(i.responseType=\"arraybuffer\")),!e||\"object\"!=typeof e.headers||e.headers instanceof dv?o.headers.forEach(function(t,e){i.setRequestHeader(e,t)}):Object.getOwnPropertyNames(e.headers).forEach(function(t){i.setRequestHeader(t,hv(e.headers[t]))}),o.signal&&(o.signal.addEventListener(\"abort\",a),i.onreadystatechange=function(){4===i.readyState&&o.signal.removeEventListener(\"abort\",a)}),i.send(void 0===o._bodyInit?null:o._bodyInit)})}Tv.polyfill=!0,uv.fetch||(uv.fetch=Tv,uv.Headers=dv,uv.Request=Sv,uv.Response=Ov),function(t){var e=function(){try{return!!Symbol.iterator}catch(t){return!1}}(),r=function(t){var r={next:function(){var e=t.shift();return{done:void 0===e,value:e}}};return e&&(r[Symbol.iterator]=function(){return r}),r},n=function(t){return encodeURIComponent(t).replace(/%20/g,\"+\")},o=function(t){return decodeURIComponent(String(t).replace(/\\+/g,\" \"))};(function(){try{var e=t.URLSearchParams;return\"a=1\"===new e(\"?a=1\").toString()&&\"function\"==typeof e.prototype.set&&\"function\"==typeof e.prototype.entries}catch(t){return!1}})()||function(){var o=function(t){Object.defineProperty(this,\"_entries\",{writable:!0,value:{}});var e=typeof t;if(\"undefined\"===e);else if(\"string\"===e)\"\"!==t&&this._fromString(t);else if(t instanceof o){var r=this;t.forEach(function(t,e){r.append(e,t)})}else{if(null===t||\"object\"!==e)throw new TypeError(\"Unsupported input's type for URLSearchParams\");if(\"[object Array]\"===Object.prototype.toString.call(t))for(var n=0;ne[0]?1:0}),t._entries&&(t._entries={});for(var r=0;r1?o(n[1]):\"\")}})}(void 0!==t?t:\"undefined\"!=typeof window?window:\"undefined\"!=typeof self?self:t),function(t){var e,r,n;if(function(){try{var e=new t.URL(\"b\",\"http://a\");return e.pathname=\"c d\",\"http://a/c%20d\"===e.href&&e.searchParams}catch(t){return!1}}()||(e=t.URL,r=function(e,r){\"string\"!=typeof e&&(e=String(e)),r&&\"string\"!=typeof r&&(r=String(r));var n,o=document;if(r&&(void 0===t.location||r!==t.location.href)){r=r.toLowerCase(),(n=(o=document.implementation.createHTMLDocument(\"\")).createElement(\"base\")).href=r,o.head.appendChild(n);try{if(0!==n.href.indexOf(r))throw new Error(n.href)}catch(t){throw new Error(\"URL unable to set base \"+r+\" due to \"+t)}}var i=o.createElement(\"a\");i.href=e,n&&(o.body.appendChild(i),i.href=i.href);var a=o.createElement(\"input\");if(a.type=\"url\",a.value=e,\":\"===i.protocol||!/:/.test(i.href)||!a.checkValidity()&&!r)throw new TypeError(\"Invalid URL\");Object.defineProperty(this,\"_anchorElement\",{value:i});var u=new t.URLSearchParams(this.search),c=!0,s=!0,f=this;[\"append\",\"delete\",\"set\"].forEach(function(t){var e=u[t];u[t]=function(){e.apply(u,arguments),c&&(s=!1,f.search=u.toString(),s=!0)}}),Object.defineProperty(this,\"searchParams\",{value:u,enumerable:!0});var l=void 0;Object.defineProperty(this,\"_updateSearchParams\",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==l&&(l=this.search,s&&(c=!1,this.searchParams._fromString(this.search),c=!0))}})},n=r.prototype,[\"hash\",\"host\",\"hostname\",\"port\",\"protocol\"].forEach(function(t){!function(t){Object.defineProperty(n,t,{get:function(){return this._anchorElement[t]},set:function(e){this._anchorElement[t]=e},enumerable:!0})}(t)}),Object.defineProperty(n,\"search\",{get:function(){return this._anchorElement.search},set:function(t){this._anchorElement.search=t,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(n,{toString:{get:function(){var t=this;return function(){return t.href}}},href:{get:function(){return this._anchorElement.href.replace(/\\?$/,\"\")},set:function(t){this._anchorElement.href=t,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\\/?)/,\"/\")},set:function(t){this._anchorElement.pathname=t},enumerable:!0},origin:{get:function(){return this._anchorElement.protocol+\"//\"+this._anchorElement.hostname+(this._anchorElement.port!={\"http:\":80,\"https:\":443,\"ftp:\":21}[this._anchorElement.protocol]&&\"\"!==this._anchorElement.port?\":\"+this._anchorElement.port:\"\")},enumerable:!0},password:{get:function(){return\"\"},set:function(t){},enumerable:!0},username:{get:function(){return\"\"},set:function(t){},enumerable:!0}}),r.createObjectURL=function(t){return e.createObjectURL.apply(e,arguments)},r.revokeObjectURL=function(t){return e.revokeObjectURL.apply(e,arguments)},t.URL=r),void 0!==t.location&&!(\"origin\"in t.location)){var o=function(){return t.location.protocol+\"//\"+t.location.hostname+(t.location.port?\":\"+t.location.port:\"\")};try{Object.defineProperty(t.location,\"origin\",{get:o,enumerable:!0})}catch(e){setInterval(function(){t.location.origin=o()},100)}}}(void 0!==t?t:\"undefined\"!=typeof window?window:\"undefined\"!=typeof self?self:t);var Av=Object.getOwnPropertySymbols,Rv=Object.prototype.hasOwnProperty,Pv=Object.prototype.propertyIsEnumerable,_v=function(){try{if(!Object.assign)return!1;var t=new String(\"abc\");if(t[5]=\"de\",\"5\"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},r=0;r<10;r++)e[\"_\"+String.fromCharCode(r)]=r;if(\"0123456789\"!==Object.getOwnPropertyNames(e).map(function(t){return e[t]}).join(\"\"))return!1;var n={};return\"abcdefghijklmnopqrst\".split(\"\").forEach(function(t){n[t]=t}),\"abcdefghijklmnopqrst\"===Object.keys(Object.assign({},n)).join(\"\")}catch(t){return!1}}()?Object.assign:function(t,e){for(var r,n,o=function(t){if(null==t)throw new TypeError(\"Object.assign cannot be called with null or undefined\");return Object(t)}(t),i=1;iViolentmonkey

    Features in Userscript Generator

    Table of Contents

    Userscript Generator is a Yeoman generator to quickly initiate a new project for a userscript.

    +

    See Using modern syntax for the usage.

    +

    In this post we will dive into each feature and see why and how we use it, and whether we have different choices.

    +

    CSS modules

    +

    Both global CSS (e.g. style.css) and CSS modules (e.g. style.module.css) are supported.

    +

    A userscript usually works in different websites which may not be maintained by the script developer. So if the script provides independent UI in the website, it must be careful not to break the website and not to be broken by the website. We have two choices, shadow DOM and CSS modules.

    +
      +
    • Option 1: Shadow DOM +
        +
      • Pros: Neat class names, no repeated prefix.
      • +
      • Cons: It doesn't always work because the CSS can only be injected inside the shadow DOM root, which may be blocked by the CSP.
      • +
      +
    • +
    • Option 2: CSS modules +
        +
      • Pros: It can bypass the CSP issue because the CSS can be injected with the GM_addStyle API.
      • +
      • Cons: More code required, less readable class names in the DOM.
      • +
      +
    • +
    +

    So if you expect your script to work in many different websites including those protected by CSP, CSS modules might be a better choice. Otherwise use global CSS with shadow DOM for simplicity.

    +

    UnoCSS

    +

    UnoCSS is similar to TailwindCSS but arguably more flexible and reliable.

    +

    At the time of writing, TailwindCSS does not work well for userscripts, because it either injects reset CSS breaking the style of the host, or misses default values leading to invalid CSS output. This is a bug and has occurred before.

    +

    By using UnoCSS or its alternatives, the effort of maintaining CSS code is significantly reduced.

    +

    We just write class names based on what we need, and the CSS code will be generated automatically. If later we don't need this class name any more, the related CSS code will also be pruned.

    +

    SolidJS

    +

    SolidJS is a light-weight UI library. It has some similarities with React, but much lighter and easier to use for a small project like a userscript.

    +

    However, SolidJS doesn't have an official UMD or IIFE package. In other words, there is no easy way for us to import SolidJS as a single file resource using @require.

    +

    We have several options here:

    +
      +
    • +

      Option 1: import it and bundle it in the userscript.

      +
        +
      • Pros: Simple to go.
      • +
      • Cons: Bloated userscript size and worse readability.
      • +
      +
    • +
    • +

      Option 2: import it using dynamic import at runtime.

      +
        +
      • Pros: Better readability, smaller file size.
      • +
      • Cons: An obvious delay before the UI appears.
      • +
      • Suggestion: If the delay is acceptable, this might be a good choice.
      • +
      +
    • +
    • +

      Option 3: compile SolidJS as a UMD package and use it in different scripts.

      +

      This is exactly what I have done in the generator. Check the compiled file at jsdelivr and the source code at @violentmonkey/dom.

      +
        +
      • Pros: Good readability, smaller file size, fast loading, reusable common assets between different scripts.
      • +
      • Cons: Need to maintain an extra file, and it might not always be up-to-date.
      • +
      +
    • +
    +

    Absolutely, every decision involves a trade-off, and ultimately, you have to make your own choices.

    +

    Summary

    +

    Thanks to the powerful tools, the development of a userscript is getting much smoother.

    +

    We can use the generator above to quickly create a new userscript with modern tech stack.


    Published at August 24, 2023
    Open Chat
    + + \ No newline at end of file diff --git a/posts/how-to-edit-scripts-with-your-favorite-editor/index.html b/posts/how-to-edit-scripts-with-your-favorite-editor/index.html new file mode 100644 index 00000000..8a775aa2 --- /dev/null +++ b/posts/how-to-edit-scripts-with-your-favorite-editor/index.html @@ -0,0 +1,234 @@ +Violentmonkey

    How to edit scripts with your favorite editor?

    Table of Contents

    For anyone who uses Violentmonkey, it is easy to find a way to edit a script like this:

    + + + editor 1 + +

    However, it is really hard to make everyone love it. A probably likes a theme of monokai, while B prefers eclipse. C might use 2 spaces for indentation while D prefers tabs.

    +

    It is impossible to satisfy every single user. Lots of configurations may be added for this, but are they really worth it? A user would have to face lots of choices before he could use it just as a script manager, or have to look for a simple option among lots of unrelated editor options. What is worse, the browser may inhibit some shortcuts or operations that a local editor can have. In other words, an editor inside Violentmonkey will never be as good as your favorite one.

    +

    Here comes the question: How to edit my script with my favorite editor?

    +

    Save to a file

    +

    First, copy the script to your favorite editor and save it to a file.

    + + + editor 2 + +

    VIM is my favorite editor, and the script is saved at D:/Source/vm-script.user.js. Note that the script file must have a name ending with .user.js, otherwise won't be recognized by Violentmonkey.

    +

    Install a local script

    +

    First make sure the local script is named with a suffix of .user.js.

    +

    There are two ways to install a local script:

    +
      +
    • +

      Easy way: drag the file into the browser.

      +

      It will be recognized by Violentmonkey and loaded in the confirmation page.

      +

      Make sure "Allow access to file URLs" is checked in your Chrome extension settings (chrome://extensions).

      + + + editor 6 + +

      Note that due to a known issue, the easy way won't work for Firefox users.

      +
    • +
    • +

      Hard way: start a local HTTP server, then open the local script with a URL like http://localhost:8080/my-script.user.js.

      +

      One of the best way is to use node/npm's indexzero/http-server. If you have it installed, just type http-server -c5 at the directory of your script to start a server.

      +

      Make sure the hostname is localhost and the script name ends with .user.js.

      +

      Note that due to a known issue, the hard way needs to handle caching. In http-server -c5 option -c5 sets cache time for max-age header to 5 seconds, thus forcing a browser to query the server URL every 5 seconds. The caching can be disabled with -c-1 option.

      +
    • +
    + + + editor 3 + +

    Make sure the track local file option is checked and then confirm installation.

    + + + editor 4 + +

    Edit and sync

    +

    After installation, the confirmation page will keep watching the file before the page is closed. Once the file is changed, the new version will be installed automatically. As a result, you edit the script in your favorite editor, and the changes are synced to Violentmonkey immediately.

    + + + editor 5 + +

    Known issues

    +
      +
    • In Firefox Violentmonkey is not allowed to access local files, so we have to start a local HTTP server for tracking. See this on bugzilla.
    • +
    • The older the file is, the more seldom a browser will query it. See this Violentmonkey's issue.
    • +

    Published at March 14, 2017
    Open Chat
    + + \ No newline at end of file diff --git a/posts/index.html b/posts/index.html new file mode 100644 index 00000000..e0b4a963 --- /dev/null +++ b/posts/index.html @@ -0,0 +1,67 @@ +Violentmonkey + + \ No newline at end of file diff --git a/posts/inject-into-context/index.html b/posts/inject-into-context/index.html new file mode 100644 index 00000000..1bf141f1 --- /dev/null +++ b/posts/inject-into-context/index.html @@ -0,0 +1,129 @@ +Violentmonkey

    Inject scripts into different contexts

    Table of Contents

    Since Violentmonkey v2.10.0, a new type of metadata named @inject-into is introduced. With its help, scripts can be injected into CSP restricted pages in Firefox now!

    +

    Contexts

    +

    As we know, there are two types of context for a script to execute in:

    +
      +
    • +

      context of a web page

      +

      The context in which all scripts of a web page execute. We will call it "page context" later.

      +
    • +
    • +

      context of content scripts

      +

      The context in which content scripts execute. We will call it "content context" later.

      +
    • +
    +

    Injection Modes

    +

    In earlier versions of Violentmonkey, all scripts will be injected into the page context.

    +

    This works well at most times in Chrome. However, Firefox works differently. All scripts will be blocked in websites with CSP rules blocking inline scripts, like GitHub. See issue #173, #408.

    +

    By introducing @inject-into, userscripts can be injected in Firefox now. In pages with CSP restrictions, we can inject userscripts into the content context.

    +

    Mode: page

    +

    This is the default mode, as the behavior in Violentmonkey v2.9.x.

    +

    unsafeWindow refers to window of the web page.

    +

    Example usage:

    +
    // ==UserScript==
    +// ...
    +// @inject-into page
    +// ==/UserScript==
    +
    +// `@inject-into` should be set to `page` since we need to access `window` of page context.
    +
    +// Accessing objects attached to `window` of page
    +alert('Hi, ' + unsafeWindow.context.user);
    +
    +

    Mode: content

    +
    // ==UserScript==
    +// @inject-into content
    +// ==/UserScript==
    +
    +

    In this mode, scripts will be injected into the content context.

    +

    The content context is an isolated world, scripts in this context have no access to JavaScript objects from page context. But they can communicate with DOM APIs such as addEventListener.

    +

    unsafeWindow refers to the global object of content context.

    +

    Scripts requiring access to JavaScript objects in the web page will not work in this mode. For example, unsafeWindow.jQuery becomes inaccessible even if jQuery is introduced in the page.

    +

    Mode: auto

    +
    // ==UserScript==
    +// @inject-into auto
    +// ==/UserScript==
    +
    +

    In this mode, scripts will be injected into the page context if possible. If blocked by CSP, they will be injected into the content context. It is the script author's job to check the environments.

    +

    Example usage:

    +
    // ==UserScript==
    +// ...
    +// @inject-into auto
    +// ==/UserScript==
    +
    +// `@inject-into` can be set to `auto` if we don't need to access any JavaScript object from page context.
    +
    +// Accessing JavaScript objects shared in both contexts
    +alert('The current page link is ' + window.location.href);
    +
    +// Accessing DOM
    +document.body.style = 'background: orange';
    +
    +

    Violentmonkey Settings

    +

    By default, a script will try to execute in the page context. In Firefox, this may fail in CSP restricted pages.

    +

    You can change the default behavior in the settings tab of Violentmonkey. By changing the default injection mode to auto, scripts that do not depend on traditional unsafeWindow will work again in Firefox.


    Published at November 23, 2018
    Open Chat
    + + \ No newline at end of file diff --git a/posts/inject-scripts-with-blob-urls/index.html b/posts/inject-scripts-with-blob-urls/index.html new file mode 100644 index 00000000..f943ad67 --- /dev/null +++ b/posts/inject-scripts-with-blob-urls/index.html @@ -0,0 +1,128 @@ +Violentmonkey

    Inject scripts with Blob URLs

    Table of Contents

    Since Violentmonkey v2.8.15, scripts are injected with Blob URLs instead of textContent in v2.8.13-. Thanks to evilpie, see #246.

    +

    Before

    +

    In earlier versions, scripts are injected like this:

    +
    const s = document.createElement('script');
    +s.textContent = script;
    +document.body.appendChild(s);
    +document.body.removeChild(s);
    +
    +

    This way works well on Chrome but does not work on Firefox 57- when page has a limit on inline script by CSP. See bugzilla.

    +

    Now

    +

    Since Firefox 58, we have a workaround by injecting scripts like this:

    +
    const b = new Blob([script], { type: 'text/javascript' });
    +const u = URL.createObjectURL(b);
    +const s = document.createElement('script');
    +s.src = u;
    +document.body.appendChild(s);
    +document.body.removeChild(s);
    +URL.revokeObjectURL(u);
    +
    +

    Using Blob URLs instead of textContent, scripts can be injected to pages on Firefox 58+ too.

    +

    Problem

    +

    Then we encountered a problem (v2.8.14, #249): sometimes the scripts are not injected at all. After debugging for a while, I figured out what was happening.

    +

    First let's take a look at the injection procedure:

    +
      +
    1. inject an initializer to context of page script
    2. +
    3. load userscripts from content script
    4. +
    5. post userscripts to the initializer through custom events
    6. +
    7. execute userscripts
    8. +
    +

    The problem is, when the userscripts are loaded and posted to the initializer, the initializer may be not ready yet. As a result, the posted userscripts are discarded.

    +

    But why won't this happen before?

    +

    Because the textContent way is synchronous while the src way is asynchronous.

    +

    Using the textContent way, the initializer is initialized synchronously when injected. So the initializer is always ready when the userscripts are loaded.

    +

    But when using a Blob URL, the injection becomes asynchronous. Because it has to fetch the real content first. So the initializer may be not ready yet when the userscripts are laoded. Consequently, no userscript is injected.

    +

    Here is a demonstration:

    +
    {
    +  const s = document.createElement('script');
    +  s.textContent = 'console.log(1)';
    +  document.body.appendChild(s);
    +  document.body.removeChild(s);
    +}
    +
    +{
    +  const s = document.createElement('script');
    +  const b = new Blob(['console.log(2)'], { type: 'text/javascript' });
    +  const u = URL.createObjectURL(b);
    +  s.src = u;
    +  document.body.appendChild(s);
    +  document.body.removeChild(s);
    +  URL.revokeObjectURL(u);
    +}
    +
    +console.log(3);
    +
    +

    By running the code above in a browser (e.g. Chrome), we got output as below:

    +
    1
    +3
    +2
    +
    +

    Conclusion

    +

    So we just need to ensure that the initializer is ready when posting userscripts to it.

    +

    Finally, it works on Chrome any and Firefox v58+, even on pages with CSP limitations.


    Published at October 28, 2017
    Open Chat
    + + \ No newline at end of file diff --git a/posts/smart-rules-for-blacklist/index.html b/posts/smart-rules-for-blacklist/index.html new file mode 100644 index 00000000..76e3cf87 --- /dev/null +++ b/posts/smart-rules-for-blacklist/index.html @@ -0,0 +1,137 @@ +Violentmonkey

    Smart rules for blacklist

    Table of Contents

    Userscripts are injected into web pages according to predefined rules. However, the rules do not always satisfy users for different reasons. In such cases, we need blacklist to exclude some web pages for all scripts.

    +

    Blacklist use cases

    +
      +
    • +

      hostnames

      +

      In most cases, we may want to add simply hostnames to exclude.

      +
    • +
    • +

      @exclude-match rules

      +

      Since match patterns are safer to match URLs, we prefer to use @exclude-match rules to exclude URLs more flexibly.

      +
    • +
    • +

      @exclude rules

      +

      They are commonly supported by userscripts, so we should just keep them work.

      +
    • +
    +

    Blacklist patterns

    +

    Taken all use cases into account, the blacklist may have following patterns:

    +
      +
    • +

      hostnames

      +

      A string without slashes, e.g. example.com, *.example.com.

      +
    • +
    • +

      match patterns

      +

      A string with scheme, hostname and pathname patterns, e.g. *://*/*, https://www.google.com/.

      +
    • +
    • +

      @exclude rules

      +

      A string prefixed with @exclude , e.g. @exclude https://*.

      +
    • +
    • +

      comments

      +

      A string starting with #, will be ignored.

      +
    • +
    +

    Here is a full example for blacklist:

    +
    # hostnames
    +www.google.com
    +
    +# @exclude-match rules
    +*://twitter.com/*
    +
    +# @exclude rules
    +@exclude https://example.com/*
    +
    +

    Whitelist patterns

    +

    For some people who want to disable Violentmonkey for most websites, a whitelist is needed.

    +

    To work as a whitelist, we can use following patterns:

    +
      +
    • +

      @match rules

      +

      A string prefixed with @match , and followed by a match pattern, e.g. @match https://www.google.com/*.

      +
    • +
    • +

      @include rules

      +

      A string prefixed with @include , e.g. @include https://*.

      +
    • +
    +

    If any of the rules above are matched, the URL bypasses the blacklist. +To make it a whitelist, we should block all other URLs by a rule at the end: *.

    +

    Here is a full example for whitelist:

    +
    # match rules
    +@match https://www.google.com/*
    +
    +# include rules
    +@include https://example.com/*
    +
    +# block everything else
    +*
    +

    Published at April 15, 2017
    Open Chat
    + + \ No newline at end of file diff --git a/posts/violentmonkey-workflows/index.html b/posts/violentmonkey-workflows/index.html new file mode 100644 index 00000000..765e60c3 --- /dev/null +++ b/posts/violentmonkey-workflows/index.html @@ -0,0 +1,97 @@ +Violentmonkey

    Violentmonkey Workflows

    Table of Contents

    Some facts:

    + +

    This post is trying to clarify the development workflows and how the extension is reviewed before it can be published at CWS (Chrome Web Store), AMO (addons.mozilla.org), Microsoft Edge Addons (MEA), etc.

    +

    Workflows

    +

    Basically we develop Violentmonkey with modern JavaScript syntax (ESNext) and build it with Babel, Webpack and their friends.

    +

    The source code is all kept in src. All the dependencies are imported via standard ES modules from NPM installed packages. The dependencies are installed via yarn so that we can leverage yarn.lock to make sure every developer gets exactly the same dependencies installed.

    +

    Development

    +

    By running yarn dev, we can get the development package in dist, which is unminified. The compiler keeps writing updates to dist once the source code changes.

    +

    The files in development mode contains a lot of code that should not run for users, such as development logs, helpful warnings for developers, etc. That is why the bundles generated during development are much larger (perhaps 10x) than those in the final release and runs much slower.

    +

    Release

    +

    When we are ready for a new release, we run yarn build to compile the source code in production mode, dropping all unnecessary spaces, debugging code, dead code, and optimizing statements to make them shorter.

    +

    All the tools involved in the toolchain are either included in the source code or installed via NPM, in other words they are totally public, and you can always check the code and build your own version.

    +

    Thanks to GitHub actions, the build process is triggered automatically once a tag is created in the repository, completely transparent to users. The action definitions can be found at .github/workflows/release.yml.

    +

    Publication

    +

    After the release package is created by GitHub actions, we download the release package and upload it to different stores.

    +

    There is a review step in all popular stores. In CWS we have to clarify why each permission is required in manifest.json. In AMO and MEA we need to provide the source code and tell the reviewers how our project is built, then the reviewers build the package from scratch and compare it to the version we submitted to make sure they are the same. So if you are installing Violentmonkey from the official links, you don't need to worry about trackers or malicious code that is not shown in the source code because the reviewers have confirmed they are clean.

    +

    One exception is the beta release for Firefox, which is self-signed and self-hosted, aka. unlisted version -- AMO has dropped support for beta versions and recommended the unlisted version for testing purpose since 2018. We serve our beta versions on top of this feature, and the whole process is automated via GitHub actions as mentioned above. The generated package is immediately uploaded to AMO and signed, and then uploaded to GitHub assets.

    +

    Why is the source code compiled?

    +

    Since we are in 2020s, this question should not be asked by a web developer. If you have employed such a guy, trust me, he/she should be fired.

    +

    We are using many lovely features in our project, some from ESNext, and some are popular in development but not supported natively by any browser. So we compile those parts to legacy JavaScript code to make the extension work for more browsers.

    +

    For example, we build UI in Violentmonkey with Vue.js, a popular framework good at building complexed UIs. It depends on quite a few custom annotations which need to be transformed to vanilla JavaScript and CSS so that the browser can understand.

    +

    There are also some constants injected at compilation time so that we don't need to hard-code them.

    +

    Why is the generated code minified?

    +

    Generally, the larger the code is, the longer it takes for the parser to parse. So it is very common for web apps to minify the code before publication.

    +

    Another reason which is even more important is to strip the debugging related code because it actually runs in browser and slowers the runtime. It may be important for developers to find bugs but useless for normal users.

    +

    This is mainly what code minification does, but not code obfuscation. Code obfuscation usually encodes the minified code to make it harder to read. As a result, it becomes slower because decoding is required before the code can execute. We don't need this and we have never included such tools in our project.

    +

    How to build the code by yourself?

    +

    If you don't believe us and want to build the code by yourself, you can clone the Violentmonkey project and follow the build steps in README.


    Published at February 19, 2021
    Open Chat
    + + \ No newline at end of file diff --git a/privacy/index.html b/privacy/index.html new file mode 100644 index 00000000..4079b8a9 --- /dev/null +++ b/privacy/index.html @@ -0,0 +1,82 @@ +Violentmonkey

    Privacy Policy

    Table of Contents

    Effective date: November 7, 2019

    +

    Violentmonkey ("we") does not collect any of your personal data, period.

    +

    As discussed in this issue, we will not collect any of your usage data, even anonymously.

    +

    Service Providers

    +

    We use popular cloud storage services (Dropbox, Google Drive, OneDrive) to synchronize extension data with your authorization. Your script code and settings may be synced to the cloud service directly, without transit to other servers.

    +

    We do not use Google Analytics or similar technologies to collect your browser information.

    +

    We do not disclose your personal data and extension data to any other third party.

    + +

    Our service may contain links to other sites that are not operated by us. If you click on a third party link, you will be directed to that third party's site. We strongly advise you to review the Privacy Policy of every site you visit.

    +

    Our service may run userscripts that contain code out of our control. If a userscript is installed, it can run in sites matching the rules in its metadata with high privilege APIs, for instance, sending requests with your credentials. We strongly advise you to only install userscripts that you believe and know, from trusted hosts.

    +

    We have no control over, and assume no responsibility for the content, privacy policies or practices of any third party sites or services.

    +

    Changes To This Privacy Policy

    +

    Changes to this Privacy Policy are effective when they are posted on this page.

    +

    History of changes will be kept in this repository.

    +

    Contact Us

    +

    If you have any questions about this Privacy Policy, please contact us.


    Open Chat
    + + \ No newline at end of file diff --git a/sitemap-0.xml b/sitemap-0.xml new file mode 100644 index 00000000..781ddafd --- /dev/null +++ b/sitemap-0.xml @@ -0,0 +1 @@ +https://violentmonkey.github.io/components/install-beta/daily0.7https://violentmonkey.github.io/components/install-stable/daily0.7https://violentmonkey.github.io/daily0.7https://violentmonkey.github.io/api/gm/daily0.7https://violentmonkey.github.io/api/matching/daily0.7https://violentmonkey.github.io/api/metadata-block/daily0.7https://violentmonkey.github.io/faq/daily0.7https://violentmonkey.github.io/get-it/daily0.7https://violentmonkey.github.io/localization/daily0.7https://violentmonkey.github.io/posts/features-in-userscript-generator/daily0.7https://violentmonkey.github.io/posts/inject-into-context/daily0.7https://violentmonkey.github.io/posts/inject-scripts-with-blob-urls/daily0.7https://violentmonkey.github.io/posts/smart-rules-for-blacklist/daily0.7https://violentmonkey.github.io/posts/violentmonkey-workflows/daily0.7https://violentmonkey.github.io/privacy/daily0.7https://violentmonkey.github.io/guide/creating-a-userscript/daily0.7https://violentmonkey.github.io/guide/keyboard-shortcuts/daily0.7https://violentmonkey.github.io/guide/observing-dom/daily0.7https://violentmonkey.github.io/guide/using-modern-syntax/daily0.7https://violentmonkey.github.io/posts/how-to-edit-scripts-with-your-favorite-editor/daily0.7https://violentmonkey.github.io/posts/daily0.7 \ No newline at end of file diff --git a/sitemap-index.xml b/sitemap-index.xml new file mode 100644 index 00000000..ae0f2f89 --- /dev/null +++ b/sitemap-index.xml @@ -0,0 +1 @@ +https://violentmonkey.github.io/sitemap-0.xml \ No newline at end of file diff --git a/static/17a5d02e3af9acd5c40e180192fa9e07/222b7/editor-2.png b/static/17a5d02e3af9acd5c40e180192fa9e07/222b7/editor-2.png new file mode 100644 index 0000000000000000000000000000000000000000..66b6428fff7bdb85a7aa6a48468ab810ee6a8f26 GIT binary patch literal 2185 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 literal 0 HcmV?d00001 diff --git a/static/17a5d02e3af9acd5c40e180192fa9e07/ff46a/editor-2.png b/static/17a5d02e3af9acd5c40e180192fa9e07/ff46a/editor-2.png new file mode 100644 index 0000000000000000000000000000000000000000..b4e6ad896aa0f71c53c31fa34b6ecbb4ab804eb0 GIT binary patch literal 6330 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%0A`7`^Af|R;c5= z*F9OGP0ZK$GBV1V@phxaBBv95+T0|H2A?Va|pq?)~$>|NQfh#BtdO z#i~Tie`*|-m!lZt-en^cz2bWp4&)0^3`e}O%enY+6o2dQr1J8cD5f}y97T>IN0Aqf z;+vt!aoiY1u1359idC*gyatLAIN0Fn*QRIcI5pRm3 z#KUf`MsPKPdl!x(S0gwVIf@)bUO0*zMUEmzkr%E;yeoh3!Ckf watr6;CR_}sz4D1P6Fa=Tpd>nigP)``O#!VWIMby8NZP&851{BYjT600009a7bBm000XU000XU z0RWnu7ytkPj7da6RCwC$+S`(XFboD@k~V3xzW@7f4_aY4RHSjonfzCdLcY>gu*d}9 z^a21AIEiWzmw-T%S|}J`fB^;=V1NMzd@(@&L{Nm!0t_b;c8wjtofW`&)&&wF$^Zar z16#sa07M&bqztSNVKlHhgwX)7HXsJ50N7awUk2ppioymMa0Xb;PaY1?=DP+MV1NPt z05}&?@=b3Az++@C+Y+Y7Q|+`YE~yLT z`T^s5+c#GFERW(X>5bUi^;KY_d^Ip$0NPkm#Le=BIJ%K=0My}>(#^bIzIzZmgB&Ff zTxnmge%+>g_1eVh0E-TxDIS+k;i)#LOf2dG^9HBJ_3LAt&49lhwgz}UT|B=~AD3O| z19iI0K8%L3Oki^m3t_a4V39fFjRX#kE*I_K3F zYJiX~(59arfCd=wg@9Md6JVu$=r0x*Za+%7h5T%b=Hof#=^W+!0#6S#4`ghHS^xk5 M07*qoM6N<$f|X?8rT_o{ literal 0 HcmV?d00001 diff --git a/static/421f4c24f117d74eacd0208b1870bfb9/02cd5/editor-5.png b/static/421f4c24f117d74eacd0208b1870bfb9/02cd5/editor-5.png new file mode 100644 index 0000000000000000000000000000000000000000..67c37ffd12a89dceb67e891548e217704b669f4b GIT binary patch literal 11073 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 literal 0 HcmV?d00001 diff --git a/static/421f4c24f117d74eacd0208b1870bfb9/ff46a/editor-5.png b/static/421f4c24f117d74eacd0208b1870bfb9/ff46a/editor-5.png new file mode 100644 index 0000000000000000000000000000000000000000..b32019f87bef293d1f8371350b43b4612af060e4 GIT binary patch literal 5858 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 literal 0 HcmV?d00001 diff --git a/static/49c98c639750ed124996d21d44c0a89e/9d635/github.png b/static/49c98c639750ed124996d21d44c0a89e/9d635/github.png new file mode 100644 index 0000000000000000000000000000000000000000..76a4fc9413138bc32467f3b53911a6acdb7fc577 GIT binary patch literal 845 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 JRJZW_{{WkxX5Ih* literal 0 HcmV?d00001 diff --git a/static/52e07bc04265f6628af77e2ed266053e/a6d36/editor-1.png b/static/52e07bc04265f6628af77e2ed266053e/a6d36/editor-1.png new file mode 100644 index 0000000000000000000000000000000000000000..c31e64bc3a3bc8fd169a7afc4e6c87b6090fba30 GIT binary patch literal 12327 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 literal 0 HcmV?d00001 diff --git a/static/52e07bc04265f6628af77e2ed266053e/ff46a/editor-1.png b/static/52e07bc04265f6628af77e2ed266053e/ff46a/editor-1.png new file mode 100644 index 0000000000000000000000000000000000000000..bdee71b6bb33acb1fe2badde7b0524789f666d8f GIT binary patch literal 3477 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 DB6r9E literal 0 HcmV?d00001 diff --git a/static/5353fff61b7784074245599dfc3ebf63/1fbe8/match.png b/static/5353fff61b7784074245599dfc3ebf63/1fbe8/match.png new file mode 100644 index 0000000000000000000000000000000000000000..d743bc7aa182da5283ff2698fb2b5acd1eba41cf GIT binary patch literal 8998 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 literal 0 HcmV?d00001 diff --git a/static/5353fff61b7784074245599dfc3ebf63/222b7/match.png b/static/5353fff61b7784074245599dfc3ebf63/222b7/match.png new file mode 100644 index 0000000000000000000000000000000000000000..c15ab738f8d36496fe8606e4f4936bf6bbc64c0b GIT binary patch literal 1606 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 literal 0 HcmV?d00001 diff --git a/static/5353fff61b7784074245599dfc3ebf63/ff46a/match.png b/static/5353fff61b7784074245599dfc3ebf63/ff46a/match.png new file mode 100644 index 0000000000000000000000000000000000000000..15fb719893bf10513f930531bb35220d92091a99 GIT binary patch literal 4697 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 literal 0 HcmV?d00001 diff --git a/static/661dce4756c0ba64899cbb919da56f8b/222b7/editor-3.png b/static/661dce4756c0ba64899cbb919da56f8b/222b7/editor-3.png new file mode 100644 index 0000000000000000000000000000000000000000..a1c5a1916ca6bd584d0af41c3a95062441bff6f9 GIT binary patch literal 1570 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 literal 0 HcmV?d00001 diff --git a/static/661dce4756c0ba64899cbb919da56f8b/ff46a/editor-3.png b/static/661dce4756c0ba64899cbb919da56f8b/ff46a/editor-3.png new file mode 100644 index 0000000000000000000000000000000000000000..a92675c5bd8f04cfcde7b3a480be21e7c43a03e6 GIT binary patch literal 5367 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 literal 0 HcmV?d00001 diff --git a/static/b302ac873f1a2ebe23de71f9e88e0ff8/9d635/firefox.png b/static/b302ac873f1a2ebe23de71f9e88e0ff8/9d635/firefox.png new file mode 100644 index 0000000000000000000000000000000000000000..e45c64c841945fb37d736a49ee41ffe9972665d1 GIT binary patch literal 3070 zcmV+~|HCek zJ?VKIz^N|h`e0N4z8wFM9gHv9^&(LJtQS@>w*Q|O<)>A?P`T`$EXZ+|*MD++J(#p= zUa&)T$V^rZc^E| zp1OP0l*fYnqx!VlX4>7jyO-L)Y}j|2LiV>1xrAdH(L(CzAb7XR5&~?cx=YT4;}HWO!0*>R znw>?V1h6bG8-zR&n$wII!-{vgj9beg$SgjKCAdF<63? z&cwsDH5Q*@wQrHfP-o311b4t9cK2{mXW~C4viYg%59L7^^Ou_L!R#}J$VGQf}m@dGavn(tQ zEe=JaK(G-F->JtlXKbX0Q&X}3(?h8+KHh$OeEbyvSfxcMjK_j_{5t~1mzm$Et`tJU zBPYjWvLtYPH0X)O&yKTSw-y&oM3@jf(`wAN4-=OQaxP@x5R0~><;`8ic%1Z2;KnBPiZ`d0ic60nKzRP#~$v)?SN3BV+% zTjWvu{QUeJ8)NyMJmzPQ>E;I4iv-kGB2GQPl@G5Qw2d53M;S0ysT?T8kB*K`=eYzi zM-A}h4y%AdJRtzutaO$g_eXUh##>cQp>TBCo_{lMDirc_`FuW`&t^BzUhr290vL%R z0K!`YZ1?;6bYY54n*egB`)@?en-pjO0jSL{%c2rWfN@3X(9sRIr@LH;#n!lm@0l4a zWypMLU}t|HfUgAsjD#NxJbiaGMUV4jd-I7sQvx@&CSi+ zGLI^^E@}~WTr{qLu5Pm+n?Qi_Gp||Di2S_B&jN75z$*#FamUeaWuVwC1t2EWW&+^z zQicUVm{&>w*ue?s7jml%;Kg-_j$E98>Sxbb(3UASJbbbQ_3quf*RRWneBM|g0!9i2 z0H_jl?dB6f+tk`4guZ^W5P}AvCf`Xy8Z&QZnAleUZij`Y8%W~=iUQVK`Ic!-b#``E5MG}2lAse<{P{Bw zzrFnh()ae@aSMPX%$kXHIuqhqtAyP%s*fP zj|2eX+i9C0ThNyYC(%C@`6PtHNmcLQ7sM|uasHRRJ@GKKF$duF}XzfB>Y^VaC+LpLF2PEHvmAZ{OV|RrQAZ$o9LgGi)8KsPT!L3 z-~yf&sb=?h)MqmSv+-j@w0MbY;kRX~6>jcEaXZ86FfqO9W zXGtI+Ne!T2dPr;YyIfuFicR$O`F?ymRN05z0TMqiCO%-jU!jL~LP$tb{zixC84bql zN-4oi@P@khba-f9Bg{X)4`;C-^5652nK1G6RL~RzKd_Yheq{&I{)G8 zhY9&6c#TX(a&~uj7xI7Co|CZ!uSw7d9`}!n^KYN9zMWtEfc=H>c;6@!HXwhuqycWh z+tqa?fuW;xJgE4Z>%&D-1Q;v3SS1Z$3x1b3r3s2qMqh<|6f|O&tL&Xr1Ga!dDN$nR z3PHS=gt1#o`G1tZ@M=^76YffcL`abi3ryVS{HGOOJvyz1VD6&akcf1^ki`Ak+FIm=8jQ1(Mf1m)Gkpnwrp!GDKOUByfIh?Vp#to3%A+LP;CK zP>9aJx36il2Bn^2Dun=4!`1KK8?3aK%et0j%Q+}iEnm>wb zBY}zkl^YW2!gR0t`2MDA=JTix0t`fSr3mZpRq+T|8>)Vx#4`|0^F~ z&6)|9iW7{MF5(*-s(!f~4T>-$=5QnapZ!3Y2xU|#8tp%hC&Jley~N;fzqQHvFMk|v zYajy|zgQI+4(ScHsv9Vqv#qJo>etHJ*wp5{k#xCOq=-ew?CUPf-=Hc2gbeOO^Z)<= M07*qoM6N<$f~Dxnwg3PC literal 0 HcmV?d00001 diff --git a/static/bf23974b6eeaef641a71bf08d1f2dd1c/222b7/editor-6.png b/static/bf23974b6eeaef641a71bf08d1f2dd1c/222b7/editor-6.png new file mode 100644 index 0000000000000000000000000000000000000000..af01a1dabbc0ff53fb72a90670dc0eb533881076 GIT binary patch literal 1886 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

    7Ef1 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 VFGzjaQvd(}002ovPDHLkV1gz#f@J^z literal 0 HcmV?d00001 diff --git a/static/bf23974b6eeaef641a71bf08d1f2dd1c/ff46a/editor-6.png b/static/bf23974b6eeaef641a71bf08d1f2dd1c/ff46a/editor-6.png new file mode 100644 index 0000000000000000000000000000000000000000..a025b878bb7c8f71546aef4445e397840e0bf282 GIT binary patch literal 6059 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

    &o8!^^qdh3#Bk zCMpu^pg7S^Ny&hmMXj^2u_y^wlN@=8EwUhNIta~8av~_0A;lP?QUWDA$!rqQJChP* zGJHrE^Tr=Gepzhkns}YEKq~{*#IUoI(vh?-KRV`ROtQI7Zc=JyoemPpu|qbO%W{`P zUoQI$T?B(&$nhBbxb?ALZi01(lYI`{CXoiFhuljb_hxg#aZn`Nj+rQOo0k9Bya3_L z;<@P!L`|(^9=vCEs~PSb#V|5|;&#M^WWM0ahGICG|IRu8o1+of$q~OH&KGVKzZ&s0 zrgIt@`?JcE{xoGdUW#lD-`TM^`sLZfqopXo*}p&hb}a70uV37x;aDl6Ab$Aeh}>^q z#CWU}Dg6HNx8Hv~7Wd)fhc7Ahky6Ck{KGH513ebSh(3P&k}!V%yvso+tObF7_yx<2 z8PKg0{xL_v{_QXn|C=|t)9ijzycdc`Q%N6&B9W!k=`WY~O0T!1zLlc5yDI60;x;3B zKO^CL1{8Mkr-bjowAZ6er*qzJ#dRQx0=Qm&fWC22|amN$7T5f_-Q&3iAS_LlfW!>C_xM2Z8SxA^d8PSd1mz{eWxcF*iWR;K0K=45L2xa* zYMN|&DiwCOhdUfaIdzIFZ@%=2#tFcn(3-2DD}3@aU4SXHBmjkfomF%J!!RzvbCD|S z@pQh%RMA1ttBoh5f?jctq9V(ZKc0KruQ}~u9bcCwPaU?U+e=26w#=pm6_z5~+6}l5 zGvw*xd9iMg^dhmlPmp&oLqSn^>1PH|trGPM)p70Y&VlsyznLO|YTR|;q0oxO$26f&lD}p z#G8#n*V<&%>UPVVq7lVfpqMo~cA`Y3;Nq!DH7%}z8EX}2Xt4(^O-rDs#i$UpcUK|R zAZB~7v}TFoWsqVoW^c*3ytA@dpL=kM`Av0&k1{AQS&YdliDtEV zt*}s7 zx@PFcx+Nz~6RyKKdLMW2=$m_Vg9E?2wuxV9Wi^QXwS`{jm- z5SBBiI4-xw84#nmLbX!kDVmiVO!BrAXKry;Ib$0oovmu9@WNp!N@?3ErxYpMH*C=5 z6y+H{&{M;#YM#$V`F*#+KE*(aRkIkt*<7ki?5lthEa&bMfrnbvgr)DqM(YU%HK6s( zE=6-TuFqzk;=1WqhiCoDpw21EGYOVYtzJVj*_MtF^@4eMP~$t2VQ$O2#Ghqav#x_e z7%E)g2udHzgVE!rISr(!uWHbHvg5j})g7#7<0m>Vu>`DY7i169vGaxS)O{b$cgV9#?=U2N1gt|+1!;<1u@nbq8+5N zNV{FEOj)&l7uM@!iD9cJdmLzqJU}TW2c-y}D_P7*+>FEa%)-V}W-Wn5Xv@T!rYN%? zhFOX%VGtHVmUK&`mWp-?8Y@LJ54P)BgPJ1Y{ko;nRt+MPnHgJ(1oC;w@;uBa@A5C) zY)chH#Zn}K>9{PNNMb*MeI)H!a+*L?^+cdv!2!i9uej0wkO5veWZ)PXH0b&E8$&^K@ov@sqS4NT2uE7LH&v z;zxRb|IbGw{<4v=&o9Z`p(ycyh$+&e zQjIT`=9p!X9+CTUGk02f_gA literal 0 HcmV?d00001 diff --git a/static/c24d0bc496b005979d19eb4d4d6db0b5/02cd5/editor-4.png b/static/c24d0bc496b005979d19eb4d4d6db0b5/02cd5/editor-4.png new file mode 100644 index 0000000000000000000000000000000000000000..7f6dc3e24cdc86b690dcee11f07692ab17388fcc GIT binary patch literal 15118 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 literal 0 HcmV?d00001 diff --git a/static/c24d0bc496b005979d19eb4d4d6db0b5/222b7/editor-4.png b/static/c24d0bc496b005979d19eb4d4d6db0b5/222b7/editor-4.png new file mode 100644 index 0000000000000000000000000000000000000000..668dadc247dd13911c58750489cb7a8be9aaa84b GIT binary patch literal 2498 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 M07*qoM6N<$f?jCKtN;K2 literal 0 HcmV?d00001 diff --git a/static/c24d0bc496b005979d19eb4d4d6db0b5/a6d36/editor-4.png b/static/c24d0bc496b005979d19eb4d4d6db0b5/a6d36/editor-4.png new file mode 100644 index 0000000000000000000000000000000000000000..cffd2b0cef13ffd0438de4cbd4d6894613bcc6e4 GIT binary patch literal 22301 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 literal 0 HcmV?d00001 diff --git a/static/c24d0bc496b005979d19eb4d4d6db0b5/ff46a/editor-4.png b/static/c24d0bc496b005979d19eb4d4d6db0b5/ff46a/editor-4.png new file mode 100644 index 0000000000000000000000000000000000000000..2db7a2d0e45b7f29ae171b77fe5d64c13ccfadb2 GIT binary patch literal 8014 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 literal 0 HcmV?d00001 diff --git a/static/c2d555bd768e2e4658e93229e4a2c51c/9d635/edge.png b/static/c2d555bd768e2e4658e93229e4a2c51c/9d635/edge.png new file mode 100644 index 0000000000000000000000000000000000000000..18c20c361e7d0943f231a438602dc5da9aa34e0b GIT binary patch literal 2464 zcmV;R319Y!P)I8q)2u_qK!0{-+ z<3r3-9G~I`O_f{YP(RtEGr#;W!hj5u#{hcS0C(6K!_x#&odr*r2TPLxf7=37pa6#5 zFu?r)jo%r<*eSsD8p7Ql#>*bT<0HZACCS4Bc(*gdcK~|NRozQE$7oB_Pc6^7LCaWP z=TSV@q5+7|0CU6xg2FY^uK{haM%|M#$B9tnf-lLRU+iI1-d;x1V_4{MOWJWf&3P%v zusP3@L)L@?Mu!4tqYce6pXXS5&M56`pj%m@WEmRN6<>m!e zvso@5RI3Fi_5YOP77of+P#3(KP$y8Jah-prSIbw|*H=VvCGb>ma(Q`Ku4bLDOJMES zt!u{Tf(uPR9AC?Ui$6m=_q836u%8v}2TP+VOn@To$M01c0i zk9*EX?UDUyX(Mi${7V)=@=@@(DTI4)27D3WS_@z<-%P*-f0B2T##cvRp5fRomHa!(R!8xFKt}te7Tfef4KUs6{a`IiYDdVYS^np9BM4~FZbQF|q-y?Xkt73h)%X(F8&u zBZvvNjySy?FZjoG;tVVSln6Y)(W5)SMz;Nm6hr?l{ z!BK~{^D-I6OaH9VM_V%O^&lm`G_B4jiLd^pF$0c9H3Z>P4t_0XmbC?1f)e% z(xQI<8z1oz>kV1GV4t3z56)R>ina1qw7>up2=Mmy{{H?7g4Zbs2%q!_JA{0;dgRwn z8D1;haH;SYlL_O$zhZ>xl#QU@&yo(c+GB#J%dgit-Y_r+HAwyf_+0SkmGB_~<>L@w z4-F(gs*B~v@aN}8JVkrNU%F86FqypZ1W;2{FhK^N^ygzvAJln!Z1`X4N&%{p{xv{@ zvVM*KswRLbms^4l%U9NKN-F%vKBrLmH5#oA!TTEzfQD(GDPRQHposFtc;h23X+KpK z(xVZ@FD45b0Qhr}fbehNs}Cc<<+JuuGW;_8JZc=5+_dJ$Bi$D$I<-YAjuyV=xPk?`#^8jT1kN^u?L_6fs4)GBv zJL&v%ytD{eT8SW$rIG+mU91naR zA)Bg49_8}{gwGXG2>fILU;k4F`Q2F;1wAl`7Nt^T{ZU{YjTk@$)Wg z&@J+BX$H885U&ML+e8`^?j{L1|7qR!7fEY9fme&A$7z7D|J&Nx@ zf)2y?X1&{68Q~DNUr8}2O(Jc=9Rz}geHS@^(5ZsL9GexhbDsI@TZ_e}72+E`*#s@*X zM~>w41R5R&z}|cv-_sQ$z)%FR^eAicd-x>{f)CqB#jAS>_Ymbb;`>Mly83{50?CJM z3 zOi=r>!7X`P2@-C-uSSUC0x;zNErP1>!?*zIYi$w{6ocQe3TnG~=bs`-!`Lp^LgDNe z&2w4s{g`2>on%FTid?e8*(t)K{MfOd1;r3)cabK5I^NG&{(sAHcJjL+mYFhFie>Ou zVS*s2p*kq$cR(U5x3hn|8z6ld#`l8SBx>-7VPb-S6z<#Nah_JO2>%*Vd}zBGE1qeH zf-o@wQ>YaxW!naB+RR`?h$moR4ZXx~>x&eO!ORc^c7d7z@tOfD=`a@RhQTLCq4q%n zJ;H{!aeVZ6dYht#V%R#thWiR$RCU8Jun9KJ0QehjD>rRq@Rj>wV*(-B&2PR9E0J!9 z3H&;|J1V-LMR&+Zlzj?w`UOFLgbbUYR5aDeUQ2p zMdA6dnL=_y2SF@BP%G|#*t%Jzt~pN zzQ^D1VatviA(i09X{_4&&OiSSjRQGK;u(bJVo3g%XE-cX-2dx0bf8(4bh;F=*MU+g eUD@_GLH+|-+U$wTE`_=P0000`3$bFJfch5Y|a&!MWn{^{@Q6}A~-8mv5{+lH#lc5P*s>yb!?rrNY)|84h=^s;<7f+nrbrn`_ z(sc|T7e3h@g{{sLt-EXYov?dhm}^i{g5Rbehx(Q%^a6vn&zd&Kykn3v-cf}BkcRf4 zhaS(h6cdDN{Az%E!=aWS7yk<=34_)=wyydaS5krWF^-YAufGC>PK)nPH8JmtC|4bJ zqdPkEfxr05#E~EAsv-|yG2{5WdrOA)pospL8qZY=SOI#nV;|sCaZn+E2Vz3=2|+zR zUCQXR`oxlZ$*wd(VW{UK2Gk^yqvAMQ6eJ2{Ky=!=VB8z`K2HGw^!MK(JnP!YvHAtT z7OVx9pkJyBgD&uL@PYrlNMYJ#8V@*5l@H_wP?QXN#@J#JL7!YOF_KWC5btOUyA+^= z8ymuKjnf0fAb=fUj+l|M+p7{bk1F5T z`#IGuqcIYp6eg|04FFZ?={=N@^+WOzKv|GJp`ckrmN~t z-?g!8J$d08aHH5dfrph9&kv`$$`&J-_^l?6O*e<%f^aXSkLu86hoa^a$+moF&{4FM zsJY(xdf6)3c)usbsG+nx;aUt`J4_{FJYTq)(bi8xx2N2&LX;ZW9iVukQThshRZ03a z%fJF4Lk!`GSA&?xB1A2=$~NiqSGXg}gK@c~oh7%z0uzjfzkvR9f=UO@C(%JAKs+@w!Thw6&_8% zNQoliPMuq32Hy?6U39e7N!iM35N8QW3)vM3+_&Kr;!Rany!P!Jzqo1tAgvPNuT5Gj zW>@tiKA?C6i>gjRNI?_$0CJ%E#=kMa3gZ#?=RL_NeUWV#2Iv-kD@WZH$`*`E3ikmR z{K(mGdv5qb`9coWAtPPp06P(wm;j(6_lxXhAg#IetFF$;2vMp8w&1l8p84X0S(Sbq z=#=+g2h|p7JNAZe1b)3?2OIit5~O`dO9G$ef^s>a#;KN*H4QY~_g8EPU*kYpNclMg zgVN!9rhe~nWT0;3#W=p9>Kz&*H;NES6!9|{@Fk7l^ik`jyCPg7@7xkc63(Bp8%I%z z)%IMo&SX{rH)Z^Q2Aw*1)zW(uwcy;>g%5PU3L@YA$-NxA=~ipRMPP^v-*I@cB2i9k zI?(>DO{sv6rElg)%1V=he>6P_$7LaH6wC~MZ#gUB28o^VdJ6HqLz&)mv2C@rBqPPQ zd*nNXF$OC#5+bo0gsVf_*Bpea0pA4}yL2nl_P#;kBE(0W5P9_N1teMv9JGaujx=M^ zis4JHRJ8mB!wWIeuUqtU`i`Lz1^5DAr)@f4hK&?6atqaw;qBjDC9|A)Y#k`He}1gUr4! zf&#aW8HE)2@Uh5zzpG)8rsg$ zT{Z+6_Ta%y)L;`A;d5m#4$Xf$9apgEpOWLhU(P~bQA+>&p?FBz%vszsdf3Jlb)`O< zV^q=PyCeQL&8FJ&Dt<^02%aSw7V5uSl;po#Me>?}mE!}tBkvhq90Qc$MYy+>Z<~Qh z)G7<-au)rkXzI|zc2p}qolbj8Sji#PpT=|I7`L>}j4~*PJWILE30qLu3*t>asZ@Y@ zE=dXMTB_=G^k0@tYGeRSfa*HrD6pKw9r)(rxHXL%K#x@+_ceUFPz%7=@86bPo^p&* zEFqlK%kD-7Ce+{58>To7K{tw>QjlBPSDhzR0KSbFp=&hZ8iIeVN#_N%Wb}IXWR%cV2g*o(ELP~K=gap;y-R)Kaf!e?S$NuB#;KWB4ZG^9bOcJi6gpw{z?s3a->Ss~&Osl9Y;zU?xGMKb!w(*YUl@#4-Z{pAPtB zpC%eS>i!JOT|Y3q54T?vT?(JIdprVH#i>$}jk!xJ0%(I!+|go<%*`C}=O=#PJ1uF< za=}OL$K9pqkXdG;C$lBjE+ERk?~nRr2(vmX5oR+-`AF_rm~?q_H9a#c=QTnqq%#3N zp2wwBR6QWfe>IgI+x-|GAze9T$cJS}wm0~DJ=P<4{qgyOxNF8+OIWXCiy73wwwmdU z{zRwE`Ny_WnI0B~=f_2>YhE&xHiyJqx(X$c*Kbku!S=B;HvhU8qsaT?rWJw8Z7I_x z30geKR`omiGocoZp!e5Ts=7Wwb2~Hc6MB_Xaavy#%mISp@|BL_15yO4Ic8#34@i%V=hBWB{tG61~8YD{|G&@4r84mdn(w^YaTF1+xV7 zlqfXG@t<#oHWD5NbqDwPmQlKxi@dorO@b8xvD5Pag~b-0jASV}-y3;Z2qRlFH0hG3 z5S%(Aq2)#Xohc^xstcUPS)8<)Fh%_DHFZOl)z3Oxe(X@uJzv(wA5j$))Ai1BBfmaX z3fdsZc+xE^%8N?7h|BvoXIzoE^M#$hf~y!-C2={#^`U=~guaFQkrYc`^p;0@`_AvX zjOunov5-EQ>>s%bqq+J?YI$YkZ;fR($Mskx@|^;qCaaL7rS2E9FpDlf4tV29->@?-Ne=v+ zts2Aq0;M7_@Y3ZwtB}5{Z+9W=7Et^5FZSq_?aOCh}U@bfM9(qqt!mjJDBkEhVcHy5HK&LuA9eASVRxu#c z7yHRYfjwPtH-xk#_;q$yljMFHApv}=RHsS>BZcIS)ptLAu`4>HyAnX9n>gr-H@QaD^64!EZ;w|EN(6)4_%EB8~$Ld zib*OcXhi)+BCoae04|oGs`jYEGQq=lXFHR{Tgv9^7xEG63zcYpwt}ejvQPtGUEZis zN+w~+XzHV|21gjI4w+Dtm-TJCQq*J^Cx%Nx{stD>5Pc0zuU{h=uOUcCkC*@+$pMO_C*vqAAO%1D6HD4v5gQj%A6c z+|zF>=zZH9#rf$!n*+)^d@4=Pn2kL^J76~)yPlt>8?87-!?|JF$0UYY?300V^XB*# zL1LIPx*llSzTTXk% zIbR!U8&;*nH518Q2Lhp`0~*-aFCsKDSw5W_9aKSY!<@~h-deb(7Nu$K`d&6|((%vw z%Gpz2-s6u$auI=_kUo%@2%FzXQ0GC5v9A($jC#yDEu83)d`NaRE&teZ**~i3}&sCBe5kuIeU`29*3~vvBLBJDYWJWXjJOm!?MM z191vqOD0m#lg+ayE*+(NCMVczclMo_14)DLN2~P>vH*RQf6iv)t`-Oa%WqcLd!3j; zeS`)xb>hgdgYx!{r5%StTBc>zmS`4*Ru7JLWfraXr-1B zhF%P-K}X10wvapcexB(+L>mkN-<2@uzsj@WXfJ#jx=OiTT+arBuK6URT7IcKAun_m zcsw9^!rfv~=d{GmqCZj&)WW1)S%c+ujk;z(9`R%=iYKc25-a%`4ZiWfc3?B~gS92D zd%G@?N8xfNNpF<|MJ#}u+Z*`jU=qXBo+hh5JiLt^41!5i?wFfXs#Hv{;(bqoIhQE0 zNk+2{rIgWi{g~54f~t;rF1B#2J2h0BK;oFq)nUNt!X!VSJ#f^E{I2Esc&md{k^>#J zQptloZ+_!u-RrF1Q#56IspmHsU(tOq{8w&p#O z)Y!h?vlRWPm|aaEL&KcO7f9+1`FO{jmw~{Ns#TCtw~#k^+!Ke_KPm za^)cd%HS0NLWQkMOi#SIoX?T|__Mm5+{A!G1r>xbG(^v!Ov}xIlh?A6==X^X?q4A6=3>52i88Pu%Hh?FVVscchE0c+IEBC;0^$>FHlskYwJ|hT$!VB)#Y8 zm5~t-xCMKKo#O4+cO+TIm4y~8*rw?&0!|LF_2a49T6#vLnKJ`)3XCRgdu++zB8K_R z?c60juZuKP5~zANQc$q$tsVv)26@SVqoA~GKECqe#^%gcON>c%KkHxItU)wygj0_m zfcS}Ofjj)yu5SOONIwGvnwPZBtI$=m3;9+!I1M!pkHk0Nr+7nirUXRLN)?vWW7Mps zrV;+R^w&6BuKNJH@n+J#Lii9%MT_xUCYuZ0Yyq9%RjO=7n%8TKK0(upv1(_t)EB>VnzmF8 zp^gH2A~z@YO(It^YfD7}HHjvK zr%l<}w5yxG!)L=u>p^q3vwt?vh+V&bUT0g&l-^Hh6MrW!PS56*acXbH4T{?&w6RTS zg0^kr3jN_=SJ@())AZgtNKi(%v}47wvRF+*PlfTV&?kui*9A@qTDHDyL&NdQOOHdVL6 zk}8q+jP$Qr&X1LtaKxTt)_o3j+iz!c#IG0E#NB-(MS=pE1G}p=xDRYgd>4pYWifDZ zcAFs<-?vd>C|0VOo%nDe=iV1*uIibH&dx67tD77z^77T@G<9Dc%bSznAlSlCN&VVz zO*B_Q0zlo?UBW`f*yT+{dklF@-DXQI+fMagzOe#ulWqz zNUI-w#IN!Gx|#9rO3zUVoQON`4+nFnrBjP!+(>@h+P&LrjF(4RCl~F3F+3zdr;?Ga z8oJVB+)vaRK%|KtQo2}b+x5hi{kY7uYkRuS&;8z#VGfbq?{b5rM)@u}RLkBzp9V#9 zKHt|`SWf8Y)D)Y=i}f%9B72~69L8H)+K$`2NP^|qx4qEQf79h6XcgX-;MiisOgq3| z@+Uh(D>29SDN}(r+D_!Gz1iyE)r8*`2gdvXMH`M0hb{pNN)#Xk;1Tc?hun;wPgGJS z;(yzqnakasik{D-a^2V=HpeRxwoz|APaxfm`?JJQ|8Fk3e88Li(VPvot~tPa^Bkga z^YCMLeL2u2n1r%W_4Yuo_au;Wg;VMd6a5FX5PtYj>8OFzV$0$!tj7CYDF&y=?Oo_) zI;zj7cKz~=g5r~%>Ksj#%;cWrmxERB;*%2eWDY#8dY#tRd|pQ$ub>||7<_xegks6h zzVwoaki|g61M)sjAvfqnsqd)Vm?k0wr7GNc91c8mj45=haK!z2aCO?EJD#Rc^zTbD z?=+j4K38fwA2-g|Ic`Ze*)B?2SXeBGMMxx8CsDgnze@wZ2c{9pLVK(j`dGt~VXqCH z1s0pCL&UvXawv(I96ilB`uqD=Ja)5e7i#>EY~6mJrM%SzjC=61_%Hs^edrOvu7)x~ z$NeW`GA@rIX9mS7kjn13GZOsf?Hy-d;3aMJ{&mZCif+rrxUhDoXJah*Qps+%?2Ntu zcEE&GRUL$)7ncP^3D9fvbRVo)-cGZjv*qtwpA7TX8M2{HaYpnl9(Gwy(VcW$DA{*j zY2xDp<;BVedrId+++IpUplcGLZhUj^iaHGOb5Uxpu!UTRLv30Z4k+l0lt^#fp1;t= zNv0+w^vuJazVq3y{90-4qH2%dJ2>bu<%-9r{^+9az9u;XZ}rr_Ukv@MjnRY`76wp- zq~hiir!CHXdm}#N=M=)I;Hs>iX?cRUip4(L86;|OX{Y8&hV(Br+AOv>zB!z)mLUmQ zZfE-sFHAS$1yjWCU}pi$n_gFUM~-gMYBT|Uzeu;@z%2;y0+#oa>>)t@0@QIx81bz3 zR`20pg8E`|zWUszu^qQ&iSkH9ePpgv=GM>;i?Y*Vz0u0bija`-v!>?2&RE9n29BRV znMsz&{x~-4=&K2`gIIu!PUt`@Q$lT22;dtiR)g>6P4{WNeIvLkMwDXR{SJ#&iSO@8 z_8XD2+42^XRebebZMPcXEcGmFBjxX+UNLj^7oXpnk7)lD^0{-Ft2US*={kFn@=kA< z!|zspczBr3RRK%Jqji~FJG039J5TY9+)Y>;aMfHmT9nvlPOLD&jk5 zv5o|FlyAdlUg=EeYzN`8>o!GQ9nRPLK6*kRka4Ti#)aq<0Cs5L@p3b$#<=SIEi8-JajN&Vh2oM;^#X5R!(ty3kA}zLSWq$lzvzx8^8|>1`(64v_^~V`gjN9|bMyXgkppWiOno%2jp#Ce@h*G1Iia z#!C%W6<=EulG(KC>{o@RXF%<~gAo9)>!WT<9@T_Ys=33H(S6h$J0iu8^+#c zTt?122?>|qSicvV!F6ejo0GU)%*p_-|7!#B(e|Oi-zHn! zwR)GGHvH@?BF&f$P^zx@IngL@{x`#`tB*h1H_#&6BV=?`A=~F#8-R+6`aWZ9!L}(c zcGkMzydIB$;G>ZdEoyITb$&zyCY9F_Cu$)3d_LGj0*agukBo#z&eeN2o&We1UF>ax zNnuOX`7g9qTkOdWkrKi9jO?dPuY6YCxWr#iL8L5TN@^IGM zH!#3jeX%8x$%Iu76Sq~~7ew|Wr_b%-xbZNjTgg|RW~3U(f~i=mzpCW6_6rAf@axE$ zwHtue_Y91Tndh0Q*Am)Ex|(BKsc!2*5OgY!KX`n$3%HtjG8`R2q_52|JWdZ7;vvwk zE-`(dD~%xB6~{5v{$nzwI~{jr*B|@MLMUW~Nd*uCGG3(0vfxx1GuwLbNwlB7ZxkiU zzM}SMi8aTio;;IHsR-%&-kMdl9k8~w_p*KBox`V51$O+~j7(Et)Es|nY~55Bfd4ok z23vZrx}yz$Usg;#APoeFfX<%FmL^z?1t^$eG^OapssClD->D^vTuLv4U7JOn3@8Vf9W=Z5f1mXwj;!w!R4sj`F~I)Ex!? zf`|By_&f-oM0gvLQWT2y*ygkbYkQyl;ZN7f92-hx(r&UP6?Q%PyyDBQ4=SLA2jYmy zYH5*_?<#JW$tMM8T)DVTu5IdG`z?ID_F~yCu^ErTKoL2deF7l9g)W1LqbfvQ)m2zD z{C>&C>{iO~JFiYJy12PHU(IS=Ov`hySRXRLE%ib1__-Y&nY-Cu*p)hC6Z|YV+|{M$ zdU#J!Q^Qql`T+8?#2Qq5fJw?SLy{^Icst#=eQ>g`7xSw{QeI z53Bt0w{M`IzX1TW>Hp3G*jE%64QbU;pT1Yyeg`%KXTLI8pyk{_I%EopA9+K&`>rLT zY$2svVpwby&ozA^{xe3m-l5j{2FJ4I3XcM^;4^sG;xywgQABoza%3@Jw?{mBKjAMS zmoBaj4yRR|;SEzI8Y?&3YzvR0u!}}Eju)wsyE%T@{A=!kX=!P3^}&Ydp8zZj)g9-U zMMXs&H)~#njD2Uj)ZbjF4QR`TNA^xG^=wMY%%Cs|Yf$ruTVRrt%Z`G$Ku+U~@2d`B z!|&&Z%4C7>7^hr+hWq54z&Bp64!_a=Q^fT5QjZ@SPvR|@F)=)p$}^1IzQv!!z?;)H zu}&OlyWA8V{F20J*{*qNVc}QDrft(>PWu-wZUaZyY$)~}Z=%}|+lL#A;!Ydzqb%fB z{|iVHos+on5ajyq6R?Iltu3E9UQs^K0;8XavDUJm>{4YoHBcpBpouE`=>q$yTu zCzrZ910t!u_XSxvpfjI<(dToWZ}iyKPEF2z^synivJ*vaGQwlS={N^I7+3fQy#`5X zvzRi<=p%ae9ULs5^n0>B#KgBac<1l{QCe~5b5 zun-jv`Faq0_mIZwO;EL+` zKhjapU!UFAaj%vAtOmM4SUA3TOutk@0^k$j8P}OqG^EDLickKfBnRbbFs;y!P15>b z!yF$9NHd(SOu|pbU1O-L&TUryN&@}LEVnxgKK}VvnsmPLlCx{$H3<-a?zRCPgx;gr zvn!fBW}aD7mh+O;Ib95~{SZ0{X1=@k+&{1^uDs>ZqwLngZALaZC#o2)bNGM@{$r}c z>jq(tF?}s~hL!+HTh#0qJgG$VPP@~#JVq&sC^wrb``UuY%1>Nel8Cw4l1z_%y-~e( zt@hi?tINsNDJ3_V_RZkZXks*Fzm*Sq^E4kg91;hk#ooPkLyARP1zZDf78m!|m}z6P za2608bJjZ2(-+63Wd_g+ku^#ON*72}&bdF$=WCYNE*~%0Y948_X_miepFL>p?iEkT zvny!TZ_F~!7Cj^{1yx16bPv|{1koVjWsH6HF0NSPWfhCucAK_ZNUCH`!yezVM?rpc z=T+xgZj310lf~@Jt^Wl)=s!5pQM$oLH@HFo2vy`wv{Jm zLcQ!QdTrwIsv$6)9S?XA9r8?1STI}-ZVg>2WbSHvpP0U%S0BX$EDV}B@N}=Q8*A@q z@1qoYeyqjZpO2e$7VT$44`1QKJ=wKYpdP%XvH8(lrB(J4Q58kOd z+_@!C0Zp3(L-TkePEn~)6MnOH59iZs5;5Jrg>X_i$PFPYX<|ZCiv5d)V?qdDmhGGY zM@w4H4GcsuE*&X9#tEKHuGuV zvhFM6sVLn32}U^%0hl^a>)e40LCm9gRq2#fAqhtnd>UMl2vZTcode[class*=language-],pre[class*=language-]{background:#f5f2f0}:not(pre)>code[class*=language-]{border-radius:.3em;padding:.1em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#708090}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#905}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#690}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url{background:hsla(0,0%,100%,.5);color:#9a6e3a}.token.atrule,.token.attr-value,.token.keyword{color:#07a}.token.class-name,.token.function{color:#dd4a68}.token.important,.token.regex,.token.variable{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}*,:after,:before{border-color:var(--un-default-border-color,#e5e7eb);border-style:solid;border-width:0;box-sizing:border-box}html{-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5;-moz-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}*,:after,:before{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 transparent;--un-ring-shadow:0 0 transparent;--un-shadow-inset: ;--un-shadow:0 0 transparent;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }::backdrop{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 transparent;--un-ring-shadow:0 0 transparent;--un-shadow-inset: ;--un-shadow:0 0 transparent;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.bottom-0{bottom:0}.left-0{left:0}.right-0{right:0}.right-8{right:2rem}.top-0{top:0}.z-0{z-index:0}.z-10{z-index:10}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-10{margin-bottom:2.5rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-2{margin-left:.5rem}.mr-2{margin-right:.5rem}.mr-4{margin-right:1rem}.mt-10{margin-top:2.5rem}.mt-20{margin-top:5rem}.mt-8{margin-top:2rem}.inline{display:inline}.block{display:block}.hidden{display:none}.h-4{height:1rem}.h-full{height:100%}.h-px{height:1px}.max-h-\[450px\]{max-height:450px}.max-w-\[320px\]{max-width:320px}.min-w-0{min-width:0}.w-24{width:6rem}.w-4{width:1rem}.w-full{width:100%}.max-w-screen-lg{max-width:1024px}.flex{display:flex}.flex-1{flex:1 1 0%}.flex-col{flex-direction:column}.origin-left{transform-origin:left}.scale-x-0{--un-scale-x:0;transform:translateX(var(--un-translate-x)) translateY(var(--un-translate-y)) translateZ(var(--un-translate-z)) rotate(var(--un-rotate)) rotateX(var(--un-rotate-x)) rotateY(var(--un-rotate-y)) rotate(var(--un-rotate-z)) skewX(var(--un-skew-x)) skewY(var(--un-skew-y)) scaleX(var(--un-scale-x)) scaleY(var(--un-scale-y)) scaleZ(var(--un-scale-z))}.cursor-pointer{cursor:pointer}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.overflow-auto{overflow:auto}.border-t{border-top-width:1px}.border-gray-400{--un-border-opacity:1;border-color:rgba(156,163,175,var(--un-border-opacity))}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.bg-blue-500{--un-bg-opacity:1;background-color:rgba(59,130,246,var(--un-bg-opacity))}.bg-orange-200{--un-bg-opacity:1;background-color:rgba(254,215,170,var(--un-bg-opacity))}.bg-white{--un-bg-opacity:1;background-color:rgba(255,255,255,var(--un-bg-opacity))}.bg-yellow-500{--un-bg-opacity:1;background-color:rgba(234,179,8,var(--un-bg-opacity))}.hover\:bg-blue-600:hover{--un-bg-opacity:1;background-color:rgba(37,99,235,var(--un-bg-opacity))}.p-2{padding:.5rem}.p-6{padding:1.5rem}.px-4{padding-left:1rem;padding-right:1rem}.px-8{padding-left:2rem;padding-right:2rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.pb-16{padding-bottom:4rem}.pt-1{padding-top:.25rem}.text-center{text-align:center}.text-sm{font-size:.875rem;line-height:1.25rem}.uppercase{text-transform:uppercase}.italic{font-style:italic}.text-gray-400{--un-text-opacity:1;color:rgba(156,163,175,var(--un-text-opacity))}.text-gray-500{--un-text-opacity:1;color:rgba(107,114,128,var(--un-text-opacity))}.text-gray-600{--un-text-opacity:1;color:rgba(75,85,99,var(--un-text-opacity))}.text-gray-700{--un-text-opacity:1;color:rgba(55,65,81,var(--un-text-opacity))}.text-green-600{--un-text-opacity:1;color:rgba(22,163,74,var(--un-text-opacity))}.hover\:text-white:hover,.text-white{--un-text-opacity:1;color:rgba(255,255,255,var(--un-text-opacity))}.filter{filter:var(--un-blur) var(--un-brightness) var(--un-contrast) var(--un-drop-shadow) var(--un-grayscale) var(--un-hue-rotate) var(--un-invert) var(--un-saturate) var(--un-sepia)}@media (min-width:640px){.sm\:block{display:block}.sm\:hidden{display:none}}@media (min-width:1024px){.lg\:hidden{display:none}.lg\:pb-6{padding-bottom:1.5rem}}body{color:#333;line-height:1.5}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{--un-bg-opacity:1;background-color:rgba(254,240,138,var(--un-bg-opacity))}h1,h2,h3,h4,h5,h6{margin-bottom:1rem;margin-top:2rem}h1{font-size:2.25rem;line-height:2.5rem}h2{font-size:1.875rem;line-height:2.25rem}h3{font-size:1.5rem;line-height:2rem}h4{font-size:1.25rem;line-height:1.75rem}a:hover{color:rgba(202,138,4,var(--un-text-opacity))}a,a:hover{--un-text-opacity:1}a{color:rgba(37,99,235,var(--un-text-opacity));text-decoration:none}p{margin-bottom:.5rem}hr{--un-bg-opacity:1;background-color:rgba(156,163,175,var(--un-bg-opacity));border-style:none;height:2px;margin:4rem auto;width:100px}img{display:block;max-width:100%}blockquote{background:#fbfbfb;border-left:8px solid #ccc;color:#666;margin:16px 0;padding:8px 0 8px 16px}blockquote>:last-child{margin-bottom:0}ol,ul{margin-bottom:1.25rem;padding-left:2.5rem}ul{list-style:square}ol{list-style-type:decimal}li{margin-bottom:.5rem}nav a{color:inherit}nav a.active,nav a:focus,nav a:hover{--un-border-opacity:1;--un-text-opacity:1;border-color:rgba(59,130,246,var(--un-border-opacity));color:rgba(37,99,235,var(--un-text-opacity))}nav .brand{font-size:1.125rem;line-height:1.75rem}nav .nav-item{border-bottom-width:2px;border-color:transparent;display:block;margin-left:.5rem;margin-right:.5rem}nav .nav-icon>svg{fill:currentColor;display:block;height:1.25rem;width:1.25rem}nav .nav-icon{cursor:pointer;margin-right:.5rem;position:relative}nav{--un-text-opacity:1;--un-shadow:var(--un-shadow-inset) 0 1px 3px 0 var(--un-shadow-color,rgba(0,0,0,.1)),var(--un-shadow-inset) 0 1px 2px -1px var(--un-shadow-color,rgba(0,0,0,.1));align-items:center;box-shadow:var(--un-ring-offset-shadow),var(--un-ring-shadow),var(--un-shadow);color:rgba(75,85,99,var(--un-text-opacity));display:flex;height:4rem;padding-left:1rem;padding-right:1rem}.anchor>svg{display:inline}:root{--toc-width:260px}main{min-height:70vh}main>section{padding-left:1rem;padding-right:1rem}@media (min-width:1024px){main.has-toc>section.with-toc{display:flex}main.has-toc>section:not(.with-toc){margin-right:calc(var(--toc-width) + 32px)}}main{margin-left:auto;margin-right:auto;max-width:1024px;min-width:0;padding-left:1rem;padding-right:1rem}@media (min-width:1024px){.toc h2{display:none}}.toc ul{font-size:.875rem;line-height:1.25rem;list-style-type:none;margin:0;padding-left:1rem}.toc li{margin-bottom:.5rem;margin-top:.5rem}.toc p{margin:0}.toc a:not(:hover){--un-text-opacity:1;color:rgba(107,114,128,var(--un-text-opacity))}.toc a.active{--un-text-opacity:1;color:rgba(37,99,235,var(--un-text-opacity))}.toc>div{--un-border-opacity:1;border-color:rgba(156,163,175,var(--un-border-opacity));border-left-width:1px}.toc{margin-bottom:1.25rem}@media (min-width:1024px){.toc{order:3;overflow:auto;position:sticky;top:80px;width:var(--toc-width)}}:not(pre)>code{--un-text-opacity:1;background-color:#f5f2f0;color:rgba(75,85,99,var(--un-text-opacity));overflow-wrap:break-word;padding-left:.25rem;padding-right:.25rem}.code-highlight{float:left;min-width:100%}.highlight-line{background-color:#0001;border-left:.25em solid #f99;display:block;margin-left:-1em;margin-right:-1em;padding-left:.75em;padding-right:1em}.mermaid{overflow-x:auto}.icon-list ul{display:flex;flex-wrap:wrap;justify-content:center;list-style:none}.icon-list li{align-items:center;display:flex;margin-right:60px;margin-top:24px}.icon-list .gatsby-resp-image-wrapper{height:48px;margin-right:8px!important;width:48px}.button-list ul{display:flex;flex-wrap:wrap;list-style:none}.button-list li a{align-items:center;border:1px solid transparent;border-radius:4px;display:flex;margin-right:20px;margin-top:16px;padding:8px}.button-list li a:hover{border-color:#bbb}.button-list li a .gatsby-resp-image-wrapper{display:inline-block!important;height:48px;margin-right:8px!important;width:48px}.home-buttons{margin-bottom:80px}.home-buttons a.button-primary{--un-border-opacity:1;--un-bg-opacity:1;--un-text-opacity:1;background-color:rgba(59,130,246,var(--un-bg-opacity));border-color:rgba(59,130,246,var(--un-border-opacity));color:rgba(255,255,255,var(--un-text-opacity))}.home-buttons a.button-primary:hover{--un-border-opacity:1;--un-bg-opacity:1;background-color:rgba(37,99,235,var(--un-bg-opacity));border-color:rgba(37,99,235,var(--un-border-opacity))}.home-buttons a.button-white{--un-border-opacity:1;--un-text-opacity:1;border-color:rgba(59,130,246,var(--un-border-opacity));color:rgba(59,130,246,var(--un-text-opacity))}.home-buttons a.button-white:hover{--un-bg-opacity:1;background-color:rgba(243,244,246,var(--un-bg-opacity))}.home-buttons a.button-gray{--un-border-opacity:1;--un-bg-opacity:1;--un-text-opacity:1;background-color:rgba(229,231,235,var(--un-bg-opacity));border-color:rgba(229,231,235,var(--un-border-opacity));color:rgba(75,85,99,var(--un-text-opacity))}.home-buttons a.button-gray:hover{--un-border-opacity:1;--un-bg-opacity:1;background-color:rgba(209,213,219,var(--un-bg-opacity));border-color:rgba(209,213,219,var(--un-border-opacity))}.home-buttons a{border-color:currentColor;border-radius:9999px;border-width:1px;display:inline-block;margin-bottom:.5rem;margin-left:.5rem;margin-right:.5rem;padding:.75rem 2rem;text-transform:uppercase}.home-buttons{margin-top:2rem;text-align:center}.home-features ul{list-style-type:none;padding:0}.home-features>ul>li>ul{--un-text-opacity:1;color:rgba(107,114,128,var(--un-text-opacity));margin-bottom:0;margin-top:.5rem}.home-features>ul>li li{margin-bottom:0}.home-features>ul>li{flex:1 1 0%;padding:1rem}@media (min-width:1024px){.home-features>ul{display:flex}}.sidebar{width:240px}.sidebar-open .sidebar{--un-translate-x:0;--un-border-opacity:1;border-color:rgba(229,231,235,var(--un-border-opacity));border-right-width:1px;transform:translateX(var(--un-translate-x)) translateY(var(--un-translate-y)) translateZ(var(--un-translate-z)) rotate(var(--un-rotate)) rotateX(var(--un-rotate-x)) rotateY(var(--un-rotate-y)) rotate(var(--un-rotate-z)) skewX(var(--un-skew-x)) skewY(var(--un-skew-y)) scaleX(var(--un-scale-x)) scaleY(var(--un-scale-y)) scaleZ(var(--un-scale-z))}.sidebar ul{list-style-type:none;padding:0;position:sticky;top:90px}.sidebar a:not(.active):not(:hover){--un-text-opacity:1;color:rgba(107,114,128,var(--un-text-opacity))}.sidebar{--un-translate-x:-100%;--un-bg-opacity:1;background-color:rgba(255,255,255,var(--un-bg-opacity));bottom:0;left:0;padding:1rem;position:absolute;top:0;transform:translateX(var(--un-translate-x)) translateY(var(--un-translate-y)) translateZ(var(--un-translate-z)) rotate(var(--un-rotate)) rotateX(var(--un-rotate-x)) rotateY(var(--un-rotate-y)) rotate(var(--un-rotate-z)) skewX(var(--un-skew-x)) skewY(var(--un-skew-y)) scaleX(var(--un-scale-x)) scaleY(var(--un-scale-y)) scaleZ(var(--un-scale-z));transition-duration:.15s;transition-duration:.3s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);z-index:10}@media (min-width:1024px){.sidebar{--un-translate-x:0;border-style:none;min-width:0;padding:60px 2rem 2rem;position:static;transform:translateX(var(--un-translate-x)) translateY(var(--un-translate-y)) translateZ(var(--un-translate-z)) rotate(var(--un-rotate)) rotateX(var(--un-rotate-x)) rotateY(var(--un-rotate-y)) rotate(var(--un-rotate-z)) skewX(var(--un-skew-x)) skewY(var(--un-skew-y)) scaleX(var(--un-scale-x)) scaleY(var(--un-scale-y)) scaleZ(var(--un-scale-z))}}.label{--un-border-opacity:1;--un-bg-opacity:1;background-color:rgba(219,234,254,var(--un-bg-opacity));border-color:rgba(191,219,254,var(--un-border-opacity));border-radius:.25rem;border-width:1px;display:inline-block;font-size:.75rem;line-height:1rem;line-height:1;margin-right:.25rem;padding:.25rem}.info-box>p:last-child{margin-bottom:0}.info-box{--un-border-opacity:1;--un-bg-opacity:1;background-color:rgba(219,234,254,var(--un-bg-opacity));border-color:rgba(191,219,254,var(--un-border-opacity));border-radius:.25rem;border-width:1px;margin-bottom:1rem;margin-top:1rem;padding:.5rem 1rem} \ No newline at end of file diff --git a/sw.js b/sw.js new file mode 100644 index 00000000..be69ed69 --- /dev/null +++ b/sw.js @@ -0,0 +1,178 @@ +/** + * Welcome to your Workbox-powered service worker! + * + * You'll need to register this file in your web app and you should + * disable HTTP caching for this file too. + * See https://goo.gl/nhQhGp + * + * The rest of the code is auto-generated. Please don't update this file + * directly; instead, make changes to your Workbox build configuration + * and re-run your build process. + * See https://goo.gl/2aRDsh + */ + +importScripts("workbox-v4.3.1/workbox-sw.js"); +workbox.setConfig({modulePathPrefix: "workbox-v4.3.1"}); + +workbox.core.setCacheNameDetails({prefix: "gatsby-plugin-offline"}); + +workbox.core.skipWaiting(); + +workbox.core.clientsClaim(); + +/** + * The workboxSW.precacheAndRoute() method efficiently caches and responds to + * requests for URLs in the manifest. + * See https://goo.gl/S9QRab + */ +self.__precacheManifest = [ + { + "url": "webpack-runtime-9331f5e1790af6c863ed.js" + }, + { + "url": "styles.7152d3656b4955d5b035.css" + }, + { + "url": "app-64f2811254713e6e49a8.js" + }, + { + "url": "offline-plugin-app-shell-fallback/index.html", + "revision": "baf9d84a91a947e6f382f64efe246dea" + }, + { + "url": "polyfill-c7af91edbbea3673745d.js" + }, + { + "url": "manifest.webmanifest", + "revision": "a85afb0570d882168626ca677eef0626" + } +].concat(self.__precacheManifest || []); +workbox.precaching.precacheAndRoute(self.__precacheManifest, {}); + +workbox.routing.registerRoute(/(\.js$|\.css$|static\/)/, new workbox.strategies.CacheFirst(), 'GET'); +workbox.routing.registerRoute(/^https?:.*\/page-data\/.*\.json/, new workbox.strategies.StaleWhileRevalidate(), 'GET'); +workbox.routing.registerRoute(/^https?:.*\.(png|jpg|jpeg|webp|avif|svg|gif|tiff|js|woff|woff2|json|css)$/, new workbox.strategies.StaleWhileRevalidate(), 'GET'); +workbox.routing.registerRoute(/^https?:\/\/fonts\.googleapis\.com\/css/, new workbox.strategies.StaleWhileRevalidate(), 'GET'); + +/* global importScripts, workbox, idbKeyval */ +importScripts(`idb-keyval-3.2.0-iife.min.js`) + +const { NavigationRoute } = workbox.routing + +let lastNavigationRequest = null +let offlineShellEnabled = true + +// prefer standard object syntax to support more browsers +const MessageAPI = { + setPathResources: (event, { path, resources }) => { + event.waitUntil(idbKeyval.set(`resources:${path}`, resources)) + }, + + clearPathResources: event => { + event.waitUntil(idbKeyval.clear()) + + // We detected compilation hash mismatch + // we should clear runtime cache as data + // files might be out of sync and we should + // do fresh fetches for them + event.waitUntil( + caches.keys().then(function (keyList) { + return Promise.all( + keyList.map(function (key) { + if (key && key.includes(`runtime`)) { + return caches.delete(key) + } + + return Promise.resolve() + }) + ) + }) + ) + }, + + enableOfflineShell: () => { + offlineShellEnabled = true + }, + + disableOfflineShell: () => { + offlineShellEnabled = false + }, +} + +self.addEventListener(`message`, event => { + const { gatsbyApi: api } = event.data + if (api) MessageAPI[api](event, event.data) +}) + +function handleAPIRequest({ event }) { + const { pathname } = new URL(event.request.url) + + const params = pathname.match(/:(.+)/)[1] + const data = {} + + if (params.includes(`=`)) { + params.split(`&`).forEach(param => { + const [key, val] = param.split(`=`) + data[key] = val + }) + } else { + data.api = params + } + + if (MessageAPI[data.api] !== undefined) { + MessageAPI[data.api]() + } + + if (!data.redirect) { + return new Response() + } + + return new Response(null, { + status: 302, + headers: { + Location: lastNavigationRequest, + }, + }) +} + +const navigationRoute = new NavigationRoute(async ({ event }) => { + // handle API requests separately to normal navigation requests, so do this + // check first + if (event.request.url.match(/\/.gatsby-plugin-offline:.+/)) { + return handleAPIRequest({ event }) + } + + if (!offlineShellEnabled) { + return await fetch(event.request) + } + + lastNavigationRequest = event.request.url + + let { pathname } = new URL(event.request.url) + pathname = pathname.replace(new RegExp(`^`), ``) + + // Check for resources + the app bundle + // The latter may not exist if the SW is updating to a new version + const resources = await idbKeyval.get(`resources:${pathname}`) + if (!resources || !(await caches.match(`/app-64f2811254713e6e49a8.js`))) { + return await fetch(event.request) + } + + for (const resource of resources) { + // As soon as we detect a failed resource, fetch the entire page from + // network - that way we won't risk being in an inconsistent state with + // some parts of the page failing. + if (!(await caches.match(resource))) { + return await fetch(event.request) + } + } + + const offlineShell = `/offline-plugin-app-shell-fallback/index.html` + const offlineShellWithKey = workbox.precaching.getCacheKeyForURL(offlineShell) + return await caches.match(offlineShellWithKey) +}) + +workbox.routing.registerRoute(navigationRoute) + +// this route is used when performing a non-navigation request (e.g. fetch) +workbox.routing.registerRoute(/\/.gatsby-plugin-offline:.+/, handleAPIRequest) diff --git a/webpack-runtime-9331f5e1790af6c863ed.js b/webpack-runtime-9331f5e1790af6c863ed.js new file mode 100644 index 00000000..a2987baa --- /dev/null +++ b/webpack-runtime-9331f5e1790af6c863ed.js @@ -0,0 +1,2 @@ +!function(){"use strict";var e,t,n,o,r,c,i,s={},a={};function d(e){var t=a[e];if(void 0!==t)return t.exports;var n=a[e]={exports:{}};return s[e].call(n.exports,n,n.exports,d),n.exports}d.m=s,e=[],d.O=function(t,n,o,r){if(!n){var c=1/0;for(f=0;f=r)&&Object.keys(d.O).every((function(e){return d.O[e](n[s])}))?n.splice(s--,1):(i=!1,r0&&e[f-1][2]>r;f--)e[f]=e[f-1];e[f]=[n,o,r]},d.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return d.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},d.t=function(e,o){if(1&o&&(e=this(e)),8&o)return e;if("object"==typeof e&&e){if(4&o&&e.__esModule)return e;if(16&o&&"function"==typeof e.then)return e}var r=Object.create(null);d.r(r);var c={};t=t||[null,n({}),n([]),n(n)];for(var i=2&o&&e;"object"==typeof i&&!~t.indexOf(i);i=n(i))Object.getOwnPropertyNames(i).forEach((function(t){c[t]=function(){return e[t]}}));return c.default=function(){return e},d.d(r,c),r},d.d=function(e,t){for(var n in t)d.o(t,n)&&!d.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},d.f={},d.e=function(e){return Promise.all(Object.keys(d.f).reduce((function(t,n){return d.f[n](e,t),t}),[]))},d.u=function(e){return{19:"component---src-templates-post-index-js-content-file-path-src-components-install-beta-mdx",77:"component---src-templates-post-index-js-content-file-path-content-posts-inject-scripts-with-blob-urls-md",125:"component---src-templates-post-index-js-content-file-path-content-index-md",130:"component---src-templates-post-index-js-content-file-path-content-api-metadata-block-md",146:"component---src-templates-post-index-js-content-file-path-content-api-gm-md",152:"component---src-templates-post-index-js-content-file-path-content-get-it-index-md",198:"c5a3695c8d75dc4f08b1dd07d707efd756d62ecd",247:"component---src-templates-post-index-js-content-file-path-src-components-install-stable-mdx",306:"component---cache-caches-gatsby-plugin-offline-app-shell-js",346:"component---src-templates-post-index-js-content-file-path-content-privacy-index-md",410:"component---src-templates-post-index-js-content-file-path-content-guide-keyboard-shortcuts-index-mdx",532:"styles",538:"component---src-templates-post-index-js-content-file-path-content-posts-features-in-userscript-generator-md",559:"component---src-templates-post-index-js-content-file-path-content-guide-creating-a-userscript-index-md",589:"component---src-templates-post-index-js-content-file-path-content-api-matching-md",634:"component---src-templates-post-index-js-content-file-path-content-guide-using-modern-syntax-index-md",638:"component---src-templates-post-index-js-content-file-path-content-posts-smart-rules-for-blacklist-md",668:"component---src-templates-post-index-js-content-file-path-content-posts-violentmonkey-workflows-md",693:"component---src-templates-post-index-js-content-file-path-content-faq-index-md",763:"component---src-templates-post-index-js-content-file-path-content-localization-index-md",810:"component---src-templates-post-index-js-content-file-path-content-guide-observing-dom-index-md",877:"component---src-templates-post-index-js-content-file-path-content-posts-inject-into-context-md",883:"component---src-pages-404-js",898:"component---src-templates-post-index-js-content-file-path-content-posts-how-to-edit-scripts-with-your-favorite-editor-index-md",986:"component---src-pages-posts-js"}[e]+"-"+{19:"72fc2c577f47a95406c1",77:"0c7e8eef22e98f312597",125:"1c6d23836a98d9fe83d7",130:"e0225f93d9e68bdcccfe",146:"8b41ac603591ac6753ab",152:"8232a8ad579335aa0806",198:"d2251742f874e379db01",247:"c82902d8e42e2b5f3f9a",306:"cb64605f204f20d86cc6",346:"898886663a86da785181",410:"c5dc6c0850e752ed7672",532:"e1a76b39b90f585f4017",538:"e37afad40b0497c9ed43",559:"01d374f92879a9944d67",589:"e8309d58c91945d209b3",634:"c8d9414d661bc1988e6a",638:"5c1bf3efdbc84e6dc9c3",668:"b8ea341c5a9e5271cf8d",693:"3e073515d5b7aee08895",763:"430734c217f1c5151033",810:"10aeee7f45ced0a15aa3",877:"426a002ac27e601f0947",883:"f492d11d80ac96643791",898:"04fa65d69f1f9d7bf5eb",986:"2af8287b24b85f8a349a"}[e]+".js"},d.miniCssF=function(e){return"styles.7152d3656b4955d5b035.css"},d.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),d.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},o={},r="violentmonkey.github.io:",d.l=function(e,t,n,c){if(o[e])o[e].push(t);else{var i,s;if(void 0!==n)for(var a=document.getElementsByTagName("script"),f=0;f 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? function(obj) { return Object.getPrototypeOf(obj); } : function(obj) { return obj.__proto__; };\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach(function(key) { def[key] = function() { return value[key]; }; });\n\t}\n\tdef['default'] = function() { return value; };\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"violentmonkey.github.io:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","var createStylesheet = function(chunkId, fullhref, resolve, reject) {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tvar onLinkComplete = function(event) {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + realHref + \")\");\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tlinkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\tdocument.head.appendChild(linkTag);\n\treturn linkTag;\n};\nvar findStylesheet = function(href, fullhref) {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = function(chunkId) {\n\treturn new Promise(function(resolve, reject) {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t658: 0\n};\n\n__webpack_require__.f.miniCss = function(chunkId, promises) {\n\tvar cssChunks = {\"532\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(function() {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, function(e) {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + {\"19\":\"component---src-templates-post-index-js-content-file-path-src-components-install-beta-mdx\",\"77\":\"component---src-templates-post-index-js-content-file-path-content-posts-inject-scripts-with-blob-urls-md\",\"125\":\"component---src-templates-post-index-js-content-file-path-content-index-md\",\"130\":\"component---src-templates-post-index-js-content-file-path-content-api-metadata-block-md\",\"146\":\"component---src-templates-post-index-js-content-file-path-content-api-gm-md\",\"152\":\"component---src-templates-post-index-js-content-file-path-content-get-it-index-md\",\"198\":\"c5a3695c8d75dc4f08b1dd07d707efd756d62ecd\",\"247\":\"component---src-templates-post-index-js-content-file-path-src-components-install-stable-mdx\",\"306\":\"component---cache-caches-gatsby-plugin-offline-app-shell-js\",\"346\":\"component---src-templates-post-index-js-content-file-path-content-privacy-index-md\",\"410\":\"component---src-templates-post-index-js-content-file-path-content-guide-keyboard-shortcuts-index-mdx\",\"532\":\"styles\",\"538\":\"component---src-templates-post-index-js-content-file-path-content-posts-features-in-userscript-generator-md\",\"559\":\"component---src-templates-post-index-js-content-file-path-content-guide-creating-a-userscript-index-md\",\"589\":\"component---src-templates-post-index-js-content-file-path-content-api-matching-md\",\"634\":\"component---src-templates-post-index-js-content-file-path-content-guide-using-modern-syntax-index-md\",\"638\":\"component---src-templates-post-index-js-content-file-path-content-posts-smart-rules-for-blacklist-md\",\"668\":\"component---src-templates-post-index-js-content-file-path-content-posts-violentmonkey-workflows-md\",\"693\":\"component---src-templates-post-index-js-content-file-path-content-faq-index-md\",\"763\":\"component---src-templates-post-index-js-content-file-path-content-localization-index-md\",\"810\":\"component---src-templates-post-index-js-content-file-path-content-guide-observing-dom-index-md\",\"877\":\"component---src-templates-post-index-js-content-file-path-content-posts-inject-into-context-md\",\"883\":\"component---src-pages-404-js\",\"898\":\"component---src-templates-post-index-js-content-file-path-content-posts-how-to-edit-scripts-with-your-favorite-editor-index-md\",\"986\":\"component---src-pages-posts-js\"}[chunkId] + \"-\" + {\"19\":\"72fc2c577f47a95406c1\",\"77\":\"0c7e8eef22e98f312597\",\"125\":\"1c6d23836a98d9fe83d7\",\"130\":\"e0225f93d9e68bdcccfe\",\"146\":\"8b41ac603591ac6753ab\",\"152\":\"8232a8ad579335aa0806\",\"198\":\"d2251742f874e379db01\",\"247\":\"c82902d8e42e2b5f3f9a\",\"306\":\"cb64605f204f20d86cc6\",\"346\":\"898886663a86da785181\",\"410\":\"c5dc6c0850e752ed7672\",\"532\":\"e1a76b39b90f585f4017\",\"538\":\"e37afad40b0497c9ed43\",\"559\":\"01d374f92879a9944d67\",\"589\":\"e8309d58c91945d209b3\",\"634\":\"c8d9414d661bc1988e6a\",\"638\":\"5c1bf3efdbc84e6dc9c3\",\"668\":\"b8ea341c5a9e5271cf8d\",\"693\":\"3e073515d5b7aee08895\",\"763\":\"430734c217f1c5151033\",\"810\":\"10aeee7f45ced0a15aa3\",\"877\":\"426a002ac27e601f0947\",\"883\":\"f492d11d80ac96643791\",\"898\":\"04fa65d69f1f9d7bf5eb\",\"986\":\"2af8287b24b85f8a349a\"}[chunkId] + \".js\";\n};","// This function allow to reference all chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + \"styles\" + \".\" + \"7152d3656b4955d5b035\" + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t658: 0,\n\t532: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(!/^(532|658)$/.test(chunkId)) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkviolentmonkey_github_io\"] = self[\"webpackChunkviolentmonkey_github_io\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","loadStylesheet","installedCssChunks","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","call","m","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","key","splice","r","n","getter","__esModule","d","a","getPrototypeOf","obj","__proto__","t","value","mode","this","then","ns","create","def","current","indexOf","getOwnPropertyNames","forEach","definition","o","defineProperty","enumerable","get","f","e","chunkId","Promise","all","reduce","promises","u","miniCssF","g","globalThis","Function","window","prop","prototype","hasOwnProperty","l","url","done","push","script","needAttach","scripts","document","getElementsByTagName","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","setTimeout","bind","type","target","head","appendChild","Symbol","toStringTag","p","resolve","reject","href","fullhref","existingLinkTags","dataHref","tag","rel","existingStyleTags","findStylesheet","linkTag","errorType","realHref","err","Error","code","request","createStylesheet","miniCss","installedChunks","installedChunkData","test","promise","error","realSrc","message","name","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","id","chunkLoadingGlobal","self"],"sourceRoot":""} \ No newline at end of file diff --git a/webpack.stats.json b/webpack.stats.json new file mode 100644 index 00000000..ee6ceeeb --- /dev/null +++ b/webpack.stats.json @@ -0,0 +1 @@ +{"name":"build-javascript","namedChunkGroups":{"polyfill":{"name":"polyfill","assets":[{"name":"webpack-runtime-9331f5e1790af6c863ed.js","size":7582},{"name":"polyfill-c7af91edbbea3673745d.js","size":98295}],"filteredAssets":0,"assetsSize":105877,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":272920},"app":{"name":"app","assets":[{"name":"webpack-runtime-9331f5e1790af6c863ed.js","size":7582},{"name":"styles.7152d3656b4955d5b035.css","size":17248},{"name":"app-64f2811254713e6e49a8.js","size":298350}],"filteredAssets":0,"assetsSize":323180,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":1055606},"component---cache-caches-gatsby-plugin-offline-app-shell-js":{"name":"component---cache-caches-gatsby-plugin-offline-app-shell-js","assets":[{"name":"component---cache-caches-gatsby-plugin-offline-app-shell-js-cb64605f204f20d86cc6.js","size":540}],"filteredAssets":0,"assetsSize":540,"filteredAuxiliaryAssets":1,"auxiliaryAssetsSize":1660},"component---src-pages-404-js":{"name":"component---src-pages-404-js","assets":[{"name":"styles.7152d3656b4955d5b035.css","size":17248},{"name":"component---src-pages-404-js-f492d11d80ac96643791.js","size":6481}],"filteredAssets":0,"assetsSize":23729,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":28429},"component---src-pages-posts-js":{"name":"component---src-pages-posts-js","assets":[{"name":"styles.7152d3656b4955d5b035.css","size":17248},{"name":"component---src-pages-posts-js-2af8287b24b85f8a349a.js","size":6880}],"filteredAssets":0,"assetsSize":24128,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":30112},"component---src-templates-post-index-js-content-file-path-content-api-gm-md":{"name":"component---src-templates-post-index-js-content-file-path-content-api-gm-md","assets":[{"name":"styles.7152d3656b4955d5b035.css","size":17248},{"name":"component---src-templates-post-index-js-content-file-path-content-api-gm-md-8b41ac603591ac6753ab.js","size":82339}],"filteredAssets":0,"assetsSize":99587,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":193900},"component---src-templates-post-index-js-content-file-path-content-api-matching-md":{"name":"component---src-templates-post-index-js-content-file-path-content-api-matching-md","assets":[{"name":"styles.7152d3656b4955d5b035.css","size":17248},{"name":"component---src-templates-post-index-js-content-file-path-content-api-matching-md-e8309d58c91945d209b3.js","size":21562}],"filteredAssets":0,"assetsSize":38810,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":65151},"component---src-templates-post-index-js-content-file-path-content-api-metadata-block-md":{"name":"component---src-templates-post-index-js-content-file-path-content-api-metadata-block-md","assets":[{"name":"styles.7152d3656b4955d5b035.css","size":17248},{"name":"component---src-templates-post-index-js-content-file-path-content-api-metadata-block-md-e0225f93d9e68bdcccfe.js","size":38691}],"filteredAssets":0,"assetsSize":55939,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":96479},"component---src-templates-post-index-js-content-file-path-content-faq-index-md":{"name":"component---src-templates-post-index-js-content-file-path-content-faq-index-md","assets":[{"name":"styles.7152d3656b4955d5b035.css","size":17248},{"name":"component---src-templates-post-index-js-content-file-path-content-faq-index-md-3e073515d5b7aee08895.js","size":17019}],"filteredAssets":0,"assetsSize":34267,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":55231},"component---src-templates-post-index-js-content-file-path-content-get-it-index-md":{"name":"component---src-templates-post-index-js-content-file-path-content-get-it-index-md","assets":[{"name":"styles.7152d3656b4955d5b035.css","size":17248},{"name":"c5a3695c8d75dc4f08b1dd07d707efd756d62ecd-d2251742f874e379db01.js","size":20177},{"name":"component---src-templates-post-index-js-content-file-path-content-get-it-index-md-8232a8ad579335aa0806.js","size":17244}],"filteredAssets":0,"assetsSize":54669,"filteredAuxiliaryAssets":3,"auxiliaryAssetsSize":80483},"component---src-templates-post-index-js-content-file-path-content-guide-creating-a-userscript-index-md":{"name":"component---src-templates-post-index-js-content-file-path-content-guide-creating-a-userscript-index-md","assets":[{"name":"styles.7152d3656b4955d5b035.css","size":17248},{"name":"component---src-templates-post-index-js-content-file-path-content-guide-creating-a-userscript-index-md-01d374f92879a9944d67.js","size":18216}],"filteredAssets":0,"assetsSize":35464,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":57465},"component---src-templates-post-index-js-content-file-path-content-guide-keyboard-shortcuts-index-mdx":{"name":"component---src-templates-post-index-js-content-file-path-content-guide-keyboard-shortcuts-index-mdx","assets":[{"name":"styles.7152d3656b4955d5b035.css","size":17248},{"name":"component---src-templates-post-index-js-content-file-path-content-guide-keyboard-shortcuts-index-mdx-c5dc6c0850e752ed7672.js","size":24065}],"filteredAssets":0,"assetsSize":41313,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":72976},"component---src-templates-post-index-js-content-file-path-content-guide-observing-dom-index-md":{"name":"component---src-templates-post-index-js-content-file-path-content-guide-observing-dom-index-md","assets":[{"name":"styles.7152d3656b4955d5b035.css","size":17248},{"name":"component---src-templates-post-index-js-content-file-path-content-guide-observing-dom-index-md-10aeee7f45ced0a15aa3.js","size":28013}],"filteredAssets":0,"assetsSize":45261,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":80250},"component---src-templates-post-index-js-content-file-path-content-guide-using-modern-syntax-index-md":{"name":"component---src-templates-post-index-js-content-file-path-content-guide-using-modern-syntax-index-md","assets":[{"name":"styles.7152d3656b4955d5b035.css","size":17248},{"name":"component---src-templates-post-index-js-content-file-path-content-guide-using-modern-syntax-index-md-c8d9414d661bc1988e6a.js","size":20053}],"filteredAssets":0,"assetsSize":37301,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":62418},"component---src-templates-post-index-js-content-file-path-content-index-md":{"name":"component---src-templates-post-index-js-content-file-path-content-index-md","assets":[{"name":"styles.7152d3656b4955d5b035.css","size":17248},{"name":"c5a3695c8d75dc4f08b1dd07d707efd756d62ecd-d2251742f874e379db01.js","size":20177},{"name":"component---src-templates-post-index-js-content-file-path-content-index-md-1c6d23836a98d9fe83d7.js","size":6624}],"filteredAssets":0,"assetsSize":44049,"filteredAuxiliaryAssets":3,"auxiliaryAssetsSize":68383},"component---src-templates-post-index-js-content-file-path-content-localization-index-md":{"name":"component---src-templates-post-index-js-content-file-path-content-localization-index-md","assets":[{"name":"styles.7152d3656b4955d5b035.css","size":17248},{"name":"component---src-templates-post-index-js-content-file-path-content-localization-index-md-430734c217f1c5151033.js","size":13495}],"filteredAssets":0,"assetsSize":30743,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":50564},"component---src-templates-post-index-js-content-file-path-content-posts-features-in-userscript-generator-md":{"name":"component---src-templates-post-index-js-content-file-path-content-posts-features-in-userscript-generator-md","assets":[{"name":"styles.7152d3656b4955d5b035.css","size":17248},{"name":"component---src-templates-post-index-js-content-file-path-content-posts-features-in-userscript-generator-md-e37afad40b0497c9ed43.js","size":18504}],"filteredAssets":0,"assetsSize":35752,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":58533},"component---src-templates-post-index-js-content-file-path-content-posts-how-to-edit-scripts-with-your-favorite-editor-index-md":{"name":"component---src-templates-post-index-js-content-file-path-content-posts-how-to-edit-scripts-with-your-favorite-editor-index-md","assets":[{"name":"styles.7152d3656b4955d5b035.css","size":17248},{"name":"component---src-templates-post-index-js-content-file-path-content-posts-how-to-edit-scripts-with-your-favorite-editor-index-md-04fa65d69f1f9d7bf5eb.js","size":28565}],"filteredAssets":0,"assetsSize":45813,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":69935},"component---src-templates-post-index-js-content-file-path-content-posts-inject-into-context-md":{"name":"component---src-templates-post-index-js-content-file-path-content-posts-inject-into-context-md","assets":[{"name":"styles.7152d3656b4955d5b035.css","size":17248},{"name":"component---src-templates-post-index-js-content-file-path-content-posts-inject-into-context-md-426a002ac27e601f0947.js","size":24421}],"filteredAssets":0,"assetsSize":41669,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":72022},"component---src-templates-post-index-js-content-file-path-content-posts-inject-scripts-with-blob-urls-md":{"name":"component---src-templates-post-index-js-content-file-path-content-posts-inject-scripts-with-blob-urls-md","assets":[{"name":"styles.7152d3656b4955d5b035.css","size":17248},{"name":"component---src-templates-post-index-js-content-file-path-content-posts-inject-scripts-with-blob-urls-md-0c7e8eef22e98f312597.js","size":30669}],"filteredAssets":0,"assetsSize":47917,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":87661},"component---src-templates-post-index-js-content-file-path-content-posts-smart-rules-for-blacklist-md":{"name":"component---src-templates-post-index-js-content-file-path-content-posts-smart-rules-for-blacklist-md","assets":[{"name":"styles.7152d3656b4955d5b035.css","size":17248},{"name":"component---src-templates-post-index-js-content-file-path-content-posts-smart-rules-for-blacklist-md-5c1bf3efdbc84e6dc9c3.js","size":17573}],"filteredAssets":0,"assetsSize":34821,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":58835},"component---src-templates-post-index-js-content-file-path-content-posts-violentmonkey-workflows-md":{"name":"component---src-templates-post-index-js-content-file-path-content-posts-violentmonkey-workflows-md","assets":[{"name":"styles.7152d3656b4955d5b035.css","size":17248},{"name":"component---src-templates-post-index-js-content-file-path-content-posts-violentmonkey-workflows-md-b8ea341c5a9e5271cf8d.js","size":22223}],"filteredAssets":0,"assetsSize":39471,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":62482},"component---src-templates-post-index-js-content-file-path-content-privacy-index-md":{"name":"component---src-templates-post-index-js-content-file-path-content-privacy-index-md","assets":[{"name":"styles.7152d3656b4955d5b035.css","size":17248},{"name":"component---src-templates-post-index-js-content-file-path-content-privacy-index-md-898886663a86da785181.js","size":15429}],"filteredAssets":0,"assetsSize":32677,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":52580},"component---src-templates-post-index-js-content-file-path-src-components-install-beta-mdx":{"name":"component---src-templates-post-index-js-content-file-path-src-components-install-beta-mdx","assets":[{"name":"styles.7152d3656b4955d5b035.css","size":17248},{"name":"component---src-templates-post-index-js-content-file-path-src-components-install-beta-mdx-72fc2c577f47a95406c1.js","size":16017}],"filteredAssets":0,"assetsSize":33265,"filteredAuxiliaryAssets":2,"auxiliaryAssetsSize":51256},"component---src-templates-post-index-js-content-file-path-src-components-install-stable-mdx":{"name":"component---src-templates-post-index-js-content-file-path-src-components-install-stable-mdx","assets":[{"name":"styles.7152d3656b4955d5b035.css","size":17248},{"name":"c5a3695c8d75dc4f08b1dd07d707efd756d62ecd-d2251742f874e379db01.js","size":20177},{"name":"component---src-templates-post-index-js-content-file-path-src-components-install-stable-mdx-c82902d8e42e2b5f3f9a.js","size":1187}],"filteredAssets":0,"assetsSize":38612,"filteredAuxiliaryAssets":3,"auxiliaryAssetsSize":57430}},"assetsByChunkName":{"polyfill":["webpack-runtime-9331f5e1790af6c863ed.js","polyfill-c7af91edbbea3673745d.js"],"app":["webpack-runtime-9331f5e1790af6c863ed.js","styles.7152d3656b4955d5b035.css","app-64f2811254713e6e49a8.js"],"component---cache-caches-gatsby-plugin-offline-app-shell-js":["component---cache-caches-gatsby-plugin-offline-app-shell-js-cb64605f204f20d86cc6.js"],"component---src-pages-404-js":["styles.7152d3656b4955d5b035.css","component---src-pages-404-js-f492d11d80ac96643791.js"],"component---src-pages-posts-js":["styles.7152d3656b4955d5b035.css","component---src-pages-posts-js-2af8287b24b85f8a349a.js"],"component---src-templates-post-index-js-content-file-path-content-api-gm-md":["styles.7152d3656b4955d5b035.css","component---src-templates-post-index-js-content-file-path-content-api-gm-md-8b41ac603591ac6753ab.js"],"component---src-templates-post-index-js-content-file-path-content-api-matching-md":["styles.7152d3656b4955d5b035.css","component---src-templates-post-index-js-content-file-path-content-api-matching-md-e8309d58c91945d209b3.js"],"component---src-templates-post-index-js-content-file-path-content-api-metadata-block-md":["styles.7152d3656b4955d5b035.css","component---src-templates-post-index-js-content-file-path-content-api-metadata-block-md-e0225f93d9e68bdcccfe.js"],"component---src-templates-post-index-js-content-file-path-content-faq-index-md":["styles.7152d3656b4955d5b035.css","component---src-templates-post-index-js-content-file-path-content-faq-index-md-3e073515d5b7aee08895.js"],"component---src-templates-post-index-js-content-file-path-content-get-it-index-md":["styles.7152d3656b4955d5b035.css","c5a3695c8d75dc4f08b1dd07d707efd756d62ecd-d2251742f874e379db01.js","component---src-templates-post-index-js-content-file-path-content-get-it-index-md-8232a8ad579335aa0806.js"],"component---src-templates-post-index-js-content-file-path-content-guide-creating-a-userscript-index-md":["styles.7152d3656b4955d5b035.css","component---src-templates-post-index-js-content-file-path-content-guide-creating-a-userscript-index-md-01d374f92879a9944d67.js"],"component---src-templates-post-index-js-content-file-path-content-guide-keyboard-shortcuts-index-mdx":["styles.7152d3656b4955d5b035.css","component---src-templates-post-index-js-content-file-path-content-guide-keyboard-shortcuts-index-mdx-c5dc6c0850e752ed7672.js"],"component---src-templates-post-index-js-content-file-path-content-guide-observing-dom-index-md":["styles.7152d3656b4955d5b035.css","component---src-templates-post-index-js-content-file-path-content-guide-observing-dom-index-md-10aeee7f45ced0a15aa3.js"],"component---src-templates-post-index-js-content-file-path-content-guide-using-modern-syntax-index-md":["styles.7152d3656b4955d5b035.css","component---src-templates-post-index-js-content-file-path-content-guide-using-modern-syntax-index-md-c8d9414d661bc1988e6a.js"],"component---src-templates-post-index-js-content-file-path-content-index-md":["styles.7152d3656b4955d5b035.css","c5a3695c8d75dc4f08b1dd07d707efd756d62ecd-d2251742f874e379db01.js","component---src-templates-post-index-js-content-file-path-content-index-md-1c6d23836a98d9fe83d7.js"],"component---src-templates-post-index-js-content-file-path-content-localization-index-md":["styles.7152d3656b4955d5b035.css","component---src-templates-post-index-js-content-file-path-content-localization-index-md-430734c217f1c5151033.js"],"component---src-templates-post-index-js-content-file-path-content-posts-features-in-userscript-generator-md":["styles.7152d3656b4955d5b035.css","component---src-templates-post-index-js-content-file-path-content-posts-features-in-userscript-generator-md-e37afad40b0497c9ed43.js"],"component---src-templates-post-index-js-content-file-path-content-posts-how-to-edit-scripts-with-your-favorite-editor-index-md":["styles.7152d3656b4955d5b035.css","component---src-templates-post-index-js-content-file-path-content-posts-how-to-edit-scripts-with-your-favorite-editor-index-md-04fa65d69f1f9d7bf5eb.js"],"component---src-templates-post-index-js-content-file-path-content-posts-inject-into-context-md":["styles.7152d3656b4955d5b035.css","component---src-templates-post-index-js-content-file-path-content-posts-inject-into-context-md-426a002ac27e601f0947.js"],"component---src-templates-post-index-js-content-file-path-content-posts-inject-scripts-with-blob-urls-md":["styles.7152d3656b4955d5b035.css","component---src-templates-post-index-js-content-file-path-content-posts-inject-scripts-with-blob-urls-md-0c7e8eef22e98f312597.js"],"component---src-templates-post-index-js-content-file-path-content-posts-smart-rules-for-blacklist-md":["styles.7152d3656b4955d5b035.css","component---src-templates-post-index-js-content-file-path-content-posts-smart-rules-for-blacklist-md-5c1bf3efdbc84e6dc9c3.js"],"component---src-templates-post-index-js-content-file-path-content-posts-violentmonkey-workflows-md":["styles.7152d3656b4955d5b035.css","component---src-templates-post-index-js-content-file-path-content-posts-violentmonkey-workflows-md-b8ea341c5a9e5271cf8d.js"],"component---src-templates-post-index-js-content-file-path-content-privacy-index-md":["styles.7152d3656b4955d5b035.css","component---src-templates-post-index-js-content-file-path-content-privacy-index-md-898886663a86da785181.js"],"component---src-templates-post-index-js-content-file-path-src-components-install-beta-mdx":["styles.7152d3656b4955d5b035.css","component---src-templates-post-index-js-content-file-path-src-components-install-beta-mdx-72fc2c577f47a95406c1.js"],"component---src-templates-post-index-js-content-file-path-src-components-install-stable-mdx":["styles.7152d3656b4955d5b035.css","c5a3695c8d75dc4f08b1dd07d707efd756d62ecd-d2251742f874e379db01.js","component---src-templates-post-index-js-content-file-path-src-components-install-stable-mdx-c82902d8e42e2b5f3f9a.js"]},"childAssetsByChunkName":{}} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-background-sync.dev.js b/workbox-v4.3.1/workbox-background-sync.dev.js new file mode 100644 index 00000000..1a3eddc3 --- /dev/null +++ b/workbox-v4.3.1/workbox-background-sync.dev.js @@ -0,0 +1,822 @@ +this.workbox = this.workbox || {}; +this.workbox.backgroundSync = (function (exports, WorkboxError_mjs, logger_mjs, assert_mjs, getFriendlyURL_mjs, DBWrapper_mjs) { + 'use strict'; + + try { + self['workbox:background-sync:4.3.1'] && _(); + } catch (e) {} // eslint-disable-line + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const DB_VERSION = 3; + const DB_NAME = 'workbox-background-sync'; + const OBJECT_STORE_NAME = 'requests'; + const INDEXED_PROP = 'queueName'; + /** + * A class to manage storing requests from a Queue in IndexedbDB, + * indexed by their queue name for easier access. + * + * @private + */ + + class QueueStore { + /** + * Associates this instance with a Queue instance, so entries added can be + * identified by their queue name. + * + * @param {string} queueName + * @private + */ + constructor(queueName) { + this._queueName = queueName; + this._db = new DBWrapper_mjs.DBWrapper(DB_NAME, DB_VERSION, { + onupgradeneeded: this._upgradeDb + }); + } + /** + * Append an entry last in the queue. + * + * @param {Object} entry + * @param {Object} entry.requestData + * @param {number} [entry.timestamp] + * @param {Object} [entry.metadata] + * @private + */ + + + async pushEntry(entry) { + { + assert_mjs.assert.isType(entry, 'object', { + moduleName: 'workbox-background-sync', + className: 'QueueStore', + funcName: 'pushEntry', + paramName: 'entry' + }); + assert_mjs.assert.isType(entry.requestData, 'object', { + moduleName: 'workbox-background-sync', + className: 'QueueStore', + funcName: 'pushEntry', + paramName: 'entry.requestData' + }); + } // Don't specify an ID since one is automatically generated. + + + delete entry.id; + entry.queueName = this._queueName; + await this._db.add(OBJECT_STORE_NAME, entry); + } + /** + * Preppend an entry first in the queue. + * + * @param {Object} entry + * @param {Object} entry.requestData + * @param {number} [entry.timestamp] + * @param {Object} [entry.metadata] + * @private + */ + + + async unshiftEntry(entry) { + { + assert_mjs.assert.isType(entry, 'object', { + moduleName: 'workbox-background-sync', + className: 'QueueStore', + funcName: 'unshiftEntry', + paramName: 'entry' + }); + assert_mjs.assert.isType(entry.requestData, 'object', { + moduleName: 'workbox-background-sync', + className: 'QueueStore', + funcName: 'unshiftEntry', + paramName: 'entry.requestData' + }); + } + + const [firstEntry] = await this._db.getAllMatching(OBJECT_STORE_NAME, { + count: 1 + }); + + if (firstEntry) { + // Pick an ID one less than the lowest ID in the object store. + entry.id = firstEntry.id - 1; + } else { + // Otherwise let the auto-incrementor assign the ID. + delete entry.id; + } + + entry.queueName = this._queueName; + await this._db.add(OBJECT_STORE_NAME, entry); + } + /** + * Removes and returns the last entry in the queue matching the `queueName`. + * + * @return {Promise} + * @private + */ + + + async popEntry() { + return this._removeEntry({ + direction: 'prev' + }); + } + /** + * Removes and returns the first entry in the queue matching the `queueName`. + * + * @return {Promise} + * @private + */ + + + async shiftEntry() { + return this._removeEntry({ + direction: 'next' + }); + } + /** + * Returns all entries in the store matching the `queueName`. + * + * @param {Object} options See workbox.backgroundSync.Queue~getAll} + * @return {Promise>} + * @private + */ + + + async getAll() { + return await this._db.getAllMatching(OBJECT_STORE_NAME, { + index: INDEXED_PROP, + query: IDBKeyRange.only(this._queueName) + }); + } + /** + * Deletes the entry for the given ID. + * + * WARNING: this method does not ensure the deleted enry belongs to this + * queue (i.e. matches the `queueName`). But this limitation is acceptable + * as this class is not publicly exposed. An additional check would make + * this method slower than it needs to be. + * + * @private + * @param {number} id + */ + + + async deleteEntry(id) { + await this._db.delete(OBJECT_STORE_NAME, id); + } + /** + * Removes and returns the first or last entry in the queue (based on the + * `direction` argument) matching the `queueName`. + * + * @return {Promise} + * @private + */ + + + async _removeEntry({ + direction + }) { + const [entry] = await this._db.getAllMatching(OBJECT_STORE_NAME, { + direction, + index: INDEXED_PROP, + query: IDBKeyRange.only(this._queueName), + count: 1 + }); + + if (entry) { + await this.deleteEntry(entry.id); + return entry; + } + } + /** + * Upgrades the database given an `upgradeneeded` event. + * + * @param {Event} event + * @private + */ + + + _upgradeDb(event) { + const db = event.target.result; + + if (event.oldVersion > 0 && event.oldVersion < DB_VERSION) { + if (db.objectStoreNames.contains(OBJECT_STORE_NAME)) { + db.deleteObjectStore(OBJECT_STORE_NAME); + } + } + + const objStore = db.createObjectStore(OBJECT_STORE_NAME, { + autoIncrement: true, + keyPath: 'id' + }); + objStore.createIndex(INDEXED_PROP, INDEXED_PROP, { + unique: false + }); + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const serializableProperties = ['method', 'referrer', 'referrerPolicy', 'mode', 'credentials', 'cache', 'redirect', 'integrity', 'keepalive']; + /** + * A class to make it easier to serialize and de-serialize requests so they + * can be stored in IndexedDB. + * + * @private + */ + + class StorableRequest { + /** + * Converts a Request object to a plain object that can be structured + * cloned or JSON-stringified. + * + * @param {Request} request + * @return {Promise} + * + * @private + */ + static async fromRequest(request) { + const requestData = { + url: request.url, + headers: {} + }; // Set the body if present. + + if (request.method !== 'GET') { + // Use ArrayBuffer to support non-text request bodies. + // NOTE: we can't use Blobs becuse Safari doesn't support storing + // Blobs in IndexedDB in some cases: + // https://github.com/dfahlander/Dexie.js/issues/618#issuecomment-398348457 + requestData.body = await request.clone().arrayBuffer(); + } // Convert the headers from an iterable to an object. + + + for (const [key, value] of request.headers.entries()) { + requestData.headers[key] = value; + } // Add all other serializable request properties + + + for (const prop of serializableProperties) { + if (request[prop] !== undefined) { + requestData[prop] = request[prop]; + } + } + + return new StorableRequest(requestData); + } + /** + * Accepts an object of request data that can be used to construct a + * `Request` but can also be stored in IndexedDB. + * + * @param {Object} requestData An object of request data that includes the + * `url` plus any relevant properties of + * [requestInit]{@link https://fetch.spec.whatwg.org/#requestinit}. + * @private + */ + + + constructor(requestData) { + { + assert_mjs.assert.isType(requestData, 'object', { + moduleName: 'workbox-background-sync', + className: 'StorableRequest', + funcName: 'constructor', + paramName: 'requestData' + }); + assert_mjs.assert.isType(requestData.url, 'string', { + moduleName: 'workbox-background-sync', + className: 'StorableRequest', + funcName: 'constructor', + paramName: 'requestData.url' + }); + } // If the request's mode is `navigate`, convert it to `same-origin` since + // navigation requests can't be constructed via script. + + + if (requestData.mode === 'navigate') { + requestData.mode = 'same-origin'; + } + + this._requestData = requestData; + } + /** + * Returns a deep clone of the instances `_requestData` object. + * + * @return {Object} + * + * @private + */ + + + toObject() { + const requestData = Object.assign({}, this._requestData); + requestData.headers = Object.assign({}, this._requestData.headers); + + if (requestData.body) { + requestData.body = requestData.body.slice(0); + } + + return requestData; + } + /** + * Converts this instance to a Request. + * + * @return {Request} + * + * @private + */ + + + toRequest() { + return new Request(this._requestData.url, this._requestData); + } + /** + * Creates and returns a deep clone of the instance. + * + * @return {StorableRequest} + * + * @private + */ + + + clone() { + return new StorableRequest(this.toObject()); + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const TAG_PREFIX = 'workbox-background-sync'; + const MAX_RETENTION_TIME = 60 * 24 * 7; // 7 days in minutes + + const queueNames = new Set(); + /** + * A class to manage storing failed requests in IndexedDB and retrying them + * later. All parts of the storing and replaying process are observable via + * callbacks. + * + * @memberof workbox.backgroundSync + */ + + class Queue { + /** + * Creates an instance of Queue with the given options + * + * @param {string} name The unique name for this queue. This name must be + * unique as it's used to register sync events and store requests + * in IndexedDB specific to this instance. An error will be thrown if + * a duplicate name is detected. + * @param {Object} [options] + * @param {Function} [options.onSync] A function that gets invoked whenever + * the 'sync' event fires. The function is invoked with an object + * containing the `queue` property (referencing this instance), and you + * can use the callback to customize the replay behavior of the queue. + * When not set the `replayRequests()` method is called. + * Note: if the replay fails after a sync event, make sure you throw an + * error, so the browser knows to retry the sync event later. + * @param {number} [options.maxRetentionTime=7 days] The amount of time (in + * minutes) a request may be retried. After this amount of time has + * passed, the request will be deleted from the queue. + */ + constructor(name, { + onSync, + maxRetentionTime + } = {}) { + // Ensure the store name is not already being used + if (queueNames.has(name)) { + throw new WorkboxError_mjs.WorkboxError('duplicate-queue-name', { + name + }); + } else { + queueNames.add(name); + } + + this._name = name; + this._onSync = onSync || this.replayRequests; + this._maxRetentionTime = maxRetentionTime || MAX_RETENTION_TIME; + this._queueStore = new QueueStore(this._name); + + this._addSyncListener(); + } + /** + * @return {string} + */ + + + get name() { + return this._name; + } + /** + * Stores the passed request in IndexedDB (with its timestamp and any + * metadata) at the end of the queue. + * + * @param {Object} entry + * @param {Request} entry.request The request to store in the queue. + * @param {Object} [entry.metadata] Any metadata you want associated with the + * stored request. When requests are replayed you'll have access to this + * metadata object in case you need to modify the request beforehand. + * @param {number} [entry.timestamp] The timestamp (Epoch time in + * milliseconds) when the request was first added to the queue. This is + * used along with `maxRetentionTime` to remove outdated requests. In + * general you don't need to set this value, as it's automatically set + * for you (defaulting to `Date.now()`), but you can update it if you + * don't want particular requests to expire. + */ + + + async pushRequest(entry) { + { + assert_mjs.assert.isType(entry, 'object', { + moduleName: 'workbox-background-sync', + className: 'Queue', + funcName: 'pushRequest', + paramName: 'entry' + }); + assert_mjs.assert.isInstance(entry.request, Request, { + moduleName: 'workbox-background-sync', + className: 'Queue', + funcName: 'pushRequest', + paramName: 'entry.request' + }); + } + + await this._addRequest(entry, 'push'); + } + /** + * Stores the passed request in IndexedDB (with its timestamp and any + * metadata) at the beginning of the queue. + * + * @param {Object} entry + * @param {Request} entry.request The request to store in the queue. + * @param {Object} [entry.metadata] Any metadata you want associated with the + * stored request. When requests are replayed you'll have access to this + * metadata object in case you need to modify the request beforehand. + * @param {number} [entry.timestamp] The timestamp (Epoch time in + * milliseconds) when the request was first added to the queue. This is + * used along with `maxRetentionTime` to remove outdated requests. In + * general you don't need to set this value, as it's automatically set + * for you (defaulting to `Date.now()`), but you can update it if you + * don't want particular requests to expire. + */ + + + async unshiftRequest(entry) { + { + assert_mjs.assert.isType(entry, 'object', { + moduleName: 'workbox-background-sync', + className: 'Queue', + funcName: 'unshiftRequest', + paramName: 'entry' + }); + assert_mjs.assert.isInstance(entry.request, Request, { + moduleName: 'workbox-background-sync', + className: 'Queue', + funcName: 'unshiftRequest', + paramName: 'entry.request' + }); + } + + await this._addRequest(entry, 'unshift'); + } + /** + * Removes and returns the last request in the queue (along with its + * timestamp and any metadata). The returned object takes the form: + * `{request, timestamp, metadata}`. + * + * @return {Promise} + */ + + + async popRequest() { + return this._removeRequest('pop'); + } + /** + * Removes and returns the first request in the queue (along with its + * timestamp and any metadata). The returned object takes the form: + * `{request, timestamp, metadata}`. + * + * @return {Promise} + */ + + + async shiftRequest() { + return this._removeRequest('shift'); + } + /** + * Returns all the entries that have not expired (per `maxRetentionTime`). + * Any expired entries are removed from the queue. + * + * @return {Promise>} + */ + + + async getAll() { + const allEntries = await this._queueStore.getAll(); + const now = Date.now(); + const unexpiredEntries = []; + + for (const entry of allEntries) { + // Ignore requests older than maxRetentionTime. Call this function + // recursively until an unexpired request is found. + const maxRetentionTimeInMs = this._maxRetentionTime * 60 * 1000; + + if (now - entry.timestamp > maxRetentionTimeInMs) { + await this._queueStore.deleteEntry(entry.id); + } else { + unexpiredEntries.push(convertEntry(entry)); + } + } + + return unexpiredEntries; + } + /** + * Adds the entry to the QueueStore and registers for a sync event. + * + * @param {Object} entry + * @param {Request} entry.request + * @param {Object} [entry.metadata] + * @param {number} [entry.timestamp=Date.now()] + * @param {string} operation ('push' or 'unshift') + * @private + */ + + + async _addRequest({ + request, + metadata, + timestamp = Date.now() + }, operation) { + const storableRequest = await StorableRequest.fromRequest(request.clone()); + const entry = { + requestData: storableRequest.toObject(), + timestamp + }; // Only include metadata if it's present. + + if (metadata) { + entry.metadata = metadata; + } + + await this._queueStore[`${operation}Entry`](entry); + + { + logger_mjs.logger.log(`Request for '${getFriendlyURL_mjs.getFriendlyURL(request.url)}' has ` + `been added to background sync queue '${this._name}'.`); + } // Don't register for a sync if we're in the middle of a sync. Instead, + // we wait until the sync is complete and call register if + // `this._requestsAddedDuringSync` is true. + + + if (this._syncInProgress) { + this._requestsAddedDuringSync = true; + } else { + await this.registerSync(); + } + } + /** + * Removes and returns the first or last (depending on `operation`) entry + * from the QueueStore that's not older than the `maxRetentionTime`. + * + * @param {string} operation ('pop' or 'shift') + * @return {Object|undefined} + * @private + */ + + + async _removeRequest(operation) { + const now = Date.now(); + const entry = await this._queueStore[`${operation}Entry`](); + + if (entry) { + // Ignore requests older than maxRetentionTime. Call this function + // recursively until an unexpired request is found. + const maxRetentionTimeInMs = this._maxRetentionTime * 60 * 1000; + + if (now - entry.timestamp > maxRetentionTimeInMs) { + return this._removeRequest(operation); + } + + return convertEntry(entry); + } + } + /** + * Loops through each request in the queue and attempts to re-fetch it. + * If any request fails to re-fetch, it's put back in the same position in + * the queue (which registers a retry for the next sync event). + */ + + + async replayRequests() { + let entry; + + while (entry = await this.shiftRequest()) { + try { + await fetch(entry.request.clone()); + + { + logger_mjs.logger.log(`Request for '${getFriendlyURL_mjs.getFriendlyURL(entry.request.url)}'` + `has been replayed in queue '${this._name}'`); + } + } catch (error) { + await this.unshiftRequest(entry); + + { + logger_mjs.logger.log(`Request for '${getFriendlyURL_mjs.getFriendlyURL(entry.request.url)}'` + `failed to replay, putting it back in queue '${this._name}'`); + } + + throw new WorkboxError_mjs.WorkboxError('queue-replay-failed', { + name: this._name + }); + } + } + + { + logger_mjs.logger.log(`All requests in queue '${this.name}' have successfully ` + `replayed; the queue is now empty!`); + } + } + /** + * Registers a sync event with a tag unique to this instance. + */ + + + async registerSync() { + if ('sync' in registration) { + try { + await registration.sync.register(`${TAG_PREFIX}:${this._name}`); + } catch (err) { + // This means the registration failed for some reason, possibly due to + // the user disabling it. + { + logger_mjs.logger.warn(`Unable to register sync event for '${this._name}'.`, err); + } + } + } + } + /** + * In sync-supporting browsers, this adds a listener for the sync event. + * In non-sync-supporting browsers, this will retry the queue on service + * worker startup. + * + * @private + */ + + + _addSyncListener() { + if ('sync' in registration) { + self.addEventListener('sync', event => { + if (event.tag === `${TAG_PREFIX}:${this._name}`) { + { + logger_mjs.logger.log(`Background sync for tag '${event.tag}'` + `has been received`); + } + + const syncComplete = async () => { + this._syncInProgress = true; + let syncError; + + try { + await this._onSync({ + queue: this + }); + } catch (error) { + syncError = error; // Rethrow the error. Note: the logic in the finally clause + // will run before this gets rethrown. + + throw syncError; + } finally { + // New items may have been added to the queue during the sync, + // so we need to register for a new sync if that's happened... + // Unless there was an error during the sync, in which + // case the browser will automatically retry later, as long + // as `event.lastChance` is not true. + if (this._requestsAddedDuringSync && !(syncError && !event.lastChance)) { + await this.registerSync(); + } + + this._syncInProgress = false; + this._requestsAddedDuringSync = false; + } + }; + + event.waitUntil(syncComplete()); + } + }); + } else { + { + logger_mjs.logger.log(`Background sync replaying without background sync event`); + } // If the browser doesn't support background sync, retry + // every time the service worker starts up as a fallback. + + + this._onSync({ + queue: this + }); + } + } + /** + * Returns the set of queue names. This is primarily used to reset the list + * of queue names in tests. + * + * @return {Set} + * + * @private + */ + + + static get _queueNames() { + return queueNames; + } + + } + /** + * Converts a QueueStore entry into the format exposed by Queue. This entails + * converting the request data into a real request and omitting the `id` and + * `queueName` properties. + * + * @param {Object} queueStoreEntry + * @return {Object} + * @private + */ + + + const convertEntry = queueStoreEntry => { + const queueEntry = { + request: new StorableRequest(queueStoreEntry.requestData).toRequest(), + timestamp: queueStoreEntry.timestamp + }; + + if (queueStoreEntry.metadata) { + queueEntry.metadata = queueStoreEntry.metadata; + } + + return queueEntry; + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * A class implementing the `fetchDidFail` lifecycle callback. This makes it + * easier to add failed requests to a background sync Queue. + * + * @memberof workbox.backgroundSync + */ + + class Plugin { + /** + * @param {...*} queueArgs Args to forward to the composed Queue instance. + * See the [Queue]{@link workbox.backgroundSync.Queue} documentation for + * parameter details. + */ + constructor(...queueArgs) { + this._queue = new Queue(...queueArgs); + this.fetchDidFail = this.fetchDidFail.bind(this); + } + /** + * @param {Object} options + * @param {Request} options.request + * @private + */ + + + async fetchDidFail({ + request + }) { + await this._queue.pushRequest({ + request + }); + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + + exports.Queue = Queue; + exports.Plugin = Plugin; + + return exports; + +}({}, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private)); +//# sourceMappingURL=workbox-background-sync.dev.js.map diff --git a/workbox-v4.3.1/workbox-background-sync.dev.js.map b/workbox-v4.3.1/workbox-background-sync.dev.js.map new file mode 100644 index 00000000..8d8cfc07 --- /dev/null +++ b/workbox-v4.3.1/workbox-background-sync.dev.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-background-sync.dev.js","sources":["../_version.mjs","../lib/QueueStore.mjs","../lib/StorableRequest.mjs","../Queue.mjs","../Plugin.mjs","../index.mjs"],"sourcesContent":["try{self['workbox:background-sync:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {DBWrapper} from 'workbox-core/_private/DBWrapper.mjs';\nimport '../_version.mjs';\n\n\nconst DB_VERSION = 3;\nconst DB_NAME = 'workbox-background-sync';\nconst OBJECT_STORE_NAME = 'requests';\nconst INDEXED_PROP = 'queueName';\n\n/**\n * A class to manage storing requests from a Queue in IndexedbDB,\n * indexed by their queue name for easier access.\n *\n * @private\n */\nexport class QueueStore {\n /**\n * Associates this instance with a Queue instance, so entries added can be\n * identified by their queue name.\n *\n * @param {string} queueName\n * @private\n */\n constructor(queueName) {\n this._queueName = queueName;\n this._db = new DBWrapper(DB_NAME, DB_VERSION, {\n onupgradeneeded: this._upgradeDb,\n });\n }\n\n /**\n * Append an entry last in the queue.\n *\n * @param {Object} entry\n * @param {Object} entry.requestData\n * @param {number} [entry.timestamp]\n * @param {Object} [entry.metadata]\n * @private\n */\n async pushEntry(entry) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(entry, 'object', {\n moduleName: 'workbox-background-sync',\n className: 'QueueStore',\n funcName: 'pushEntry',\n paramName: 'entry',\n });\n assert.isType(entry.requestData, 'object', {\n moduleName: 'workbox-background-sync',\n className: 'QueueStore',\n funcName: 'pushEntry',\n paramName: 'entry.requestData',\n });\n }\n\n // Don't specify an ID since one is automatically generated.\n delete entry.id;\n entry.queueName = this._queueName;\n\n await this._db.add(OBJECT_STORE_NAME, entry);\n }\n\n /**\n * Preppend an entry first in the queue.\n *\n * @param {Object} entry\n * @param {Object} entry.requestData\n * @param {number} [entry.timestamp]\n * @param {Object} [entry.metadata]\n * @private\n */\n async unshiftEntry(entry) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(entry, 'object', {\n moduleName: 'workbox-background-sync',\n className: 'QueueStore',\n funcName: 'unshiftEntry',\n paramName: 'entry',\n });\n assert.isType(entry.requestData, 'object', {\n moduleName: 'workbox-background-sync',\n className: 'QueueStore',\n funcName: 'unshiftEntry',\n paramName: 'entry.requestData',\n });\n }\n\n const [firstEntry] = await this._db.getAllMatching(OBJECT_STORE_NAME, {\n count: 1,\n });\n\n if (firstEntry) {\n // Pick an ID one less than the lowest ID in the object store.\n entry.id = firstEntry.id - 1;\n } else {\n // Otherwise let the auto-incrementor assign the ID.\n delete entry.id;\n }\n entry.queueName = this._queueName;\n\n await this._db.add(OBJECT_STORE_NAME, entry);\n }\n\n /**\n * Removes and returns the last entry in the queue matching the `queueName`.\n *\n * @return {Promise}\n * @private\n */\n async popEntry() {\n return this._removeEntry({direction: 'prev'});\n }\n\n /**\n * Removes and returns the first entry in the queue matching the `queueName`.\n *\n * @return {Promise}\n * @private\n */\n async shiftEntry() {\n return this._removeEntry({direction: 'next'});\n }\n\n /**\n * Returns all entries in the store matching the `queueName`.\n *\n * @param {Object} options See workbox.backgroundSync.Queue~getAll}\n * @return {Promise>}\n * @private\n */\n async getAll() {\n return await this._db.getAllMatching(OBJECT_STORE_NAME, {\n index: INDEXED_PROP,\n query: IDBKeyRange.only(this._queueName),\n });\n }\n\n /**\n * Deletes the entry for the given ID.\n *\n * WARNING: this method does not ensure the deleted enry belongs to this\n * queue (i.e. matches the `queueName`). But this limitation is acceptable\n * as this class is not publicly exposed. An additional check would make\n * this method slower than it needs to be.\n *\n * @private\n * @param {number} id\n */\n async deleteEntry(id) {\n await this._db.delete(OBJECT_STORE_NAME, id);\n }\n\n /**\n * Removes and returns the first or last entry in the queue (based on the\n * `direction` argument) matching the `queueName`.\n *\n * @return {Promise}\n * @private\n */\n async _removeEntry({direction}) {\n const [entry] = await this._db.getAllMatching(OBJECT_STORE_NAME, {\n direction,\n index: INDEXED_PROP,\n query: IDBKeyRange.only(this._queueName),\n count: 1,\n });\n\n if (entry) {\n await this.deleteEntry(entry.id);\n return entry;\n }\n }\n\n /**\n * Upgrades the database given an `upgradeneeded` event.\n *\n * @param {Event} event\n * @private\n */\n _upgradeDb(event) {\n const db = event.target.result;\n\n if (event.oldVersion > 0 && event.oldVersion < DB_VERSION) {\n if (db.objectStoreNames.contains(OBJECT_STORE_NAME)) {\n db.deleteObjectStore(OBJECT_STORE_NAME);\n }\n }\n\n const objStore = db.createObjectStore(OBJECT_STORE_NAME, {\n autoIncrement: true,\n keyPath: 'id',\n });\n objStore.createIndex(INDEXED_PROP, INDEXED_PROP, {unique: false});\n }\n}\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport '../_version.mjs';\n\n\nconst serializableProperties = [\n 'method',\n 'referrer',\n 'referrerPolicy',\n 'mode',\n 'credentials',\n 'cache',\n 'redirect',\n 'integrity',\n 'keepalive',\n];\n\n\n/**\n * A class to make it easier to serialize and de-serialize requests so they\n * can be stored in IndexedDB.\n *\n * @private\n */\nclass StorableRequest {\n /**\n * Converts a Request object to a plain object that can be structured\n * cloned or JSON-stringified.\n *\n * @param {Request} request\n * @return {Promise}\n *\n * @private\n */\n static async fromRequest(request) {\n const requestData = {\n url: request.url,\n headers: {},\n };\n\n // Set the body if present.\n if (request.method !== 'GET') {\n // Use ArrayBuffer to support non-text request bodies.\n // NOTE: we can't use Blobs becuse Safari doesn't support storing\n // Blobs in IndexedDB in some cases:\n // https://github.com/dfahlander/Dexie.js/issues/618#issuecomment-398348457\n requestData.body = await request.clone().arrayBuffer();\n }\n\n // Convert the headers from an iterable to an object.\n for (const [key, value] of request.headers.entries()) {\n requestData.headers[key] = value;\n }\n\n // Add all other serializable request properties\n for (const prop of serializableProperties) {\n if (request[prop] !== undefined) {\n requestData[prop] = request[prop];\n }\n }\n\n return new StorableRequest(requestData);\n }\n\n /**\n * Accepts an object of request data that can be used to construct a\n * `Request` but can also be stored in IndexedDB.\n *\n * @param {Object} requestData An object of request data that includes the\n * `url` plus any relevant properties of\n * [requestInit]{@link https://fetch.spec.whatwg.org/#requestinit}.\n * @private\n */\n constructor(requestData) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(requestData, 'object', {\n moduleName: 'workbox-background-sync',\n className: 'StorableRequest',\n funcName: 'constructor',\n paramName: 'requestData',\n });\n assert.isType(requestData.url, 'string', {\n moduleName: 'workbox-background-sync',\n className: 'StorableRequest',\n funcName: 'constructor',\n paramName: 'requestData.url',\n });\n }\n\n // If the request's mode is `navigate`, convert it to `same-origin` since\n // navigation requests can't be constructed via script.\n if (requestData.mode === 'navigate') {\n requestData.mode = 'same-origin';\n }\n\n this._requestData = requestData;\n }\n\n /**\n * Returns a deep clone of the instances `_requestData` object.\n *\n * @return {Object}\n *\n * @private\n */\n toObject() {\n const requestData = Object.assign({}, this._requestData);\n requestData.headers = Object.assign({}, this._requestData.headers);\n if (requestData.body) {\n requestData.body = requestData.body.slice(0);\n }\n\n return requestData;\n }\n\n /**\n * Converts this instance to a Request.\n *\n * @return {Request}\n *\n * @private\n */\n toRequest() {\n return new Request(this._requestData.url, this._requestData);\n }\n\n /**\n * Creates and returns a deep clone of the instance.\n *\n * @return {StorableRequest}\n *\n * @private\n */\n clone() {\n return new StorableRequest(this.toObject());\n }\n}\n\nexport {StorableRequest};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs';\nimport {QueueStore} from './lib/QueueStore.mjs';\nimport {StorableRequest} from './lib/StorableRequest.mjs';\nimport './_version.mjs';\n\n\nconst TAG_PREFIX = 'workbox-background-sync';\nconst MAX_RETENTION_TIME = 60 * 24 * 7; // 7 days in minutes\n\nconst queueNames = new Set();\n\n/**\n * A class to manage storing failed requests in IndexedDB and retrying them\n * later. All parts of the storing and replaying process are observable via\n * callbacks.\n *\n * @memberof workbox.backgroundSync\n */\nclass Queue {\n /**\n * Creates an instance of Queue with the given options\n *\n * @param {string} name The unique name for this queue. This name must be\n * unique as it's used to register sync events and store requests\n * in IndexedDB specific to this instance. An error will be thrown if\n * a duplicate name is detected.\n * @param {Object} [options]\n * @param {Function} [options.onSync] A function that gets invoked whenever\n * the 'sync' event fires. The function is invoked with an object\n * containing the `queue` property (referencing this instance), and you\n * can use the callback to customize the replay behavior of the queue.\n * When not set the `replayRequests()` method is called.\n * Note: if the replay fails after a sync event, make sure you throw an\n * error, so the browser knows to retry the sync event later.\n * @param {number} [options.maxRetentionTime=7 days] The amount of time (in\n * minutes) a request may be retried. After this amount of time has\n * passed, the request will be deleted from the queue.\n */\n constructor(name, {onSync, maxRetentionTime} = {}) {\n // Ensure the store name is not already being used\n if (queueNames.has(name)) {\n throw new WorkboxError('duplicate-queue-name', {name});\n } else {\n queueNames.add(name);\n }\n\n this._name = name;\n this._onSync = onSync || this.replayRequests;\n this._maxRetentionTime = maxRetentionTime || MAX_RETENTION_TIME;\n this._queueStore = new QueueStore(this._name);\n\n this._addSyncListener();\n }\n\n /**\n * @return {string}\n */\n get name() {\n return this._name;\n }\n\n /**\n * Stores the passed request in IndexedDB (with its timestamp and any\n * metadata) at the end of the queue.\n *\n * @param {Object} entry\n * @param {Request} entry.request The request to store in the queue.\n * @param {Object} [entry.metadata] Any metadata you want associated with the\n * stored request. When requests are replayed you'll have access to this\n * metadata object in case you need to modify the request beforehand.\n * @param {number} [entry.timestamp] The timestamp (Epoch time in\n * milliseconds) when the request was first added to the queue. This is\n * used along with `maxRetentionTime` to remove outdated requests. In\n * general you don't need to set this value, as it's automatically set\n * for you (defaulting to `Date.now()`), but you can update it if you\n * don't want particular requests to expire.\n */\n async pushRequest(entry) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(entry, 'object', {\n moduleName: 'workbox-background-sync',\n className: 'Queue',\n funcName: 'pushRequest',\n paramName: 'entry',\n });\n assert.isInstance(entry.request, Request, {\n moduleName: 'workbox-background-sync',\n className: 'Queue',\n funcName: 'pushRequest',\n paramName: 'entry.request',\n });\n }\n\n await this._addRequest(entry, 'push');\n }\n\n /**\n * Stores the passed request in IndexedDB (with its timestamp and any\n * metadata) at the beginning of the queue.\n *\n * @param {Object} entry\n * @param {Request} entry.request The request to store in the queue.\n * @param {Object} [entry.metadata] Any metadata you want associated with the\n * stored request. When requests are replayed you'll have access to this\n * metadata object in case you need to modify the request beforehand.\n * @param {number} [entry.timestamp] The timestamp (Epoch time in\n * milliseconds) when the request was first added to the queue. This is\n * used along with `maxRetentionTime` to remove outdated requests. In\n * general you don't need to set this value, as it's automatically set\n * for you (defaulting to `Date.now()`), but you can update it if you\n * don't want particular requests to expire.\n */\n async unshiftRequest(entry) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(entry, 'object', {\n moduleName: 'workbox-background-sync',\n className: 'Queue',\n funcName: 'unshiftRequest',\n paramName: 'entry',\n });\n assert.isInstance(entry.request, Request, {\n moduleName: 'workbox-background-sync',\n className: 'Queue',\n funcName: 'unshiftRequest',\n paramName: 'entry.request',\n });\n }\n\n await this._addRequest(entry, 'unshift');\n }\n\n /**\n * Removes and returns the last request in the queue (along with its\n * timestamp and any metadata). The returned object takes the form:\n * `{request, timestamp, metadata}`.\n *\n * @return {Promise}\n */\n async popRequest() {\n return this._removeRequest('pop');\n }\n\n /**\n * Removes and returns the first request in the queue (along with its\n * timestamp and any metadata). The returned object takes the form:\n * `{request, timestamp, metadata}`.\n *\n * @return {Promise}\n */\n async shiftRequest() {\n return this._removeRequest('shift');\n }\n\n /**\n * Returns all the entries that have not expired (per `maxRetentionTime`).\n * Any expired entries are removed from the queue.\n *\n * @return {Promise>}\n */\n async getAll() {\n const allEntries = await this._queueStore.getAll();\n const now = Date.now();\n\n const unexpiredEntries = [];\n for (const entry of allEntries) {\n // Ignore requests older than maxRetentionTime. Call this function\n // recursively until an unexpired request is found.\n const maxRetentionTimeInMs = this._maxRetentionTime * 60 * 1000;\n if (now - entry.timestamp > maxRetentionTimeInMs) {\n await this._queueStore.deleteEntry(entry.id);\n } else {\n unexpiredEntries.push(convertEntry(entry));\n }\n }\n\n return unexpiredEntries;\n }\n\n\n /**\n * Adds the entry to the QueueStore and registers for a sync event.\n *\n * @param {Object} entry\n * @param {Request} entry.request\n * @param {Object} [entry.metadata]\n * @param {number} [entry.timestamp=Date.now()]\n * @param {string} operation ('push' or 'unshift')\n * @private\n */\n async _addRequest(\n {request, metadata, timestamp = Date.now()}, operation) {\n const storableRequest = await StorableRequest.fromRequest(request.clone());\n const entry = {\n requestData: storableRequest.toObject(),\n timestamp,\n };\n\n // Only include metadata if it's present.\n if (metadata) {\n entry.metadata = metadata;\n }\n\n await this._queueStore[`${operation}Entry`](entry);\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Request for '${getFriendlyURL(request.url)}' has ` +\n `been added to background sync queue '${this._name}'.`);\n }\n\n // Don't register for a sync if we're in the middle of a sync. Instead,\n // we wait until the sync is complete and call register if\n // `this._requestsAddedDuringSync` is true.\n if (this._syncInProgress) {\n this._requestsAddedDuringSync = true;\n } else {\n await this.registerSync();\n }\n }\n\n /**\n * Removes and returns the first or last (depending on `operation`) entry\n * from the QueueStore that's not older than the `maxRetentionTime`.\n *\n * @param {string} operation ('pop' or 'shift')\n * @return {Object|undefined}\n * @private\n */\n async _removeRequest(operation) {\n const now = Date.now();\n const entry = await this._queueStore[`${operation}Entry`]();\n\n if (entry) {\n // Ignore requests older than maxRetentionTime. Call this function\n // recursively until an unexpired request is found.\n const maxRetentionTimeInMs = this._maxRetentionTime * 60 * 1000;\n if (now - entry.timestamp > maxRetentionTimeInMs) {\n return this._removeRequest(operation);\n }\n\n return convertEntry(entry);\n }\n }\n\n /**\n * Loops through each request in the queue and attempts to re-fetch it.\n * If any request fails to re-fetch, it's put back in the same position in\n * the queue (which registers a retry for the next sync event).\n */\n async replayRequests() {\n let entry;\n while (entry = await this.shiftRequest()) {\n try {\n await fetch(entry.request.clone());\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Request for '${getFriendlyURL(entry.request.url)}'` +\n `has been replayed in queue '${this._name}'`);\n }\n } catch (error) {\n await this.unshiftRequest(entry);\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Request for '${getFriendlyURL(entry.request.url)}'` +\n `failed to replay, putting it back in queue '${this._name}'`);\n }\n throw new WorkboxError('queue-replay-failed', {name: this._name});\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`All requests in queue '${this.name}' have successfully ` +\n `replayed; the queue is now empty!`);\n }\n }\n\n /**\n * Registers a sync event with a tag unique to this instance.\n */\n async registerSync() {\n if ('sync' in registration) {\n try {\n await registration.sync.register(`${TAG_PREFIX}:${this._name}`);\n } catch (err) {\n // This means the registration failed for some reason, possibly due to\n // the user disabling it.\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(\n `Unable to register sync event for '${this._name}'.`, err);\n }\n }\n }\n }\n\n /**\n * In sync-supporting browsers, this adds a listener for the sync event.\n * In non-sync-supporting browsers, this will retry the queue on service\n * worker startup.\n *\n * @private\n */\n _addSyncListener() {\n if ('sync' in registration) {\n self.addEventListener('sync', (event) => {\n if (event.tag === `${TAG_PREFIX}:${this._name}`) {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Background sync for tag '${event.tag}'` +\n `has been received`);\n }\n\n const syncComplete = async () => {\n this._syncInProgress = true;\n\n let syncError;\n try {\n await this._onSync({queue: this});\n } catch (error) {\n syncError = error;\n\n // Rethrow the error. Note: the logic in the finally clause\n // will run before this gets rethrown.\n throw syncError;\n } finally {\n // New items may have been added to the queue during the sync,\n // so we need to register for a new sync if that's happened...\n // Unless there was an error during the sync, in which\n // case the browser will automatically retry later, as long\n // as `event.lastChance` is not true.\n if (this._requestsAddedDuringSync &&\n !(syncError && !event.lastChance)) {\n await this.registerSync();\n }\n\n this._syncInProgress = false;\n this._requestsAddedDuringSync = false;\n }\n };\n event.waitUntil(syncComplete());\n }\n });\n } else {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Background sync replaying without background sync event`);\n }\n // If the browser doesn't support background sync, retry\n // every time the service worker starts up as a fallback.\n this._onSync({queue: this});\n }\n }\n\n /**\n * Returns the set of queue names. This is primarily used to reset the list\n * of queue names in tests.\n *\n * @return {Set}\n *\n * @private\n */\n static get _queueNames() {\n return queueNames;\n }\n}\n\n\n/**\n * Converts a QueueStore entry into the format exposed by Queue. This entails\n * converting the request data into a real request and omitting the `id` and\n * `queueName` properties.\n *\n * @param {Object} queueStoreEntry\n * @return {Object}\n * @private\n */\nconst convertEntry = (queueStoreEntry) => {\n const queueEntry = {\n request: new StorableRequest(queueStoreEntry.requestData).toRequest(),\n timestamp: queueStoreEntry.timestamp,\n };\n if (queueStoreEntry.metadata) {\n queueEntry.metadata = queueStoreEntry.metadata;\n }\n return queueEntry;\n};\n\nexport {Queue};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {Queue} from './Queue.mjs';\nimport './_version.mjs';\n\n/**\n * A class implementing the `fetchDidFail` lifecycle callback. This makes it\n * easier to add failed requests to a background sync Queue.\n *\n * @memberof workbox.backgroundSync\n */\nclass Plugin {\n /**\n * @param {...*} queueArgs Args to forward to the composed Queue instance.\n * See the [Queue]{@link workbox.backgroundSync.Queue} documentation for\n * parameter details.\n */\n constructor(...queueArgs) {\n this._queue = new Queue(...queueArgs);\n this.fetchDidFail = this.fetchDidFail.bind(this);\n }\n\n /**\n * @param {Object} options\n * @param {Request} options.request\n * @private\n */\n async fetchDidFail({request}) {\n await this._queue.pushRequest({request});\n }\n}\n\nexport {Plugin};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {Queue} from './Queue.mjs';\nimport {Plugin} from './Plugin.mjs';\nimport './_version.mjs';\n\n\n/**\n * @namespace workbox.backgroundSync\n */\n\nexport {\n Queue,\n Plugin,\n};\n"],"names":["self","_","e","DB_VERSION","DB_NAME","OBJECT_STORE_NAME","INDEXED_PROP","QueueStore","constructor","queueName","_queueName","_db","DBWrapper","onupgradeneeded","_upgradeDb","pushEntry","entry","assert","isType","moduleName","className","funcName","paramName","requestData","id","add","unshiftEntry","firstEntry","getAllMatching","count","popEntry","_removeEntry","direction","shiftEntry","getAll","index","query","IDBKeyRange","only","deleteEntry","delete","event","db","target","result","oldVersion","objectStoreNames","contains","deleteObjectStore","objStore","createObjectStore","autoIncrement","keyPath","createIndex","unique","serializableProperties","StorableRequest","fromRequest","request","url","headers","method","body","clone","arrayBuffer","key","value","entries","prop","undefined","mode","_requestData","toObject","Object","assign","slice","toRequest","Request","TAG_PREFIX","MAX_RETENTION_TIME","queueNames","Set","Queue","name","onSync","maxRetentionTime","has","WorkboxError","_name","_onSync","replayRequests","_maxRetentionTime","_queueStore","_addSyncListener","pushRequest","isInstance","_addRequest","unshiftRequest","popRequest","_removeRequest","shiftRequest","allEntries","now","Date","unexpiredEntries","maxRetentionTimeInMs","timestamp","push","convertEntry","metadata","operation","storableRequest","logger","log","getFriendlyURL","_syncInProgress","_requestsAddedDuringSync","registerSync","fetch","error","registration","sync","register","err","warn","addEventListener","tag","syncComplete","syncError","queue","lastChance","waitUntil","_queueNames","queueStoreEntry","queueEntry","Plugin","queueArgs","_queue","fetchDidFail","bind"],"mappings":"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"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-background-sync.prod.js b/workbox-v4.3.1/workbox-background-sync.prod.js new file mode 100644 index 00000000..9c9051ad --- /dev/null +++ b/workbox-v4.3.1/workbox-background-sync.prod.js @@ -0,0 +1,2 @@ +this.workbox=this.workbox||{},this.workbox.backgroundSync=function(t,e,s){"use strict";try{self["workbox:background-sync:4.3.1"]&&_()}catch(t){}const i=3,n="workbox-background-sync",a="requests",r="queueName";class c{constructor(t){this.t=t,this.s=new s.DBWrapper(n,i,{onupgradeneeded:this.i})}async pushEntry(t){delete t.id,t.queueName=this.t,await this.s.add(a,t)}async unshiftEntry(t){const[e]=await this.s.getAllMatching(a,{count:1});e?t.id=e.id-1:delete t.id,t.queueName=this.t,await this.s.add(a,t)}async popEntry(){return this.h({direction:"prev"})}async shiftEntry(){return this.h({direction:"next"})}async getAll(){return await this.s.getAllMatching(a,{index:r,query:IDBKeyRange.only(this.t)})}async deleteEntry(t){await this.s.delete(a,t)}async h({direction:t}){const[e]=await this.s.getAllMatching(a,{direction:t,index:r,query:IDBKeyRange.only(this.t),count:1});if(e)return await this.deleteEntry(e.id),e}i(t){const e=t.target.result;t.oldVersion>0&&t.oldVersiont?await this.m.deleteEntry(i.id):s.push(f(i))}return s}async g({request:t,metadata:e,timestamp:s=Date.now()},i){const n={requestData:(await o.fromRequest(t.clone())).toObject(),timestamp:s};e&&(n.metadata=e),await this.m[`${i}Entry`](n),this.k?this.D=!0:await this.registerSync()}async R(t){const e=Date.now(),s=await this.m[`${t}Entry`]();if(s){const i=60*this.q*1e3;return e-s.timestamp>i?this.R(t):f(s)}}async replayRequests(){let t;for(;t=await this.shiftRequest();)try{await fetch(t.request.clone())}catch(s){throw await this.unshiftRequest(t),new e.WorkboxError("queue-replay-failed",{name:this.u})}}async registerSync(){if("sync"in registration)try{await registration.sync.register(`${u}:${this.u}`)}catch(t){}}p(){"sync"in registration?self.addEventListener("sync",t=>{if(t.tag===`${u}:${this.u}`){const e=async()=>{let e;this.k=!0;try{await this.l({queue:this})}catch(t){throw e=t}finally{!this.D||e&&!t.lastChance||await this.registerSync(),this.k=!1,this.D=!1}};t.waitUntil(e())}}):this.l({queue:this})}static get _(){return w}}const f=t=>{const e={request:new o(t.requestData).toRequest(),timestamp:t.timestamp};return t.metadata&&(e.metadata=t.metadata),e};return t.Queue=d,t.Plugin=class{constructor(...t){this.v=new d(...t),this.fetchDidFail=this.fetchDidFail.bind(this)}async fetchDidFail({request:t}){await this.v.pushRequest({request:t})}},t}({},workbox.core._private,workbox.core._private); +//# sourceMappingURL=workbox-background-sync.prod.js.map diff --git a/workbox-v4.3.1/workbox-background-sync.prod.js.map b/workbox-v4.3.1/workbox-background-sync.prod.js.map new file mode 100644 index 00000000..4064edb6 --- /dev/null +++ b/workbox-v4.3.1/workbox-background-sync.prod.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-background-sync.prod.js","sources":["../_version.mjs","../lib/QueueStore.mjs","../lib/StorableRequest.mjs","../Queue.mjs","../Plugin.mjs"],"sourcesContent":["try{self['workbox:background-sync:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {DBWrapper} from 'workbox-core/_private/DBWrapper.mjs';\nimport '../_version.mjs';\n\n\nconst DB_VERSION = 3;\nconst DB_NAME = 'workbox-background-sync';\nconst OBJECT_STORE_NAME = 'requests';\nconst INDEXED_PROP = 'queueName';\n\n/**\n * A class to manage storing requests from a Queue in IndexedbDB,\n * indexed by their queue name for easier access.\n *\n * @private\n */\nexport class QueueStore {\n /**\n * Associates this instance with a Queue instance, so entries added can be\n * identified by their queue name.\n *\n * @param {string} queueName\n * @private\n */\n constructor(queueName) {\n this._queueName = queueName;\n this._db = new DBWrapper(DB_NAME, DB_VERSION, {\n onupgradeneeded: this._upgradeDb,\n });\n }\n\n /**\n * Append an entry last in the queue.\n *\n * @param {Object} entry\n * @param {Object} entry.requestData\n * @param {number} [entry.timestamp]\n * @param {Object} [entry.metadata]\n * @private\n */\n async pushEntry(entry) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(entry, 'object', {\n moduleName: 'workbox-background-sync',\n className: 'QueueStore',\n funcName: 'pushEntry',\n paramName: 'entry',\n });\n assert.isType(entry.requestData, 'object', {\n moduleName: 'workbox-background-sync',\n className: 'QueueStore',\n funcName: 'pushEntry',\n paramName: 'entry.requestData',\n });\n }\n\n // Don't specify an ID since one is automatically generated.\n delete entry.id;\n entry.queueName = this._queueName;\n\n await this._db.add(OBJECT_STORE_NAME, entry);\n }\n\n /**\n * Preppend an entry first in the queue.\n *\n * @param {Object} entry\n * @param {Object} entry.requestData\n * @param {number} [entry.timestamp]\n * @param {Object} [entry.metadata]\n * @private\n */\n async unshiftEntry(entry) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(entry, 'object', {\n moduleName: 'workbox-background-sync',\n className: 'QueueStore',\n funcName: 'unshiftEntry',\n paramName: 'entry',\n });\n assert.isType(entry.requestData, 'object', {\n moduleName: 'workbox-background-sync',\n className: 'QueueStore',\n funcName: 'unshiftEntry',\n paramName: 'entry.requestData',\n });\n }\n\n const [firstEntry] = await this._db.getAllMatching(OBJECT_STORE_NAME, {\n count: 1,\n });\n\n if (firstEntry) {\n // Pick an ID one less than the lowest ID in the object store.\n entry.id = firstEntry.id - 1;\n } else {\n // Otherwise let the auto-incrementor assign the ID.\n delete entry.id;\n }\n entry.queueName = this._queueName;\n\n await this._db.add(OBJECT_STORE_NAME, entry);\n }\n\n /**\n * Removes and returns the last entry in the queue matching the `queueName`.\n *\n * @return {Promise}\n * @private\n */\n async popEntry() {\n return this._removeEntry({direction: 'prev'});\n }\n\n /**\n * Removes and returns the first entry in the queue matching the `queueName`.\n *\n * @return {Promise}\n * @private\n */\n async shiftEntry() {\n return this._removeEntry({direction: 'next'});\n }\n\n /**\n * Returns all entries in the store matching the `queueName`.\n *\n * @param {Object} options See workbox.backgroundSync.Queue~getAll}\n * @return {Promise>}\n * @private\n */\n async getAll() {\n return await this._db.getAllMatching(OBJECT_STORE_NAME, {\n index: INDEXED_PROP,\n query: IDBKeyRange.only(this._queueName),\n });\n }\n\n /**\n * Deletes the entry for the given ID.\n *\n * WARNING: this method does not ensure the deleted enry belongs to this\n * queue (i.e. matches the `queueName`). But this limitation is acceptable\n * as this class is not publicly exposed. An additional check would make\n * this method slower than it needs to be.\n *\n * @private\n * @param {number} id\n */\n async deleteEntry(id) {\n await this._db.delete(OBJECT_STORE_NAME, id);\n }\n\n /**\n * Removes and returns the first or last entry in the queue (based on the\n * `direction` argument) matching the `queueName`.\n *\n * @return {Promise}\n * @private\n */\n async _removeEntry({direction}) {\n const [entry] = await this._db.getAllMatching(OBJECT_STORE_NAME, {\n direction,\n index: INDEXED_PROP,\n query: IDBKeyRange.only(this._queueName),\n count: 1,\n });\n\n if (entry) {\n await this.deleteEntry(entry.id);\n return entry;\n }\n }\n\n /**\n * Upgrades the database given an `upgradeneeded` event.\n *\n * @param {Event} event\n * @private\n */\n _upgradeDb(event) {\n const db = event.target.result;\n\n if (event.oldVersion > 0 && event.oldVersion < DB_VERSION) {\n if (db.objectStoreNames.contains(OBJECT_STORE_NAME)) {\n db.deleteObjectStore(OBJECT_STORE_NAME);\n }\n }\n\n const objStore = db.createObjectStore(OBJECT_STORE_NAME, {\n autoIncrement: true,\n keyPath: 'id',\n });\n objStore.createIndex(INDEXED_PROP, INDEXED_PROP, {unique: false});\n }\n}\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport '../_version.mjs';\n\n\nconst serializableProperties = [\n 'method',\n 'referrer',\n 'referrerPolicy',\n 'mode',\n 'credentials',\n 'cache',\n 'redirect',\n 'integrity',\n 'keepalive',\n];\n\n\n/**\n * A class to make it easier to serialize and de-serialize requests so they\n * can be stored in IndexedDB.\n *\n * @private\n */\nclass StorableRequest {\n /**\n * Converts a Request object to a plain object that can be structured\n * cloned or JSON-stringified.\n *\n * @param {Request} request\n * @return {Promise}\n *\n * @private\n */\n static async fromRequest(request) {\n const requestData = {\n url: request.url,\n headers: {},\n };\n\n // Set the body if present.\n if (request.method !== 'GET') {\n // Use ArrayBuffer to support non-text request bodies.\n // NOTE: we can't use Blobs becuse Safari doesn't support storing\n // Blobs in IndexedDB in some cases:\n // https://github.com/dfahlander/Dexie.js/issues/618#issuecomment-398348457\n requestData.body = await request.clone().arrayBuffer();\n }\n\n // Convert the headers from an iterable to an object.\n for (const [key, value] of request.headers.entries()) {\n requestData.headers[key] = value;\n }\n\n // Add all other serializable request properties\n for (const prop of serializableProperties) {\n if (request[prop] !== undefined) {\n requestData[prop] = request[prop];\n }\n }\n\n return new StorableRequest(requestData);\n }\n\n /**\n * Accepts an object of request data that can be used to construct a\n * `Request` but can also be stored in IndexedDB.\n *\n * @param {Object} requestData An object of request data that includes the\n * `url` plus any relevant properties of\n * [requestInit]{@link https://fetch.spec.whatwg.org/#requestinit}.\n * @private\n */\n constructor(requestData) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(requestData, 'object', {\n moduleName: 'workbox-background-sync',\n className: 'StorableRequest',\n funcName: 'constructor',\n paramName: 'requestData',\n });\n assert.isType(requestData.url, 'string', {\n moduleName: 'workbox-background-sync',\n className: 'StorableRequest',\n funcName: 'constructor',\n paramName: 'requestData.url',\n });\n }\n\n // If the request's mode is `navigate`, convert it to `same-origin` since\n // navigation requests can't be constructed via script.\n if (requestData.mode === 'navigate') {\n requestData.mode = 'same-origin';\n }\n\n this._requestData = requestData;\n }\n\n /**\n * Returns a deep clone of the instances `_requestData` object.\n *\n * @return {Object}\n *\n * @private\n */\n toObject() {\n const requestData = Object.assign({}, this._requestData);\n requestData.headers = Object.assign({}, this._requestData.headers);\n if (requestData.body) {\n requestData.body = requestData.body.slice(0);\n }\n\n return requestData;\n }\n\n /**\n * Converts this instance to a Request.\n *\n * @return {Request}\n *\n * @private\n */\n toRequest() {\n return new Request(this._requestData.url, this._requestData);\n }\n\n /**\n * Creates and returns a deep clone of the instance.\n *\n * @return {StorableRequest}\n *\n * @private\n */\n clone() {\n return new StorableRequest(this.toObject());\n }\n}\n\nexport {StorableRequest};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs';\nimport {QueueStore} from './lib/QueueStore.mjs';\nimport {StorableRequest} from './lib/StorableRequest.mjs';\nimport './_version.mjs';\n\n\nconst TAG_PREFIX = 'workbox-background-sync';\nconst MAX_RETENTION_TIME = 60 * 24 * 7; // 7 days in minutes\n\nconst queueNames = new Set();\n\n/**\n * A class to manage storing failed requests in IndexedDB and retrying them\n * later. All parts of the storing and replaying process are observable via\n * callbacks.\n *\n * @memberof workbox.backgroundSync\n */\nclass Queue {\n /**\n * Creates an instance of Queue with the given options\n *\n * @param {string} name The unique name for this queue. This name must be\n * unique as it's used to register sync events and store requests\n * in IndexedDB specific to this instance. An error will be thrown if\n * a duplicate name is detected.\n * @param {Object} [options]\n * @param {Function} [options.onSync] A function that gets invoked whenever\n * the 'sync' event fires. The function is invoked with an object\n * containing the `queue` property (referencing this instance), and you\n * can use the callback to customize the replay behavior of the queue.\n * When not set the `replayRequests()` method is called.\n * Note: if the replay fails after a sync event, make sure you throw an\n * error, so the browser knows to retry the sync event later.\n * @param {number} [options.maxRetentionTime=7 days] The amount of time (in\n * minutes) a request may be retried. After this amount of time has\n * passed, the request will be deleted from the queue.\n */\n constructor(name, {onSync, maxRetentionTime} = {}) {\n // Ensure the store name is not already being used\n if (queueNames.has(name)) {\n throw new WorkboxError('duplicate-queue-name', {name});\n } else {\n queueNames.add(name);\n }\n\n this._name = name;\n this._onSync = onSync || this.replayRequests;\n this._maxRetentionTime = maxRetentionTime || MAX_RETENTION_TIME;\n this._queueStore = new QueueStore(this._name);\n\n this._addSyncListener();\n }\n\n /**\n * @return {string}\n */\n get name() {\n return this._name;\n }\n\n /**\n * Stores the passed request in IndexedDB (with its timestamp and any\n * metadata) at the end of the queue.\n *\n * @param {Object} entry\n * @param {Request} entry.request The request to store in the queue.\n * @param {Object} [entry.metadata] Any metadata you want associated with the\n * stored request. When requests are replayed you'll have access to this\n * metadata object in case you need to modify the request beforehand.\n * @param {number} [entry.timestamp] The timestamp (Epoch time in\n * milliseconds) when the request was first added to the queue. This is\n * used along with `maxRetentionTime` to remove outdated requests. In\n * general you don't need to set this value, as it's automatically set\n * for you (defaulting to `Date.now()`), but you can update it if you\n * don't want particular requests to expire.\n */\n async pushRequest(entry) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(entry, 'object', {\n moduleName: 'workbox-background-sync',\n className: 'Queue',\n funcName: 'pushRequest',\n paramName: 'entry',\n });\n assert.isInstance(entry.request, Request, {\n moduleName: 'workbox-background-sync',\n className: 'Queue',\n funcName: 'pushRequest',\n paramName: 'entry.request',\n });\n }\n\n await this._addRequest(entry, 'push');\n }\n\n /**\n * Stores the passed request in IndexedDB (with its timestamp and any\n * metadata) at the beginning of the queue.\n *\n * @param {Object} entry\n * @param {Request} entry.request The request to store in the queue.\n * @param {Object} [entry.metadata] Any metadata you want associated with the\n * stored request. When requests are replayed you'll have access to this\n * metadata object in case you need to modify the request beforehand.\n * @param {number} [entry.timestamp] The timestamp (Epoch time in\n * milliseconds) when the request was first added to the queue. This is\n * used along with `maxRetentionTime` to remove outdated requests. In\n * general you don't need to set this value, as it's automatically set\n * for you (defaulting to `Date.now()`), but you can update it if you\n * don't want particular requests to expire.\n */\n async unshiftRequest(entry) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(entry, 'object', {\n moduleName: 'workbox-background-sync',\n className: 'Queue',\n funcName: 'unshiftRequest',\n paramName: 'entry',\n });\n assert.isInstance(entry.request, Request, {\n moduleName: 'workbox-background-sync',\n className: 'Queue',\n funcName: 'unshiftRequest',\n paramName: 'entry.request',\n });\n }\n\n await this._addRequest(entry, 'unshift');\n }\n\n /**\n * Removes and returns the last request in the queue (along with its\n * timestamp and any metadata). The returned object takes the form:\n * `{request, timestamp, metadata}`.\n *\n * @return {Promise}\n */\n async popRequest() {\n return this._removeRequest('pop');\n }\n\n /**\n * Removes and returns the first request in the queue (along with its\n * timestamp and any metadata). The returned object takes the form:\n * `{request, timestamp, metadata}`.\n *\n * @return {Promise}\n */\n async shiftRequest() {\n return this._removeRequest('shift');\n }\n\n /**\n * Returns all the entries that have not expired (per `maxRetentionTime`).\n * Any expired entries are removed from the queue.\n *\n * @return {Promise>}\n */\n async getAll() {\n const allEntries = await this._queueStore.getAll();\n const now = Date.now();\n\n const unexpiredEntries = [];\n for (const entry of allEntries) {\n // Ignore requests older than maxRetentionTime. Call this function\n // recursively until an unexpired request is found.\n const maxRetentionTimeInMs = this._maxRetentionTime * 60 * 1000;\n if (now - entry.timestamp > maxRetentionTimeInMs) {\n await this._queueStore.deleteEntry(entry.id);\n } else {\n unexpiredEntries.push(convertEntry(entry));\n }\n }\n\n return unexpiredEntries;\n }\n\n\n /**\n * Adds the entry to the QueueStore and registers for a sync event.\n *\n * @param {Object} entry\n * @param {Request} entry.request\n * @param {Object} [entry.metadata]\n * @param {number} [entry.timestamp=Date.now()]\n * @param {string} operation ('push' or 'unshift')\n * @private\n */\n async _addRequest(\n {request, metadata, timestamp = Date.now()}, operation) {\n const storableRequest = await StorableRequest.fromRequest(request.clone());\n const entry = {\n requestData: storableRequest.toObject(),\n timestamp,\n };\n\n // Only include metadata if it's present.\n if (metadata) {\n entry.metadata = metadata;\n }\n\n await this._queueStore[`${operation}Entry`](entry);\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Request for '${getFriendlyURL(request.url)}' has ` +\n `been added to background sync queue '${this._name}'.`);\n }\n\n // Don't register for a sync if we're in the middle of a sync. Instead,\n // we wait until the sync is complete and call register if\n // `this._requestsAddedDuringSync` is true.\n if (this._syncInProgress) {\n this._requestsAddedDuringSync = true;\n } else {\n await this.registerSync();\n }\n }\n\n /**\n * Removes and returns the first or last (depending on `operation`) entry\n * from the QueueStore that's not older than the `maxRetentionTime`.\n *\n * @param {string} operation ('pop' or 'shift')\n * @return {Object|undefined}\n * @private\n */\n async _removeRequest(operation) {\n const now = Date.now();\n const entry = await this._queueStore[`${operation}Entry`]();\n\n if (entry) {\n // Ignore requests older than maxRetentionTime. Call this function\n // recursively until an unexpired request is found.\n const maxRetentionTimeInMs = this._maxRetentionTime * 60 * 1000;\n if (now - entry.timestamp > maxRetentionTimeInMs) {\n return this._removeRequest(operation);\n }\n\n return convertEntry(entry);\n }\n }\n\n /**\n * Loops through each request in the queue and attempts to re-fetch it.\n * If any request fails to re-fetch, it's put back in the same position in\n * the queue (which registers a retry for the next sync event).\n */\n async replayRequests() {\n let entry;\n while (entry = await this.shiftRequest()) {\n try {\n await fetch(entry.request.clone());\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Request for '${getFriendlyURL(entry.request.url)}'` +\n `has been replayed in queue '${this._name}'`);\n }\n } catch (error) {\n await this.unshiftRequest(entry);\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Request for '${getFriendlyURL(entry.request.url)}'` +\n `failed to replay, putting it back in queue '${this._name}'`);\n }\n throw new WorkboxError('queue-replay-failed', {name: this._name});\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`All requests in queue '${this.name}' have successfully ` +\n `replayed; the queue is now empty!`);\n }\n }\n\n /**\n * Registers a sync event with a tag unique to this instance.\n */\n async registerSync() {\n if ('sync' in registration) {\n try {\n await registration.sync.register(`${TAG_PREFIX}:${this._name}`);\n } catch (err) {\n // This means the registration failed for some reason, possibly due to\n // the user disabling it.\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(\n `Unable to register sync event for '${this._name}'.`, err);\n }\n }\n }\n }\n\n /**\n * In sync-supporting browsers, this adds a listener for the sync event.\n * In non-sync-supporting browsers, this will retry the queue on service\n * worker startup.\n *\n * @private\n */\n _addSyncListener() {\n if ('sync' in registration) {\n self.addEventListener('sync', (event) => {\n if (event.tag === `${TAG_PREFIX}:${this._name}`) {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Background sync for tag '${event.tag}'` +\n `has been received`);\n }\n\n const syncComplete = async () => {\n this._syncInProgress = true;\n\n let syncError;\n try {\n await this._onSync({queue: this});\n } catch (error) {\n syncError = error;\n\n // Rethrow the error. Note: the logic in the finally clause\n // will run before this gets rethrown.\n throw syncError;\n } finally {\n // New items may have been added to the queue during the sync,\n // so we need to register for a new sync if that's happened...\n // Unless there was an error during the sync, in which\n // case the browser will automatically retry later, as long\n // as `event.lastChance` is not true.\n if (this._requestsAddedDuringSync &&\n !(syncError && !event.lastChance)) {\n await this.registerSync();\n }\n\n this._syncInProgress = false;\n this._requestsAddedDuringSync = false;\n }\n };\n event.waitUntil(syncComplete());\n }\n });\n } else {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Background sync replaying without background sync event`);\n }\n // If the browser doesn't support background sync, retry\n // every time the service worker starts up as a fallback.\n this._onSync({queue: this});\n }\n }\n\n /**\n * Returns the set of queue names. This is primarily used to reset the list\n * of queue names in tests.\n *\n * @return {Set}\n *\n * @private\n */\n static get _queueNames() {\n return queueNames;\n }\n}\n\n\n/**\n * Converts a QueueStore entry into the format exposed by Queue. This entails\n * converting the request data into a real request and omitting the `id` and\n * `queueName` properties.\n *\n * @param {Object} queueStoreEntry\n * @return {Object}\n * @private\n */\nconst convertEntry = (queueStoreEntry) => {\n const queueEntry = {\n request: new StorableRequest(queueStoreEntry.requestData).toRequest(),\n timestamp: queueStoreEntry.timestamp,\n };\n if (queueStoreEntry.metadata) {\n queueEntry.metadata = queueStoreEntry.metadata;\n }\n return queueEntry;\n};\n\nexport {Queue};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {Queue} from './Queue.mjs';\nimport './_version.mjs';\n\n/**\n * A class implementing the `fetchDidFail` lifecycle callback. This makes it\n * easier to add failed requests to a background sync Queue.\n *\n * @memberof workbox.backgroundSync\n */\nclass Plugin {\n /**\n * @param {...*} queueArgs Args to forward to the composed Queue instance.\n * See the [Queue]{@link workbox.backgroundSync.Queue} documentation for\n * parameter details.\n */\n constructor(...queueArgs) {\n this._queue = new Queue(...queueArgs);\n this.fetchDidFail = this.fetchDidFail.bind(this);\n }\n\n /**\n * @param {Object} options\n * @param {Request} options.request\n * @private\n */\n async fetchDidFail({request}) {\n await this._queue.pushRequest({request});\n }\n}\n\nexport {Plugin};\n"],"names":["self","_","e","DB_VERSION","DB_NAME","OBJECT_STORE_NAME","INDEXED_PROP","QueueStore","constructor","queueName","_queueName","_db","DBWrapper","onupgradeneeded","this","_upgradeDb","entry","id","add","firstEntry","getAllMatching","count","_removeEntry","direction","index","query","IDBKeyRange","only","delete","deleteEntry","event","db","target","result","oldVersion","objectStoreNames","contains","deleteObjectStore","createObjectStore","autoIncrement","keyPath","createIndex","unique","serializableProperties","StorableRequest","request","requestData","url","headers","method","body","clone","arrayBuffer","key","value","entries","prop","undefined","mode","_requestData","toObject","Object","assign","slice","toRequest","Request","TAG_PREFIX","MAX_RETENTION_TIME","queueNames","Set","Queue","name","onSync","maxRetentionTime","has","WorkboxError","_name","_onSync","replayRequests","_maxRetentionTime","_queueStore","_addSyncListener","_addRequest","_removeRequest","allEntries","getAll","now","Date","unexpiredEntries","maxRetentionTimeInMs","timestamp","push","convertEntry","metadata","operation","fromRequest","_syncInProgress","_requestsAddedDuringSync","registerSync","shiftRequest","fetch","error","unshiftRequest","registration","sync","register","err","addEventListener","tag","syncComplete","async","syncError","queue","lastChance","waitUntil","queueStoreEntry","queueEntry","queueArgs","_queue","fetchDidFail","bind","pushRequest"],"mappings":"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"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-broadcast-update.dev.js b/workbox-v4.3.1/workbox-broadcast-update.dev.js new file mode 100644 index 00000000..79beb38a --- /dev/null +++ b/workbox-v4.3.1/workbox-broadcast-update.dev.js @@ -0,0 +1,496 @@ +this.workbox = this.workbox || {}; +this.workbox.broadcastUpdate = (function (exports, assert_mjs, getFriendlyURL_mjs, logger_mjs, Deferred_mjs, WorkboxError_mjs) { + 'use strict'; + + try { + self['workbox:broadcast-update:4.3.1'] && _(); + } catch (e) {} // eslint-disable-line + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Given two `Response's`, compares several header values to see if they are + * the same or not. + * + * @param {Response} firstResponse + * @param {Response} secondResponse + * @param {Array} headersToCheck + * @return {boolean} + * + * @memberof workbox.broadcastUpdate + * @private + */ + + const responsesAreSame = (firstResponse, secondResponse, headersToCheck) => { + { + if (!(firstResponse instanceof Response && secondResponse instanceof Response)) { + throw new WorkboxError_mjs.WorkboxError('invalid-responses-are-same-args'); + } + } + + const atLeastOneHeaderAvailable = headersToCheck.some(header => { + return firstResponse.headers.has(header) && secondResponse.headers.has(header); + }); + + if (!atLeastOneHeaderAvailable) { + { + logger_mjs.logger.warn(`Unable to determine where the response has been updated ` + `because none of the headers that would be checked are present.`); + logger_mjs.logger.debug(`Attempting to compare the following: `, firstResponse, secondResponse, headersToCheck); + } // Just return true, indicating the that responses are the same, since we + // can't determine otherwise. + + + return true; + } + + return headersToCheck.every(header => { + const headerStateComparison = firstResponse.headers.has(header) === secondResponse.headers.has(header); + const headerValueComparison = firstResponse.headers.get(header) === secondResponse.headers.get(header); + return headerStateComparison && headerValueComparison; + }); + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const CACHE_UPDATED_MESSAGE_TYPE = 'CACHE_UPDATED'; + const CACHE_UPDATED_MESSAGE_META = 'workbox-broadcast-update'; + const DEFAULT_BROADCAST_CHANNEL_NAME = 'workbox'; + const DEFAULT_DEFER_NOTIFICATION_TIMEOUT = 10000; + const DEFAULT_HEADERS_TO_CHECK = ['content-length', 'etag', 'last-modified']; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * You would not normally call this method directly; it's called automatically + * by an instance of the {@link BroadcastCacheUpdate} class. It's exposed here + * for the benefit of developers who would rather not use the full + * `BroadcastCacheUpdate` implementation. + * + * Calling this will dispatch a message on the provided + * {@link https://developers.google.com/web/updates/2016/09/broadcastchannel|Broadcast Channel} + * to notify interested subscribers about a change to a cached resource. + * + * The message that's posted has a formation inspired by the + * [Flux standard action](https://github.com/acdlite/flux-standard-action#introduction) + * format like so: + * + * ``` + * { + * type: 'CACHE_UPDATED', + * meta: 'workbox-broadcast-update', + * payload: { + * cacheName: 'the-cache-name', + * updatedURL: 'https://example.com/' + * } + * } + * ``` + * + * (Usage of [Flux](https://facebook.github.io/flux/) itself is not at + * all required.) + * + * @param {Object} options + * @param {string} options.cacheName The name of the cache in which the updated + * `Response` was stored. + * @param {string} options.url The URL associated with the updated `Response`. + * @param {BroadcastChannel} [options.channel] The `BroadcastChannel` to use. + * If no channel is set or the browser doesn't support the BroadcastChannel + * api, then an attempt will be made to `postMessage` each window client. + * + * @memberof workbox.broadcastUpdate + */ + + const broadcastUpdate = async ({ + channel, + cacheName, + url + }) => { + { + assert_mjs.assert.isType(cacheName, 'string', { + moduleName: 'workbox-broadcast-update', + className: '~', + funcName: 'broadcastUpdate', + paramName: 'cacheName' + }); + assert_mjs.assert.isType(url, 'string', { + moduleName: 'workbox-broadcast-update', + className: '~', + funcName: 'broadcastUpdate', + paramName: 'url' + }); + } + + const data = { + type: CACHE_UPDATED_MESSAGE_TYPE, + meta: CACHE_UPDATED_MESSAGE_META, + payload: { + cacheName: cacheName, + updatedURL: url + } + }; + + if (channel) { + channel.postMessage(data); + } else { + const windows = await clients.matchAll({ + type: 'window' + }); + + for (const win of windows) { + win.postMessage(data); + } + } + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Uses the [Broadcast Channel API]{@link https://developers.google.com/web/updates/2016/09/broadcastchannel} + * to notify interested parties when a cached response has been updated. + * In browsers that do not support the Broadcast Channel API, the instance + * falls back to sending the update via `postMessage()` to all window clients. + * + * For efficiency's sake, the underlying response bodies are not compared; + * only specific response headers are checked. + * + * @memberof workbox.broadcastUpdate + */ + + class BroadcastCacheUpdate { + /** + * Construct a BroadcastCacheUpdate instance with a specific `channelName` to + * broadcast messages on + * + * @param {Object} options + * @param {Array} + * [options.headersToCheck=['content-length', 'etag', 'last-modified']] + * A list of headers that will be used to determine whether the responses + * differ. + * @param {string} [options.channelName='workbox'] The name that will be used + *. when creating the `BroadcastChannel`, which defaults to 'workbox' (the + * channel name used by the `workbox-window` package). + * @param {string} [options.deferNoticationTimeout=10000] The amount of time + * to wait for a ready message from the window on navigation requests + * before sending the update. + */ + constructor({ + headersToCheck, + channelName, + deferNoticationTimeout + } = {}) { + this._headersToCheck = headersToCheck || DEFAULT_HEADERS_TO_CHECK; + this._channelName = channelName || DEFAULT_BROADCAST_CHANNEL_NAME; + this._deferNoticationTimeout = deferNoticationTimeout || DEFAULT_DEFER_NOTIFICATION_TIMEOUT; + + { + assert_mjs.assert.isType(this._channelName, 'string', { + moduleName: 'workbox-broadcast-update', + className: 'BroadcastCacheUpdate', + funcName: 'constructor', + paramName: 'channelName' + }); + assert_mjs.assert.isArray(this._headersToCheck, { + moduleName: 'workbox-broadcast-update', + className: 'BroadcastCacheUpdate', + funcName: 'constructor', + paramName: 'headersToCheck' + }); + } + + this._initWindowReadyDeferreds(); + } + /** + * Compare two [Responses](https://developer.mozilla.org/en-US/docs/Web/API/Response) + * and send a message via the + * {@link https://developers.google.com/web/updates/2016/09/broadcastchannel|Broadcast Channel API} + * if they differ. + * + * Neither of the Responses can be {@link http://stackoverflow.com/questions/39109789|opaque}. + * + * @param {Object} options + * @param {Response} options.oldResponse Cached response to compare. + * @param {Response} options.newResponse Possibly updated response to compare. + * @param {string} options.url The URL of the request. + * @param {string} options.cacheName Name of the cache the responses belong + * to. This is included in the broadcast message. + * @param {Event} [options.event] event An optional event that triggered + * this possible cache update. + * @return {Promise} Resolves once the update is sent. + */ + + + notifyIfUpdated({ + oldResponse, + newResponse, + url, + cacheName, + event + }) { + if (!responsesAreSame(oldResponse, newResponse, this._headersToCheck)) { + { + logger_mjs.logger.log(`Newer response found (and cached) for:`, url); + } + + const sendUpdate = async () => { + // In the case of a navigation request, the requesting page will likely + // not have loaded its JavaScript in time to recevied the update + // notification, so we defer it until ready (or we timeout waiting). + if (event && event.request && event.request.mode === 'navigate') { + { + logger_mjs.logger.debug(`Original request was a navigation request, ` + `waiting for a ready message from the window`, event.request); + } + + await this._windowReadyOrTimeout(event); + } + + await this._broadcastUpdate({ + channel: this._getChannel(), + cacheName, + url + }); + }; // Send the update and ensure the SW stays alive until it's sent. + + + const done = sendUpdate(); + + if (event) { + try { + event.waitUntil(done); + } catch (error) { + { + logger_mjs.logger.warn(`Unable to ensure service worker stays alive ` + `when broadcasting cache update for ` + `${getFriendlyURL_mjs.getFriendlyURL(event.request.url)}'.`); + } + } + } + + return done; + } + } + /** + * NOTE: this is exposed on the instance primarily so it can be spied on + * in tests. + * + * @param {Object} opts + * @private + */ + + + async _broadcastUpdate(opts) { + await broadcastUpdate(opts); + } + /** + * @return {BroadcastChannel|undefined} The BroadcastChannel instance used for + * broadcasting updates, or undefined if the browser doesn't support the + * Broadcast Channel API. + * + * @private + */ + + + _getChannel() { + if ('BroadcastChannel' in self && !this._channel) { + this._channel = new BroadcastChannel(this._channelName); + } + + return this._channel; + } + /** + * Waits for a message from the window indicating that it's capable of + * receiving broadcasts. By default, this will only wait for the amount of + * time specified via the `deferNoticationTimeout` option. + * + * @param {Event} event The navigation fetch event. + * @return {Promise} + * @private + */ + + + _windowReadyOrTimeout(event) { + if (!this._navigationEventsDeferreds.has(event)) { + const deferred = new Deferred_mjs.Deferred(); // Set the deferred on the `_navigationEventsDeferreds` map so it will + // be resolved when the next ready message event comes. + + this._navigationEventsDeferreds.set(event, deferred); // But don't wait too long for the message since it may never come. + + + const timeout = setTimeout(() => { + { + logger_mjs.logger.debug(`Timed out after ${this._deferNoticationTimeout}` + `ms waiting for message from window`); + } + + deferred.resolve(); + }, this._deferNoticationTimeout); // Ensure the timeout is cleared if the deferred promise is resolved. + + deferred.promise.then(() => clearTimeout(timeout)); + } + + return this._navigationEventsDeferreds.get(event).promise; + } + /** + * Creates a mapping between navigation fetch events and deferreds, and adds + * a listener for message events from the window. When message events arrive, + * all deferreds in the mapping are resolved. + * + * Note: it would be easier if we could only resolve the deferred of + * navigation fetch event whose client ID matched the source ID of the + * message event, but currently client IDs are not exposed on navigation + * fetch events: https://www.chromestatus.com/feature/4846038800138240 + * + * @private + */ + + + _initWindowReadyDeferreds() { + // A mapping between navigation events and their deferreds. + this._navigationEventsDeferreds = new Map(); // The message listener needs to be added in the initial run of the + // service worker, but since we don't actually need to be listening for + // messages until the cache updates, we only invoke the callback if set. + + self.addEventListener('message', event => { + if (event.data.type === 'WINDOW_READY' && event.data.meta === 'workbox-window' && this._navigationEventsDeferreds.size > 0) { + { + logger_mjs.logger.debug(`Received WINDOW_READY event: `, event); + } // Resolve any pending deferreds. + + + for (const deferred of this._navigationEventsDeferreds.values()) { + deferred.resolve(); + } + + this._navigationEventsDeferreds.clear(); + } + }); + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * This plugin will automatically broadcast a message whenever a cached response + * is updated. + * + * @memberof workbox.broadcastUpdate + */ + + class Plugin { + /** + * Construct a BroadcastCacheUpdate instance with the passed options and + * calls its `notifyIfUpdated()` method whenever the plugin's + * `cacheDidUpdate` callback is invoked. + * + * @param {Object} options + * @param {Array} + * [options.headersToCheck=['content-length', 'etag', 'last-modified']] + * A list of headers that will be used to determine whether the responses + * differ. + * @param {string} [options.channelName='workbox'] The name that will be used + *. when creating the `BroadcastChannel`, which defaults to 'workbox' (the + * channel name used by the `workbox-window` package). + * @param {string} [options.deferNoticationTimeout=10000] The amount of time + * to wait for a ready message from the window on navigation requests + * before sending the update. + */ + constructor(options) { + this._broadcastUpdate = new BroadcastCacheUpdate(options); + } + /** + * A "lifecycle" callback that will be triggered automatically by the + * `workbox-sw` and `workbox-runtime-caching` handlers when an entry is + * added to a cache. + * + * @private + * @param {Object} options The input object to this function. + * @param {string} options.cacheName Name of the cache being updated. + * @param {Response} [options.oldResponse] The previous cached value, if any. + * @param {Response} options.newResponse The new value in the cache. + * @param {Request} options.request The request that triggered the udpate. + * @param {Request} [options.event] The event that triggered the update. + */ + + + cacheDidUpdate({ + cacheName, + oldResponse, + newResponse, + request, + event + }) { + { + assert_mjs.assert.isType(cacheName, 'string', { + moduleName: 'workbox-broadcast-update', + className: 'Plugin', + funcName: 'cacheDidUpdate', + paramName: 'cacheName' + }); + assert_mjs.assert.isInstance(newResponse, Response, { + moduleName: 'workbox-broadcast-update', + className: 'Plugin', + funcName: 'cacheDidUpdate', + paramName: 'newResponse' + }); + assert_mjs.assert.isInstance(request, Request, { + moduleName: 'workbox-broadcast-update', + className: 'Plugin', + funcName: 'cacheDidUpdate', + paramName: 'request' + }); + } + + if (!oldResponse) { + // Without a two responses there is nothing to compare. + return; + } + + this._broadcastUpdate.notifyIfUpdated({ + cacheName, + oldResponse, + newResponse, + event, + url: request.url + }); + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + + exports.BroadcastCacheUpdate = BroadcastCacheUpdate; + exports.Plugin = Plugin; + exports.broadcastUpdate = broadcastUpdate; + exports.responsesAreSame = responsesAreSame; + + return exports; + +}({}, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private)); +//# sourceMappingURL=workbox-broadcast-update.dev.js.map diff --git a/workbox-v4.3.1/workbox-broadcast-update.dev.js.map b/workbox-v4.3.1/workbox-broadcast-update.dev.js.map new file mode 100644 index 00000000..36fc8aad --- /dev/null +++ b/workbox-v4.3.1/workbox-broadcast-update.dev.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-broadcast-update.dev.js","sources":["../_version.mjs","../responsesAreSame.mjs","../utils/constants.mjs","../broadcastUpdate.mjs","../BroadcastCacheUpdate.mjs","../Plugin.mjs","../index.mjs"],"sourcesContent":["try{self['workbox:broadcast-update:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport './_version.mjs';\n\n/**\n * Given two `Response's`, compares several header values to see if they are\n * the same or not.\n *\n * @param {Response} firstResponse\n * @param {Response} secondResponse\n * @param {Array} headersToCheck\n * @return {boolean}\n *\n * @memberof workbox.broadcastUpdate\n * @private\n */\nconst responsesAreSame = (firstResponse, secondResponse, headersToCheck) => {\n if (process.env.NODE_ENV !== 'production') {\n if (!(firstResponse instanceof Response &&\n secondResponse instanceof Response)) {\n throw new WorkboxError('invalid-responses-are-same-args');\n }\n }\n\n const atLeastOneHeaderAvailable = headersToCheck.some((header) => {\n return firstResponse.headers.has(header) &&\n secondResponse.headers.has(header);\n });\n\n if (!atLeastOneHeaderAvailable) {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`Unable to determine where the response has been updated ` +\n `because none of the headers that would be checked are present.`);\n logger.debug(`Attempting to compare the following: `,\n firstResponse, secondResponse, headersToCheck);\n }\n\n // Just return true, indicating the that responses are the same, since we\n // can't determine otherwise.\n return true;\n }\n\n return headersToCheck.every((header) => {\n const headerStateComparison = firstResponse.headers.has(header) ===\n secondResponse.headers.has(header);\n const headerValueComparison = firstResponse.headers.get(header) ===\n secondResponse.headers.get(header);\n\n return headerStateComparison && headerValueComparison;\n });\n};\n\nexport {responsesAreSame};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\nexport const CACHE_UPDATED_MESSAGE_TYPE = 'CACHE_UPDATED';\nexport const CACHE_UPDATED_MESSAGE_META = 'workbox-broadcast-update';\nexport const DEFAULT_BROADCAST_CHANNEL_NAME = 'workbox';\nexport const DEFAULT_DEFER_NOTIFICATION_TIMEOUT = 10000;\nexport const DEFAULT_HEADERS_TO_CHECK = [\n 'content-length',\n 'etag',\n 'last-modified',\n];\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {CACHE_UPDATED_MESSAGE_TYPE, CACHE_UPDATED_MESSAGE_META}\n from './utils/constants.mjs';\n\nimport './_version.mjs';\n\n/**\n * You would not normally call this method directly; it's called automatically\n * by an instance of the {@link BroadcastCacheUpdate} class. It's exposed here\n * for the benefit of developers who would rather not use the full\n * `BroadcastCacheUpdate` implementation.\n *\n * Calling this will dispatch a message on the provided\n * {@link https://developers.google.com/web/updates/2016/09/broadcastchannel|Broadcast Channel}\n * to notify interested subscribers about a change to a cached resource.\n *\n * The message that's posted has a formation inspired by the\n * [Flux standard action](https://github.com/acdlite/flux-standard-action#introduction)\n * format like so:\n *\n * ```\n * {\n * type: 'CACHE_UPDATED',\n * meta: 'workbox-broadcast-update',\n * payload: {\n * cacheName: 'the-cache-name',\n * updatedURL: 'https://example.com/'\n * }\n * }\n * ```\n *\n * (Usage of [Flux](https://facebook.github.io/flux/) itself is not at\n * all required.)\n *\n * @param {Object} options\n * @param {string} options.cacheName The name of the cache in which the updated\n * `Response` was stored.\n * @param {string} options.url The URL associated with the updated `Response`.\n * @param {BroadcastChannel} [options.channel] The `BroadcastChannel` to use.\n * If no channel is set or the browser doesn't support the BroadcastChannel\n * api, then an attempt will be made to `postMessage` each window client.\n *\n * @memberof workbox.broadcastUpdate\n */\nconst broadcastUpdate = async ({channel, cacheName, url}) => {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(cacheName, 'string', {\n moduleName: 'workbox-broadcast-update',\n className: '~',\n funcName: 'broadcastUpdate',\n paramName: 'cacheName',\n });\n assert.isType(url, 'string', {\n moduleName: 'workbox-broadcast-update',\n className: '~',\n funcName: 'broadcastUpdate',\n paramName: 'url',\n });\n }\n\n const data = {\n type: CACHE_UPDATED_MESSAGE_TYPE,\n meta: CACHE_UPDATED_MESSAGE_META,\n payload: {\n cacheName: cacheName,\n updatedURL: url,\n },\n };\n\n if (channel) {\n channel.postMessage(data);\n } else {\n const windows = await clients.matchAll({type: 'window'});\n for (const win of windows) {\n win.postMessage(data);\n }\n }\n};\n\nexport {broadcastUpdate};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {Deferred} from 'workbox-core/_private/Deferred.mjs';\nimport {responsesAreSame} from './responsesAreSame.mjs';\nimport {broadcastUpdate} from './broadcastUpdate.mjs';\n\nimport {DEFAULT_HEADERS_TO_CHECK, DEFAULT_BROADCAST_CHANNEL_NAME,\n DEFAULT_DEFER_NOTIFICATION_TIMEOUT} from './utils/constants.mjs';\n\nimport './_version.mjs';\n\n/**\n * Uses the [Broadcast Channel API]{@link https://developers.google.com/web/updates/2016/09/broadcastchannel}\n * to notify interested parties when a cached response has been updated.\n * In browsers that do not support the Broadcast Channel API, the instance\n * falls back to sending the update via `postMessage()` to all window clients.\n *\n * For efficiency's sake, the underlying response bodies are not compared;\n * only specific response headers are checked.\n *\n * @memberof workbox.broadcastUpdate\n */\nclass BroadcastCacheUpdate {\n /**\n * Construct a BroadcastCacheUpdate instance with a specific `channelName` to\n * broadcast messages on\n *\n * @param {Object} options\n * @param {Array}\n * [options.headersToCheck=['content-length', 'etag', 'last-modified']]\n * A list of headers that will be used to determine whether the responses\n * differ.\n * @param {string} [options.channelName='workbox'] The name that will be used\n *. when creating the `BroadcastChannel`, which defaults to 'workbox' (the\n * channel name used by the `workbox-window` package).\n * @param {string} [options.deferNoticationTimeout=10000] The amount of time\n * to wait for a ready message from the window on navigation requests\n * before sending the update.\n */\n constructor({headersToCheck, channelName, deferNoticationTimeout} = {}) {\n this._headersToCheck = headersToCheck || DEFAULT_HEADERS_TO_CHECK;\n this._channelName = channelName || DEFAULT_BROADCAST_CHANNEL_NAME;\n this._deferNoticationTimeout =\n deferNoticationTimeout || DEFAULT_DEFER_NOTIFICATION_TIMEOUT;\n\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(this._channelName, 'string', {\n moduleName: 'workbox-broadcast-update',\n className: 'BroadcastCacheUpdate',\n funcName: 'constructor',\n paramName: 'channelName',\n });\n assert.isArray(this._headersToCheck, {\n moduleName: 'workbox-broadcast-update',\n className: 'BroadcastCacheUpdate',\n funcName: 'constructor',\n paramName: 'headersToCheck',\n });\n }\n\n this._initWindowReadyDeferreds();\n }\n\n /**\n * Compare two [Responses](https://developer.mozilla.org/en-US/docs/Web/API/Response)\n * and send a message via the\n * {@link https://developers.google.com/web/updates/2016/09/broadcastchannel|Broadcast Channel API}\n * if they differ.\n *\n * Neither of the Responses can be {@link http://stackoverflow.com/questions/39109789|opaque}.\n *\n * @param {Object} options\n * @param {Response} options.oldResponse Cached response to compare.\n * @param {Response} options.newResponse Possibly updated response to compare.\n * @param {string} options.url The URL of the request.\n * @param {string} options.cacheName Name of the cache the responses belong\n * to. This is included in the broadcast message.\n * @param {Event} [options.event] event An optional event that triggered\n * this possible cache update.\n * @return {Promise} Resolves once the update is sent.\n */\n notifyIfUpdated({oldResponse, newResponse, url, cacheName, event}) {\n if (!responsesAreSame(oldResponse, newResponse, this._headersToCheck)) {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Newer response found (and cached) for:`, url);\n }\n\n const sendUpdate = async () => {\n // In the case of a navigation request, the requesting page will likely\n // not have loaded its JavaScript in time to recevied the update\n // notification, so we defer it until ready (or we timeout waiting).\n if (event && event.request && event.request.mode === 'navigate') {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Original request was a navigation request, ` +\n `waiting for a ready message from the window`, event.request);\n }\n await this._windowReadyOrTimeout(event);\n }\n await this._broadcastUpdate({\n channel: this._getChannel(),\n cacheName,\n url,\n });\n };\n\n // Send the update and ensure the SW stays alive until it's sent.\n const done = sendUpdate();\n\n if (event) {\n try {\n event.waitUntil(done);\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`Unable to ensure service worker stays alive ` +\n `when broadcasting cache update for ` +\n `${getFriendlyURL(event.request.url)}'.`);\n }\n }\n }\n return done;\n }\n }\n\n /**\n * NOTE: this is exposed on the instance primarily so it can be spied on\n * in tests.\n *\n * @param {Object} opts\n * @private\n */\n async _broadcastUpdate(opts) {\n await broadcastUpdate(opts);\n }\n\n /**\n * @return {BroadcastChannel|undefined} The BroadcastChannel instance used for\n * broadcasting updates, or undefined if the browser doesn't support the\n * Broadcast Channel API.\n *\n * @private\n */\n _getChannel() {\n if (('BroadcastChannel' in self) && !this._channel) {\n this._channel = new BroadcastChannel(this._channelName);\n }\n return this._channel;\n }\n\n /**\n * Waits for a message from the window indicating that it's capable of\n * receiving broadcasts. By default, this will only wait for the amount of\n * time specified via the `deferNoticationTimeout` option.\n *\n * @param {Event} event The navigation fetch event.\n * @return {Promise}\n * @private\n */\n _windowReadyOrTimeout(event) {\n if (!this._navigationEventsDeferreds.has(event)) {\n const deferred = new Deferred();\n\n // Set the deferred on the `_navigationEventsDeferreds` map so it will\n // be resolved when the next ready message event comes.\n this._navigationEventsDeferreds.set(event, deferred);\n\n // But don't wait too long for the message since it may never come.\n const timeout = setTimeout(() => {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Timed out after ${this._deferNoticationTimeout}` +\n `ms waiting for message from window`);\n }\n deferred.resolve();\n }, this._deferNoticationTimeout);\n\n // Ensure the timeout is cleared if the deferred promise is resolved.\n deferred.promise.then(() => clearTimeout(timeout));\n }\n return this._navigationEventsDeferreds.get(event).promise;\n }\n\n /**\n * Creates a mapping between navigation fetch events and deferreds, and adds\n * a listener for message events from the window. When message events arrive,\n * all deferreds in the mapping are resolved.\n *\n * Note: it would be easier if we could only resolve the deferred of\n * navigation fetch event whose client ID matched the source ID of the\n * message event, but currently client IDs are not exposed on navigation\n * fetch events: https://www.chromestatus.com/feature/4846038800138240\n *\n * @private\n */\n _initWindowReadyDeferreds() {\n // A mapping between navigation events and their deferreds.\n this._navigationEventsDeferreds = new Map();\n\n // The message listener needs to be added in the initial run of the\n // service worker, but since we don't actually need to be listening for\n // messages until the cache updates, we only invoke the callback if set.\n self.addEventListener('message', (event) => {\n if (event.data.type === 'WINDOW_READY' &&\n event.data.meta === 'workbox-window' &&\n this._navigationEventsDeferreds.size > 0) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Received WINDOW_READY event: `, event);\n }\n // Resolve any pending deferreds.\n for (const deferred of this._navigationEventsDeferreds.values()) {\n deferred.resolve();\n }\n this._navigationEventsDeferreds.clear();\n }\n });\n }\n}\n\nexport {BroadcastCacheUpdate};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {BroadcastCacheUpdate} from './BroadcastCacheUpdate.mjs';\nimport './_version.mjs';\n\n/**\n * This plugin will automatically broadcast a message whenever a cached response\n * is updated.\n *\n * @memberof workbox.broadcastUpdate\n */\nclass Plugin {\n /**\n * Construct a BroadcastCacheUpdate instance with the passed options and\n * calls its `notifyIfUpdated()` method whenever the plugin's\n * `cacheDidUpdate` callback is invoked.\n *\n * @param {Object} options\n * @param {Array}\n * [options.headersToCheck=['content-length', 'etag', 'last-modified']]\n * A list of headers that will be used to determine whether the responses\n * differ.\n * @param {string} [options.channelName='workbox'] The name that will be used\n *. when creating the `BroadcastChannel`, which defaults to 'workbox' (the\n * channel name used by the `workbox-window` package).\n * @param {string} [options.deferNoticationTimeout=10000] The amount of time\n * to wait for a ready message from the window on navigation requests\n * before sending the update.\n */\n constructor(options) {\n this._broadcastUpdate = new BroadcastCacheUpdate(options);\n }\n\n /**\n * A \"lifecycle\" callback that will be triggered automatically by the\n * `workbox-sw` and `workbox-runtime-caching` handlers when an entry is\n * added to a cache.\n *\n * @private\n * @param {Object} options The input object to this function.\n * @param {string} options.cacheName Name of the cache being updated.\n * @param {Response} [options.oldResponse] The previous cached value, if any.\n * @param {Response} options.newResponse The new value in the cache.\n * @param {Request} options.request The request that triggered the udpate.\n * @param {Request} [options.event] The event that triggered the update.\n */\n cacheDidUpdate({cacheName, oldResponse, newResponse, request, event}) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(cacheName, 'string', {\n moduleName: 'workbox-broadcast-update',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'cacheName',\n });\n assert.isInstance(newResponse, Response, {\n moduleName: 'workbox-broadcast-update',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'newResponse',\n });\n assert.isInstance(request, Request, {\n moduleName: 'workbox-broadcast-update',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'request',\n });\n }\n\n if (!oldResponse) {\n // Without a two responses there is nothing to compare.\n return;\n }\n this._broadcastUpdate.notifyIfUpdated({\n cacheName,\n oldResponse,\n newResponse,\n event,\n url: request.url,\n });\n }\n}\n\nexport {Plugin};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {BroadcastCacheUpdate} from './BroadcastCacheUpdate.mjs';\nimport {Plugin} from './Plugin.mjs';\nimport {broadcastUpdate} from './broadcastUpdate.mjs';\nimport {responsesAreSame} from './responsesAreSame.mjs';\nimport './_version.mjs';\n\n\n/**\n * @namespace workbox.broadcastUpdate\n */\n\nexport {\n BroadcastCacheUpdate,\n Plugin,\n broadcastUpdate,\n responsesAreSame,\n};\n"],"names":["self","_","e","responsesAreSame","firstResponse","secondResponse","headersToCheck","Response","WorkboxError","atLeastOneHeaderAvailable","some","header","headers","has","logger","warn","debug","every","headerStateComparison","headerValueComparison","get","CACHE_UPDATED_MESSAGE_TYPE","CACHE_UPDATED_MESSAGE_META","DEFAULT_BROADCAST_CHANNEL_NAME","DEFAULT_DEFER_NOTIFICATION_TIMEOUT","DEFAULT_HEADERS_TO_CHECK","broadcastUpdate","channel","cacheName","url","assert","isType","moduleName","className","funcName","paramName","data","type","meta","payload","updatedURL","postMessage","windows","clients","matchAll","win","BroadcastCacheUpdate","constructor","channelName","deferNoticationTimeout","_headersToCheck","_channelName","_deferNoticationTimeout","isArray","_initWindowReadyDeferreds","notifyIfUpdated","oldResponse","newResponse","event","log","sendUpdate","request","mode","_windowReadyOrTimeout","_broadcastUpdate","_getChannel","done","waitUntil","error","getFriendlyURL","opts","_channel","BroadcastChannel","_navigationEventsDeferreds","deferred","Deferred","set","timeout","setTimeout","resolve","promise","then","clearTimeout","Map","addEventListener","size","values","clear","Plugin","options","cacheDidUpdate","isInstance","Request"],"mappings":"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"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-broadcast-update.prod.js b/workbox-v4.3.1/workbox-broadcast-update.prod.js new file mode 100644 index 00000000..b87c70f2 --- /dev/null +++ b/workbox-v4.3.1/workbox-broadcast-update.prod.js @@ -0,0 +1,2 @@ +this.workbox=this.workbox||{},this.workbox.broadcastUpdate=function(e,t){"use strict";try{self["workbox:broadcast-update:4.3.1"]&&_()}catch(e){}const s=(e,t,s)=>{return!s.some(s=>e.headers.has(s)&&t.headers.has(s))||s.every(s=>{const n=e.headers.has(s)===t.headers.has(s),a=e.headers.get(s)===t.headers.get(s);return n&&a})},n="workbox",a=1e4,i=["content-length","etag","last-modified"],o=async({channel:e,cacheName:t,url:s})=>{const n={type:"CACHE_UPDATED",meta:"workbox-broadcast-update",payload:{cacheName:t,updatedURL:s}};if(e)e.postMessage(n);else{const e=await clients.matchAll({type:"window"});for(const t of e)t.postMessage(n)}};class c{constructor({headersToCheck:e,channelName:t,deferNoticationTimeout:s}={}){this.t=e||i,this.s=t||n,this.i=s||a,this.o()}notifyIfUpdated({oldResponse:e,newResponse:t,url:n,cacheName:a,event:i}){if(!s(e,t,this.t)){const e=(async()=>{i&&i.request&&"navigate"===i.request.mode&&await this.h(i),await this.l({channel:this.u(),cacheName:a,url:n})})();if(i)try{i.waitUntil(e)}catch(e){}return e}}async l(e){await o(e)}u(){return"BroadcastChannel"in self&&!this.p&&(this.p=new BroadcastChannel(this.s)),this.p}h(e){if(!this.m.has(e)){const s=new t.Deferred;this.m.set(e,s);const n=setTimeout(()=>{s.resolve()},this.i);s.promise.then(()=>clearTimeout(n))}return this.m.get(e).promise}o(){this.m=new Map,self.addEventListener("message",e=>{if("WINDOW_READY"===e.data.type&&"workbox-window"===e.data.meta&&this.m.size>0){for(const e of this.m.values())e.resolve();this.m.clear()}})}}return e.BroadcastCacheUpdate=c,e.Plugin=class{constructor(e){this.l=new c(e)}cacheDidUpdate({cacheName:e,oldResponse:t,newResponse:s,request:n,event:a}){t&&this.l.notifyIfUpdated({cacheName:e,oldResponse:t,newResponse:s,event:a,url:n.url})}},e.broadcastUpdate=o,e.responsesAreSame=s,e}({},workbox.core._private); +//# sourceMappingURL=workbox-broadcast-update.prod.js.map diff --git a/workbox-v4.3.1/workbox-broadcast-update.prod.js.map b/workbox-v4.3.1/workbox-broadcast-update.prod.js.map new file mode 100644 index 00000000..537aee01 --- /dev/null +++ b/workbox-v4.3.1/workbox-broadcast-update.prod.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-broadcast-update.prod.js","sources":["../_version.mjs","../responsesAreSame.mjs","../utils/constants.mjs","../broadcastUpdate.mjs","../BroadcastCacheUpdate.mjs","../Plugin.mjs"],"sourcesContent":["try{self['workbox:broadcast-update:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport './_version.mjs';\n\n/**\n * Given two `Response's`, compares several header values to see if they are\n * the same or not.\n *\n * @param {Response} firstResponse\n * @param {Response} secondResponse\n * @param {Array} headersToCheck\n * @return {boolean}\n *\n * @memberof workbox.broadcastUpdate\n * @private\n */\nconst responsesAreSame = (firstResponse, secondResponse, headersToCheck) => {\n if (process.env.NODE_ENV !== 'production') {\n if (!(firstResponse instanceof Response &&\n secondResponse instanceof Response)) {\n throw new WorkboxError('invalid-responses-are-same-args');\n }\n }\n\n const atLeastOneHeaderAvailable = headersToCheck.some((header) => {\n return firstResponse.headers.has(header) &&\n secondResponse.headers.has(header);\n });\n\n if (!atLeastOneHeaderAvailable) {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`Unable to determine where the response has been updated ` +\n `because none of the headers that would be checked are present.`);\n logger.debug(`Attempting to compare the following: `,\n firstResponse, secondResponse, headersToCheck);\n }\n\n // Just return true, indicating the that responses are the same, since we\n // can't determine otherwise.\n return true;\n }\n\n return headersToCheck.every((header) => {\n const headerStateComparison = firstResponse.headers.has(header) ===\n secondResponse.headers.has(header);\n const headerValueComparison = firstResponse.headers.get(header) ===\n secondResponse.headers.get(header);\n\n return headerStateComparison && headerValueComparison;\n });\n};\n\nexport {responsesAreSame};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\nexport const CACHE_UPDATED_MESSAGE_TYPE = 'CACHE_UPDATED';\nexport const CACHE_UPDATED_MESSAGE_META = 'workbox-broadcast-update';\nexport const DEFAULT_BROADCAST_CHANNEL_NAME = 'workbox';\nexport const DEFAULT_DEFER_NOTIFICATION_TIMEOUT = 10000;\nexport const DEFAULT_HEADERS_TO_CHECK = [\n 'content-length',\n 'etag',\n 'last-modified',\n];\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {CACHE_UPDATED_MESSAGE_TYPE, CACHE_UPDATED_MESSAGE_META}\n from './utils/constants.mjs';\n\nimport './_version.mjs';\n\n/**\n * You would not normally call this method directly; it's called automatically\n * by an instance of the {@link BroadcastCacheUpdate} class. It's exposed here\n * for the benefit of developers who would rather not use the full\n * `BroadcastCacheUpdate` implementation.\n *\n * Calling this will dispatch a message on the provided\n * {@link https://developers.google.com/web/updates/2016/09/broadcastchannel|Broadcast Channel}\n * to notify interested subscribers about a change to a cached resource.\n *\n * The message that's posted has a formation inspired by the\n * [Flux standard action](https://github.com/acdlite/flux-standard-action#introduction)\n * format like so:\n *\n * ```\n * {\n * type: 'CACHE_UPDATED',\n * meta: 'workbox-broadcast-update',\n * payload: {\n * cacheName: 'the-cache-name',\n * updatedURL: 'https://example.com/'\n * }\n * }\n * ```\n *\n * (Usage of [Flux](https://facebook.github.io/flux/) itself is not at\n * all required.)\n *\n * @param {Object} options\n * @param {string} options.cacheName The name of the cache in which the updated\n * `Response` was stored.\n * @param {string} options.url The URL associated with the updated `Response`.\n * @param {BroadcastChannel} [options.channel] The `BroadcastChannel` to use.\n * If no channel is set or the browser doesn't support the BroadcastChannel\n * api, then an attempt will be made to `postMessage` each window client.\n *\n * @memberof workbox.broadcastUpdate\n */\nconst broadcastUpdate = async ({channel, cacheName, url}) => {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(cacheName, 'string', {\n moduleName: 'workbox-broadcast-update',\n className: '~',\n funcName: 'broadcastUpdate',\n paramName: 'cacheName',\n });\n assert.isType(url, 'string', {\n moduleName: 'workbox-broadcast-update',\n className: '~',\n funcName: 'broadcastUpdate',\n paramName: 'url',\n });\n }\n\n const data = {\n type: CACHE_UPDATED_MESSAGE_TYPE,\n meta: CACHE_UPDATED_MESSAGE_META,\n payload: {\n cacheName: cacheName,\n updatedURL: url,\n },\n };\n\n if (channel) {\n channel.postMessage(data);\n } else {\n const windows = await clients.matchAll({type: 'window'});\n for (const win of windows) {\n win.postMessage(data);\n }\n }\n};\n\nexport {broadcastUpdate};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {Deferred} from 'workbox-core/_private/Deferred.mjs';\nimport {responsesAreSame} from './responsesAreSame.mjs';\nimport {broadcastUpdate} from './broadcastUpdate.mjs';\n\nimport {DEFAULT_HEADERS_TO_CHECK, DEFAULT_BROADCAST_CHANNEL_NAME,\n DEFAULT_DEFER_NOTIFICATION_TIMEOUT} from './utils/constants.mjs';\n\nimport './_version.mjs';\n\n/**\n * Uses the [Broadcast Channel API]{@link https://developers.google.com/web/updates/2016/09/broadcastchannel}\n * to notify interested parties when a cached response has been updated.\n * In browsers that do not support the Broadcast Channel API, the instance\n * falls back to sending the update via `postMessage()` to all window clients.\n *\n * For efficiency's sake, the underlying response bodies are not compared;\n * only specific response headers are checked.\n *\n * @memberof workbox.broadcastUpdate\n */\nclass BroadcastCacheUpdate {\n /**\n * Construct a BroadcastCacheUpdate instance with a specific `channelName` to\n * broadcast messages on\n *\n * @param {Object} options\n * @param {Array}\n * [options.headersToCheck=['content-length', 'etag', 'last-modified']]\n * A list of headers that will be used to determine whether the responses\n * differ.\n * @param {string} [options.channelName='workbox'] The name that will be used\n *. when creating the `BroadcastChannel`, which defaults to 'workbox' (the\n * channel name used by the `workbox-window` package).\n * @param {string} [options.deferNoticationTimeout=10000] The amount of time\n * to wait for a ready message from the window on navigation requests\n * before sending the update.\n */\n constructor({headersToCheck, channelName, deferNoticationTimeout} = {}) {\n this._headersToCheck = headersToCheck || DEFAULT_HEADERS_TO_CHECK;\n this._channelName = channelName || DEFAULT_BROADCAST_CHANNEL_NAME;\n this._deferNoticationTimeout =\n deferNoticationTimeout || DEFAULT_DEFER_NOTIFICATION_TIMEOUT;\n\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(this._channelName, 'string', {\n moduleName: 'workbox-broadcast-update',\n className: 'BroadcastCacheUpdate',\n funcName: 'constructor',\n paramName: 'channelName',\n });\n assert.isArray(this._headersToCheck, {\n moduleName: 'workbox-broadcast-update',\n className: 'BroadcastCacheUpdate',\n funcName: 'constructor',\n paramName: 'headersToCheck',\n });\n }\n\n this._initWindowReadyDeferreds();\n }\n\n /**\n * Compare two [Responses](https://developer.mozilla.org/en-US/docs/Web/API/Response)\n * and send a message via the\n * {@link https://developers.google.com/web/updates/2016/09/broadcastchannel|Broadcast Channel API}\n * if they differ.\n *\n * Neither of the Responses can be {@link http://stackoverflow.com/questions/39109789|opaque}.\n *\n * @param {Object} options\n * @param {Response} options.oldResponse Cached response to compare.\n * @param {Response} options.newResponse Possibly updated response to compare.\n * @param {string} options.url The URL of the request.\n * @param {string} options.cacheName Name of the cache the responses belong\n * to. This is included in the broadcast message.\n * @param {Event} [options.event] event An optional event that triggered\n * this possible cache update.\n * @return {Promise} Resolves once the update is sent.\n */\n notifyIfUpdated({oldResponse, newResponse, url, cacheName, event}) {\n if (!responsesAreSame(oldResponse, newResponse, this._headersToCheck)) {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Newer response found (and cached) for:`, url);\n }\n\n const sendUpdate = async () => {\n // In the case of a navigation request, the requesting page will likely\n // not have loaded its JavaScript in time to recevied the update\n // notification, so we defer it until ready (or we timeout waiting).\n if (event && event.request && event.request.mode === 'navigate') {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Original request was a navigation request, ` +\n `waiting for a ready message from the window`, event.request);\n }\n await this._windowReadyOrTimeout(event);\n }\n await this._broadcastUpdate({\n channel: this._getChannel(),\n cacheName,\n url,\n });\n };\n\n // Send the update and ensure the SW stays alive until it's sent.\n const done = sendUpdate();\n\n if (event) {\n try {\n event.waitUntil(done);\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`Unable to ensure service worker stays alive ` +\n `when broadcasting cache update for ` +\n `${getFriendlyURL(event.request.url)}'.`);\n }\n }\n }\n return done;\n }\n }\n\n /**\n * NOTE: this is exposed on the instance primarily so it can be spied on\n * in tests.\n *\n * @param {Object} opts\n * @private\n */\n async _broadcastUpdate(opts) {\n await broadcastUpdate(opts);\n }\n\n /**\n * @return {BroadcastChannel|undefined} The BroadcastChannel instance used for\n * broadcasting updates, or undefined if the browser doesn't support the\n * Broadcast Channel API.\n *\n * @private\n */\n _getChannel() {\n if (('BroadcastChannel' in self) && !this._channel) {\n this._channel = new BroadcastChannel(this._channelName);\n }\n return this._channel;\n }\n\n /**\n * Waits for a message from the window indicating that it's capable of\n * receiving broadcasts. By default, this will only wait for the amount of\n * time specified via the `deferNoticationTimeout` option.\n *\n * @param {Event} event The navigation fetch event.\n * @return {Promise}\n * @private\n */\n _windowReadyOrTimeout(event) {\n if (!this._navigationEventsDeferreds.has(event)) {\n const deferred = new Deferred();\n\n // Set the deferred on the `_navigationEventsDeferreds` map so it will\n // be resolved when the next ready message event comes.\n this._navigationEventsDeferreds.set(event, deferred);\n\n // But don't wait too long for the message since it may never come.\n const timeout = setTimeout(() => {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Timed out after ${this._deferNoticationTimeout}` +\n `ms waiting for message from window`);\n }\n deferred.resolve();\n }, this._deferNoticationTimeout);\n\n // Ensure the timeout is cleared if the deferred promise is resolved.\n deferred.promise.then(() => clearTimeout(timeout));\n }\n return this._navigationEventsDeferreds.get(event).promise;\n }\n\n /**\n * Creates a mapping between navigation fetch events and deferreds, and adds\n * a listener for message events from the window. When message events arrive,\n * all deferreds in the mapping are resolved.\n *\n * Note: it would be easier if we could only resolve the deferred of\n * navigation fetch event whose client ID matched the source ID of the\n * message event, but currently client IDs are not exposed on navigation\n * fetch events: https://www.chromestatus.com/feature/4846038800138240\n *\n * @private\n */\n _initWindowReadyDeferreds() {\n // A mapping between navigation events and their deferreds.\n this._navigationEventsDeferreds = new Map();\n\n // The message listener needs to be added in the initial run of the\n // service worker, but since we don't actually need to be listening for\n // messages until the cache updates, we only invoke the callback if set.\n self.addEventListener('message', (event) => {\n if (event.data.type === 'WINDOW_READY' &&\n event.data.meta === 'workbox-window' &&\n this._navigationEventsDeferreds.size > 0) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Received WINDOW_READY event: `, event);\n }\n // Resolve any pending deferreds.\n for (const deferred of this._navigationEventsDeferreds.values()) {\n deferred.resolve();\n }\n this._navigationEventsDeferreds.clear();\n }\n });\n }\n}\n\nexport {BroadcastCacheUpdate};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {BroadcastCacheUpdate} from './BroadcastCacheUpdate.mjs';\nimport './_version.mjs';\n\n/**\n * This plugin will automatically broadcast a message whenever a cached response\n * is updated.\n *\n * @memberof workbox.broadcastUpdate\n */\nclass Plugin {\n /**\n * Construct a BroadcastCacheUpdate instance with the passed options and\n * calls its `notifyIfUpdated()` method whenever the plugin's\n * `cacheDidUpdate` callback is invoked.\n *\n * @param {Object} options\n * @param {Array}\n * [options.headersToCheck=['content-length', 'etag', 'last-modified']]\n * A list of headers that will be used to determine whether the responses\n * differ.\n * @param {string} [options.channelName='workbox'] The name that will be used\n *. when creating the `BroadcastChannel`, which defaults to 'workbox' (the\n * channel name used by the `workbox-window` package).\n * @param {string} [options.deferNoticationTimeout=10000] The amount of time\n * to wait for a ready message from the window on navigation requests\n * before sending the update.\n */\n constructor(options) {\n this._broadcastUpdate = new BroadcastCacheUpdate(options);\n }\n\n /**\n * A \"lifecycle\" callback that will be triggered automatically by the\n * `workbox-sw` and `workbox-runtime-caching` handlers when an entry is\n * added to a cache.\n *\n * @private\n * @param {Object} options The input object to this function.\n * @param {string} options.cacheName Name of the cache being updated.\n * @param {Response} [options.oldResponse] The previous cached value, if any.\n * @param {Response} options.newResponse The new value in the cache.\n * @param {Request} options.request The request that triggered the udpate.\n * @param {Request} [options.event] The event that triggered the update.\n */\n cacheDidUpdate({cacheName, oldResponse, newResponse, request, event}) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(cacheName, 'string', {\n moduleName: 'workbox-broadcast-update',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'cacheName',\n });\n assert.isInstance(newResponse, Response, {\n moduleName: 'workbox-broadcast-update',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'newResponse',\n });\n assert.isInstance(request, Request, {\n moduleName: 'workbox-broadcast-update',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'request',\n });\n }\n\n if (!oldResponse) {\n // Without a two responses there is nothing to compare.\n return;\n }\n this._broadcastUpdate.notifyIfUpdated({\n cacheName,\n oldResponse,\n newResponse,\n event,\n url: request.url,\n });\n }\n}\n\nexport {Plugin};\n"],"names":["self","_","e","responsesAreSame","firstResponse","secondResponse","headersToCheck","some","header","headers","has","every","headerStateComparison","headerValueComparison","get","DEFAULT_BROADCAST_CHANNEL_NAME","DEFAULT_DEFER_NOTIFICATION_TIMEOUT","DEFAULT_HEADERS_TO_CHECK","broadcastUpdate","async","channel","cacheName","url","data","type","meta","payload","updatedURL","postMessage","windows","clients","matchAll","win","BroadcastCacheUpdate","constructor","channelName","deferNoticationTimeout","_headersToCheck","_channelName","_deferNoticationTimeout","_initWindowReadyDeferreds","notifyIfUpdated","oldResponse","newResponse","event","this","done","request","mode","_windowReadyOrTimeout","_broadcastUpdate","_getChannel","sendUpdate","waitUntil","error","opts","_channel","BroadcastChannel","_navigationEventsDeferreds","deferred","Deferred","set","timeout","setTimeout","resolve","promise","then","clearTimeout","Map","addEventListener","size","values","clear","options","cacheDidUpdate"],"mappings":"sFAAA,IAAIA,KAAK,mCAAmCC,IAAI,MAAMC,UCwBhDC,EAAmB,CAACC,EAAeC,EAAgBC,YAQrBA,EAAeC,KAAMC,GAC9CJ,EAAcK,QAAQC,IAAIF,IAC/BH,EAAeI,QAAQC,IAAIF,KAgBxBF,EAAeK,MAAOH,UACrBI,EAAwBR,EAAcK,QAAQC,IAAIF,KACtDH,EAAeI,QAAQC,IAAIF,GACvBK,EAAwBT,EAAcK,QAAQK,IAAIN,KACtDH,EAAeI,QAAQK,IAAIN,UAEtBI,GAAyBC,KC5CvBE,EAAiC,UACjCC,EAAqC,IACrCC,EAA2B,CACtC,iBACA,OACA,iBCmCIC,EAAkBC,OAAQC,QAAAA,EAASC,UAAAA,EAAWC,IAAAA,YAgB5CC,EAAO,CACXC,KD3DsC,gBC4DtCC,KD3DsC,2BC4DtCC,QAAS,CACPL,UAAWA,EACXM,WAAYL,OAIZF,EACFA,EAAQQ,YAAYL,OACf,OACCM,QAAgBC,QAAQC,SAAS,CAACP,KAAM,eACzC,MAAMQ,KAAOH,EAChBG,EAAIJ,YAAYL,KCnDtB,MAAMU,EAiBJC,aAAY5B,eAACA,EAAD6B,YAAiBA,EAAjBC,uBAA8BA,GAA0B,SAC7DC,EAAkB/B,GAAkBW,OACpCqB,EAAeH,GAAepB,OAC9BwB,EACDH,GAA0BpB,OAiBzBwB,IAqBPC,iBAAgBC,YAACA,EAADC,YAAcA,EAAdrB,IAA2BA,EAA3BD,UAAgCA,EAAhCuB,MAA2CA,QACpDzC,EAAiBuC,EAAaC,EAAaE,KAAKR,GAAkB,OAwB/DS,EAnBa3B,WAIbyB,GAASA,EAAMG,SAAkC,aAAvBH,EAAMG,QAAQC,YAKpCH,KAAKI,EAAsBL,SAE7BC,KAAKK,EAAiB,CAC1B9B,QAASyB,KAAKM,IACd9B,UAAAA,EACAC,IAAAA,KAKS8B,MAETR,MAEAA,EAAMS,UAAUP,GAChB,MAAOQ,WAQJR,WAWYS,SACfrC,EAAgBqC,GAUxBJ,UACO,qBAAsBnD,OAAU6C,KAAKW,SACnCA,EAAW,IAAIC,iBAAiBZ,KAAKP,IAErCO,KAAKW,EAYdP,EAAsBL,OACfC,KAAKa,EAA2BhD,IAAIkC,GAAQ,OACzCe,EAAW,IAAIC,gBAIhBF,EAA2BG,IAAIjB,EAAOe,SAGrCG,EAAUC,WAAW,KAKzBJ,EAASK,WACRnB,KAAKN,GAGRoB,EAASM,QAAQC,KAAK,IAAMC,aAAaL,WAEpCjB,KAAKa,EAA2B5C,IAAI8B,GAAOqB,QAepDzB,SAEOkB,EAA6B,IAAIU,IAKtCpE,KAAKqE,iBAAiB,UAAYzB,OACR,iBAApBA,EAAMrB,KAAKC,MACS,mBAApBoB,EAAMrB,KAAKE,MACXoB,KAAKa,EAA2BY,KAAO,EAAG,KAKvC,MAAMX,KAAYd,KAAKa,EAA2Ba,SACrDZ,EAASK,eAENN,EAA2Bc,qDCzMxC,MAkBEtC,YAAYuC,QACLvB,EAAmB,IAAIjB,EAAqBwC,GAgBnDC,gBAAerD,UAACA,EAADqB,YAAYA,EAAZC,YAAyBA,EAAzBI,QAAsCA,EAAtCH,MAA+CA,IAsBvDF,QAIAQ,EAAiBT,gBAAgB,CACpCpB,UAAAA,EACAqB,YAAAA,EACAC,YAAAA,EACAC,MAAAA,EACAtB,IAAKyB,EAAQzB"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-cacheable-response.dev.js b/workbox-v4.3.1/workbox-cacheable-response.dev.js new file mode 100644 index 00000000..54a2e499 --- /dev/null +++ b/workbox-v4.3.1/workbox-cacheable-response.dev.js @@ -0,0 +1,200 @@ +this.workbox = this.workbox || {}; +this.workbox.cacheableResponse = (function (exports, WorkboxError_mjs, assert_mjs, getFriendlyURL_mjs, logger_mjs) { + 'use strict'; + + try { + self['workbox:cacheable-response:4.3.1'] && _(); + } catch (e) {} // eslint-disable-line + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * This class allows you to set up rules determining what + * status codes and/or headers need to be present in order for a + * [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response) + * to be considered cacheable. + * + * @memberof workbox.cacheableResponse + */ + + class CacheableResponse { + /** + * To construct a new CacheableResponse instance you must provide at least + * one of the `config` properties. + * + * If both `statuses` and `headers` are specified, then both conditions must + * be met for the `Response` to be considered cacheable. + * + * @param {Object} config + * @param {Array} [config.statuses] One or more status codes that a + * `Response` can have and be considered cacheable. + * @param {Object} [config.headers] A mapping of header names + * and expected values that a `Response` can have and be considered cacheable. + * If multiple headers are provided, only one needs to be present. + */ + constructor(config = {}) { + { + if (!(config.statuses || config.headers)) { + throw new WorkboxError_mjs.WorkboxError('statuses-or-headers-required', { + moduleName: 'workbox-cacheable-response', + className: 'CacheableResponse', + funcName: 'constructor' + }); + } + + if (config.statuses) { + assert_mjs.assert.isArray(config.statuses, { + moduleName: 'workbox-cacheable-response', + className: 'CacheableResponse', + funcName: 'constructor', + paramName: 'config.statuses' + }); + } + + if (config.headers) { + assert_mjs.assert.isType(config.headers, 'object', { + moduleName: 'workbox-cacheable-response', + className: 'CacheableResponse', + funcName: 'constructor', + paramName: 'config.headers' + }); + } + } + + this._statuses = config.statuses; + this._headers = config.headers; + } + /** + * Checks a response to see whether it's cacheable or not, based on this + * object's configuration. + * + * @param {Response} response The response whose cacheability is being + * checked. + * @return {boolean} `true` if the `Response` is cacheable, and `false` + * otherwise. + */ + + + isResponseCacheable(response) { + { + assert_mjs.assert.isInstance(response, Response, { + moduleName: 'workbox-cacheable-response', + className: 'CacheableResponse', + funcName: 'isResponseCacheable', + paramName: 'response' + }); + } + + let cacheable = true; + + if (this._statuses) { + cacheable = this._statuses.includes(response.status); + } + + if (this._headers && cacheable) { + cacheable = Object.keys(this._headers).some(headerName => { + return response.headers.get(headerName) === this._headers[headerName]; + }); + } + + { + if (!cacheable) { + logger_mjs.logger.groupCollapsed(`The request for ` + `'${getFriendlyURL_mjs.getFriendlyURL(response.url)}' returned a response that does ` + `not meet the criteria for being cached.`); + logger_mjs.logger.groupCollapsed(`View cacheability criteria here.`); + logger_mjs.logger.log(`Cacheable statuses: ` + JSON.stringify(this._statuses)); + logger_mjs.logger.log(`Cacheable headers: ` + JSON.stringify(this._headers, null, 2)); + logger_mjs.logger.groupEnd(); + const logFriendlyHeaders = {}; + response.headers.forEach((value, key) => { + logFriendlyHeaders[key] = value; + }); + logger_mjs.logger.groupCollapsed(`View response status and headers here.`); + logger_mjs.logger.log(`Response status: ` + response.status); + logger_mjs.logger.log(`Response headers: ` + JSON.stringify(logFriendlyHeaders, null, 2)); + logger_mjs.logger.groupEnd(); + logger_mjs.logger.groupCollapsed(`View full response details here.`); + logger_mjs.logger.log(response.headers); + logger_mjs.logger.log(response); + logger_mjs.logger.groupEnd(); + logger_mjs.logger.groupEnd(); + } + } + + return cacheable; + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * A class implementing the `cacheWillUpdate` lifecycle callback. This makes it + * easier to add in cacheability checks to requests made via Workbox's built-in + * strategies. + * + * @memberof workbox.cacheableResponse + */ + + class Plugin { + /** + * To construct a new cacheable response Plugin instance you must provide at + * least one of the `config` properties. + * + * If both `statuses` and `headers` are specified, then both conditions must + * be met for the `Response` to be considered cacheable. + * + * @param {Object} config + * @param {Array} [config.statuses] One or more status codes that a + * `Response` can have and be considered cacheable. + * @param {Object} [config.headers] A mapping of header names + * and expected values that a `Response` can have and be considered cacheable. + * If multiple headers are provided, only one needs to be present. + */ + constructor(config) { + this._cacheableResponse = new CacheableResponse(config); + } + /** + * @param {Object} options + * @param {Response} options.response + * @return {boolean} + * @private + */ + + + cacheWillUpdate({ + response + }) { + if (this._cacheableResponse.isResponseCacheable(response)) { + return response; + } + + return null; + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + + exports.CacheableResponse = CacheableResponse; + exports.Plugin = Plugin; + + return exports; + +}({}, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private)); +//# sourceMappingURL=workbox-cacheable-response.dev.js.map diff --git a/workbox-v4.3.1/workbox-cacheable-response.dev.js.map b/workbox-v4.3.1/workbox-cacheable-response.dev.js.map new file mode 100644 index 00000000..86bc6890 --- /dev/null +++ b/workbox-v4.3.1/workbox-cacheable-response.dev.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-cacheable-response.dev.js","sources":["../_version.mjs","../CacheableResponse.mjs","../Plugin.mjs","../index.mjs"],"sourcesContent":["try{self['workbox:cacheable-response:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport './_version.mjs';\n\n/**\n * This class allows you to set up rules determining what\n * status codes and/or headers need to be present in order for a\n * [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)\n * to be considered cacheable.\n *\n * @memberof workbox.cacheableResponse\n */\nclass CacheableResponse {\n /**\n * To construct a new CacheableResponse instance you must provide at least\n * one of the `config` properties.\n *\n * If both `statuses` and `headers` are specified, then both conditions must\n * be met for the `Response` to be considered cacheable.\n *\n * @param {Object} config\n * @param {Array} [config.statuses] One or more status codes that a\n * `Response` can have and be considered cacheable.\n * @param {Object} [config.headers] A mapping of header names\n * and expected values that a `Response` can have and be considered cacheable.\n * If multiple headers are provided, only one needs to be present.\n */\n constructor(config = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (!(config.statuses || config.headers)) {\n throw new WorkboxError('statuses-or-headers-required', {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'constructor',\n });\n }\n\n if (config.statuses) {\n assert.isArray(config.statuses, {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'constructor',\n paramName: 'config.statuses',\n });\n }\n\n if (config.headers) {\n assert.isType(config.headers, 'object', {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'constructor',\n paramName: 'config.headers',\n });\n }\n }\n\n this._statuses = config.statuses;\n this._headers = config.headers;\n }\n\n /**\n * Checks a response to see whether it's cacheable or not, based on this\n * object's configuration.\n *\n * @param {Response} response The response whose cacheability is being\n * checked.\n * @return {boolean} `true` if the `Response` is cacheable, and `false`\n * otherwise.\n */\n isResponseCacheable(response) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(response, Response, {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'isResponseCacheable',\n paramName: 'response',\n });\n }\n\n let cacheable = true;\n\n if (this._statuses) {\n cacheable = this._statuses.includes(response.status);\n }\n\n if (this._headers && cacheable) {\n cacheable = Object.keys(this._headers).some((headerName) => {\n return response.headers.get(headerName) === this._headers[headerName];\n });\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (!cacheable) {\n logger.groupCollapsed(`The request for ` +\n `'${getFriendlyURL(response.url)}' returned a response that does ` +\n `not meet the criteria for being cached.`);\n\n logger.groupCollapsed(`View cacheability criteria here.`);\n logger.log(`Cacheable statuses: ` +\n JSON.stringify(this._statuses));\n logger.log(`Cacheable headers: ` +\n JSON.stringify(this._headers, null, 2));\n logger.groupEnd();\n\n const logFriendlyHeaders = {};\n response.headers.forEach((value, key) => {\n logFriendlyHeaders[key] = value;\n });\n\n logger.groupCollapsed(`View response status and headers here.`);\n logger.log(`Response status: ` + response.status);\n logger.log(`Response headers: ` +\n JSON.stringify(logFriendlyHeaders, null, 2));\n logger.groupEnd();\n\n logger.groupCollapsed(`View full response details here.`);\n logger.log(response.headers);\n logger.log(response);\n logger.groupEnd();\n\n logger.groupEnd();\n }\n }\n\n return cacheable;\n }\n}\n\nexport {CacheableResponse};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {CacheableResponse} from './CacheableResponse.mjs';\nimport './_version.mjs';\n\n/**\n * A class implementing the `cacheWillUpdate` lifecycle callback. This makes it\n * easier to add in cacheability checks to requests made via Workbox's built-in\n * strategies.\n *\n * @memberof workbox.cacheableResponse\n */\nclass Plugin {\n /**\n * To construct a new cacheable response Plugin instance you must provide at\n * least one of the `config` properties.\n *\n * If both `statuses` and `headers` are specified, then both conditions must\n * be met for the `Response` to be considered cacheable.\n *\n * @param {Object} config\n * @param {Array} [config.statuses] One or more status codes that a\n * `Response` can have and be considered cacheable.\n * @param {Object} [config.headers] A mapping of header names\n * and expected values that a `Response` can have and be considered cacheable.\n * If multiple headers are provided, only one needs to be present.\n */\n constructor(config) {\n this._cacheableResponse = new CacheableResponse(config);\n }\n\n /**\n * @param {Object} options\n * @param {Response} options.response\n * @return {boolean}\n * @private\n */\n cacheWillUpdate({response}) {\n if (this._cacheableResponse.isResponseCacheable(response)) {\n return response;\n }\n return null;\n }\n}\n\nexport {Plugin};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {CacheableResponse} from './CacheableResponse.mjs';\nimport {Plugin} from './Plugin.mjs';\nimport './_version.mjs';\n\n\n/**\n * @namespace workbox.cacheableResponse\n */\n\nexport {\n CacheableResponse,\n Plugin,\n};\n"],"names":["self","_","e","CacheableResponse","constructor","config","statuses","headers","WorkboxError","moduleName","className","funcName","assert","isArray","paramName","isType","_statuses","_headers","isResponseCacheable","response","isInstance","Response","cacheable","includes","status","Object","keys","some","headerName","get","logger","groupCollapsed","getFriendlyURL","url","log","JSON","stringify","groupEnd","logFriendlyHeaders","forEach","value","key","Plugin","_cacheableResponse","cacheWillUpdate"],"mappings":"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"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-cacheable-response.prod.js b/workbox-v4.3.1/workbox-cacheable-response.prod.js new file mode 100644 index 00000000..a7e42f26 --- /dev/null +++ b/workbox-v4.3.1/workbox-cacheable-response.prod.js @@ -0,0 +1,2 @@ +this.workbox=this.workbox||{},this.workbox.cacheableResponse=function(t){"use strict";try{self["workbox:cacheable-response:4.3.1"]&&_()}catch(t){}class s{constructor(t={}){this.t=t.statuses,this.s=t.headers}isResponseCacheable(t){let s=!0;return this.t&&(s=this.t.includes(t.status)),this.s&&s&&(s=Object.keys(this.s).some(s=>t.headers.get(s)===this.s[s])),s}}return t.CacheableResponse=s,t.Plugin=class{constructor(t){this.i=new s(t)}cacheWillUpdate({response:t}){return this.i.isResponseCacheable(t)?t:null}},t}({}); +//# sourceMappingURL=workbox-cacheable-response.prod.js.map diff --git a/workbox-v4.3.1/workbox-cacheable-response.prod.js.map b/workbox-v4.3.1/workbox-cacheable-response.prod.js.map new file mode 100644 index 00000000..b1a0d1d2 --- /dev/null +++ b/workbox-v4.3.1/workbox-cacheable-response.prod.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-cacheable-response.prod.js","sources":["../_version.mjs","../CacheableResponse.mjs","../Plugin.mjs"],"sourcesContent":["try{self['workbox:cacheable-response:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport './_version.mjs';\n\n/**\n * This class allows you to set up rules determining what\n * status codes and/or headers need to be present in order for a\n * [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response)\n * to be considered cacheable.\n *\n * @memberof workbox.cacheableResponse\n */\nclass CacheableResponse {\n /**\n * To construct a new CacheableResponse instance you must provide at least\n * one of the `config` properties.\n *\n * If both `statuses` and `headers` are specified, then both conditions must\n * be met for the `Response` to be considered cacheable.\n *\n * @param {Object} config\n * @param {Array} [config.statuses] One or more status codes that a\n * `Response` can have and be considered cacheable.\n * @param {Object} [config.headers] A mapping of header names\n * and expected values that a `Response` can have and be considered cacheable.\n * If multiple headers are provided, only one needs to be present.\n */\n constructor(config = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (!(config.statuses || config.headers)) {\n throw new WorkboxError('statuses-or-headers-required', {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'constructor',\n });\n }\n\n if (config.statuses) {\n assert.isArray(config.statuses, {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'constructor',\n paramName: 'config.statuses',\n });\n }\n\n if (config.headers) {\n assert.isType(config.headers, 'object', {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'constructor',\n paramName: 'config.headers',\n });\n }\n }\n\n this._statuses = config.statuses;\n this._headers = config.headers;\n }\n\n /**\n * Checks a response to see whether it's cacheable or not, based on this\n * object's configuration.\n *\n * @param {Response} response The response whose cacheability is being\n * checked.\n * @return {boolean} `true` if the `Response` is cacheable, and `false`\n * otherwise.\n */\n isResponseCacheable(response) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(response, Response, {\n moduleName: 'workbox-cacheable-response',\n className: 'CacheableResponse',\n funcName: 'isResponseCacheable',\n paramName: 'response',\n });\n }\n\n let cacheable = true;\n\n if (this._statuses) {\n cacheable = this._statuses.includes(response.status);\n }\n\n if (this._headers && cacheable) {\n cacheable = Object.keys(this._headers).some((headerName) => {\n return response.headers.get(headerName) === this._headers[headerName];\n });\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (!cacheable) {\n logger.groupCollapsed(`The request for ` +\n `'${getFriendlyURL(response.url)}' returned a response that does ` +\n `not meet the criteria for being cached.`);\n\n logger.groupCollapsed(`View cacheability criteria here.`);\n logger.log(`Cacheable statuses: ` +\n JSON.stringify(this._statuses));\n logger.log(`Cacheable headers: ` +\n JSON.stringify(this._headers, null, 2));\n logger.groupEnd();\n\n const logFriendlyHeaders = {};\n response.headers.forEach((value, key) => {\n logFriendlyHeaders[key] = value;\n });\n\n logger.groupCollapsed(`View response status and headers here.`);\n logger.log(`Response status: ` + response.status);\n logger.log(`Response headers: ` +\n JSON.stringify(logFriendlyHeaders, null, 2));\n logger.groupEnd();\n\n logger.groupCollapsed(`View full response details here.`);\n logger.log(response.headers);\n logger.log(response);\n logger.groupEnd();\n\n logger.groupEnd();\n }\n }\n\n return cacheable;\n }\n}\n\nexport {CacheableResponse};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {CacheableResponse} from './CacheableResponse.mjs';\nimport './_version.mjs';\n\n/**\n * A class implementing the `cacheWillUpdate` lifecycle callback. This makes it\n * easier to add in cacheability checks to requests made via Workbox's built-in\n * strategies.\n *\n * @memberof workbox.cacheableResponse\n */\nclass Plugin {\n /**\n * To construct a new cacheable response Plugin instance you must provide at\n * least one of the `config` properties.\n *\n * If both `statuses` and `headers` are specified, then both conditions must\n * be met for the `Response` to be considered cacheable.\n *\n * @param {Object} config\n * @param {Array} [config.statuses] One or more status codes that a\n * `Response` can have and be considered cacheable.\n * @param {Object} [config.headers] A mapping of header names\n * and expected values that a `Response` can have and be considered cacheable.\n * If multiple headers are provided, only one needs to be present.\n */\n constructor(config) {\n this._cacheableResponse = new CacheableResponse(config);\n }\n\n /**\n * @param {Object} options\n * @param {Response} options.response\n * @return {boolean}\n * @private\n */\n cacheWillUpdate({response}) {\n if (this._cacheableResponse.isResponseCacheable(response)) {\n return response;\n }\n return null;\n }\n}\n\nexport {Plugin};\n"],"names":["self","_","e","CacheableResponse","constructor","config","_statuses","statuses","_headers","headers","isResponseCacheable","response","cacheable","this","includes","status","Object","keys","some","headerName","get","_cacheableResponse","cacheWillUpdate"],"mappings":"sFAAA,IAAIA,KAAK,qCAAqCC,IAAI,MAAMC,ICsBxD,MAAMC,EAeJC,YAAYC,EAAS,SA6BdC,EAAYD,EAAOE,cACnBC,EAAWH,EAAOI,QAYzBC,oBAAoBC,OAUdC,GAAY,SAEZC,KAAKP,IACPM,EAAYC,KAAKP,EAAUQ,SAASH,EAASI,SAG3CF,KAAKL,GAAYI,IACnBA,EAAYI,OAAOC,KAAKJ,KAAKL,GAAUU,KAAMC,GACpCR,EAASF,QAAQW,IAAID,KAAgBN,KAAKL,EAASW,KAqCvDP,yCCpHX,MAeER,YAAYC,QACLgB,EAAqB,IAAIlB,EAAkBE,GASlDiB,iBAAgBX,SAACA,WACXE,KAAKQ,EAAmBX,oBAAoBC,GACvCA,EAEF"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-core.dev.js b/workbox-v4.3.1/workbox-core.dev.js new file mode 100644 index 00000000..18b8b85f --- /dev/null +++ b/workbox-v4.3.1/workbox-core.dev.js @@ -0,0 +1,1712 @@ +this.workbox = this.workbox || {}; +this.workbox.core = (function (exports) { + 'use strict'; + + try { + self['workbox:core:4.3.1'] && _(); + } catch (e) {} // eslint-disable-line + + /* + Copyright 2019 Google LLC + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const logger = (() => { + let inGroup = false; + const methodToColorMap = { + debug: `#7f8c8d`, + // Gray + log: `#2ecc71`, + // Green + warn: `#f39c12`, + // Yellow + error: `#c0392b`, + // Red + groupCollapsed: `#3498db`, + // Blue + groupEnd: null // No colored prefix on groupEnd + + }; + + const print = function (method, args) { + if (method === 'groupCollapsed') { + // Safari doesn't print all console.groupCollapsed() arguments: + // https://bugs.webkit.org/show_bug.cgi?id=182754 + if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { + console[method](...args); + return; + } + } + + const styles = [`background: ${methodToColorMap[method]}`, `border-radius: 0.5em`, `color: white`, `font-weight: bold`, `padding: 2px 0.5em`]; // When in a group, the workbox prefix is not displayed. + + const logPrefix = inGroup ? [] : ['%cworkbox', styles.join(';')]; + console[method](...logPrefix, ...args); + + if (method === 'groupCollapsed') { + inGroup = true; + } + + if (method === 'groupEnd') { + inGroup = false; + } + }; + + const api = {}; + + for (const method of Object.keys(methodToColorMap)) { + api[method] = (...args) => { + print(method, args); + }; + } + + return api; + })(); + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const messages = { + 'invalid-value': ({ + paramName, + validValueDescription, + value + }) => { + if (!paramName || !validValueDescription) { + throw new Error(`Unexpected input to 'invalid-value' error.`); + } + + return `The '${paramName}' parameter was given a value with an ` + `unexpected value. ${validValueDescription} Received a value of ` + `${JSON.stringify(value)}.`; + }, + 'not-in-sw': ({ + moduleName + }) => { + if (!moduleName) { + throw new Error(`Unexpected input to 'not-in-sw' error.`); + } + + return `The '${moduleName}' must be used in a service worker.`; + }, + 'not-an-array': ({ + moduleName, + className, + funcName, + paramName + }) => { + if (!moduleName || !className || !funcName || !paramName) { + throw new Error(`Unexpected input to 'not-an-array' error.`); + } + + return `The parameter '${paramName}' passed into ` + `'${moduleName}.${className}.${funcName}()' must be an array.`; + }, + 'incorrect-type': ({ + expectedType, + paramName, + moduleName, + className, + funcName + }) => { + if (!expectedType || !paramName || !moduleName || !funcName) { + throw new Error(`Unexpected input to 'incorrect-type' error.`); + } + + return `The parameter '${paramName}' passed into ` + `'${moduleName}.${className ? className + '.' : ''}` + `${funcName}()' must be of type ${expectedType}.`; + }, + 'incorrect-class': ({ + expectedClass, + paramName, + moduleName, + className, + funcName, + isReturnValueProblem + }) => { + if (!expectedClass || !moduleName || !funcName) { + throw new Error(`Unexpected input to 'incorrect-class' error.`); + } + + if (isReturnValueProblem) { + return `The return value from ` + `'${moduleName}.${className ? className + '.' : ''}${funcName}()' ` + `must be an instance of class ${expectedClass.name}.`; + } + + return `The parameter '${paramName}' passed into ` + `'${moduleName}.${className ? className + '.' : ''}${funcName}()' ` + `must be an instance of class ${expectedClass.name}.`; + }, + 'missing-a-method': ({ + expectedMethod, + paramName, + moduleName, + className, + funcName + }) => { + if (!expectedMethod || !paramName || !moduleName || !className || !funcName) { + throw new Error(`Unexpected input to 'missing-a-method' error.`); + } + + return `${moduleName}.${className}.${funcName}() expected the ` + `'${paramName}' parameter to expose a '${expectedMethod}' method.`; + }, + 'add-to-cache-list-unexpected-type': ({ + entry + }) => { + return `An unexpected entry was passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' The entry ` + `'${JSON.stringify(entry)}' isn't supported. You must supply an array of ` + `strings with one or more characters, objects with a url property or ` + `Request objects.`; + }, + 'add-to-cache-list-conflicting-entries': ({ + firstEntry, + secondEntry + }) => { + if (!firstEntry || !secondEntry) { + throw new Error(`Unexpected input to ` + `'add-to-cache-list-duplicate-entries' error.`); + } + + return `Two of the entries passed to ` + `'workbox-precaching.PrecacheController.addToCacheList()' had the URL ` + `${firstEntry._entryId} but different revision details. Workbox is ` + `is unable to cache and version the asset correctly. Please remove one ` + `of the entries.`; + }, + 'plugin-error-request-will-fetch': ({ + thrownError + }) => { + if (!thrownError) { + throw new Error(`Unexpected input to ` + `'plugin-error-request-will-fetch', error.`); + } + + return `An error was thrown by a plugins 'requestWillFetch()' method. ` + `The thrown error message was: '${thrownError.message}'.`; + }, + 'invalid-cache-name': ({ + cacheNameId, + value + }) => { + if (!cacheNameId) { + throw new Error(`Expected a 'cacheNameId' for error 'invalid-cache-name'`); + } + + return `You must provide a name containing at least one character for ` + `setCacheDeatils({${cacheNameId}: '...'}). Received a value of ` + `'${JSON.stringify(value)}'`; + }, + 'unregister-route-but-not-found-with-method': ({ + method + }) => { + if (!method) { + throw new Error(`Unexpected input to ` + `'unregister-route-but-not-found-with-method' error.`); + } + + return `The route you're trying to unregister was not previously ` + `registered for the method type '${method}'.`; + }, + 'unregister-route-route-not-registered': () => { + return `The route you're trying to unregister was not previously ` + `registered.`; + }, + 'queue-replay-failed': ({ + name + }) => { + return `Replaying the background sync queue '${name}' failed.`; + }, + 'duplicate-queue-name': ({ + name + }) => { + return `The Queue name '${name}' is already being used. ` + `All instances of backgroundSync.Queue must be given unique names.`; + }, + 'expired-test-without-max-age': ({ + methodName, + paramName + }) => { + return `The '${methodName}()' method can only be used when the ` + `'${paramName}' is used in the constructor.`; + }, + 'unsupported-route-type': ({ + moduleName, + className, + funcName, + paramName + }) => { + return `The supplied '${paramName}' parameter was an unsupported type. ` + `Please check the docs for ${moduleName}.${className}.${funcName} for ` + `valid input types.`; + }, + 'not-array-of-class': ({ + value, + expectedClass, + moduleName, + className, + funcName, + paramName + }) => { + return `The supplied '${paramName}' parameter must be an array of ` + `'${expectedClass}' objects. Received '${JSON.stringify(value)},'. ` + `Please check the call to ${moduleName}.${className}.${funcName}() ` + `to fix the issue.`; + }, + 'max-entries-or-age-required': ({ + moduleName, + className, + funcName + }) => { + return `You must define either config.maxEntries or config.maxAgeSeconds` + `in ${moduleName}.${className}.${funcName}`; + }, + 'statuses-or-headers-required': ({ + moduleName, + className, + funcName + }) => { + return `You must define either config.statuses or config.headers` + `in ${moduleName}.${className}.${funcName}`; + }, + 'invalid-string': ({ + moduleName, + className, + funcName, + paramName + }) => { + if (!paramName || !moduleName || !funcName) { + throw new Error(`Unexpected input to 'invalid-string' error.`); + } + + return `When using strings, the '${paramName}' parameter must start with ` + `'http' (for cross-origin matches) or '/' (for same-origin matches). ` + `Please see the docs for ${moduleName}.${funcName}() for ` + `more info.`; + }, + 'channel-name-required': () => { + return `You must provide a channelName to construct a ` + `BroadcastCacheUpdate instance.`; + }, + 'invalid-responses-are-same-args': () => { + return `The arguments passed into responsesAreSame() appear to be ` + `invalid. Please ensure valid Responses are used.`; + }, + 'expire-custom-caches-only': () => { + return `You must provide a 'cacheName' property when using the ` + `expiration plugin with a runtime caching strategy.`; + }, + 'unit-must-be-bytes': ({ + normalizedRangeHeader + }) => { + if (!normalizedRangeHeader) { + throw new Error(`Unexpected input to 'unit-must-be-bytes' error.`); + } + + return `The 'unit' portion of the Range header must be set to 'bytes'. ` + `The Range header provided was "${normalizedRangeHeader}"`; + }, + 'single-range-only': ({ + normalizedRangeHeader + }) => { + if (!normalizedRangeHeader) { + throw new Error(`Unexpected input to 'single-range-only' error.`); + } + + return `Multiple ranges are not supported. Please use a single start ` + `value, and optional end value. The Range header provided was ` + `"${normalizedRangeHeader}"`; + }, + 'invalid-range-values': ({ + normalizedRangeHeader + }) => { + if (!normalizedRangeHeader) { + throw new Error(`Unexpected input to 'invalid-range-values' error.`); + } + + return `The Range header is missing both start and end values. At least ` + `one of those values is needed. The Range header provided was ` + `"${normalizedRangeHeader}"`; + }, + 'no-range-header': () => { + return `No Range header was found in the Request provided.`; + }, + 'range-not-satisfiable': ({ + size, + start, + end + }) => { + return `The start (${start}) and end (${end}) values in the Range are ` + `not satisfiable by the cached response, which is ${size} bytes.`; + }, + 'attempt-to-cache-non-get-request': ({ + url, + method + }) => { + return `Unable to cache '${url}' because it is a '${method}' request and ` + `only 'GET' requests can be cached.`; + }, + 'cache-put-with-no-response': ({ + url + }) => { + return `There was an attempt to cache '${url}' but the response was not ` + `defined.`; + }, + 'no-response': ({ + url, + error + }) => { + let message = `The strategy could not generate a response for '${url}'.`; + + if (error) { + message += ` The underlying error is ${error}.`; + } + + return message; + }, + 'bad-precaching-response': ({ + url, + status + }) => { + return `The precaching request for '${url}' failed with an HTTP ` + `status of ${status}.`; + } + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + + const generatorFunction = (code, ...args) => { + const message = messages[code]; + + if (!message) { + throw new Error(`Unable to find message for code '${code}'.`); + } + + return message(...args); + }; + + const messageGenerator = generatorFunction; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Workbox errors should be thrown with this class. + * This allows use to ensure the type easily in tests, + * helps developers identify errors from workbox + * easily and allows use to optimise error + * messages correctly. + * + * @private + */ + + class WorkboxError extends Error { + /** + * + * @param {string} errorCode The error code that + * identifies this particular error. + * @param {Object=} details Any relevant arguments + * that will help developers identify issues should + * be added as a key on the context object. + */ + constructor(errorCode, details) { + let message = messageGenerator(errorCode, details); + super(message); + this.name = errorCode; + this.details = details; + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /* + * This method returns true if the current context is a service worker. + */ + + const isSWEnv = moduleName => { + if (!('ServiceWorkerGlobalScope' in self)) { + throw new WorkboxError('not-in-sw', { + moduleName + }); + } + }; + /* + * This method throws if the supplied value is not an array. + * The destructed values are required to produce a meaningful error for users. + * The destructed and restructured object is so it's clear what is + * needed. + */ + + + const isArray = (value, { + moduleName, + className, + funcName, + paramName + }) => { + if (!Array.isArray(value)) { + throw new WorkboxError('not-an-array', { + moduleName, + className, + funcName, + paramName + }); + } + }; + + const hasMethod = (object, expectedMethod, { + moduleName, + className, + funcName, + paramName + }) => { + const type = typeof object[expectedMethod]; + + if (type !== 'function') { + throw new WorkboxError('missing-a-method', { + paramName, + expectedMethod, + moduleName, + className, + funcName + }); + } + }; + + const isType = (object, expectedType, { + moduleName, + className, + funcName, + paramName + }) => { + if (typeof object !== expectedType) { + throw new WorkboxError('incorrect-type', { + paramName, + expectedType, + moduleName, + className, + funcName + }); + } + }; + + const isInstance = (object, expectedClass, { + moduleName, + className, + funcName, + paramName, + isReturnValueProblem + }) => { + if (!(object instanceof expectedClass)) { + throw new WorkboxError('incorrect-class', { + paramName, + expectedClass, + moduleName, + className, + funcName, + isReturnValueProblem + }); + } + }; + + const isOneOf = (value, validValues, { + paramName + }) => { + if (!validValues.includes(value)) { + throw new WorkboxError('invalid-value', { + paramName, + value, + validValueDescription: `Valid values are ${JSON.stringify(validValues)}.` + }); + } + }; + + const isArrayOfClass = (value, expectedClass, { + moduleName, + className, + funcName, + paramName + }) => { + const error = new WorkboxError('not-array-of-class', { + value, + expectedClass, + moduleName, + className, + funcName, + paramName + }); + + if (!Array.isArray(value)) { + throw error; + } + + for (let item of value) { + if (!(item instanceof expectedClass)) { + throw error; + } + } + }; + + const finalAssertExports = { + hasMethod, + isArray, + isInstance, + isOneOf, + isSWEnv, + isType, + isArrayOfClass + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + + const quotaErrorCallbacks = new Set(); + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Adds a function to the set of quotaErrorCallbacks that will be executed if + * there's a quota error. + * + * @param {Function} callback + * @memberof workbox.core + */ + + function registerQuotaErrorCallback(callback) { + { + finalAssertExports.isType(callback, 'function', { + moduleName: 'workbox-core', + funcName: 'register', + paramName: 'callback' + }); + } + + quotaErrorCallbacks.add(callback); + + { + logger.log('Registered a callback to respond to quota errors.', callback); + } + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const _cacheNameDetails = { + googleAnalytics: 'googleAnalytics', + precache: 'precache-v2', + prefix: 'workbox', + runtime: 'runtime', + suffix: self.registration.scope + }; + + const _createCacheName = cacheName => { + return [_cacheNameDetails.prefix, cacheName, _cacheNameDetails.suffix].filter(value => value.length > 0).join('-'); + }; + + const cacheNames = { + updateDetails: details => { + Object.keys(_cacheNameDetails).forEach(key => { + if (typeof details[key] !== 'undefined') { + _cacheNameDetails[key] = details[key]; + } + }); + }, + getGoogleAnalyticsName: userCacheName => { + return userCacheName || _createCacheName(_cacheNameDetails.googleAnalytics); + }, + getPrecacheName: userCacheName => { + return userCacheName || _createCacheName(_cacheNameDetails.precache); + }, + getPrefix: () => { + return _cacheNameDetails.prefix; + }, + getRuntimeName: userCacheName => { + return userCacheName || _createCacheName(_cacheNameDetails.runtime); + }, + getSuffix: () => { + return _cacheNameDetails.suffix; + } + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + + const getFriendlyURL = url => { + const urlObj = new URL(url, location); + + if (urlObj.origin === location.origin) { + return urlObj.pathname; + } + + return urlObj.href; + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Runs all of the callback functions, one at a time sequentially, in the order + * in which they were registered. + * + * @memberof workbox.core + * @private + */ + + async function executeQuotaErrorCallbacks() { + { + logger.log(`About to run ${quotaErrorCallbacks.size} ` + `callbacks to clean up caches.`); + } + + for (const callback of quotaErrorCallbacks) { + await callback(); + + { + logger.log(callback, 'is complete.'); + } + } + + { + logger.log('Finished running callbacks.'); + } + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const pluginEvents = { + CACHE_DID_UPDATE: 'cacheDidUpdate', + CACHE_KEY_WILL_BE_USED: 'cacheKeyWillBeUsed', + CACHE_WILL_UPDATE: 'cacheWillUpdate', + CACHED_RESPONSE_WILL_BE_USED: 'cachedResponseWillBeUsed', + FETCH_DID_FAIL: 'fetchDidFail', + FETCH_DID_SUCCEED: 'fetchDidSucceed', + REQUEST_WILL_FETCH: 'requestWillFetch' + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const pluginUtils = { + filter: (plugins, callbackName) => { + return plugins.filter(plugin => callbackName in plugin); + } + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Wrapper around cache.put(). + * + * Will call `cacheDidUpdate` on plugins if the cache was updated, using + * `matchOptions` when determining what the old entry is. + * + * @param {Object} options + * @param {string} options.cacheName + * @param {Request} options.request + * @param {Response} options.response + * @param {Event} [options.event] + * @param {Array} [options.plugins=[]] + * @param {Object} [options.matchOptions] + * + * @private + * @memberof module:workbox-core + */ + + const putWrapper = async ({ + cacheName, + request, + response, + event, + plugins = [], + matchOptions + } = {}) => { + { + if (request.method && request.method !== 'GET') { + throw new WorkboxError('attempt-to-cache-non-get-request', { + url: getFriendlyURL(request.url), + method: request.method + }); + } + } + + const effectiveRequest = await _getEffectiveRequest({ + plugins, + request, + mode: 'write' + }); + + if (!response) { + { + logger.error(`Cannot cache non-existent response for ` + `'${getFriendlyURL(effectiveRequest.url)}'.`); + } + + throw new WorkboxError('cache-put-with-no-response', { + url: getFriendlyURL(effectiveRequest.url) + }); + } + + let responseToCache = await _isResponseSafeToCache({ + event, + plugins, + response, + request: effectiveRequest + }); + + if (!responseToCache) { + { + logger.debug(`Response '${getFriendlyURL(effectiveRequest.url)}' will ` + `not be cached.`, responseToCache); + } + + return; + } + + const cache = await caches.open(cacheName); + const updatePlugins = pluginUtils.filter(plugins, pluginEvents.CACHE_DID_UPDATE); + let oldResponse = updatePlugins.length > 0 ? await matchWrapper({ + cacheName, + matchOptions, + request: effectiveRequest + }) : null; + + { + logger.debug(`Updating the '${cacheName}' cache with a new Response for ` + `${getFriendlyURL(effectiveRequest.url)}.`); + } + + try { + await cache.put(effectiveRequest, responseToCache); + } catch (error) { + // See https://developer.mozilla.org/en-US/docs/Web/API/DOMException#exception-QuotaExceededError + if (error.name === 'QuotaExceededError') { + await executeQuotaErrorCallbacks(); + } + + throw error; + } + + for (let plugin of updatePlugins) { + await plugin[pluginEvents.CACHE_DID_UPDATE].call(plugin, { + cacheName, + event, + oldResponse, + newResponse: responseToCache, + request: effectiveRequest + }); + } + }; + /** + * This is a wrapper around cache.match(). + * + * @param {Object} options + * @param {string} options.cacheName Name of the cache to match against. + * @param {Request} options.request The Request that will be used to look up + * cache entries. + * @param {Event} [options.event] The event that propted the action. + * @param {Object} [options.matchOptions] Options passed to cache.match(). + * @param {Array} [options.plugins=[]] Array of plugins. + * @return {Response} A cached response if available. + * + * @private + * @memberof module:workbox-core + */ + + + const matchWrapper = async ({ + cacheName, + request, + event, + matchOptions, + plugins = [] + }) => { + const cache = await caches.open(cacheName); + const effectiveRequest = await _getEffectiveRequest({ + plugins, + request, + mode: 'read' + }); + let cachedResponse = await cache.match(effectiveRequest, matchOptions); + + { + if (cachedResponse) { + logger.debug(`Found a cached response in '${cacheName}'.`); + } else { + logger.debug(`No cached response found in '${cacheName}'.`); + } + } + + for (const plugin of plugins) { + if (pluginEvents.CACHED_RESPONSE_WILL_BE_USED in plugin) { + cachedResponse = await plugin[pluginEvents.CACHED_RESPONSE_WILL_BE_USED].call(plugin, { + cacheName, + event, + matchOptions, + cachedResponse, + request: effectiveRequest + }); + + { + if (cachedResponse) { + finalAssertExports.isInstance(cachedResponse, Response, { + moduleName: 'Plugin', + funcName: pluginEvents.CACHED_RESPONSE_WILL_BE_USED, + isReturnValueProblem: true + }); + } + } + } + } + + return cachedResponse; + }; + /** + * This method will call cacheWillUpdate on the available plugins (or use + * status === 200) to determine if the Response is safe and valid to cache. + * + * @param {Object} options + * @param {Request} options.request + * @param {Response} options.response + * @param {Event} [options.event] + * @param {Array} [options.plugins=[]] + * @return {Promise} + * + * @private + * @memberof module:workbox-core + */ + + + const _isResponseSafeToCache = async ({ + request, + response, + event, + plugins + }) => { + let responseToCache = response; + let pluginsUsed = false; + + for (let plugin of plugins) { + if (pluginEvents.CACHE_WILL_UPDATE in plugin) { + pluginsUsed = true; + responseToCache = await plugin[pluginEvents.CACHE_WILL_UPDATE].call(plugin, { + request, + response: responseToCache, + event + }); + + { + if (responseToCache) { + finalAssertExports.isInstance(responseToCache, Response, { + moduleName: 'Plugin', + funcName: pluginEvents.CACHE_WILL_UPDATE, + isReturnValueProblem: true + }); + } + } + + if (!responseToCache) { + break; + } + } + } + + if (!pluginsUsed) { + { + if (!responseToCache.status === 200) { + if (responseToCache.status === 0) { + logger.warn(`The response for '${request.url}' is an opaque ` + `response. The caching strategy that you're using will not ` + `cache opaque responses by default.`); + } else { + logger.debug(`The response for '${request.url}' returned ` + `a status code of '${response.status}' and won't be cached as a ` + `result.`); + } + } + } + + responseToCache = responseToCache.status === 200 ? responseToCache : null; + } + + return responseToCache ? responseToCache : null; + }; + /** + * Checks the list of plugins for the cacheKeyWillBeUsed callback, and + * executes any of those callbacks found in sequence. The final `Request` object + * returned by the last plugin is treated as the cache key for cache reads + * and/or writes. + * + * @param {Object} options + * @param {Request} options.request + * @param {string} options.mode + * @param {Array} [options.plugins=[]] + * @return {Promise} + * + * @private + * @memberof module:workbox-core + */ + + + const _getEffectiveRequest = async ({ + request, + mode, + plugins + }) => { + const cacheKeyWillBeUsedPlugins = pluginUtils.filter(plugins, pluginEvents.CACHE_KEY_WILL_BE_USED); + let effectiveRequest = request; + + for (const plugin of cacheKeyWillBeUsedPlugins) { + effectiveRequest = await plugin[pluginEvents.CACHE_KEY_WILL_BE_USED].call(plugin, { + mode, + request: effectiveRequest + }); + + if (typeof effectiveRequest === 'string') { + effectiveRequest = new Request(effectiveRequest); + } + + { + finalAssertExports.isInstance(effectiveRequest, Request, { + moduleName: 'Plugin', + funcName: pluginEvents.CACHE_KEY_WILL_BE_USED, + isReturnValueProblem: true + }); + } + } + + return effectiveRequest; + }; + + const cacheWrapper = { + put: putWrapper, + match: matchWrapper + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * A class that wraps common IndexedDB functionality in a promise-based API. + * It exposes all the underlying power and functionality of IndexedDB, but + * wraps the most commonly used features in a way that's much simpler to use. + * + * @private + */ + + class DBWrapper { + /** + * @param {string} name + * @param {number} version + * @param {Object=} [callback] + * @param {!Function} [callbacks.onupgradeneeded] + * @param {!Function} [callbacks.onversionchange] Defaults to + * DBWrapper.prototype._onversionchange when not specified. + * @private + */ + constructor(name, version, { + onupgradeneeded, + onversionchange = this._onversionchange + } = {}) { + this._name = name; + this._version = version; + this._onupgradeneeded = onupgradeneeded; + this._onversionchange = onversionchange; // If this is null, it means the database isn't open. + + this._db = null; + } + /** + * Returns the IDBDatabase instance (not normally needed). + * + * @private + */ + + + get db() { + return this._db; + } + /** + * Opens a connected to an IDBDatabase, invokes any onupgradedneeded + * callback, and added an onversionchange callback to the database. + * + * @return {IDBDatabase} + * @private + */ + + + async open() { + if (this._db) return; + this._db = await new Promise((resolve, reject) => { + // This flag is flipped to true if the timeout callback runs prior + // to the request failing or succeeding. Note: we use a timeout instead + // of an onblocked handler since there are cases where onblocked will + // never never run. A timeout better handles all possible scenarios: + // https://github.com/w3c/IndexedDB/issues/223 + let openRequestTimedOut = false; + setTimeout(() => { + openRequestTimedOut = true; + reject(new Error('The open request was blocked and timed out')); + }, this.OPEN_TIMEOUT); + const openRequest = indexedDB.open(this._name, this._version); + + openRequest.onerror = () => reject(openRequest.error); + + openRequest.onupgradeneeded = evt => { + if (openRequestTimedOut) { + openRequest.transaction.abort(); + evt.target.result.close(); + } else if (this._onupgradeneeded) { + this._onupgradeneeded(evt); + } + }; + + openRequest.onsuccess = ({ + target + }) => { + const db = target.result; + + if (openRequestTimedOut) { + db.close(); + } else { + db.onversionchange = this._onversionchange.bind(this); + resolve(db); + } + }; + }); + return this; + } + /** + * Polyfills the native `getKey()` method. Note, this is overridden at + * runtime if the browser supports the native method. + * + * @param {string} storeName + * @param {*} query + * @return {Array} + * @private + */ + + + async getKey(storeName, query) { + return (await this.getAllKeys(storeName, query, 1))[0]; + } + /** + * Polyfills the native `getAll()` method. Note, this is overridden at + * runtime if the browser supports the native method. + * + * @param {string} storeName + * @param {*} query + * @param {number} count + * @return {Array} + * @private + */ + + + async getAll(storeName, query, count) { + return await this.getAllMatching(storeName, { + query, + count + }); + } + /** + * Polyfills the native `getAllKeys()` method. Note, this is overridden at + * runtime if the browser supports the native method. + * + * @param {string} storeName + * @param {*} query + * @param {number} count + * @return {Array} + * @private + */ + + + async getAllKeys(storeName, query, count) { + return (await this.getAllMatching(storeName, { + query, + count, + includeKeys: true + })).map(({ + key + }) => key); + } + /** + * Supports flexible lookup in an object store by specifying an index, + * query, direction, and count. This method returns an array of objects + * with the signature . + * + * @param {string} storeName + * @param {Object} [opts] + * @param {string} [opts.index] The index to use (if specified). + * @param {*} [opts.query] + * @param {IDBCursorDirection} [opts.direction] + * @param {number} [opts.count] The max number of results to return. + * @param {boolean} [opts.includeKeys] When true, the structure of the + * returned objects is changed from an array of values to an array of + * objects in the form {key, primaryKey, value}. + * @return {Array} + * @private + */ + + + async getAllMatching(storeName, { + index, + query = null, + // IE errors if query === `undefined`. + direction = 'next', + count, + includeKeys + } = {}) { + return await this.transaction([storeName], 'readonly', (txn, done) => { + const store = txn.objectStore(storeName); + const target = index ? store.index(index) : store; + const results = []; + + target.openCursor(query, direction).onsuccess = ({ + target + }) => { + const cursor = target.result; + + if (cursor) { + const { + primaryKey, + key, + value + } = cursor; + results.push(includeKeys ? { + primaryKey, + key, + value + } : value); + + if (count && results.length >= count) { + done(results); + } else { + cursor.continue(); + } + } else { + done(results); + } + }; + }); + } + /** + * Accepts a list of stores, a transaction type, and a callback and + * performs a transaction. A promise is returned that resolves to whatever + * value the callback chooses. The callback holds all the transaction logic + * and is invoked with two arguments: + * 1. The IDBTransaction object + * 2. A `done` function, that's used to resolve the promise when + * when the transaction is done, if passed a value, the promise is + * resolved to that value. + * + * @param {Array} storeNames An array of object store names + * involved in the transaction. + * @param {string} type Can be `readonly` or `readwrite`. + * @param {!Function} callback + * @return {*} The result of the transaction ran by the callback. + * @private + */ + + + async transaction(storeNames, type, callback) { + await this.open(); + return await new Promise((resolve, reject) => { + const txn = this._db.transaction(storeNames, type); + + txn.onabort = ({ + target + }) => reject(target.error); + + txn.oncomplete = () => resolve(); + + callback(txn, value => resolve(value)); + }); + } + /** + * Delegates async to a native IDBObjectStore method. + * + * @param {string} method The method name. + * @param {string} storeName The object store name. + * @param {string} type Can be `readonly` or `readwrite`. + * @param {...*} args The list of args to pass to the native method. + * @return {*} The result of the transaction. + * @private + */ + + + async _call(method, storeName, type, ...args) { + const callback = (txn, done) => { + txn.objectStore(storeName)[method](...args).onsuccess = ({ + target + }) => { + done(target.result); + }; + }; + + return await this.transaction([storeName], type, callback); + } + /** + * The default onversionchange handler, which closes the database so other + * connections can open without being blocked. + * + * @private + */ + + + _onversionchange() { + this.close(); + } + /** + * Closes the connection opened by `DBWrapper.open()`. Generally this method + * doesn't need to be called since: + * 1. It's usually better to keep a connection open since opening + * a new connection is somewhat slow. + * 2. Connections are automatically closed when the reference is + * garbage collected. + * The primary use case for needing to close a connection is when another + * reference (typically in another tab) needs to upgrade it and would be + * blocked by the current, open connection. + * + * @private + */ + + + close() { + if (this._db) { + this._db.close(); + + this._db = null; + } + } + + } // Exposed to let users modify the default timeout on a per-instance + // or global basis. + + DBWrapper.prototype.OPEN_TIMEOUT = 2000; // Wrap native IDBObjectStore methods according to their mode. + + const methodsToWrap = { + 'readonly': ['get', 'count', 'getKey', 'getAll', 'getAllKeys'], + 'readwrite': ['add', 'put', 'clear', 'delete'] + }; + + for (const [mode, methods] of Object.entries(methodsToWrap)) { + for (const method of methods) { + if (method in IDBObjectStore.prototype) { + // Don't use arrow functions here since we're outside of the class. + DBWrapper.prototype[method] = async function (storeName, ...args) { + return await this._call(method, storeName, mode, ...args); + }; + } + } + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * The Deferred class composes Promises in a way that allows for them to be + * resolved or rejected from outside the constructor. In most cases promises + * should be used directly, but Deferreds can be necessary when the logic to + * resolve a promise must be separate. + * + * @private + */ + + class Deferred { + /** + * Creates a promise and exposes its resolve and reject functions as methods. + */ + constructor() { + this.promise = new Promise((resolve, reject) => { + this.resolve = resolve; + this.reject = reject; + }); + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Deletes the database. + * Note: this is exported separately from the DBWrapper module because most + * usages of IndexedDB in workbox dont need deleting, and this way it can be + * reused in tests to delete databases without creating DBWrapper instances. + * + * @param {string} name The database name. + * @private + */ + + const deleteDatabase = async name => { + await new Promise((resolve, reject) => { + const request = indexedDB.deleteDatabase(name); + + request.onerror = ({ + target + }) => { + reject(target.error); + }; + + request.onblocked = () => { + reject(new Error('Delete blocked')); + }; + + request.onsuccess = () => { + resolve(); + }; + }); + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Wrapper around the fetch API. + * + * Will call requestWillFetch on available plugins. + * + * @param {Object} options + * @param {Request|string} options.request + * @param {Object} [options.fetchOptions] + * @param {Event} [options.event] + * @param {Array} [options.plugins=[]] + * @return {Promise} + * + * @private + * @memberof module:workbox-core + */ + + const wrappedFetch = async ({ + request, + fetchOptions, + event, + plugins = [] + }) => { + // We *should* be able to call `await event.preloadResponse` even if it's + // undefined, but for some reason, doing so leads to errors in our Node unit + // tests. To work around that, explicitly check preloadResponse's value first. + if (event && event.preloadResponse) { + const possiblePreloadResponse = await event.preloadResponse; + + if (possiblePreloadResponse) { + { + logger.log(`Using a preloaded navigation response for ` + `'${getFriendlyURL(request.url)}'`); + } + + return possiblePreloadResponse; + } + } + + if (typeof request === 'string') { + request = new Request(request); + } + + { + finalAssertExports.isInstance(request, Request, { + paramName: request, + expectedClass: 'Request', + moduleName: 'workbox-core', + className: 'fetchWrapper', + funcName: 'wrappedFetch' + }); + } + + const failedFetchPlugins = pluginUtils.filter(plugins, pluginEvents.FETCH_DID_FAIL); // If there is a fetchDidFail plugin, we need to save a clone of the + // original request before it's either modified by a requestWillFetch + // plugin or before the original request's body is consumed via fetch(). + + const originalRequest = failedFetchPlugins.length > 0 ? request.clone() : null; + + try { + for (let plugin of plugins) { + if (pluginEvents.REQUEST_WILL_FETCH in plugin) { + request = await plugin[pluginEvents.REQUEST_WILL_FETCH].call(plugin, { + request: request.clone(), + event + }); + + { + if (request) { + finalAssertExports.isInstance(request, Request, { + moduleName: 'Plugin', + funcName: pluginEvents.CACHED_RESPONSE_WILL_BE_USED, + isReturnValueProblem: true + }); + } + } + } + } + } catch (err) { + throw new WorkboxError('plugin-error-request-will-fetch', { + thrownError: err + }); + } // The request can be altered by plugins with `requestWillFetch` making + // the original request (Most likely from a `fetch` event) to be different + // to the Request we make. Pass both to `fetchDidFail` to aid debugging. + + + let pluginFilteredRequest = request.clone(); + + try { + let fetchResponse; // See https://github.com/GoogleChrome/workbox/issues/1796 + + if (request.mode === 'navigate') { + fetchResponse = await fetch(request); + } else { + fetchResponse = await fetch(request, fetchOptions); + } + + { + logger.debug(`Network request for ` + `'${getFriendlyURL(request.url)}' returned a response with ` + `status '${fetchResponse.status}'.`); + } + + for (const plugin of plugins) { + if (pluginEvents.FETCH_DID_SUCCEED in plugin) { + fetchResponse = await plugin[pluginEvents.FETCH_DID_SUCCEED].call(plugin, { + event, + request: pluginFilteredRequest, + response: fetchResponse + }); + + { + if (fetchResponse) { + finalAssertExports.isInstance(fetchResponse, Response, { + moduleName: 'Plugin', + funcName: pluginEvents.FETCH_DID_SUCCEED, + isReturnValueProblem: true + }); + } + } + } + } + + return fetchResponse; + } catch (error) { + { + logger.error(`Network request for ` + `'${getFriendlyURL(request.url)}' threw an error.`, error); + } + + for (const plugin of failedFetchPlugins) { + await plugin[pluginEvents.FETCH_DID_FAIL].call(plugin, { + error, + event, + originalRequest: originalRequest.clone(), + request: pluginFilteredRequest.clone() + }); + } + + throw error; + } + }; + + const fetchWrapper = { + fetch: wrappedFetch + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + + var _private = /*#__PURE__*/Object.freeze({ + assert: finalAssertExports, + cacheNames: cacheNames, + cacheWrapper: cacheWrapper, + DBWrapper: DBWrapper, + Deferred: Deferred, + deleteDatabase: deleteDatabase, + executeQuotaErrorCallbacks: executeQuotaErrorCallbacks, + fetchWrapper: fetchWrapper, + getFriendlyURL: getFriendlyURL, + logger: logger, + WorkboxError: WorkboxError + }); + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Claim any currently available clients once the service worker + * becomes active. This is normally used in conjunction with `skipWaiting()`. + * + * @alias workbox.core.clientsClaim + */ + + const clientsClaim = () => { + addEventListener('activate', () => clients.claim()); + }; + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Get the current cache names and prefix/suffix used by Workbox. + * + * `cacheNames.precache` is used for precached assets, + * `cacheNames.googleAnalytics` is used by `workbox-google-analytics` to + * store `analytics.js`, and `cacheNames.runtime` is used for everything else. + * + * `cacheNames.prefix` can be used to retrieve just the current prefix value. + * `cacheNames.suffix` can be used to retrieve just the current suffix value. + * + * @return {Object} An object with `precache`, `runtime`, `prefix`, and + * `googleAnalytics` properties. + * + * @alias workbox.core.cacheNames + */ + + const cacheNames$1 = { + get googleAnalytics() { + return cacheNames.getGoogleAnalyticsName(); + }, + + get precache() { + return cacheNames.getPrecacheName(); + }, + + get prefix() { + return cacheNames.getPrefix(); + }, + + get runtime() { + return cacheNames.getRuntimeName(); + }, + + get suffix() { + return cacheNames.getSuffix(); + } + + }; + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Modifies the default cache names used by the Workbox packages. + * Cache names are generated as `--`. + * + * @param {Object} details + * @param {Object} [details.prefix] The string to add to the beginning of + * the precache and runtime cache names. + * @param {Object} [details.suffix] The string to add to the end of + * the precache and runtime cache names. + * @param {Object} [details.precache] The cache name to use for precache + * caching. + * @param {Object} [details.runtime] The cache name to use for runtime caching. + * @param {Object} [details.googleAnalytics] The cache name to use for + * `workbox-google-analytics` caching. + * + * @alias workbox.core.setCacheNameDetails + */ + + const setCacheNameDetails = details => { + { + Object.keys(details).forEach(key => { + finalAssertExports.isType(details[key], 'string', { + moduleName: 'workbox-core', + funcName: 'setCacheNameDetails', + paramName: `details.${key}` + }); + }); + + if ('precache' in details && details.precache.length === 0) { + throw new WorkboxError('invalid-cache-name', { + cacheNameId: 'precache', + value: details.precache + }); + } + + if ('runtime' in details && details.runtime.length === 0) { + throw new WorkboxError('invalid-cache-name', { + cacheNameId: 'runtime', + value: details.runtime + }); + } + + if ('googleAnalytics' in details && details.googleAnalytics.length === 0) { + throw new WorkboxError('invalid-cache-name', { + cacheNameId: 'googleAnalytics', + value: details.googleAnalytics + }); + } + } + + cacheNames.updateDetails(details); + }; + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Force a service worker to become active, instead of waiting. This is + * normally used in conjunction with `clientsClaim()`. + * + * @alias workbox.core.skipWaiting + */ + + const skipWaiting = () => { + // We need to explicitly call `self.skipWaiting()` here because we're + // shadowing `skipWaiting` with this local function. + addEventListener('install', () => self.skipWaiting()); + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + + try { + self.workbox.v = self.workbox.v || {}; + } catch (errer) {} // NOOP + + exports._private = _private; + exports.clientsClaim = clientsClaim; + exports.cacheNames = cacheNames$1; + exports.registerQuotaErrorCallback = registerQuotaErrorCallback; + exports.setCacheNameDetails = setCacheNameDetails; + exports.skipWaiting = skipWaiting; + + return exports; + +}({})); +//# sourceMappingURL=workbox-core.dev.js.map diff --git a/workbox-v4.3.1/workbox-core.dev.js.map b/workbox-v4.3.1/workbox-core.dev.js.map new file mode 100644 index 00000000..879a7658 --- /dev/null +++ b/workbox-v4.3.1/workbox-core.dev.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-core.dev.js","sources":["../_version.mjs","../_private/logger.mjs","../models/messages/messages.mjs","../models/messages/messageGenerator.mjs","../_private/WorkboxError.mjs","../_private/assert.mjs","../models/quotaErrorCallbacks.mjs","../registerQuotaErrorCallback.mjs","../_private/cacheNames.mjs","../_private/getFriendlyURL.mjs","../_private/executeQuotaErrorCallbacks.mjs","../models/pluginEvents.mjs","../utils/pluginUtils.mjs","../_private/cacheWrapper.mjs","../_private/DBWrapper.mjs","../_private/Deferred.mjs","../_private/deleteDatabase.mjs","../_private/fetchWrapper.mjs","../_private.mjs","../clientsClaim.mjs","../cacheNames.mjs","../setCacheNameDetails.mjs","../skipWaiting.mjs","../index.mjs"],"sourcesContent":["try{self['workbox:core:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\nconst logger = process.env.NODE_ENV === 'production' ? null : (() => {\n let inGroup = false;\n\n const methodToColorMap = {\n debug: `#7f8c8d`, // Gray\n log: `#2ecc71`, // Green\n warn: `#f39c12`, // Yellow\n error: `#c0392b`, // Red\n groupCollapsed: `#3498db`, // Blue\n groupEnd: null, // No colored prefix on groupEnd\n };\n\n const print = function(method, args) {\n if (method === 'groupCollapsed') {\n // Safari doesn't print all console.groupCollapsed() arguments:\n // https://bugs.webkit.org/show_bug.cgi?id=182754\n if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n console[method](...args);\n return;\n }\n }\n\n const styles = [\n `background: ${methodToColorMap[method]}`,\n `border-radius: 0.5em`,\n `color: white`,\n `font-weight: bold`,\n `padding: 2px 0.5em`,\n ];\n\n // When in a group, the workbox prefix is not displayed.\n const logPrefix = inGroup ? [] : ['%cworkbox', styles.join(';')];\n\n console[method](...logPrefix, ...args);\n\n if (method === 'groupCollapsed') {\n inGroup = true;\n }\n if (method === 'groupEnd') {\n inGroup = false;\n }\n };\n\n const api = {};\n for (const method of Object.keys(methodToColorMap)) {\n api[method] = (...args) => {\n print(method, args);\n };\n }\n\n return api;\n})();\n\nexport {logger};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../../_version.mjs';\n\n\nexport const messages = {\n 'invalid-value': ({paramName, validValueDescription, value}) => {\n if (!paramName || !validValueDescription) {\n throw new Error(`Unexpected input to 'invalid-value' error.`);\n }\n return `The '${paramName}' parameter was given a value with an ` +\n `unexpected value. ${validValueDescription} Received a value of ` +\n `${JSON.stringify(value)}.`;\n },\n\n 'not-in-sw': ({moduleName}) => {\n if (!moduleName) {\n throw new Error(`Unexpected input to 'not-in-sw' error.`);\n }\n return `The '${moduleName}' must be used in a service worker.`;\n },\n\n 'not-an-array': ({moduleName, className, funcName, paramName}) => {\n if (!moduleName || !className || !funcName || !paramName) {\n throw new Error(`Unexpected input to 'not-an-array' error.`);\n }\n return `The parameter '${paramName}' passed into ` +\n `'${moduleName}.${className}.${funcName}()' must be an array.`;\n },\n\n 'incorrect-type': ({expectedType, paramName, moduleName, className,\n funcName}) => {\n if (!expectedType || !paramName || !moduleName || !funcName) {\n throw new Error(`Unexpected input to 'incorrect-type' error.`);\n }\n return `The parameter '${paramName}' passed into ` +\n `'${moduleName}.${className ? (className + '.') : ''}` +\n `${funcName}()' must be of type ${expectedType}.`;\n },\n\n 'incorrect-class': ({expectedClass, paramName, moduleName, className,\n funcName, isReturnValueProblem}) => {\n if (!expectedClass || !moduleName || !funcName) {\n throw new Error(`Unexpected input to 'incorrect-class' error.`);\n }\n\n if (isReturnValueProblem) {\n return `The return value from ` +\n `'${moduleName}.${className ? (className + '.') : ''}${funcName}()' ` +\n `must be an instance of class ${expectedClass.name}.`;\n }\n\n return `The parameter '${paramName}' passed into ` +\n `'${moduleName}.${className ? (className + '.') : ''}${funcName}()' ` +\n `must be an instance of class ${expectedClass.name}.`;\n },\n\n 'missing-a-method': ({expectedMethod, paramName, moduleName, className,\n funcName}) => {\n if (!expectedMethod || !paramName || !moduleName || !className\n || !funcName) {\n throw new Error(`Unexpected input to 'missing-a-method' error.`);\n }\n return `${moduleName}.${className}.${funcName}() expected the ` +\n `'${paramName}' parameter to expose a '${expectedMethod}' method.`;\n },\n\n 'add-to-cache-list-unexpected-type': ({entry}) => {\n return `An unexpected entry was passed to ` +\n `'workbox-precaching.PrecacheController.addToCacheList()' The entry ` +\n `'${JSON.stringify(entry)}' isn't supported. You must supply an array of ` +\n `strings with one or more characters, objects with a url property or ` +\n `Request objects.`;\n },\n\n 'add-to-cache-list-conflicting-entries': ({firstEntry, secondEntry}) => {\n if (!firstEntry || !secondEntry) {\n throw new Error(`Unexpected input to ` +\n `'add-to-cache-list-duplicate-entries' error.`);\n }\n\n return `Two of the entries passed to ` +\n `'workbox-precaching.PrecacheController.addToCacheList()' had the URL ` +\n `${firstEntry._entryId} but different revision details. Workbox is ` +\n `is unable to cache and version the asset correctly. Please remove one ` +\n `of the entries.`;\n },\n\n 'plugin-error-request-will-fetch': ({thrownError}) => {\n if (!thrownError) {\n throw new Error(`Unexpected input to ` +\n `'plugin-error-request-will-fetch', error.`);\n }\n\n return `An error was thrown by a plugins 'requestWillFetch()' method. ` +\n `The thrown error message was: '${thrownError.message}'.`;\n },\n\n 'invalid-cache-name': ({cacheNameId, value}) => {\n if (!cacheNameId) {\n throw new Error(\n `Expected a 'cacheNameId' for error 'invalid-cache-name'`);\n }\n\n return `You must provide a name containing at least one character for ` +\n `setCacheDeatils({${cacheNameId}: '...'}). Received a value of ` +\n `'${JSON.stringify(value)}'`;\n },\n\n 'unregister-route-but-not-found-with-method': ({method}) => {\n if (!method) {\n throw new Error(`Unexpected input to ` +\n `'unregister-route-but-not-found-with-method' error.`);\n }\n\n return `The route you're trying to unregister was not previously ` +\n `registered for the method type '${method}'.`;\n },\n\n 'unregister-route-route-not-registered': () => {\n return `The route you're trying to unregister was not previously ` +\n `registered.`;\n },\n\n 'queue-replay-failed': ({name}) => {\n return `Replaying the background sync queue '${name}' failed.`;\n },\n\n 'duplicate-queue-name': ({name}) => {\n return `The Queue name '${name}' is already being used. ` +\n `All instances of backgroundSync.Queue must be given unique names.`;\n },\n\n 'expired-test-without-max-age': ({methodName, paramName}) => {\n return `The '${methodName}()' method can only be used when the ` +\n `'${paramName}' is used in the constructor.`;\n },\n\n 'unsupported-route-type': ({moduleName, className, funcName, paramName}) => {\n return `The supplied '${paramName}' parameter was an unsupported type. ` +\n `Please check the docs for ${moduleName}.${className}.${funcName} for ` +\n `valid input types.`;\n },\n\n 'not-array-of-class': ({value, expectedClass,\n moduleName, className, funcName, paramName}) => {\n return `The supplied '${paramName}' parameter must be an array of ` +\n `'${expectedClass}' objects. Received '${JSON.stringify(value)},'. ` +\n `Please check the call to ${moduleName}.${className}.${funcName}() ` +\n `to fix the issue.`;\n },\n\n 'max-entries-or-age-required': ({moduleName, className, funcName}) => {\n return `You must define either config.maxEntries or config.maxAgeSeconds` +\n `in ${moduleName}.${className}.${funcName}`;\n },\n\n 'statuses-or-headers-required': ({moduleName, className, funcName}) => {\n return `You must define either config.statuses or config.headers` +\n `in ${moduleName}.${className}.${funcName}`;\n },\n\n 'invalid-string': ({moduleName, className, funcName, paramName}) => {\n if (!paramName || !moduleName || !funcName) {\n throw new Error(`Unexpected input to 'invalid-string' error.`);\n }\n return `When using strings, the '${paramName}' parameter must start with ` +\n `'http' (for cross-origin matches) or '/' (for same-origin matches). ` +\n `Please see the docs for ${moduleName}.${funcName}() for ` +\n `more info.`;\n },\n\n 'channel-name-required': () => {\n return `You must provide a channelName to construct a ` +\n `BroadcastCacheUpdate instance.`;\n },\n\n 'invalid-responses-are-same-args': () => {\n return `The arguments passed into responsesAreSame() appear to be ` +\n `invalid. Please ensure valid Responses are used.`;\n },\n\n 'expire-custom-caches-only': () => {\n return `You must provide a 'cacheName' property when using the ` +\n `expiration plugin with a runtime caching strategy.`;\n },\n\n 'unit-must-be-bytes': ({normalizedRangeHeader}) => {\n if (!normalizedRangeHeader) {\n throw new Error(`Unexpected input to 'unit-must-be-bytes' error.`);\n }\n return `The 'unit' portion of the Range header must be set to 'bytes'. ` +\n `The Range header provided was \"${normalizedRangeHeader}\"`;\n },\n\n 'single-range-only': ({normalizedRangeHeader}) => {\n if (!normalizedRangeHeader) {\n throw new Error(`Unexpected input to 'single-range-only' error.`);\n }\n return `Multiple ranges are not supported. Please use a single start ` +\n `value, and optional end value. The Range header provided was ` +\n `\"${normalizedRangeHeader}\"`;\n },\n\n 'invalid-range-values': ({normalizedRangeHeader}) => {\n if (!normalizedRangeHeader) {\n throw new Error(`Unexpected input to 'invalid-range-values' error.`);\n }\n return `The Range header is missing both start and end values. At least ` +\n `one of those values is needed. The Range header provided was ` +\n `\"${normalizedRangeHeader}\"`;\n },\n\n 'no-range-header': () => {\n return `No Range header was found in the Request provided.`;\n },\n\n 'range-not-satisfiable': ({size, start, end}) => {\n return `The start (${start}) and end (${end}) values in the Range are ` +\n `not satisfiable by the cached response, which is ${size} bytes.`;\n },\n\n 'attempt-to-cache-non-get-request': ({url, method}) => {\n return `Unable to cache '${url}' because it is a '${method}' request and ` +\n `only 'GET' requests can be cached.`;\n },\n\n 'cache-put-with-no-response': ({url}) => {\n return `There was an attempt to cache '${url}' but the response was not ` +\n `defined.`;\n },\n\n 'no-response': ({url, error}) => {\n let message = `The strategy could not generate a response for '${url}'.`;\n if (error) {\n message += ` The underlying error is ${error}.`;\n }\n return message;\n },\n\n 'bad-precaching-response': ({url, status}) => {\n return `The precaching request for '${url}' failed with an HTTP ` +\n `status of ${status}.`;\n },\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {messages} from './messages.mjs';\nimport '../../_version.mjs';\n\nconst fallback = (code, ...args) => {\n let msg = code;\n if (args.length > 0) {\n msg += ` :: ${JSON.stringify(args)}`;\n }\n return msg;\n};\n\nconst generatorFunction = (code, ...args) => {\n const message = messages[code];\n if (!message) {\n throw new Error(`Unable to find message for code '${code}'.`);\n }\n\n return message(...args);\n};\n\nexport const messageGenerator = (process.env.NODE_ENV === 'production') ?\n fallback : generatorFunction;\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {messageGenerator} from '../models/messages/messageGenerator.mjs';\nimport '../_version.mjs';\n\n/**\n * Workbox errors should be thrown with this class.\n * This allows use to ensure the type easily in tests,\n * helps developers identify errors from workbox\n * easily and allows use to optimise error\n * messages correctly.\n *\n * @private\n */\nclass WorkboxError extends Error {\n /**\n *\n * @param {string} errorCode The error code that\n * identifies this particular error.\n * @param {Object=} details Any relevant arguments\n * that will help developers identify issues should\n * be added as a key on the context object.\n */\n constructor(errorCode, details) {\n let message = messageGenerator(errorCode, details);\n\n super(message);\n\n this.name = errorCode;\n this.details = details;\n }\n}\n\nexport {WorkboxError};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from '../_private/WorkboxError.mjs';\nimport '../_version.mjs';\n\n/*\n * This method returns true if the current context is a service worker.\n */\nconst isSWEnv = (moduleName) => {\n if (!('ServiceWorkerGlobalScope' in self)) {\n throw new WorkboxError('not-in-sw', {moduleName});\n }\n};\n\n/*\n * This method throws if the supplied value is not an array.\n * The destructed values are required to produce a meaningful error for users.\n * The destructed and restructured object is so it's clear what is\n * needed.\n */\nconst isArray = (value, {moduleName, className, funcName, paramName}) => {\n if (!Array.isArray(value)) {\n throw new WorkboxError('not-an-array', {\n moduleName,\n className,\n funcName,\n paramName,\n });\n }\n};\n\nconst hasMethod = (object, expectedMethod,\n {moduleName, className, funcName, paramName}) => {\n const type = typeof object[expectedMethod];\n if (type !== 'function') {\n throw new WorkboxError('missing-a-method', {paramName, expectedMethod,\n moduleName, className, funcName});\n }\n};\n\nconst isType = (object, expectedType,\n {moduleName, className, funcName, paramName}) => {\n if (typeof object !== expectedType) {\n throw new WorkboxError('incorrect-type', {paramName, expectedType,\n moduleName, className, funcName});\n }\n};\n\nconst isInstance = (object, expectedClass,\n {moduleName, className, funcName,\n paramName, isReturnValueProblem}) => {\n if (!(object instanceof expectedClass)) {\n throw new WorkboxError('incorrect-class', {paramName, expectedClass,\n moduleName, className, funcName, isReturnValueProblem});\n }\n};\n\nconst isOneOf = (value, validValues, {paramName}) => {\n if (!validValues.includes(value)) {\n throw new WorkboxError('invalid-value', {\n paramName,\n value,\n validValueDescription: `Valid values are ${JSON.stringify(validValues)}.`,\n });\n }\n};\n\nconst isArrayOfClass = (value, expectedClass,\n {moduleName, className, funcName, paramName}) => {\n const error = new WorkboxError('not-array-of-class', {\n value, expectedClass,\n moduleName, className, funcName, paramName,\n });\n if (!Array.isArray(value)) {\n throw error;\n }\n\n for (let item of value) {\n if (!(item instanceof expectedClass)) {\n throw error;\n }\n }\n};\n\nconst finalAssertExports = process.env.NODE_ENV === 'production' ? null : {\n hasMethod,\n isArray,\n isInstance,\n isOneOf,\n isSWEnv,\n isType,\n isArrayOfClass,\n};\n\nexport {finalAssertExports as assert};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n// Callbacks to be executed whenever there's a quota error.\nconst quotaErrorCallbacks = new Set();\n\nexport {quotaErrorCallbacks};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {logger} from './_private/logger.mjs';\nimport {assert} from './_private/assert.mjs';\nimport {quotaErrorCallbacks} from './models/quotaErrorCallbacks.mjs';\nimport './_version.mjs';\n\n\n/**\n * Adds a function to the set of quotaErrorCallbacks that will be executed if\n * there's a quota error.\n *\n * @param {Function} callback\n * @memberof workbox.core\n */\nfunction registerQuotaErrorCallback(callback) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(callback, 'function', {\n moduleName: 'workbox-core',\n funcName: 'register',\n paramName: 'callback',\n });\n }\n\n quotaErrorCallbacks.add(callback);\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Registered a callback to respond to quota errors.', callback);\n }\n}\n\nexport {registerQuotaErrorCallback};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\nconst _cacheNameDetails = {\n googleAnalytics: 'googleAnalytics',\n precache: 'precache-v2',\n prefix: 'workbox',\n runtime: 'runtime',\n suffix: self.registration.scope,\n};\n\nconst _createCacheName = (cacheName) => {\n return [_cacheNameDetails.prefix, cacheName, _cacheNameDetails.suffix]\n .filter((value) => value.length > 0)\n .join('-');\n};\n\nexport const cacheNames = {\n updateDetails: (details) => {\n Object.keys(_cacheNameDetails).forEach((key) => {\n if (typeof details[key] !== 'undefined') {\n _cacheNameDetails[key] = details[key];\n }\n });\n },\n getGoogleAnalyticsName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.googleAnalytics);\n },\n getPrecacheName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.precache);\n },\n getPrefix: () => {\n return _cacheNameDetails.prefix;\n },\n getRuntimeName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.runtime);\n },\n getSuffix: () => {\n return _cacheNameDetails.suffix;\n },\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\nconst getFriendlyURL = (url) => {\n const urlObj = new URL(url, location);\n if (urlObj.origin === location.origin) {\n return urlObj.pathname;\n }\n return urlObj.href;\n};\n\nexport {getFriendlyURL};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {logger} from '../_private/logger.mjs';\nimport {quotaErrorCallbacks} from '../models/quotaErrorCallbacks.mjs';\nimport '../_version.mjs';\n\n\n/**\n * Runs all of the callback functions, one at a time sequentially, in the order\n * in which they were registered.\n *\n * @memberof workbox.core\n * @private\n */\nasync function executeQuotaErrorCallbacks() {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`About to run ${quotaErrorCallbacks.size} ` +\n `callbacks to clean up caches.`);\n }\n\n for (const callback of quotaErrorCallbacks) {\n await callback();\n if (process.env.NODE_ENV !== 'production') {\n logger.log(callback, 'is complete.');\n }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Finished running callbacks.');\n }\n}\n\nexport {executeQuotaErrorCallbacks};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\nexport const pluginEvents = {\n CACHE_DID_UPDATE: 'cacheDidUpdate',\n CACHE_KEY_WILL_BE_USED: 'cacheKeyWillBeUsed',\n CACHE_WILL_UPDATE: 'cacheWillUpdate',\n CACHED_RESPONSE_WILL_BE_USED: 'cachedResponseWillBeUsed',\n FETCH_DID_FAIL: 'fetchDidFail',\n FETCH_DID_SUCCEED: 'fetchDidSucceed',\n REQUEST_WILL_FETCH: 'requestWillFetch',\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\nexport const pluginUtils = {\n filter: (plugins, callbackName) => {\n return plugins.filter((plugin) => callbackName in plugin);\n },\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from './WorkboxError.mjs';\nimport {assert} from './assert.mjs';\nimport {getFriendlyURL} from './getFriendlyURL.mjs';\nimport {logger} from './logger.mjs';\nimport {executeQuotaErrorCallbacks} from './executeQuotaErrorCallbacks.mjs';\nimport {pluginEvents} from '../models/pluginEvents.mjs';\nimport {pluginUtils} from '../utils/pluginUtils.mjs';\nimport '../_version.mjs';\n\n\n/**\n * Wrapper around cache.put().\n *\n * Will call `cacheDidUpdate` on plugins if the cache was updated, using\n * `matchOptions` when determining what the old entry is.\n *\n * @param {Object} options\n * @param {string} options.cacheName\n * @param {Request} options.request\n * @param {Response} options.response\n * @param {Event} [options.event]\n * @param {Array} [options.plugins=[]]\n * @param {Object} [options.matchOptions]\n *\n * @private\n * @memberof module:workbox-core\n */\nconst putWrapper = async ({\n cacheName,\n request,\n response,\n event,\n plugins = [],\n matchOptions,\n} = {}) => {\n if (process.env.NODE_ENV !== 'production') {\n if (request.method && request.method !== 'GET') {\n throw new WorkboxError('attempt-to-cache-non-get-request', {\n url: getFriendlyURL(request.url),\n method: request.method,\n });\n }\n }\n\n const effectiveRequest = await _getEffectiveRequest({\n plugins, request, mode: 'write'});\n\n if (!response) {\n if (process.env.NODE_ENV !== 'production') {\n logger.error(`Cannot cache non-existent response for ` +\n `'${getFriendlyURL(effectiveRequest.url)}'.`);\n }\n\n throw new WorkboxError('cache-put-with-no-response', {\n url: getFriendlyURL(effectiveRequest.url),\n });\n }\n\n let responseToCache = await _isResponseSafeToCache({\n event,\n plugins,\n response,\n request: effectiveRequest,\n });\n\n if (!responseToCache) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Response '${getFriendlyURL(effectiveRequest.url)}' will ` +\n `not be cached.`, responseToCache);\n }\n return;\n }\n\n const cache = await caches.open(cacheName);\n\n const updatePlugins = pluginUtils.filter(\n plugins, pluginEvents.CACHE_DID_UPDATE);\n\n let oldResponse = updatePlugins.length > 0 ?\n await matchWrapper({cacheName, matchOptions, request: effectiveRequest}) :\n null;\n\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Updating the '${cacheName}' cache with a new Response for ` +\n `${getFriendlyURL(effectiveRequest.url)}.`);\n }\n\n try {\n await cache.put(effectiveRequest, responseToCache);\n } catch (error) {\n // See https://developer.mozilla.org/en-US/docs/Web/API/DOMException#exception-QuotaExceededError\n if (error.name === 'QuotaExceededError') {\n await executeQuotaErrorCallbacks();\n }\n throw error;\n }\n\n for (let plugin of updatePlugins) {\n await plugin[pluginEvents.CACHE_DID_UPDATE].call(plugin, {\n cacheName,\n event,\n oldResponse,\n newResponse: responseToCache,\n request: effectiveRequest,\n });\n }\n};\n\n/**\n * This is a wrapper around cache.match().\n *\n * @param {Object} options\n * @param {string} options.cacheName Name of the cache to match against.\n * @param {Request} options.request The Request that will be used to look up\n * cache entries.\n * @param {Event} [options.event] The event that propted the action.\n * @param {Object} [options.matchOptions] Options passed to cache.match().\n * @param {Array} [options.plugins=[]] Array of plugins.\n * @return {Response} A cached response if available.\n *\n * @private\n * @memberof module:workbox-core\n */\nconst matchWrapper = async ({\n cacheName,\n request,\n event,\n matchOptions,\n plugins = [],\n}) => {\n const cache = await caches.open(cacheName);\n\n const effectiveRequest = await _getEffectiveRequest({\n plugins, request, mode: 'read'});\n\n let cachedResponse = await cache.match(effectiveRequest, matchOptions);\n if (process.env.NODE_ENV !== 'production') {\n if (cachedResponse) {\n logger.debug(`Found a cached response in '${cacheName}'.`);\n } else {\n logger.debug(`No cached response found in '${cacheName}'.`);\n }\n }\n\n for (const plugin of plugins) {\n if (pluginEvents.CACHED_RESPONSE_WILL_BE_USED in plugin) {\n cachedResponse = await plugin[pluginEvents.CACHED_RESPONSE_WILL_BE_USED]\n .call(plugin, {\n cacheName,\n event,\n matchOptions,\n cachedResponse,\n request: effectiveRequest,\n });\n if (process.env.NODE_ENV !== 'production') {\n if (cachedResponse) {\n assert.isInstance(cachedResponse, Response, {\n moduleName: 'Plugin',\n funcName: pluginEvents.CACHED_RESPONSE_WILL_BE_USED,\n isReturnValueProblem: true,\n });\n }\n }\n }\n }\n\n return cachedResponse;\n};\n\n/**\n * This method will call cacheWillUpdate on the available plugins (or use\n * status === 200) to determine if the Response is safe and valid to cache.\n *\n * @param {Object} options\n * @param {Request} options.request\n * @param {Response} options.response\n * @param {Event} [options.event]\n * @param {Array} [options.plugins=[]]\n * @return {Promise}\n *\n * @private\n * @memberof module:workbox-core\n */\nconst _isResponseSafeToCache = async ({request, response, event, plugins}) => {\n let responseToCache = response;\n let pluginsUsed = false;\n for (let plugin of plugins) {\n if (pluginEvents.CACHE_WILL_UPDATE in plugin) {\n pluginsUsed = true;\n responseToCache = await plugin[pluginEvents.CACHE_WILL_UPDATE]\n .call(plugin, {\n request,\n response: responseToCache,\n event,\n });\n\n if (process.env.NODE_ENV !== 'production') {\n if (responseToCache) {\n assert.isInstance(responseToCache, Response, {\n moduleName: 'Plugin',\n funcName: pluginEvents.CACHE_WILL_UPDATE,\n isReturnValueProblem: true,\n });\n }\n }\n\n if (!responseToCache) {\n break;\n }\n }\n }\n\n if (!pluginsUsed) {\n if (process.env.NODE_ENV !== 'production') {\n if (!responseToCache.status === 200) {\n if (responseToCache.status === 0) {\n logger.warn(`The response for '${request.url}' is an opaque ` +\n `response. The caching strategy that you're using will not ` +\n `cache opaque responses by default.`);\n } else {\n logger.debug(`The response for '${request.url}' returned ` +\n `a status code of '${response.status}' and won't be cached as a ` +\n `result.`);\n }\n }\n }\n responseToCache = responseToCache.status === 200 ? responseToCache : null;\n }\n\n return responseToCache ? responseToCache : null;\n};\n\n/**\n * Checks the list of plugins for the cacheKeyWillBeUsed callback, and\n * executes any of those callbacks found in sequence. The final `Request` object\n * returned by the last plugin is treated as the cache key for cache reads\n * and/or writes.\n *\n * @param {Object} options\n * @param {Request} options.request\n * @param {string} options.mode\n * @param {Array} [options.plugins=[]]\n * @return {Promise}\n *\n * @private\n * @memberof module:workbox-core\n */\nconst _getEffectiveRequest = async ({request, mode, plugins}) => {\n const cacheKeyWillBeUsedPlugins = pluginUtils.filter(\n plugins, pluginEvents.CACHE_KEY_WILL_BE_USED);\n\n let effectiveRequest = request;\n for (const plugin of cacheKeyWillBeUsedPlugins) {\n effectiveRequest = await plugin[pluginEvents.CACHE_KEY_WILL_BE_USED].call(\n plugin, {mode, request: effectiveRequest});\n\n if (typeof effectiveRequest === 'string') {\n effectiveRequest = new Request(effectiveRequest);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(effectiveRequest, Request, {\n moduleName: 'Plugin',\n funcName: pluginEvents.CACHE_KEY_WILL_BE_USED,\n isReturnValueProblem: true,\n });\n }\n }\n\n return effectiveRequest;\n};\n\nexport const cacheWrapper = {\n put: putWrapper,\n match: matchWrapper,\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n/**\n * A class that wraps common IndexedDB functionality in a promise-based API.\n * It exposes all the underlying power and functionality of IndexedDB, but\n * wraps the most commonly used features in a way that's much simpler to use.\n *\n * @private\n */\nexport class DBWrapper {\n /**\n * @param {string} name\n * @param {number} version\n * @param {Object=} [callback]\n * @param {!Function} [callbacks.onupgradeneeded]\n * @param {!Function} [callbacks.onversionchange] Defaults to\n * DBWrapper.prototype._onversionchange when not specified.\n * @private\n */\n constructor(name, version, {\n onupgradeneeded,\n onversionchange = this._onversionchange,\n } = {}) {\n this._name = name;\n this._version = version;\n this._onupgradeneeded = onupgradeneeded;\n this._onversionchange = onversionchange;\n\n // If this is null, it means the database isn't open.\n this._db = null;\n }\n\n /**\n * Returns the IDBDatabase instance (not normally needed).\n *\n * @private\n */\n get db() {\n return this._db;\n }\n\n /**\n * Opens a connected to an IDBDatabase, invokes any onupgradedneeded\n * callback, and added an onversionchange callback to the database.\n *\n * @return {IDBDatabase}\n * @private\n */\n async open() {\n if (this._db) return;\n\n this._db = await new Promise((resolve, reject) => {\n // This flag is flipped to true if the timeout callback runs prior\n // to the request failing or succeeding. Note: we use a timeout instead\n // of an onblocked handler since there are cases where onblocked will\n // never never run. A timeout better handles all possible scenarios:\n // https://github.com/w3c/IndexedDB/issues/223\n let openRequestTimedOut = false;\n setTimeout(() => {\n openRequestTimedOut = true;\n reject(new Error('The open request was blocked and timed out'));\n }, this.OPEN_TIMEOUT);\n\n const openRequest = indexedDB.open(this._name, this._version);\n openRequest.onerror = () => reject(openRequest.error);\n openRequest.onupgradeneeded = (evt) => {\n if (openRequestTimedOut) {\n openRequest.transaction.abort();\n evt.target.result.close();\n } else if (this._onupgradeneeded) {\n this._onupgradeneeded(evt);\n }\n };\n openRequest.onsuccess = ({target}) => {\n const db = target.result;\n if (openRequestTimedOut) {\n db.close();\n } else {\n db.onversionchange = this._onversionchange.bind(this);\n resolve(db);\n }\n };\n });\n\n return this;\n }\n\n /**\n * Polyfills the native `getKey()` method. Note, this is overridden at\n * runtime if the browser supports the native method.\n *\n * @param {string} storeName\n * @param {*} query\n * @return {Array}\n * @private\n */\n async getKey(storeName, query) {\n return (await this.getAllKeys(storeName, query, 1))[0];\n }\n\n /**\n * Polyfills the native `getAll()` method. Note, this is overridden at\n * runtime if the browser supports the native method.\n *\n * @param {string} storeName\n * @param {*} query\n * @param {number} count\n * @return {Array}\n * @private\n */\n async getAll(storeName, query, count) {\n return await this.getAllMatching(storeName, {query, count});\n }\n\n\n /**\n * Polyfills the native `getAllKeys()` method. Note, this is overridden at\n * runtime if the browser supports the native method.\n *\n * @param {string} storeName\n * @param {*} query\n * @param {number} count\n * @return {Array}\n * @private\n */\n async getAllKeys(storeName, query, count) {\n return (await this.getAllMatching(\n storeName, {query, count, includeKeys: true})).map(({key}) => key);\n }\n\n /**\n * Supports flexible lookup in an object store by specifying an index,\n * query, direction, and count. This method returns an array of objects\n * with the signature .\n *\n * @param {string} storeName\n * @param {Object} [opts]\n * @param {string} [opts.index] The index to use (if specified).\n * @param {*} [opts.query]\n * @param {IDBCursorDirection} [opts.direction]\n * @param {number} [opts.count] The max number of results to return.\n * @param {boolean} [opts.includeKeys] When true, the structure of the\n * returned objects is changed from an array of values to an array of\n * objects in the form {key, primaryKey, value}.\n * @return {Array}\n * @private\n */\n async getAllMatching(storeName, {\n index,\n query = null, // IE errors if query === `undefined`.\n direction = 'next',\n count,\n includeKeys,\n } = {}) {\n return await this.transaction([storeName], 'readonly', (txn, done) => {\n const store = txn.objectStore(storeName);\n const target = index ? store.index(index) : store;\n const results = [];\n\n target.openCursor(query, direction).onsuccess = ({target}) => {\n const cursor = target.result;\n if (cursor) {\n const {primaryKey, key, value} = cursor;\n results.push(includeKeys ? {primaryKey, key, value} : value);\n if (count && results.length >= count) {\n done(results);\n } else {\n cursor.continue();\n }\n } else {\n done(results);\n }\n };\n });\n }\n\n /**\n * Accepts a list of stores, a transaction type, and a callback and\n * performs a transaction. A promise is returned that resolves to whatever\n * value the callback chooses. The callback holds all the transaction logic\n * and is invoked with two arguments:\n * 1. The IDBTransaction object\n * 2. A `done` function, that's used to resolve the promise when\n * when the transaction is done, if passed a value, the promise is\n * resolved to that value.\n *\n * @param {Array} storeNames An array of object store names\n * involved in the transaction.\n * @param {string} type Can be `readonly` or `readwrite`.\n * @param {!Function} callback\n * @return {*} The result of the transaction ran by the callback.\n * @private\n */\n async transaction(storeNames, type, callback) {\n await this.open();\n return await new Promise((resolve, reject) => {\n const txn = this._db.transaction(storeNames, type);\n txn.onabort = ({target}) => reject(target.error);\n txn.oncomplete = () => resolve();\n\n callback(txn, (value) => resolve(value));\n });\n }\n\n /**\n * Delegates async to a native IDBObjectStore method.\n *\n * @param {string} method The method name.\n * @param {string} storeName The object store name.\n * @param {string} type Can be `readonly` or `readwrite`.\n * @param {...*} args The list of args to pass to the native method.\n * @return {*} The result of the transaction.\n * @private\n */\n async _call(method, storeName, type, ...args) {\n const callback = (txn, done) => {\n txn.objectStore(storeName)[method](...args).onsuccess = ({target}) => {\n done(target.result);\n };\n };\n\n return await this.transaction([storeName], type, callback);\n }\n\n /**\n * The default onversionchange handler, which closes the database so other\n * connections can open without being blocked.\n *\n * @private\n */\n _onversionchange() {\n this.close();\n }\n\n /**\n * Closes the connection opened by `DBWrapper.open()`. Generally this method\n * doesn't need to be called since:\n * 1. It's usually better to keep a connection open since opening\n * a new connection is somewhat slow.\n * 2. Connections are automatically closed when the reference is\n * garbage collected.\n * The primary use case for needing to close a connection is when another\n * reference (typically in another tab) needs to upgrade it and would be\n * blocked by the current, open connection.\n *\n * @private\n */\n close() {\n if (this._db) {\n this._db.close();\n this._db = null;\n }\n }\n}\n\n// Exposed to let users modify the default timeout on a per-instance\n// or global basis.\nDBWrapper.prototype.OPEN_TIMEOUT = 2000;\n\n// Wrap native IDBObjectStore methods according to their mode.\nconst methodsToWrap = {\n 'readonly': ['get', 'count', 'getKey', 'getAll', 'getAllKeys'],\n 'readwrite': ['add', 'put', 'clear', 'delete'],\n};\nfor (const [mode, methods] of Object.entries(methodsToWrap)) {\n for (const method of methods) {\n if (method in IDBObjectStore.prototype) {\n // Don't use arrow functions here since we're outside of the class.\n DBWrapper.prototype[method] = async function(storeName, ...args) {\n return await this._call(method, storeName, mode, ...args);\n };\n }\n }\n}\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n/**\n * The Deferred class composes Promises in a way that allows for them to be\n * resolved or rejected from outside the constructor. In most cases promises\n * should be used directly, but Deferreds can be necessary when the logic to\n * resolve a promise must be separate.\n *\n * @private\n */\nexport class Deferred {\n /**\n * Creates a promise and exposes its resolve and reject functions as methods.\n */\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n}\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n/**\n * Deletes the database.\n * Note: this is exported separately from the DBWrapper module because most\n * usages of IndexedDB in workbox dont need deleting, and this way it can be\n * reused in tests to delete databases without creating DBWrapper instances.\n *\n * @param {string} name The database name.\n * @private\n */\nexport const deleteDatabase = async (name) => {\n await new Promise((resolve, reject) => {\n const request = indexedDB.deleteDatabase(name);\n request.onerror = ({target}) => {\n reject(target.error);\n };\n request.onblocked = () => {\n reject(new Error('Delete blocked'));\n };\n request.onsuccess = () => {\n resolve();\n };\n });\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from './WorkboxError.mjs';\nimport {logger} from './logger.mjs';\nimport {assert} from './assert.mjs';\nimport {getFriendlyURL} from '../_private/getFriendlyURL.mjs';\nimport {pluginEvents} from '../models/pluginEvents.mjs';\nimport {pluginUtils} from '../utils/pluginUtils.mjs';\nimport '../_version.mjs';\n\n/**\n * Wrapper around the fetch API.\n *\n * Will call requestWillFetch on available plugins.\n *\n * @param {Object} options\n * @param {Request|string} options.request\n * @param {Object} [options.fetchOptions]\n * @param {Event} [options.event]\n * @param {Array} [options.plugins=[]]\n * @return {Promise}\n *\n * @private\n * @memberof module:workbox-core\n */\nconst wrappedFetch = async ({\n request,\n fetchOptions,\n event,\n plugins = []}) => {\n // We *should* be able to call `await event.preloadResponse` even if it's\n // undefined, but for some reason, doing so leads to errors in our Node unit\n // tests. To work around that, explicitly check preloadResponse's value first.\n if (event && event.preloadResponse) {\n const possiblePreloadResponse = await event.preloadResponse;\n if (possiblePreloadResponse) {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Using a preloaded navigation response for ` +\n `'${getFriendlyURL(request.url)}'`);\n }\n return possiblePreloadResponse;\n }\n }\n\n if (typeof request === 'string') {\n request = new Request(request);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n paramName: request,\n expectedClass: 'Request',\n moduleName: 'workbox-core',\n className: 'fetchWrapper',\n funcName: 'wrappedFetch',\n });\n }\n\n const failedFetchPlugins = pluginUtils.filter(\n plugins, pluginEvents.FETCH_DID_FAIL);\n\n // If there is a fetchDidFail plugin, we need to save a clone of the\n // original request before it's either modified by a requestWillFetch\n // plugin or before the original request's body is consumed via fetch().\n const originalRequest = failedFetchPlugins.length > 0 ?\n request.clone() : null;\n\n try {\n for (let plugin of plugins) {\n if (pluginEvents.REQUEST_WILL_FETCH in plugin) {\n request = await plugin[pluginEvents.REQUEST_WILL_FETCH].call(plugin, {\n request: request.clone(),\n event,\n });\n\n if (process.env.NODE_ENV !== 'production') {\n if (request) {\n assert.isInstance(request, Request, {\n moduleName: 'Plugin',\n funcName: pluginEvents.CACHED_RESPONSE_WILL_BE_USED,\n isReturnValueProblem: true,\n });\n }\n }\n }\n }\n } catch (err) {\n throw new WorkboxError('plugin-error-request-will-fetch', {\n thrownError: err,\n });\n }\n\n // The request can be altered by plugins with `requestWillFetch` making\n // the original request (Most likely from a `fetch` event) to be different\n // to the Request we make. Pass both to `fetchDidFail` to aid debugging.\n let pluginFilteredRequest = request.clone();\n\n try {\n let fetchResponse;\n\n // See https://github.com/GoogleChrome/workbox/issues/1796\n if (request.mode === 'navigate') {\n fetchResponse = await fetch(request);\n } else {\n fetchResponse = await fetch(request, fetchOptions);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Network request for `+\n `'${getFriendlyURL(request.url)}' returned a response with ` +\n `status '${fetchResponse.status}'.`);\n }\n\n for (const plugin of plugins) {\n if (pluginEvents.FETCH_DID_SUCCEED in plugin) {\n fetchResponse = await plugin[pluginEvents.FETCH_DID_SUCCEED]\n .call(plugin, {\n event,\n request: pluginFilteredRequest,\n response: fetchResponse,\n });\n\n if (process.env.NODE_ENV !== 'production') {\n if (fetchResponse) {\n assert.isInstance(fetchResponse, Response, {\n moduleName: 'Plugin',\n funcName: pluginEvents.FETCH_DID_SUCCEED,\n isReturnValueProblem: true,\n });\n }\n }\n }\n }\n\n return fetchResponse;\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.error(`Network request for `+\n `'${getFriendlyURL(request.url)}' threw an error.`, error);\n }\n\n for (const plugin of failedFetchPlugins) {\n await plugin[pluginEvents.FETCH_DID_FAIL].call(plugin, {\n error,\n event,\n originalRequest: originalRequest.clone(),\n request: pluginFilteredRequest.clone(),\n });\n }\n\n throw error;\n }\n};\n\nconst fetchWrapper = {\n fetch: wrappedFetch,\n};\n\nexport {fetchWrapper};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\n// We either expose defaults or we expose every named export.\nimport {assert} from './_private/assert.mjs';\nimport {cacheNames} from './_private/cacheNames.mjs';\nimport {cacheWrapper} from './_private/cacheWrapper.mjs';\nimport {DBWrapper} from './_private/DBWrapper.mjs';\nimport {Deferred} from './_private/Deferred.mjs';\nimport {deleteDatabase} from './_private/deleteDatabase.mjs';\nimport {executeQuotaErrorCallbacks} from './_private/executeQuotaErrorCallbacks.mjs';\nimport {fetchWrapper} from './_private/fetchWrapper.mjs';\nimport {getFriendlyURL} from './_private/getFriendlyURL.mjs';\nimport {logger} from './_private/logger.mjs';\nimport {WorkboxError} from './_private/WorkboxError.mjs';\n\nimport './_version.mjs';\n\nexport {\n assert,\n cacheNames,\n cacheWrapper,\n DBWrapper,\n Deferred,\n deleteDatabase,\n executeQuotaErrorCallbacks,\n fetchWrapper,\n getFriendlyURL,\n logger,\n WorkboxError,\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport './_version.mjs';\n\n\n/**\n * Claim any currently available clients once the service worker\n * becomes active. This is normally used in conjunction with `skipWaiting()`.\n *\n * @alias workbox.core.clientsClaim\n */\nexport const clientsClaim = () => {\n addEventListener('activate', () => clients.claim());\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {cacheNames as _cacheNames} from './_private/cacheNames.mjs';\nimport './_version.mjs';\n\n\n/**\n * Get the current cache names and prefix/suffix used by Workbox.\n *\n * `cacheNames.precache` is used for precached assets,\n * `cacheNames.googleAnalytics` is used by `workbox-google-analytics` to\n * store `analytics.js`, and `cacheNames.runtime` is used for everything else.\n *\n * `cacheNames.prefix` can be used to retrieve just the current prefix value.\n * `cacheNames.suffix` can be used to retrieve just the current suffix value.\n *\n * @return {Object} An object with `precache`, `runtime`, `prefix`, and\n * `googleAnalytics` properties.\n *\n * @alias workbox.core.cacheNames\n */\nexport const cacheNames = {\n get googleAnalytics() {\n return _cacheNames.getGoogleAnalyticsName();\n },\n get precache() {\n return _cacheNames.getPrecacheName();\n },\n get prefix() {\n return _cacheNames.getPrefix();\n },\n get runtime() {\n return _cacheNames.getRuntimeName();\n },\n get suffix() {\n return _cacheNames.getSuffix();\n },\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from './_private/assert.mjs';\nimport {cacheNames} from './_private/cacheNames.mjs';\nimport {WorkboxError} from './_private/WorkboxError.mjs';\nimport './_version.mjs';\n\n\n/**\n * Modifies the default cache names used by the Workbox packages.\n * Cache names are generated as `--`.\n *\n * @param {Object} details\n * @param {Object} [details.prefix] The string to add to the beginning of\n * the precache and runtime cache names.\n * @param {Object} [details.suffix] The string to add to the end of\n * the precache and runtime cache names.\n * @param {Object} [details.precache] The cache name to use for precache\n * caching.\n * @param {Object} [details.runtime] The cache name to use for runtime caching.\n * @param {Object} [details.googleAnalytics] The cache name to use for\n * `workbox-google-analytics` caching.\n *\n * @alias workbox.core.setCacheNameDetails\n */\nexport const setCacheNameDetails = (details) => {\n if (process.env.NODE_ENV !== 'production') {\n Object.keys(details).forEach((key) => {\n assert.isType(details[key], 'string', {\n moduleName: 'workbox-core',\n funcName: 'setCacheNameDetails',\n paramName: `details.${key}`,\n });\n });\n\n if ('precache' in details && details.precache.length === 0) {\n throw new WorkboxError('invalid-cache-name', {\n cacheNameId: 'precache',\n value: details.precache,\n });\n }\n\n if ('runtime' in details && details.runtime.length === 0) {\n throw new WorkboxError('invalid-cache-name', {\n cacheNameId: 'runtime',\n value: details.runtime,\n });\n }\n\n if ('googleAnalytics' in details && details.googleAnalytics.length === 0) {\n throw new WorkboxError('invalid-cache-name', {\n cacheNameId: 'googleAnalytics',\n value: details.googleAnalytics,\n });\n }\n }\n\n cacheNames.updateDetails(details);\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport './_version.mjs';\n\n\n/**\n * Force a service worker to become active, instead of waiting. This is\n * normally used in conjunction with `clientsClaim()`.\n *\n * @alias workbox.core.skipWaiting\n */\nexport const skipWaiting = () => {\n // We need to explicitly call `self.skipWaiting()` here because we're\n // shadowing `skipWaiting` with this local function.\n addEventListener('install', () => self.skipWaiting());\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {registerQuotaErrorCallback} from './registerQuotaErrorCallback.mjs';\nimport * as _private from './_private.mjs';\nimport {clientsClaim} from './clientsClaim.mjs';\nimport {cacheNames} from './cacheNames.mjs';\nimport {setCacheNameDetails} from './setCacheNameDetails.mjs';\nimport {skipWaiting} from './skipWaiting.mjs';\nimport './_version.mjs';\n\n\n// Give our version strings something to hang off of.\ntry {\n self.workbox.v = self.workbox.v || {};\n} catch (errer) {\n // NOOP\n}\n\n/**\n * All of the Workbox service worker libraries use workbox-core for shared\n * code as well as setting default values that need to be shared (like cache\n * names).\n *\n * @namespace workbox.core\n */\n\nexport {\n _private,\n clientsClaim,\n cacheNames,\n registerQuotaErrorCallback,\n setCacheNameDetails,\n skipWaiting,\n};\n"],"names":["self","_","e","logger","process","inGroup","methodToColorMap","debug","log","warn","error","groupCollapsed","groupEnd","print","method","args","test","navigator","userAgent","console","styles","logPrefix","join","api","Object","keys","messages","paramName","validValueDescription","value","Error","JSON","stringify","moduleName","className","funcName","expectedType","expectedClass","isReturnValueProblem","name","expectedMethod","entry","firstEntry","secondEntry","_entryId","thrownError","message","cacheNameId","methodName","normalizedRangeHeader","size","start","end","url","status","generatorFunction","code","messageGenerator","WorkboxError","constructor","errorCode","details","isSWEnv","isArray","Array","hasMethod","object","type","isType","isInstance","isOneOf","validValues","includes","isArrayOfClass","item","finalAssertExports","quotaErrorCallbacks","Set","registerQuotaErrorCallback","callback","assert","add","_cacheNameDetails","googleAnalytics","precache","prefix","runtime","suffix","registration","scope","_createCacheName","cacheName","filter","length","cacheNames","updateDetails","forEach","key","getGoogleAnalyticsName","userCacheName","getPrecacheName","getPrefix","getRuntimeName","getSuffix","getFriendlyURL","urlObj","URL","location","origin","pathname","href","executeQuotaErrorCallbacks","pluginEvents","CACHE_DID_UPDATE","CACHE_KEY_WILL_BE_USED","CACHE_WILL_UPDATE","CACHED_RESPONSE_WILL_BE_USED","FETCH_DID_FAIL","FETCH_DID_SUCCEED","REQUEST_WILL_FETCH","pluginUtils","plugins","callbackName","plugin","putWrapper","request","response","event","matchOptions","effectiveRequest","_getEffectiveRequest","mode","responseToCache","_isResponseSafeToCache","cache","caches","open","updatePlugins","oldResponse","matchWrapper","put","call","newResponse","cachedResponse","match","Response","pluginsUsed","cacheKeyWillBeUsedPlugins","Request","cacheWrapper","DBWrapper","version","onupgradeneeded","onversionchange","_onversionchange","_name","_version","_onupgradeneeded","_db","db","Promise","resolve","reject","openRequestTimedOut","setTimeout","OPEN_TIMEOUT","openRequest","indexedDB","onerror","evt","transaction","abort","target","result","close","onsuccess","bind","getKey","storeName","query","getAllKeys","getAll","count","getAllMatching","includeKeys","map","index","direction","txn","done","store","objectStore","results","openCursor","cursor","primaryKey","push","continue","storeNames","onabort","oncomplete","_call","prototype","methodsToWrap","methods","entries","IDBObjectStore","Deferred","promise","deleteDatabase","onblocked","wrappedFetch","fetchOptions","preloadResponse","possiblePreloadResponse","failedFetchPlugins","originalRequest","clone","err","pluginFilteredRequest","fetchResponse","fetch","fetchWrapper","clientsClaim","addEventListener","clients","claim","_cacheNames","setCacheNameDetails","skipWaiting","workbox","v","errer"],"mappings":"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"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-core.prod.js b/workbox-v4.3.1/workbox-core.prod.js new file mode 100644 index 00000000..526e32b1 --- /dev/null +++ b/workbox-v4.3.1/workbox-core.prod.js @@ -0,0 +1,2 @@ +this.workbox=this.workbox||{},this.workbox.core=function(e){"use strict";try{self["workbox:core:4.3.1"]&&_()}catch(e){}const t=(e,...t)=>{let n=e;return t.length>0&&(n+=` :: ${JSON.stringify(t)}`),n};class n extends Error{constructor(e,n){super(t(e,n)),this.name=e,this.details=n}}const s=new Set;const r={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"workbox",runtime:"runtime",suffix:self.registration.scope},a=e=>[r.prefix,e,r.suffix].filter(e=>e.length>0).join("-"),i={updateDetails:e=>{Object.keys(r).forEach(t=>{void 0!==e[t]&&(r[t]=e[t])})},getGoogleAnalyticsName:e=>e||a(r.googleAnalytics),getPrecacheName:e=>e||a(r.precache),getPrefix:()=>r.prefix,getRuntimeName:e=>e||a(r.runtime),getSuffix:()=>r.suffix},c=e=>{const t=new URL(e,location);return t.origin===location.origin?t.pathname:t.href};async function o(){for(const e of s)await e()}const l="cacheDidUpdate",u="cacheKeyWillBeUsed",h="cacheWillUpdate",f="cachedResponseWillBeUsed",w="fetchDidFail",g="fetchDidSucceed",d="requestWillFetch",p=(e,t)=>e.filter(e=>t in e),y=async({cacheName:e,request:t,event:n,matchOptions:s,plugins:r=[]})=>{const a=await caches.open(e),i=await q({plugins:r,request:t,mode:"read"});let c=await a.match(i,s);for(const t of r)f in t&&(c=await t[f].call(t,{cacheName:e,event:n,matchOptions:s,cachedResponse:c,request:i}));return c},m=async({request:e,response:t,event:n,plugins:s})=>{let r=t,a=!1;for(let t of s)if(h in t&&(a=!0,!(r=await t[h].call(t,{request:e,response:r,event:n}))))break;return a||(r=200===r.status?r:null),r||null},q=async({request:e,mode:t,plugins:n})=>{const s=p(n,u);let r=e;for(const e of s)"string"==typeof(r=await e[u].call(e,{mode:t,request:r}))&&(r=new Request(r));return r},v={put:async({cacheName:e,request:t,response:s,event:r,plugins:a=[],matchOptions:i}={})=>{const u=await q({plugins:a,request:t,mode:"write"});if(!s)throw new n("cache-put-with-no-response",{url:c(u.url)});let h=await m({event:r,plugins:a,response:s,request:u});if(!h)return;const f=await caches.open(e),w=p(a,l);let g=w.length>0?await y({cacheName:e,matchOptions:i,request:u}):null;try{await f.put(u,h)}catch(e){throw"QuotaExceededError"===e.name&&await o(),e}for(let t of w)await t[l].call(t,{cacheName:e,event:r,oldResponse:g,newResponse:h,request:u})},match:y};class x{constructor(e,t,{onupgradeneeded:n,onversionchange:s=this.t}={}){this.s=e,this.i=t,this.o=n,this.t=s,this.l=null}get db(){return this.l}async open(){if(!this.l)return this.l=await new Promise((e,t)=>{let n=!1;setTimeout(()=>{n=!0,t(new Error("The open request was blocked and timed out"))},this.OPEN_TIMEOUT);const s=indexedDB.open(this.s,this.i);s.onerror=(()=>t(s.error)),s.onupgradeneeded=(e=>{n?(s.transaction.abort(),e.target.result.close()):this.o&&this.o(e)}),s.onsuccess=(({target:t})=>{const s=t.result;n?s.close():(s.onversionchange=this.t.bind(this),e(s))})}),this}async getKey(e,t){return(await this.getAllKeys(e,t,1))[0]}async getAll(e,t,n){return await this.getAllMatching(e,{query:t,count:n})}async getAllKeys(e,t,n){return(await this.getAllMatching(e,{query:t,count:n,includeKeys:!0})).map(({key:e})=>e)}async getAllMatching(e,{index:t,query:n=null,direction:s="next",count:r,includeKeys:a}={}){return await this.transaction([e],"readonly",(i,c)=>{const o=i.objectStore(e),l=t?o.index(t):o,u=[];l.openCursor(n,s).onsuccess=(({target:e})=>{const t=e.result;if(t){const{primaryKey:e,key:n,value:s}=t;u.push(a?{primaryKey:e,key:n,value:s}:s),r&&u.length>=r?c(u):t.continue()}else c(u)})})}async transaction(e,t,n){return await this.open(),await new Promise((s,r)=>{const a=this.l.transaction(e,t);a.onabort=(({target:e})=>r(e.error)),a.oncomplete=(()=>s()),n(a,e=>s(e))})}async u(e,t,n,...s){return await this.transaction([t],n,(n,r)=>{n.objectStore(t)[e](...s).onsuccess=(({target:e})=>{r(e.result)})})}t(){this.close()}close(){this.l&&(this.l.close(),this.l=null)}}x.prototype.OPEN_TIMEOUT=2e3;const b={readonly:["get","count","getKey","getAll","getAllKeys"],readwrite:["add","put","clear","delete"]};for(const[e,t]of Object.entries(b))for(const n of t)n in IDBObjectStore.prototype&&(x.prototype[n]=async function(t,...s){return await this.u(n,t,e,...s)});const D={fetch:async({request:e,fetchOptions:t,event:s,plugins:r=[]})=>{if(s&&s.preloadResponse){const e=await s.preloadResponse;if(e)return e}"string"==typeof e&&(e=new Request(e));const a=p(r,w),i=a.length>0?e.clone():null;try{for(let t of r)d in t&&(e=await t[d].call(t,{request:e.clone(),event:s}))}catch(e){throw new n("plugin-error-request-will-fetch",{thrownError:e})}let c=e.clone();try{let n;n="navigate"===e.mode?await fetch(e):await fetch(e,t);for(const e of r)g in e&&(n=await e[g].call(e,{event:s,request:c,response:n}));return n}catch(e){for(const t of a)await t[w].call(t,{error:e,event:s,originalRequest:i.clone(),request:c.clone()});throw e}}};var E=Object.freeze({assert:null,cacheNames:i,cacheWrapper:v,DBWrapper:x,Deferred:class{constructor(){this.promise=new Promise((e,t)=>{this.resolve=e,this.reject=t})}},deleteDatabase:async e=>{await new Promise((t,n)=>{const s=indexedDB.deleteDatabase(e);s.onerror=(({target:e})=>{n(e.error)}),s.onblocked=(()=>{n(new Error("Delete blocked"))}),s.onsuccess=(()=>{t()})})},executeQuotaErrorCallbacks:o,fetchWrapper:D,getFriendlyURL:c,logger:null,WorkboxError:n});const N={get googleAnalytics(){return i.getGoogleAnalyticsName()},get precache(){return i.getPrecacheName()},get prefix(){return i.getPrefix()},get runtime(){return i.getRuntimeName()},get suffix(){return i.getSuffix()}};try{self.workbox.v=self.workbox.v||{}}catch(e){}return e._private=E,e.clientsClaim=(()=>{addEventListener("activate",()=>clients.claim())}),e.cacheNames=N,e.registerQuotaErrorCallback=function(e){s.add(e)},e.setCacheNameDetails=(e=>{i.updateDetails(e)}),e.skipWaiting=(()=>{addEventListener("install",()=>self.skipWaiting())}),e}({}); +//# sourceMappingURL=workbox-core.prod.js.map diff --git a/workbox-v4.3.1/workbox-core.prod.js.map b/workbox-v4.3.1/workbox-core.prod.js.map new file mode 100644 index 00000000..71b89fb5 --- /dev/null +++ b/workbox-v4.3.1/workbox-core.prod.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-core.prod.js","sources":["../_version.mjs","../_private/logger.mjs","../models/messages/messageGenerator.mjs","../_private/WorkboxError.mjs","../_private/assert.mjs","../models/quotaErrorCallbacks.mjs","../_private/cacheNames.mjs","../_private/getFriendlyURL.mjs","../_private/executeQuotaErrorCallbacks.mjs","../models/pluginEvents.mjs","../utils/pluginUtils.mjs","../_private/cacheWrapper.mjs","../_private/DBWrapper.mjs","../_private/deleteDatabase.mjs","../_private/fetchWrapper.mjs","../_private/Deferred.mjs","../cacheNames.mjs","../index.mjs","../clientsClaim.mjs","../registerQuotaErrorCallback.mjs","../setCacheNameDetails.mjs","../skipWaiting.mjs"],"sourcesContent":["try{self['workbox:core:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\nconst logger = process.env.NODE_ENV === 'production' ? null : (() => {\n let inGroup = false;\n\n const methodToColorMap = {\n debug: `#7f8c8d`, // Gray\n log: `#2ecc71`, // Green\n warn: `#f39c12`, // Yellow\n error: `#c0392b`, // Red\n groupCollapsed: `#3498db`, // Blue\n groupEnd: null, // No colored prefix on groupEnd\n };\n\n const print = function(method, args) {\n if (method === 'groupCollapsed') {\n // Safari doesn't print all console.groupCollapsed() arguments:\n // https://bugs.webkit.org/show_bug.cgi?id=182754\n if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n console[method](...args);\n return;\n }\n }\n\n const styles = [\n `background: ${methodToColorMap[method]}`,\n `border-radius: 0.5em`,\n `color: white`,\n `font-weight: bold`,\n `padding: 2px 0.5em`,\n ];\n\n // When in a group, the workbox prefix is not displayed.\n const logPrefix = inGroup ? [] : ['%cworkbox', styles.join(';')];\n\n console[method](...logPrefix, ...args);\n\n if (method === 'groupCollapsed') {\n inGroup = true;\n }\n if (method === 'groupEnd') {\n inGroup = false;\n }\n };\n\n const api = {};\n for (const method of Object.keys(methodToColorMap)) {\n api[method] = (...args) => {\n print(method, args);\n };\n }\n\n return api;\n})();\n\nexport {logger};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {messages} from './messages.mjs';\nimport '../../_version.mjs';\n\nconst fallback = (code, ...args) => {\n let msg = code;\n if (args.length > 0) {\n msg += ` :: ${JSON.stringify(args)}`;\n }\n return msg;\n};\n\nconst generatorFunction = (code, ...args) => {\n const message = messages[code];\n if (!message) {\n throw new Error(`Unable to find message for code '${code}'.`);\n }\n\n return message(...args);\n};\n\nexport const messageGenerator = (process.env.NODE_ENV === 'production') ?\n fallback : generatorFunction;\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {messageGenerator} from '../models/messages/messageGenerator.mjs';\nimport '../_version.mjs';\n\n/**\n * Workbox errors should be thrown with this class.\n * This allows use to ensure the type easily in tests,\n * helps developers identify errors from workbox\n * easily and allows use to optimise error\n * messages correctly.\n *\n * @private\n */\nclass WorkboxError extends Error {\n /**\n *\n * @param {string} errorCode The error code that\n * identifies this particular error.\n * @param {Object=} details Any relevant arguments\n * that will help developers identify issues should\n * be added as a key on the context object.\n */\n constructor(errorCode, details) {\n let message = messageGenerator(errorCode, details);\n\n super(message);\n\n this.name = errorCode;\n this.details = details;\n }\n}\n\nexport {WorkboxError};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from '../_private/WorkboxError.mjs';\nimport '../_version.mjs';\n\n/*\n * This method returns true if the current context is a service worker.\n */\nconst isSWEnv = (moduleName) => {\n if (!('ServiceWorkerGlobalScope' in self)) {\n throw new WorkboxError('not-in-sw', {moduleName});\n }\n};\n\n/*\n * This method throws if the supplied value is not an array.\n * The destructed values are required to produce a meaningful error for users.\n * The destructed and restructured object is so it's clear what is\n * needed.\n */\nconst isArray = (value, {moduleName, className, funcName, paramName}) => {\n if (!Array.isArray(value)) {\n throw new WorkboxError('not-an-array', {\n moduleName,\n className,\n funcName,\n paramName,\n });\n }\n};\n\nconst hasMethod = (object, expectedMethod,\n {moduleName, className, funcName, paramName}) => {\n const type = typeof object[expectedMethod];\n if (type !== 'function') {\n throw new WorkboxError('missing-a-method', {paramName, expectedMethod,\n moduleName, className, funcName});\n }\n};\n\nconst isType = (object, expectedType,\n {moduleName, className, funcName, paramName}) => {\n if (typeof object !== expectedType) {\n throw new WorkboxError('incorrect-type', {paramName, expectedType,\n moduleName, className, funcName});\n }\n};\n\nconst isInstance = (object, expectedClass,\n {moduleName, className, funcName,\n paramName, isReturnValueProblem}) => {\n if (!(object instanceof expectedClass)) {\n throw new WorkboxError('incorrect-class', {paramName, expectedClass,\n moduleName, className, funcName, isReturnValueProblem});\n }\n};\n\nconst isOneOf = (value, validValues, {paramName}) => {\n if (!validValues.includes(value)) {\n throw new WorkboxError('invalid-value', {\n paramName,\n value,\n validValueDescription: `Valid values are ${JSON.stringify(validValues)}.`,\n });\n }\n};\n\nconst isArrayOfClass = (value, expectedClass,\n {moduleName, className, funcName, paramName}) => {\n const error = new WorkboxError('not-array-of-class', {\n value, expectedClass,\n moduleName, className, funcName, paramName,\n });\n if (!Array.isArray(value)) {\n throw error;\n }\n\n for (let item of value) {\n if (!(item instanceof expectedClass)) {\n throw error;\n }\n }\n};\n\nconst finalAssertExports = process.env.NODE_ENV === 'production' ? null : {\n hasMethod,\n isArray,\n isInstance,\n isOneOf,\n isSWEnv,\n isType,\n isArrayOfClass,\n};\n\nexport {finalAssertExports as assert};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n// Callbacks to be executed whenever there's a quota error.\nconst quotaErrorCallbacks = new Set();\n\nexport {quotaErrorCallbacks};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\nconst _cacheNameDetails = {\n googleAnalytics: 'googleAnalytics',\n precache: 'precache-v2',\n prefix: 'workbox',\n runtime: 'runtime',\n suffix: self.registration.scope,\n};\n\nconst _createCacheName = (cacheName) => {\n return [_cacheNameDetails.prefix, cacheName, _cacheNameDetails.suffix]\n .filter((value) => value.length > 0)\n .join('-');\n};\n\nexport const cacheNames = {\n updateDetails: (details) => {\n Object.keys(_cacheNameDetails).forEach((key) => {\n if (typeof details[key] !== 'undefined') {\n _cacheNameDetails[key] = details[key];\n }\n });\n },\n getGoogleAnalyticsName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.googleAnalytics);\n },\n getPrecacheName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.precache);\n },\n getPrefix: () => {\n return _cacheNameDetails.prefix;\n },\n getRuntimeName: (userCacheName) => {\n return userCacheName || _createCacheName(_cacheNameDetails.runtime);\n },\n getSuffix: () => {\n return _cacheNameDetails.suffix;\n },\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\nconst getFriendlyURL = (url) => {\n const urlObj = new URL(url, location);\n if (urlObj.origin === location.origin) {\n return urlObj.pathname;\n }\n return urlObj.href;\n};\n\nexport {getFriendlyURL};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {logger} from '../_private/logger.mjs';\nimport {quotaErrorCallbacks} from '../models/quotaErrorCallbacks.mjs';\nimport '../_version.mjs';\n\n\n/**\n * Runs all of the callback functions, one at a time sequentially, in the order\n * in which they were registered.\n *\n * @memberof workbox.core\n * @private\n */\nasync function executeQuotaErrorCallbacks() {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`About to run ${quotaErrorCallbacks.size} ` +\n `callbacks to clean up caches.`);\n }\n\n for (const callback of quotaErrorCallbacks) {\n await callback();\n if (process.env.NODE_ENV !== 'production') {\n logger.log(callback, 'is complete.');\n }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Finished running callbacks.');\n }\n}\n\nexport {executeQuotaErrorCallbacks};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\nexport const pluginEvents = {\n CACHE_DID_UPDATE: 'cacheDidUpdate',\n CACHE_KEY_WILL_BE_USED: 'cacheKeyWillBeUsed',\n CACHE_WILL_UPDATE: 'cacheWillUpdate',\n CACHED_RESPONSE_WILL_BE_USED: 'cachedResponseWillBeUsed',\n FETCH_DID_FAIL: 'fetchDidFail',\n FETCH_DID_SUCCEED: 'fetchDidSucceed',\n REQUEST_WILL_FETCH: 'requestWillFetch',\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\nexport const pluginUtils = {\n filter: (plugins, callbackName) => {\n return plugins.filter((plugin) => callbackName in plugin);\n },\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from './WorkboxError.mjs';\nimport {assert} from './assert.mjs';\nimport {getFriendlyURL} from './getFriendlyURL.mjs';\nimport {logger} from './logger.mjs';\nimport {executeQuotaErrorCallbacks} from './executeQuotaErrorCallbacks.mjs';\nimport {pluginEvents} from '../models/pluginEvents.mjs';\nimport {pluginUtils} from '../utils/pluginUtils.mjs';\nimport '../_version.mjs';\n\n\n/**\n * Wrapper around cache.put().\n *\n * Will call `cacheDidUpdate` on plugins if the cache was updated, using\n * `matchOptions` when determining what the old entry is.\n *\n * @param {Object} options\n * @param {string} options.cacheName\n * @param {Request} options.request\n * @param {Response} options.response\n * @param {Event} [options.event]\n * @param {Array} [options.plugins=[]]\n * @param {Object} [options.matchOptions]\n *\n * @private\n * @memberof module:workbox-core\n */\nconst putWrapper = async ({\n cacheName,\n request,\n response,\n event,\n plugins = [],\n matchOptions,\n} = {}) => {\n if (process.env.NODE_ENV !== 'production') {\n if (request.method && request.method !== 'GET') {\n throw new WorkboxError('attempt-to-cache-non-get-request', {\n url: getFriendlyURL(request.url),\n method: request.method,\n });\n }\n }\n\n const effectiveRequest = await _getEffectiveRequest({\n plugins, request, mode: 'write'});\n\n if (!response) {\n if (process.env.NODE_ENV !== 'production') {\n logger.error(`Cannot cache non-existent response for ` +\n `'${getFriendlyURL(effectiveRequest.url)}'.`);\n }\n\n throw new WorkboxError('cache-put-with-no-response', {\n url: getFriendlyURL(effectiveRequest.url),\n });\n }\n\n let responseToCache = await _isResponseSafeToCache({\n event,\n plugins,\n response,\n request: effectiveRequest,\n });\n\n if (!responseToCache) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Response '${getFriendlyURL(effectiveRequest.url)}' will ` +\n `not be cached.`, responseToCache);\n }\n return;\n }\n\n const cache = await caches.open(cacheName);\n\n const updatePlugins = pluginUtils.filter(\n plugins, pluginEvents.CACHE_DID_UPDATE);\n\n let oldResponse = updatePlugins.length > 0 ?\n await matchWrapper({cacheName, matchOptions, request: effectiveRequest}) :\n null;\n\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Updating the '${cacheName}' cache with a new Response for ` +\n `${getFriendlyURL(effectiveRequest.url)}.`);\n }\n\n try {\n await cache.put(effectiveRequest, responseToCache);\n } catch (error) {\n // See https://developer.mozilla.org/en-US/docs/Web/API/DOMException#exception-QuotaExceededError\n if (error.name === 'QuotaExceededError') {\n await executeQuotaErrorCallbacks();\n }\n throw error;\n }\n\n for (let plugin of updatePlugins) {\n await plugin[pluginEvents.CACHE_DID_UPDATE].call(plugin, {\n cacheName,\n event,\n oldResponse,\n newResponse: responseToCache,\n request: effectiveRequest,\n });\n }\n};\n\n/**\n * This is a wrapper around cache.match().\n *\n * @param {Object} options\n * @param {string} options.cacheName Name of the cache to match against.\n * @param {Request} options.request The Request that will be used to look up\n * cache entries.\n * @param {Event} [options.event] The event that propted the action.\n * @param {Object} [options.matchOptions] Options passed to cache.match().\n * @param {Array} [options.plugins=[]] Array of plugins.\n * @return {Response} A cached response if available.\n *\n * @private\n * @memberof module:workbox-core\n */\nconst matchWrapper = async ({\n cacheName,\n request,\n event,\n matchOptions,\n plugins = [],\n}) => {\n const cache = await caches.open(cacheName);\n\n const effectiveRequest = await _getEffectiveRequest({\n plugins, request, mode: 'read'});\n\n let cachedResponse = await cache.match(effectiveRequest, matchOptions);\n if (process.env.NODE_ENV !== 'production') {\n if (cachedResponse) {\n logger.debug(`Found a cached response in '${cacheName}'.`);\n } else {\n logger.debug(`No cached response found in '${cacheName}'.`);\n }\n }\n\n for (const plugin of plugins) {\n if (pluginEvents.CACHED_RESPONSE_WILL_BE_USED in plugin) {\n cachedResponse = await plugin[pluginEvents.CACHED_RESPONSE_WILL_BE_USED]\n .call(plugin, {\n cacheName,\n event,\n matchOptions,\n cachedResponse,\n request: effectiveRequest,\n });\n if (process.env.NODE_ENV !== 'production') {\n if (cachedResponse) {\n assert.isInstance(cachedResponse, Response, {\n moduleName: 'Plugin',\n funcName: pluginEvents.CACHED_RESPONSE_WILL_BE_USED,\n isReturnValueProblem: true,\n });\n }\n }\n }\n }\n\n return cachedResponse;\n};\n\n/**\n * This method will call cacheWillUpdate on the available plugins (or use\n * status === 200) to determine if the Response is safe and valid to cache.\n *\n * @param {Object} options\n * @param {Request} options.request\n * @param {Response} options.response\n * @param {Event} [options.event]\n * @param {Array} [options.plugins=[]]\n * @return {Promise}\n *\n * @private\n * @memberof module:workbox-core\n */\nconst _isResponseSafeToCache = async ({request, response, event, plugins}) => {\n let responseToCache = response;\n let pluginsUsed = false;\n for (let plugin of plugins) {\n if (pluginEvents.CACHE_WILL_UPDATE in plugin) {\n pluginsUsed = true;\n responseToCache = await plugin[pluginEvents.CACHE_WILL_UPDATE]\n .call(plugin, {\n request,\n response: responseToCache,\n event,\n });\n\n if (process.env.NODE_ENV !== 'production') {\n if (responseToCache) {\n assert.isInstance(responseToCache, Response, {\n moduleName: 'Plugin',\n funcName: pluginEvents.CACHE_WILL_UPDATE,\n isReturnValueProblem: true,\n });\n }\n }\n\n if (!responseToCache) {\n break;\n }\n }\n }\n\n if (!pluginsUsed) {\n if (process.env.NODE_ENV !== 'production') {\n if (!responseToCache.status === 200) {\n if (responseToCache.status === 0) {\n logger.warn(`The response for '${request.url}' is an opaque ` +\n `response. The caching strategy that you're using will not ` +\n `cache opaque responses by default.`);\n } else {\n logger.debug(`The response for '${request.url}' returned ` +\n `a status code of '${response.status}' and won't be cached as a ` +\n `result.`);\n }\n }\n }\n responseToCache = responseToCache.status === 200 ? responseToCache : null;\n }\n\n return responseToCache ? responseToCache : null;\n};\n\n/**\n * Checks the list of plugins for the cacheKeyWillBeUsed callback, and\n * executes any of those callbacks found in sequence. The final `Request` object\n * returned by the last plugin is treated as the cache key for cache reads\n * and/or writes.\n *\n * @param {Object} options\n * @param {Request} options.request\n * @param {string} options.mode\n * @param {Array} [options.plugins=[]]\n * @return {Promise}\n *\n * @private\n * @memberof module:workbox-core\n */\nconst _getEffectiveRequest = async ({request, mode, plugins}) => {\n const cacheKeyWillBeUsedPlugins = pluginUtils.filter(\n plugins, pluginEvents.CACHE_KEY_WILL_BE_USED);\n\n let effectiveRequest = request;\n for (const plugin of cacheKeyWillBeUsedPlugins) {\n effectiveRequest = await plugin[pluginEvents.CACHE_KEY_WILL_BE_USED].call(\n plugin, {mode, request: effectiveRequest});\n\n if (typeof effectiveRequest === 'string') {\n effectiveRequest = new Request(effectiveRequest);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(effectiveRequest, Request, {\n moduleName: 'Plugin',\n funcName: pluginEvents.CACHE_KEY_WILL_BE_USED,\n isReturnValueProblem: true,\n });\n }\n }\n\n return effectiveRequest;\n};\n\nexport const cacheWrapper = {\n put: putWrapper,\n match: matchWrapper,\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n/**\n * A class that wraps common IndexedDB functionality in a promise-based API.\n * It exposes all the underlying power and functionality of IndexedDB, but\n * wraps the most commonly used features in a way that's much simpler to use.\n *\n * @private\n */\nexport class DBWrapper {\n /**\n * @param {string} name\n * @param {number} version\n * @param {Object=} [callback]\n * @param {!Function} [callbacks.onupgradeneeded]\n * @param {!Function} [callbacks.onversionchange] Defaults to\n * DBWrapper.prototype._onversionchange when not specified.\n * @private\n */\n constructor(name, version, {\n onupgradeneeded,\n onversionchange = this._onversionchange,\n } = {}) {\n this._name = name;\n this._version = version;\n this._onupgradeneeded = onupgradeneeded;\n this._onversionchange = onversionchange;\n\n // If this is null, it means the database isn't open.\n this._db = null;\n }\n\n /**\n * Returns the IDBDatabase instance (not normally needed).\n *\n * @private\n */\n get db() {\n return this._db;\n }\n\n /**\n * Opens a connected to an IDBDatabase, invokes any onupgradedneeded\n * callback, and added an onversionchange callback to the database.\n *\n * @return {IDBDatabase}\n * @private\n */\n async open() {\n if (this._db) return;\n\n this._db = await new Promise((resolve, reject) => {\n // This flag is flipped to true if the timeout callback runs prior\n // to the request failing or succeeding. Note: we use a timeout instead\n // of an onblocked handler since there are cases where onblocked will\n // never never run. A timeout better handles all possible scenarios:\n // https://github.com/w3c/IndexedDB/issues/223\n let openRequestTimedOut = false;\n setTimeout(() => {\n openRequestTimedOut = true;\n reject(new Error('The open request was blocked and timed out'));\n }, this.OPEN_TIMEOUT);\n\n const openRequest = indexedDB.open(this._name, this._version);\n openRequest.onerror = () => reject(openRequest.error);\n openRequest.onupgradeneeded = (evt) => {\n if (openRequestTimedOut) {\n openRequest.transaction.abort();\n evt.target.result.close();\n } else if (this._onupgradeneeded) {\n this._onupgradeneeded(evt);\n }\n };\n openRequest.onsuccess = ({target}) => {\n const db = target.result;\n if (openRequestTimedOut) {\n db.close();\n } else {\n db.onversionchange = this._onversionchange.bind(this);\n resolve(db);\n }\n };\n });\n\n return this;\n }\n\n /**\n * Polyfills the native `getKey()` method. Note, this is overridden at\n * runtime if the browser supports the native method.\n *\n * @param {string} storeName\n * @param {*} query\n * @return {Array}\n * @private\n */\n async getKey(storeName, query) {\n return (await this.getAllKeys(storeName, query, 1))[0];\n }\n\n /**\n * Polyfills the native `getAll()` method. Note, this is overridden at\n * runtime if the browser supports the native method.\n *\n * @param {string} storeName\n * @param {*} query\n * @param {number} count\n * @return {Array}\n * @private\n */\n async getAll(storeName, query, count) {\n return await this.getAllMatching(storeName, {query, count});\n }\n\n\n /**\n * Polyfills the native `getAllKeys()` method. Note, this is overridden at\n * runtime if the browser supports the native method.\n *\n * @param {string} storeName\n * @param {*} query\n * @param {number} count\n * @return {Array}\n * @private\n */\n async getAllKeys(storeName, query, count) {\n return (await this.getAllMatching(\n storeName, {query, count, includeKeys: true})).map(({key}) => key);\n }\n\n /**\n * Supports flexible lookup in an object store by specifying an index,\n * query, direction, and count. This method returns an array of objects\n * with the signature .\n *\n * @param {string} storeName\n * @param {Object} [opts]\n * @param {string} [opts.index] The index to use (if specified).\n * @param {*} [opts.query]\n * @param {IDBCursorDirection} [opts.direction]\n * @param {number} [opts.count] The max number of results to return.\n * @param {boolean} [opts.includeKeys] When true, the structure of the\n * returned objects is changed from an array of values to an array of\n * objects in the form {key, primaryKey, value}.\n * @return {Array}\n * @private\n */\n async getAllMatching(storeName, {\n index,\n query = null, // IE errors if query === `undefined`.\n direction = 'next',\n count,\n includeKeys,\n } = {}) {\n return await this.transaction([storeName], 'readonly', (txn, done) => {\n const store = txn.objectStore(storeName);\n const target = index ? store.index(index) : store;\n const results = [];\n\n target.openCursor(query, direction).onsuccess = ({target}) => {\n const cursor = target.result;\n if (cursor) {\n const {primaryKey, key, value} = cursor;\n results.push(includeKeys ? {primaryKey, key, value} : value);\n if (count && results.length >= count) {\n done(results);\n } else {\n cursor.continue();\n }\n } else {\n done(results);\n }\n };\n });\n }\n\n /**\n * Accepts a list of stores, a transaction type, and a callback and\n * performs a transaction. A promise is returned that resolves to whatever\n * value the callback chooses. The callback holds all the transaction logic\n * and is invoked with two arguments:\n * 1. The IDBTransaction object\n * 2. A `done` function, that's used to resolve the promise when\n * when the transaction is done, if passed a value, the promise is\n * resolved to that value.\n *\n * @param {Array} storeNames An array of object store names\n * involved in the transaction.\n * @param {string} type Can be `readonly` or `readwrite`.\n * @param {!Function} callback\n * @return {*} The result of the transaction ran by the callback.\n * @private\n */\n async transaction(storeNames, type, callback) {\n await this.open();\n return await new Promise((resolve, reject) => {\n const txn = this._db.transaction(storeNames, type);\n txn.onabort = ({target}) => reject(target.error);\n txn.oncomplete = () => resolve();\n\n callback(txn, (value) => resolve(value));\n });\n }\n\n /**\n * Delegates async to a native IDBObjectStore method.\n *\n * @param {string} method The method name.\n * @param {string} storeName The object store name.\n * @param {string} type Can be `readonly` or `readwrite`.\n * @param {...*} args The list of args to pass to the native method.\n * @return {*} The result of the transaction.\n * @private\n */\n async _call(method, storeName, type, ...args) {\n const callback = (txn, done) => {\n txn.objectStore(storeName)[method](...args).onsuccess = ({target}) => {\n done(target.result);\n };\n };\n\n return await this.transaction([storeName], type, callback);\n }\n\n /**\n * The default onversionchange handler, which closes the database so other\n * connections can open without being blocked.\n *\n * @private\n */\n _onversionchange() {\n this.close();\n }\n\n /**\n * Closes the connection opened by `DBWrapper.open()`. Generally this method\n * doesn't need to be called since:\n * 1. It's usually better to keep a connection open since opening\n * a new connection is somewhat slow.\n * 2. Connections are automatically closed when the reference is\n * garbage collected.\n * The primary use case for needing to close a connection is when another\n * reference (typically in another tab) needs to upgrade it and would be\n * blocked by the current, open connection.\n *\n * @private\n */\n close() {\n if (this._db) {\n this._db.close();\n this._db = null;\n }\n }\n}\n\n// Exposed to let users modify the default timeout on a per-instance\n// or global basis.\nDBWrapper.prototype.OPEN_TIMEOUT = 2000;\n\n// Wrap native IDBObjectStore methods according to their mode.\nconst methodsToWrap = {\n 'readonly': ['get', 'count', 'getKey', 'getAll', 'getAllKeys'],\n 'readwrite': ['add', 'put', 'clear', 'delete'],\n};\nfor (const [mode, methods] of Object.entries(methodsToWrap)) {\n for (const method of methods) {\n if (method in IDBObjectStore.prototype) {\n // Don't use arrow functions here since we're outside of the class.\n DBWrapper.prototype[method] = async function(storeName, ...args) {\n return await this._call(method, storeName, mode, ...args);\n };\n }\n }\n}\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n/**\n * Deletes the database.\n * Note: this is exported separately from the DBWrapper module because most\n * usages of IndexedDB in workbox dont need deleting, and this way it can be\n * reused in tests to delete databases without creating DBWrapper instances.\n *\n * @param {string} name The database name.\n * @private\n */\nexport const deleteDatabase = async (name) => {\n await new Promise((resolve, reject) => {\n const request = indexedDB.deleteDatabase(name);\n request.onerror = ({target}) => {\n reject(target.error);\n };\n request.onblocked = () => {\n reject(new Error('Delete blocked'));\n };\n request.onsuccess = () => {\n resolve();\n };\n });\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from './WorkboxError.mjs';\nimport {logger} from './logger.mjs';\nimport {assert} from './assert.mjs';\nimport {getFriendlyURL} from '../_private/getFriendlyURL.mjs';\nimport {pluginEvents} from '../models/pluginEvents.mjs';\nimport {pluginUtils} from '../utils/pluginUtils.mjs';\nimport '../_version.mjs';\n\n/**\n * Wrapper around the fetch API.\n *\n * Will call requestWillFetch on available plugins.\n *\n * @param {Object} options\n * @param {Request|string} options.request\n * @param {Object} [options.fetchOptions]\n * @param {Event} [options.event]\n * @param {Array} [options.plugins=[]]\n * @return {Promise}\n *\n * @private\n * @memberof module:workbox-core\n */\nconst wrappedFetch = async ({\n request,\n fetchOptions,\n event,\n plugins = []}) => {\n // We *should* be able to call `await event.preloadResponse` even if it's\n // undefined, but for some reason, doing so leads to errors in our Node unit\n // tests. To work around that, explicitly check preloadResponse's value first.\n if (event && event.preloadResponse) {\n const possiblePreloadResponse = await event.preloadResponse;\n if (possiblePreloadResponse) {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Using a preloaded navigation response for ` +\n `'${getFriendlyURL(request.url)}'`);\n }\n return possiblePreloadResponse;\n }\n }\n\n if (typeof request === 'string') {\n request = new Request(request);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n paramName: request,\n expectedClass: 'Request',\n moduleName: 'workbox-core',\n className: 'fetchWrapper',\n funcName: 'wrappedFetch',\n });\n }\n\n const failedFetchPlugins = pluginUtils.filter(\n plugins, pluginEvents.FETCH_DID_FAIL);\n\n // If there is a fetchDidFail plugin, we need to save a clone of the\n // original request before it's either modified by a requestWillFetch\n // plugin or before the original request's body is consumed via fetch().\n const originalRequest = failedFetchPlugins.length > 0 ?\n request.clone() : null;\n\n try {\n for (let plugin of plugins) {\n if (pluginEvents.REQUEST_WILL_FETCH in plugin) {\n request = await plugin[pluginEvents.REQUEST_WILL_FETCH].call(plugin, {\n request: request.clone(),\n event,\n });\n\n if (process.env.NODE_ENV !== 'production') {\n if (request) {\n assert.isInstance(request, Request, {\n moduleName: 'Plugin',\n funcName: pluginEvents.CACHED_RESPONSE_WILL_BE_USED,\n isReturnValueProblem: true,\n });\n }\n }\n }\n }\n } catch (err) {\n throw new WorkboxError('plugin-error-request-will-fetch', {\n thrownError: err,\n });\n }\n\n // The request can be altered by plugins with `requestWillFetch` making\n // the original request (Most likely from a `fetch` event) to be different\n // to the Request we make. Pass both to `fetchDidFail` to aid debugging.\n let pluginFilteredRequest = request.clone();\n\n try {\n let fetchResponse;\n\n // See https://github.com/GoogleChrome/workbox/issues/1796\n if (request.mode === 'navigate') {\n fetchResponse = await fetch(request);\n } else {\n fetchResponse = await fetch(request, fetchOptions);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Network request for `+\n `'${getFriendlyURL(request.url)}' returned a response with ` +\n `status '${fetchResponse.status}'.`);\n }\n\n for (const plugin of plugins) {\n if (pluginEvents.FETCH_DID_SUCCEED in plugin) {\n fetchResponse = await plugin[pluginEvents.FETCH_DID_SUCCEED]\n .call(plugin, {\n event,\n request: pluginFilteredRequest,\n response: fetchResponse,\n });\n\n if (process.env.NODE_ENV !== 'production') {\n if (fetchResponse) {\n assert.isInstance(fetchResponse, Response, {\n moduleName: 'Plugin',\n funcName: pluginEvents.FETCH_DID_SUCCEED,\n isReturnValueProblem: true,\n });\n }\n }\n }\n }\n\n return fetchResponse;\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.error(`Network request for `+\n `'${getFriendlyURL(request.url)}' threw an error.`, error);\n }\n\n for (const plugin of failedFetchPlugins) {\n await plugin[pluginEvents.FETCH_DID_FAIL].call(plugin, {\n error,\n event,\n originalRequest: originalRequest.clone(),\n request: pluginFilteredRequest.clone(),\n });\n }\n\n throw error;\n }\n};\n\nconst fetchWrapper = {\n fetch: wrappedFetch,\n};\n\nexport {fetchWrapper};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n/**\n * The Deferred class composes Promises in a way that allows for them to be\n * resolved or rejected from outside the constructor. In most cases promises\n * should be used directly, but Deferreds can be necessary when the logic to\n * resolve a promise must be separate.\n *\n * @private\n */\nexport class Deferred {\n /**\n * Creates a promise and exposes its resolve and reject functions as methods.\n */\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n}\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {cacheNames as _cacheNames} from './_private/cacheNames.mjs';\nimport './_version.mjs';\n\n\n/**\n * Get the current cache names and prefix/suffix used by Workbox.\n *\n * `cacheNames.precache` is used for precached assets,\n * `cacheNames.googleAnalytics` is used by `workbox-google-analytics` to\n * store `analytics.js`, and `cacheNames.runtime` is used for everything else.\n *\n * `cacheNames.prefix` can be used to retrieve just the current prefix value.\n * `cacheNames.suffix` can be used to retrieve just the current suffix value.\n *\n * @return {Object} An object with `precache`, `runtime`, `prefix`, and\n * `googleAnalytics` properties.\n *\n * @alias workbox.core.cacheNames\n */\nexport const cacheNames = {\n get googleAnalytics() {\n return _cacheNames.getGoogleAnalyticsName();\n },\n get precache() {\n return _cacheNames.getPrecacheName();\n },\n get prefix() {\n return _cacheNames.getPrefix();\n },\n get runtime() {\n return _cacheNames.getRuntimeName();\n },\n get suffix() {\n return _cacheNames.getSuffix();\n },\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {registerQuotaErrorCallback} from './registerQuotaErrorCallback.mjs';\nimport * as _private from './_private.mjs';\nimport {clientsClaim} from './clientsClaim.mjs';\nimport {cacheNames} from './cacheNames.mjs';\nimport {setCacheNameDetails} from './setCacheNameDetails.mjs';\nimport {skipWaiting} from './skipWaiting.mjs';\nimport './_version.mjs';\n\n\n// Give our version strings something to hang off of.\ntry {\n self.workbox.v = self.workbox.v || {};\n} catch (errer) {\n // NOOP\n}\n\n/**\n * All of the Workbox service worker libraries use workbox-core for shared\n * code as well as setting default values that need to be shared (like cache\n * names).\n *\n * @namespace workbox.core\n */\n\nexport {\n _private,\n clientsClaim,\n cacheNames,\n registerQuotaErrorCallback,\n setCacheNameDetails,\n skipWaiting,\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport './_version.mjs';\n\n\n/**\n * Claim any currently available clients once the service worker\n * becomes active. This is normally used in conjunction with `skipWaiting()`.\n *\n * @alias workbox.core.clientsClaim\n */\nexport const clientsClaim = () => {\n addEventListener('activate', () => clients.claim());\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {logger} from './_private/logger.mjs';\nimport {assert} from './_private/assert.mjs';\nimport {quotaErrorCallbacks} from './models/quotaErrorCallbacks.mjs';\nimport './_version.mjs';\n\n\n/**\n * Adds a function to the set of quotaErrorCallbacks that will be executed if\n * there's a quota error.\n *\n * @param {Function} callback\n * @memberof workbox.core\n */\nfunction registerQuotaErrorCallback(callback) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(callback, 'function', {\n moduleName: 'workbox-core',\n funcName: 'register',\n paramName: 'callback',\n });\n }\n\n quotaErrorCallbacks.add(callback);\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Registered a callback to respond to quota errors.', callback);\n }\n}\n\nexport {registerQuotaErrorCallback};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from './_private/assert.mjs';\nimport {cacheNames} from './_private/cacheNames.mjs';\nimport {WorkboxError} from './_private/WorkboxError.mjs';\nimport './_version.mjs';\n\n\n/**\n * Modifies the default cache names used by the Workbox packages.\n * Cache names are generated as `--`.\n *\n * @param {Object} details\n * @param {Object} [details.prefix] The string to add to the beginning of\n * the precache and runtime cache names.\n * @param {Object} [details.suffix] The string to add to the end of\n * the precache and runtime cache names.\n * @param {Object} [details.precache] The cache name to use for precache\n * caching.\n * @param {Object} [details.runtime] The cache name to use for runtime caching.\n * @param {Object} [details.googleAnalytics] The cache name to use for\n * `workbox-google-analytics` caching.\n *\n * @alias workbox.core.setCacheNameDetails\n */\nexport const setCacheNameDetails = (details) => {\n if (process.env.NODE_ENV !== 'production') {\n Object.keys(details).forEach((key) => {\n assert.isType(details[key], 'string', {\n moduleName: 'workbox-core',\n funcName: 'setCacheNameDetails',\n paramName: `details.${key}`,\n });\n });\n\n if ('precache' in details && details.precache.length === 0) {\n throw new WorkboxError('invalid-cache-name', {\n cacheNameId: 'precache',\n value: details.precache,\n });\n }\n\n if ('runtime' in details && details.runtime.length === 0) {\n throw new WorkboxError('invalid-cache-name', {\n cacheNameId: 'runtime',\n value: details.runtime,\n });\n }\n\n if ('googleAnalytics' in details && details.googleAnalytics.length === 0) {\n throw new WorkboxError('invalid-cache-name', {\n cacheNameId: 'googleAnalytics',\n value: details.googleAnalytics,\n });\n }\n }\n\n cacheNames.updateDetails(details);\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport './_version.mjs';\n\n\n/**\n * Force a service worker to become active, instead of waiting. This is\n * normally used in conjunction with `clientsClaim()`.\n *\n * @alias workbox.core.skipWaiting\n */\nexport const skipWaiting = () => {\n // We need to explicitly call `self.skipWaiting()` here because we're\n // shadowing `skipWaiting` with this local function.\n addEventListener('install', () => self.skipWaiting());\n};\n"],"names":["self","_","e","messageGenerator","code","args","msg","length","JSON","stringify","WorkboxError","Error","constructor","errorCode","details","name","quotaErrorCallbacks","Set","_cacheNameDetails","googleAnalytics","precache","prefix","runtime","suffix","registration","scope","_createCacheName","cacheName","filter","value","join","cacheNames","updateDetails","Object","keys","forEach","key","getGoogleAnalyticsName","userCacheName","getPrecacheName","getPrefix","getRuntimeName","getSuffix","getFriendlyURL","url","urlObj","URL","location","origin","pathname","href","async","executeQuotaErrorCallbacks","callback","pluginEvents","pluginUtils","plugins","callbackName","plugin","matchWrapper","request","event","matchOptions","cache","caches","open","effectiveRequest","_getEffectiveRequest","mode","cachedResponse","match","call","_isResponseSafeToCache","response","responseToCache","pluginsUsed","status","cacheKeyWillBeUsedPlugins","Request","cacheWrapper","put","updatePlugins","oldResponse","error","newResponse","DBWrapper","version","onupgradeneeded","onversionchange","this","_onversionchange","_name","_version","_onupgradeneeded","_db","Promise","resolve","reject","openRequestTimedOut","setTimeout","OPEN_TIMEOUT","openRequest","indexedDB","onerror","evt","transaction","abort","target","result","close","onsuccess","db","bind","storeName","query","getAllKeys","count","getAllMatching","includeKeys","map","index","direction","txn","done","store","objectStore","results","openCursor","cursor","primaryKey","push","continue","storeNames","type","onabort","oncomplete","method","prototype","methodsToWrap","methods","entries","IDBObjectStore","_call","fetchWrapper","fetch","fetchOptions","preloadResponse","possiblePreloadResponse","failedFetchPlugins","originalRequest","clone","err","thrownError","pluginFilteredRequest","fetchResponse","process","promise","deleteDatabase","onblocked","_cacheNames","workbox","v","errer","addEventListener","clients","claim","add","skipWaiting"],"mappings":"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"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-expiration.dev.js b/workbox-v4.3.1/workbox-expiration.dev.js new file mode 100644 index 00000000..cbd068b4 --- /dev/null +++ b/workbox-v4.3.1/workbox-expiration.dev.js @@ -0,0 +1,652 @@ +this.workbox = this.workbox || {}; +this.workbox.expiration = (function (exports, DBWrapper_mjs, deleteDatabase_mjs, WorkboxError_mjs, assert_mjs, logger_mjs, cacheNames_mjs, getFriendlyURL_mjs, registerQuotaErrorCallback_mjs) { + 'use strict'; + + try { + self['workbox:expiration:4.3.1'] && _(); + } catch (e) {} // eslint-disable-line + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const DB_NAME = 'workbox-expiration'; + const OBJECT_STORE_NAME = 'cache-entries'; + + const normalizeURL = unNormalizedUrl => { + const url = new URL(unNormalizedUrl, location); + url.hash = ''; + return url.href; + }; + /** + * Returns the timestamp model. + * + * @private + */ + + + class CacheTimestampsModel { + /** + * + * @param {string} cacheName + * + * @private + */ + constructor(cacheName) { + this._cacheName = cacheName; + this._db = new DBWrapper_mjs.DBWrapper(DB_NAME, 1, { + onupgradeneeded: event => this._handleUpgrade(event) + }); + } + /** + * Should perform an upgrade of indexedDB. + * + * @param {Event} event + * + * @private + */ + + + _handleUpgrade(event) { + const db = event.target.result; // TODO(philipwalton): EdgeHTML doesn't support arrays as a keyPath, so we + // have to use the `id` keyPath here and create our own values (a + // concatenation of `url + cacheName`) instead of simply using + // `keyPath: ['url', 'cacheName']`, which is supported in other browsers. + + const objStore = db.createObjectStore(OBJECT_STORE_NAME, { + keyPath: 'id' + }); // TODO(philipwalton): once we don't have to support EdgeHTML, we can + // create a single index with the keyPath `['cacheName', 'timestamp']` + // instead of doing both these indexes. + + objStore.createIndex('cacheName', 'cacheName', { + unique: false + }); + objStore.createIndex('timestamp', 'timestamp', { + unique: false + }); // Previous versions of `workbox-expiration` used `this._cacheName` + // as the IDBDatabase name. + + deleteDatabase_mjs.deleteDatabase(this._cacheName); + } + /** + * @param {string} url + * @param {number} timestamp + * + * @private + */ + + + async setTimestamp(url, timestamp) { + url = normalizeURL(url); + await this._db.put(OBJECT_STORE_NAME, { + url, + timestamp, + cacheName: this._cacheName, + // Creating an ID from the URL and cache name won't be necessary once + // Edge switches to Chromium and all browsers we support work with + // array keyPaths. + id: this._getId(url) + }); + } + /** + * Returns the timestamp stored for a given URL. + * + * @param {string} url + * @return {number} + * + * @private + */ + + + async getTimestamp(url) { + const entry = await this._db.get(OBJECT_STORE_NAME, this._getId(url)); + return entry.timestamp; + } + /** + * Iterates through all the entries in the object store (from newest to + * oldest) and removes entries once either `maxCount` is reached or the + * entry's timestamp is less than `minTimestamp`. + * + * @param {number} minTimestamp + * @param {number} maxCount + * + * @private + */ + + + async expireEntries(minTimestamp, maxCount) { + const entriesToDelete = await this._db.transaction(OBJECT_STORE_NAME, 'readwrite', (txn, done) => { + const store = txn.objectStore(OBJECT_STORE_NAME); + const entriesToDelete = []; + let entriesNotDeletedCount = 0; + + store.index('timestamp').openCursor(null, 'prev').onsuccess = ({ + target + }) => { + const cursor = target.result; + + if (cursor) { + const result = cursor.value; // TODO(philipwalton): once we can use a multi-key index, we + // won't have to check `cacheName` here. + + if (result.cacheName === this._cacheName) { + // Delete an entry if it's older than the max age or + // if we already have the max number allowed. + if (minTimestamp && result.timestamp < minTimestamp || maxCount && entriesNotDeletedCount >= maxCount) { + // TODO(philipwalton): we should be able to delete the + // entry right here, but doing so causes an iteration + // bug in Safari stable (fixed in TP). Instead we can + // store the keys of the entries to delete, and then + // delete the separate transactions. + // https://github.com/GoogleChrome/workbox/issues/1978 + // cursor.delete(); + // We only need to return the URL, not the whole entry. + entriesToDelete.push(cursor.value); + } else { + entriesNotDeletedCount++; + } + } + + cursor.continue(); + } else { + done(entriesToDelete); + } + }; + }); // TODO(philipwalton): once the Safari bug in the following issue is fixed, + // we should be able to remove this loop and do the entry deletion in the + // cursor loop above: + // https://github.com/GoogleChrome/workbox/issues/1978 + + const urlsDeleted = []; + + for (const entry of entriesToDelete) { + await this._db.delete(OBJECT_STORE_NAME, entry.id); + urlsDeleted.push(entry.url); + } + + return urlsDeleted; + } + /** + * Takes a URL and returns an ID that will be unique in the object store. + * + * @param {string} url + * @return {string} + * + * @private + */ + + + _getId(url) { + // Creating an ID from the URL and cache name won't be necessary once + // Edge switches to Chromium and all browsers we support work with + // array keyPaths. + return this._cacheName + '|' + normalizeURL(url); + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * The `CacheExpiration` class allows you define an expiration and / or + * limit on the number of responses stored in a + * [`Cache`](https://developer.mozilla.org/en-US/docs/Web/API/Cache). + * + * @memberof workbox.expiration + */ + + class CacheExpiration { + /** + * To construct a new CacheExpiration instance you must provide at least + * one of the `config` properties. + * + * @param {string} cacheName Name of the cache to apply restrictions to. + * @param {Object} config + * @param {number} [config.maxEntries] The maximum number of entries to cache. + * Entries used the least will be removed as the maximum is reached. + * @param {number} [config.maxAgeSeconds] The maximum age of an entry before + * it's treated as stale and removed. + */ + constructor(cacheName, config = {}) { + { + assert_mjs.assert.isType(cacheName, 'string', { + moduleName: 'workbox-expiration', + className: 'CacheExpiration', + funcName: 'constructor', + paramName: 'cacheName' + }); + + if (!(config.maxEntries || config.maxAgeSeconds)) { + throw new WorkboxError_mjs.WorkboxError('max-entries-or-age-required', { + moduleName: 'workbox-expiration', + className: 'CacheExpiration', + funcName: 'constructor' + }); + } + + if (config.maxEntries) { + assert_mjs.assert.isType(config.maxEntries, 'number', { + moduleName: 'workbox-expiration', + className: 'CacheExpiration', + funcName: 'constructor', + paramName: 'config.maxEntries' + }); // TODO: Assert is positive + } + + if (config.maxAgeSeconds) { + assert_mjs.assert.isType(config.maxAgeSeconds, 'number', { + moduleName: 'workbox-expiration', + className: 'CacheExpiration', + funcName: 'constructor', + paramName: 'config.maxAgeSeconds' + }); // TODO: Assert is positive + } + } + + this._isRunning = false; + this._rerunRequested = false; + this._maxEntries = config.maxEntries; + this._maxAgeSeconds = config.maxAgeSeconds; + this._cacheName = cacheName; + this._timestampModel = new CacheTimestampsModel(cacheName); + } + /** + * Expires entries for the given cache and given criteria. + */ + + + async expireEntries() { + if (this._isRunning) { + this._rerunRequested = true; + return; + } + + this._isRunning = true; + const minTimestamp = this._maxAgeSeconds ? Date.now() - this._maxAgeSeconds * 1000 : undefined; + const urlsExpired = await this._timestampModel.expireEntries(minTimestamp, this._maxEntries); // Delete URLs from the cache + + const cache = await caches.open(this._cacheName); + + for (const url of urlsExpired) { + await cache.delete(url); + } + + { + if (urlsExpired.length > 0) { + logger_mjs.logger.groupCollapsed(`Expired ${urlsExpired.length} ` + `${urlsExpired.length === 1 ? 'entry' : 'entries'} and removed ` + `${urlsExpired.length === 1 ? 'it' : 'them'} from the ` + `'${this._cacheName}' cache.`); + logger_mjs.logger.log(`Expired the following ${urlsExpired.length === 1 ? 'URL' : 'URLs'}:`); + urlsExpired.forEach(url => logger_mjs.logger.log(` ${url}`)); + logger_mjs.logger.groupEnd(); + } else { + logger_mjs.logger.debug(`Cache expiration ran and found no entries to remove.`); + } + } + + this._isRunning = false; + + if (this._rerunRequested) { + this._rerunRequested = false; + this.expireEntries(); + } + } + /** + * Update the timestamp for the given URL. This ensures the when + * removing entries based on maximum entries, most recently used + * is accurate or when expiring, the timestamp is up-to-date. + * + * @param {string} url + */ + + + async updateTimestamp(url) { + { + assert_mjs.assert.isType(url, 'string', { + moduleName: 'workbox-expiration', + className: 'CacheExpiration', + funcName: 'updateTimestamp', + paramName: 'url' + }); + } + + await this._timestampModel.setTimestamp(url, Date.now()); + } + /** + * Can be used to check if a URL has expired or not before it's used. + * + * This requires a look up from IndexedDB, so can be slow. + * + * Note: This method will not remove the cached entry, call + * `expireEntries()` to remove indexedDB and Cache entries. + * + * @param {string} url + * @return {boolean} + */ + + + async isURLExpired(url) { + { + if (!this._maxAgeSeconds) { + throw new WorkboxError_mjs.WorkboxError(`expired-test-without-max-age`, { + methodName: 'isURLExpired', + paramName: 'maxAgeSeconds' + }); + } + } + + const timestamp = await this._timestampModel.getTimestamp(url); + const expireOlderThan = Date.now() - this._maxAgeSeconds * 1000; + return timestamp < expireOlderThan; + } + /** + * Removes the IndexedDB object store used to keep track of cache expiration + * metadata. + */ + + + async delete() { + // Make sure we don't attempt another rerun if we're called in the middle of + // a cache expiration. + this._rerunRequested = false; + await this._timestampModel.expireEntries(Infinity); // Expires all. + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * This plugin can be used in the Workbox APIs to regularly enforce a + * limit on the age and / or the number of cached requests. + * + * Whenever a cached request is used or updated, this plugin will look + * at the used Cache and remove any old or extra requests. + * + * When using `maxAgeSeconds`, requests may be used *once* after expiring + * because the expiration clean up will not have occurred until *after* the + * cached request has been used. If the request has a "Date" header, then + * a light weight expiration check is performed and the request will not be + * used immediately. + * + * When using `maxEntries`, the entry least-recently requested will be removed from the cache first. + * + * @memberof workbox.expiration + */ + + class Plugin { + /** + * @param {Object} config + * @param {number} [config.maxEntries] The maximum number of entries to cache. + * Entries used the least will be removed as the maximum is reached. + * @param {number} [config.maxAgeSeconds] The maximum age of an entry before + * it's treated as stale and removed. + * @param {boolean} [config.purgeOnQuotaError] Whether to opt this cache in to + * automatic deletion if the available storage quota has been exceeded. + */ + constructor(config = {}) { + { + if (!(config.maxEntries || config.maxAgeSeconds)) { + throw new WorkboxError_mjs.WorkboxError('max-entries-or-age-required', { + moduleName: 'workbox-expiration', + className: 'Plugin', + funcName: 'constructor' + }); + } + + if (config.maxEntries) { + assert_mjs.assert.isType(config.maxEntries, 'number', { + moduleName: 'workbox-expiration', + className: 'Plugin', + funcName: 'constructor', + paramName: 'config.maxEntries' + }); + } + + if (config.maxAgeSeconds) { + assert_mjs.assert.isType(config.maxAgeSeconds, 'number', { + moduleName: 'workbox-expiration', + className: 'Plugin', + funcName: 'constructor', + paramName: 'config.maxAgeSeconds' + }); + } + } + + this._config = config; + this._maxAgeSeconds = config.maxAgeSeconds; + this._cacheExpirations = new Map(); + + if (config.purgeOnQuotaError) { + registerQuotaErrorCallback_mjs.registerQuotaErrorCallback(() => this.deleteCacheAndMetadata()); + } + } + /** + * A simple helper method to return a CacheExpiration instance for a given + * cache name. + * + * @param {string} cacheName + * @return {CacheExpiration} + * + * @private + */ + + + _getCacheExpiration(cacheName) { + if (cacheName === cacheNames_mjs.cacheNames.getRuntimeName()) { + throw new WorkboxError_mjs.WorkboxError('expire-custom-caches-only'); + } + + let cacheExpiration = this._cacheExpirations.get(cacheName); + + if (!cacheExpiration) { + cacheExpiration = new CacheExpiration(cacheName, this._config); + + this._cacheExpirations.set(cacheName, cacheExpiration); + } + + return cacheExpiration; + } + /** + * A "lifecycle" callback that will be triggered automatically by the + * `workbox.strategies` handlers when a `Response` is about to be returned + * from a [Cache](https://developer.mozilla.org/en-US/docs/Web/API/Cache) to + * the handler. It allows the `Response` to be inspected for freshness and + * prevents it from being used if the `Response`'s `Date` header value is + * older than the configured `maxAgeSeconds`. + * + * @param {Object} options + * @param {string} options.cacheName Name of the cache the response is in. + * @param {Response} options.cachedResponse The `Response` object that's been + * read from a cache and whose freshness should be checked. + * @return {Response} Either the `cachedResponse`, if it's + * fresh, or `null` if the `Response` is older than `maxAgeSeconds`. + * + * @private + */ + + + cachedResponseWillBeUsed({ + event, + request, + cacheName, + cachedResponse + }) { + if (!cachedResponse) { + return null; + } + + let isFresh = this._isResponseDateFresh(cachedResponse); // Expire entries to ensure that even if the expiration date has + // expired, it'll only be used once. + + + const cacheExpiration = this._getCacheExpiration(cacheName); + + cacheExpiration.expireEntries(); // Update the metadata for the request URL to the current timestamp, + // but don't `await` it as we don't want to block the response. + + const updateTimestampDone = cacheExpiration.updateTimestamp(request.url); + + if (event) { + try { + event.waitUntil(updateTimestampDone); + } catch (error) { + { + logger_mjs.logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache entry for '${getFriendlyURL_mjs.getFriendlyURL(event.request.url)}'.`); + } + } + } + + return isFresh ? cachedResponse : null; + } + /** + * @param {Response} cachedResponse + * @return {boolean} + * + * @private + */ + + + _isResponseDateFresh(cachedResponse) { + if (!this._maxAgeSeconds) { + // We aren't expiring by age, so return true, it's fresh + return true; + } // Check if the 'date' header will suffice a quick expiration check. + // See https://github.com/GoogleChromeLabs/sw-toolbox/issues/164 for + // discussion. + + + const dateHeaderTimestamp = this._getDateHeaderTimestamp(cachedResponse); + + if (dateHeaderTimestamp === null) { + // Unable to parse date, so assume it's fresh. + return true; + } // If we have a valid headerTime, then our response is fresh iff the + // headerTime plus maxAgeSeconds is greater than the current time. + + + const now = Date.now(); + return dateHeaderTimestamp >= now - this._maxAgeSeconds * 1000; + } + /** + * This method will extract the data header and parse it into a useful + * value. + * + * @param {Response} cachedResponse + * @return {number} + * + * @private + */ + + + _getDateHeaderTimestamp(cachedResponse) { + if (!cachedResponse.headers.has('date')) { + return null; + } + + const dateHeader = cachedResponse.headers.get('date'); + const parsedDate = new Date(dateHeader); + const headerTime = parsedDate.getTime(); // If the Date header was invalid for some reason, parsedDate.getTime() + // will return NaN. + + if (isNaN(headerTime)) { + return null; + } + + return headerTime; + } + /** + * A "lifecycle" callback that will be triggered automatically by the + * `workbox.strategies` handlers when an entry is added to a cache. + * + * @param {Object} options + * @param {string} options.cacheName Name of the cache that was updated. + * @param {string} options.request The Request for the cached entry. + * + * @private + */ + + + async cacheDidUpdate({ + cacheName, + request + }) { + { + assert_mjs.assert.isType(cacheName, 'string', { + moduleName: 'workbox-expiration', + className: 'Plugin', + funcName: 'cacheDidUpdate', + paramName: 'cacheName' + }); + assert_mjs.assert.isInstance(request, Request, { + moduleName: 'workbox-expiration', + className: 'Plugin', + funcName: 'cacheDidUpdate', + paramName: 'request' + }); + } + + const cacheExpiration = this._getCacheExpiration(cacheName); + + await cacheExpiration.updateTimestamp(request.url); + await cacheExpiration.expireEntries(); + } + /** + * This is a helper method that performs two operations: + * + * - Deletes *all* the underlying Cache instances associated with this plugin + * instance, by calling caches.delete() on your behalf. + * - Deletes the metadata from IndexedDB used to keep track of expiration + * details for each Cache instance. + * + * When using cache expiration, calling this method is preferable to calling + * `caches.delete()` directly, since this will ensure that the IndexedDB + * metadata is also cleanly removed and open IndexedDB instances are deleted. + * + * Note that if you're *not* using cache expiration for a given cache, calling + * `caches.delete()` and passing in the cache's name should be sufficient. + * There is no Workbox-specific method needed for cleanup in that case. + */ + + + async deleteCacheAndMetadata() { + // Do this one at a time instead of all at once via `Promise.all()` to + // reduce the chance of inconsistency if a promise rejects. + for (const [cacheName, cacheExpiration] of this._cacheExpirations) { + await caches.delete(cacheName); + await cacheExpiration.delete(); + } // Reset this._cacheExpirations to its initial state. + + + this._cacheExpirations = new Map(); + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + + exports.CacheExpiration = CacheExpiration; + exports.Plugin = Plugin; + + return exports; + +}({}, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core)); +//# sourceMappingURL=workbox-expiration.dev.js.map diff --git a/workbox-v4.3.1/workbox-expiration.dev.js.map b/workbox-v4.3.1/workbox-expiration.dev.js.map new file mode 100644 index 00000000..d0a03072 --- /dev/null +++ b/workbox-v4.3.1/workbox-expiration.dev.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-expiration.dev.js","sources":["../_version.mjs","../models/CacheTimestampsModel.mjs","../CacheExpiration.mjs","../Plugin.mjs","../index.mjs"],"sourcesContent":["try{self['workbox:expiration:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {DBWrapper} from 'workbox-core/_private/DBWrapper.mjs';\nimport {deleteDatabase} from 'workbox-core/_private/deleteDatabase.mjs';\nimport '../_version.mjs';\n\n\nconst DB_NAME = 'workbox-expiration';\nconst OBJECT_STORE_NAME = 'cache-entries';\n\nconst normalizeURL = (unNormalizedUrl) => {\n const url = new URL(unNormalizedUrl, location);\n url.hash = '';\n\n return url.href;\n};\n\n\n/**\n * Returns the timestamp model.\n *\n * @private\n */\nclass CacheTimestampsModel {\n /**\n *\n * @param {string} cacheName\n *\n * @private\n */\n constructor(cacheName) {\n this._cacheName = cacheName;\n\n this._db = new DBWrapper(DB_NAME, 1, {\n onupgradeneeded: (event) => this._handleUpgrade(event),\n });\n }\n\n /**\n * Should perform an upgrade of indexedDB.\n *\n * @param {Event} event\n *\n * @private\n */\n _handleUpgrade(event) {\n const db = event.target.result;\n\n // TODO(philipwalton): EdgeHTML doesn't support arrays as a keyPath, so we\n // have to use the `id` keyPath here and create our own values (a\n // concatenation of `url + cacheName`) instead of simply using\n // `keyPath: ['url', 'cacheName']`, which is supported in other browsers.\n const objStore = db.createObjectStore(OBJECT_STORE_NAME, {keyPath: 'id'});\n\n // TODO(philipwalton): once we don't have to support EdgeHTML, we can\n // create a single index with the keyPath `['cacheName', 'timestamp']`\n // instead of doing both these indexes.\n objStore.createIndex('cacheName', 'cacheName', {unique: false});\n objStore.createIndex('timestamp', 'timestamp', {unique: false});\n\n // Previous versions of `workbox-expiration` used `this._cacheName`\n // as the IDBDatabase name.\n deleteDatabase(this._cacheName);\n }\n\n /**\n * @param {string} url\n * @param {number} timestamp\n *\n * @private\n */\n async setTimestamp(url, timestamp) {\n url = normalizeURL(url);\n\n await this._db.put(OBJECT_STORE_NAME, {\n url,\n timestamp,\n cacheName: this._cacheName,\n // Creating an ID from the URL and cache name won't be necessary once\n // Edge switches to Chromium and all browsers we support work with\n // array keyPaths.\n id: this._getId(url),\n });\n }\n\n /**\n * Returns the timestamp stored for a given URL.\n *\n * @param {string} url\n * @return {number}\n *\n * @private\n */\n async getTimestamp(url) {\n const entry = await this._db.get(OBJECT_STORE_NAME, this._getId(url));\n return entry.timestamp;\n }\n\n /**\n * Iterates through all the entries in the object store (from newest to\n * oldest) and removes entries once either `maxCount` is reached or the\n * entry's timestamp is less than `minTimestamp`.\n *\n * @param {number} minTimestamp\n * @param {number} maxCount\n *\n * @private\n */\n async expireEntries(minTimestamp, maxCount) {\n const entriesToDelete = await this._db.transaction(\n OBJECT_STORE_NAME, 'readwrite', (txn, done) => {\n const store = txn.objectStore(OBJECT_STORE_NAME);\n const entriesToDelete = [];\n let entriesNotDeletedCount = 0;\n\n store.index('timestamp')\n .openCursor(null, 'prev')\n .onsuccess = ({target}) => {\n const cursor = target.result;\n if (cursor) {\n const result = cursor.value;\n // TODO(philipwalton): once we can use a multi-key index, we\n // won't have to check `cacheName` here.\n if (result.cacheName === this._cacheName) {\n // Delete an entry if it's older than the max age or\n // if we already have the max number allowed.\n if ((minTimestamp && result.timestamp < minTimestamp) ||\n (maxCount && entriesNotDeletedCount >= maxCount)) {\n // TODO(philipwalton): we should be able to delete the\n // entry right here, but doing so causes an iteration\n // bug in Safari stable (fixed in TP). Instead we can\n // store the keys of the entries to delete, and then\n // delete the separate transactions.\n // https://github.com/GoogleChrome/workbox/issues/1978\n // cursor.delete();\n\n // We only need to return the URL, not the whole entry.\n entriesToDelete.push(cursor.value);\n } else {\n entriesNotDeletedCount++;\n }\n }\n cursor.continue();\n } else {\n done(entriesToDelete);\n }\n };\n });\n\n // TODO(philipwalton): once the Safari bug in the following issue is fixed,\n // we should be able to remove this loop and do the entry deletion in the\n // cursor loop above:\n // https://github.com/GoogleChrome/workbox/issues/1978\n const urlsDeleted = [];\n for (const entry of entriesToDelete) {\n await this._db.delete(OBJECT_STORE_NAME, entry.id);\n urlsDeleted.push(entry.url);\n }\n\n return urlsDeleted;\n }\n\n /**\n * Takes a URL and returns an ID that will be unique in the object store.\n *\n * @param {string} url\n * @return {string}\n *\n * @private\n */\n _getId(url) {\n // Creating an ID from the URL and cache name won't be necessary once\n // Edge switches to Chromium and all browsers we support work with\n // array keyPaths.\n return this._cacheName + '|' + normalizeURL(url);\n }\n}\n\nexport {CacheTimestampsModel};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {CacheTimestampsModel} from './models/CacheTimestampsModel.mjs';\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\n\nimport './_version.mjs';\n\n/**\n * The `CacheExpiration` class allows you define an expiration and / or\n * limit on the number of responses stored in a\n * [`Cache`](https://developer.mozilla.org/en-US/docs/Web/API/Cache).\n *\n * @memberof workbox.expiration\n */\nclass CacheExpiration {\n /**\n * To construct a new CacheExpiration instance you must provide at least\n * one of the `config` properties.\n *\n * @param {string} cacheName Name of the cache to apply restrictions to.\n * @param {Object} config\n * @param {number} [config.maxEntries] The maximum number of entries to cache.\n * Entries used the least will be removed as the maximum is reached.\n * @param {number} [config.maxAgeSeconds] The maximum age of an entry before\n * it's treated as stale and removed.\n */\n constructor(cacheName, config = {}) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(cacheName, 'string', {\n moduleName: 'workbox-expiration',\n className: 'CacheExpiration',\n funcName: 'constructor',\n paramName: 'cacheName',\n });\n\n if (!(config.maxEntries || config.maxAgeSeconds)) {\n throw new WorkboxError('max-entries-or-age-required', {\n moduleName: 'workbox-expiration',\n className: 'CacheExpiration',\n funcName: 'constructor',\n });\n }\n\n if (config.maxEntries) {\n assert.isType(config.maxEntries, 'number', {\n moduleName: 'workbox-expiration',\n className: 'CacheExpiration',\n funcName: 'constructor',\n paramName: 'config.maxEntries',\n });\n\n // TODO: Assert is positive\n }\n\n if (config.maxAgeSeconds) {\n assert.isType(config.maxAgeSeconds, 'number', {\n moduleName: 'workbox-expiration',\n className: 'CacheExpiration',\n funcName: 'constructor',\n paramName: 'config.maxAgeSeconds',\n });\n\n // TODO: Assert is positive\n }\n }\n\n this._isRunning = false;\n this._rerunRequested = false;\n this._maxEntries = config.maxEntries;\n this._maxAgeSeconds = config.maxAgeSeconds;\n this._cacheName = cacheName;\n this._timestampModel = new CacheTimestampsModel(cacheName);\n }\n\n /**\n * Expires entries for the given cache and given criteria.\n */\n async expireEntries() {\n if (this._isRunning) {\n this._rerunRequested = true;\n return;\n }\n this._isRunning = true;\n\n const minTimestamp = this._maxAgeSeconds ?\n Date.now() - (this._maxAgeSeconds * 1000) : undefined;\n\n const urlsExpired = await this._timestampModel.expireEntries(\n minTimestamp, this._maxEntries);\n\n // Delete URLs from the cache\n const cache = await caches.open(this._cacheName);\n for (const url of urlsExpired) {\n await cache.delete(url);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (urlsExpired.length > 0) {\n logger.groupCollapsed(\n `Expired ${urlsExpired.length} ` +\n `${urlsExpired.length === 1 ? 'entry' : 'entries'} and removed ` +\n `${urlsExpired.length === 1 ? 'it' : 'them'} from the ` +\n `'${this._cacheName}' cache.`);\n logger.log(`Expired the following ${urlsExpired.length === 1 ?\n 'URL' : 'URLs'}:`);\n urlsExpired.forEach((url) => logger.log(` ${url}`));\n logger.groupEnd();\n } else {\n logger.debug(`Cache expiration ran and found no entries to remove.`);\n }\n }\n\n this._isRunning = false;\n if (this._rerunRequested) {\n this._rerunRequested = false;\n this.expireEntries();\n }\n }\n\n /**\n * Update the timestamp for the given URL. This ensures the when\n * removing entries based on maximum entries, most recently used\n * is accurate or when expiring, the timestamp is up-to-date.\n *\n * @param {string} url\n */\n async updateTimestamp(url) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(url, 'string', {\n moduleName: 'workbox-expiration',\n className: 'CacheExpiration',\n funcName: 'updateTimestamp',\n paramName: 'url',\n });\n }\n\n await this._timestampModel.setTimestamp(url, Date.now());\n }\n\n /**\n * Can be used to check if a URL has expired or not before it's used.\n *\n * This requires a look up from IndexedDB, so can be slow.\n *\n * Note: This method will not remove the cached entry, call\n * `expireEntries()` to remove indexedDB and Cache entries.\n *\n * @param {string} url\n * @return {boolean}\n */\n async isURLExpired(url) {\n if (process.env.NODE_ENV !== 'production') {\n if (!this._maxAgeSeconds) {\n throw new WorkboxError(`expired-test-without-max-age`, {\n methodName: 'isURLExpired',\n paramName: 'maxAgeSeconds',\n });\n }\n }\n\n const timestamp = await this._timestampModel.getTimestamp(url);\n const expireOlderThan = Date.now() - (this._maxAgeSeconds * 1000);\n return (timestamp < expireOlderThan);\n }\n\n /**\n * Removes the IndexedDB object store used to keep track of cache expiration\n * metadata.\n */\n async delete() {\n // Make sure we don't attempt another rerun if we're called in the middle of\n // a cache expiration.\n this._rerunRequested = false;\n await this._timestampModel.expireEntries(Infinity); // Expires all.\n }\n}\n\nexport {CacheExpiration};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {cacheNames} from 'workbox-core/_private/cacheNames.mjs';\nimport {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {registerQuotaErrorCallback}\n from 'workbox-core/registerQuotaErrorCallback.mjs';\n\nimport {CacheExpiration} from './CacheExpiration.mjs';\nimport './_version.mjs';\n\n/**\n * This plugin can be used in the Workbox APIs to regularly enforce a\n * limit on the age and / or the number of cached requests.\n *\n * Whenever a cached request is used or updated, this plugin will look\n * at the used Cache and remove any old or extra requests.\n *\n * When using `maxAgeSeconds`, requests may be used *once* after expiring\n * because the expiration clean up will not have occurred until *after* the\n * cached request has been used. If the request has a \"Date\" header, then\n * a light weight expiration check is performed and the request will not be\n * used immediately.\n *\n * When using `maxEntries`, the entry least-recently requested will be removed from the cache first.\n *\n * @memberof workbox.expiration\n */\nclass Plugin {\n /**\n * @param {Object} config\n * @param {number} [config.maxEntries] The maximum number of entries to cache.\n * Entries used the least will be removed as the maximum is reached.\n * @param {number} [config.maxAgeSeconds] The maximum age of an entry before\n * it's treated as stale and removed.\n * @param {boolean} [config.purgeOnQuotaError] Whether to opt this cache in to\n * automatic deletion if the available storage quota has been exceeded.\n */\n constructor(config = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (!(config.maxEntries || config.maxAgeSeconds)) {\n throw new WorkboxError('max-entries-or-age-required', {\n moduleName: 'workbox-expiration',\n className: 'Plugin',\n funcName: 'constructor',\n });\n }\n\n if (config.maxEntries) {\n assert.isType(config.maxEntries, 'number', {\n moduleName: 'workbox-expiration',\n className: 'Plugin',\n funcName: 'constructor',\n paramName: 'config.maxEntries',\n });\n }\n\n if (config.maxAgeSeconds) {\n assert.isType(config.maxAgeSeconds, 'number', {\n moduleName: 'workbox-expiration',\n className: 'Plugin',\n funcName: 'constructor',\n paramName: 'config.maxAgeSeconds',\n });\n }\n }\n\n this._config = config;\n this._maxAgeSeconds = config.maxAgeSeconds;\n this._cacheExpirations = new Map();\n\n if (config.purgeOnQuotaError) {\n registerQuotaErrorCallback(() => this.deleteCacheAndMetadata());\n }\n }\n\n /**\n * A simple helper method to return a CacheExpiration instance for a given\n * cache name.\n *\n * @param {string} cacheName\n * @return {CacheExpiration}\n *\n * @private\n */\n _getCacheExpiration(cacheName) {\n if (cacheName === cacheNames.getRuntimeName()) {\n throw new WorkboxError('expire-custom-caches-only');\n }\n\n let cacheExpiration = this._cacheExpirations.get(cacheName);\n if (!cacheExpiration) {\n cacheExpiration = new CacheExpiration(cacheName, this._config);\n this._cacheExpirations.set(cacheName, cacheExpiration);\n }\n return cacheExpiration;\n }\n\n /**\n * A \"lifecycle\" callback that will be triggered automatically by the\n * `workbox.strategies` handlers when a `Response` is about to be returned\n * from a [Cache](https://developer.mozilla.org/en-US/docs/Web/API/Cache) to\n * the handler. It allows the `Response` to be inspected for freshness and\n * prevents it from being used if the `Response`'s `Date` header value is\n * older than the configured `maxAgeSeconds`.\n *\n * @param {Object} options\n * @param {string} options.cacheName Name of the cache the response is in.\n * @param {Response} options.cachedResponse The `Response` object that's been\n * read from a cache and whose freshness should be checked.\n * @return {Response} Either the `cachedResponse`, if it's\n * fresh, or `null` if the `Response` is older than `maxAgeSeconds`.\n *\n * @private\n */\n cachedResponseWillBeUsed({event, request, cacheName, cachedResponse}) {\n if (!cachedResponse) {\n return null;\n }\n\n let isFresh = this._isResponseDateFresh(cachedResponse);\n\n // Expire entries to ensure that even if the expiration date has\n // expired, it'll only be used once.\n const cacheExpiration = this._getCacheExpiration(cacheName);\n cacheExpiration.expireEntries();\n\n // Update the metadata for the request URL to the current timestamp,\n // but don't `await` it as we don't want to block the response.\n const updateTimestampDone = cacheExpiration.updateTimestamp(request.url);\n if (event) {\n try {\n event.waitUntil(updateTimestampDone);\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`Unable to ensure service worker stays alive when ` +\n `updating cache entry for '${getFriendlyURL(event.request.url)}'.`);\n }\n }\n }\n\n return isFresh ? cachedResponse : null;\n }\n\n /**\n * @param {Response} cachedResponse\n * @return {boolean}\n *\n * @private\n */\n _isResponseDateFresh(cachedResponse) {\n if (!this._maxAgeSeconds) {\n // We aren't expiring by age, so return true, it's fresh\n return true;\n }\n\n // Check if the 'date' header will suffice a quick expiration check.\n // See https://github.com/GoogleChromeLabs/sw-toolbox/issues/164 for\n // discussion.\n const dateHeaderTimestamp = this._getDateHeaderTimestamp(cachedResponse);\n if (dateHeaderTimestamp === null) {\n // Unable to parse date, so assume it's fresh.\n return true;\n }\n\n // If we have a valid headerTime, then our response is fresh iff the\n // headerTime plus maxAgeSeconds is greater than the current time.\n const now = Date.now();\n return dateHeaderTimestamp >= now - (this._maxAgeSeconds * 1000);\n }\n\n /**\n * This method will extract the data header and parse it into a useful\n * value.\n *\n * @param {Response} cachedResponse\n * @return {number}\n *\n * @private\n */\n _getDateHeaderTimestamp(cachedResponse) {\n if (!cachedResponse.headers.has('date')) {\n return null;\n }\n\n const dateHeader = cachedResponse.headers.get('date');\n const parsedDate = new Date(dateHeader);\n const headerTime = parsedDate.getTime();\n\n // If the Date header was invalid for some reason, parsedDate.getTime()\n // will return NaN.\n if (isNaN(headerTime)) {\n return null;\n }\n\n return headerTime;\n }\n\n /**\n * A \"lifecycle\" callback that will be triggered automatically by the\n * `workbox.strategies` handlers when an entry is added to a cache.\n *\n * @param {Object} options\n * @param {string} options.cacheName Name of the cache that was updated.\n * @param {string} options.request The Request for the cached entry.\n *\n * @private\n */\n async cacheDidUpdate({cacheName, request}) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(cacheName, 'string', {\n moduleName: 'workbox-expiration',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'cacheName',\n });\n assert.isInstance(request, Request, {\n moduleName: 'workbox-expiration',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'request',\n });\n }\n\n const cacheExpiration = this._getCacheExpiration(cacheName);\n await cacheExpiration.updateTimestamp(request.url);\n await cacheExpiration.expireEntries();\n }\n\n\n /**\n * This is a helper method that performs two operations:\n *\n * - Deletes *all* the underlying Cache instances associated with this plugin\n * instance, by calling caches.delete() on your behalf.\n * - Deletes the metadata from IndexedDB used to keep track of expiration\n * details for each Cache instance.\n *\n * When using cache expiration, calling this method is preferable to calling\n * `caches.delete()` directly, since this will ensure that the IndexedDB\n * metadata is also cleanly removed and open IndexedDB instances are deleted.\n *\n * Note that if you're *not* using cache expiration for a given cache, calling\n * `caches.delete()` and passing in the cache's name should be sufficient.\n * There is no Workbox-specific method needed for cleanup in that case.\n */\n async deleteCacheAndMetadata() {\n // Do this one at a time instead of all at once via `Promise.all()` to\n // reduce the chance of inconsistency if a promise rejects.\n for (const [cacheName, cacheExpiration] of this._cacheExpirations) {\n await caches.delete(cacheName);\n await cacheExpiration.delete();\n }\n\n // Reset this._cacheExpirations to its initial state.\n this._cacheExpirations = new Map();\n }\n}\n\nexport {Plugin};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {CacheExpiration} from './CacheExpiration.mjs';\nimport {Plugin} from './Plugin.mjs';\nimport './_version.mjs';\n\n\n/**\n * @namespace workbox.expiration\n */\n\nexport {\n CacheExpiration,\n Plugin,\n};\n"],"names":["self","_","e","DB_NAME","OBJECT_STORE_NAME","normalizeURL","unNormalizedUrl","url","URL","location","hash","href","CacheTimestampsModel","constructor","cacheName","_cacheName","_db","DBWrapper","onupgradeneeded","event","_handleUpgrade","db","target","result","objStore","createObjectStore","keyPath","createIndex","unique","deleteDatabase","setTimestamp","timestamp","put","id","_getId","getTimestamp","entry","get","expireEntries","minTimestamp","maxCount","entriesToDelete","transaction","txn","done","store","objectStore","entriesNotDeletedCount","index","openCursor","onsuccess","cursor","value","push","continue","urlsDeleted","delete","CacheExpiration","config","assert","isType","moduleName","className","funcName","paramName","maxEntries","maxAgeSeconds","WorkboxError","_isRunning","_rerunRequested","_maxEntries","_maxAgeSeconds","_timestampModel","Date","now","undefined","urlsExpired","cache","caches","open","length","logger","groupCollapsed","log","forEach","groupEnd","debug","updateTimestamp","isURLExpired","methodName","expireOlderThan","Infinity","Plugin","_config","_cacheExpirations","Map","purgeOnQuotaError","registerQuotaErrorCallback","deleteCacheAndMetadata","_getCacheExpiration","cacheNames","getRuntimeName","cacheExpiration","set","cachedResponseWillBeUsed","request","cachedResponse","isFresh","_isResponseDateFresh","updateTimestampDone","waitUntil","error","warn","getFriendlyURL","dateHeaderTimestamp","_getDateHeaderTimestamp","headers","has","dateHeader","parsedDate","headerTime","getTime","isNaN","cacheDidUpdate","isInstance","Request"],"mappings":"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"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-expiration.prod.js b/workbox-v4.3.1/workbox-expiration.prod.js new file mode 100644 index 00000000..7c8f8404 --- /dev/null +++ b/workbox-v4.3.1/workbox-expiration.prod.js @@ -0,0 +1,2 @@ +this.workbox=this.workbox||{},this.workbox.expiration=function(t,e,s,i,a,n){"use strict";try{self["workbox:expiration:4.3.1"]&&_()}catch(t){}const h="workbox-expiration",c="cache-entries",r=t=>{const e=new URL(t,location);return e.hash="",e.href};class o{constructor(t){this.t=t,this.s=new e.DBWrapper(h,1,{onupgradeneeded:t=>this.i(t)})}i(t){const e=t.target.result.createObjectStore(c,{keyPath:"id"});e.createIndex("cacheName","cacheName",{unique:!1}),e.createIndex("timestamp","timestamp",{unique:!1}),s.deleteDatabase(this.t)}async setTimestamp(t,e){t=r(t),await this.s.put(c,{url:t,timestamp:e,cacheName:this.t,id:this.h(t)})}async getTimestamp(t){return(await this.s.get(c,this.h(t))).timestamp}async expireEntries(t,e){const s=await this.s.transaction(c,"readwrite",(s,i)=>{const a=s.objectStore(c),n=[];let h=0;a.index("timestamp").openCursor(null,"prev").onsuccess=(({target:s})=>{const a=s.result;if(a){const s=a.value;s.cacheName===this.t&&(t&&s.timestamp=e?n.push(a.value):h++),a.continue()}else i(n)})}),i=[];for(const t of s)await this.s.delete(c,t.id),i.push(t.url);return i}h(t){return this.t+"|"+r(t)}}class u{constructor(t,e={}){this.o=!1,this.u=!1,this.l=e.maxEntries,this.p=e.maxAgeSeconds,this.t=t,this.m=new o(t)}async expireEntries(){if(this.o)return void(this.u=!0);this.o=!0;const t=this.p?Date.now()-1e3*this.p:void 0,e=await this.m.expireEntries(t,this.l),s=await caches.open(this.t);for(const t of e)await s.delete(t);this.o=!1,this.u&&(this.u=!1,this.expireEntries())}async updateTimestamp(t){await this.m.setTimestamp(t,Date.now())}async isURLExpired(t){return await this.m.getTimestamp(t)this.deleteCacheAndMetadata())}k(t){if(t===a.cacheNames.getRuntimeName())throw new i.WorkboxError("expire-custom-caches-only");let e=this.g.get(t);return e||(e=new u(t,this.D),this.g.set(t,e)),e}cachedResponseWillBeUsed({event:t,request:e,cacheName:s,cachedResponse:i}){if(!i)return null;let a=this.N(i);const n=this.k(s);n.expireEntries();const h=n.updateTimestamp(e.url);if(t)try{t.waitUntil(h)}catch(t){}return a?i:null}N(t){if(!this.p)return!0;const e=this._(t);return null===e||e>=Date.now()-1e3*this.p}_(t){if(!t.headers.has("date"))return null;const e=t.headers.get("date"),s=new Date(e).getTime();return isNaN(s)?null:s}async cacheDidUpdate({cacheName:t,request:e}){const s=this.k(t);await s.updateTimestamp(e.url),await s.expireEntries()}async deleteCacheAndMetadata(){for(const[t,e]of this.g)await caches.delete(t),await e.delete();this.g=new Map}},t}({},workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private,workbox.core); +//# sourceMappingURL=workbox-expiration.prod.js.map diff --git a/workbox-v4.3.1/workbox-expiration.prod.js.map b/workbox-v4.3.1/workbox-expiration.prod.js.map new file mode 100644 index 00000000..6cb8ede7 --- /dev/null +++ b/workbox-v4.3.1/workbox-expiration.prod.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-expiration.prod.js","sources":["../_version.mjs","../models/CacheTimestampsModel.mjs","../CacheExpiration.mjs","../Plugin.mjs"],"sourcesContent":["try{self['workbox:expiration:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {DBWrapper} from 'workbox-core/_private/DBWrapper.mjs';\nimport {deleteDatabase} from 'workbox-core/_private/deleteDatabase.mjs';\nimport '../_version.mjs';\n\n\nconst DB_NAME = 'workbox-expiration';\nconst OBJECT_STORE_NAME = 'cache-entries';\n\nconst normalizeURL = (unNormalizedUrl) => {\n const url = new URL(unNormalizedUrl, location);\n url.hash = '';\n\n return url.href;\n};\n\n\n/**\n * Returns the timestamp model.\n *\n * @private\n */\nclass CacheTimestampsModel {\n /**\n *\n * @param {string} cacheName\n *\n * @private\n */\n constructor(cacheName) {\n this._cacheName = cacheName;\n\n this._db = new DBWrapper(DB_NAME, 1, {\n onupgradeneeded: (event) => this._handleUpgrade(event),\n });\n }\n\n /**\n * Should perform an upgrade of indexedDB.\n *\n * @param {Event} event\n *\n * @private\n */\n _handleUpgrade(event) {\n const db = event.target.result;\n\n // TODO(philipwalton): EdgeHTML doesn't support arrays as a keyPath, so we\n // have to use the `id` keyPath here and create our own values (a\n // concatenation of `url + cacheName`) instead of simply using\n // `keyPath: ['url', 'cacheName']`, which is supported in other browsers.\n const objStore = db.createObjectStore(OBJECT_STORE_NAME, {keyPath: 'id'});\n\n // TODO(philipwalton): once we don't have to support EdgeHTML, we can\n // create a single index with the keyPath `['cacheName', 'timestamp']`\n // instead of doing both these indexes.\n objStore.createIndex('cacheName', 'cacheName', {unique: false});\n objStore.createIndex('timestamp', 'timestamp', {unique: false});\n\n // Previous versions of `workbox-expiration` used `this._cacheName`\n // as the IDBDatabase name.\n deleteDatabase(this._cacheName);\n }\n\n /**\n * @param {string} url\n * @param {number} timestamp\n *\n * @private\n */\n async setTimestamp(url, timestamp) {\n url = normalizeURL(url);\n\n await this._db.put(OBJECT_STORE_NAME, {\n url,\n timestamp,\n cacheName: this._cacheName,\n // Creating an ID from the URL and cache name won't be necessary once\n // Edge switches to Chromium and all browsers we support work with\n // array keyPaths.\n id: this._getId(url),\n });\n }\n\n /**\n * Returns the timestamp stored for a given URL.\n *\n * @param {string} url\n * @return {number}\n *\n * @private\n */\n async getTimestamp(url) {\n const entry = await this._db.get(OBJECT_STORE_NAME, this._getId(url));\n return entry.timestamp;\n }\n\n /**\n * Iterates through all the entries in the object store (from newest to\n * oldest) and removes entries once either `maxCount` is reached or the\n * entry's timestamp is less than `minTimestamp`.\n *\n * @param {number} minTimestamp\n * @param {number} maxCount\n *\n * @private\n */\n async expireEntries(minTimestamp, maxCount) {\n const entriesToDelete = await this._db.transaction(\n OBJECT_STORE_NAME, 'readwrite', (txn, done) => {\n const store = txn.objectStore(OBJECT_STORE_NAME);\n const entriesToDelete = [];\n let entriesNotDeletedCount = 0;\n\n store.index('timestamp')\n .openCursor(null, 'prev')\n .onsuccess = ({target}) => {\n const cursor = target.result;\n if (cursor) {\n const result = cursor.value;\n // TODO(philipwalton): once we can use a multi-key index, we\n // won't have to check `cacheName` here.\n if (result.cacheName === this._cacheName) {\n // Delete an entry if it's older than the max age or\n // if we already have the max number allowed.\n if ((minTimestamp && result.timestamp < minTimestamp) ||\n (maxCount && entriesNotDeletedCount >= maxCount)) {\n // TODO(philipwalton): we should be able to delete the\n // entry right here, but doing so causes an iteration\n // bug in Safari stable (fixed in TP). Instead we can\n // store the keys of the entries to delete, and then\n // delete the separate transactions.\n // https://github.com/GoogleChrome/workbox/issues/1978\n // cursor.delete();\n\n // We only need to return the URL, not the whole entry.\n entriesToDelete.push(cursor.value);\n } else {\n entriesNotDeletedCount++;\n }\n }\n cursor.continue();\n } else {\n done(entriesToDelete);\n }\n };\n });\n\n // TODO(philipwalton): once the Safari bug in the following issue is fixed,\n // we should be able to remove this loop and do the entry deletion in the\n // cursor loop above:\n // https://github.com/GoogleChrome/workbox/issues/1978\n const urlsDeleted = [];\n for (const entry of entriesToDelete) {\n await this._db.delete(OBJECT_STORE_NAME, entry.id);\n urlsDeleted.push(entry.url);\n }\n\n return urlsDeleted;\n }\n\n /**\n * Takes a URL and returns an ID that will be unique in the object store.\n *\n * @param {string} url\n * @return {string}\n *\n * @private\n */\n _getId(url) {\n // Creating an ID from the URL and cache name won't be necessary once\n // Edge switches to Chromium and all browsers we support work with\n // array keyPaths.\n return this._cacheName + '|' + normalizeURL(url);\n }\n}\n\nexport {CacheTimestampsModel};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {CacheTimestampsModel} from './models/CacheTimestampsModel.mjs';\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\n\nimport './_version.mjs';\n\n/**\n * The `CacheExpiration` class allows you define an expiration and / or\n * limit on the number of responses stored in a\n * [`Cache`](https://developer.mozilla.org/en-US/docs/Web/API/Cache).\n *\n * @memberof workbox.expiration\n */\nclass CacheExpiration {\n /**\n * To construct a new CacheExpiration instance you must provide at least\n * one of the `config` properties.\n *\n * @param {string} cacheName Name of the cache to apply restrictions to.\n * @param {Object} config\n * @param {number} [config.maxEntries] The maximum number of entries to cache.\n * Entries used the least will be removed as the maximum is reached.\n * @param {number} [config.maxAgeSeconds] The maximum age of an entry before\n * it's treated as stale and removed.\n */\n constructor(cacheName, config = {}) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(cacheName, 'string', {\n moduleName: 'workbox-expiration',\n className: 'CacheExpiration',\n funcName: 'constructor',\n paramName: 'cacheName',\n });\n\n if (!(config.maxEntries || config.maxAgeSeconds)) {\n throw new WorkboxError('max-entries-or-age-required', {\n moduleName: 'workbox-expiration',\n className: 'CacheExpiration',\n funcName: 'constructor',\n });\n }\n\n if (config.maxEntries) {\n assert.isType(config.maxEntries, 'number', {\n moduleName: 'workbox-expiration',\n className: 'CacheExpiration',\n funcName: 'constructor',\n paramName: 'config.maxEntries',\n });\n\n // TODO: Assert is positive\n }\n\n if (config.maxAgeSeconds) {\n assert.isType(config.maxAgeSeconds, 'number', {\n moduleName: 'workbox-expiration',\n className: 'CacheExpiration',\n funcName: 'constructor',\n paramName: 'config.maxAgeSeconds',\n });\n\n // TODO: Assert is positive\n }\n }\n\n this._isRunning = false;\n this._rerunRequested = false;\n this._maxEntries = config.maxEntries;\n this._maxAgeSeconds = config.maxAgeSeconds;\n this._cacheName = cacheName;\n this._timestampModel = new CacheTimestampsModel(cacheName);\n }\n\n /**\n * Expires entries for the given cache and given criteria.\n */\n async expireEntries() {\n if (this._isRunning) {\n this._rerunRequested = true;\n return;\n }\n this._isRunning = true;\n\n const minTimestamp = this._maxAgeSeconds ?\n Date.now() - (this._maxAgeSeconds * 1000) : undefined;\n\n const urlsExpired = await this._timestampModel.expireEntries(\n minTimestamp, this._maxEntries);\n\n // Delete URLs from the cache\n const cache = await caches.open(this._cacheName);\n for (const url of urlsExpired) {\n await cache.delete(url);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (urlsExpired.length > 0) {\n logger.groupCollapsed(\n `Expired ${urlsExpired.length} ` +\n `${urlsExpired.length === 1 ? 'entry' : 'entries'} and removed ` +\n `${urlsExpired.length === 1 ? 'it' : 'them'} from the ` +\n `'${this._cacheName}' cache.`);\n logger.log(`Expired the following ${urlsExpired.length === 1 ?\n 'URL' : 'URLs'}:`);\n urlsExpired.forEach((url) => logger.log(` ${url}`));\n logger.groupEnd();\n } else {\n logger.debug(`Cache expiration ran and found no entries to remove.`);\n }\n }\n\n this._isRunning = false;\n if (this._rerunRequested) {\n this._rerunRequested = false;\n this.expireEntries();\n }\n }\n\n /**\n * Update the timestamp for the given URL. This ensures the when\n * removing entries based on maximum entries, most recently used\n * is accurate or when expiring, the timestamp is up-to-date.\n *\n * @param {string} url\n */\n async updateTimestamp(url) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(url, 'string', {\n moduleName: 'workbox-expiration',\n className: 'CacheExpiration',\n funcName: 'updateTimestamp',\n paramName: 'url',\n });\n }\n\n await this._timestampModel.setTimestamp(url, Date.now());\n }\n\n /**\n * Can be used to check if a URL has expired or not before it's used.\n *\n * This requires a look up from IndexedDB, so can be slow.\n *\n * Note: This method will not remove the cached entry, call\n * `expireEntries()` to remove indexedDB and Cache entries.\n *\n * @param {string} url\n * @return {boolean}\n */\n async isURLExpired(url) {\n if (process.env.NODE_ENV !== 'production') {\n if (!this._maxAgeSeconds) {\n throw new WorkboxError(`expired-test-without-max-age`, {\n methodName: 'isURLExpired',\n paramName: 'maxAgeSeconds',\n });\n }\n }\n\n const timestamp = await this._timestampModel.getTimestamp(url);\n const expireOlderThan = Date.now() - (this._maxAgeSeconds * 1000);\n return (timestamp < expireOlderThan);\n }\n\n /**\n * Removes the IndexedDB object store used to keep track of cache expiration\n * metadata.\n */\n async delete() {\n // Make sure we don't attempt another rerun if we're called in the middle of\n // a cache expiration.\n this._rerunRequested = false;\n await this._timestampModel.expireEntries(Infinity); // Expires all.\n }\n}\n\nexport {CacheExpiration};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {cacheNames} from 'workbox-core/_private/cacheNames.mjs';\nimport {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {registerQuotaErrorCallback}\n from 'workbox-core/registerQuotaErrorCallback.mjs';\n\nimport {CacheExpiration} from './CacheExpiration.mjs';\nimport './_version.mjs';\n\n/**\n * This plugin can be used in the Workbox APIs to regularly enforce a\n * limit on the age and / or the number of cached requests.\n *\n * Whenever a cached request is used or updated, this plugin will look\n * at the used Cache and remove any old or extra requests.\n *\n * When using `maxAgeSeconds`, requests may be used *once* after expiring\n * because the expiration clean up will not have occurred until *after* the\n * cached request has been used. If the request has a \"Date\" header, then\n * a light weight expiration check is performed and the request will not be\n * used immediately.\n *\n * When using `maxEntries`, the entry least-recently requested will be removed from the cache first.\n *\n * @memberof workbox.expiration\n */\nclass Plugin {\n /**\n * @param {Object} config\n * @param {number} [config.maxEntries] The maximum number of entries to cache.\n * Entries used the least will be removed as the maximum is reached.\n * @param {number} [config.maxAgeSeconds] The maximum age of an entry before\n * it's treated as stale and removed.\n * @param {boolean} [config.purgeOnQuotaError] Whether to opt this cache in to\n * automatic deletion if the available storage quota has been exceeded.\n */\n constructor(config = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (!(config.maxEntries || config.maxAgeSeconds)) {\n throw new WorkboxError('max-entries-or-age-required', {\n moduleName: 'workbox-expiration',\n className: 'Plugin',\n funcName: 'constructor',\n });\n }\n\n if (config.maxEntries) {\n assert.isType(config.maxEntries, 'number', {\n moduleName: 'workbox-expiration',\n className: 'Plugin',\n funcName: 'constructor',\n paramName: 'config.maxEntries',\n });\n }\n\n if (config.maxAgeSeconds) {\n assert.isType(config.maxAgeSeconds, 'number', {\n moduleName: 'workbox-expiration',\n className: 'Plugin',\n funcName: 'constructor',\n paramName: 'config.maxAgeSeconds',\n });\n }\n }\n\n this._config = config;\n this._maxAgeSeconds = config.maxAgeSeconds;\n this._cacheExpirations = new Map();\n\n if (config.purgeOnQuotaError) {\n registerQuotaErrorCallback(() => this.deleteCacheAndMetadata());\n }\n }\n\n /**\n * A simple helper method to return a CacheExpiration instance for a given\n * cache name.\n *\n * @param {string} cacheName\n * @return {CacheExpiration}\n *\n * @private\n */\n _getCacheExpiration(cacheName) {\n if (cacheName === cacheNames.getRuntimeName()) {\n throw new WorkboxError('expire-custom-caches-only');\n }\n\n let cacheExpiration = this._cacheExpirations.get(cacheName);\n if (!cacheExpiration) {\n cacheExpiration = new CacheExpiration(cacheName, this._config);\n this._cacheExpirations.set(cacheName, cacheExpiration);\n }\n return cacheExpiration;\n }\n\n /**\n * A \"lifecycle\" callback that will be triggered automatically by the\n * `workbox.strategies` handlers when a `Response` is about to be returned\n * from a [Cache](https://developer.mozilla.org/en-US/docs/Web/API/Cache) to\n * the handler. It allows the `Response` to be inspected for freshness and\n * prevents it from being used if the `Response`'s `Date` header value is\n * older than the configured `maxAgeSeconds`.\n *\n * @param {Object} options\n * @param {string} options.cacheName Name of the cache the response is in.\n * @param {Response} options.cachedResponse The `Response` object that's been\n * read from a cache and whose freshness should be checked.\n * @return {Response} Either the `cachedResponse`, if it's\n * fresh, or `null` if the `Response` is older than `maxAgeSeconds`.\n *\n * @private\n */\n cachedResponseWillBeUsed({event, request, cacheName, cachedResponse}) {\n if (!cachedResponse) {\n return null;\n }\n\n let isFresh = this._isResponseDateFresh(cachedResponse);\n\n // Expire entries to ensure that even if the expiration date has\n // expired, it'll only be used once.\n const cacheExpiration = this._getCacheExpiration(cacheName);\n cacheExpiration.expireEntries();\n\n // Update the metadata for the request URL to the current timestamp,\n // but don't `await` it as we don't want to block the response.\n const updateTimestampDone = cacheExpiration.updateTimestamp(request.url);\n if (event) {\n try {\n event.waitUntil(updateTimestampDone);\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`Unable to ensure service worker stays alive when ` +\n `updating cache entry for '${getFriendlyURL(event.request.url)}'.`);\n }\n }\n }\n\n return isFresh ? cachedResponse : null;\n }\n\n /**\n * @param {Response} cachedResponse\n * @return {boolean}\n *\n * @private\n */\n _isResponseDateFresh(cachedResponse) {\n if (!this._maxAgeSeconds) {\n // We aren't expiring by age, so return true, it's fresh\n return true;\n }\n\n // Check if the 'date' header will suffice a quick expiration check.\n // See https://github.com/GoogleChromeLabs/sw-toolbox/issues/164 for\n // discussion.\n const dateHeaderTimestamp = this._getDateHeaderTimestamp(cachedResponse);\n if (dateHeaderTimestamp === null) {\n // Unable to parse date, so assume it's fresh.\n return true;\n }\n\n // If we have a valid headerTime, then our response is fresh iff the\n // headerTime plus maxAgeSeconds is greater than the current time.\n const now = Date.now();\n return dateHeaderTimestamp >= now - (this._maxAgeSeconds * 1000);\n }\n\n /**\n * This method will extract the data header and parse it into a useful\n * value.\n *\n * @param {Response} cachedResponse\n * @return {number}\n *\n * @private\n */\n _getDateHeaderTimestamp(cachedResponse) {\n if (!cachedResponse.headers.has('date')) {\n return null;\n }\n\n const dateHeader = cachedResponse.headers.get('date');\n const parsedDate = new Date(dateHeader);\n const headerTime = parsedDate.getTime();\n\n // If the Date header was invalid for some reason, parsedDate.getTime()\n // will return NaN.\n if (isNaN(headerTime)) {\n return null;\n }\n\n return headerTime;\n }\n\n /**\n * A \"lifecycle\" callback that will be triggered automatically by the\n * `workbox.strategies` handlers when an entry is added to a cache.\n *\n * @param {Object} options\n * @param {string} options.cacheName Name of the cache that was updated.\n * @param {string} options.request The Request for the cached entry.\n *\n * @private\n */\n async cacheDidUpdate({cacheName, request}) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(cacheName, 'string', {\n moduleName: 'workbox-expiration',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'cacheName',\n });\n assert.isInstance(request, Request, {\n moduleName: 'workbox-expiration',\n className: 'Plugin',\n funcName: 'cacheDidUpdate',\n paramName: 'request',\n });\n }\n\n const cacheExpiration = this._getCacheExpiration(cacheName);\n await cacheExpiration.updateTimestamp(request.url);\n await cacheExpiration.expireEntries();\n }\n\n\n /**\n * This is a helper method that performs two operations:\n *\n * - Deletes *all* the underlying Cache instances associated with this plugin\n * instance, by calling caches.delete() on your behalf.\n * - Deletes the metadata from IndexedDB used to keep track of expiration\n * details for each Cache instance.\n *\n * When using cache expiration, calling this method is preferable to calling\n * `caches.delete()` directly, since this will ensure that the IndexedDB\n * metadata is also cleanly removed and open IndexedDB instances are deleted.\n *\n * Note that if you're *not* using cache expiration for a given cache, calling\n * `caches.delete()` and passing in the cache's name should be sufficient.\n * There is no Workbox-specific method needed for cleanup in that case.\n */\n async deleteCacheAndMetadata() {\n // Do this one at a time instead of all at once via `Promise.all()` to\n // reduce the chance of inconsistency if a promise rejects.\n for (const [cacheName, cacheExpiration] of this._cacheExpirations) {\n await caches.delete(cacheName);\n await cacheExpiration.delete();\n }\n\n // Reset this._cacheExpirations to its initial state.\n this._cacheExpirations = new Map();\n }\n}\n\nexport {Plugin};\n"],"names":["self","_","e","DB_NAME","OBJECT_STORE_NAME","normalizeURL","unNormalizedUrl","url","URL","location","hash","href","CacheTimestampsModel","constructor","cacheName","_cacheName","_db","DBWrapper","onupgradeneeded","event","this","_handleUpgrade","objStore","target","result","createObjectStore","keyPath","createIndex","unique","deleteDatabase","timestamp","put","id","_getId","get","minTimestamp","maxCount","entriesToDelete","transaction","txn","done","store","objectStore","entriesNotDeletedCount","index","openCursor","onsuccess","cursor","value","push","continue","urlsDeleted","entry","delete","CacheExpiration","config","_isRunning","_rerunRequested","_maxEntries","maxEntries","_maxAgeSeconds","maxAgeSeconds","_timestampModel","Date","now","undefined","urlsExpired","expireEntries","cache","caches","open","setTimestamp","getTimestamp","Infinity","_config","_cacheExpirations","Map","purgeOnQuotaError","registerQuotaErrorCallback","deleteCacheAndMetadata","_getCacheExpiration","cacheNames","getRuntimeName","WorkboxError","cacheExpiration","set","cachedResponseWillBeUsed","request","cachedResponse","isFresh","_isResponseDateFresh","updateTimestampDone","updateTimestamp","waitUntil","error","dateHeaderTimestamp","_getDateHeaderTimestamp","headers","has","dateHeader","headerTime","getTime","isNaN"],"mappings":"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"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-navigation-preload.dev.js b/workbox-v4.3.1/workbox-navigation-preload.dev.js new file mode 100644 index 00000000..90832f36 --- /dev/null +++ b/workbox-v4.3.1/workbox-navigation-preload.dev.js @@ -0,0 +1,110 @@ +this.workbox = this.workbox || {}; +this.workbox.navigationPreload = (function (exports, logger_mjs) { + 'use strict'; + + try { + self['workbox:navigation-preload:4.3.1'] && _(); + } catch (e) {} // eslint-disable-line + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * @return {boolean} Whether or not the current browser supports enabling + * navigation preload. + * + * @memberof workbox.navigationPreload + */ + + function isSupported() { + return Boolean(self.registration && self.registration.navigationPreload); + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * If the browser supports Navigation Preload, then this will disable it. + * + * @memberof workbox.navigationPreload + */ + + function disable() { + if (isSupported()) { + self.addEventListener('activate', event => { + event.waitUntil(self.registration.navigationPreload.disable().then(() => { + { + logger_mjs.logger.log(`Navigation preload is disabled.`); + } + })); + }); + } else { + { + logger_mjs.logger.log(`Navigation preload is not supported in this browser.`); + } + } + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * If the browser supports Navigation Preload, then this will enable it. + * + * @param {string} [headerValue] Optionally, allows developers to + * [override](https://developers.google.com/web/updates/2017/02/navigation-preload#changing_the_header) + * the value of the `Service-Worker-Navigation-Preload` header which will be + * sent to the server when making the navigation request. + * + * @memberof workbox.navigationPreload + */ + + function enable(headerValue) { + if (isSupported()) { + self.addEventListener('activate', event => { + event.waitUntil(self.registration.navigationPreload.enable().then(() => { + // Defaults to Service-Worker-Navigation-Preload: true if not set. + if (headerValue) { + self.registration.navigationPreload.setHeaderValue(headerValue); + } + + { + logger_mjs.logger.log(`Navigation preload is enabled.`); + } + })); + }); + } else { + { + logger_mjs.logger.log(`Navigation preload is not supported in this browser.`); + } + } + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + + exports.disable = disable; + exports.enable = enable; + exports.isSupported = isSupported; + + return exports; + +}({}, workbox.core._private)); +//# sourceMappingURL=workbox-navigation-preload.dev.js.map diff --git a/workbox-v4.3.1/workbox-navigation-preload.dev.js.map b/workbox-v4.3.1/workbox-navigation-preload.dev.js.map new file mode 100644 index 00000000..4fdadb22 --- /dev/null +++ b/workbox-v4.3.1/workbox-navigation-preload.dev.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-navigation-preload.dev.js","sources":["../_version.mjs","../isSupported.mjs","../disable.mjs","../enable.mjs","../index.mjs"],"sourcesContent":["try{self['workbox:navigation-preload:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport './_version.mjs';\n\n/**\n * @return {boolean} Whether or not the current browser supports enabling\n * navigation preload.\n *\n * @memberof workbox.navigationPreload\n */\nfunction isSupported() {\n return Boolean(self.registration && self.registration.navigationPreload);\n}\n\nexport {isSupported};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {logger} from 'workbox-core/_private/logger.mjs';\n\nimport {isSupported} from './isSupported.mjs';\n\nimport './_version.mjs';\n\n/**\n * If the browser supports Navigation Preload, then this will disable it.\n *\n * @memberof workbox.navigationPreload\n */\nfunction disable() {\n if (isSupported()) {\n self.addEventListener('activate', (event) => {\n event.waitUntil(\n self.registration.navigationPreload.disable().then(() => {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Navigation preload is disabled.`);\n }\n })\n );\n });\n } else {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Navigation preload is not supported in this browser.`);\n }\n }\n}\n\nexport {disable};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {logger} from 'workbox-core/_private/logger.mjs';\n\nimport {isSupported} from './isSupported.mjs';\n\nimport './_version.mjs';\n\n/**\n * If the browser supports Navigation Preload, then this will enable it.\n *\n * @param {string} [headerValue] Optionally, allows developers to\n * [override](https://developers.google.com/web/updates/2017/02/navigation-preload#changing_the_header)\n * the value of the `Service-Worker-Navigation-Preload` header which will be\n * sent to the server when making the navigation request.\n *\n * @memberof workbox.navigationPreload\n */\nfunction enable(headerValue) {\n if (isSupported()) {\n self.addEventListener('activate', (event) => {\n event.waitUntil(\n self.registration.navigationPreload.enable().then(() => {\n // Defaults to Service-Worker-Navigation-Preload: true if not set.\n if (headerValue) {\n self.registration.navigationPreload.setHeaderValue(headerValue);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Navigation preload is enabled.`);\n }\n })\n );\n });\n } else {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Navigation preload is not supported in this browser.`);\n }\n }\n}\n\nexport {enable};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {disable} from './disable.mjs';\nimport {enable} from './enable.mjs';\nimport {isSupported} from './isSupported.mjs';\nimport './_version.mjs';\n\n\n/**\n * @namespace workbox.navigationPreload\n */\n\nexport {\n disable,\n enable,\n isSupported,\n};\n"],"names":["self","_","e","isSupported","Boolean","registration","navigationPreload","disable","addEventListener","event","waitUntil","then","logger","log","enable","headerValue","setHeaderValue"],"mappings":";;;;EAAA,IAAG;EAACA,EAAAA,IAAI,CAAC,kCAAD,CAAJ,IAA0CC,CAAC,EAA3C;EAA8C,CAAlD,CAAkD,OAAMC,CAAN,EAAQ;;ECA1D;;;;;;;AAQA,EAEA;;;;;;;EAMA,SAASC,WAAT,GAAuB;EACrB,SAAOC,OAAO,CAACJ,IAAI,CAACK,YAAL,IAAqBL,IAAI,CAACK,YAAL,CAAkBC,iBAAxC,CAAd;EACD;;EClBD;;;;;;;AAQA,EAMA;;;;;;EAKA,SAASC,OAAT,GAAmB;EACjB,MAAIJ,WAAW,EAAf,EAAmB;EACjBH,IAAAA,IAAI,CAACQ,gBAAL,CAAsB,UAAtB,EAAmCC,KAAD,IAAW;EAC3CA,MAAAA,KAAK,CAACC,SAAN,CACIV,IAAI,CAACK,YAAL,CAAkBC,iBAAlB,CAAoCC,OAApC,GAA8CI,IAA9C,CAAmD,MAAM;EACvD,QAA2C;EACzCC,UAAAA,iBAAM,CAACC,GAAP,CAAY,iCAAZ;EACD;EACF,OAJD,CADJ;EAOD,KARD;EASD,GAVD,MAUO;EACL,IAA2C;EACzCD,MAAAA,iBAAM,CAACC,GAAP,CAAY,sDAAZ;EACD;EACF;EACF;;ECnCD;;;;;;;AAQA,EAMA;;;;;;;;;;;EAUA,SAASC,MAAT,CAAgBC,WAAhB,EAA6B;EAC3B,MAAIZ,WAAW,EAAf,EAAmB;EACjBH,IAAAA,IAAI,CAACQ,gBAAL,CAAsB,UAAtB,EAAmCC,KAAD,IAAW;EAC3CA,MAAAA,KAAK,CAACC,SAAN,CACIV,IAAI,CAACK,YAAL,CAAkBC,iBAAlB,CAAoCQ,MAApC,GAA6CH,IAA7C,CAAkD,MAAM;EACxD;EACE,YAAII,WAAJ,EAAiB;EACff,UAAAA,IAAI,CAACK,YAAL,CAAkBC,iBAAlB,CAAoCU,cAApC,CAAmDD,WAAnD;EACD;;EAED,QAA2C;EACzCH,UAAAA,iBAAM,CAACC,GAAP,CAAY,gCAAZ;EACD;EACF,OATD,CADJ;EAYD,KAbD;EAcD,GAfD,MAeO;EACL,IAA2C;EACzCD,MAAAA,iBAAM,CAACC,GAAP,CAAY,sDAAZ;EACD;EACF;EACF;;EC7CD;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-navigation-preload.prod.js b/workbox-v4.3.1/workbox-navigation-preload.prod.js new file mode 100644 index 00000000..f03d6572 --- /dev/null +++ b/workbox-v4.3.1/workbox-navigation-preload.prod.js @@ -0,0 +1,2 @@ +this.workbox=this.workbox||{},this.workbox.navigationPreload=function(t){"use strict";try{self["workbox:navigation-preload:4.3.1"]&&_()}catch(t){}function e(){return Boolean(self.registration&&self.registration.navigationPreload)}return t.disable=function(){e()&&self.addEventListener("activate",t=>{t.waitUntil(self.registration.navigationPreload.disable().then(()=>{}))})},t.enable=function(t){e()&&self.addEventListener("activate",e=>{e.waitUntil(self.registration.navigationPreload.enable().then(()=>{t&&self.registration.navigationPreload.setHeaderValue(t)}))})},t.isSupported=e,t}({}); +//# sourceMappingURL=workbox-navigation-preload.prod.js.map diff --git a/workbox-v4.3.1/workbox-navigation-preload.prod.js.map b/workbox-v4.3.1/workbox-navigation-preload.prod.js.map new file mode 100644 index 00000000..4de73935 --- /dev/null +++ b/workbox-v4.3.1/workbox-navigation-preload.prod.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-navigation-preload.prod.js","sources":["../_version.mjs","../isSupported.mjs","../disable.mjs","../enable.mjs"],"sourcesContent":["try{self['workbox:navigation-preload:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport './_version.mjs';\n\n/**\n * @return {boolean} Whether or not the current browser supports enabling\n * navigation preload.\n *\n * @memberof workbox.navigationPreload\n */\nfunction isSupported() {\n return Boolean(self.registration && self.registration.navigationPreload);\n}\n\nexport {isSupported};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {logger} from 'workbox-core/_private/logger.mjs';\n\nimport {isSupported} from './isSupported.mjs';\n\nimport './_version.mjs';\n\n/**\n * If the browser supports Navigation Preload, then this will disable it.\n *\n * @memberof workbox.navigationPreload\n */\nfunction disable() {\n if (isSupported()) {\n self.addEventListener('activate', (event) => {\n event.waitUntil(\n self.registration.navigationPreload.disable().then(() => {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Navigation preload is disabled.`);\n }\n })\n );\n });\n } else {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Navigation preload is not supported in this browser.`);\n }\n }\n}\n\nexport {disable};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {logger} from 'workbox-core/_private/logger.mjs';\n\nimport {isSupported} from './isSupported.mjs';\n\nimport './_version.mjs';\n\n/**\n * If the browser supports Navigation Preload, then this will enable it.\n *\n * @param {string} [headerValue] Optionally, allows developers to\n * [override](https://developers.google.com/web/updates/2017/02/navigation-preload#changing_the_header)\n * the value of the `Service-Worker-Navigation-Preload` header which will be\n * sent to the server when making the navigation request.\n *\n * @memberof workbox.navigationPreload\n */\nfunction enable(headerValue) {\n if (isSupported()) {\n self.addEventListener('activate', (event) => {\n event.waitUntil(\n self.registration.navigationPreload.enable().then(() => {\n // Defaults to Service-Worker-Navigation-Preload: true if not set.\n if (headerValue) {\n self.registration.navigationPreload.setHeaderValue(headerValue);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Navigation preload is enabled.`);\n }\n })\n );\n });\n } else {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Navigation preload is not supported in this browser.`);\n }\n }\n}\n\nexport {enable};\n"],"names":["self","_","e","isSupported","Boolean","registration","navigationPreload","addEventListener","event","waitUntil","disable","then","headerValue","enable","setHeaderValue"],"mappings":"sFAAA,IAAIA,KAAK,qCAAqCC,IAAI,MAAMC,ICgBxD,SAASC,WACAC,QAAQJ,KAAKK,cAAgBL,KAAKK,aAAaC,oCCExD,WACMH,KACFH,KAAKO,iBAAiB,WAAaC,IACjCA,EAAMC,UACFT,KAAKK,aAAaC,kBAAkBI,UAAUC,KAAK,qBCC7D,SAAgBC,GACVT,KACFH,KAAKO,iBAAiB,WAAaC,IACjCA,EAAMC,UACFT,KAAKK,aAAaC,kBAAkBO,SAASF,KAAK,KAE5CC,GACFZ,KAAKK,aAAaC,kBAAkBQ,eAAeF"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-offline-ga.dev.js b/workbox-v4.3.1/workbox-offline-ga.dev.js new file mode 100644 index 00000000..8d72aa6a --- /dev/null +++ b/workbox-v4.3.1/workbox-offline-ga.dev.js @@ -0,0 +1,243 @@ +this.workbox = this.workbox || {}; +this.workbox.googleAnalytics = (function (exports, Plugin_mjs, cacheNames_mjs, getFriendlyURL_mjs, logger_mjs, Route_mjs, Router_mjs, NetworkFirst_mjs, NetworkOnly_mjs) { + 'use strict'; + + try { + self['workbox:google-analytics:4.3.1'] && _(); + } catch (e) {} // eslint-disable-line + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const QUEUE_NAME = 'workbox-google-analytics'; + const MAX_RETENTION_TIME = 60 * 48; // Two days in minutes + + const GOOGLE_ANALYTICS_HOST = 'www.google-analytics.com'; + const GTM_HOST = 'www.googletagmanager.com'; + const ANALYTICS_JS_PATH = '/analytics.js'; + const GTAG_JS_PATH = '/gtag/js'; + const GTM_JS_PATH = '/gtm.js'; + // endpoints. Most of the time the default path (/collect) is used, but + // occasionally an experimental endpoint is used when testing new features, + // (e.g. /r/collect or /j/collect) + + const COLLECT_PATHS_REGEX = /^\/(\w+\/)?collect/; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Creates the requestWillDequeue callback to be used with the background + * sync queue plugin. The callback takes the failed request and adds the + * `qt` param based on the current time, as well as applies any other + * user-defined hit modifications. + * + * @param {Object} config See workbox.googleAnalytics.initialize. + * @return {Function} The requestWillDequeu callback function. + * + * @private + */ + + const createOnSyncCallback = config => { + return async ({ + queue + }) => { + let entry; + + while (entry = await queue.shiftRequest()) { + const { + request, + timestamp + } = entry; + const url = new URL(request.url); + + try { + // Measurement protocol requests can set their payload parameters in + // either the URL query string (for GET requests) or the POST body. + const params = request.method === 'POST' ? new URLSearchParams((await request.clone().text())) : url.searchParams; // Calculate the qt param, accounting for the fact that an existing + // qt param may be present and should be updated rather than replaced. + + const originalHitTime = timestamp - (Number(params.get('qt')) || 0); + const queueTime = Date.now() - originalHitTime; // Set the qt param prior to applying hitFilter or parameterOverrides. + + params.set('qt', queueTime); // Apply `paramterOverrideds`, if set. + + if (config.parameterOverrides) { + for (const param of Object.keys(config.parameterOverrides)) { + const value = config.parameterOverrides[param]; + params.set(param, value); + } + } // Apply `hitFilter`, if set. + + + if (typeof config.hitFilter === 'function') { + config.hitFilter.call(null, params); + } // Retry the fetch. Ignore URL search params from the URL as they're + // now in the post body. + + + await fetch(new Request(url.origin + url.pathname, { + body: params.toString(), + method: 'POST', + mode: 'cors', + credentials: 'omit', + headers: { + 'Content-Type': 'text/plain' + } + })); + + { + logger_mjs.logger.log(`Request for '${getFriendlyURL_mjs.getFriendlyURL(url.href)}'` + `has been replayed`); + } + } catch (err) { + await queue.unshiftRequest(entry); + + { + logger_mjs.logger.log(`Request for '${getFriendlyURL_mjs.getFriendlyURL(url.href)}'` + `failed to replay, putting it back in the queue.`); + } + + throw err; + } + } + + { + logger_mjs.logger.log(`All Google Analytics request successfully replayed; ` + `the queue is now empty!`); + } + }; + }; + /** + * Creates GET and POST routes to catch failed Measurement Protocol hits. + * + * @param {Plugin} queuePlugin + * @return {Array} The created routes. + * + * @private + */ + + + const createCollectRoutes = queuePlugin => { + const match = ({ + url + }) => url.hostname === GOOGLE_ANALYTICS_HOST && COLLECT_PATHS_REGEX.test(url.pathname); + + const handler = new NetworkOnly_mjs.NetworkOnly({ + plugins: [queuePlugin] + }); + return [new Route_mjs.Route(match, handler, 'GET'), new Route_mjs.Route(match, handler, 'POST')]; + }; + /** + * Creates a route with a network first strategy for the analytics.js script. + * + * @param {string} cacheName + * @return {Route} The created route. + * + * @private + */ + + + const createAnalyticsJsRoute = cacheName => { + const match = ({ + url + }) => url.hostname === GOOGLE_ANALYTICS_HOST && url.pathname === ANALYTICS_JS_PATH; + + const handler = new NetworkFirst_mjs.NetworkFirst({ + cacheName + }); + return new Route_mjs.Route(match, handler, 'GET'); + }; + /** + * Creates a route with a network first strategy for the gtag.js script. + * + * @param {string} cacheName + * @return {Route} The created route. + * + * @private + */ + + + const createGtagJsRoute = cacheName => { + const match = ({ + url + }) => url.hostname === GTM_HOST && url.pathname === GTAG_JS_PATH; + + const handler = new NetworkFirst_mjs.NetworkFirst({ + cacheName + }); + return new Route_mjs.Route(match, handler, 'GET'); + }; + /** + * Creates a route with a network first strategy for the gtm.js script. + * + * @param {string} cacheName + * @return {Route} The created route. + * + * @private + */ + + + const createGtmJsRoute = cacheName => { + const match = ({ + url + }) => url.hostname === GTM_HOST && url.pathname === GTM_JS_PATH; + + const handler = new NetworkFirst_mjs.NetworkFirst({ + cacheName + }); + return new Route_mjs.Route(match, handler, 'GET'); + }; + /** + * @param {Object=} [options] + * @param {Object} [options.cacheName] The cache name to store and retrieve + * analytics.js. Defaults to the cache names provided by `workbox-core`. + * @param {Object} [options.parameterOverrides] + * [Measurement Protocol parameters](https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters), + * expressed as key/value pairs, to be added to replayed Google Analytics + * requests. This can be used to, e.g., set a custom dimension indicating + * that the request was replayed. + * @param {Function} [options.hitFilter] A function that allows you to modify + * the hit parameters prior to replaying + * the hit. The function is invoked with the original hit's URLSearchParams + * object as its only argument. + * + * @memberof workbox.googleAnalytics + */ + + + const initialize = (options = {}) => { + const cacheName = cacheNames_mjs.cacheNames.getGoogleAnalyticsName(options.cacheName); + const queuePlugin = new Plugin_mjs.Plugin(QUEUE_NAME, { + maxRetentionTime: MAX_RETENTION_TIME, + onSync: createOnSyncCallback(options) + }); + const routes = [createGtmJsRoute(cacheName), createAnalyticsJsRoute(cacheName), createGtagJsRoute(cacheName), ...createCollectRoutes(queuePlugin)]; + const router = new Router_mjs.Router(); + + for (const route of routes) { + router.registerRoute(route); + } + + router.addFetchListener(); + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + + exports.initialize = initialize; + + return exports; + +}({}, workbox.backgroundSync, workbox.core._private, workbox.core._private, workbox.core._private, workbox.routing, workbox.routing, workbox.strategies, workbox.strategies)); +//# sourceMappingURL=workbox-offline-ga.dev.js.map diff --git a/workbox-v4.3.1/workbox-offline-ga.dev.js.map b/workbox-v4.3.1/workbox-offline-ga.dev.js.map new file mode 100644 index 00000000..f74ac92f --- /dev/null +++ b/workbox-v4.3.1/workbox-offline-ga.dev.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-offline-ga.dev.js","sources":["../_version.mjs","../utils/constants.mjs","../initialize.mjs","../index.mjs"],"sourcesContent":["try{self['workbox:google-analytics:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\nexport const QUEUE_NAME = 'workbox-google-analytics';\nexport const MAX_RETENTION_TIME = 60 * 48; // Two days in minutes\nexport const GOOGLE_ANALYTICS_HOST = 'www.google-analytics.com';\nexport const GTM_HOST = 'www.googletagmanager.com';\nexport const ANALYTICS_JS_PATH = '/analytics.js';\nexport const GTAG_JS_PATH = '/gtag/js';\nexport const GTM_JS_PATH = '/gtm.js';\nexport const COLLECT_DEFAULT_PATH = '/collect';\n\n// This RegExp matches all known Measurement Protocol single-hit collect\n// endpoints. Most of the time the default path (/collect) is used, but\n// occasionally an experimental endpoint is used when testing new features,\n// (e.g. /r/collect or /j/collect)\nexport const COLLECT_PATHS_REGEX = /^\\/(\\w+\\/)?collect/;\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {Plugin} from 'workbox-background-sync/Plugin.mjs';\nimport {cacheNames} from 'workbox-core/_private/cacheNames.mjs';\nimport {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {Route} from 'workbox-routing/Route.mjs';\nimport {Router} from 'workbox-routing/Router.mjs';\nimport {NetworkFirst} from 'workbox-strategies/NetworkFirst.mjs';\nimport {NetworkOnly} from 'workbox-strategies/NetworkOnly.mjs';\nimport {\n QUEUE_NAME,\n MAX_RETENTION_TIME,\n GOOGLE_ANALYTICS_HOST,\n GTM_HOST,\n ANALYTICS_JS_PATH,\n GTAG_JS_PATH,\n GTM_JS_PATH,\n COLLECT_PATHS_REGEX,\n} from './utils/constants.mjs';\nimport './_version.mjs';\n\n/**\n * Creates the requestWillDequeue callback to be used with the background\n * sync queue plugin. The callback takes the failed request and adds the\n * `qt` param based on the current time, as well as applies any other\n * user-defined hit modifications.\n *\n * @param {Object} config See workbox.googleAnalytics.initialize.\n * @return {Function} The requestWillDequeu callback function.\n *\n * @private\n */\nconst createOnSyncCallback = (config) => {\n return async ({queue}) => {\n let entry;\n while (entry = await queue.shiftRequest()) {\n const {request, timestamp} = entry;\n const url = new URL(request.url);\n\n try {\n // Measurement protocol requests can set their payload parameters in\n // either the URL query string (for GET requests) or the POST body.\n const params = request.method === 'POST' ?\n new URLSearchParams(await request.clone().text()) :\n url.searchParams;\n\n // Calculate the qt param, accounting for the fact that an existing\n // qt param may be present and should be updated rather than replaced.\n const originalHitTime = timestamp - (Number(params.get('qt')) || 0);\n const queueTime = Date.now() - originalHitTime;\n\n // Set the qt param prior to applying hitFilter or parameterOverrides.\n params.set('qt', queueTime);\n\n // Apply `paramterOverrideds`, if set.\n if (config.parameterOverrides) {\n for (const param of Object.keys(config.parameterOverrides)) {\n const value = config.parameterOverrides[param];\n params.set(param, value);\n }\n }\n\n // Apply `hitFilter`, if set.\n if (typeof config.hitFilter === 'function') {\n config.hitFilter.call(null, params);\n }\n\n // Retry the fetch. Ignore URL search params from the URL as they're\n // now in the post body.\n await fetch(new Request(url.origin + url.pathname, {\n body: params.toString(),\n method: 'POST',\n mode: 'cors',\n credentials: 'omit',\n headers: {'Content-Type': 'text/plain'},\n }));\n\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Request for '${getFriendlyURL(url.href)}'` +\n `has been replayed`);\n }\n } catch (err) {\n await queue.unshiftRequest(entry);\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Request for '${getFriendlyURL(url.href)}'` +\n `failed to replay, putting it back in the queue.`);\n }\n throw err;\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`All Google Analytics request successfully replayed; ` +\n `the queue is now empty!`);\n }\n };\n};\n\n/**\n * Creates GET and POST routes to catch failed Measurement Protocol hits.\n *\n * @param {Plugin} queuePlugin\n * @return {Array} The created routes.\n *\n * @private\n */\nconst createCollectRoutes = (queuePlugin) => {\n const match = ({url}) => url.hostname === GOOGLE_ANALYTICS_HOST &&\n COLLECT_PATHS_REGEX.test(url.pathname);\n\n const handler = new NetworkOnly({\n plugins: [queuePlugin],\n });\n\n return [\n new Route(match, handler, 'GET'),\n new Route(match, handler, 'POST'),\n ];\n};\n\n/**\n * Creates a route with a network first strategy for the analytics.js script.\n *\n * @param {string} cacheName\n * @return {Route} The created route.\n *\n * @private\n */\nconst createAnalyticsJsRoute = (cacheName) => {\n const match = ({url}) => url.hostname === GOOGLE_ANALYTICS_HOST &&\n url.pathname === ANALYTICS_JS_PATH;\n const handler = new NetworkFirst({cacheName});\n\n return new Route(match, handler, 'GET');\n};\n\n/**\n * Creates a route with a network first strategy for the gtag.js script.\n *\n * @param {string} cacheName\n * @return {Route} The created route.\n *\n * @private\n */\nconst createGtagJsRoute = (cacheName) => {\n const match = ({url}) => url.hostname === GTM_HOST &&\n url.pathname === GTAG_JS_PATH;\n const handler = new NetworkFirst({cacheName});\n\n return new Route(match, handler, 'GET');\n};\n\n/**\n * Creates a route with a network first strategy for the gtm.js script.\n *\n * @param {string} cacheName\n * @return {Route} The created route.\n *\n * @private\n */\nconst createGtmJsRoute = (cacheName) => {\n const match = ({url}) => url.hostname === GTM_HOST &&\n url.pathname === GTM_JS_PATH;\n const handler = new NetworkFirst({cacheName});\n\n return new Route(match, handler, 'GET');\n};\n\n/**\n * @param {Object=} [options]\n * @param {Object} [options.cacheName] The cache name to store and retrieve\n * analytics.js. Defaults to the cache names provided by `workbox-core`.\n * @param {Object} [options.parameterOverrides]\n * [Measurement Protocol parameters](https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters),\n * expressed as key/value pairs, to be added to replayed Google Analytics\n * requests. This can be used to, e.g., set a custom dimension indicating\n * that the request was replayed.\n * @param {Function} [options.hitFilter] A function that allows you to modify\n * the hit parameters prior to replaying\n * the hit. The function is invoked with the original hit's URLSearchParams\n * object as its only argument.\n *\n * @memberof workbox.googleAnalytics\n */\nconst initialize = (options = {}) => {\n const cacheName = cacheNames.getGoogleAnalyticsName(options.cacheName);\n\n const queuePlugin = new Plugin(QUEUE_NAME, {\n maxRetentionTime: MAX_RETENTION_TIME,\n onSync: createOnSyncCallback(options),\n });\n\n const routes = [\n createGtmJsRoute(cacheName),\n createAnalyticsJsRoute(cacheName),\n createGtagJsRoute(cacheName),\n ...createCollectRoutes(queuePlugin),\n ];\n\n const router = new Router();\n for (const route of routes) {\n router.registerRoute(route);\n }\n\n router.addFetchListener();\n};\n\nexport {\n initialize,\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {initialize} from './initialize.mjs';\nimport './_version.mjs';\n\n\n/**\n * @namespace workbox.googleAnalytics\n */\n\nexport {\n initialize,\n};\n"],"names":["self","_","e","QUEUE_NAME","MAX_RETENTION_TIME","GOOGLE_ANALYTICS_HOST","GTM_HOST","ANALYTICS_JS_PATH","GTAG_JS_PATH","GTM_JS_PATH","COLLECT_PATHS_REGEX","createOnSyncCallback","config","queue","entry","shiftRequest","request","timestamp","url","URL","params","method","URLSearchParams","clone","text","searchParams","originalHitTime","Number","get","queueTime","Date","now","set","parameterOverrides","param","Object","keys","value","hitFilter","call","fetch","Request","origin","pathname","body","toString","mode","credentials","headers","logger","log","getFriendlyURL","href","err","unshiftRequest","createCollectRoutes","queuePlugin","match","hostname","test","handler","NetworkOnly","plugins","Route","createAnalyticsJsRoute","cacheName","NetworkFirst","createGtagJsRoute","createGtmJsRoute","initialize","options","cacheNames","getGoogleAnalyticsName","Plugin","maxRetentionTime","onSync","routes","router","Router","route","registerRoute","addFetchListener"],"mappings":"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"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-offline-ga.prod.js b/workbox-v4.3.1/workbox-offline-ga.prod.js new file mode 100644 index 00000000..ca29dc74 --- /dev/null +++ b/workbox-v4.3.1/workbox-offline-ga.prod.js @@ -0,0 +1,2 @@ +this.workbox=this.workbox||{},this.workbox.googleAnalytics=function(e,t,o,n,a,c,w){"use strict";try{self["workbox:google-analytics:4.3.1"]&&_()}catch(e){}const r=/^\/(\w+\/)?collect/,s=e=>async({queue:t})=>{let o;for(;o=await t.shiftRequest();){const{request:n,timestamp:a}=o,c=new URL(n.url);try{const w="POST"===n.method?new URLSearchParams(await n.clone().text()):c.searchParams,r=a-(Number(w.get("qt"))||0),s=Date.now()-r;if(w.set("qt",s),e.parameterOverrides)for(const t of Object.keys(e.parameterOverrides)){const o=e.parameterOverrides[t];w.set(t,o)}"function"==typeof e.hitFilter&&e.hitFilter.call(null,w),await fetch(new Request(c.origin+c.pathname,{body:w.toString(),method:"POST",mode:"cors",credentials:"omit",headers:{"Content-Type":"text/plain"}}))}catch(e){throw await t.unshiftRequest(o),e}}},i=e=>{const t=({url:e})=>"www.google-analytics.com"===e.hostname&&r.test(e.pathname),o=new w.NetworkOnly({plugins:[e]});return[new n.Route(t,o,"GET"),new n.Route(t,o,"POST")]},l=e=>{const t=new c.NetworkFirst({cacheName:e});return new n.Route(({url:e})=>"www.google-analytics.com"===e.hostname&&"/analytics.js"===e.pathname,t,"GET")},m=e=>{const t=new c.NetworkFirst({cacheName:e});return new n.Route(({url:e})=>"www.googletagmanager.com"===e.hostname&&"/gtag/js"===e.pathname,t,"GET")},u=e=>{const t=new c.NetworkFirst({cacheName:e});return new n.Route(({url:e})=>"www.googletagmanager.com"===e.hostname&&"/gtm.js"===e.pathname,t,"GET")};return e.initialize=((e={})=>{const n=o.cacheNames.getGoogleAnalyticsName(e.cacheName),c=new t.Plugin("workbox-google-analytics",{maxRetentionTime:2880,onSync:s(e)}),w=[u(n),l(n),m(n),...i(c)],r=new a.Router;for(const e of w)r.registerRoute(e);r.addFetchListener()}),e}({},workbox.backgroundSync,workbox.core._private,workbox.routing,workbox.routing,workbox.strategies,workbox.strategies); +//# sourceMappingURL=workbox-offline-ga.prod.js.map diff --git a/workbox-v4.3.1/workbox-offline-ga.prod.js.map b/workbox-v4.3.1/workbox-offline-ga.prod.js.map new file mode 100644 index 00000000..68d2fb8b --- /dev/null +++ b/workbox-v4.3.1/workbox-offline-ga.prod.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-offline-ga.prod.js","sources":["../_version.mjs","../utils/constants.mjs","../initialize.mjs"],"sourcesContent":["try{self['workbox:google-analytics:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\nexport const QUEUE_NAME = 'workbox-google-analytics';\nexport const MAX_RETENTION_TIME = 60 * 48; // Two days in minutes\nexport const GOOGLE_ANALYTICS_HOST = 'www.google-analytics.com';\nexport const GTM_HOST = 'www.googletagmanager.com';\nexport const ANALYTICS_JS_PATH = '/analytics.js';\nexport const GTAG_JS_PATH = '/gtag/js';\nexport const GTM_JS_PATH = '/gtm.js';\nexport const COLLECT_DEFAULT_PATH = '/collect';\n\n// This RegExp matches all known Measurement Protocol single-hit collect\n// endpoints. Most of the time the default path (/collect) is used, but\n// occasionally an experimental endpoint is used when testing new features,\n// (e.g. /r/collect or /j/collect)\nexport const COLLECT_PATHS_REGEX = /^\\/(\\w+\\/)?collect/;\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {Plugin} from 'workbox-background-sync/Plugin.mjs';\nimport {cacheNames} from 'workbox-core/_private/cacheNames.mjs';\nimport {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {Route} from 'workbox-routing/Route.mjs';\nimport {Router} from 'workbox-routing/Router.mjs';\nimport {NetworkFirst} from 'workbox-strategies/NetworkFirst.mjs';\nimport {NetworkOnly} from 'workbox-strategies/NetworkOnly.mjs';\nimport {\n QUEUE_NAME,\n MAX_RETENTION_TIME,\n GOOGLE_ANALYTICS_HOST,\n GTM_HOST,\n ANALYTICS_JS_PATH,\n GTAG_JS_PATH,\n GTM_JS_PATH,\n COLLECT_PATHS_REGEX,\n} from './utils/constants.mjs';\nimport './_version.mjs';\n\n/**\n * Creates the requestWillDequeue callback to be used with the background\n * sync queue plugin. The callback takes the failed request and adds the\n * `qt` param based on the current time, as well as applies any other\n * user-defined hit modifications.\n *\n * @param {Object} config See workbox.googleAnalytics.initialize.\n * @return {Function} The requestWillDequeu callback function.\n *\n * @private\n */\nconst createOnSyncCallback = (config) => {\n return async ({queue}) => {\n let entry;\n while (entry = await queue.shiftRequest()) {\n const {request, timestamp} = entry;\n const url = new URL(request.url);\n\n try {\n // Measurement protocol requests can set their payload parameters in\n // either the URL query string (for GET requests) or the POST body.\n const params = request.method === 'POST' ?\n new URLSearchParams(await request.clone().text()) :\n url.searchParams;\n\n // Calculate the qt param, accounting for the fact that an existing\n // qt param may be present and should be updated rather than replaced.\n const originalHitTime = timestamp - (Number(params.get('qt')) || 0);\n const queueTime = Date.now() - originalHitTime;\n\n // Set the qt param prior to applying hitFilter or parameterOverrides.\n params.set('qt', queueTime);\n\n // Apply `paramterOverrideds`, if set.\n if (config.parameterOverrides) {\n for (const param of Object.keys(config.parameterOverrides)) {\n const value = config.parameterOverrides[param];\n params.set(param, value);\n }\n }\n\n // Apply `hitFilter`, if set.\n if (typeof config.hitFilter === 'function') {\n config.hitFilter.call(null, params);\n }\n\n // Retry the fetch. Ignore URL search params from the URL as they're\n // now in the post body.\n await fetch(new Request(url.origin + url.pathname, {\n body: params.toString(),\n method: 'POST',\n mode: 'cors',\n credentials: 'omit',\n headers: {'Content-Type': 'text/plain'},\n }));\n\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Request for '${getFriendlyURL(url.href)}'` +\n `has been replayed`);\n }\n } catch (err) {\n await queue.unshiftRequest(entry);\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`Request for '${getFriendlyURL(url.href)}'` +\n `failed to replay, putting it back in the queue.`);\n }\n throw err;\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`All Google Analytics request successfully replayed; ` +\n `the queue is now empty!`);\n }\n };\n};\n\n/**\n * Creates GET and POST routes to catch failed Measurement Protocol hits.\n *\n * @param {Plugin} queuePlugin\n * @return {Array} The created routes.\n *\n * @private\n */\nconst createCollectRoutes = (queuePlugin) => {\n const match = ({url}) => url.hostname === GOOGLE_ANALYTICS_HOST &&\n COLLECT_PATHS_REGEX.test(url.pathname);\n\n const handler = new NetworkOnly({\n plugins: [queuePlugin],\n });\n\n return [\n new Route(match, handler, 'GET'),\n new Route(match, handler, 'POST'),\n ];\n};\n\n/**\n * Creates a route with a network first strategy for the analytics.js script.\n *\n * @param {string} cacheName\n * @return {Route} The created route.\n *\n * @private\n */\nconst createAnalyticsJsRoute = (cacheName) => {\n const match = ({url}) => url.hostname === GOOGLE_ANALYTICS_HOST &&\n url.pathname === ANALYTICS_JS_PATH;\n const handler = new NetworkFirst({cacheName});\n\n return new Route(match, handler, 'GET');\n};\n\n/**\n * Creates a route with a network first strategy for the gtag.js script.\n *\n * @param {string} cacheName\n * @return {Route} The created route.\n *\n * @private\n */\nconst createGtagJsRoute = (cacheName) => {\n const match = ({url}) => url.hostname === GTM_HOST &&\n url.pathname === GTAG_JS_PATH;\n const handler = new NetworkFirst({cacheName});\n\n return new Route(match, handler, 'GET');\n};\n\n/**\n * Creates a route with a network first strategy for the gtm.js script.\n *\n * @param {string} cacheName\n * @return {Route} The created route.\n *\n * @private\n */\nconst createGtmJsRoute = (cacheName) => {\n const match = ({url}) => url.hostname === GTM_HOST &&\n url.pathname === GTM_JS_PATH;\n const handler = new NetworkFirst({cacheName});\n\n return new Route(match, handler, 'GET');\n};\n\n/**\n * @param {Object=} [options]\n * @param {Object} [options.cacheName] The cache name to store and retrieve\n * analytics.js. Defaults to the cache names provided by `workbox-core`.\n * @param {Object} [options.parameterOverrides]\n * [Measurement Protocol parameters](https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters),\n * expressed as key/value pairs, to be added to replayed Google Analytics\n * requests. This can be used to, e.g., set a custom dimension indicating\n * that the request was replayed.\n * @param {Function} [options.hitFilter] A function that allows you to modify\n * the hit parameters prior to replaying\n * the hit. The function is invoked with the original hit's URLSearchParams\n * object as its only argument.\n *\n * @memberof workbox.googleAnalytics\n */\nconst initialize = (options = {}) => {\n const cacheName = cacheNames.getGoogleAnalyticsName(options.cacheName);\n\n const queuePlugin = new Plugin(QUEUE_NAME, {\n maxRetentionTime: MAX_RETENTION_TIME,\n onSync: createOnSyncCallback(options),\n });\n\n const routes = [\n createGtmJsRoute(cacheName),\n createAnalyticsJsRoute(cacheName),\n createGtagJsRoute(cacheName),\n ...createCollectRoutes(queuePlugin),\n ];\n\n const router = new Router();\n for (const route of routes) {\n router.registerRoute(route);\n }\n\n router.addFetchListener();\n};\n\nexport {\n initialize,\n};\n"],"names":["self","_","e","COLLECT_PATHS_REGEX","createOnSyncCallback","config","async","queue","entry","shiftRequest","request","timestamp","url","URL","params","method","URLSearchParams","clone","text","searchParams","originalHitTime","Number","get","queueTime","Date","now","set","parameterOverrides","param","Object","keys","value","hitFilter","call","fetch","Request","origin","pathname","body","toString","mode","credentials","headers","err","unshiftRequest","createCollectRoutes","queuePlugin","match","hostname","test","handler","NetworkOnly","plugins","Route","createAnalyticsJsRoute","cacheName","NetworkFirst","createGtagJsRoute","createGtmJsRoute","options","cacheNames","getGoogleAnalyticsName","Plugin","maxRetentionTime","onSync","routes","router","Router","route","registerRoute","addFetchListener"],"mappings":"gGAAA,IAAIA,KAAK,mCAAmCC,IAAI,MAAMC,ICU/C,MAaMC,EAAsB,qBCgB7BC,EAAwBC,GACrBC,OAAQC,MAAAA,UACTC,OACGA,QAAcD,EAAME,gBAAgB,OACnCC,QAACA,EAADC,UAAUA,GAAaH,EACvBI,EAAM,IAAIC,IAAIH,EAAQE,eAKpBE,EAA4B,SAAnBJ,EAAQK,OACnB,IAAIC,sBAAsBN,EAAQO,QAAQC,QAC1CN,EAAIO,aAIFC,EAAkBT,GAAaU,OAAOP,EAAOQ,IAAI,QAAU,GAC3DC,EAAYC,KAAKC,MAAQL,KAG/BN,EAAOY,IAAI,KAAMH,GAGblB,EAAOsB,uBACJ,MAAMC,KAASC,OAAOC,KAAKzB,EAAOsB,oBAAqB,OACpDI,EAAQ1B,EAAOsB,mBAAmBC,GACxCd,EAAOY,IAAIE,EAAOG,GAKU,mBAArB1B,EAAO2B,WAChB3B,EAAO2B,UAAUC,KAAK,KAAMnB,SAKxBoB,MAAM,IAAIC,QAAQvB,EAAIwB,OAASxB,EAAIyB,SAAU,CACjDC,KAAMxB,EAAOyB,WACbxB,OAAQ,OACRyB,KAAM,OACNC,YAAa,OACbC,QAAS,gBAAiB,iBAQ5B,MAAOC,eACDpC,EAAMqC,eAAepC,GAMrBmC,KAkBRE,EAAuBC,UACrBC,EAAQ,EAAEnC,IAAAA,KDvGmB,6BCuGVA,EAAIoC,UACzB7C,EAAoB8C,KAAKrC,EAAIyB,UAE3Ba,EAAU,IAAIC,cAAY,CAC9BC,QAAS,CAACN,WAGL,CACL,IAAIO,QAAMN,EAAOG,EAAS,OAC1B,IAAIG,QAAMN,EAAOG,EAAS,UAYxBI,EAA0BC,UAGxBL,EAAU,IAAIM,eAAa,CAACD,UAAAA,WAE3B,IAAIF,QAJG,EAAEzC,IAAAA,KD7HmB,6BC6HVA,EAAIoC,UD3HE,kBC4H3BpC,EAAIyB,SAGgBa,EAAS,QAW7BO,EAAqBF,UAGnBL,EAAU,IAAIM,eAAa,CAACD,UAAAA,WAE3B,IAAIF,QAJG,EAAEzC,IAAAA,KD5IM,6BC4IGA,EAAIoC,UD1IH,aC2ItBpC,EAAIyB,SAGgBa,EAAS,QAW7BQ,EAAoBH,UAGlBL,EAAU,IAAIM,eAAa,CAACD,UAAAA,WAE3B,IAAIF,QAJG,EAAEzC,IAAAA,KD5JM,6BC4JGA,EAAIoC,UDzJJ,YC0JrBpC,EAAIyB,SAGgBa,EAAS,4BAmBhB,EAACS,EAAU,YACtBJ,EAAYK,aAAWC,uBAAuBF,EAAQJ,WAEtDT,EAAc,IAAIgB,SDzLA,2BCyLmB,CACzCC,iBDzL8B,KC0L9BC,OAAQ5D,EAAqBuD,KAGzBM,EAAS,CACbP,EAAiBH,GACjBD,EAAuBC,GACvBE,EAAkBF,MACfV,EAAoBC,IAGnBoB,EAAS,IAAIC,aACd,MAAMC,KAASH,EAClBC,EAAOG,cAAcD,GAGvBF,EAAOI"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-precaching.dev.js b/workbox-v4.3.1/workbox-precaching.dev.js new file mode 100644 index 00000000..fb69211e --- /dev/null +++ b/workbox-v4.3.1/workbox-precaching.dev.js @@ -0,0 +1,989 @@ +this.workbox = this.workbox || {}; +this.workbox.precaching = (function (exports, assert_mjs, cacheNames_mjs, getFriendlyURL_mjs, logger_mjs, cacheWrapper_mjs, fetchWrapper_mjs, WorkboxError_mjs) { + 'use strict'; + + try { + self['workbox:precaching:4.3.1'] && _(); + } catch (e) {} // eslint-disable-line + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const plugins = []; + const precachePlugins = { + /* + * @return {Array} + * @private + */ + get() { + return plugins; + }, + + /* + * @param {Array} newPlugins + * @private + */ + add(newPlugins) { + plugins.push(...newPlugins); + } + + }; + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Adds plugins to precaching. + * + * @param {Array} newPlugins + * + * @alias workbox.precaching.addPlugins + */ + + const addPlugins = newPlugins => { + precachePlugins.add(newPlugins); + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * @param {Response} response + * @return {Response} + * + * @private + * @memberof module:workbox-precaching + */ + + async function cleanRedirect(response) { + const clonedResponse = response.clone(); // Not all browsers support the Response.body stream, so fall back + // to reading the entire body into memory as a blob. + + const bodyPromise = 'body' in clonedResponse ? Promise.resolve(clonedResponse.body) : clonedResponse.blob(); + const body = await bodyPromise; // new Response() is happy when passed either a stream or a Blob. + + return new Response(body, { + headers: clonedResponse.headers, + status: clonedResponse.status, + statusText: clonedResponse.statusText + }); + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + + const REVISION_SEARCH_PARAM = '__WB_REVISION__'; + /** + * Converts a manifest entry into a versioned URL suitable for precaching. + * + * @param {Object} entry + * @return {string} A URL with versioning info. + * + * @private + * @memberof module:workbox-precaching + */ + + function createCacheKey(entry) { + if (!entry) { + throw new WorkboxError_mjs.WorkboxError('add-to-cache-list-unexpected-type', { + entry + }); + } // If a precache manifest entry is a string, it's assumed to be a versioned + // URL, like '/app.abcd1234.js'. Return as-is. + + + if (typeof entry === 'string') { + const urlObject = new URL(entry, location); + return { + cacheKey: urlObject.href, + url: urlObject.href + }; + } + + const { + revision, + url + } = entry; + + if (!url) { + throw new WorkboxError_mjs.WorkboxError('add-to-cache-list-unexpected-type', { + entry + }); + } // If there's just a URL and no revision, then it's also assumed to be a + // versioned URL. + + + if (!revision) { + const urlObject = new URL(url, location); + return { + cacheKey: urlObject.href, + url: urlObject.href + }; + } // Otherwise, construct a properly versioned URL using the custom Workbox + // search parameter along with the revision info. + + + const originalURL = new URL(url, location); + const cacheKeyURL = new URL(url, location); + cacheKeyURL.searchParams.set(REVISION_SEARCH_PARAM, revision); + return { + cacheKey: cacheKeyURL.href, + url: originalURL.href + }; + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + + const logGroup = (groupTitle, deletedURLs) => { + logger_mjs.logger.groupCollapsed(groupTitle); + + for (const url of deletedURLs) { + logger_mjs.logger.log(url); + } + + logger_mjs.logger.groupEnd(); + }; + /** + * @param {Array} deletedURLs + * + * @private + * @memberof module:workbox-precaching + */ + + + function printCleanupDetails(deletedURLs) { + const deletionCount = deletedURLs.length; + + if (deletionCount > 0) { + logger_mjs.logger.groupCollapsed(`During precaching cleanup, ` + `${deletionCount} cached ` + `request${deletionCount === 1 ? ' was' : 's were'} deleted.`); + logGroup('Deleted Cache Requests', deletedURLs); + logger_mjs.logger.groupEnd(); + } + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * @param {string} groupTitle + * @param {Array} urls + * + * @private + */ + + function _nestedGroup(groupTitle, urls) { + if (urls.length === 0) { + return; + } + + logger_mjs.logger.groupCollapsed(groupTitle); + + for (const url of urls) { + logger_mjs.logger.log(url); + } + + logger_mjs.logger.groupEnd(); + } + /** + * @param {Array} urlsToPrecache + * @param {Array} urlsAlreadyPrecached + * + * @private + * @memberof module:workbox-precaching + */ + + + function printInstallDetails(urlsToPrecache, urlsAlreadyPrecached) { + const precachedCount = urlsToPrecache.length; + const alreadyPrecachedCount = urlsAlreadyPrecached.length; + + if (precachedCount || alreadyPrecachedCount) { + let message = `Precaching ${precachedCount} file${precachedCount === 1 ? '' : 's'}.`; + + if (alreadyPrecachedCount > 0) { + message += ` ${alreadyPrecachedCount} ` + `file${alreadyPrecachedCount === 1 ? ' is' : 's are'} already cached.`; + } + + logger_mjs.logger.groupCollapsed(message); + + _nestedGroup(`View newly precached URLs.`, urlsToPrecache); + + _nestedGroup(`View previously precached URLs.`, urlsAlreadyPrecached); + + logger_mjs.logger.groupEnd(); + } + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Performs efficient precaching of assets. + * + * @memberof module:workbox-precaching + */ + + class PrecacheController { + /** + * Create a new PrecacheController. + * + * @param {string} [cacheName] An optional name for the cache, to override + * the default precache name. + */ + constructor(cacheName) { + this._cacheName = cacheNames_mjs.cacheNames.getPrecacheName(cacheName); + this._urlsToCacheKeys = new Map(); + } + /** + * This method will add items to the precache list, removing duplicates + * and ensuring the information is valid. + * + * @param { + * Array + * } entries Array of entries to precache. + */ + + + addToCacheList(entries) { + { + assert_mjs.assert.isArray(entries, { + moduleName: 'workbox-precaching', + className: 'PrecacheController', + funcName: 'addToCacheList', + paramName: 'entries' + }); + } + + for (const entry of entries) { + const { + cacheKey, + url + } = createCacheKey(entry); + + if (this._urlsToCacheKeys.has(url) && this._urlsToCacheKeys.get(url) !== cacheKey) { + throw new WorkboxError_mjs.WorkboxError('add-to-cache-list-conflicting-entries', { + firstEntry: this._urlsToCacheKeys.get(url), + secondEntry: cacheKey + }); + } + + this._urlsToCacheKeys.set(url, cacheKey); + } + } + /** + * Precaches new and updated assets. Call this method from the service worker + * install event. + * + * @param {Object} options + * @param {Event} [options.event] The install event (if needed). + * @param {Array} [options.plugins] Plugins to be used for fetching + * and caching during install. + * @return {Promise} + */ + + + async install({ + event, + plugins + } = {}) { + { + if (plugins) { + assert_mjs.assert.isArray(plugins, { + moduleName: 'workbox-precaching', + className: 'PrecacheController', + funcName: 'install', + paramName: 'plugins' + }); + } + } + + const urlsToPrecache = []; + const urlsAlreadyPrecached = []; + const cache = await caches.open(this._cacheName); + const alreadyCachedRequests = await cache.keys(); + const alreadyCachedURLs = new Set(alreadyCachedRequests.map(request => request.url)); + + for (const cacheKey of this._urlsToCacheKeys.values()) { + if (alreadyCachedURLs.has(cacheKey)) { + urlsAlreadyPrecached.push(cacheKey); + } else { + urlsToPrecache.push(cacheKey); + } + } + + const precacheRequests = urlsToPrecache.map(url => { + return this._addURLToCache({ + event, + plugins, + url + }); + }); + await Promise.all(precacheRequests); + + { + printInstallDetails(urlsToPrecache, urlsAlreadyPrecached); + } + + return { + updatedURLs: urlsToPrecache, + notUpdatedURLs: urlsAlreadyPrecached + }; + } + /** + * Deletes assets that are no longer present in the current precache manifest. + * Call this method from the service worker activate event. + * + * @return {Promise} + */ + + + async activate() { + const cache = await caches.open(this._cacheName); + const currentlyCachedRequests = await cache.keys(); + const expectedCacheKeys = new Set(this._urlsToCacheKeys.values()); + const deletedURLs = []; + + for (const request of currentlyCachedRequests) { + if (!expectedCacheKeys.has(request.url)) { + await cache.delete(request); + deletedURLs.push(request.url); + } + } + + { + printCleanupDetails(deletedURLs); + } + + return { + deletedURLs + }; + } + /** + * Requests the entry and saves it to the cache if the response is valid. + * By default, any response with a status code of less than 400 (including + * opaque responses) is considered valid. + * + * If you need to use custom criteria to determine what's valid and what + * isn't, then pass in an item in `options.plugins` that implements the + * `cacheWillUpdate()` lifecycle event. + * + * @private + * @param {Object} options + * @param {string} options.url The URL to fetch and cache. + * @param {Event} [options.event] The install event (if passed). + * @param {Array} [options.plugins] An array of plugins to apply to + * fetch and caching. + */ + + + async _addURLToCache({ + url, + event, + plugins + }) { + const request = new Request(url, { + credentials: 'same-origin' + }); + let response = await fetchWrapper_mjs.fetchWrapper.fetch({ + event, + plugins, + request + }); // Allow developers to override the default logic about what is and isn't + // valid by passing in a plugin implementing cacheWillUpdate(), e.g. + // a workbox.cacheableResponse.Plugin instance. + + let cacheWillUpdateCallback; + + for (const plugin of plugins || []) { + if ('cacheWillUpdate' in plugin) { + cacheWillUpdateCallback = plugin.cacheWillUpdate.bind(plugin); + } + } + + const isValidResponse = cacheWillUpdateCallback ? // Use a callback if provided. It returns a truthy value if valid. + cacheWillUpdateCallback({ + event, + request, + response + }) : // Otherwise, default to considering any response status under 400 valid. + // This includes, by default, considering opaque responses valid. + response.status < 400; // Consider this a failure, leading to the `install` handler failing, if + // we get back an invalid response. + + if (!isValidResponse) { + throw new WorkboxError_mjs.WorkboxError('bad-precaching-response', { + url, + status: response.status + }); + } + + if (response.redirected) { + response = await cleanRedirect(response); + } + + await cacheWrapper_mjs.cacheWrapper.put({ + event, + plugins, + request, + response, + cacheName: this._cacheName, + matchOptions: { + ignoreSearch: true + } + }); + } + /** + * Returns a mapping of a precached URL to the corresponding cache key, taking + * into account the revision information for the URL. + * + * @return {Map} A URL to cache key mapping. + */ + + + getURLsToCacheKeys() { + return this._urlsToCacheKeys; + } + /** + * Returns a list of all the URLs that have been precached by the current + * service worker. + * + * @return {Array} The precached URLs. + */ + + + getCachedURLs() { + return [...this._urlsToCacheKeys.keys()]; + } + /** + * Returns the cache key used for storing a given URL. If that URL is + * unversioned, like `/index.html', then the cache key will be the original + * URL with a search parameter appended to it. + * + * @param {string} url A URL whose cache key you want to look up. + * @return {string} The versioned URL that corresponds to a cache key + * for the original URL, or undefined if that URL isn't precached. + */ + + + getCacheKeyForURL(url) { + const urlObject = new URL(url, location); + return this._urlsToCacheKeys.get(urlObject.href); + } + + } + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + let precacheController; + /** + * @return {PrecacheController} + * @private + */ + + const getOrCreatePrecacheController = () => { + if (!precacheController) { + precacheController = new PrecacheController(); + } + + return precacheController; + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Removes any URL search parameters that should be ignored. + * + * @param {URL} urlObject The original URL. + * @param {Array} ignoreURLParametersMatching RegExps to test against + * each search parameter name. Matches mean that the search parameter should be + * ignored. + * @return {URL} The URL with any ignored search parameters removed. + * + * @private + * @memberof module:workbox-precaching + */ + + function removeIgnoredSearchParams(urlObject, ignoreURLParametersMatching) { + // Convert the iterable into an array at the start of the loop to make sure + // deletion doesn't mess up iteration. + for (const paramName of [...urlObject.searchParams.keys()]) { + if (ignoreURLParametersMatching.some(regExp => regExp.test(paramName))) { + urlObject.searchParams.delete(paramName); + } + } + + return urlObject; + } + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Generator function that yields possible variations on the original URL to + * check, one at a time. + * + * @param {string} url + * @param {Object} options + * + * @private + * @memberof module:workbox-precaching + */ + + function* generateURLVariations(url, { + ignoreURLParametersMatching, + directoryIndex, + cleanURLs, + urlManipulation + } = {}) { + const urlObject = new URL(url, location); + urlObject.hash = ''; + yield urlObject.href; + const urlWithoutIgnoredParams = removeIgnoredSearchParams(urlObject, ignoreURLParametersMatching); + yield urlWithoutIgnoredParams.href; + + if (directoryIndex && urlWithoutIgnoredParams.pathname.endsWith('/')) { + const directoryURL = new URL(urlWithoutIgnoredParams); + directoryURL.pathname += directoryIndex; + yield directoryURL.href; + } + + if (cleanURLs) { + const cleanURL = new URL(urlWithoutIgnoredParams); + cleanURL.pathname += '.html'; + yield cleanURL.href; + } + + if (urlManipulation) { + const additionalURLs = urlManipulation({ + url: urlObject + }); + + for (const urlToAttempt of additionalURLs) { + yield urlToAttempt.href; + } + } + } + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * This function will take the request URL and manipulate it based on the + * configuration options. + * + * @param {string} url + * @param {Object} options + * @return {string} Returns the URL in the cache that matches the request, + * if possible. + * + * @private + */ + + const getCacheKeyForURL = (url, options) => { + const precacheController = getOrCreatePrecacheController(); + const urlsToCacheKeys = precacheController.getURLsToCacheKeys(); + + for (const possibleURL of generateURLVariations(url, options)) { + const possibleCacheKey = urlsToCacheKeys.get(possibleURL); + + if (possibleCacheKey) { + return possibleCacheKey; + } + } + }; + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Adds a `fetch` listener to the service worker that will + * respond to + * [network requests]{@link https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#Custom_responses_to_requests} + * with precached assets. + * + * Requests for assets that aren't precached, the `FetchEvent` will not be + * responded to, allowing the event to fall through to other `fetch` event + * listeners. + * + * NOTE: when called more than once this method will replace the previously set + * configuration options. Calling it more than once is not recommended outside + * of tests. + * + * @private + * @param {Object} options + * @param {string} [options.directoryIndex=index.html] The `directoryIndex` will + * check cache entries for a URLs ending with '/' to see if there is a hit when + * appending the `directoryIndex` value. + * @param {Array} [options.ignoreURLParametersMatching=[/^utm_/]] An + * array of regex's to remove search params when looking for a cache match. + * @param {boolean} [options.cleanURLs=true] The `cleanURLs` option will + * check the cache for the URL with a `.html` added to the end of the end. + * @param {workbox.precaching~urlManipulation} [options.urlManipulation] + * This is a function that should take a URL and return an array of + * alternative URL's that should be checked for precache matches. + */ + + const addFetchListener = ({ + ignoreURLParametersMatching = [/^utm_/], + directoryIndex = 'index.html', + cleanURLs = true, + urlManipulation = null + } = {}) => { + const cacheName = cacheNames_mjs.cacheNames.getPrecacheName(); + addEventListener('fetch', event => { + const precachedURL = getCacheKeyForURL(event.request.url, { + cleanURLs, + directoryIndex, + ignoreURLParametersMatching, + urlManipulation + }); + + if (!precachedURL) { + { + logger_mjs.logger.debug(`Precaching did not find a match for ` + getFriendlyURL_mjs.getFriendlyURL(event.request.url)); + } + + return; + } + + let responsePromise = caches.open(cacheName).then(cache => { + return cache.match(precachedURL); + }).then(cachedResponse => { + if (cachedResponse) { + return cachedResponse; + } // Fall back to the network if we don't have a cached response + // (perhaps due to manual cache cleanup). + + + { + logger_mjs.logger.warn(`The precached response for ` + `${getFriendlyURL_mjs.getFriendlyURL(precachedURL)} in ${cacheName} was not found. ` + `Falling back to the network instead.`); + } + + return fetch(precachedURL); + }); + + { + responsePromise = responsePromise.then(response => { + // Workbox is going to handle the route. + // print the routing details to the console. + logger_mjs.logger.groupCollapsed(`Precaching is responding to: ` + getFriendlyURL_mjs.getFriendlyURL(event.request.url)); + logger_mjs.logger.log(`Serving the precached url: ${precachedURL}`); + logger_mjs.logger.groupCollapsed(`View request details here.`); + logger_mjs.logger.log(event.request); + logger_mjs.logger.groupEnd(); + logger_mjs.logger.groupCollapsed(`View response details here.`); + logger_mjs.logger.log(response); + logger_mjs.logger.groupEnd(); + logger_mjs.logger.groupEnd(); + return response; + }); + } + + event.respondWith(responsePromise); + }); + }; + + /* + Copyright 2019 Google LLC + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + let listenerAdded = false; + /** + * Add a `fetch` listener to the service worker that will + * respond to + * [network requests]{@link https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#Custom_responses_to_requests} + * with precached assets. + * + * Requests for assets that aren't precached, the `FetchEvent` will not be + * responded to, allowing the event to fall through to other `fetch` event + * listeners. + * + * @param {Object} options + * @param {string} [options.directoryIndex=index.html] The `directoryIndex` will + * check cache entries for a URLs ending with '/' to see if there is a hit when + * appending the `directoryIndex` value. + * @param {Array} [options.ignoreURLParametersMatching=[/^utm_/]] An + * array of regex's to remove search params when looking for a cache match. + * @param {boolean} [options.cleanURLs=true] The `cleanURLs` option will + * check the cache for the URL with a `.html` added to the end of the end. + * @param {workbox.precaching~urlManipulation} [options.urlManipulation] + * This is a function that should take a URL and return an array of + * alternative URL's that should be checked for precache matches. + * + * @alias workbox.precaching.addRoute + */ + + const addRoute = options => { + if (!listenerAdded) { + addFetchListener(options); + listenerAdded = true; + } + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const SUBSTRING_TO_FIND = '-precache-'; + /** + * Cleans up incompatible precaches that were created by older versions of + * Workbox, by a service worker registered under the current scope. + * + * This is meant to be called as part of the `activate` event. + * + * This should be safe to use as long as you don't include `substringToFind` + * (defaulting to `-precache-`) in your non-precache cache names. + * + * @param {string} currentPrecacheName The cache name currently in use for + * precaching. This cache won't be deleted. + * @param {string} [substringToFind='-precache-'] Cache names which include this + * substring will be deleted (excluding `currentPrecacheName`). + * @return {Array} A list of all the cache names that were deleted. + * + * @private + * @memberof module:workbox-precaching + */ + + const deleteOutdatedCaches = async (currentPrecacheName, substringToFind = SUBSTRING_TO_FIND) => { + const cacheNames = await caches.keys(); + const cacheNamesToDelete = cacheNames.filter(cacheName => { + return cacheName.includes(substringToFind) && cacheName.includes(self.registration.scope) && cacheName !== currentPrecacheName; + }); + await Promise.all(cacheNamesToDelete.map(cacheName => caches.delete(cacheName))); + return cacheNamesToDelete; + }; + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Adds an `activate` event listener which will clean up incompatible + * precaches that were created by older versions of Workbox. + * + * @alias workbox.precaching.cleanupOutdatedCaches + */ + + const cleanupOutdatedCaches = () => { + addEventListener('activate', event => { + const cacheName = cacheNames_mjs.cacheNames.getPrecacheName(); + event.waitUntil(deleteOutdatedCaches(cacheName).then(cachesDeleted => { + { + if (cachesDeleted.length > 0) { + logger_mjs.logger.log(`The following out-of-date precaches were cleaned up ` + `automatically:`, cachesDeleted); + } + } + })); + }); + }; + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Takes in a URL, and returns the corresponding URL that could be used to + * lookup the entry in the precache. + * + * If a relative URL is provided, the location of the service worker file will + * be used as the base. + * + * For precached entries without revision information, the cache key will be the + * same as the original URL. + * + * For precached entries with revision information, the cache key will be the + * original URL with the addition of a query parameter used for keeping track of + * the revision info. + * + * @param {string} url The URL whose cache key to look up. + * @return {string} The cache key that corresponds to that URL. + * + * @alias workbox.precaching.getCacheKeyForURL + */ + + const getCacheKeyForURL$1 = url => { + const precacheController = getOrCreatePrecacheController(); + return precacheController.getCacheKeyForURL(url); + }; + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + + const installListener = event => { + const precacheController = getOrCreatePrecacheController(); + const plugins = precachePlugins.get(); + event.waitUntil(precacheController.install({ + event, + plugins + }).catch(error => { + { + logger_mjs.logger.error(`Service worker installation failed. It will ` + `be retried automatically during the next navigation.`); + } // Re-throw the error to ensure installation fails. + + + throw error; + })); + }; + + const activateListener = event => { + const precacheController = getOrCreatePrecacheController(); + const plugins = precachePlugins.get(); + event.waitUntil(precacheController.activate({ + event, + plugins + })); + }; + /** + * Adds items to the precache list, removing any duplicates and + * stores the files in the + * ["precache cache"]{@link module:workbox-core.cacheNames} when the service + * worker installs. + * + * This method can be called multiple times. + * + * Please note: This method **will not** serve any of the cached files for you. + * It only precaches files. To respond to a network request you call + * [addRoute()]{@link module:workbox-precaching.addRoute}. + * + * If you have a single array of files to precache, you can just call + * [precacheAndRoute()]{@link module:workbox-precaching.precacheAndRoute}. + * + * @param {Array} entries Array of entries to precache. + * + * @alias workbox.precaching.precache + */ + + + const precache = entries => { + const precacheController = getOrCreatePrecacheController(); + precacheController.addToCacheList(entries); + + if (entries.length > 0) { + // NOTE: these listeners will only be added once (even if the `precache()` + // method is called multiple times) because event listeners are implemented + // as a set, where each listener must be unique. + addEventListener('install', installListener); + addEventListener('activate', activateListener); + } + }; + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * This method will add entries to the precache list and add a route to + * respond to fetch events. + * + * This is a convenience method that will call + * [precache()]{@link module:workbox-precaching.precache} and + * [addRoute()]{@link module:workbox-precaching.addRoute} in a single call. + * + * @param {Array} entries Array of entries to precache. + * @param {Object} options See + * [addRoute() options]{@link module:workbox-precaching.addRoute}. + * + * @alias workbox.precaching.precacheAndRoute + */ + + const precacheAndRoute = (entries, options) => { + precache(entries); + addRoute(options); + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + + { + assert_mjs.assert.isSWEnv('workbox-precaching'); + } + + exports.addPlugins = addPlugins; + exports.addRoute = addRoute; + exports.cleanupOutdatedCaches = cleanupOutdatedCaches; + exports.getCacheKeyForURL = getCacheKeyForURL$1; + exports.precache = precache; + exports.precacheAndRoute = precacheAndRoute; + exports.PrecacheController = PrecacheController; + + return exports; + +}({}, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private)); +//# sourceMappingURL=workbox-precaching.dev.js.map diff --git a/workbox-v4.3.1/workbox-precaching.dev.js.map b/workbox-v4.3.1/workbox-precaching.dev.js.map new file mode 100644 index 00000000..364f81a2 --- /dev/null +++ b/workbox-v4.3.1/workbox-precaching.dev.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-precaching.dev.js","sources":["../_version.mjs","../utils/precachePlugins.mjs","../addPlugins.mjs","../utils/cleanRedirect.mjs","../utils/createCacheKey.mjs","../utils/printCleanupDetails.mjs","../utils/printInstallDetails.mjs","../PrecacheController.mjs","../utils/getOrCreatePrecacheController.mjs","../utils/removeIgnoredSearchParams.mjs","../utils/generateURLVariations.mjs","../utils/getCacheKeyForURL.mjs","../utils/addFetchListener.mjs","../addRoute.mjs","../utils/deleteOutdatedCaches.mjs","../cleanupOutdatedCaches.mjs","../getCacheKeyForURL.mjs","../precache.mjs","../precacheAndRoute.mjs","../index.mjs"],"sourcesContent":["try{self['workbox:precaching:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\nconst plugins = [];\n\nexport const precachePlugins = {\n /*\n * @return {Array}\n * @private\n */\n get() {\n return plugins;\n },\n\n /*\n * @param {Array} newPlugins\n * @private\n */\n add(newPlugins) {\n plugins.push(...newPlugins);\n },\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {precachePlugins} from './utils/precachePlugins.mjs';\nimport './_version.mjs';\n\n\n/**\n * Adds plugins to precaching.\n *\n * @param {Array} newPlugins\n *\n * @alias workbox.precaching.addPlugins\n */\nconst addPlugins = (newPlugins) => {\n precachePlugins.add(newPlugins);\n};\n\nexport {addPlugins};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n/**\n * @param {Response} response\n * @return {Response}\n *\n * @private\n * @memberof module:workbox-precaching\n */\nexport async function cleanRedirect(response) {\n const clonedResponse = response.clone();\n\n // Not all browsers support the Response.body stream, so fall back\n // to reading the entire body into memory as a blob.\n const bodyPromise = 'body' in clonedResponse ?\n Promise.resolve(clonedResponse.body) :\n clonedResponse.blob();\n\n const body = await bodyPromise;\n\n // new Response() is happy when passed either a stream or a Blob.\n return new Response(body, {\n headers: clonedResponse.headers,\n status: clonedResponse.status,\n statusText: clonedResponse.statusText,\n });\n}\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\n\nimport '../_version.mjs';\n\n// Name of the search parameter used to store revision info.\nconst REVISION_SEARCH_PARAM = '__WB_REVISION__';\n\n/**\n * Converts a manifest entry into a versioned URL suitable for precaching.\n *\n * @param {Object} entry\n * @return {string} A URL with versioning info.\n *\n * @private\n * @memberof module:workbox-precaching\n */\nexport function createCacheKey(entry) {\n if (!entry) {\n throw new WorkboxError('add-to-cache-list-unexpected-type', {entry});\n }\n\n // If a precache manifest entry is a string, it's assumed to be a versioned\n // URL, like '/app.abcd1234.js'. Return as-is.\n if (typeof entry === 'string') {\n const urlObject = new URL(entry, location);\n return {\n cacheKey: urlObject.href,\n url: urlObject.href,\n };\n }\n\n const {revision, url} = entry;\n if (!url) {\n throw new WorkboxError('add-to-cache-list-unexpected-type', {entry});\n }\n\n // If there's just a URL and no revision, then it's also assumed to be a\n // versioned URL.\n if (!revision) {\n const urlObject = new URL(url, location);\n return {\n cacheKey: urlObject.href,\n url: urlObject.href,\n };\n }\n\n // Otherwise, construct a properly versioned URL using the custom Workbox\n // search parameter along with the revision info.\n const originalURL = new URL(url, location);\n const cacheKeyURL = new URL(url, location);\n cacheKeyURL.searchParams.set(REVISION_SEARCH_PARAM, revision);\n return {\n cacheKey: cacheKeyURL.href,\n url: originalURL.href,\n };\n}\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {logger} from 'workbox-core/_private/logger.mjs';\n\nimport '../_version.mjs';\n\nconst logGroup = (groupTitle, deletedURLs) => {\n logger.groupCollapsed(groupTitle);\n\n for (const url of deletedURLs) {\n logger.log(url);\n }\n\n logger.groupEnd();\n};\n\n/**\n * @param {Array} deletedURLs\n *\n * @private\n * @memberof module:workbox-precaching\n */\nexport function printCleanupDetails(deletedURLs) {\n const deletionCount = deletedURLs.length;\n if (deletionCount > 0) {\n logger.groupCollapsed(`During precaching cleanup, ` +\n `${deletionCount} cached ` +\n `request${deletionCount === 1 ? ' was' : 's were'} deleted.`);\n logGroup('Deleted Cache Requests', deletedURLs);\n logger.groupEnd();\n }\n}\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {logger} from 'workbox-core/_private/logger.mjs';\n\nimport '../_version.mjs';\n\n/**\n * @param {string} groupTitle\n * @param {Array} urls\n *\n * @private\n */\nfunction _nestedGroup(groupTitle, urls) {\n if (urls.length === 0) {\n return;\n }\n\n logger.groupCollapsed(groupTitle);\n\n for (const url of urls) {\n logger.log(url);\n }\n\n logger.groupEnd();\n}\n\n/**\n * @param {Array} urlsToPrecache\n * @param {Array} urlsAlreadyPrecached\n *\n * @private\n * @memberof module:workbox-precaching\n */\nexport function printInstallDetails(urlsToPrecache, urlsAlreadyPrecached) {\n const precachedCount = urlsToPrecache.length;\n const alreadyPrecachedCount = urlsAlreadyPrecached.length;\n\n if (precachedCount || alreadyPrecachedCount) {\n let message =\n `Precaching ${precachedCount} file${precachedCount === 1 ? '' : 's'}.`;\n\n if (alreadyPrecachedCount > 0) {\n message += ` ${alreadyPrecachedCount} ` +\n `file${alreadyPrecachedCount === 1 ? ' is' : 's are'} already cached.`;\n }\n\n logger.groupCollapsed(message);\n\n _nestedGroup(`View newly precached URLs.`, urlsToPrecache);\n _nestedGroup(`View previously precached URLs.`, urlsAlreadyPrecached);\n logger.groupEnd();\n }\n}\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {cacheNames} from 'workbox-core/_private/cacheNames.mjs';\nimport {cacheWrapper} from 'workbox-core/_private/cacheWrapper.mjs';\nimport {fetchWrapper} from 'workbox-core/_private/fetchWrapper.mjs';\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\n\nimport {cleanRedirect} from './utils/cleanRedirect.mjs';\nimport {createCacheKey} from './utils/createCacheKey.mjs';\nimport {printCleanupDetails} from './utils/printCleanupDetails.mjs';\nimport {printInstallDetails} from './utils/printInstallDetails.mjs';\n\nimport './_version.mjs';\n\n\n/**\n * Performs efficient precaching of assets.\n *\n * @memberof module:workbox-precaching\n */\nclass PrecacheController {\n /**\n * Create a new PrecacheController.\n *\n * @param {string} [cacheName] An optional name for the cache, to override\n * the default precache name.\n */\n constructor(cacheName) {\n this._cacheName = cacheNames.getPrecacheName(cacheName);\n this._urlsToCacheKeys = new Map();\n }\n\n /**\n * This method will add items to the precache list, removing duplicates\n * and ensuring the information is valid.\n *\n * @param {\n * Array\n * } entries Array of entries to precache.\n */\n addToCacheList(entries) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isArray(entries, {\n moduleName: 'workbox-precaching',\n className: 'PrecacheController',\n funcName: 'addToCacheList',\n paramName: 'entries',\n });\n }\n\n for (const entry of entries) {\n const {cacheKey, url} = createCacheKey(entry);\n if (this._urlsToCacheKeys.has(url) &&\n this._urlsToCacheKeys.get(url) !== cacheKey) {\n throw new WorkboxError('add-to-cache-list-conflicting-entries', {\n firstEntry: this._urlsToCacheKeys.get(url),\n secondEntry: cacheKey,\n });\n }\n this._urlsToCacheKeys.set(url, cacheKey);\n }\n }\n\n /**\n * Precaches new and updated assets. Call this method from the service worker\n * install event.\n *\n * @param {Object} options\n * @param {Event} [options.event] The install event (if needed).\n * @param {Array} [options.plugins] Plugins to be used for fetching\n * and caching during install.\n * @return {Promise}\n */\n async install({event, plugins} = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (plugins) {\n assert.isArray(plugins, {\n moduleName: 'workbox-precaching',\n className: 'PrecacheController',\n funcName: 'install',\n paramName: 'plugins',\n });\n }\n }\n\n const urlsToPrecache = [];\n const urlsAlreadyPrecached = [];\n\n const cache = await caches.open(this._cacheName);\n const alreadyCachedRequests = await cache.keys();\n const alreadyCachedURLs = new Set(alreadyCachedRequests.map(\n (request) => request.url));\n\n for (const cacheKey of this._urlsToCacheKeys.values()) {\n if (alreadyCachedURLs.has(cacheKey)) {\n urlsAlreadyPrecached.push(cacheKey);\n } else {\n urlsToPrecache.push(cacheKey);\n }\n }\n\n const precacheRequests = urlsToPrecache.map((url) => {\n return this._addURLToCache({event, plugins, url});\n });\n await Promise.all(precacheRequests);\n\n if (process.env.NODE_ENV !== 'production') {\n printInstallDetails(urlsToPrecache, urlsAlreadyPrecached);\n }\n\n return {\n updatedURLs: urlsToPrecache,\n notUpdatedURLs: urlsAlreadyPrecached,\n };\n }\n\n /**\n * Deletes assets that are no longer present in the current precache manifest.\n * Call this method from the service worker activate event.\n *\n * @return {Promise}\n */\n async activate() {\n const cache = await caches.open(this._cacheName);\n const currentlyCachedRequests = await cache.keys();\n const expectedCacheKeys = new Set(this._urlsToCacheKeys.values());\n\n const deletedURLs = [];\n for (const request of currentlyCachedRequests) {\n if (!expectedCacheKeys.has(request.url)) {\n await cache.delete(request);\n deletedURLs.push(request.url);\n }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n printCleanupDetails(deletedURLs);\n }\n\n return {deletedURLs};\n }\n\n /**\n * Requests the entry and saves it to the cache if the response is valid.\n * By default, any response with a status code of less than 400 (including\n * opaque responses) is considered valid.\n *\n * If you need to use custom criteria to determine what's valid and what\n * isn't, then pass in an item in `options.plugins` that implements the\n * `cacheWillUpdate()` lifecycle event.\n *\n * @private\n * @param {Object} options\n * @param {string} options.url The URL to fetch and cache.\n * @param {Event} [options.event] The install event (if passed).\n * @param {Array} [options.plugins] An array of plugins to apply to\n * fetch and caching.\n */\n async _addURLToCache({url, event, plugins}) {\n const request = new Request(url, {credentials: 'same-origin'});\n let response = await fetchWrapper.fetch({\n event,\n plugins,\n request,\n });\n\n // Allow developers to override the default logic about what is and isn't\n // valid by passing in a plugin implementing cacheWillUpdate(), e.g.\n // a workbox.cacheableResponse.Plugin instance.\n let cacheWillUpdateCallback;\n for (const plugin of (plugins || [])) {\n if ('cacheWillUpdate' in plugin) {\n cacheWillUpdateCallback = plugin.cacheWillUpdate.bind(plugin);\n }\n }\n\n const isValidResponse = cacheWillUpdateCallback ?\n // Use a callback if provided. It returns a truthy value if valid.\n cacheWillUpdateCallback({event, request, response}) :\n // Otherwise, default to considering any response status under 400 valid.\n // This includes, by default, considering opaque responses valid.\n response.status < 400;\n\n // Consider this a failure, leading to the `install` handler failing, if\n // we get back an invalid response.\n if (!isValidResponse) {\n throw new WorkboxError('bad-precaching-response', {\n url,\n status: response.status,\n });\n }\n\n if (response.redirected) {\n response = await cleanRedirect(response);\n }\n\n await cacheWrapper.put({\n event,\n plugins,\n request,\n response,\n cacheName: this._cacheName,\n matchOptions: {\n ignoreSearch: true,\n },\n });\n }\n\n /**\n * Returns a mapping of a precached URL to the corresponding cache key, taking\n * into account the revision information for the URL.\n *\n * @return {Map} A URL to cache key mapping.\n */\n getURLsToCacheKeys() {\n return this._urlsToCacheKeys;\n }\n\n /**\n * Returns a list of all the URLs that have been precached by the current\n * service worker.\n *\n * @return {Array} The precached URLs.\n */\n getCachedURLs() {\n return [...this._urlsToCacheKeys.keys()];\n }\n\n /**\n * Returns the cache key used for storing a given URL. If that URL is\n * unversioned, like `/index.html', then the cache key will be the original\n * URL with a search parameter appended to it.\n *\n * @param {string} url A URL whose cache key you want to look up.\n * @return {string} The versioned URL that corresponds to a cache key\n * for the original URL, or undefined if that URL isn't precached.\n */\n getCacheKeyForURL(url) {\n const urlObject = new URL(url, location);\n return this._urlsToCacheKeys.get(urlObject.href);\n }\n}\n\nexport {PrecacheController};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {PrecacheController} from '../PrecacheController.mjs';\nimport '../_version.mjs';\n\n\nlet precacheController;\n\n/**\n * @return {PrecacheController}\n * @private\n */\nexport const getOrCreatePrecacheController = () => {\n if (!precacheController) {\n precacheController = new PrecacheController();\n }\n return precacheController;\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n/**\n * Removes any URL search parameters that should be ignored.\n *\n * @param {URL} urlObject The original URL.\n * @param {Array} ignoreURLParametersMatching RegExps to test against\n * each search parameter name. Matches mean that the search parameter should be\n * ignored.\n * @return {URL} The URL with any ignored search parameters removed.\n *\n * @private\n * @memberof module:workbox-precaching\n */\nexport function removeIgnoredSearchParams(urlObject,\n ignoreURLParametersMatching) {\n // Convert the iterable into an array at the start of the loop to make sure\n // deletion doesn't mess up iteration.\n for (const paramName of [...urlObject.searchParams.keys()]) {\n if (ignoreURLParametersMatching.some((regExp) => regExp.test(paramName))) {\n urlObject.searchParams.delete(paramName);\n }\n }\n\n return urlObject;\n}\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {removeIgnoredSearchParams} from './removeIgnoredSearchParams.mjs';\n\nimport '../_version.mjs';\n\n/**\n * Generator function that yields possible variations on the original URL to\n * check, one at a time.\n *\n * @param {string} url\n * @param {Object} options\n *\n * @private\n * @memberof module:workbox-precaching\n */\nexport function* generateURLVariations(url, {\n ignoreURLParametersMatching,\n directoryIndex,\n cleanURLs,\n urlManipulation,\n} = {}) {\n const urlObject = new URL(url, location);\n urlObject.hash = '';\n yield urlObject.href;\n\n const urlWithoutIgnoredParams = removeIgnoredSearchParams(\n urlObject, ignoreURLParametersMatching);\n yield urlWithoutIgnoredParams.href;\n\n if (directoryIndex && urlWithoutIgnoredParams.pathname.endsWith('/')) {\n const directoryURL = new URL(urlWithoutIgnoredParams);\n directoryURL.pathname += directoryIndex;\n yield directoryURL.href;\n }\n\n if (cleanURLs) {\n const cleanURL = new URL(urlWithoutIgnoredParams);\n cleanURL.pathname += '.html';\n yield cleanURL.href;\n }\n\n if (urlManipulation) {\n const additionalURLs = urlManipulation({url: urlObject});\n for (const urlToAttempt of additionalURLs) {\n yield urlToAttempt.href;\n }\n }\n}\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {getOrCreatePrecacheController}\n from './getOrCreatePrecacheController.mjs';\nimport {generateURLVariations} from './generateURLVariations.mjs';\nimport '../_version.mjs';\n\n/**\n * This function will take the request URL and manipulate it based on the\n * configuration options.\n *\n * @param {string} url\n * @param {Object} options\n * @return {string} Returns the URL in the cache that matches the request,\n * if possible.\n *\n * @private\n */\nexport const getCacheKeyForURL = (url, options) => {\n const precacheController = getOrCreatePrecacheController();\n\n const urlsToCacheKeys = precacheController.getURLsToCacheKeys();\n for (const possibleURL of generateURLVariations(url, options)) {\n const possibleCacheKey = urlsToCacheKeys.get(possibleURL);\n if (possibleCacheKey) {\n return possibleCacheKey;\n }\n }\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {cacheNames} from 'workbox-core/_private/cacheNames.mjs';\nimport {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {getCacheKeyForURL} from './getCacheKeyForURL.mjs';\nimport '../_version.mjs';\n\n\n/**\n * Adds a `fetch` listener to the service worker that will\n * respond to\n * [network requests]{@link https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#Custom_responses_to_requests}\n * with precached assets.\n *\n * Requests for assets that aren't precached, the `FetchEvent` will not be\n * responded to, allowing the event to fall through to other `fetch` event\n * listeners.\n *\n * NOTE: when called more than once this method will replace the previously set\n * configuration options. Calling it more than once is not recommended outside\n * of tests.\n *\n * @private\n * @param {Object} options\n * @param {string} [options.directoryIndex=index.html] The `directoryIndex` will\n * check cache entries for a URLs ending with '/' to see if there is a hit when\n * appending the `directoryIndex` value.\n * @param {Array} [options.ignoreURLParametersMatching=[/^utm_/]] An\n * array of regex's to remove search params when looking for a cache match.\n * @param {boolean} [options.cleanURLs=true] The `cleanURLs` option will\n * check the cache for the URL with a `.html` added to the end of the end.\n * @param {workbox.precaching~urlManipulation} [options.urlManipulation]\n * This is a function that should take a URL and return an array of\n * alternative URL's that should be checked for precache matches.\n */\nexport const addFetchListener = ({\n ignoreURLParametersMatching = [/^utm_/],\n directoryIndex = 'index.html',\n cleanURLs = true,\n urlManipulation = null,\n} = {}) => {\n const cacheName = cacheNames.getPrecacheName();\n\n addEventListener('fetch', (event) => {\n const precachedURL = getCacheKeyForURL(event.request.url, {\n cleanURLs,\n directoryIndex,\n ignoreURLParametersMatching,\n urlManipulation,\n });\n if (!precachedURL) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Precaching did not find a match for ` +\n getFriendlyURL(event.request.url));\n }\n return;\n }\n\n let responsePromise = caches.open(cacheName).then((cache) => {\n return cache.match(precachedURL);\n }).then((cachedResponse) => {\n if (cachedResponse) {\n return cachedResponse;\n }\n\n // Fall back to the network if we don't have a cached response\n // (perhaps due to manual cache cleanup).\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`The precached response for ` +\n `${getFriendlyURL(precachedURL)} in ${cacheName} was not found. ` +\n `Falling back to the network instead.`);\n }\n\n return fetch(precachedURL);\n });\n\n if (process.env.NODE_ENV !== 'production') {\n responsePromise = responsePromise.then((response) => {\n // Workbox is going to handle the route.\n // print the routing details to the console.\n logger.groupCollapsed(`Precaching is responding to: ` +\n getFriendlyURL(event.request.url));\n logger.log(`Serving the precached url: ${precachedURL}`);\n\n logger.groupCollapsed(`View request details here.`);\n logger.log(event.request);\n logger.groupEnd();\n\n logger.groupCollapsed(`View response details here.`);\n logger.log(response);\n logger.groupEnd();\n\n logger.groupEnd();\n return response;\n });\n }\n\n event.respondWith(responsePromise);\n });\n};\n","\n/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {addFetchListener} from './utils/addFetchListener.mjs';\nimport './_version.mjs';\n\n\nlet listenerAdded = false;\n\n/**\n * Add a `fetch` listener to the service worker that will\n * respond to\n * [network requests]{@link https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#Custom_responses_to_requests}\n * with precached assets.\n *\n * Requests for assets that aren't precached, the `FetchEvent` will not be\n * responded to, allowing the event to fall through to other `fetch` event\n * listeners.\n *\n * @param {Object} options\n * @param {string} [options.directoryIndex=index.html] The `directoryIndex` will\n * check cache entries for a URLs ending with '/' to see if there is a hit when\n * appending the `directoryIndex` value.\n * @param {Array} [options.ignoreURLParametersMatching=[/^utm_/]] An\n * array of regex's to remove search params when looking for a cache match.\n * @param {boolean} [options.cleanURLs=true] The `cleanURLs` option will\n * check the cache for the URL with a `.html` added to the end of the end.\n * @param {workbox.precaching~urlManipulation} [options.urlManipulation]\n * This is a function that should take a URL and return an array of\n * alternative URL's that should be checked for precache matches.\n *\n * @alias workbox.precaching.addRoute\n */\nexport const addRoute = (options) => {\n if (!listenerAdded) {\n addFetchListener(options);\n listenerAdded = true;\n }\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\nconst SUBSTRING_TO_FIND = '-precache-';\n\n/**\n * Cleans up incompatible precaches that were created by older versions of\n * Workbox, by a service worker registered under the current scope.\n *\n * This is meant to be called as part of the `activate` event.\n *\n * This should be safe to use as long as you don't include `substringToFind`\n * (defaulting to `-precache-`) in your non-precache cache names.\n *\n * @param {string} currentPrecacheName The cache name currently in use for\n * precaching. This cache won't be deleted.\n * @param {string} [substringToFind='-precache-'] Cache names which include this\n * substring will be deleted (excluding `currentPrecacheName`).\n * @return {Array} A list of all the cache names that were deleted.\n *\n * @private\n * @memberof module:workbox-precaching\n */\nconst deleteOutdatedCaches = async (\n currentPrecacheName,\n substringToFind = SUBSTRING_TO_FIND) => {\n const cacheNames = await caches.keys();\n\n const cacheNamesToDelete = cacheNames.filter((cacheName) => {\n return cacheName.includes(substringToFind) &&\n cacheName.includes(self.registration.scope) &&\n cacheName !== currentPrecacheName;\n });\n\n await Promise.all(\n cacheNamesToDelete.map((cacheName) => caches.delete(cacheName)));\n\n return cacheNamesToDelete;\n};\n\nexport {deleteOutdatedCaches};\n\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {cacheNames} from 'workbox-core/_private/cacheNames.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {deleteOutdatedCaches} from './utils/deleteOutdatedCaches.mjs';\nimport './_version.mjs';\n\n\n/**\n * Adds an `activate` event listener which will clean up incompatible\n * precaches that were created by older versions of Workbox.\n *\n * @alias workbox.precaching.cleanupOutdatedCaches\n */\nexport const cleanupOutdatedCaches = () => {\n addEventListener('activate', (event) => {\n const cacheName = cacheNames.getPrecacheName();\n\n event.waitUntil(deleteOutdatedCaches(cacheName).then((cachesDeleted) => {\n if (process.env.NODE_ENV !== 'production') {\n if (cachesDeleted.length > 0) {\n logger.log(`The following out-of-date precaches were cleaned up ` +\n `automatically:`, cachesDeleted);\n }\n }\n }));\n });\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {getOrCreatePrecacheController}\n from './utils/getOrCreatePrecacheController.mjs';\nimport './_version.mjs';\n\n\n/**\n * Takes in a URL, and returns the corresponding URL that could be used to\n * lookup the entry in the precache.\n *\n * If a relative URL is provided, the location of the service worker file will\n * be used as the base.\n *\n * For precached entries without revision information, the cache key will be the\n * same as the original URL.\n *\n * For precached entries with revision information, the cache key will be the\n * original URL with the addition of a query parameter used for keeping track of\n * the revision info.\n *\n * @param {string} url The URL whose cache key to look up.\n * @return {string} The cache key that corresponds to that URL.\n *\n * @alias workbox.precaching.getCacheKeyForURL\n */\nexport const getCacheKeyForURL = (url) => {\n const precacheController = getOrCreatePrecacheController();\n return precacheController.getCacheKeyForURL(url);\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {getOrCreatePrecacheController} from './utils/getOrCreatePrecacheController.mjs';\nimport {precachePlugins} from './utils/precachePlugins.mjs';\nimport './_version.mjs';\n\n\nconst installListener = (event) => {\n const precacheController = getOrCreatePrecacheController();\n const plugins = precachePlugins.get();\n\n event.waitUntil(\n precacheController.install({event, plugins})\n .catch((error) => {\n if (process.env.NODE_ENV !== 'production') {\n logger.error(`Service worker installation failed. It will ` +\n `be retried automatically during the next navigation.`);\n }\n // Re-throw the error to ensure installation fails.\n throw error;\n })\n );\n};\n\nconst activateListener = (event) => {\n const precacheController = getOrCreatePrecacheController();\n const plugins = precachePlugins.get();\n\n event.waitUntil(precacheController.activate({event, plugins}));\n};\n\n/**\n * Adds items to the precache list, removing any duplicates and\n * stores the files in the\n * [\"precache cache\"]{@link module:workbox-core.cacheNames} when the service\n * worker installs.\n *\n * This method can be called multiple times.\n *\n * Please note: This method **will not** serve any of the cached files for you.\n * It only precaches files. To respond to a network request you call\n * [addRoute()]{@link module:workbox-precaching.addRoute}.\n *\n * If you have a single array of files to precache, you can just call\n * [precacheAndRoute()]{@link module:workbox-precaching.precacheAndRoute}.\n *\n * @param {Array} entries Array of entries to precache.\n *\n * @alias workbox.precaching.precache\n */\nexport const precache = (entries) => {\n const precacheController = getOrCreatePrecacheController();\n precacheController.addToCacheList(entries);\n\n if (entries.length > 0) {\n // NOTE: these listeners will only be added once (even if the `precache()`\n // method is called multiple times) because event listeners are implemented\n // as a set, where each listener must be unique.\n addEventListener('install', installListener);\n addEventListener('activate', activateListener);\n }\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {addRoute} from './addRoute.mjs';\nimport {precache} from './precache.mjs';\nimport './_version.mjs';\n\n\n/**\n * This method will add entries to the precache list and add a route to\n * respond to fetch events.\n *\n * This is a convenience method that will call\n * [precache()]{@link module:workbox-precaching.precache} and\n * [addRoute()]{@link module:workbox-precaching.addRoute} in a single call.\n *\n * @param {Array} entries Array of entries to precache.\n * @param {Object} options See\n * [addRoute() options]{@link module:workbox-precaching.addRoute}.\n *\n * @alias workbox.precaching.precacheAndRoute\n */\nexport const precacheAndRoute = (entries, options) => {\n precache(entries);\n addRoute(options);\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {addPlugins} from './addPlugins.mjs';\nimport {addRoute} from './addRoute.mjs';\nimport {cleanupOutdatedCaches} from './cleanupOutdatedCaches.mjs';\nimport {getCacheKeyForURL} from './getCacheKeyForURL.mjs';\nimport {precache} from './precache.mjs';\nimport {precacheAndRoute} from './precacheAndRoute.mjs';\nimport {PrecacheController} from './PrecacheController.mjs';\nimport './_version.mjs';\n\n\nif (process.env.NODE_ENV !== 'production') {\n assert.isSWEnv('workbox-precaching');\n}\n\n/**\n * Most consumers of this module will want to use the\n * [precacheAndRoute()]{@link workbox.precaching.precacheAndRoute}\n * method to add assets to the Cache and respond to network requests with these\n * cached assets.\n *\n * If you require finer grained control, you can use the\n * [PrecacheController]{@link workbox.precaching.PrecacheController}\n * to determine when performed.\n *\n * @namespace workbox.precaching\n */\n\nexport {\n addPlugins,\n addRoute,\n cleanupOutdatedCaches,\n getCacheKeyForURL,\n precache,\n precacheAndRoute,\n PrecacheController,\n};\n"],"names":["self","_","e","plugins","precachePlugins","get","add","newPlugins","push","addPlugins","cleanRedirect","response","clonedResponse","clone","bodyPromise","Promise","resolve","body","blob","Response","headers","status","statusText","REVISION_SEARCH_PARAM","createCacheKey","entry","WorkboxError","urlObject","URL","location","cacheKey","href","url","revision","originalURL","cacheKeyURL","searchParams","set","logGroup","groupTitle","deletedURLs","logger","groupCollapsed","log","groupEnd","printCleanupDetails","deletionCount","length","_nestedGroup","urls","printInstallDetails","urlsToPrecache","urlsAlreadyPrecached","precachedCount","alreadyPrecachedCount","message","PrecacheController","constructor","cacheName","_cacheName","cacheNames","getPrecacheName","_urlsToCacheKeys","Map","addToCacheList","entries","assert","isArray","moduleName","className","funcName","paramName","has","firstEntry","secondEntry","install","event","cache","caches","open","alreadyCachedRequests","keys","alreadyCachedURLs","Set","map","request","values","precacheRequests","_addURLToCache","all","updatedURLs","notUpdatedURLs","activate","currentlyCachedRequests","expectedCacheKeys","delete","Request","credentials","fetchWrapper","fetch","cacheWillUpdateCallback","plugin","cacheWillUpdate","bind","isValidResponse","redirected","cacheWrapper","put","matchOptions","ignoreSearch","getURLsToCacheKeys","getCachedURLs","getCacheKeyForURL","precacheController","getOrCreatePrecacheController","removeIgnoredSearchParams","ignoreURLParametersMatching","some","regExp","test","generateURLVariations","directoryIndex","cleanURLs","urlManipulation","hash","urlWithoutIgnoredParams","pathname","endsWith","directoryURL","cleanURL","additionalURLs","urlToAttempt","options","urlsToCacheKeys","possibleURL","possibleCacheKey","addFetchListener","addEventListener","precachedURL","debug","getFriendlyURL","responsePromise","then","match","cachedResponse","warn","respondWith","listenerAdded","addRoute","SUBSTRING_TO_FIND","deleteOutdatedCaches","currentPrecacheName","substringToFind","cacheNamesToDelete","filter","includes","registration","scope","cleanupOutdatedCaches","waitUntil","cachesDeleted","installListener","catch","error","activateListener","precache","precacheAndRoute","isSWEnv"],"mappings":"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"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-precaching.prod.js b/workbox-v4.3.1/workbox-precaching.prod.js new file mode 100644 index 00000000..6521788e --- /dev/null +++ b/workbox-v4.3.1/workbox-precaching.prod.js @@ -0,0 +1,2 @@ +this.workbox=this.workbox||{},this.workbox.precaching=function(t,e,n,s,c){"use strict";try{self["workbox:precaching:4.3.1"]&&_()}catch(t){}const o=[],i={get:()=>o,add(t){o.push(...t)}};const a="__WB_REVISION__";function r(t){if(!t)throw new c.WorkboxError("add-to-cache-list-unexpected-type",{entry:t});if("string"==typeof t){const e=new URL(t,location);return{cacheKey:e.href,url:e.href}}const{revision:e,url:n}=t;if(!n)throw new c.WorkboxError("add-to-cache-list-unexpected-type",{entry:t});if(!e){const t=new URL(n,location);return{cacheKey:t.href,url:t.href}}const s=new URL(n,location),o=new URL(n,location);return o.searchParams.set(a,e),{cacheKey:o.href,url:s.href}}class l{constructor(t){this.t=e.cacheNames.getPrecacheName(t),this.s=new Map}addToCacheList(t){for(const e of t){const{cacheKey:t,url:n}=r(e);if(this.s.has(n)&&this.s.get(n)!==t)throw new c.WorkboxError("add-to-cache-list-conflicting-entries",{firstEntry:this.s.get(n),secondEntry:t});this.s.set(n,t)}}async install({event:t,plugins:e}={}){const n=[],s=[],c=await caches.open(this.t),o=await c.keys(),i=new Set(o.map(t=>t.url));for(const t of this.s.values())i.has(t)?s.push(t):n.push(t);const a=n.map(n=>this.o({event:t,plugins:e,url:n}));return await Promise.all(a),{updatedURLs:n,notUpdatedURLs:s}}async activate(){const t=await caches.open(this.t),e=await t.keys(),n=new Set(this.s.values()),s=[];for(const c of e)n.has(c.url)||(await t.delete(c),s.push(c.url));return{deletedURLs:s}}async o({url:t,event:e,plugins:o}){const i=new Request(t,{credentials:"same-origin"});let a,r=await s.fetchWrapper.fetch({event:e,plugins:o,request:i});for(const t of o||[])"cacheWillUpdate"in t&&(a=t.cacheWillUpdate.bind(t));if(!(a?a({event:e,request:i,response:r}):r.status<400))throw new c.WorkboxError("bad-precaching-response",{url:t,status:r.status});r.redirected&&(r=await async function(t){const e=t.clone(),n="body"in e?Promise.resolve(e.body):e.blob(),s=await n;return new Response(s,{headers:e.headers,status:e.status,statusText:e.statusText})}(r)),await n.cacheWrapper.put({event:e,plugins:o,request:i,response:r,cacheName:this.t,matchOptions:{ignoreSearch:!0}})}getURLsToCacheKeys(){return this.s}getCachedURLs(){return[...this.s.keys()]}getCacheKeyForURL(t){const e=new URL(t,location);return this.s.get(e.href)}}let u;const h=()=>(u||(u=new l),u);const d=(t,e)=>{const n=h().getURLsToCacheKeys();for(const s of function*(t,{ignoreURLParametersMatching:e,directoryIndex:n,cleanURLs:s,urlManipulation:c}={}){const o=new URL(t,location);o.hash="",yield o.href;const i=function(t,e){for(const n of[...t.searchParams.keys()])e.some(t=>t.test(n))&&t.searchParams.delete(n);return t}(o,e);if(yield i.href,n&&i.pathname.endsWith("/")){const t=new URL(i);t.pathname+=n,yield t.href}if(s){const t=new URL(i);t.pathname+=".html",yield t.href}if(c){const t=c({url:o});for(const e of t)yield e.href}}(t,e)){const t=n.get(s);if(t)return t}};let w=!1;const f=t=>{w||((({ignoreURLParametersMatching:t=[/^utm_/],directoryIndex:n="index.html",cleanURLs:s=!0,urlManipulation:c=null}={})=>{const o=e.cacheNames.getPrecacheName();addEventListener("fetch",e=>{const i=d(e.request.url,{cleanURLs:s,directoryIndex:n,ignoreURLParametersMatching:t,urlManipulation:c});if(!i)return;let a=caches.open(o).then(t=>t.match(i)).then(t=>t||fetch(i));e.respondWith(a)})})(t),w=!0)},y=t=>{const e=h(),n=i.get();t.waitUntil(e.install({event:t,plugins:n}).catch(t=>{throw t}))},p=t=>{const e=h(),n=i.get();t.waitUntil(e.activate({event:t,plugins:n}))},L=t=>{h().addToCacheList(t),t.length>0&&(addEventListener("install",y),addEventListener("activate",p))};return t.addPlugins=(t=>{i.add(t)}),t.addRoute=f,t.cleanupOutdatedCaches=(()=>{addEventListener("activate",t=>{const n=e.cacheNames.getPrecacheName();t.waitUntil((async(t,e="-precache-")=>{const n=(await caches.keys()).filter(n=>n.includes(e)&&n.includes(self.registration.scope)&&n!==t);return await Promise.all(n.map(t=>caches.delete(t))),n})(n).then(t=>{}))})}),t.getCacheKeyForURL=(t=>{return h().getCacheKeyForURL(t)}),t.precache=L,t.precacheAndRoute=((t,e)=>{L(t),f(e)}),t.PrecacheController=l,t}({},workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private); +//# sourceMappingURL=workbox-precaching.prod.js.map diff --git a/workbox-v4.3.1/workbox-precaching.prod.js.map b/workbox-v4.3.1/workbox-precaching.prod.js.map new file mode 100644 index 00000000..a67bd4a9 --- /dev/null +++ b/workbox-v4.3.1/workbox-precaching.prod.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-precaching.prod.js","sources":["../_version.mjs","../utils/precachePlugins.mjs","../utils/createCacheKey.mjs","../PrecacheController.mjs","../utils/cleanRedirect.mjs","../utils/getOrCreatePrecacheController.mjs","../utils/getCacheKeyForURL.mjs","../utils/generateURLVariations.mjs","../utils/removeIgnoredSearchParams.mjs","../addRoute.mjs","../utils/addFetchListener.mjs","../precache.mjs","../addPlugins.mjs","../cleanupOutdatedCaches.mjs","../utils/deleteOutdatedCaches.mjs","../getCacheKeyForURL.mjs","../precacheAndRoute.mjs"],"sourcesContent":["try{self['workbox:precaching:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\nconst plugins = [];\n\nexport const precachePlugins = {\n /*\n * @return {Array}\n * @private\n */\n get() {\n return plugins;\n },\n\n /*\n * @param {Array} newPlugins\n * @private\n */\n add(newPlugins) {\n plugins.push(...newPlugins);\n },\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\n\nimport '../_version.mjs';\n\n// Name of the search parameter used to store revision info.\nconst REVISION_SEARCH_PARAM = '__WB_REVISION__';\n\n/**\n * Converts a manifest entry into a versioned URL suitable for precaching.\n *\n * @param {Object} entry\n * @return {string} A URL with versioning info.\n *\n * @private\n * @memberof module:workbox-precaching\n */\nexport function createCacheKey(entry) {\n if (!entry) {\n throw new WorkboxError('add-to-cache-list-unexpected-type', {entry});\n }\n\n // If a precache manifest entry is a string, it's assumed to be a versioned\n // URL, like '/app.abcd1234.js'. Return as-is.\n if (typeof entry === 'string') {\n const urlObject = new URL(entry, location);\n return {\n cacheKey: urlObject.href,\n url: urlObject.href,\n };\n }\n\n const {revision, url} = entry;\n if (!url) {\n throw new WorkboxError('add-to-cache-list-unexpected-type', {entry});\n }\n\n // If there's just a URL and no revision, then it's also assumed to be a\n // versioned URL.\n if (!revision) {\n const urlObject = new URL(url, location);\n return {\n cacheKey: urlObject.href,\n url: urlObject.href,\n };\n }\n\n // Otherwise, construct a properly versioned URL using the custom Workbox\n // search parameter along with the revision info.\n const originalURL = new URL(url, location);\n const cacheKeyURL = new URL(url, location);\n cacheKeyURL.searchParams.set(REVISION_SEARCH_PARAM, revision);\n return {\n cacheKey: cacheKeyURL.href,\n url: originalURL.href,\n };\n}\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {cacheNames} from 'workbox-core/_private/cacheNames.mjs';\nimport {cacheWrapper} from 'workbox-core/_private/cacheWrapper.mjs';\nimport {fetchWrapper} from 'workbox-core/_private/fetchWrapper.mjs';\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\n\nimport {cleanRedirect} from './utils/cleanRedirect.mjs';\nimport {createCacheKey} from './utils/createCacheKey.mjs';\nimport {printCleanupDetails} from './utils/printCleanupDetails.mjs';\nimport {printInstallDetails} from './utils/printInstallDetails.mjs';\n\nimport './_version.mjs';\n\n\n/**\n * Performs efficient precaching of assets.\n *\n * @memberof module:workbox-precaching\n */\nclass PrecacheController {\n /**\n * Create a new PrecacheController.\n *\n * @param {string} [cacheName] An optional name for the cache, to override\n * the default precache name.\n */\n constructor(cacheName) {\n this._cacheName = cacheNames.getPrecacheName(cacheName);\n this._urlsToCacheKeys = new Map();\n }\n\n /**\n * This method will add items to the precache list, removing duplicates\n * and ensuring the information is valid.\n *\n * @param {\n * Array\n * } entries Array of entries to precache.\n */\n addToCacheList(entries) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isArray(entries, {\n moduleName: 'workbox-precaching',\n className: 'PrecacheController',\n funcName: 'addToCacheList',\n paramName: 'entries',\n });\n }\n\n for (const entry of entries) {\n const {cacheKey, url} = createCacheKey(entry);\n if (this._urlsToCacheKeys.has(url) &&\n this._urlsToCacheKeys.get(url) !== cacheKey) {\n throw new WorkboxError('add-to-cache-list-conflicting-entries', {\n firstEntry: this._urlsToCacheKeys.get(url),\n secondEntry: cacheKey,\n });\n }\n this._urlsToCacheKeys.set(url, cacheKey);\n }\n }\n\n /**\n * Precaches new and updated assets. Call this method from the service worker\n * install event.\n *\n * @param {Object} options\n * @param {Event} [options.event] The install event (if needed).\n * @param {Array} [options.plugins] Plugins to be used for fetching\n * and caching during install.\n * @return {Promise}\n */\n async install({event, plugins} = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (plugins) {\n assert.isArray(plugins, {\n moduleName: 'workbox-precaching',\n className: 'PrecacheController',\n funcName: 'install',\n paramName: 'plugins',\n });\n }\n }\n\n const urlsToPrecache = [];\n const urlsAlreadyPrecached = [];\n\n const cache = await caches.open(this._cacheName);\n const alreadyCachedRequests = await cache.keys();\n const alreadyCachedURLs = new Set(alreadyCachedRequests.map(\n (request) => request.url));\n\n for (const cacheKey of this._urlsToCacheKeys.values()) {\n if (alreadyCachedURLs.has(cacheKey)) {\n urlsAlreadyPrecached.push(cacheKey);\n } else {\n urlsToPrecache.push(cacheKey);\n }\n }\n\n const precacheRequests = urlsToPrecache.map((url) => {\n return this._addURLToCache({event, plugins, url});\n });\n await Promise.all(precacheRequests);\n\n if (process.env.NODE_ENV !== 'production') {\n printInstallDetails(urlsToPrecache, urlsAlreadyPrecached);\n }\n\n return {\n updatedURLs: urlsToPrecache,\n notUpdatedURLs: urlsAlreadyPrecached,\n };\n }\n\n /**\n * Deletes assets that are no longer present in the current precache manifest.\n * Call this method from the service worker activate event.\n *\n * @return {Promise}\n */\n async activate() {\n const cache = await caches.open(this._cacheName);\n const currentlyCachedRequests = await cache.keys();\n const expectedCacheKeys = new Set(this._urlsToCacheKeys.values());\n\n const deletedURLs = [];\n for (const request of currentlyCachedRequests) {\n if (!expectedCacheKeys.has(request.url)) {\n await cache.delete(request);\n deletedURLs.push(request.url);\n }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n printCleanupDetails(deletedURLs);\n }\n\n return {deletedURLs};\n }\n\n /**\n * Requests the entry and saves it to the cache if the response is valid.\n * By default, any response with a status code of less than 400 (including\n * opaque responses) is considered valid.\n *\n * If you need to use custom criteria to determine what's valid and what\n * isn't, then pass in an item in `options.plugins` that implements the\n * `cacheWillUpdate()` lifecycle event.\n *\n * @private\n * @param {Object} options\n * @param {string} options.url The URL to fetch and cache.\n * @param {Event} [options.event] The install event (if passed).\n * @param {Array} [options.plugins] An array of plugins to apply to\n * fetch and caching.\n */\n async _addURLToCache({url, event, plugins}) {\n const request = new Request(url, {credentials: 'same-origin'});\n let response = await fetchWrapper.fetch({\n event,\n plugins,\n request,\n });\n\n // Allow developers to override the default logic about what is and isn't\n // valid by passing in a plugin implementing cacheWillUpdate(), e.g.\n // a workbox.cacheableResponse.Plugin instance.\n let cacheWillUpdateCallback;\n for (const plugin of (plugins || [])) {\n if ('cacheWillUpdate' in plugin) {\n cacheWillUpdateCallback = plugin.cacheWillUpdate.bind(plugin);\n }\n }\n\n const isValidResponse = cacheWillUpdateCallback ?\n // Use a callback if provided. It returns a truthy value if valid.\n cacheWillUpdateCallback({event, request, response}) :\n // Otherwise, default to considering any response status under 400 valid.\n // This includes, by default, considering opaque responses valid.\n response.status < 400;\n\n // Consider this a failure, leading to the `install` handler failing, if\n // we get back an invalid response.\n if (!isValidResponse) {\n throw new WorkboxError('bad-precaching-response', {\n url,\n status: response.status,\n });\n }\n\n if (response.redirected) {\n response = await cleanRedirect(response);\n }\n\n await cacheWrapper.put({\n event,\n plugins,\n request,\n response,\n cacheName: this._cacheName,\n matchOptions: {\n ignoreSearch: true,\n },\n });\n }\n\n /**\n * Returns a mapping of a precached URL to the corresponding cache key, taking\n * into account the revision information for the URL.\n *\n * @return {Map} A URL to cache key mapping.\n */\n getURLsToCacheKeys() {\n return this._urlsToCacheKeys;\n }\n\n /**\n * Returns a list of all the URLs that have been precached by the current\n * service worker.\n *\n * @return {Array} The precached URLs.\n */\n getCachedURLs() {\n return [...this._urlsToCacheKeys.keys()];\n }\n\n /**\n * Returns the cache key used for storing a given URL. If that URL is\n * unversioned, like `/index.html', then the cache key will be the original\n * URL with a search parameter appended to it.\n *\n * @param {string} url A URL whose cache key you want to look up.\n * @return {string} The versioned URL that corresponds to a cache key\n * for the original URL, or undefined if that URL isn't precached.\n */\n getCacheKeyForURL(url) {\n const urlObject = new URL(url, location);\n return this._urlsToCacheKeys.get(urlObject.href);\n }\n}\n\nexport {PrecacheController};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n/**\n * @param {Response} response\n * @return {Response}\n *\n * @private\n * @memberof module:workbox-precaching\n */\nexport async function cleanRedirect(response) {\n const clonedResponse = response.clone();\n\n // Not all browsers support the Response.body stream, so fall back\n // to reading the entire body into memory as a blob.\n const bodyPromise = 'body' in clonedResponse ?\n Promise.resolve(clonedResponse.body) :\n clonedResponse.blob();\n\n const body = await bodyPromise;\n\n // new Response() is happy when passed either a stream or a Blob.\n return new Response(body, {\n headers: clonedResponse.headers,\n status: clonedResponse.status,\n statusText: clonedResponse.statusText,\n });\n}\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {PrecacheController} from '../PrecacheController.mjs';\nimport '../_version.mjs';\n\n\nlet precacheController;\n\n/**\n * @return {PrecacheController}\n * @private\n */\nexport const getOrCreatePrecacheController = () => {\n if (!precacheController) {\n precacheController = new PrecacheController();\n }\n return precacheController;\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {getOrCreatePrecacheController}\n from './getOrCreatePrecacheController.mjs';\nimport {generateURLVariations} from './generateURLVariations.mjs';\nimport '../_version.mjs';\n\n/**\n * This function will take the request URL and manipulate it based on the\n * configuration options.\n *\n * @param {string} url\n * @param {Object} options\n * @return {string} Returns the URL in the cache that matches the request,\n * if possible.\n *\n * @private\n */\nexport const getCacheKeyForURL = (url, options) => {\n const precacheController = getOrCreatePrecacheController();\n\n const urlsToCacheKeys = precacheController.getURLsToCacheKeys();\n for (const possibleURL of generateURLVariations(url, options)) {\n const possibleCacheKey = urlsToCacheKeys.get(possibleURL);\n if (possibleCacheKey) {\n return possibleCacheKey;\n }\n }\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {removeIgnoredSearchParams} from './removeIgnoredSearchParams.mjs';\n\nimport '../_version.mjs';\n\n/**\n * Generator function that yields possible variations on the original URL to\n * check, one at a time.\n *\n * @param {string} url\n * @param {Object} options\n *\n * @private\n * @memberof module:workbox-precaching\n */\nexport function* generateURLVariations(url, {\n ignoreURLParametersMatching,\n directoryIndex,\n cleanURLs,\n urlManipulation,\n} = {}) {\n const urlObject = new URL(url, location);\n urlObject.hash = '';\n yield urlObject.href;\n\n const urlWithoutIgnoredParams = removeIgnoredSearchParams(\n urlObject, ignoreURLParametersMatching);\n yield urlWithoutIgnoredParams.href;\n\n if (directoryIndex && urlWithoutIgnoredParams.pathname.endsWith('/')) {\n const directoryURL = new URL(urlWithoutIgnoredParams);\n directoryURL.pathname += directoryIndex;\n yield directoryURL.href;\n }\n\n if (cleanURLs) {\n const cleanURL = new URL(urlWithoutIgnoredParams);\n cleanURL.pathname += '.html';\n yield cleanURL.href;\n }\n\n if (urlManipulation) {\n const additionalURLs = urlManipulation({url: urlObject});\n for (const urlToAttempt of additionalURLs) {\n yield urlToAttempt.href;\n }\n }\n}\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n/**\n * Removes any URL search parameters that should be ignored.\n *\n * @param {URL} urlObject The original URL.\n * @param {Array} ignoreURLParametersMatching RegExps to test against\n * each search parameter name. Matches mean that the search parameter should be\n * ignored.\n * @return {URL} The URL with any ignored search parameters removed.\n *\n * @private\n * @memberof module:workbox-precaching\n */\nexport function removeIgnoredSearchParams(urlObject,\n ignoreURLParametersMatching) {\n // Convert the iterable into an array at the start of the loop to make sure\n // deletion doesn't mess up iteration.\n for (const paramName of [...urlObject.searchParams.keys()]) {\n if (ignoreURLParametersMatching.some((regExp) => regExp.test(paramName))) {\n urlObject.searchParams.delete(paramName);\n }\n }\n\n return urlObject;\n}\n","\n/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {addFetchListener} from './utils/addFetchListener.mjs';\nimport './_version.mjs';\n\n\nlet listenerAdded = false;\n\n/**\n * Add a `fetch` listener to the service worker that will\n * respond to\n * [network requests]{@link https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#Custom_responses_to_requests}\n * with precached assets.\n *\n * Requests for assets that aren't precached, the `FetchEvent` will not be\n * responded to, allowing the event to fall through to other `fetch` event\n * listeners.\n *\n * @param {Object} options\n * @param {string} [options.directoryIndex=index.html] The `directoryIndex` will\n * check cache entries for a URLs ending with '/' to see if there is a hit when\n * appending the `directoryIndex` value.\n * @param {Array} [options.ignoreURLParametersMatching=[/^utm_/]] An\n * array of regex's to remove search params when looking for a cache match.\n * @param {boolean} [options.cleanURLs=true] The `cleanURLs` option will\n * check the cache for the URL with a `.html` added to the end of the end.\n * @param {workbox.precaching~urlManipulation} [options.urlManipulation]\n * This is a function that should take a URL and return an array of\n * alternative URL's that should be checked for precache matches.\n *\n * @alias workbox.precaching.addRoute\n */\nexport const addRoute = (options) => {\n if (!listenerAdded) {\n addFetchListener(options);\n listenerAdded = true;\n }\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {cacheNames} from 'workbox-core/_private/cacheNames.mjs';\nimport {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {getCacheKeyForURL} from './getCacheKeyForURL.mjs';\nimport '../_version.mjs';\n\n\n/**\n * Adds a `fetch` listener to the service worker that will\n * respond to\n * [network requests]{@link https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#Custom_responses_to_requests}\n * with precached assets.\n *\n * Requests for assets that aren't precached, the `FetchEvent` will not be\n * responded to, allowing the event to fall through to other `fetch` event\n * listeners.\n *\n * NOTE: when called more than once this method will replace the previously set\n * configuration options. Calling it more than once is not recommended outside\n * of tests.\n *\n * @private\n * @param {Object} options\n * @param {string} [options.directoryIndex=index.html] The `directoryIndex` will\n * check cache entries for a URLs ending with '/' to see if there is a hit when\n * appending the `directoryIndex` value.\n * @param {Array} [options.ignoreURLParametersMatching=[/^utm_/]] An\n * array of regex's to remove search params when looking for a cache match.\n * @param {boolean} [options.cleanURLs=true] The `cleanURLs` option will\n * check the cache for the URL with a `.html` added to the end of the end.\n * @param {workbox.precaching~urlManipulation} [options.urlManipulation]\n * This is a function that should take a URL and return an array of\n * alternative URL's that should be checked for precache matches.\n */\nexport const addFetchListener = ({\n ignoreURLParametersMatching = [/^utm_/],\n directoryIndex = 'index.html',\n cleanURLs = true,\n urlManipulation = null,\n} = {}) => {\n const cacheName = cacheNames.getPrecacheName();\n\n addEventListener('fetch', (event) => {\n const precachedURL = getCacheKeyForURL(event.request.url, {\n cleanURLs,\n directoryIndex,\n ignoreURLParametersMatching,\n urlManipulation,\n });\n if (!precachedURL) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Precaching did not find a match for ` +\n getFriendlyURL(event.request.url));\n }\n return;\n }\n\n let responsePromise = caches.open(cacheName).then((cache) => {\n return cache.match(precachedURL);\n }).then((cachedResponse) => {\n if (cachedResponse) {\n return cachedResponse;\n }\n\n // Fall back to the network if we don't have a cached response\n // (perhaps due to manual cache cleanup).\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`The precached response for ` +\n `${getFriendlyURL(precachedURL)} in ${cacheName} was not found. ` +\n `Falling back to the network instead.`);\n }\n\n return fetch(precachedURL);\n });\n\n if (process.env.NODE_ENV !== 'production') {\n responsePromise = responsePromise.then((response) => {\n // Workbox is going to handle the route.\n // print the routing details to the console.\n logger.groupCollapsed(`Precaching is responding to: ` +\n getFriendlyURL(event.request.url));\n logger.log(`Serving the precached url: ${precachedURL}`);\n\n logger.groupCollapsed(`View request details here.`);\n logger.log(event.request);\n logger.groupEnd();\n\n logger.groupCollapsed(`View response details here.`);\n logger.log(response);\n logger.groupEnd();\n\n logger.groupEnd();\n return response;\n });\n }\n\n event.respondWith(responsePromise);\n });\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {getOrCreatePrecacheController} from './utils/getOrCreatePrecacheController.mjs';\nimport {precachePlugins} from './utils/precachePlugins.mjs';\nimport './_version.mjs';\n\n\nconst installListener = (event) => {\n const precacheController = getOrCreatePrecacheController();\n const plugins = precachePlugins.get();\n\n event.waitUntil(\n precacheController.install({event, plugins})\n .catch((error) => {\n if (process.env.NODE_ENV !== 'production') {\n logger.error(`Service worker installation failed. It will ` +\n `be retried automatically during the next navigation.`);\n }\n // Re-throw the error to ensure installation fails.\n throw error;\n })\n );\n};\n\nconst activateListener = (event) => {\n const precacheController = getOrCreatePrecacheController();\n const plugins = precachePlugins.get();\n\n event.waitUntil(precacheController.activate({event, plugins}));\n};\n\n/**\n * Adds items to the precache list, removing any duplicates and\n * stores the files in the\n * [\"precache cache\"]{@link module:workbox-core.cacheNames} when the service\n * worker installs.\n *\n * This method can be called multiple times.\n *\n * Please note: This method **will not** serve any of the cached files for you.\n * It only precaches files. To respond to a network request you call\n * [addRoute()]{@link module:workbox-precaching.addRoute}.\n *\n * If you have a single array of files to precache, you can just call\n * [precacheAndRoute()]{@link module:workbox-precaching.precacheAndRoute}.\n *\n * @param {Array} entries Array of entries to precache.\n *\n * @alias workbox.precaching.precache\n */\nexport const precache = (entries) => {\n const precacheController = getOrCreatePrecacheController();\n precacheController.addToCacheList(entries);\n\n if (entries.length > 0) {\n // NOTE: these listeners will only be added once (even if the `precache()`\n // method is called multiple times) because event listeners are implemented\n // as a set, where each listener must be unique.\n addEventListener('install', installListener);\n addEventListener('activate', activateListener);\n }\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {precachePlugins} from './utils/precachePlugins.mjs';\nimport './_version.mjs';\n\n\n/**\n * Adds plugins to precaching.\n *\n * @param {Array} newPlugins\n *\n * @alias workbox.precaching.addPlugins\n */\nconst addPlugins = (newPlugins) => {\n precachePlugins.add(newPlugins);\n};\n\nexport {addPlugins};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {cacheNames} from 'workbox-core/_private/cacheNames.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {deleteOutdatedCaches} from './utils/deleteOutdatedCaches.mjs';\nimport './_version.mjs';\n\n\n/**\n * Adds an `activate` event listener which will clean up incompatible\n * precaches that were created by older versions of Workbox.\n *\n * @alias workbox.precaching.cleanupOutdatedCaches\n */\nexport const cleanupOutdatedCaches = () => {\n addEventListener('activate', (event) => {\n const cacheName = cacheNames.getPrecacheName();\n\n event.waitUntil(deleteOutdatedCaches(cacheName).then((cachesDeleted) => {\n if (process.env.NODE_ENV !== 'production') {\n if (cachesDeleted.length > 0) {\n logger.log(`The following out-of-date precaches were cleaned up ` +\n `automatically:`, cachesDeleted);\n }\n }\n }));\n });\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\nconst SUBSTRING_TO_FIND = '-precache-';\n\n/**\n * Cleans up incompatible precaches that were created by older versions of\n * Workbox, by a service worker registered under the current scope.\n *\n * This is meant to be called as part of the `activate` event.\n *\n * This should be safe to use as long as you don't include `substringToFind`\n * (defaulting to `-precache-`) in your non-precache cache names.\n *\n * @param {string} currentPrecacheName The cache name currently in use for\n * precaching. This cache won't be deleted.\n * @param {string} [substringToFind='-precache-'] Cache names which include this\n * substring will be deleted (excluding `currentPrecacheName`).\n * @return {Array} A list of all the cache names that were deleted.\n *\n * @private\n * @memberof module:workbox-precaching\n */\nconst deleteOutdatedCaches = async (\n currentPrecacheName,\n substringToFind = SUBSTRING_TO_FIND) => {\n const cacheNames = await caches.keys();\n\n const cacheNamesToDelete = cacheNames.filter((cacheName) => {\n return cacheName.includes(substringToFind) &&\n cacheName.includes(self.registration.scope) &&\n cacheName !== currentPrecacheName;\n });\n\n await Promise.all(\n cacheNamesToDelete.map((cacheName) => caches.delete(cacheName)));\n\n return cacheNamesToDelete;\n};\n\nexport {deleteOutdatedCaches};\n\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {getOrCreatePrecacheController}\n from './utils/getOrCreatePrecacheController.mjs';\nimport './_version.mjs';\n\n\n/**\n * Takes in a URL, and returns the corresponding URL that could be used to\n * lookup the entry in the precache.\n *\n * If a relative URL is provided, the location of the service worker file will\n * be used as the base.\n *\n * For precached entries without revision information, the cache key will be the\n * same as the original URL.\n *\n * For precached entries with revision information, the cache key will be the\n * original URL with the addition of a query parameter used for keeping track of\n * the revision info.\n *\n * @param {string} url The URL whose cache key to look up.\n * @return {string} The cache key that corresponds to that URL.\n *\n * @alias workbox.precaching.getCacheKeyForURL\n */\nexport const getCacheKeyForURL = (url) => {\n const precacheController = getOrCreatePrecacheController();\n return precacheController.getCacheKeyForURL(url);\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {addRoute} from './addRoute.mjs';\nimport {precache} from './precache.mjs';\nimport './_version.mjs';\n\n\n/**\n * This method will add entries to the precache list and add a route to\n * respond to fetch events.\n *\n * This is a convenience method that will call\n * [precache()]{@link module:workbox-precaching.precache} and\n * [addRoute()]{@link module:workbox-precaching.addRoute} in a single call.\n *\n * @param {Array} entries Array of entries to precache.\n * @param {Object} options See\n * [addRoute() options]{@link module:workbox-precaching.addRoute}.\n *\n * @alias workbox.precaching.precacheAndRoute\n */\nexport const precacheAndRoute = (entries, options) => {\n precache(entries);\n addRoute(options);\n};\n"],"names":["self","_","e","plugins","precachePlugins","get","add","newPlugins","push","REVISION_SEARCH_PARAM","createCacheKey","entry","WorkboxError","urlObject","URL","location","cacheKey","href","url","revision","originalURL","cacheKeyURL","searchParams","set","PrecacheController","constructor","cacheName","_cacheName","cacheNames","getPrecacheName","_urlsToCacheKeys","Map","addToCacheList","entries","this","has","firstEntry","secondEntry","event","urlsToPrecache","urlsAlreadyPrecached","cache","caches","open","alreadyCachedRequests","keys","alreadyCachedURLs","Set","map","request","values","precacheRequests","_addURLToCache","Promise","all","updatedURLs","notUpdatedURLs","currentlyCachedRequests","expectedCacheKeys","deletedURLs","delete","Request","credentials","cacheWillUpdateCallback","response","fetchWrapper","fetch","plugin","cacheWillUpdate","bind","status","redirected","async","clonedResponse","clone","bodyPromise","resolve","body","blob","Response","headers","statusText","cleanRedirect","cacheWrapper","put","matchOptions","ignoreSearch","getURLsToCacheKeys","getCachedURLs","getCacheKeyForURL","precacheController","getOrCreatePrecacheController","options","urlsToCacheKeys","possibleURL","ignoreURLParametersMatching","directoryIndex","cleanURLs","urlManipulation","hash","urlWithoutIgnoredParams","paramName","some","regExp","test","removeIgnoredSearchParams","pathname","endsWith","directoryURL","cleanURL","additionalURLs","urlToAttempt","generateURLVariations","possibleCacheKey","listenerAdded","addRoute","addEventListener","precachedURL","responsePromise","then","match","cachedResponse","respondWith","addFetchListener","installListener","waitUntil","install","catch","error","activateListener","activate","precache","length","currentPrecacheName","substringToFind","cacheNamesToDelete","filter","includes","registration","scope","deleteOutdatedCaches","cachesDeleted"],"mappings":"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"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-range-requests.dev.js b/workbox-v4.3.1/workbox-range-requests.dev.js new file mode 100644 index 00000000..2c0609dc --- /dev/null +++ b/workbox-v4.3.1/workbox-range-requests.dev.js @@ -0,0 +1,268 @@ +this.workbox = this.workbox || {}; +this.workbox.rangeRequests = (function (exports, WorkboxError_mjs, assert_mjs, logger_mjs) { + 'use strict'; + + try { + self['workbox:range-requests:4.3.1'] && _(); + } catch (e) {} // eslint-disable-line + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * @param {Blob} blob A source blob. + * @param {number|null} start The offset to use as the start of the + * slice. + * @param {number|null} end The offset to use as the end of the slice. + * @return {Object} An object with `start` and `end` properties, reflecting + * the effective boundaries to use given the size of the blob. + * + * @private + */ + + function calculateEffectiveBoundaries(blob, start, end) { + { + assert_mjs.assert.isInstance(blob, Blob, { + moduleName: 'workbox-range-requests', + funcName: 'calculateEffectiveBoundaries', + paramName: 'blob' + }); + } + + const blobSize = blob.size; + + if (end > blobSize || start < 0) { + throw new WorkboxError_mjs.WorkboxError('range-not-satisfiable', { + size: blobSize, + end, + start + }); + } + + let effectiveStart; + let effectiveEnd; + + if (start === null) { + effectiveStart = blobSize - end; + effectiveEnd = blobSize; + } else if (end === null) { + effectiveStart = start; + effectiveEnd = blobSize; + } else { + effectiveStart = start; // Range values are inclusive, so add 1 to the value. + + effectiveEnd = end + 1; + } + + return { + start: effectiveStart, + end: effectiveEnd + }; + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * @param {string} rangeHeader A Range: header value. + * @return {Object} An object with `start` and `end` properties, reflecting + * the parsed value of the Range: header. If either the `start` or `end` are + * omitted, then `null` will be returned. + * + * @private + */ + + function parseRangeHeader(rangeHeader) { + { + assert_mjs.assert.isType(rangeHeader, 'string', { + moduleName: 'workbox-range-requests', + funcName: 'parseRangeHeader', + paramName: 'rangeHeader' + }); + } + + const normalizedRangeHeader = rangeHeader.trim().toLowerCase(); + + if (!normalizedRangeHeader.startsWith('bytes=')) { + throw new WorkboxError_mjs.WorkboxError('unit-must-be-bytes', { + normalizedRangeHeader + }); + } // Specifying multiple ranges separate by commas is valid syntax, but this + // library only attempts to handle a single, contiguous sequence of bytes. + // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Range#Syntax + + + if (normalizedRangeHeader.includes(',')) { + throw new WorkboxError_mjs.WorkboxError('single-range-only', { + normalizedRangeHeader + }); + } + + const rangeParts = /(\d*)-(\d*)/.exec(normalizedRangeHeader); // We need either at least one of the start or end values. + + if (rangeParts === null || !(rangeParts[1] || rangeParts[2])) { + throw new WorkboxError_mjs.WorkboxError('invalid-range-values', { + normalizedRangeHeader + }); + } + + return { + start: rangeParts[1] === '' ? null : Number(rangeParts[1]), + end: rangeParts[2] === '' ? null : Number(rangeParts[2]) + }; + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Given a `Request` and `Response` objects as input, this will return a + * promise for a new `Response`. + * + * If the original `Response` already contains partial content (i.e. it has + * a status of 206), then this assumes it already fulfills the `Range:` + * requirements, and will return it as-is. + * + * @param {Request} request A request, which should contain a Range: + * header. + * @param {Response} originalResponse A response. + * @return {Promise} Either a `206 Partial Content` response, with + * the response body set to the slice of content specified by the request's + * `Range:` header, or a `416 Range Not Satisfiable` response if the + * conditions of the `Range:` header can't be met. + * + * @memberof workbox.rangeRequests + */ + + async function createPartialResponse(request, originalResponse) { + try { + { + assert_mjs.assert.isInstance(request, Request, { + moduleName: 'workbox-range-requests', + funcName: 'createPartialResponse', + paramName: 'request' + }); + assert_mjs.assert.isInstance(originalResponse, Response, { + moduleName: 'workbox-range-requests', + funcName: 'createPartialResponse', + paramName: 'originalResponse' + }); + } + + if (originalResponse.status === 206) { + // If we already have a 206, then just pass it through as-is; + // see https://github.com/GoogleChrome/workbox/issues/1720 + return originalResponse; + } + + const rangeHeader = request.headers.get('range'); + + if (!rangeHeader) { + throw new WorkboxError_mjs.WorkboxError('no-range-header'); + } + + const boundaries = parseRangeHeader(rangeHeader); + const originalBlob = await originalResponse.blob(); + const effectiveBoundaries = calculateEffectiveBoundaries(originalBlob, boundaries.start, boundaries.end); + const slicedBlob = originalBlob.slice(effectiveBoundaries.start, effectiveBoundaries.end); + const slicedBlobSize = slicedBlob.size; + const slicedResponse = new Response(slicedBlob, { + // Status code 206 is for a Partial Content response. + // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/206 + status: 206, + statusText: 'Partial Content', + headers: originalResponse.headers + }); + slicedResponse.headers.set('Content-Length', slicedBlobSize); + slicedResponse.headers.set('Content-Range', `bytes ${effectiveBoundaries.start}-${effectiveBoundaries.end - 1}/` + originalBlob.size); + return slicedResponse; + } catch (error) { + { + logger_mjs.logger.warn(`Unable to construct a partial response; returning a ` + `416 Range Not Satisfiable response instead.`); + logger_mjs.logger.groupCollapsed(`View details here.`); + logger_mjs.logger.log(error); + logger_mjs.logger.log(request); + logger_mjs.logger.log(originalResponse); + logger_mjs.logger.groupEnd(); + } + + return new Response('', { + status: 416, + statusText: 'Range Not Satisfiable' + }); + } + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * The range request plugin makes it easy for a request with a 'Range' header to + * be fulfilled by a cached response. + * + * It does this by intercepting the `cachedResponseWillBeUsed` plugin callback + * and returning the appropriate subset of the cached response body. + * + * @memberof workbox.rangeRequests + */ + + class Plugin { + /** + * @param {Object} options + * @param {Request} options.request The original request, which may or may not + * contain a Range: header. + * @param {Response} options.cachedResponse The complete cached response. + * @return {Promise} If request contains a 'Range' header, then a + * new response with status 206 whose body is a subset of `cachedResponse` is + * returned. Otherwise, `cachedResponse` is returned as-is. + * + * @private + */ + async cachedResponseWillBeUsed({ + request, + cachedResponse + }) { + // Only return a sliced response if there's something valid in the cache, + // and there's a Range: header in the request. + if (cachedResponse && request.headers.has('range')) { + return await createPartialResponse(request, cachedResponse); + } // If there was no Range: header, or if cachedResponse wasn't valid, just + // pass it through as-is. + + + return cachedResponse; + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + + exports.createPartialResponse = createPartialResponse; + exports.Plugin = Plugin; + + return exports; + +}({}, workbox.core._private, workbox.core._private, workbox.core._private)); +//# sourceMappingURL=workbox-range-requests.dev.js.map diff --git a/workbox-v4.3.1/workbox-range-requests.dev.js.map b/workbox-v4.3.1/workbox-range-requests.dev.js.map new file mode 100644 index 00000000..c1779fca --- /dev/null +++ b/workbox-v4.3.1/workbox-range-requests.dev.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-range-requests.dev.js","sources":["../_version.mjs","../utils/calculateEffectiveBoundaries.mjs","../utils/parseRangeHeader.mjs","../createPartialResponse.mjs","../Plugin.mjs","../index.mjs"],"sourcesContent":["try{self['workbox:range-requests:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {assert} from 'workbox-core/_private/assert.mjs';\n\nimport '../_version.mjs';\n\n/**\n * @param {Blob} blob A source blob.\n * @param {number|null} start The offset to use as the start of the\n * slice.\n * @param {number|null} end The offset to use as the end of the slice.\n * @return {Object} An object with `start` and `end` properties, reflecting\n * the effective boundaries to use given the size of the blob.\n *\n * @private\n */\nfunction calculateEffectiveBoundaries(blob, start, end) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(blob, Blob, {\n moduleName: 'workbox-range-requests',\n funcName: 'calculateEffectiveBoundaries',\n paramName: 'blob',\n });\n }\n\n const blobSize = blob.size;\n\n if (end > blobSize || start < 0) {\n throw new WorkboxError('range-not-satisfiable', {\n size: blobSize,\n end,\n start,\n });\n }\n\n let effectiveStart;\n let effectiveEnd;\n\n if (start === null) {\n effectiveStart = blobSize - end;\n effectiveEnd = blobSize;\n } else if (end === null) {\n effectiveStart = start;\n effectiveEnd = blobSize;\n } else {\n effectiveStart = start;\n // Range values are inclusive, so add 1 to the value.\n effectiveEnd = end + 1;\n }\n\n return {\n start: effectiveStart,\n end: effectiveEnd,\n };\n}\n\nexport {calculateEffectiveBoundaries};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {assert} from 'workbox-core/_private/assert.mjs';\n\nimport '../_version.mjs';\n\n/**\n * @param {string} rangeHeader A Range: header value.\n * @return {Object} An object with `start` and `end` properties, reflecting\n * the parsed value of the Range: header. If either the `start` or `end` are\n * omitted, then `null` will be returned.\n *\n * @private\n */\nfunction parseRangeHeader(rangeHeader) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(rangeHeader, 'string', {\n moduleName: 'workbox-range-requests',\n funcName: 'parseRangeHeader',\n paramName: 'rangeHeader',\n });\n }\n\n const normalizedRangeHeader = rangeHeader.trim().toLowerCase();\n if (!normalizedRangeHeader.startsWith('bytes=')) {\n throw new WorkboxError('unit-must-be-bytes', {normalizedRangeHeader});\n }\n\n // Specifying multiple ranges separate by commas is valid syntax, but this\n // library only attempts to handle a single, contiguous sequence of bytes.\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Range#Syntax\n if (normalizedRangeHeader.includes(',')) {\n throw new WorkboxError('single-range-only', {normalizedRangeHeader});\n }\n\n const rangeParts = /(\\d*)-(\\d*)/.exec(normalizedRangeHeader);\n // We need either at least one of the start or end values.\n if (rangeParts === null || !(rangeParts[1] || rangeParts[2])) {\n throw new WorkboxError('invalid-range-values', {normalizedRangeHeader});\n }\n\n return {\n start: rangeParts[1] === '' ? null : Number(rangeParts[1]),\n end: rangeParts[2] === '' ? null : Number(rangeParts[2]),\n };\n}\n\nexport {parseRangeHeader};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\n\nimport {calculateEffectiveBoundaries} from\n './utils/calculateEffectiveBoundaries.mjs';\nimport {parseRangeHeader} from './utils/parseRangeHeader.mjs';\n\nimport './_version.mjs';\n\n/**\n * Given a `Request` and `Response` objects as input, this will return a\n * promise for a new `Response`.\n *\n * If the original `Response` already contains partial content (i.e. it has\n * a status of 206), then this assumes it already fulfills the `Range:`\n * requirements, and will return it as-is.\n *\n * @param {Request} request A request, which should contain a Range:\n * header.\n * @param {Response} originalResponse A response.\n * @return {Promise} Either a `206 Partial Content` response, with\n * the response body set to the slice of content specified by the request's\n * `Range:` header, or a `416 Range Not Satisfiable` response if the\n * conditions of the `Range:` header can't be met.\n *\n * @memberof workbox.rangeRequests\n */\nasync function createPartialResponse(request, originalResponse) {\n try {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-range-requests',\n funcName: 'createPartialResponse',\n paramName: 'request',\n });\n\n assert.isInstance(originalResponse, Response, {\n moduleName: 'workbox-range-requests',\n funcName: 'createPartialResponse',\n paramName: 'originalResponse',\n });\n }\n\n if (originalResponse.status === 206) {\n // If we already have a 206, then just pass it through as-is;\n // see https://github.com/GoogleChrome/workbox/issues/1720\n return originalResponse;\n }\n\n const rangeHeader = request.headers.get('range');\n if (!rangeHeader) {\n throw new WorkboxError('no-range-header');\n }\n\n const boundaries = parseRangeHeader(rangeHeader);\n const originalBlob = await originalResponse.blob();\n\n const effectiveBoundaries = calculateEffectiveBoundaries(\n originalBlob, boundaries.start, boundaries.end);\n\n const slicedBlob = originalBlob.slice(effectiveBoundaries.start,\n effectiveBoundaries.end);\n const slicedBlobSize = slicedBlob.size;\n\n const slicedResponse = new Response(slicedBlob, {\n // Status code 206 is for a Partial Content response.\n // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/206\n status: 206,\n statusText: 'Partial Content',\n headers: originalResponse.headers,\n });\n\n slicedResponse.headers.set('Content-Length', slicedBlobSize);\n slicedResponse.headers.set('Content-Range',\n `bytes ${effectiveBoundaries.start}-${effectiveBoundaries.end - 1}/` +\n originalBlob.size);\n\n return slicedResponse;\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`Unable to construct a partial response; returning a ` +\n `416 Range Not Satisfiable response instead.`);\n logger.groupCollapsed(`View details here.`);\n logger.log(error);\n logger.log(request);\n logger.log(originalResponse);\n logger.groupEnd();\n }\n\n return new Response('', {\n status: 416,\n statusText: 'Range Not Satisfiable',\n });\n }\n}\n\nexport {createPartialResponse};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {createPartialResponse} from './createPartialResponse.mjs';\n\nimport './_version.mjs';\n\n/**\n * The range request plugin makes it easy for a request with a 'Range' header to\n * be fulfilled by a cached response.\n *\n * It does this by intercepting the `cachedResponseWillBeUsed` plugin callback\n * and returning the appropriate subset of the cached response body.\n *\n * @memberof workbox.rangeRequests\n */\nclass Plugin {\n /**\n * @param {Object} options\n * @param {Request} options.request The original request, which may or may not\n * contain a Range: header.\n * @param {Response} options.cachedResponse The complete cached response.\n * @return {Promise} If request contains a 'Range' header, then a\n * new response with status 206 whose body is a subset of `cachedResponse` is\n * returned. Otherwise, `cachedResponse` is returned as-is.\n *\n * @private\n */\n async cachedResponseWillBeUsed({request, cachedResponse}) {\n // Only return a sliced response if there's something valid in the cache,\n // and there's a Range: header in the request.\n if (cachedResponse && request.headers.has('range')) {\n return await createPartialResponse(request, cachedResponse);\n }\n\n // If there was no Range: header, or if cachedResponse wasn't valid, just\n // pass it through as-is.\n return cachedResponse;\n }\n}\n\nexport {Plugin};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {createPartialResponse} from './createPartialResponse.mjs';\nimport {Plugin} from './Plugin.mjs';\nimport './_version.mjs';\n\n\n/**\n * @namespace workbox.rangeRequests\n */\n\nexport {\n createPartialResponse,\n Plugin,\n};\n"],"names":["self","_","e","calculateEffectiveBoundaries","blob","start","end","assert","isInstance","Blob","moduleName","funcName","paramName","blobSize","size","WorkboxError","effectiveStart","effectiveEnd","parseRangeHeader","rangeHeader","isType","normalizedRangeHeader","trim","toLowerCase","startsWith","includes","rangeParts","exec","Number","createPartialResponse","request","originalResponse","Request","Response","status","headers","get","boundaries","originalBlob","effectiveBoundaries","slicedBlob","slice","slicedBlobSize","slicedResponse","statusText","set","error","logger","warn","groupCollapsed","log","groupEnd","Plugin","cachedResponseWillBeUsed","cachedResponse","has"],"mappings":"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"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-range-requests.prod.js b/workbox-v4.3.1/workbox-range-requests.prod.js new file mode 100644 index 00000000..e60370cb --- /dev/null +++ b/workbox-v4.3.1/workbox-range-requests.prod.js @@ -0,0 +1,2 @@ +this.workbox=this.workbox||{},this.workbox.rangeRequests=function(e,n){"use strict";try{self["workbox:range-requests:4.3.1"]&&_()}catch(e){}async function t(e,t){try{if(206===t.status)return t;const s=e.headers.get("range");if(!s)throw new n.WorkboxError("no-range-header");const a=function(e){const t=e.trim().toLowerCase();if(!t.startsWith("bytes="))throw new n.WorkboxError("unit-must-be-bytes",{normalizedRangeHeader:t});if(t.includes(","))throw new n.WorkboxError("single-range-only",{normalizedRangeHeader:t});const s=/(\d*)-(\d*)/.exec(t);if(null===s||!s[1]&&!s[2])throw new n.WorkboxError("invalid-range-values",{normalizedRangeHeader:t});return{start:""===s[1]?null:Number(s[1]),end:""===s[2]?null:Number(s[2])}}(s),r=await t.blob(),i=function(e,t,s){const a=e.size;if(s>a||t<0)throw new n.WorkboxError("range-not-satisfiable",{size:a,end:s,start:t});let r,i;return null===t?(r=a-s,i=a):null===s?(r=t,i=a):(r=t,i=s+1),{start:r,end:i}}(r,a.start,a.end),o=r.slice(i.start,i.end),u=o.size,l=new Response(o,{status:206,statusText:"Partial Content",headers:t.headers});return l.headers.set("Content-Length",u),l.headers.set("Content-Range",`bytes ${i.start}-${i.end-1}/`+r.size),l}catch(e){return new Response("",{status:416,statusText:"Range Not Satisfiable"})}}return e.createPartialResponse=t,e.Plugin=class{async cachedResponseWillBeUsed({request:e,cachedResponse:n}){return n&&e.headers.has("range")?await t(e,n):n}},e}({},workbox.core._private); +//# sourceMappingURL=workbox-range-requests.prod.js.map diff --git a/workbox-v4.3.1/workbox-range-requests.prod.js.map b/workbox-v4.3.1/workbox-range-requests.prod.js.map new file mode 100644 index 00000000..89bef827 --- /dev/null +++ b/workbox-v4.3.1/workbox-range-requests.prod.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-range-requests.prod.js","sources":["../_version.mjs","../createPartialResponse.mjs","../utils/parseRangeHeader.mjs","../utils/calculateEffectiveBoundaries.mjs","../Plugin.mjs"],"sourcesContent":["try{self['workbox:range-requests:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\n\nimport {calculateEffectiveBoundaries} from\n './utils/calculateEffectiveBoundaries.mjs';\nimport {parseRangeHeader} from './utils/parseRangeHeader.mjs';\n\nimport './_version.mjs';\n\n/**\n * Given a `Request` and `Response` objects as input, this will return a\n * promise for a new `Response`.\n *\n * If the original `Response` already contains partial content (i.e. it has\n * a status of 206), then this assumes it already fulfills the `Range:`\n * requirements, and will return it as-is.\n *\n * @param {Request} request A request, which should contain a Range:\n * header.\n * @param {Response} originalResponse A response.\n * @return {Promise} Either a `206 Partial Content` response, with\n * the response body set to the slice of content specified by the request's\n * `Range:` header, or a `416 Range Not Satisfiable` response if the\n * conditions of the `Range:` header can't be met.\n *\n * @memberof workbox.rangeRequests\n */\nasync function createPartialResponse(request, originalResponse) {\n try {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-range-requests',\n funcName: 'createPartialResponse',\n paramName: 'request',\n });\n\n assert.isInstance(originalResponse, Response, {\n moduleName: 'workbox-range-requests',\n funcName: 'createPartialResponse',\n paramName: 'originalResponse',\n });\n }\n\n if (originalResponse.status === 206) {\n // If we already have a 206, then just pass it through as-is;\n // see https://github.com/GoogleChrome/workbox/issues/1720\n return originalResponse;\n }\n\n const rangeHeader = request.headers.get('range');\n if (!rangeHeader) {\n throw new WorkboxError('no-range-header');\n }\n\n const boundaries = parseRangeHeader(rangeHeader);\n const originalBlob = await originalResponse.blob();\n\n const effectiveBoundaries = calculateEffectiveBoundaries(\n originalBlob, boundaries.start, boundaries.end);\n\n const slicedBlob = originalBlob.slice(effectiveBoundaries.start,\n effectiveBoundaries.end);\n const slicedBlobSize = slicedBlob.size;\n\n const slicedResponse = new Response(slicedBlob, {\n // Status code 206 is for a Partial Content response.\n // See https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/206\n status: 206,\n statusText: 'Partial Content',\n headers: originalResponse.headers,\n });\n\n slicedResponse.headers.set('Content-Length', slicedBlobSize);\n slicedResponse.headers.set('Content-Range',\n `bytes ${effectiveBoundaries.start}-${effectiveBoundaries.end - 1}/` +\n originalBlob.size);\n\n return slicedResponse;\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`Unable to construct a partial response; returning a ` +\n `416 Range Not Satisfiable response instead.`);\n logger.groupCollapsed(`View details here.`);\n logger.log(error);\n logger.log(request);\n logger.log(originalResponse);\n logger.groupEnd();\n }\n\n return new Response('', {\n status: 416,\n statusText: 'Range Not Satisfiable',\n });\n }\n}\n\nexport {createPartialResponse};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {assert} from 'workbox-core/_private/assert.mjs';\n\nimport '../_version.mjs';\n\n/**\n * @param {string} rangeHeader A Range: header value.\n * @return {Object} An object with `start` and `end` properties, reflecting\n * the parsed value of the Range: header. If either the `start` or `end` are\n * omitted, then `null` will be returned.\n *\n * @private\n */\nfunction parseRangeHeader(rangeHeader) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(rangeHeader, 'string', {\n moduleName: 'workbox-range-requests',\n funcName: 'parseRangeHeader',\n paramName: 'rangeHeader',\n });\n }\n\n const normalizedRangeHeader = rangeHeader.trim().toLowerCase();\n if (!normalizedRangeHeader.startsWith('bytes=')) {\n throw new WorkboxError('unit-must-be-bytes', {normalizedRangeHeader});\n }\n\n // Specifying multiple ranges separate by commas is valid syntax, but this\n // library only attempts to handle a single, contiguous sequence of bytes.\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Range#Syntax\n if (normalizedRangeHeader.includes(',')) {\n throw new WorkboxError('single-range-only', {normalizedRangeHeader});\n }\n\n const rangeParts = /(\\d*)-(\\d*)/.exec(normalizedRangeHeader);\n // We need either at least one of the start or end values.\n if (rangeParts === null || !(rangeParts[1] || rangeParts[2])) {\n throw new WorkboxError('invalid-range-values', {normalizedRangeHeader});\n }\n\n return {\n start: rangeParts[1] === '' ? null : Number(rangeParts[1]),\n end: rangeParts[2] === '' ? null : Number(rangeParts[2]),\n };\n}\n\nexport {parseRangeHeader};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {assert} from 'workbox-core/_private/assert.mjs';\n\nimport '../_version.mjs';\n\n/**\n * @param {Blob} blob A source blob.\n * @param {number|null} start The offset to use as the start of the\n * slice.\n * @param {number|null} end The offset to use as the end of the slice.\n * @return {Object} An object with `start` and `end` properties, reflecting\n * the effective boundaries to use given the size of the blob.\n *\n * @private\n */\nfunction calculateEffectiveBoundaries(blob, start, end) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(blob, Blob, {\n moduleName: 'workbox-range-requests',\n funcName: 'calculateEffectiveBoundaries',\n paramName: 'blob',\n });\n }\n\n const blobSize = blob.size;\n\n if (end > blobSize || start < 0) {\n throw new WorkboxError('range-not-satisfiable', {\n size: blobSize,\n end,\n start,\n });\n }\n\n let effectiveStart;\n let effectiveEnd;\n\n if (start === null) {\n effectiveStart = blobSize - end;\n effectiveEnd = blobSize;\n } else if (end === null) {\n effectiveStart = start;\n effectiveEnd = blobSize;\n } else {\n effectiveStart = start;\n // Range values are inclusive, so add 1 to the value.\n effectiveEnd = end + 1;\n }\n\n return {\n start: effectiveStart,\n end: effectiveEnd,\n };\n}\n\nexport {calculateEffectiveBoundaries};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {createPartialResponse} from './createPartialResponse.mjs';\n\nimport './_version.mjs';\n\n/**\n * The range request plugin makes it easy for a request with a 'Range' header to\n * be fulfilled by a cached response.\n *\n * It does this by intercepting the `cachedResponseWillBeUsed` plugin callback\n * and returning the appropriate subset of the cached response body.\n *\n * @memberof workbox.rangeRequests\n */\nclass Plugin {\n /**\n * @param {Object} options\n * @param {Request} options.request The original request, which may or may not\n * contain a Range: header.\n * @param {Response} options.cachedResponse The complete cached response.\n * @return {Promise} If request contains a 'Range' header, then a\n * new response with status 206 whose body is a subset of `cachedResponse` is\n * returned. Otherwise, `cachedResponse` is returned as-is.\n *\n * @private\n */\n async cachedResponseWillBeUsed({request, cachedResponse}) {\n // Only return a sliced response if there's something valid in the cache,\n // and there's a Range: header in the request.\n if (cachedResponse && request.headers.has('range')) {\n return await createPartialResponse(request, cachedResponse);\n }\n\n // If there was no Range: header, or if cachedResponse wasn't valid, just\n // pass it through as-is.\n return cachedResponse;\n }\n}\n\nexport {Plugin};\n"],"names":["self","_","e","async","createPartialResponse","request","originalResponse","status","rangeHeader","headers","get","WorkboxError","boundaries","normalizedRangeHeader","trim","toLowerCase","startsWith","includes","rangeParts","exec","start","Number","end","parseRangeHeader","originalBlob","blob","effectiveBoundaries","blobSize","size","effectiveStart","effectiveEnd","calculateEffectiveBoundaries","slicedBlob","slice","slicedBlobSize","slicedResponse","Response","statusText","set","error","cachedResponse","has"],"mappings":"oFAAA,IAAIA,KAAK,iCAAiCC,IAAI,MAAMC,ICoCpDC,eAAeC,EAAsBC,EAASC,UAgBV,MAA5BA,EAAiBC,cAGZD,QAGHE,EAAcH,EAAQI,QAAQC,IAAI,aACnCF,QACG,IAAIG,eAAa,yBAGnBC,EC1CV,SAA0BJ,SASlBK,EAAwBL,EAAYM,OAAOC,kBAC5CF,EAAsBG,WAAW,gBAC9B,IAAIL,eAAa,qBAAsB,CAACE,sBAAAA,OAM5CA,EAAsBI,SAAS,WAC3B,IAAIN,eAAa,oBAAqB,CAACE,sBAAAA,UAGzCK,EAAa,cAAcC,KAAKN,MAEnB,OAAfK,IAAyBA,EAAW,KAAMA,EAAW,SACjD,IAAIP,eAAa,uBAAwB,CAACE,sBAAAA,UAG3C,CACLO,MAAyB,KAAlBF,EAAW,GAAY,KAAOG,OAAOH,EAAW,IACvDI,IAAuB,KAAlBJ,EAAW,GAAY,KAAOG,OAAOH,EAAW,KDalCK,CAAiBf,GAC9BgB,QAAqBlB,EAAiBmB,OAEtCC,EE3CV,SAAsCD,EAAML,EAAOE,SAS3CK,EAAWF,EAAKG,QAElBN,EAAMK,GAAYP,EAAQ,QACtB,IAAIT,eAAa,wBAAyB,CAC9CiB,KAAMD,EACNL,IAAAA,EACAF,MAAAA,QAIAS,EACAC,SAEU,OAAVV,GACFS,EAAiBF,EAAWL,EAC5BQ,EAAeH,GACE,OAARL,GACTO,EAAiBT,EACjBU,EAAeH,IAEfE,EAAiBT,EAEjBU,EAAeR,EAAM,GAGhB,CACLF,MAAOS,EACPP,IAAKQ,GFOuBC,CACxBP,EAAcZ,EAAWQ,MAAOR,EAAWU,KAEzCU,EAAaR,EAAaS,MAAMP,EAAoBN,MACtDM,EAAoBJ,KAClBY,EAAiBF,EAAWJ,KAE5BO,EAAiB,IAAIC,SAASJ,EAAY,CAG9CzB,OAAQ,IACR8B,WAAY,kBACZ5B,QAASH,EAAiBG,iBAG5B0B,EAAe1B,QAAQ6B,IAAI,iBAAkBJ,GAC7CC,EAAe1B,QAAQ6B,IAAI,yBACdZ,EAAoBN,SAASM,EAAoBJ,IAAM,KAClEE,EAAaI,MAERO,EACP,MAAOI,UAWA,IAAIH,SAAS,GAAI,CACtB7B,OAAQ,IACR8B,WAAY,qEG/ElB,sCAYiChC,QAACA,EAADmC,eAAUA,WAGnCA,GAAkBnC,EAAQI,QAAQgC,IAAI,eAC3BrC,EAAsBC,EAASmC,GAKvCA"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-routing.dev.js b/workbox-v4.3.1/workbox-routing.dev.js new file mode 100644 index 00000000..b3acf069 --- /dev/null +++ b/workbox-v4.3.1/workbox-routing.dev.js @@ -0,0 +1,1020 @@ +this.workbox = this.workbox || {}; +this.workbox.routing = (function (exports, assert_mjs, logger_mjs, cacheNames_mjs, WorkboxError_mjs, getFriendlyURL_mjs) { + 'use strict'; + + try { + self['workbox:routing:4.3.1'] && _(); + } catch (e) {} // eslint-disable-line + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * The default HTTP method, 'GET', used when there's no specific method + * configured for a route. + * + * @type {string} + * + * @private + */ + + const defaultMethod = 'GET'; + /** + * The list of valid HTTP methods associated with requests that could be routed. + * + * @type {Array} + * + * @private + */ + + const validMethods = ['DELETE', 'GET', 'HEAD', 'PATCH', 'POST', 'PUT']; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * @param {function()|Object} handler Either a function, or an object with a + * 'handle' method. + * @return {Object} An object with a handle method. + * + * @private + */ + + const normalizeHandler = handler => { + if (handler && typeof handler === 'object') { + { + assert_mjs.assert.hasMethod(handler, 'handle', { + moduleName: 'workbox-routing', + className: 'Route', + funcName: 'constructor', + paramName: 'handler' + }); + } + + return handler; + } else { + { + assert_mjs.assert.isType(handler, 'function', { + moduleName: 'workbox-routing', + className: 'Route', + funcName: 'constructor', + paramName: 'handler' + }); + } + + return { + handle: handler + }; + } + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * A `Route` consists of a pair of callback functions, "match" and "handler". + * The "match" callback determine if a route should be used to "handle" a + * request by returning a non-falsy value if it can. The "handler" callback + * is called when there is a match and should return a Promise that resolves + * to a `Response`. + * + * @memberof workbox.routing + */ + + class Route { + /** + * Constructor for Route class. + * + * @param {workbox.routing.Route~matchCallback} match + * A callback function that determines whether the route matches a given + * `fetch` event by returning a non-falsy value. + * @param {workbox.routing.Route~handlerCallback} handler A callback + * function that returns a Promise resolving to a Response. + * @param {string} [method='GET'] The HTTP method to match the Route + * against. + */ + constructor(match, handler, method) { + { + assert_mjs.assert.isType(match, 'function', { + moduleName: 'workbox-routing', + className: 'Route', + funcName: 'constructor', + paramName: 'match' + }); + + if (method) { + assert_mjs.assert.isOneOf(method, validMethods, { + paramName: 'method' + }); + } + } // These values are referenced directly by Router so cannot be + // altered by minifification. + + + this.handler = normalizeHandler(handler); + this.match = match; + this.method = method || defaultMethod; + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * NavigationRoute makes it easy to create a [Route]{@link + * workbox.routing.Route} that matches for browser + * [navigation requests]{@link https://developers.google.com/web/fundamentals/primers/service-workers/high-performance-loading#first_what_are_navigation_requests}. + * + * It will only match incoming Requests whose + * [`mode`]{@link https://fetch.spec.whatwg.org/#concept-request-mode} + * is set to `navigate`. + * + * You can optionally only apply this route to a subset of navigation requests + * by using one or both of the `blacklist` and `whitelist` parameters. + * + * @memberof workbox.routing + * @extends workbox.routing.Route + */ + + class NavigationRoute extends Route { + /** + * If both `blacklist` and `whiltelist` are provided, the `blacklist` will + * take precedence and the request will not match this route. + * + * The regular expressions in `whitelist` and `blacklist` + * are matched against the concatenated + * [`pathname`]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/pathname} + * and [`search`]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/search} + * portions of the requested URL. + * + * @param {workbox.routing.Route~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + * @param {Object} options + * @param {Array} [options.blacklist] If any of these patterns match, + * the route will not handle the request (even if a whitelist RegExp matches). + * @param {Array} [options.whitelist=[/./]] If any of these patterns + * match the URL's pathname and search parameter, the route will handle the + * request (assuming the blacklist doesn't match). + */ + constructor(handler, { + whitelist = [/./], + blacklist = [] + } = {}) { + { + assert_mjs.assert.isArrayOfClass(whitelist, RegExp, { + moduleName: 'workbox-routing', + className: 'NavigationRoute', + funcName: 'constructor', + paramName: 'options.whitelist' + }); + assert_mjs.assert.isArrayOfClass(blacklist, RegExp, { + moduleName: 'workbox-routing', + className: 'NavigationRoute', + funcName: 'constructor', + paramName: 'options.blacklist' + }); + } + + super(options => this._match(options), handler); + this._whitelist = whitelist; + this._blacklist = blacklist; + } + /** + * Routes match handler. + * + * @param {Object} options + * @param {URL} options.url + * @param {Request} options.request + * @return {boolean} + * + * @private + */ + + + _match({ + url, + request + }) { + if (request.mode !== 'navigate') { + return false; + } + + const pathnameAndSearch = url.pathname + url.search; + + for (const regExp of this._blacklist) { + if (regExp.test(pathnameAndSearch)) { + { + logger_mjs.logger.log(`The navigation route is not being used, since the ` + `URL matches this blacklist pattern: ${regExp}`); + } + + return false; + } + } + + if (this._whitelist.some(regExp => regExp.test(pathnameAndSearch))) { + { + logger_mjs.logger.debug(`The navigation route is being used.`); + } + + return true; + } + + { + logger_mjs.logger.log(`The navigation route is not being used, since the URL ` + `being navigated to doesn't match the whitelist.`); + } + + return false; + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * RegExpRoute makes it easy to create a regular expression based + * [Route]{@link workbox.routing.Route}. + * + * For same-origin requests the RegExp only needs to match part of the URL. For + * requests against third-party servers, you must define a RegExp that matches + * the start of the URL. + * + * [See the module docs for info.]{@link https://developers.google.com/web/tools/workbox/modules/workbox-routing} + * + * @memberof workbox.routing + * @extends workbox.routing.Route + */ + + class RegExpRoute extends Route { + /** + * If the regulard expression contains + * [capture groups]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#grouping-back-references}, + * th ecaptured values will be passed to the + * [handler's]{@link workbox.routing.Route~handlerCallback} `params` + * argument. + * + * @param {RegExp} regExp The regular expression to match against URLs. + * @param {workbox.routing.Route~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + * @param {string} [method='GET'] The HTTP method to match the Route + * against. + */ + constructor(regExp, handler, method) { + { + assert_mjs.assert.isInstance(regExp, RegExp, { + moduleName: 'workbox-routing', + className: 'RegExpRoute', + funcName: 'constructor', + paramName: 'pattern' + }); + } + + const match = ({ + url + }) => { + const result = regExp.exec(url.href); // Return null immediately if there's no match. + + if (!result) { + return null; + } // Require that the match start at the first character in the URL string + // if it's a cross-origin request. + // See https://github.com/GoogleChrome/workbox/issues/281 for the context + // behind this behavior. + + + if (url.origin !== location.origin && result.index !== 0) { + { + logger_mjs.logger.debug(`The regular expression '${regExp}' only partially matched ` + `against the cross-origin URL '${url}'. RegExpRoute's will only ` + `handle cross-origin requests if they match the entire URL.`); + } + + return null; + } // If the route matches, but there aren't any capture groups defined, then + // this will return [], which is truthy and therefore sufficient to + // indicate a match. + // If there are capture groups, then it will return their values. + + + return result.slice(1); + }; + + super(match, handler, method); + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * The Router can be used to process a FetchEvent through one or more + * [Routes]{@link workbox.routing.Route} responding with a Request if + * a matching route exists. + * + * If no route matches a given a request, the Router will use a "default" + * handler if one is defined. + * + * Should the matching Route throw an error, the Router will use a "catch" + * handler if one is defined to gracefully deal with issues and respond with a + * Request. + * + * If a request matches multiple routes, the **earliest** registered route will + * be used to respond to the request. + * + * @memberof workbox.routing + */ + + class Router { + /** + * Initializes a new Router. + */ + constructor() { + this._routes = new Map(); + } + /** + * @return {Map>} routes A `Map` of HTTP + * method name ('GET', etc.) to an array of all the corresponding `Route` + * instances that are registered. + */ + + + get routes() { + return this._routes; + } + /** + * Adds a fetch event listener to respond to events when a route matches + * the event's request. + */ + + + addFetchListener() { + self.addEventListener('fetch', event => { + const { + request + } = event; + const responsePromise = this.handleRequest({ + request, + event + }); + + if (responsePromise) { + event.respondWith(responsePromise); + } + }); + } + /** + * Adds a message event listener for URLs to cache from the window. + * This is useful to cache resources loaded on the page prior to when the + * service worker started controlling it. + * + * The format of the message data sent from the window should be as follows. + * Where the `urlsToCache` array may consist of URL strings or an array of + * URL string + `requestInit` object (the same as you'd pass to `fetch()`). + * + * ``` + * { + * type: 'CACHE_URLS', + * payload: { + * urlsToCache: [ + * './script1.js', + * './script2.js', + * ['./script3.js', {mode: 'no-cors'}], + * ], + * }, + * } + * ``` + */ + + + addCacheListener() { + self.addEventListener('message', async event => { + if (event.data && event.data.type === 'CACHE_URLS') { + const { + payload + } = event.data; + + { + logger_mjs.logger.debug(`Caching URLs from the window`, payload.urlsToCache); + } + + const requestPromises = Promise.all(payload.urlsToCache.map(entry => { + if (typeof entry === 'string') { + entry = [entry]; + } + + const request = new Request(...entry); + return this.handleRequest({ + request + }); + })); + event.waitUntil(requestPromises); // If a MessageChannel was used, reply to the message on success. + + if (event.ports && event.ports[0]) { + await requestPromises; + event.ports[0].postMessage(true); + } + } + }); + } + /** + * Apply the routing rules to a FetchEvent object to get a Response from an + * appropriate Route's handler. + * + * @param {Object} options + * @param {Request} options.request The request to handle (this is usually + * from a fetch event, but it does not have to be). + * @param {FetchEvent} [options.event] The event that triggered the request, + * if applicable. + * @return {Promise|undefined} A promise is returned if a + * registered route can handle the request. If there is no matching + * route and there's no `defaultHandler`, `undefined` is returned. + */ + + + handleRequest({ + request, + event + }) { + { + assert_mjs.assert.isInstance(request, Request, { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'handleRequest', + paramName: 'options.request' + }); + } + + const url = new URL(request.url, location); + + if (!url.protocol.startsWith('http')) { + { + logger_mjs.logger.debug(`Workbox Router only supports URLs that start with 'http'.`); + } + + return; + } + + let { + params, + route + } = this.findMatchingRoute({ + url, + request, + event + }); + let handler = route && route.handler; + let debugMessages = []; + + { + if (handler) { + debugMessages.push([`Found a route to handle this request:`, route]); + + if (params) { + debugMessages.push([`Passing the following params to the route's handler:`, params]); + } + } + } // If we don't have a handler because there was no matching route, then + // fall back to defaultHandler if that's defined. + + + if (!handler && this._defaultHandler) { + { + debugMessages.push(`Failed to find a matching route. Falling ` + `back to the default handler.`); // This is used for debugging in logs in the case of an error. + + route = '[Default Handler]'; + } + + handler = this._defaultHandler; + } + + if (!handler) { + { + // No handler so Workbox will do nothing. If logs is set of debug + // i.e. verbose, we should print out this information. + logger_mjs.logger.debug(`No route found for: ${getFriendlyURL_mjs.getFriendlyURL(url)}`); + } + + return; + } + + { + // We have a handler, meaning Workbox is going to handle the route. + // print the routing details to the console. + logger_mjs.logger.groupCollapsed(`Router is responding to: ${getFriendlyURL_mjs.getFriendlyURL(url)}`); + debugMessages.forEach(msg => { + if (Array.isArray(msg)) { + logger_mjs.logger.log(...msg); + } else { + logger_mjs.logger.log(msg); + } + }); // The Request and Response objects contains a great deal of information, + // hide it under a group in case developers want to see it. + + logger_mjs.logger.groupCollapsed(`View request details here.`); + logger_mjs.logger.log(request); + logger_mjs.logger.groupEnd(); + logger_mjs.logger.groupEnd(); + } // Wrap in try and catch in case the handle method throws a synchronous + // error. It should still callback to the catch handler. + + + let responsePromise; + + try { + responsePromise = handler.handle({ + url, + request, + event, + params + }); + } catch (err) { + responsePromise = Promise.reject(err); + } + + if (responsePromise && this._catchHandler) { + responsePromise = responsePromise.catch(err => { + { + // Still include URL here as it will be async from the console group + // and may not make sense without the URL + logger_mjs.logger.groupCollapsed(`Error thrown when responding to: ` + ` ${getFriendlyURL_mjs.getFriendlyURL(url)}. Falling back to Catch Handler.`); + logger_mjs.logger.error(`Error thrown by:`, route); + logger_mjs.logger.error(err); + logger_mjs.logger.groupEnd(); + } + + return this._catchHandler.handle({ + url, + event, + err + }); + }); + } + + return responsePromise; + } + /** + * Checks a request and URL (and optionally an event) against the list of + * registered routes, and if there's a match, returns the corresponding + * route along with any params generated by the match. + * + * @param {Object} options + * @param {URL} options.url + * @param {Request} options.request The request to match. + * @param {FetchEvent} [options.event] The corresponding event (unless N/A). + * @return {Object} An object with `route` and `params` properties. + * They are populated if a matching route was found or `undefined` + * otherwise. + */ + + + findMatchingRoute({ + url, + request, + event + }) { + { + assert_mjs.assert.isInstance(url, URL, { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'findMatchingRoute', + paramName: 'options.url' + }); + assert_mjs.assert.isInstance(request, Request, { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'findMatchingRoute', + paramName: 'options.request' + }); + } + + const routes = this._routes.get(request.method) || []; + + for (const route of routes) { + let params; + let matchResult = route.match({ + url, + request, + event + }); + + if (matchResult) { + if (Array.isArray(matchResult) && matchResult.length > 0) { + // Instead of passing an empty array in as params, use undefined. + params = matchResult; + } else if (matchResult.constructor === Object && Object.keys(matchResult).length > 0) { + // Instead of passing an empty object in as params, use undefined. + params = matchResult; + } // Return early if have a match. + + + return { + route, + params + }; + } + } // If no match was found above, return and empty object. + + + return {}; + } + /** + * Define a default `handler` that's called when no routes explicitly + * match the incoming request. + * + * Without a default handler, unmatched requests will go against the + * network as if there were no service worker present. + * + * @param {workbox.routing.Route~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + */ + + + setDefaultHandler(handler) { + this._defaultHandler = normalizeHandler(handler); + } + /** + * If a Route throws an error while handling a request, this `handler` + * will be called and given a chance to provide a response. + * + * @param {workbox.routing.Route~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + */ + + + setCatchHandler(handler) { + this._catchHandler = normalizeHandler(handler); + } + /** + * Registers a route with the router. + * + * @param {workbox.routing.Route} route The route to register. + */ + + + registerRoute(route) { + { + assert_mjs.assert.isType(route, 'object', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route' + }); + assert_mjs.assert.hasMethod(route, 'match', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route' + }); + assert_mjs.assert.isType(route.handler, 'object', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route' + }); + assert_mjs.assert.hasMethod(route.handler, 'handle', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route.handler' + }); + assert_mjs.assert.isType(route.method, 'string', { + moduleName: 'workbox-routing', + className: 'Router', + funcName: 'registerRoute', + paramName: 'route.method' + }); + } + + if (!this._routes.has(route.method)) { + this._routes.set(route.method, []); + } // Give precedence to all of the earlier routes by adding this additional + // route to the end of the array. + + + this._routes.get(route.method).push(route); + } + /** + * Unregisters a route with the router. + * + * @param {workbox.routing.Route} route The route to unregister. + */ + + + unregisterRoute(route) { + if (!this._routes.has(route.method)) { + throw new WorkboxError_mjs.WorkboxError('unregister-route-but-not-found-with-method', { + method: route.method + }); + } + + const routeIndex = this._routes.get(route.method).indexOf(route); + + if (routeIndex > -1) { + this._routes.get(route.method).splice(routeIndex, 1); + } else { + throw new WorkboxError_mjs.WorkboxError('unregister-route-route-not-registered'); + } + } + + } + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + let defaultRouter; + /** + * Creates a new, singleton Router instance if one does not exist. If one + * does already exist, that instance is returned. + * + * @private + * @return {Router} + */ + + const getOrCreateDefaultRouter = () => { + if (!defaultRouter) { + defaultRouter = new Router(); // The helpers that use the default Router assume these listeners exist. + + defaultRouter.addFetchListener(); + defaultRouter.addCacheListener(); + } + + return defaultRouter; + }; + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Registers a route that will return a precached file for a navigation + * request. This is useful for the + * [application shell pattern]{@link https://developers.google.com/web/fundamentals/architecture/app-shell}. + * + * When determining the URL of the precached HTML document, you will likely need + * to call `workbox.precaching.getCacheKeyForURL(originalUrl)`, to account for + * the fact that Workbox's precaching naming conventions often results in URL + * cache keys that contain extra revisioning info. + * + * This method will generate a + * [NavigationRoute]{@link workbox.routing.NavigationRoute} + * and call + * [Router.registerRoute()]{@link workbox.routing.Router#registerRoute} on a + * singleton Router instance. + * + * @param {string} cachedAssetUrl The cache key to use for the HTML file. + * @param {Object} [options] + * @param {string} [options.cacheName] Cache name to store and retrieve + * requests. Defaults to precache cache name provided by + * [workbox-core.cacheNames]{@link workbox.core.cacheNames}. + * @param {Array} [options.blacklist=[]] If any of these patterns + * match, the route will not handle the request (even if a whitelist entry + * matches). + * @param {Array} [options.whitelist=[/./]] If any of these patterns + * match the URL's pathname and search parameter, the route will handle the + * request (assuming the blacklist doesn't match). + * @return {workbox.routing.NavigationRoute} Returns the generated + * Route. + * + * @alias workbox.routing.registerNavigationRoute + */ + + const registerNavigationRoute = (cachedAssetUrl, options = {}) => { + { + assert_mjs.assert.isType(cachedAssetUrl, 'string', { + moduleName: 'workbox-routing', + funcName: 'registerNavigationRoute', + paramName: 'cachedAssetUrl' + }); + } + + const cacheName = cacheNames_mjs.cacheNames.getPrecacheName(options.cacheName); + + const handler = async () => { + try { + const response = await caches.match(cachedAssetUrl, { + cacheName + }); + + if (response) { + return response; + } // This shouldn't normally happen, but there are edge cases: + // https://github.com/GoogleChrome/workbox/issues/1441 + + + throw new Error(`The cache ${cacheName} did not have an entry for ` + `${cachedAssetUrl}.`); + } catch (error) { + // If there's either a cache miss, or the caches.match() call threw + // an exception, then attempt to fulfill the navigation request with + // a response from the network rather than leaving the user with a + // failed navigation. + { + logger_mjs.logger.debug(`Unable to respond to navigation request with ` + `cached response. Falling back to network.`, error); + } // This might still fail if the browser is offline... + + + return fetch(cachedAssetUrl); + } + }; + + const route = new NavigationRoute(handler, { + whitelist: options.whitelist, + blacklist: options.blacklist + }); + const defaultRouter = getOrCreateDefaultRouter(); + defaultRouter.registerRoute(route); + return route; + }; + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Easily register a RegExp, string, or function with a caching + * strategy to a singleton Router instance. + * + * This method will generate a Route for you if needed and + * call [Router.registerRoute()]{@link + * workbox.routing.Router#registerRoute}. + * + * @param { + * RegExp| + * string| + * workbox.routing.Route~matchCallback| + * workbox.routing.Route + * } capture + * If the capture param is a `Route`, all other arguments will be ignored. + * @param {workbox.routing.Route~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + * @param {string} [method='GET'] The HTTP method to match the Route + * against. + * @return {workbox.routing.Route} The generated `Route`(Useful for + * unregistering). + * + * @alias workbox.routing.registerRoute + */ + + const registerRoute = (capture, handler, method = 'GET') => { + let route; + + if (typeof capture === 'string') { + const captureUrl = new URL(capture, location); + + { + if (!(capture.startsWith('/') || capture.startsWith('http'))) { + throw new WorkboxError_mjs.WorkboxError('invalid-string', { + moduleName: 'workbox-routing', + funcName: 'registerRoute', + paramName: 'capture' + }); + } // We want to check if Express-style wildcards are in the pathname only. + // TODO: Remove this log message in v4. + + + const valueToCheck = capture.startsWith('http') ? captureUrl.pathname : capture; // See https://github.com/pillarjs/path-to-regexp#parameters + + const wildcards = '[*:?+]'; + + if (valueToCheck.match(new RegExp(`${wildcards}`))) { + logger_mjs.logger.debug(`The '$capture' parameter contains an Express-style wildcard ` + `character (${wildcards}). Strings are now always interpreted as ` + `exact matches; use a RegExp for partial or wildcard matches.`); + } + } + + const matchCallback = ({ + url + }) => { + { + if (url.pathname === captureUrl.pathname && url.origin !== captureUrl.origin) { + logger_mjs.logger.debug(`${capture} only partially matches the cross-origin URL ` + `${url}. This route will only handle cross-origin requests ` + `if they match the entire URL.`); + } + } + + return url.href === captureUrl.href; + }; + + route = new Route(matchCallback, handler, method); + } else if (capture instanceof RegExp) { + route = new RegExpRoute(capture, handler, method); + } else if (typeof capture === 'function') { + route = new Route(capture, handler, method); + } else if (capture instanceof Route) { + route = capture; + } else { + throw new WorkboxError_mjs.WorkboxError('unsupported-route-type', { + moduleName: 'workbox-routing', + funcName: 'registerRoute', + paramName: 'capture' + }); + } + + const defaultRouter = getOrCreateDefaultRouter(); + defaultRouter.registerRoute(route); + return route; + }; + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * If a Route throws an error while handling a request, this `handler` + * will be called and given a chance to provide a response. + * + * @param {workbox.routing.Route~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + * + * @alias workbox.routing.setCatchHandler + */ + + const setCatchHandler = handler => { + const defaultRouter = getOrCreateDefaultRouter(); + defaultRouter.setCatchHandler(handler); + }; + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Define a default `handler` that's called when no routes explicitly + * match the incoming request. + * + * Without a default handler, unmatched requests will go against the + * network as if there were no service worker present. + * + * @param {workbox.routing.Route~handlerCallback} handler A callback + * function that returns a Promise resulting in a Response. + * + * @alias workbox.routing.setDefaultHandler + */ + + const setDefaultHandler = handler => { + const defaultRouter = getOrCreateDefaultRouter(); + defaultRouter.setDefaultHandler(handler); + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + + { + assert_mjs.assert.isSWEnv('workbox-routing'); + } + + exports.NavigationRoute = NavigationRoute; + exports.RegExpRoute = RegExpRoute; + exports.registerNavigationRoute = registerNavigationRoute; + exports.registerRoute = registerRoute; + exports.Route = Route; + exports.Router = Router; + exports.setCatchHandler = setCatchHandler; + exports.setDefaultHandler = setDefaultHandler; + + return exports; + +}({}, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private)); +//# sourceMappingURL=workbox-routing.dev.js.map diff --git a/workbox-v4.3.1/workbox-routing.dev.js.map b/workbox-v4.3.1/workbox-routing.dev.js.map new file mode 100644 index 00000000..71071322 --- /dev/null +++ b/workbox-v4.3.1/workbox-routing.dev.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-routing.dev.js","sources":["../_version.mjs","../utils/constants.mjs","../utils/normalizeHandler.mjs","../Route.mjs","../NavigationRoute.mjs","../RegExpRoute.mjs","../Router.mjs","../utils/getOrCreateDefaultRouter.mjs","../registerNavigationRoute.mjs","../registerRoute.mjs","../setCatchHandler.mjs","../setDefaultHandler.mjs","../index.mjs"],"sourcesContent":["try{self['workbox:routing:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n/**\n * The default HTTP method, 'GET', used when there's no specific method\n * configured for a route.\n *\n * @type {string}\n *\n * @private\n */\nexport const defaultMethod = 'GET';\n\n/**\n * The list of valid HTTP methods associated with requests that could be routed.\n *\n * @type {Array}\n *\n * @private\n */\nexport const validMethods = [\n 'DELETE',\n 'GET',\n 'HEAD',\n 'PATCH',\n 'POST',\n 'PUT',\n];\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport '../_version.mjs';\n\n/**\n * @param {function()|Object} handler Either a function, or an object with a\n * 'handle' method.\n * @return {Object} An object with a handle method.\n *\n * @private\n */\nexport const normalizeHandler = (handler) => {\n if (handler && typeof handler === 'object') {\n if (process.env.NODE_ENV !== 'production') {\n assert.hasMethod(handler, 'handle', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'handler',\n });\n }\n return handler;\n } else {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(handler, 'function', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'handler',\n });\n }\n return {handle: handler};\n }\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\n\nimport {defaultMethod, validMethods} from './utils/constants.mjs';\nimport {normalizeHandler} from './utils/normalizeHandler.mjs';\nimport './_version.mjs';\n\n/**\n * A `Route` consists of a pair of callback functions, \"match\" and \"handler\".\n * The \"match\" callback determine if a route should be used to \"handle\" a\n * request by returning a non-falsy value if it can. The \"handler\" callback\n * is called when there is a match and should return a Promise that resolves\n * to a `Response`.\n *\n * @memberof workbox.routing\n */\nclass Route {\n /**\n * Constructor for Route class.\n *\n * @param {workbox.routing.Route~matchCallback} match\n * A callback function that determines whether the route matches a given\n * `fetch` event by returning a non-falsy value.\n * @param {workbox.routing.Route~handlerCallback} handler A callback\n * function that returns a Promise resolving to a Response.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n */\n constructor(match, handler, method) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(match, 'function', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'match',\n });\n\n if (method) {\n assert.isOneOf(method, validMethods, {paramName: 'method'});\n }\n }\n\n // These values are referenced directly by Router so cannot be\n // altered by minifification.\n this.handler = normalizeHandler(handler);\n this.match = match;\n this.method = method || defaultMethod;\n }\n}\n\nexport {Route};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {Route} from './Route.mjs';\nimport './_version.mjs';\n\n/**\n * NavigationRoute makes it easy to create a [Route]{@link\n * workbox.routing.Route} that matches for browser\n * [navigation requests]{@link https://developers.google.com/web/fundamentals/primers/service-workers/high-performance-loading#first_what_are_navigation_requests}.\n *\n * It will only match incoming Requests whose\n * [`mode`]{@link https://fetch.spec.whatwg.org/#concept-request-mode}\n * is set to `navigate`.\n *\n * You can optionally only apply this route to a subset of navigation requests\n * by using one or both of the `blacklist` and `whitelist` parameters.\n *\n * @memberof workbox.routing\n * @extends workbox.routing.Route\n */\nclass NavigationRoute extends Route {\n /**\n * If both `blacklist` and `whiltelist` are provided, the `blacklist` will\n * take precedence and the request will not match this route.\n *\n * The regular expressions in `whitelist` and `blacklist`\n * are matched against the concatenated\n * [`pathname`]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/pathname}\n * and [`search`]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/search}\n * portions of the requested URL.\n *\n * @param {workbox.routing.Route~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n * @param {Object} options\n * @param {Array} [options.blacklist] If any of these patterns match,\n * the route will not handle the request (even if a whitelist RegExp matches).\n * @param {Array} [options.whitelist=[/./]] If any of these patterns\n * match the URL's pathname and search parameter, the route will handle the\n * request (assuming the blacklist doesn't match).\n */\n constructor(handler, {whitelist = [/./], blacklist = []} = {}) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isArrayOfClass(whitelist, RegExp, {\n moduleName: 'workbox-routing',\n className: 'NavigationRoute',\n funcName: 'constructor',\n paramName: 'options.whitelist',\n });\n assert.isArrayOfClass(blacklist, RegExp, {\n moduleName: 'workbox-routing',\n className: 'NavigationRoute',\n funcName: 'constructor',\n paramName: 'options.blacklist',\n });\n }\n\n super((options) => this._match(options), handler);\n\n this._whitelist = whitelist;\n this._blacklist = blacklist;\n }\n\n /**\n * Routes match handler.\n *\n * @param {Object} options\n * @param {URL} options.url\n * @param {Request} options.request\n * @return {boolean}\n *\n * @private\n */\n _match({url, request}) {\n if (request.mode !== 'navigate') {\n return false;\n }\n\n const pathnameAndSearch = url.pathname + url.search;\n\n for (const regExp of this._blacklist) {\n if (regExp.test(pathnameAndSearch)) {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`The navigation route is not being used, since the ` +\n `URL matches this blacklist pattern: ${regExp}`);\n }\n return false;\n }\n }\n\n if (this._whitelist.some((regExp) => regExp.test(pathnameAndSearch))) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`The navigation route is being used.`);\n }\n return true;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`The navigation route is not being used, since the URL ` +\n `being navigated to doesn't match the whitelist.`);\n }\n return false;\n }\n}\n\nexport {NavigationRoute};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {Route} from './Route.mjs';\nimport './_version.mjs';\n\n/**\n * RegExpRoute makes it easy to create a regular expression based\n * [Route]{@link workbox.routing.Route}.\n *\n * For same-origin requests the RegExp only needs to match part of the URL. For\n * requests against third-party servers, you must define a RegExp that matches\n * the start of the URL.\n *\n * [See the module docs for info.]{@link https://developers.google.com/web/tools/workbox/modules/workbox-routing}\n *\n * @memberof workbox.routing\n * @extends workbox.routing.Route\n */\nclass RegExpRoute extends Route {\n /**\n * If the regulard expression contains\n * [capture groups]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#grouping-back-references},\n * th ecaptured values will be passed to the\n * [handler's]{@link workbox.routing.Route~handlerCallback} `params`\n * argument.\n *\n * @param {RegExp} regExp The regular expression to match against URLs.\n * @param {workbox.routing.Route~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n */\n constructor(regExp, handler, method) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(regExp, RegExp, {\n moduleName: 'workbox-routing',\n className: 'RegExpRoute',\n funcName: 'constructor',\n paramName: 'pattern',\n });\n }\n\n const match = ({url}) => {\n const result = regExp.exec(url.href);\n\n // Return null immediately if there's no match.\n if (!result) {\n return null;\n }\n\n // Require that the match start at the first character in the URL string\n // if it's a cross-origin request.\n // See https://github.com/GoogleChrome/workbox/issues/281 for the context\n // behind this behavior.\n if ((url.origin !== location.origin) && (result.index !== 0)) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(\n `The regular expression '${regExp}' only partially matched ` +\n `against the cross-origin URL '${url}'. RegExpRoute's will only ` +\n `handle cross-origin requests if they match the entire URL.`\n );\n }\n\n return null;\n }\n\n // If the route matches, but there aren't any capture groups defined, then\n // this will return [], which is truthy and therefore sufficient to\n // indicate a match.\n // If there are capture groups, then it will return their values.\n return result.slice(1);\n };\n\n super(match, handler, method);\n }\n}\n\nexport {RegExpRoute};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs';\n\nimport {normalizeHandler} from './utils/normalizeHandler.mjs';\nimport './_version.mjs';\n\n/**\n * The Router can be used to process a FetchEvent through one or more\n * [Routes]{@link workbox.routing.Route} responding with a Request if\n * a matching route exists.\n *\n * If no route matches a given a request, the Router will use a \"default\"\n * handler if one is defined.\n *\n * Should the matching Route throw an error, the Router will use a \"catch\"\n * handler if one is defined to gracefully deal with issues and respond with a\n * Request.\n *\n * If a request matches multiple routes, the **earliest** registered route will\n * be used to respond to the request.\n *\n * @memberof workbox.routing\n */\nclass Router {\n /**\n * Initializes a new Router.\n */\n constructor() {\n this._routes = new Map();\n }\n\n /**\n * @return {Map>} routes A `Map` of HTTP\n * method name ('GET', etc.) to an array of all the corresponding `Route`\n * instances that are registered.\n */\n get routes() {\n return this._routes;\n }\n\n /**\n * Adds a fetch event listener to respond to events when a route matches\n * the event's request.\n */\n addFetchListener() {\n self.addEventListener('fetch', (event) => {\n const {request} = event;\n const responsePromise = this.handleRequest({request, event});\n if (responsePromise) {\n event.respondWith(responsePromise);\n }\n });\n }\n\n /**\n * Adds a message event listener for URLs to cache from the window.\n * This is useful to cache resources loaded on the page prior to when the\n * service worker started controlling it.\n *\n * The format of the message data sent from the window should be as follows.\n * Where the `urlsToCache` array may consist of URL strings or an array of\n * URL string + `requestInit` object (the same as you'd pass to `fetch()`).\n *\n * ```\n * {\n * type: 'CACHE_URLS',\n * payload: {\n * urlsToCache: [\n * './script1.js',\n * './script2.js',\n * ['./script3.js', {mode: 'no-cors'}],\n * ],\n * },\n * }\n * ```\n */\n addCacheListener() {\n self.addEventListener('message', async (event) => {\n if (event.data && event.data.type === 'CACHE_URLS') {\n const {payload} = event.data;\n\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Caching URLs from the window`, payload.urlsToCache);\n }\n\n const requestPromises = Promise.all(payload.urlsToCache.map((entry) => {\n if (typeof entry === 'string') {\n entry = [entry];\n }\n\n const request = new Request(...entry);\n return this.handleRequest({request});\n }));\n\n event.waitUntil(requestPromises);\n\n // If a MessageChannel was used, reply to the message on success.\n if (event.ports && event.ports[0]) {\n await requestPromises;\n event.ports[0].postMessage(true);\n }\n }\n });\n }\n\n /**\n * Apply the routing rules to a FetchEvent object to get a Response from an\n * appropriate Route's handler.\n *\n * @param {Object} options\n * @param {Request} options.request The request to handle (this is usually\n * from a fetch event, but it does not have to be).\n * @param {FetchEvent} [options.event] The event that triggered the request,\n * if applicable.\n * @return {Promise|undefined} A promise is returned if a\n * registered route can handle the request. If there is no matching\n * route and there's no `defaultHandler`, `undefined` is returned.\n */\n handleRequest({request, event}) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'handleRequest',\n paramName: 'options.request',\n });\n }\n\n const url = new URL(request.url, location);\n if (!url.protocol.startsWith('http')) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(\n `Workbox Router only supports URLs that start with 'http'.`);\n }\n return;\n }\n\n let {params, route} = this.findMatchingRoute({url, request, event});\n let handler = route && route.handler;\n\n let debugMessages = [];\n if (process.env.NODE_ENV !== 'production') {\n if (handler) {\n debugMessages.push([\n `Found a route to handle this request:`, route,\n ]);\n\n if (params) {\n debugMessages.push([\n `Passing the following params to the route's handler:`, params,\n ]);\n }\n }\n }\n\n // If we don't have a handler because there was no matching route, then\n // fall back to defaultHandler if that's defined.\n if (!handler && this._defaultHandler) {\n if (process.env.NODE_ENV !== 'production') {\n debugMessages.push(`Failed to find a matching route. Falling ` +\n `back to the default handler.`);\n\n // This is used for debugging in logs in the case of an error.\n route = '[Default Handler]';\n }\n handler = this._defaultHandler;\n }\n\n if (!handler) {\n if (process.env.NODE_ENV !== 'production') {\n // No handler so Workbox will do nothing. If logs is set of debug\n // i.e. verbose, we should print out this information.\n logger.debug(`No route found for: ${getFriendlyURL(url)}`);\n }\n return;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n // We have a handler, meaning Workbox is going to handle the route.\n // print the routing details to the console.\n logger.groupCollapsed(`Router is responding to: ${getFriendlyURL(url)}`);\n debugMessages.forEach((msg) => {\n if (Array.isArray(msg)) {\n logger.log(...msg);\n } else {\n logger.log(msg);\n }\n });\n\n // The Request and Response objects contains a great deal of information,\n // hide it under a group in case developers want to see it.\n logger.groupCollapsed(`View request details here.`);\n logger.log(request);\n logger.groupEnd();\n\n logger.groupEnd();\n }\n\n // Wrap in try and catch in case the handle method throws a synchronous\n // error. It should still callback to the catch handler.\n let responsePromise;\n try {\n responsePromise = handler.handle({url, request, event, params});\n } catch (err) {\n responsePromise = Promise.reject(err);\n }\n\n if (responsePromise && this._catchHandler) {\n responsePromise = responsePromise.catch((err) => {\n if (process.env.NODE_ENV !== 'production') {\n // Still include URL here as it will be async from the console group\n // and may not make sense without the URL\n logger.groupCollapsed(`Error thrown when responding to: ` +\n ` ${getFriendlyURL(url)}. Falling back to Catch Handler.`);\n logger.error(`Error thrown by:`, route);\n logger.error(err);\n logger.groupEnd();\n }\n return this._catchHandler.handle({url, event, err});\n });\n }\n\n return responsePromise;\n }\n\n /**\n * Checks a request and URL (and optionally an event) against the list of\n * registered routes, and if there's a match, returns the corresponding\n * route along with any params generated by the match.\n *\n * @param {Object} options\n * @param {URL} options.url\n * @param {Request} options.request The request to match.\n * @param {FetchEvent} [options.event] The corresponding event (unless N/A).\n * @return {Object} An object with `route` and `params` properties.\n * They are populated if a matching route was found or `undefined`\n * otherwise.\n */\n findMatchingRoute({url, request, event}) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(url, URL, {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'findMatchingRoute',\n paramName: 'options.url',\n });\n assert.isInstance(request, Request, {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'findMatchingRoute',\n paramName: 'options.request',\n });\n }\n\n const routes = this._routes.get(request.method) || [];\n for (const route of routes) {\n let params;\n let matchResult = route.match({url, request, event});\n if (matchResult) {\n if (Array.isArray(matchResult) && matchResult.length > 0) {\n // Instead of passing an empty array in as params, use undefined.\n params = matchResult;\n } else if ((matchResult.constructor === Object &&\n Object.keys(matchResult).length > 0)) {\n // Instead of passing an empty object in as params, use undefined.\n params = matchResult;\n }\n\n // Return early if have a match.\n return {route, params};\n }\n }\n // If no match was found above, return and empty object.\n return {};\n }\n\n /**\n * Define a default `handler` that's called when no routes explicitly\n * match the incoming request.\n *\n * Without a default handler, unmatched requests will go against the\n * network as if there were no service worker present.\n *\n * @param {workbox.routing.Route~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n */\n setDefaultHandler(handler) {\n this._defaultHandler = normalizeHandler(handler);\n }\n\n /**\n * If a Route throws an error while handling a request, this `handler`\n * will be called and given a chance to provide a response.\n *\n * @param {workbox.routing.Route~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n */\n setCatchHandler(handler) {\n this._catchHandler = normalizeHandler(handler);\n }\n\n /**\n * Registers a route with the router.\n *\n * @param {workbox.routing.Route} route The route to register.\n */\n registerRoute(route) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(route, 'object', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route',\n });\n\n assert.hasMethod(route, 'match', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route',\n });\n\n assert.isType(route.handler, 'object', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route',\n });\n\n assert.hasMethod(route.handler, 'handle', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route.handler',\n });\n\n assert.isType(route.method, 'string', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route.method',\n });\n }\n\n if (!this._routes.has(route.method)) {\n this._routes.set(route.method, []);\n }\n\n // Give precedence to all of the earlier routes by adding this additional\n // route to the end of the array.\n this._routes.get(route.method).push(route);\n }\n\n /**\n * Unregisters a route with the router.\n *\n * @param {workbox.routing.Route} route The route to unregister.\n */\n unregisterRoute(route) {\n if (!this._routes.has(route.method)) {\n throw new WorkboxError(\n 'unregister-route-but-not-found-with-method', {\n method: route.method,\n }\n );\n }\n\n const routeIndex = this._routes.get(route.method).indexOf(route);\n if (routeIndex > -1) {\n this._routes.get(route.method).splice(routeIndex, 1);\n } else {\n throw new WorkboxError('unregister-route-route-not-registered');\n }\n }\n}\n\nexport {Router};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {Router} from '../Router.mjs';\nimport '../_version.mjs';\n\nlet defaultRouter;\n\n/**\n * Creates a new, singleton Router instance if one does not exist. If one\n * does already exist, that instance is returned.\n *\n * @private\n * @return {Router}\n */\nexport const getOrCreateDefaultRouter = () => {\n if (!defaultRouter) {\n defaultRouter = new Router();\n\n // The helpers that use the default Router assume these listeners exist.\n defaultRouter.addFetchListener();\n defaultRouter.addCacheListener();\n }\n return defaultRouter;\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {cacheNames} from 'workbox-core/_private/cacheNames.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {NavigationRoute} from './NavigationRoute.mjs';\nimport {getOrCreateDefaultRouter} from './utils/getOrCreateDefaultRouter.mjs';\nimport './_version.mjs';\n\n\n/**\n * Registers a route that will return a precached file for a navigation\n * request. This is useful for the\n * [application shell pattern]{@link https://developers.google.com/web/fundamentals/architecture/app-shell}.\n *\n * When determining the URL of the precached HTML document, you will likely need\n * to call `workbox.precaching.getCacheKeyForURL(originalUrl)`, to account for\n * the fact that Workbox's precaching naming conventions often results in URL\n * cache keys that contain extra revisioning info.\n *\n * This method will generate a\n * [NavigationRoute]{@link workbox.routing.NavigationRoute}\n * and call\n * [Router.registerRoute()]{@link workbox.routing.Router#registerRoute} on a\n * singleton Router instance.\n *\n * @param {string} cachedAssetUrl The cache key to use for the HTML file.\n * @param {Object} [options]\n * @param {string} [options.cacheName] Cache name to store and retrieve\n * requests. Defaults to precache cache name provided by\n * [workbox-core.cacheNames]{@link workbox.core.cacheNames}.\n * @param {Array} [options.blacklist=[]] If any of these patterns\n * match, the route will not handle the request (even if a whitelist entry\n * matches).\n * @param {Array} [options.whitelist=[/./]] If any of these patterns\n * match the URL's pathname and search parameter, the route will handle the\n * request (assuming the blacklist doesn't match).\n * @return {workbox.routing.NavigationRoute} Returns the generated\n * Route.\n *\n * @alias workbox.routing.registerNavigationRoute\n */\nexport const registerNavigationRoute = (cachedAssetUrl, options = {}) => {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(cachedAssetUrl, 'string', {\n moduleName: 'workbox-routing',\n funcName: 'registerNavigationRoute',\n paramName: 'cachedAssetUrl',\n });\n }\n\n const cacheName = cacheNames.getPrecacheName(options.cacheName);\n const handler = async () => {\n try {\n const response = await caches.match(cachedAssetUrl, {cacheName});\n\n if (response) {\n return response;\n }\n\n // This shouldn't normally happen, but there are edge cases:\n // https://github.com/GoogleChrome/workbox/issues/1441\n throw new Error(`The cache ${cacheName} did not have an entry for ` +\n `${cachedAssetUrl}.`);\n } catch (error) {\n // If there's either a cache miss, or the caches.match() call threw\n // an exception, then attempt to fulfill the navigation request with\n // a response from the network rather than leaving the user with a\n // failed navigation.\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Unable to respond to navigation request with ` +\n `cached response. Falling back to network.`, error);\n }\n\n // This might still fail if the browser is offline...\n return fetch(cachedAssetUrl);\n }\n };\n\n const route = new NavigationRoute(handler, {\n whitelist: options.whitelist,\n blacklist: options.blacklist,\n });\n\n const defaultRouter = getOrCreateDefaultRouter();\n defaultRouter.registerRoute(route);\n\n return route;\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {Route} from './Route.mjs';\nimport {RegExpRoute} from './RegExpRoute.mjs';\nimport {getOrCreateDefaultRouter} from './utils/getOrCreateDefaultRouter.mjs';\nimport './_version.mjs';\n\n\n/**\n * Easily register a RegExp, string, or function with a caching\n * strategy to a singleton Router instance.\n *\n * This method will generate a Route for you if needed and\n * call [Router.registerRoute()]{@link\n * workbox.routing.Router#registerRoute}.\n *\n * @param {\n * RegExp|\n * string|\n * workbox.routing.Route~matchCallback|\n * workbox.routing.Route\n * } capture\n * If the capture param is a `Route`, all other arguments will be ignored.\n * @param {workbox.routing.Route~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n * @return {workbox.routing.Route} The generated `Route`(Useful for\n * unregistering).\n *\n * @alias workbox.routing.registerRoute\n */\nexport const registerRoute = (capture, handler, method = 'GET') => {\n let route;\n\n if (typeof capture === 'string') {\n const captureUrl = new URL(capture, location);\n\n if (process.env.NODE_ENV !== 'production') {\n if (!(capture.startsWith('/') || capture.startsWith('http'))) {\n throw new WorkboxError('invalid-string', {\n moduleName: 'workbox-routing',\n funcName: 'registerRoute',\n paramName: 'capture',\n });\n }\n\n // We want to check if Express-style wildcards are in the pathname only.\n // TODO: Remove this log message in v4.\n const valueToCheck = capture.startsWith('http') ?\n captureUrl.pathname : capture;\n\n // See https://github.com/pillarjs/path-to-regexp#parameters\n const wildcards = '[*:?+]';\n if (valueToCheck.match(new RegExp(`${wildcards}`))) {\n logger.debug(\n `The '$capture' parameter contains an Express-style wildcard ` +\n `character (${wildcards}). Strings are now always interpreted as ` +\n `exact matches; use a RegExp for partial or wildcard matches.`\n );\n }\n }\n\n const matchCallback = ({url}) => {\n if (process.env.NODE_ENV !== 'production') {\n if ((url.pathname === captureUrl.pathname) &&\n (url.origin !== captureUrl.origin)) {\n logger.debug(\n `${capture} only partially matches the cross-origin URL ` +\n `${url}. This route will only handle cross-origin requests ` +\n `if they match the entire URL.`);\n }\n }\n\n return url.href === captureUrl.href;\n };\n\n route = new Route(matchCallback, handler, method);\n } else if (capture instanceof RegExp) {\n route = new RegExpRoute(capture, handler, method);\n } else if (typeof capture === 'function') {\n route = new Route(capture, handler, method);\n } else if (capture instanceof Route) {\n route = capture;\n } else {\n throw new WorkboxError('unsupported-route-type', {\n moduleName: 'workbox-routing',\n funcName: 'registerRoute',\n paramName: 'capture',\n });\n }\n\n const defaultRouter = getOrCreateDefaultRouter();\n defaultRouter.registerRoute(route);\n\n return route;\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {getOrCreateDefaultRouter} from './utils/getOrCreateDefaultRouter.mjs';\n\nimport './_version.mjs';\n\n/**\n * If a Route throws an error while handling a request, this `handler`\n * will be called and given a chance to provide a response.\n *\n * @param {workbox.routing.Route~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n *\n * @alias workbox.routing.setCatchHandler\n */\nexport const setCatchHandler = (handler) => {\n const defaultRouter = getOrCreateDefaultRouter();\n defaultRouter.setCatchHandler(handler);\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {getOrCreateDefaultRouter} from './utils/getOrCreateDefaultRouter.mjs';\n\nimport './_version.mjs';\n\n/**\n * Define a default `handler` that's called when no routes explicitly\n * match the incoming request.\n *\n * Without a default handler, unmatched requests will go against the\n * network as if there were no service worker present.\n *\n * @param {workbox.routing.Route~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n *\n * @alias workbox.routing.setDefaultHandler\n */\nexport const setDefaultHandler = (handler) => {\n const defaultRouter = getOrCreateDefaultRouter();\n defaultRouter.setDefaultHandler(handler);\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\n\nimport {NavigationRoute} from './NavigationRoute.mjs';\nimport {RegExpRoute} from './RegExpRoute.mjs';\nimport {registerNavigationRoute} from './registerNavigationRoute.mjs';\nimport {registerRoute} from './registerRoute.mjs';\nimport {Route} from './Route.mjs';\nimport {Router} from './Router.mjs';\nimport {setCatchHandler} from './setCatchHandler.mjs';\nimport {setDefaultHandler} from './setDefaultHandler.mjs';\n\nimport './_version.mjs';\n\nif (process.env.NODE_ENV !== 'production') {\n assert.isSWEnv('workbox-routing');\n}\n\n/**\n * @namespace workbox.routing\n */\n\nexport {\n NavigationRoute,\n RegExpRoute,\n registerNavigationRoute,\n registerRoute,\n Route,\n Router,\n setCatchHandler,\n setDefaultHandler,\n};\n"],"names":["self","_","e","defaultMethod","validMethods","normalizeHandler","handler","assert","hasMethod","moduleName","className","funcName","paramName","isType","handle","Route","constructor","match","method","isOneOf","NavigationRoute","whitelist","blacklist","isArrayOfClass","RegExp","options","_match","_whitelist","_blacklist","url","request","mode","pathnameAndSearch","pathname","search","regExp","test","logger","log","some","debug","RegExpRoute","isInstance","result","exec","href","origin","location","index","slice","Router","_routes","Map","routes","addFetchListener","addEventListener","event","responsePromise","handleRequest","respondWith","addCacheListener","data","type","payload","urlsToCache","requestPromises","Promise","all","map","entry","Request","waitUntil","ports","postMessage","URL","protocol","startsWith","params","route","findMatchingRoute","debugMessages","push","_defaultHandler","getFriendlyURL","groupCollapsed","forEach","msg","Array","isArray","groupEnd","err","reject","_catchHandler","catch","error","get","matchResult","length","Object","keys","setDefaultHandler","setCatchHandler","registerRoute","has","set","unregisterRoute","WorkboxError","routeIndex","indexOf","splice","defaultRouter","getOrCreateDefaultRouter","registerNavigationRoute","cachedAssetUrl","cacheName","cacheNames","getPrecacheName","response","caches","Error","fetch","capture","captureUrl","valueToCheck","wildcards","matchCallback","isSWEnv"],"mappings":"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"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-routing.prod.js b/workbox-v4.3.1/workbox-routing.prod.js new file mode 100644 index 00000000..ed87f9d1 --- /dev/null +++ b/workbox-v4.3.1/workbox-routing.prod.js @@ -0,0 +1,2 @@ +this.workbox=this.workbox||{},this.workbox.routing=function(t,e,r){"use strict";try{self["workbox:routing:4.3.1"]&&_()}catch(t){}const s="GET",n=t=>t&&"object"==typeof t?t:{handle:t};class o{constructor(t,e,r){this.handler=n(e),this.match=t,this.method=r||s}}class i extends o{constructor(t,{whitelist:e=[/./],blacklist:r=[]}={}){super(t=>this.t(t),t),this.s=e,this.o=r}t({url:t,request:e}){if("navigate"!==e.mode)return!1;const r=t.pathname+t.search;for(const t of this.o)if(t.test(r))return!1;return!!this.s.some(t=>t.test(r))}}class u extends o{constructor(t,e,r){super(({url:e})=>{const r=t.exec(e.href);return r?e.origin!==location.origin&&0!==r.index?null:r.slice(1):null},e,r)}}class c{constructor(){this.i=new Map}get routes(){return this.i}addFetchListener(){self.addEventListener("fetch",t=>{const{request:e}=t,r=this.handleRequest({request:e,event:t});r&&t.respondWith(r)})}addCacheListener(){self.addEventListener("message",async t=>{if(t.data&&"CACHE_URLS"===t.data.type){const{payload:e}=t.data,r=Promise.all(e.urlsToCache.map(t=>{"string"==typeof t&&(t=[t]);const e=new Request(...t);return this.handleRequest({request:e})}));t.waitUntil(r),t.ports&&t.ports[0]&&(await r,t.ports[0].postMessage(!0))}})}handleRequest({request:t,event:e}){const r=new URL(t.url,location);if(!r.protocol.startsWith("http"))return;let s,{params:n,route:o}=this.findMatchingRoute({url:r,request:t,event:e}),i=o&&o.handler;if(!i&&this.u&&(i=this.u),i){try{s=i.handle({url:r,request:t,event:e,params:n})}catch(t){s=Promise.reject(t)}return s&&this.h&&(s=s.catch(t=>this.h.handle({url:r,event:e,err:t}))),s}}findMatchingRoute({url:t,request:e,event:r}){const s=this.i.get(e.method)||[];for(const n of s){let s,o=n.match({url:t,request:e,event:r});if(o)return Array.isArray(o)&&o.length>0?s=o:o.constructor===Object&&Object.keys(o).length>0&&(s=o),{route:n,params:s}}return{}}setDefaultHandler(t){this.u=n(t)}setCatchHandler(t){this.h=n(t)}registerRoute(t){this.i.has(t.method)||this.i.set(t.method,[]),this.i.get(t.method).push(t)}unregisterRoute(t){if(!this.i.has(t.method))throw new r.WorkboxError("unregister-route-but-not-found-with-method",{method:t.method});const e=this.i.get(t.method).indexOf(t);if(!(e>-1))throw new r.WorkboxError("unregister-route-route-not-registered");this.i.get(t.method).splice(e,1)}}let a;const h=()=>(a||((a=new c).addFetchListener(),a.addCacheListener()),a);return t.NavigationRoute=i,t.RegExpRoute=u,t.registerNavigationRoute=((t,r={})=>{const s=e.cacheNames.getPrecacheName(r.cacheName),n=new i(async()=>{try{const e=await caches.match(t,{cacheName:s});if(e)return e;throw new Error(`The cache ${s} did not have an entry for `+`${t}.`)}catch(e){return fetch(t)}},{whitelist:r.whitelist,blacklist:r.blacklist});return h().registerRoute(n),n}),t.registerRoute=((t,e,s="GET")=>{let n;if("string"==typeof t){const r=new URL(t,location);n=new o(({url:t})=>t.href===r.href,e,s)}else if(t instanceof RegExp)n=new u(t,e,s);else if("function"==typeof t)n=new o(t,e,s);else{if(!(t instanceof o))throw new r.WorkboxError("unsupported-route-type",{moduleName:"workbox-routing",funcName:"registerRoute",paramName:"capture"});n=t}return h().registerRoute(n),n}),t.Route=o,t.Router=c,t.setCatchHandler=(t=>{h().setCatchHandler(t)}),t.setDefaultHandler=(t=>{h().setDefaultHandler(t)}),t}({},workbox.core._private,workbox.core._private); +//# sourceMappingURL=workbox-routing.prod.js.map diff --git a/workbox-v4.3.1/workbox-routing.prod.js.map b/workbox-v4.3.1/workbox-routing.prod.js.map new file mode 100644 index 00000000..56e5c0ee --- /dev/null +++ b/workbox-v4.3.1/workbox-routing.prod.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-routing.prod.js","sources":["../_version.mjs","../utils/constants.mjs","../utils/normalizeHandler.mjs","../Route.mjs","../NavigationRoute.mjs","../RegExpRoute.mjs","../Router.mjs","../utils/getOrCreateDefaultRouter.mjs","../registerNavigationRoute.mjs","../registerRoute.mjs","../setCatchHandler.mjs","../setDefaultHandler.mjs"],"sourcesContent":["try{self['workbox:routing:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n/**\n * The default HTTP method, 'GET', used when there's no specific method\n * configured for a route.\n *\n * @type {string}\n *\n * @private\n */\nexport const defaultMethod = 'GET';\n\n/**\n * The list of valid HTTP methods associated with requests that could be routed.\n *\n * @type {Array}\n *\n * @private\n */\nexport const validMethods = [\n 'DELETE',\n 'GET',\n 'HEAD',\n 'PATCH',\n 'POST',\n 'PUT',\n];\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport '../_version.mjs';\n\n/**\n * @param {function()|Object} handler Either a function, or an object with a\n * 'handle' method.\n * @return {Object} An object with a handle method.\n *\n * @private\n */\nexport const normalizeHandler = (handler) => {\n if (handler && typeof handler === 'object') {\n if (process.env.NODE_ENV !== 'production') {\n assert.hasMethod(handler, 'handle', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'handler',\n });\n }\n return handler;\n } else {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(handler, 'function', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'handler',\n });\n }\n return {handle: handler};\n }\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\n\nimport {defaultMethod, validMethods} from './utils/constants.mjs';\nimport {normalizeHandler} from './utils/normalizeHandler.mjs';\nimport './_version.mjs';\n\n/**\n * A `Route` consists of a pair of callback functions, \"match\" and \"handler\".\n * The \"match\" callback determine if a route should be used to \"handle\" a\n * request by returning a non-falsy value if it can. The \"handler\" callback\n * is called when there is a match and should return a Promise that resolves\n * to a `Response`.\n *\n * @memberof workbox.routing\n */\nclass Route {\n /**\n * Constructor for Route class.\n *\n * @param {workbox.routing.Route~matchCallback} match\n * A callback function that determines whether the route matches a given\n * `fetch` event by returning a non-falsy value.\n * @param {workbox.routing.Route~handlerCallback} handler A callback\n * function that returns a Promise resolving to a Response.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n */\n constructor(match, handler, method) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(match, 'function', {\n moduleName: 'workbox-routing',\n className: 'Route',\n funcName: 'constructor',\n paramName: 'match',\n });\n\n if (method) {\n assert.isOneOf(method, validMethods, {paramName: 'method'});\n }\n }\n\n // These values are referenced directly by Router so cannot be\n // altered by minifification.\n this.handler = normalizeHandler(handler);\n this.match = match;\n this.method = method || defaultMethod;\n }\n}\n\nexport {Route};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {Route} from './Route.mjs';\nimport './_version.mjs';\n\n/**\n * NavigationRoute makes it easy to create a [Route]{@link\n * workbox.routing.Route} that matches for browser\n * [navigation requests]{@link https://developers.google.com/web/fundamentals/primers/service-workers/high-performance-loading#first_what_are_navigation_requests}.\n *\n * It will only match incoming Requests whose\n * [`mode`]{@link https://fetch.spec.whatwg.org/#concept-request-mode}\n * is set to `navigate`.\n *\n * You can optionally only apply this route to a subset of navigation requests\n * by using one or both of the `blacklist` and `whitelist` parameters.\n *\n * @memberof workbox.routing\n * @extends workbox.routing.Route\n */\nclass NavigationRoute extends Route {\n /**\n * If both `blacklist` and `whiltelist` are provided, the `blacklist` will\n * take precedence and the request will not match this route.\n *\n * The regular expressions in `whitelist` and `blacklist`\n * are matched against the concatenated\n * [`pathname`]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/pathname}\n * and [`search`]{@link https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/search}\n * portions of the requested URL.\n *\n * @param {workbox.routing.Route~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n * @param {Object} options\n * @param {Array} [options.blacklist] If any of these patterns match,\n * the route will not handle the request (even if a whitelist RegExp matches).\n * @param {Array} [options.whitelist=[/./]] If any of these patterns\n * match the URL's pathname and search parameter, the route will handle the\n * request (assuming the blacklist doesn't match).\n */\n constructor(handler, {whitelist = [/./], blacklist = []} = {}) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isArrayOfClass(whitelist, RegExp, {\n moduleName: 'workbox-routing',\n className: 'NavigationRoute',\n funcName: 'constructor',\n paramName: 'options.whitelist',\n });\n assert.isArrayOfClass(blacklist, RegExp, {\n moduleName: 'workbox-routing',\n className: 'NavigationRoute',\n funcName: 'constructor',\n paramName: 'options.blacklist',\n });\n }\n\n super((options) => this._match(options), handler);\n\n this._whitelist = whitelist;\n this._blacklist = blacklist;\n }\n\n /**\n * Routes match handler.\n *\n * @param {Object} options\n * @param {URL} options.url\n * @param {Request} options.request\n * @return {boolean}\n *\n * @private\n */\n _match({url, request}) {\n if (request.mode !== 'navigate') {\n return false;\n }\n\n const pathnameAndSearch = url.pathname + url.search;\n\n for (const regExp of this._blacklist) {\n if (regExp.test(pathnameAndSearch)) {\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`The navigation route is not being used, since the ` +\n `URL matches this blacklist pattern: ${regExp}`);\n }\n return false;\n }\n }\n\n if (this._whitelist.some((regExp) => regExp.test(pathnameAndSearch))) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`The navigation route is being used.`);\n }\n return true;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`The navigation route is not being used, since the URL ` +\n `being navigated to doesn't match the whitelist.`);\n }\n return false;\n }\n}\n\nexport {NavigationRoute};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {Route} from './Route.mjs';\nimport './_version.mjs';\n\n/**\n * RegExpRoute makes it easy to create a regular expression based\n * [Route]{@link workbox.routing.Route}.\n *\n * For same-origin requests the RegExp only needs to match part of the URL. For\n * requests against third-party servers, you must define a RegExp that matches\n * the start of the URL.\n *\n * [See the module docs for info.]{@link https://developers.google.com/web/tools/workbox/modules/workbox-routing}\n *\n * @memberof workbox.routing\n * @extends workbox.routing.Route\n */\nclass RegExpRoute extends Route {\n /**\n * If the regulard expression contains\n * [capture groups]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#grouping-back-references},\n * th ecaptured values will be passed to the\n * [handler's]{@link workbox.routing.Route~handlerCallback} `params`\n * argument.\n *\n * @param {RegExp} regExp The regular expression to match against URLs.\n * @param {workbox.routing.Route~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n */\n constructor(regExp, handler, method) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(regExp, RegExp, {\n moduleName: 'workbox-routing',\n className: 'RegExpRoute',\n funcName: 'constructor',\n paramName: 'pattern',\n });\n }\n\n const match = ({url}) => {\n const result = regExp.exec(url.href);\n\n // Return null immediately if there's no match.\n if (!result) {\n return null;\n }\n\n // Require that the match start at the first character in the URL string\n // if it's a cross-origin request.\n // See https://github.com/GoogleChrome/workbox/issues/281 for the context\n // behind this behavior.\n if ((url.origin !== location.origin) && (result.index !== 0)) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(\n `The regular expression '${regExp}' only partially matched ` +\n `against the cross-origin URL '${url}'. RegExpRoute's will only ` +\n `handle cross-origin requests if they match the entire URL.`\n );\n }\n\n return null;\n }\n\n // If the route matches, but there aren't any capture groups defined, then\n // this will return [], which is truthy and therefore sufficient to\n // indicate a match.\n // If there are capture groups, then it will return their values.\n return result.slice(1);\n };\n\n super(match, handler, method);\n }\n}\n\nexport {RegExpRoute};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs';\n\nimport {normalizeHandler} from './utils/normalizeHandler.mjs';\nimport './_version.mjs';\n\n/**\n * The Router can be used to process a FetchEvent through one or more\n * [Routes]{@link workbox.routing.Route} responding with a Request if\n * a matching route exists.\n *\n * If no route matches a given a request, the Router will use a \"default\"\n * handler if one is defined.\n *\n * Should the matching Route throw an error, the Router will use a \"catch\"\n * handler if one is defined to gracefully deal with issues and respond with a\n * Request.\n *\n * If a request matches multiple routes, the **earliest** registered route will\n * be used to respond to the request.\n *\n * @memberof workbox.routing\n */\nclass Router {\n /**\n * Initializes a new Router.\n */\n constructor() {\n this._routes = new Map();\n }\n\n /**\n * @return {Map>} routes A `Map` of HTTP\n * method name ('GET', etc.) to an array of all the corresponding `Route`\n * instances that are registered.\n */\n get routes() {\n return this._routes;\n }\n\n /**\n * Adds a fetch event listener to respond to events when a route matches\n * the event's request.\n */\n addFetchListener() {\n self.addEventListener('fetch', (event) => {\n const {request} = event;\n const responsePromise = this.handleRequest({request, event});\n if (responsePromise) {\n event.respondWith(responsePromise);\n }\n });\n }\n\n /**\n * Adds a message event listener for URLs to cache from the window.\n * This is useful to cache resources loaded on the page prior to when the\n * service worker started controlling it.\n *\n * The format of the message data sent from the window should be as follows.\n * Where the `urlsToCache` array may consist of URL strings or an array of\n * URL string + `requestInit` object (the same as you'd pass to `fetch()`).\n *\n * ```\n * {\n * type: 'CACHE_URLS',\n * payload: {\n * urlsToCache: [\n * './script1.js',\n * './script2.js',\n * ['./script3.js', {mode: 'no-cors'}],\n * ],\n * },\n * }\n * ```\n */\n addCacheListener() {\n self.addEventListener('message', async (event) => {\n if (event.data && event.data.type === 'CACHE_URLS') {\n const {payload} = event.data;\n\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Caching URLs from the window`, payload.urlsToCache);\n }\n\n const requestPromises = Promise.all(payload.urlsToCache.map((entry) => {\n if (typeof entry === 'string') {\n entry = [entry];\n }\n\n const request = new Request(...entry);\n return this.handleRequest({request});\n }));\n\n event.waitUntil(requestPromises);\n\n // If a MessageChannel was used, reply to the message on success.\n if (event.ports && event.ports[0]) {\n await requestPromises;\n event.ports[0].postMessage(true);\n }\n }\n });\n }\n\n /**\n * Apply the routing rules to a FetchEvent object to get a Response from an\n * appropriate Route's handler.\n *\n * @param {Object} options\n * @param {Request} options.request The request to handle (this is usually\n * from a fetch event, but it does not have to be).\n * @param {FetchEvent} [options.event] The event that triggered the request,\n * if applicable.\n * @return {Promise|undefined} A promise is returned if a\n * registered route can handle the request. If there is no matching\n * route and there's no `defaultHandler`, `undefined` is returned.\n */\n handleRequest({request, event}) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'handleRequest',\n paramName: 'options.request',\n });\n }\n\n const url = new URL(request.url, location);\n if (!url.protocol.startsWith('http')) {\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(\n `Workbox Router only supports URLs that start with 'http'.`);\n }\n return;\n }\n\n let {params, route} = this.findMatchingRoute({url, request, event});\n let handler = route && route.handler;\n\n let debugMessages = [];\n if (process.env.NODE_ENV !== 'production') {\n if (handler) {\n debugMessages.push([\n `Found a route to handle this request:`, route,\n ]);\n\n if (params) {\n debugMessages.push([\n `Passing the following params to the route's handler:`, params,\n ]);\n }\n }\n }\n\n // If we don't have a handler because there was no matching route, then\n // fall back to defaultHandler if that's defined.\n if (!handler && this._defaultHandler) {\n if (process.env.NODE_ENV !== 'production') {\n debugMessages.push(`Failed to find a matching route. Falling ` +\n `back to the default handler.`);\n\n // This is used for debugging in logs in the case of an error.\n route = '[Default Handler]';\n }\n handler = this._defaultHandler;\n }\n\n if (!handler) {\n if (process.env.NODE_ENV !== 'production') {\n // No handler so Workbox will do nothing. If logs is set of debug\n // i.e. verbose, we should print out this information.\n logger.debug(`No route found for: ${getFriendlyURL(url)}`);\n }\n return;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n // We have a handler, meaning Workbox is going to handle the route.\n // print the routing details to the console.\n logger.groupCollapsed(`Router is responding to: ${getFriendlyURL(url)}`);\n debugMessages.forEach((msg) => {\n if (Array.isArray(msg)) {\n logger.log(...msg);\n } else {\n logger.log(msg);\n }\n });\n\n // The Request and Response objects contains a great deal of information,\n // hide it under a group in case developers want to see it.\n logger.groupCollapsed(`View request details here.`);\n logger.log(request);\n logger.groupEnd();\n\n logger.groupEnd();\n }\n\n // Wrap in try and catch in case the handle method throws a synchronous\n // error. It should still callback to the catch handler.\n let responsePromise;\n try {\n responsePromise = handler.handle({url, request, event, params});\n } catch (err) {\n responsePromise = Promise.reject(err);\n }\n\n if (responsePromise && this._catchHandler) {\n responsePromise = responsePromise.catch((err) => {\n if (process.env.NODE_ENV !== 'production') {\n // Still include URL here as it will be async from the console group\n // and may not make sense without the URL\n logger.groupCollapsed(`Error thrown when responding to: ` +\n ` ${getFriendlyURL(url)}. Falling back to Catch Handler.`);\n logger.error(`Error thrown by:`, route);\n logger.error(err);\n logger.groupEnd();\n }\n return this._catchHandler.handle({url, event, err});\n });\n }\n\n return responsePromise;\n }\n\n /**\n * Checks a request and URL (and optionally an event) against the list of\n * registered routes, and if there's a match, returns the corresponding\n * route along with any params generated by the match.\n *\n * @param {Object} options\n * @param {URL} options.url\n * @param {Request} options.request The request to match.\n * @param {FetchEvent} [options.event] The corresponding event (unless N/A).\n * @return {Object} An object with `route` and `params` properties.\n * They are populated if a matching route was found or `undefined`\n * otherwise.\n */\n findMatchingRoute({url, request, event}) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(url, URL, {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'findMatchingRoute',\n paramName: 'options.url',\n });\n assert.isInstance(request, Request, {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'findMatchingRoute',\n paramName: 'options.request',\n });\n }\n\n const routes = this._routes.get(request.method) || [];\n for (const route of routes) {\n let params;\n let matchResult = route.match({url, request, event});\n if (matchResult) {\n if (Array.isArray(matchResult) && matchResult.length > 0) {\n // Instead of passing an empty array in as params, use undefined.\n params = matchResult;\n } else if ((matchResult.constructor === Object &&\n Object.keys(matchResult).length > 0)) {\n // Instead of passing an empty object in as params, use undefined.\n params = matchResult;\n }\n\n // Return early if have a match.\n return {route, params};\n }\n }\n // If no match was found above, return and empty object.\n return {};\n }\n\n /**\n * Define a default `handler` that's called when no routes explicitly\n * match the incoming request.\n *\n * Without a default handler, unmatched requests will go against the\n * network as if there were no service worker present.\n *\n * @param {workbox.routing.Route~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n */\n setDefaultHandler(handler) {\n this._defaultHandler = normalizeHandler(handler);\n }\n\n /**\n * If a Route throws an error while handling a request, this `handler`\n * will be called and given a chance to provide a response.\n *\n * @param {workbox.routing.Route~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n */\n setCatchHandler(handler) {\n this._catchHandler = normalizeHandler(handler);\n }\n\n /**\n * Registers a route with the router.\n *\n * @param {workbox.routing.Route} route The route to register.\n */\n registerRoute(route) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(route, 'object', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route',\n });\n\n assert.hasMethod(route, 'match', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route',\n });\n\n assert.isType(route.handler, 'object', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route',\n });\n\n assert.hasMethod(route.handler, 'handle', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route.handler',\n });\n\n assert.isType(route.method, 'string', {\n moduleName: 'workbox-routing',\n className: 'Router',\n funcName: 'registerRoute',\n paramName: 'route.method',\n });\n }\n\n if (!this._routes.has(route.method)) {\n this._routes.set(route.method, []);\n }\n\n // Give precedence to all of the earlier routes by adding this additional\n // route to the end of the array.\n this._routes.get(route.method).push(route);\n }\n\n /**\n * Unregisters a route with the router.\n *\n * @param {workbox.routing.Route} route The route to unregister.\n */\n unregisterRoute(route) {\n if (!this._routes.has(route.method)) {\n throw new WorkboxError(\n 'unregister-route-but-not-found-with-method', {\n method: route.method,\n }\n );\n }\n\n const routeIndex = this._routes.get(route.method).indexOf(route);\n if (routeIndex > -1) {\n this._routes.get(route.method).splice(routeIndex, 1);\n } else {\n throw new WorkboxError('unregister-route-route-not-registered');\n }\n }\n}\n\nexport {Router};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {Router} from '../Router.mjs';\nimport '../_version.mjs';\n\nlet defaultRouter;\n\n/**\n * Creates a new, singleton Router instance if one does not exist. If one\n * does already exist, that instance is returned.\n *\n * @private\n * @return {Router}\n */\nexport const getOrCreateDefaultRouter = () => {\n if (!defaultRouter) {\n defaultRouter = new Router();\n\n // The helpers that use the default Router assume these listeners exist.\n defaultRouter.addFetchListener();\n defaultRouter.addCacheListener();\n }\n return defaultRouter;\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {cacheNames} from 'workbox-core/_private/cacheNames.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {NavigationRoute} from './NavigationRoute.mjs';\nimport {getOrCreateDefaultRouter} from './utils/getOrCreateDefaultRouter.mjs';\nimport './_version.mjs';\n\n\n/**\n * Registers a route that will return a precached file for a navigation\n * request. This is useful for the\n * [application shell pattern]{@link https://developers.google.com/web/fundamentals/architecture/app-shell}.\n *\n * When determining the URL of the precached HTML document, you will likely need\n * to call `workbox.precaching.getCacheKeyForURL(originalUrl)`, to account for\n * the fact that Workbox's precaching naming conventions often results in URL\n * cache keys that contain extra revisioning info.\n *\n * This method will generate a\n * [NavigationRoute]{@link workbox.routing.NavigationRoute}\n * and call\n * [Router.registerRoute()]{@link workbox.routing.Router#registerRoute} on a\n * singleton Router instance.\n *\n * @param {string} cachedAssetUrl The cache key to use for the HTML file.\n * @param {Object} [options]\n * @param {string} [options.cacheName] Cache name to store and retrieve\n * requests. Defaults to precache cache name provided by\n * [workbox-core.cacheNames]{@link workbox.core.cacheNames}.\n * @param {Array} [options.blacklist=[]] If any of these patterns\n * match, the route will not handle the request (even if a whitelist entry\n * matches).\n * @param {Array} [options.whitelist=[/./]] If any of these patterns\n * match the URL's pathname and search parameter, the route will handle the\n * request (assuming the blacklist doesn't match).\n * @return {workbox.routing.NavigationRoute} Returns the generated\n * Route.\n *\n * @alias workbox.routing.registerNavigationRoute\n */\nexport const registerNavigationRoute = (cachedAssetUrl, options = {}) => {\n if (process.env.NODE_ENV !== 'production') {\n assert.isType(cachedAssetUrl, 'string', {\n moduleName: 'workbox-routing',\n funcName: 'registerNavigationRoute',\n paramName: 'cachedAssetUrl',\n });\n }\n\n const cacheName = cacheNames.getPrecacheName(options.cacheName);\n const handler = async () => {\n try {\n const response = await caches.match(cachedAssetUrl, {cacheName});\n\n if (response) {\n return response;\n }\n\n // This shouldn't normally happen, but there are edge cases:\n // https://github.com/GoogleChrome/workbox/issues/1441\n throw new Error(`The cache ${cacheName} did not have an entry for ` +\n `${cachedAssetUrl}.`);\n } catch (error) {\n // If there's either a cache miss, or the caches.match() call threw\n // an exception, then attempt to fulfill the navigation request with\n // a response from the network rather than leaving the user with a\n // failed navigation.\n if (process.env.NODE_ENV !== 'production') {\n logger.debug(`Unable to respond to navigation request with ` +\n `cached response. Falling back to network.`, error);\n }\n\n // This might still fail if the browser is offline...\n return fetch(cachedAssetUrl);\n }\n };\n\n const route = new NavigationRoute(handler, {\n whitelist: options.whitelist,\n blacklist: options.blacklist,\n });\n\n const defaultRouter = getOrCreateDefaultRouter();\n defaultRouter.registerRoute(route);\n\n return route;\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\nimport {Route} from './Route.mjs';\nimport {RegExpRoute} from './RegExpRoute.mjs';\nimport {getOrCreateDefaultRouter} from './utils/getOrCreateDefaultRouter.mjs';\nimport './_version.mjs';\n\n\n/**\n * Easily register a RegExp, string, or function with a caching\n * strategy to a singleton Router instance.\n *\n * This method will generate a Route for you if needed and\n * call [Router.registerRoute()]{@link\n * workbox.routing.Router#registerRoute}.\n *\n * @param {\n * RegExp|\n * string|\n * workbox.routing.Route~matchCallback|\n * workbox.routing.Route\n * } capture\n * If the capture param is a `Route`, all other arguments will be ignored.\n * @param {workbox.routing.Route~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n * @param {string} [method='GET'] The HTTP method to match the Route\n * against.\n * @return {workbox.routing.Route} The generated `Route`(Useful for\n * unregistering).\n *\n * @alias workbox.routing.registerRoute\n */\nexport const registerRoute = (capture, handler, method = 'GET') => {\n let route;\n\n if (typeof capture === 'string') {\n const captureUrl = new URL(capture, location);\n\n if (process.env.NODE_ENV !== 'production') {\n if (!(capture.startsWith('/') || capture.startsWith('http'))) {\n throw new WorkboxError('invalid-string', {\n moduleName: 'workbox-routing',\n funcName: 'registerRoute',\n paramName: 'capture',\n });\n }\n\n // We want to check if Express-style wildcards are in the pathname only.\n // TODO: Remove this log message in v4.\n const valueToCheck = capture.startsWith('http') ?\n captureUrl.pathname : capture;\n\n // See https://github.com/pillarjs/path-to-regexp#parameters\n const wildcards = '[*:?+]';\n if (valueToCheck.match(new RegExp(`${wildcards}`))) {\n logger.debug(\n `The '$capture' parameter contains an Express-style wildcard ` +\n `character (${wildcards}). Strings are now always interpreted as ` +\n `exact matches; use a RegExp for partial or wildcard matches.`\n );\n }\n }\n\n const matchCallback = ({url}) => {\n if (process.env.NODE_ENV !== 'production') {\n if ((url.pathname === captureUrl.pathname) &&\n (url.origin !== captureUrl.origin)) {\n logger.debug(\n `${capture} only partially matches the cross-origin URL ` +\n `${url}. This route will only handle cross-origin requests ` +\n `if they match the entire URL.`);\n }\n }\n\n return url.href === captureUrl.href;\n };\n\n route = new Route(matchCallback, handler, method);\n } else if (capture instanceof RegExp) {\n route = new RegExpRoute(capture, handler, method);\n } else if (typeof capture === 'function') {\n route = new Route(capture, handler, method);\n } else if (capture instanceof Route) {\n route = capture;\n } else {\n throw new WorkboxError('unsupported-route-type', {\n moduleName: 'workbox-routing',\n funcName: 'registerRoute',\n paramName: 'capture',\n });\n }\n\n const defaultRouter = getOrCreateDefaultRouter();\n defaultRouter.registerRoute(route);\n\n return route;\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {getOrCreateDefaultRouter} from './utils/getOrCreateDefaultRouter.mjs';\n\nimport './_version.mjs';\n\n/**\n * If a Route throws an error while handling a request, this `handler`\n * will be called and given a chance to provide a response.\n *\n * @param {workbox.routing.Route~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n *\n * @alias workbox.routing.setCatchHandler\n */\nexport const setCatchHandler = (handler) => {\n const defaultRouter = getOrCreateDefaultRouter();\n defaultRouter.setCatchHandler(handler);\n};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {getOrCreateDefaultRouter} from './utils/getOrCreateDefaultRouter.mjs';\n\nimport './_version.mjs';\n\n/**\n * Define a default `handler` that's called when no routes explicitly\n * match the incoming request.\n *\n * Without a default handler, unmatched requests will go against the\n * network as if there were no service worker present.\n *\n * @param {workbox.routing.Route~handlerCallback} handler A callback\n * function that returns a Promise resulting in a Response.\n *\n * @alias workbox.routing.setDefaultHandler\n */\nexport const setDefaultHandler = (handler) => {\n const defaultRouter = getOrCreateDefaultRouter();\n defaultRouter.setDefaultHandler(handler);\n};\n"],"names":["self","_","e","defaultMethod","normalizeHandler","handler","handle","Route","constructor","match","method","NavigationRoute","whitelist","blacklist","options","this","_match","_whitelist","_blacklist","url","request","mode","pathnameAndSearch","pathname","search","regExp","test","some","RegExpRoute","result","exec","href","origin","location","index","slice","Router","_routes","Map","addFetchListener","addEventListener","event","responsePromise","handleRequest","respondWith","addCacheListener","async","data","type","payload","requestPromises","Promise","all","urlsToCache","map","entry","Request","waitUntil","ports","postMessage","URL","protocol","startsWith","params","route","findMatchingRoute","_defaultHandler","err","reject","_catchHandler","catch","routes","get","matchResult","Array","isArray","length","Object","keys","setDefaultHandler","setCatchHandler","registerRoute","has","set","push","unregisterRoute","WorkboxError","routeIndex","indexOf","splice","defaultRouter","getOrCreateDefaultRouter","cachedAssetUrl","cacheName","cacheNames","getPrecacheName","response","caches","Error","error","fetch","capture","captureUrl","RegExp","moduleName","funcName","paramName"],"mappings":"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"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-strategies.dev.js b/workbox-v4.3.1/workbox-strategies.dev.js new file mode 100644 index 00000000..e88a65d8 --- /dev/null +++ b/workbox-v4.3.1/workbox-strategies.dev.js @@ -0,0 +1,1138 @@ +this.workbox = this.workbox || {}; +this.workbox.strategies = (function (exports, logger_mjs, assert_mjs, cacheNames_mjs, cacheWrapper_mjs, fetchWrapper_mjs, getFriendlyURL_mjs, WorkboxError_mjs) { + 'use strict'; + + try { + self['workbox:strategies:4.3.1'] && _(); + } catch (e) {} // eslint-disable-line + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + + const getFriendlyURL = url => { + const urlObj = new URL(url, location); + + if (urlObj.origin === location.origin) { + return urlObj.pathname; + } + + return urlObj.href; + }; + + const messages = { + strategyStart: (strategyName, request) => `Using ${strategyName} to ` + `respond to '${getFriendlyURL(request.url)}'`, + printFinalResponse: response => { + if (response) { + logger_mjs.logger.groupCollapsed(`View the final response here.`); + logger_mjs.logger.log(response); + logger_mjs.logger.groupEnd(); + } + } + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * An implementation of a [cache-first]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#cache-falling-back-to-network} + * request strategy. + * + * A cache first strategy is useful for assets that have been revisioned, + * such as URLs like `/styles/example.a8f5f1.css`, since they + * can be cached for long periods of time. + * + * If the network request fails, and there is no cache match, this will throw + * a `WorkboxError` exception. + * + * @memberof workbox.strategies + */ + + class CacheFirst { + /** + * @param {Object} options + * @param {string} options.cacheName Cache name to store and retrieve + * requests. Defaults to cache names provided by + * [workbox-core]{@link workbox.core.cacheNames}. + * @param {Array} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} + * to use in conjunction with this caching strategy. + * @param {Object} options.fetchOptions Values passed along to the + * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) + * of all fetch() requests made by this strategy. + * @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions) + */ + constructor(options = {}) { + this._cacheName = cacheNames_mjs.cacheNames.getRuntimeName(options.cacheName); + this._plugins = options.plugins || []; + this._fetchOptions = options.fetchOptions || null; + this._matchOptions = options.matchOptions || null; + } + /** + * This method will perform a request strategy and follows an API that + * will work with the + * [Workbox Router]{@link workbox.routing.Router}. + * + * @param {Object} options + * @param {Request} options.request The request to run this strategy for. + * @param {Event} [options.event] The event that triggered the request. + * @return {Promise} + */ + + + async handle({ + event, + request + }) { + return this.makeRequest({ + event, + request: request || event.request + }); + } + /** + * This method can be used to perform a make a standalone request outside the + * context of the [Workbox Router]{@link workbox.routing.Router}. + * + * See "[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)" + * for more usage information. + * + * @param {Object} options + * @param {Request|string} options.request Either a + * [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request} + * object, or a string URL, corresponding to the request to be made. + * @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will + be called automatically to extend the service worker's lifetime. + * @return {Promise} + */ + + + async makeRequest({ + event, + request + }) { + const logs = []; + + if (typeof request === 'string') { + request = new Request(request); + } + + { + assert_mjs.assert.isInstance(request, Request, { + moduleName: 'workbox-strategies', + className: 'CacheFirst', + funcName: 'makeRequest', + paramName: 'request' + }); + } + + let response = await cacheWrapper_mjs.cacheWrapper.match({ + cacheName: this._cacheName, + request, + event, + matchOptions: this._matchOptions, + plugins: this._plugins + }); + let error; + + if (!response) { + { + logs.push(`No response found in the '${this._cacheName}' cache. ` + `Will respond with a network request.`); + } + + try { + response = await this._getFromNetwork(request, event); + } catch (err) { + error = err; + } + + { + if (response) { + logs.push(`Got response from network.`); + } else { + logs.push(`Unable to get a response from the network.`); + } + } + } else { + { + logs.push(`Found a cached response in the '${this._cacheName}' cache.`); + } + } + + { + logger_mjs.logger.groupCollapsed(messages.strategyStart('CacheFirst', request)); + + for (let log of logs) { + logger_mjs.logger.log(log); + } + + messages.printFinalResponse(response); + logger_mjs.logger.groupEnd(); + } + + if (!response) { + throw new WorkboxError_mjs.WorkboxError('no-response', { + url: request.url, + error + }); + } + + return response; + } + /** + * Handles the network and cache part of CacheFirst. + * + * @param {Request} request + * @param {FetchEvent} [event] + * @return {Promise} + * + * @private + */ + + + async _getFromNetwork(request, event) { + const response = await fetchWrapper_mjs.fetchWrapper.fetch({ + request, + event, + fetchOptions: this._fetchOptions, + plugins: this._plugins + }); // Keep the service worker while we put the request to the cache + + const responseClone = response.clone(); + const cachePutPromise = cacheWrapper_mjs.cacheWrapper.put({ + cacheName: this._cacheName, + request, + response: responseClone, + event, + plugins: this._plugins + }); + + if (event) { + try { + event.waitUntil(cachePutPromise); + } catch (error) { + { + logger_mjs.logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache for '${getFriendlyURL_mjs.getFriendlyURL(request.url)}'.`); + } + } + } + + return response; + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * An implementation of a + * [cache-only]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#cache-only} + * request strategy. + * + * This class is useful if you want to take advantage of any + * [Workbox plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}. + * + * If there is no cache match, this will throw a `WorkboxError` exception. + * + * @memberof workbox.strategies + */ + + class CacheOnly { + /** + * @param {Object} options + * @param {string} options.cacheName Cache name to store and retrieve + * requests. Defaults to cache names provided by + * [workbox-core]{@link workbox.core.cacheNames}. + * @param {Array} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} + * to use in conjunction with this caching strategy. + * @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions) + */ + constructor(options = {}) { + this._cacheName = cacheNames_mjs.cacheNames.getRuntimeName(options.cacheName); + this._plugins = options.plugins || []; + this._matchOptions = options.matchOptions || null; + } + /** + * This method will perform a request strategy and follows an API that + * will work with the + * [Workbox Router]{@link workbox.routing.Router}. + * + * @param {Object} options + * @param {Request} options.request The request to run this strategy for. + * @param {Event} [options.event] The event that triggered the request. + * @return {Promise} + */ + + + async handle({ + event, + request + }) { + return this.makeRequest({ + event, + request: request || event.request + }); + } + /** + * This method can be used to perform a make a standalone request outside the + * context of the [Workbox Router]{@link workbox.routing.Router}. + * + * See "[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)" + * for more usage information. + * + * @param {Object} options + * @param {Request|string} options.request Either a + * [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request} + * object, or a string URL, corresponding to the request to be made. + * @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will + * be called automatically to extend the service worker's lifetime. + * @return {Promise} + */ + + + async makeRequest({ + event, + request + }) { + if (typeof request === 'string') { + request = new Request(request); + } + + { + assert_mjs.assert.isInstance(request, Request, { + moduleName: 'workbox-strategies', + className: 'CacheOnly', + funcName: 'makeRequest', + paramName: 'request' + }); + } + + const response = await cacheWrapper_mjs.cacheWrapper.match({ + cacheName: this._cacheName, + request, + event, + matchOptions: this._matchOptions, + plugins: this._plugins + }); + + { + logger_mjs.logger.groupCollapsed(messages.strategyStart('CacheOnly', request)); + + if (response) { + logger_mjs.logger.log(`Found a cached response in the '${this._cacheName}'` + ` cache.`); + messages.printFinalResponse(response); + } else { + logger_mjs.logger.log(`No response found in the '${this._cacheName}' cache.`); + } + + logger_mjs.logger.groupEnd(); + } + + if (!response) { + throw new WorkboxError_mjs.WorkboxError('no-response', { + url: request.url + }); + } + + return response; + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const cacheOkAndOpaquePlugin = { + /** + * Returns a valid response (to allow caching) if the status is 200 (OK) or + * 0 (opaque). + * + * @param {Object} options + * @param {Response} options.response + * @return {Response|null} + * + * @private + */ + cacheWillUpdate: ({ + response + }) => { + if (response.status === 200 || response.status === 0) { + return response; + } + + return null; + } + }; + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * An implementation of a + * [network first]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-falling-back-to-cache} + * request strategy. + * + * By default, this strategy will cache responses with a 200 status code as + * well as [opaque responses]{@link https://developers.google.com/web/tools/workbox/guides/handle-third-party-requests}. + * Opaque responses are are cross-origin requests where the response doesn't + * support [CORS]{@link https://enable-cors.org/}. + * + * If the network request fails, and there is no cache match, this will throw + * a `WorkboxError` exception. + * + * @memberof workbox.strategies + */ + + class NetworkFirst { + /** + * @param {Object} options + * @param {string} options.cacheName Cache name to store and retrieve + * requests. Defaults to cache names provided by + * [workbox-core]{@link workbox.core.cacheNames}. + * @param {Array} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} + * to use in conjunction with this caching strategy. + * @param {Object} options.fetchOptions Values passed along to the + * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) + * of all fetch() requests made by this strategy. + * @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions) + * @param {number} options.networkTimeoutSeconds If set, any network requests + * that fail to respond within the timeout will fallback to the cache. + * + * This option can be used to combat + * "[lie-fi]{@link https://developers.google.com/web/fundamentals/performance/poor-connectivity/#lie-fi}" + * scenarios. + */ + constructor(options = {}) { + this._cacheName = cacheNames_mjs.cacheNames.getRuntimeName(options.cacheName); + + if (options.plugins) { + let isUsingCacheWillUpdate = options.plugins.some(plugin => !!plugin.cacheWillUpdate); + this._plugins = isUsingCacheWillUpdate ? options.plugins : [cacheOkAndOpaquePlugin, ...options.plugins]; + } else { + // No plugins passed in, use the default plugin. + this._plugins = [cacheOkAndOpaquePlugin]; + } + + this._networkTimeoutSeconds = options.networkTimeoutSeconds; + + { + if (this._networkTimeoutSeconds) { + assert_mjs.assert.isType(this._networkTimeoutSeconds, 'number', { + moduleName: 'workbox-strategies', + className: 'NetworkFirst', + funcName: 'constructor', + paramName: 'networkTimeoutSeconds' + }); + } + } + + this._fetchOptions = options.fetchOptions || null; + this._matchOptions = options.matchOptions || null; + } + /** + * This method will perform a request strategy and follows an API that + * will work with the + * [Workbox Router]{@link workbox.routing.Router}. + * + * @param {Object} options + * @param {Request} options.request The request to run this strategy for. + * @param {Event} [options.event] The event that triggered the request. + * @return {Promise} + */ + + + async handle({ + event, + request + }) { + return this.makeRequest({ + event, + request: request || event.request + }); + } + /** + * This method can be used to perform a make a standalone request outside the + * context of the [Workbox Router]{@link workbox.routing.Router}. + * + * See "[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)" + * for more usage information. + * + * @param {Object} options + * @param {Request|string} options.request Either a + * [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request} + * object, or a string URL, corresponding to the request to be made. + * @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will + * be called automatically to extend the service worker's lifetime. + * @return {Promise} + */ + + + async makeRequest({ + event, + request + }) { + const logs = []; + + if (typeof request === 'string') { + request = new Request(request); + } + + { + assert_mjs.assert.isInstance(request, Request, { + moduleName: 'workbox-strategies', + className: 'NetworkFirst', + funcName: 'handle', + paramName: 'makeRequest' + }); + } + + const promises = []; + let timeoutId; + + if (this._networkTimeoutSeconds) { + const { + id, + promise + } = this._getTimeoutPromise({ + request, + event, + logs + }); + + timeoutId = id; + promises.push(promise); + } + + const networkPromise = this._getNetworkPromise({ + timeoutId, + request, + event, + logs + }); + + promises.push(networkPromise); // Promise.race() will resolve as soon as the first promise resolves. + + let response = await Promise.race(promises); // If Promise.race() resolved with null, it might be due to a network + // timeout + a cache miss. If that were to happen, we'd rather wait until + // the networkPromise resolves instead of returning null. + // Note that it's fine to await an already-resolved promise, so we don't + // have to check to see if it's still "in flight". + + if (!response) { + response = await networkPromise; + } + + { + logger_mjs.logger.groupCollapsed(messages.strategyStart('NetworkFirst', request)); + + for (let log of logs) { + logger_mjs.logger.log(log); + } + + messages.printFinalResponse(response); + logger_mjs.logger.groupEnd(); + } + + if (!response) { + throw new WorkboxError_mjs.WorkboxError('no-response', { + url: request.url + }); + } + + return response; + } + /** + * @param {Object} options + * @param {Request} options.request + * @param {Array} options.logs A reference to the logs array + * @param {Event} [options.event] + * @return {Promise} + * + * @private + */ + + + _getTimeoutPromise({ + request, + logs, + event + }) { + let timeoutId; + const timeoutPromise = new Promise(resolve => { + const onNetworkTimeout = async () => { + { + logs.push(`Timing out the network response at ` + `${this._networkTimeoutSeconds} seconds.`); + } + + resolve((await this._respondFromCache({ + request, + event + }))); + }; + + timeoutId = setTimeout(onNetworkTimeout, this._networkTimeoutSeconds * 1000); + }); + return { + promise: timeoutPromise, + id: timeoutId + }; + } + /** + * @param {Object} options + * @param {number|undefined} options.timeoutId + * @param {Request} options.request + * @param {Array} options.logs A reference to the logs Array. + * @param {Event} [options.event] + * @return {Promise} + * + * @private + */ + + + async _getNetworkPromise({ + timeoutId, + request, + logs, + event + }) { + let error; + let response; + + try { + response = await fetchWrapper_mjs.fetchWrapper.fetch({ + request, + event, + fetchOptions: this._fetchOptions, + plugins: this._plugins + }); + } catch (err) { + error = err; + } + + if (timeoutId) { + clearTimeout(timeoutId); + } + + { + if (response) { + logs.push(`Got response from network.`); + } else { + logs.push(`Unable to get a response from the network. Will respond ` + `with a cached response.`); + } + } + + if (error || !response) { + response = await this._respondFromCache({ + request, + event + }); + + { + if (response) { + logs.push(`Found a cached response in the '${this._cacheName}'` + ` cache.`); + } else { + logs.push(`No response found in the '${this._cacheName}' cache.`); + } + } + } else { + // Keep the service worker alive while we put the request in the cache + const responseClone = response.clone(); + const cachePut = cacheWrapper_mjs.cacheWrapper.put({ + cacheName: this._cacheName, + request, + response: responseClone, + event, + plugins: this._plugins + }); + + if (event) { + try { + // The event has been responded to so we can keep the SW alive to + // respond to the request + event.waitUntil(cachePut); + } catch (err) { + { + logger_mjs.logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache for '${getFriendlyURL_mjs.getFriendlyURL(request.url)}'.`); + } + } + } + } + + return response; + } + /** + * Used if the network timeouts or fails to make the request. + * + * @param {Object} options + * @param {Request} request The request to match in the cache + * @param {Event} [options.event] + * @return {Promise} + * + * @private + */ + + + _respondFromCache({ + event, + request + }) { + return cacheWrapper_mjs.cacheWrapper.match({ + cacheName: this._cacheName, + request, + event, + matchOptions: this._matchOptions, + plugins: this._plugins + }); + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * An implementation of a + * [network-only]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-only} + * request strategy. + * + * This class is useful if you want to take advantage of any + * [Workbox plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}. + * + * If the network request fails, this will throw a `WorkboxError` exception. + * + * @memberof workbox.strategies + */ + + class NetworkOnly { + /** + * @param {Object} options + * @param {string} options.cacheName Cache name to store and retrieve + * requests. Defaults to cache names provided by + * [workbox-core]{@link workbox.core.cacheNames}. + * @param {Array} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} + * to use in conjunction with this caching strategy. + * @param {Object} options.fetchOptions Values passed along to the + * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) + * of all fetch() requests made by this strategy. + */ + constructor(options = {}) { + this._cacheName = cacheNames_mjs.cacheNames.getRuntimeName(options.cacheName); + this._plugins = options.plugins || []; + this._fetchOptions = options.fetchOptions || null; + } + /** + * This method will perform a request strategy and follows an API that + * will work with the + * [Workbox Router]{@link workbox.routing.Router}. + * + * @param {Object} options + * @param {Request} options.request The request to run this strategy for. + * @param {Event} [options.event] The event that triggered the request. + * @return {Promise} + */ + + + async handle({ + event, + request + }) { + return this.makeRequest({ + event, + request: request || event.request + }); + } + /** + * This method can be used to perform a make a standalone request outside the + * context of the [Workbox Router]{@link workbox.routing.Router}. + * + * See "[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)" + * for more usage information. + * + * @param {Object} options + * @param {Request|string} options.request Either a + * [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request} + * object, or a string URL, corresponding to the request to be made. + * @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will + * be called automatically to extend the service worker's lifetime. + * @return {Promise} + */ + + + async makeRequest({ + event, + request + }) { + if (typeof request === 'string') { + request = new Request(request); + } + + { + assert_mjs.assert.isInstance(request, Request, { + moduleName: 'workbox-strategies', + className: 'NetworkOnly', + funcName: 'handle', + paramName: 'request' + }); + } + + let error; + let response; + + try { + response = await fetchWrapper_mjs.fetchWrapper.fetch({ + request, + event, + fetchOptions: this._fetchOptions, + plugins: this._plugins + }); + } catch (err) { + error = err; + } + + { + logger_mjs.logger.groupCollapsed(messages.strategyStart('NetworkOnly', request)); + + if (response) { + logger_mjs.logger.log(`Got response from network.`); + } else { + logger_mjs.logger.log(`Unable to get a response from the network.`); + } + + messages.printFinalResponse(response); + logger_mjs.logger.groupEnd(); + } + + if (!response) { + throw new WorkboxError_mjs.WorkboxError('no-response', { + url: request.url, + error + }); + } + + return response; + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * An implementation of a + * [stale-while-revalidate]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#stale-while-revalidate} + * request strategy. + * + * Resources are requested from both the cache and the network in parallel. + * The strategy will respond with the cached version if available, otherwise + * wait for the network response. The cache is updated with the network response + * with each successful request. + * + * By default, this strategy will cache responses with a 200 status code as + * well as [opaque responses]{@link https://developers.google.com/web/tools/workbox/guides/handle-third-party-requests}. + * Opaque responses are are cross-origin requests where the response doesn't + * support [CORS]{@link https://enable-cors.org/}. + * + * If the network request fails, and there is no cache match, this will throw + * a `WorkboxError` exception. + * + * @memberof workbox.strategies + */ + + class StaleWhileRevalidate { + /** + * @param {Object} options + * @param {string} options.cacheName Cache name to store and retrieve + * requests. Defaults to cache names provided by + * [workbox-core]{@link workbox.core.cacheNames}. + * @param {Array} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins} + * to use in conjunction with this caching strategy. + * @param {Object} options.fetchOptions Values passed along to the + * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters) + * of all fetch() requests made by this strategy. + * @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions) + */ + constructor(options = {}) { + this._cacheName = cacheNames_mjs.cacheNames.getRuntimeName(options.cacheName); + this._plugins = options.plugins || []; + + if (options.plugins) { + let isUsingCacheWillUpdate = options.plugins.some(plugin => !!plugin.cacheWillUpdate); + this._plugins = isUsingCacheWillUpdate ? options.plugins : [cacheOkAndOpaquePlugin, ...options.plugins]; + } else { + // No plugins passed in, use the default plugin. + this._plugins = [cacheOkAndOpaquePlugin]; + } + + this._fetchOptions = options.fetchOptions || null; + this._matchOptions = options.matchOptions || null; + } + /** + * This method will perform a request strategy and follows an API that + * will work with the + * [Workbox Router]{@link workbox.routing.Router}. + * + * @param {Object} options + * @param {Request} options.request The request to run this strategy for. + * @param {Event} [options.event] The event that triggered the request. + * @return {Promise} + */ + + + async handle({ + event, + request + }) { + return this.makeRequest({ + event, + request: request || event.request + }); + } + /** + * This method can be used to perform a make a standalone request outside the + * context of the [Workbox Router]{@link workbox.routing.Router}. + * + * See "[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)" + * for more usage information. + * + * @param {Object} options + * @param {Request|string} options.request Either a + * [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request} + * object, or a string URL, corresponding to the request to be made. + * @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will + * be called automatically to extend the service worker's lifetime. + * @return {Promise} + */ + + + async makeRequest({ + event, + request + }) { + const logs = []; + + if (typeof request === 'string') { + request = new Request(request); + } + + { + assert_mjs.assert.isInstance(request, Request, { + moduleName: 'workbox-strategies', + className: 'StaleWhileRevalidate', + funcName: 'handle', + paramName: 'request' + }); + } + + const fetchAndCachePromise = this._getFromNetwork({ + request, + event + }); + + let response = await cacheWrapper_mjs.cacheWrapper.match({ + cacheName: this._cacheName, + request, + event, + matchOptions: this._matchOptions, + plugins: this._plugins + }); + let error; + + if (response) { + { + logs.push(`Found a cached response in the '${this._cacheName}'` + ` cache. Will update with the network response in the background.`); + } + + if (event) { + try { + event.waitUntil(fetchAndCachePromise); + } catch (error) { + { + logger_mjs.logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache for '${getFriendlyURL_mjs.getFriendlyURL(request.url)}'.`); + } + } + } + } else { + { + logs.push(`No response found in the '${this._cacheName}' cache. ` + `Will wait for the network response.`); + } + + try { + response = await fetchAndCachePromise; + } catch (err) { + error = err; + } + } + + { + logger_mjs.logger.groupCollapsed(messages.strategyStart('StaleWhileRevalidate', request)); + + for (let log of logs) { + logger_mjs.logger.log(log); + } + + messages.printFinalResponse(response); + logger_mjs.logger.groupEnd(); + } + + if (!response) { + throw new WorkboxError_mjs.WorkboxError('no-response', { + url: request.url, + error + }); + } + + return response; + } + /** + * @param {Object} options + * @param {Request} options.request + * @param {Event} [options.event] + * @return {Promise} + * + * @private + */ + + + async _getFromNetwork({ + request, + event + }) { + const response = await fetchWrapper_mjs.fetchWrapper.fetch({ + request, + event, + fetchOptions: this._fetchOptions, + plugins: this._plugins + }); + const cachePutPromise = cacheWrapper_mjs.cacheWrapper.put({ + cacheName: this._cacheName, + request, + response: response.clone(), + event, + plugins: this._plugins + }); + + if (event) { + try { + event.waitUntil(cachePutPromise); + } catch (error) { + { + logger_mjs.logger.warn(`Unable to ensure service worker stays alive when ` + `updating cache for '${getFriendlyURL_mjs.getFriendlyURL(request.url)}'.`); + } + } + } + + return response; + } + + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + const mapping = { + cacheFirst: CacheFirst, + cacheOnly: CacheOnly, + networkFirst: NetworkFirst, + networkOnly: NetworkOnly, + staleWhileRevalidate: StaleWhileRevalidate + }; + + const deprecate = strategy => { + const StrategyCtr = mapping[strategy]; + return options => { + { + const strategyCtrName = strategy[0].toUpperCase() + strategy.slice(1); + logger_mjs.logger.warn(`The 'workbox.strategies.${strategy}()' function has been ` + `deprecated and will be removed in a future version of Workbox.\n` + `Please use 'new workbox.strategies.${strategyCtrName}()' instead.`); + } + + return new StrategyCtr(options); + }; + }; + /** + * @function workbox.strategies.cacheFirst + * @param {Object} options See the {@link workbox.strategies.CacheFirst} + * constructor for more info. + * @deprecated since v4.0.0 + */ + + + const cacheFirst = deprecate('cacheFirst'); + /** + * @function workbox.strategies.cacheOnly + * @param {Object} options See the {@link workbox.strategies.CacheOnly} + * constructor for more info. + * @deprecated since v4.0.0 + */ + + const cacheOnly = deprecate('cacheOnly'); + /** + * @function workbox.strategies.networkFirst + * @param {Object} options See the {@link workbox.strategies.NetworkFirst} + * constructor for more info. + * @deprecated since v4.0.0 + */ + + const networkFirst = deprecate('networkFirst'); + /** + * @function workbox.strategies.networkOnly + * @param {Object} options See the {@link workbox.strategies.NetworkOnly} + * constructor for more info. + * @deprecated since v4.0.0 + */ + + const networkOnly = deprecate('networkOnly'); + /** + * @function workbox.strategies.staleWhileRevalidate + * @param {Object} options See the + * {@link workbox.strategies.StaleWhileRevalidate} constructor for more info. + * @deprecated since v4.0.0 + */ + + const staleWhileRevalidate = deprecate('staleWhileRevalidate'); + + exports.CacheFirst = CacheFirst; + exports.CacheOnly = CacheOnly; + exports.NetworkFirst = NetworkFirst; + exports.NetworkOnly = NetworkOnly; + exports.StaleWhileRevalidate = StaleWhileRevalidate; + exports.cacheFirst = cacheFirst; + exports.cacheOnly = cacheOnly; + exports.networkFirst = networkFirst; + exports.networkOnly = networkOnly; + exports.staleWhileRevalidate = staleWhileRevalidate; + + return exports; + +}({}, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private, workbox.core._private)); +//# sourceMappingURL=workbox-strategies.dev.js.map diff --git a/workbox-v4.3.1/workbox-strategies.dev.js.map b/workbox-v4.3.1/workbox-strategies.dev.js.map new file mode 100644 index 00000000..12df5e64 --- /dev/null +++ b/workbox-v4.3.1/workbox-strategies.dev.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-strategies.dev.js","sources":["../_version.mjs","../utils/messages.mjs","../CacheFirst.mjs","../CacheOnly.mjs","../plugins/cacheOkAndOpaquePlugin.mjs","../NetworkFirst.mjs","../NetworkOnly.mjs","../StaleWhileRevalidate.mjs","../index.mjs"],"sourcesContent":["try{self['workbox:strategies:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport '../_version.mjs';\n\nconst getFriendlyURL = (url) => {\n const urlObj = new URL(url, location);\n if (urlObj.origin === location.origin) {\n return urlObj.pathname;\n }\n return urlObj.href;\n};\n\nexport const messages = {\n strategyStart: (strategyName, request) => `Using ${strategyName} to ` +\n `respond to '${getFriendlyURL(request.url)}'`,\n printFinalResponse: (response) => {\n if (response) {\n logger.groupCollapsed(`View the final response here.`);\n logger.log(response);\n logger.groupEnd();\n }\n },\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {cacheNames} from 'workbox-core/_private/cacheNames.mjs';\nimport {cacheWrapper} from 'workbox-core/_private/cacheWrapper.mjs';\nimport {fetchWrapper} from 'workbox-core/_private/fetchWrapper.mjs';\nimport {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\n\nimport {messages} from './utils/messages.mjs';\nimport './_version.mjs';\n\n/**\n * An implementation of a [cache-first]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#cache-falling-back-to-network}\n * request strategy.\n *\n * A cache first strategy is useful for assets that have been revisioned,\n * such as URLs like `/styles/example.a8f5f1.css`, since they\n * can be cached for long periods of time.\n *\n * If the network request fails, and there is no cache match, this will throw\n * a `WorkboxError` exception.\n *\n * @memberof workbox.strategies\n */\nclass CacheFirst {\n /**\n * @param {Object} options\n * @param {string} options.cacheName Cache name to store and retrieve\n * requests. Defaults to cache names provided by\n * [workbox-core]{@link workbox.core.cacheNames}.\n * @param {Array} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} options.fetchOptions Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of all fetch() requests made by this strategy.\n * @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions)\n */\n constructor(options = {}) {\n this._cacheName = cacheNames.getRuntimeName(options.cacheName);\n this._plugins = options.plugins || [];\n this._fetchOptions = options.fetchOptions || null;\n this._matchOptions = options.matchOptions || null;\n }\n\n /**\n * This method will perform a request strategy and follows an API that\n * will work with the\n * [Workbox Router]{@link workbox.routing.Router}.\n *\n * @param {Object} options\n * @param {Request} options.request The request to run this strategy for.\n * @param {Event} [options.event] The event that triggered the request.\n * @return {Promise}\n */\n async handle({event, request}) {\n return this.makeRequest({\n event,\n request: request || event.request,\n });\n }\n\n /**\n * This method can be used to perform a make a standalone request outside the\n * context of the [Workbox Router]{@link workbox.routing.Router}.\n *\n * See \"[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)\"\n * for more usage information.\n *\n * @param {Object} options\n * @param {Request|string} options.request Either a\n * [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request}\n * object, or a string URL, corresponding to the request to be made.\n * @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will\n be called automatically to extend the service worker's lifetime.\n * @return {Promise}\n */\n async makeRequest({event, request}) {\n const logs = [];\n\n if (typeof request === 'string') {\n request = new Request(request);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: 'CacheFirst',\n funcName: 'makeRequest',\n paramName: 'request',\n });\n }\n\n let response = await cacheWrapper.match({\n cacheName: this._cacheName,\n request,\n event,\n matchOptions: this._matchOptions,\n plugins: this._plugins,\n });\n\n let error;\n if (!response) {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(\n `No response found in the '${this._cacheName}' cache. ` +\n `Will respond with a network request.`);\n }\n try {\n response = await this._getFromNetwork(request, event);\n } catch (err) {\n error = err;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (response) {\n logs.push(`Got response from network.`);\n } else {\n logs.push(`Unable to get a response from the network.`);\n }\n }\n } else {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(\n `Found a cached response in the '${this._cacheName}' cache.`);\n }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(\n messages.strategyStart('CacheFirst', request));\n for (let log of logs) {\n logger.log(log);\n }\n messages.printFinalResponse(response);\n logger.groupEnd();\n }\n\n if (!response) {\n throw new WorkboxError('no-response', {url: request.url, error});\n }\n return response;\n }\n\n /**\n * Handles the network and cache part of CacheFirst.\n *\n * @param {Request} request\n * @param {FetchEvent} [event]\n * @return {Promise}\n *\n * @private\n */\n async _getFromNetwork(request, event) {\n const response = await fetchWrapper.fetch({\n request,\n event,\n fetchOptions: this._fetchOptions,\n plugins: this._plugins,\n });\n\n // Keep the service worker while we put the request to the cache\n const responseClone = response.clone();\n const cachePutPromise = cacheWrapper.put({\n cacheName: this._cacheName,\n request,\n response: responseClone,\n event,\n plugins: this._plugins,\n });\n\n if (event) {\n try {\n event.waitUntil(cachePutPromise);\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`Unable to ensure service worker stays alive when ` +\n `updating cache for '${getFriendlyURL(request.url)}'.`);\n }\n }\n }\n\n return response;\n }\n}\n\nexport {CacheFirst};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {cacheNames} from 'workbox-core/_private/cacheNames.mjs';\nimport {cacheWrapper} from 'workbox-core/_private/cacheWrapper.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\n\nimport {messages} from './utils/messages.mjs';\nimport './_version.mjs';\n\n\n/**\n * An implementation of a\n * [cache-only]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#cache-only}\n * request strategy.\n *\n * This class is useful if you want to take advantage of any\n * [Workbox plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}.\n *\n * If there is no cache match, this will throw a `WorkboxError` exception.\n *\n * @memberof workbox.strategies\n */\nclass CacheOnly {\n /**\n * @param {Object} options\n * @param {string} options.cacheName Cache name to store and retrieve\n * requests. Defaults to cache names provided by\n * [workbox-core]{@link workbox.core.cacheNames}.\n * @param {Array} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions)\n */\n constructor(options = {}) {\n this._cacheName = cacheNames.getRuntimeName(options.cacheName);\n this._plugins = options.plugins || [];\n this._matchOptions = options.matchOptions || null;\n }\n\n /**\n * This method will perform a request strategy and follows an API that\n * will work with the\n * [Workbox Router]{@link workbox.routing.Router}.\n *\n * @param {Object} options\n * @param {Request} options.request The request to run this strategy for.\n * @param {Event} [options.event] The event that triggered the request.\n * @return {Promise}\n */\n async handle({event, request}) {\n return this.makeRequest({\n event,\n request: request || event.request,\n });\n }\n\n /**\n * This method can be used to perform a make a standalone request outside the\n * context of the [Workbox Router]{@link workbox.routing.Router}.\n *\n * See \"[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)\"\n * for more usage information.\n *\n * @param {Object} options\n * @param {Request|string} options.request Either a\n * [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request}\n * object, or a string URL, corresponding to the request to be made.\n * @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will\n * be called automatically to extend the service worker's lifetime.\n * @return {Promise}\n */\n async makeRequest({event, request}) {\n if (typeof request === 'string') {\n request = new Request(request);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: 'CacheOnly',\n funcName: 'makeRequest',\n paramName: 'request',\n });\n }\n\n const response = await cacheWrapper.match({\n cacheName: this._cacheName,\n request,\n event,\n matchOptions: this._matchOptions,\n plugins: this._plugins,\n });\n\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(\n messages.strategyStart('CacheOnly', request));\n if (response) {\n logger.log(`Found a cached response in the '${this._cacheName}'` +\n ` cache.`);\n messages.printFinalResponse(response);\n } else {\n logger.log(`No response found in the '${this._cacheName}' cache.`);\n }\n logger.groupEnd();\n }\n\n if (!response) {\n throw new WorkboxError('no-response', {url: request.url});\n }\n return response;\n }\n}\n\nexport {CacheOnly};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\nexport const cacheOkAndOpaquePlugin = {\n /**\n * Returns a valid response (to allow caching) if the status is 200 (OK) or\n * 0 (opaque).\n *\n * @param {Object} options\n * @param {Response} options.response\n * @return {Response|null}\n *\n * @private\n */\n cacheWillUpdate: ({response}) => {\n if (response.status === 200 || response.status === 0) {\n return response;\n }\n return null;\n },\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {cacheNames} from 'workbox-core/_private/cacheNames.mjs';\nimport {cacheWrapper} from 'workbox-core/_private/cacheWrapper.mjs';\nimport {fetchWrapper} from 'workbox-core/_private/fetchWrapper.mjs';\nimport {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\n\nimport {messages} from './utils/messages.mjs';\nimport {cacheOkAndOpaquePlugin} from './plugins/cacheOkAndOpaquePlugin.mjs';\nimport './_version.mjs';\n\n/**\n * An implementation of a\n * [network first]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-falling-back-to-cache}\n * request strategy.\n *\n * By default, this strategy will cache responses with a 200 status code as\n * well as [opaque responses]{@link https://developers.google.com/web/tools/workbox/guides/handle-third-party-requests}.\n * Opaque responses are are cross-origin requests where the response doesn't\n * support [CORS]{@link https://enable-cors.org/}.\n *\n * If the network request fails, and there is no cache match, this will throw\n * a `WorkboxError` exception.\n *\n * @memberof workbox.strategies\n */\nclass NetworkFirst {\n /**\n * @param {Object} options\n * @param {string} options.cacheName Cache name to store and retrieve\n * requests. Defaults to cache names provided by\n * [workbox-core]{@link workbox.core.cacheNames}.\n * @param {Array} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} options.fetchOptions Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of all fetch() requests made by this strategy.\n * @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions)\n * @param {number} options.networkTimeoutSeconds If set, any network requests\n * that fail to respond within the timeout will fallback to the cache.\n *\n * This option can be used to combat\n * \"[lie-fi]{@link https://developers.google.com/web/fundamentals/performance/poor-connectivity/#lie-fi}\"\n * scenarios.\n */\n constructor(options = {}) {\n this._cacheName = cacheNames.getRuntimeName(options.cacheName);\n\n if (options.plugins) {\n let isUsingCacheWillUpdate =\n options.plugins.some((plugin) => !!plugin.cacheWillUpdate);\n this._plugins = isUsingCacheWillUpdate ?\n options.plugins : [cacheOkAndOpaquePlugin, ...options.plugins];\n } else {\n // No plugins passed in, use the default plugin.\n this._plugins = [cacheOkAndOpaquePlugin];\n }\n\n this._networkTimeoutSeconds = options.networkTimeoutSeconds;\n if (process.env.NODE_ENV !== 'production') {\n if (this._networkTimeoutSeconds) {\n assert.isType(this._networkTimeoutSeconds, 'number', {\n moduleName: 'workbox-strategies',\n className: 'NetworkFirst',\n funcName: 'constructor',\n paramName: 'networkTimeoutSeconds',\n });\n }\n }\n\n this._fetchOptions = options.fetchOptions || null;\n this._matchOptions = options.matchOptions || null;\n }\n\n /**\n * This method will perform a request strategy and follows an API that\n * will work with the\n * [Workbox Router]{@link workbox.routing.Router}.\n *\n * @param {Object} options\n * @param {Request} options.request The request to run this strategy for.\n * @param {Event} [options.event] The event that triggered the request.\n * @return {Promise}\n */\n async handle({event, request}) {\n return this.makeRequest({\n event,\n request: request || event.request,\n });\n }\n\n /**\n * This method can be used to perform a make a standalone request outside the\n * context of the [Workbox Router]{@link workbox.routing.Router}.\n *\n * See \"[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)\"\n * for more usage information.\n *\n * @param {Object} options\n * @param {Request|string} options.request Either a\n * [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request}\n * object, or a string URL, corresponding to the request to be made.\n * @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will\n * be called automatically to extend the service worker's lifetime.\n * @return {Promise}\n */\n async makeRequest({event, request}) {\n const logs = [];\n\n if (typeof request === 'string') {\n request = new Request(request);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: 'NetworkFirst',\n funcName: 'handle',\n paramName: 'makeRequest',\n });\n }\n\n const promises = [];\n let timeoutId;\n\n if (this._networkTimeoutSeconds) {\n const {id, promise} = this._getTimeoutPromise({request, event, logs});\n timeoutId = id;\n promises.push(promise);\n }\n\n const networkPromise =\n this._getNetworkPromise({timeoutId, request, event, logs});\n promises.push(networkPromise);\n\n // Promise.race() will resolve as soon as the first promise resolves.\n let response = await Promise.race(promises);\n // If Promise.race() resolved with null, it might be due to a network\n // timeout + a cache miss. If that were to happen, we'd rather wait until\n // the networkPromise resolves instead of returning null.\n // Note that it's fine to await an already-resolved promise, so we don't\n // have to check to see if it's still \"in flight\".\n if (!response) {\n response = await networkPromise;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(\n messages.strategyStart('NetworkFirst', request));\n for (let log of logs) {\n logger.log(log);\n }\n messages.printFinalResponse(response);\n logger.groupEnd();\n }\n\n if (!response) {\n throw new WorkboxError('no-response', {url: request.url});\n }\n return response;\n }\n\n /**\n * @param {Object} options\n * @param {Request} options.request\n * @param {Array} options.logs A reference to the logs array\n * @param {Event} [options.event]\n * @return {Promise}\n *\n * @private\n */\n _getTimeoutPromise({request, logs, event}) {\n let timeoutId;\n const timeoutPromise = new Promise((resolve) => {\n const onNetworkTimeout = async () => {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(`Timing out the network response at ` +\n `${this._networkTimeoutSeconds} seconds.`);\n }\n\n resolve(await this._respondFromCache({request, event}));\n };\n\n timeoutId = setTimeout(\n onNetworkTimeout,\n this._networkTimeoutSeconds * 1000,\n );\n });\n\n return {\n promise: timeoutPromise,\n id: timeoutId,\n };\n }\n\n /**\n * @param {Object} options\n * @param {number|undefined} options.timeoutId\n * @param {Request} options.request\n * @param {Array} options.logs A reference to the logs Array.\n * @param {Event} [options.event]\n * @return {Promise}\n *\n * @private\n */\n async _getNetworkPromise({timeoutId, request, logs, event}) {\n let error;\n let response;\n try {\n response = await fetchWrapper.fetch({\n request,\n event,\n fetchOptions: this._fetchOptions,\n plugins: this._plugins,\n });\n } catch (err) {\n error = err;\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (response) {\n logs.push(`Got response from network.`);\n } else {\n logs.push(`Unable to get a response from the network. Will respond ` +\n `with a cached response.`);\n }\n }\n\n if (error || !response) {\n response = await this._respondFromCache({request, event});\n if (process.env.NODE_ENV !== 'production') {\n if (response) {\n logs.push(`Found a cached response in the '${this._cacheName}'` +\n ` cache.`);\n } else {\n logs.push(`No response found in the '${this._cacheName}' cache.`);\n }\n }\n } else {\n // Keep the service worker alive while we put the request in the cache\n const responseClone = response.clone();\n const cachePut = cacheWrapper.put({\n cacheName: this._cacheName,\n request,\n response: responseClone,\n event,\n plugins: this._plugins,\n });\n\n if (event) {\n try {\n // The event has been responded to so we can keep the SW alive to\n // respond to the request\n event.waitUntil(cachePut);\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`Unable to ensure service worker stays alive when ` +\n `updating cache for '${getFriendlyURL(request.url)}'.`);\n }\n }\n }\n }\n\n return response;\n }\n\n /**\n * Used if the network timeouts or fails to make the request.\n *\n * @param {Object} options\n * @param {Request} request The request to match in the cache\n * @param {Event} [options.event]\n * @return {Promise}\n *\n * @private\n */\n _respondFromCache({event, request}) {\n return cacheWrapper.match({\n cacheName: this._cacheName,\n request,\n event,\n matchOptions: this._matchOptions,\n plugins: this._plugins,\n });\n }\n}\n\nexport {NetworkFirst};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {cacheNames} from 'workbox-core/_private/cacheNames.mjs';\nimport {fetchWrapper} from 'workbox-core/_private/fetchWrapper.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\n\nimport {messages} from './utils/messages.mjs';\nimport './_version.mjs';\n\n/**\n * An implementation of a\n * [network-only]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-only}\n * request strategy.\n *\n * This class is useful if you want to take advantage of any\n * [Workbox plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}.\n *\n * If the network request fails, this will throw a `WorkboxError` exception.\n *\n * @memberof workbox.strategies\n */\nclass NetworkOnly {\n /**\n * @param {Object} options\n * @param {string} options.cacheName Cache name to store and retrieve\n * requests. Defaults to cache names provided by\n * [workbox-core]{@link workbox.core.cacheNames}.\n * @param {Array} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} options.fetchOptions Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of all fetch() requests made by this strategy.\n */\n constructor(options = {}) {\n this._cacheName = cacheNames.getRuntimeName(options.cacheName);\n this._plugins = options.plugins || [];\n this._fetchOptions = options.fetchOptions || null;\n }\n\n /**\n * This method will perform a request strategy and follows an API that\n * will work with the\n * [Workbox Router]{@link workbox.routing.Router}.\n *\n * @param {Object} options\n * @param {Request} options.request The request to run this strategy for.\n * @param {Event} [options.event] The event that triggered the request.\n * @return {Promise}\n */\n async handle({event, request}) {\n return this.makeRequest({\n event,\n request: request || event.request,\n });\n }\n\n /**\n * This method can be used to perform a make a standalone request outside the\n * context of the [Workbox Router]{@link workbox.routing.Router}.\n *\n * See \"[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)\"\n * for more usage information.\n *\n * @param {Object} options\n * @param {Request|string} options.request Either a\n * [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request}\n * object, or a string URL, corresponding to the request to be made.\n * @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will\n * be called automatically to extend the service worker's lifetime.\n * @return {Promise}\n */\n async makeRequest({event, request}) {\n if (typeof request === 'string') {\n request = new Request(request);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: 'NetworkOnly',\n funcName: 'handle',\n paramName: 'request',\n });\n }\n\n let error;\n let response;\n try {\n response = await fetchWrapper.fetch({\n request,\n event,\n fetchOptions: this._fetchOptions,\n plugins: this._plugins,\n });\n } catch (err) {\n error = err;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(\n messages.strategyStart('NetworkOnly', request));\n if (response) {\n logger.log(`Got response from network.`);\n } else {\n logger.log(`Unable to get a response from the network.`);\n }\n messages.printFinalResponse(response);\n logger.groupEnd();\n }\n\n if (!response) {\n throw new WorkboxError('no-response', {url: request.url, error});\n }\n return response;\n }\n}\n\nexport {NetworkOnly};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {cacheNames} from 'workbox-core/_private/cacheNames.mjs';\nimport {cacheWrapper} from 'workbox-core/_private/cacheWrapper.mjs';\nimport {fetchWrapper} from 'workbox-core/_private/fetchWrapper.mjs';\nimport {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\n\nimport {messages} from './utils/messages.mjs';\nimport {cacheOkAndOpaquePlugin} from './plugins/cacheOkAndOpaquePlugin.mjs';\nimport './_version.mjs';\n\n/**\n * An implementation of a\n * [stale-while-revalidate]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#stale-while-revalidate}\n * request strategy.\n *\n * Resources are requested from both the cache and the network in parallel.\n * The strategy will respond with the cached version if available, otherwise\n * wait for the network response. The cache is updated with the network response\n * with each successful request.\n *\n * By default, this strategy will cache responses with a 200 status code as\n * well as [opaque responses]{@link https://developers.google.com/web/tools/workbox/guides/handle-third-party-requests}.\n * Opaque responses are are cross-origin requests where the response doesn't\n * support [CORS]{@link https://enable-cors.org/}.\n *\n * If the network request fails, and there is no cache match, this will throw\n * a `WorkboxError` exception.\n *\n * @memberof workbox.strategies\n */\nclass StaleWhileRevalidate {\n /**\n * @param {Object} options\n * @param {string} options.cacheName Cache name to store and retrieve\n * requests. Defaults to cache names provided by\n * [workbox-core]{@link workbox.core.cacheNames}.\n * @param {Array} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} options.fetchOptions Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of all fetch() requests made by this strategy.\n * @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions)\n */\n constructor(options = {}) {\n this._cacheName = cacheNames.getRuntimeName(options.cacheName);\n this._plugins = options.plugins || [];\n\n if (options.plugins) {\n let isUsingCacheWillUpdate =\n options.plugins.some((plugin) => !!plugin.cacheWillUpdate);\n this._plugins = isUsingCacheWillUpdate ?\n options.plugins : [cacheOkAndOpaquePlugin, ...options.plugins];\n } else {\n // No plugins passed in, use the default plugin.\n this._plugins = [cacheOkAndOpaquePlugin];\n }\n\n this._fetchOptions = options.fetchOptions || null;\n this._matchOptions = options.matchOptions || null;\n }\n\n /**\n * This method will perform a request strategy and follows an API that\n * will work with the\n * [Workbox Router]{@link workbox.routing.Router}.\n *\n * @param {Object} options\n * @param {Request} options.request The request to run this strategy for.\n * @param {Event} [options.event] The event that triggered the request.\n * @return {Promise}\n */\n async handle({event, request}) {\n return this.makeRequest({\n event,\n request: request || event.request,\n });\n }\n /**\n * This method can be used to perform a make a standalone request outside the\n * context of the [Workbox Router]{@link workbox.routing.Router}.\n *\n * See \"[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)\"\n * for more usage information.\n *\n * @param {Object} options\n * @param {Request|string} options.request Either a\n * [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request}\n * object, or a string URL, corresponding to the request to be made.\n * @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will\n * be called automatically to extend the service worker's lifetime.\n * @return {Promise}\n */\n async makeRequest({event, request}) {\n const logs = [];\n\n if (typeof request === 'string') {\n request = new Request(request);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: 'StaleWhileRevalidate',\n funcName: 'handle',\n paramName: 'request',\n });\n }\n\n const fetchAndCachePromise = this._getFromNetwork({request, event});\n\n let response = await cacheWrapper.match({\n cacheName: this._cacheName,\n request,\n event,\n matchOptions: this._matchOptions,\n plugins: this._plugins,\n });\n let error;\n if (response) {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(`Found a cached response in the '${this._cacheName}'` +\n ` cache. Will update with the network response in the background.`);\n }\n\n if (event) {\n try {\n event.waitUntil(fetchAndCachePromise);\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`Unable to ensure service worker stays alive when ` +\n `updating cache for '${getFriendlyURL(request.url)}'.`);\n }\n }\n }\n } else {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(`No response found in the '${this._cacheName}' cache. ` +\n `Will wait for the network response.`);\n }\n try {\n response = await fetchAndCachePromise;\n } catch (err) {\n error = err;\n }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(\n messages.strategyStart('StaleWhileRevalidate', request));\n for (let log of logs) {\n logger.log(log);\n }\n messages.printFinalResponse(response);\n logger.groupEnd();\n }\n\n if (!response) {\n throw new WorkboxError('no-response', {url: request.url, error});\n }\n return response;\n }\n\n /**\n * @param {Object} options\n * @param {Request} options.request\n * @param {Event} [options.event]\n * @return {Promise}\n *\n * @private\n */\n async _getFromNetwork({request, event}) {\n const response = await fetchWrapper.fetch({\n request,\n event,\n fetchOptions: this._fetchOptions,\n plugins: this._plugins,\n });\n\n const cachePutPromise = cacheWrapper.put({\n cacheName: this._cacheName,\n request,\n response: response.clone(),\n event,\n plugins: this._plugins,\n });\n\n if (event) {\n try {\n event.waitUntil(cachePutPromise);\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`Unable to ensure service worker stays alive when ` +\n `updating cache for '${getFriendlyURL(request.url)}'.`);\n }\n }\n }\n\n return response;\n }\n}\n\nexport {StaleWhileRevalidate};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {CacheFirst} from './CacheFirst.mjs';\nimport {CacheOnly} from './CacheOnly.mjs';\nimport {NetworkFirst} from './NetworkFirst.mjs';\nimport {NetworkOnly} from './NetworkOnly.mjs';\nimport {StaleWhileRevalidate} from './StaleWhileRevalidate.mjs';\nimport './_version.mjs';\n\n\nconst mapping = {\n cacheFirst: CacheFirst,\n cacheOnly: CacheOnly,\n networkFirst: NetworkFirst,\n networkOnly: NetworkOnly,\n staleWhileRevalidate: StaleWhileRevalidate,\n};\n\nconst deprecate = (strategy) => {\n const StrategyCtr = mapping[strategy];\n\n return (options) => {\n if (process.env.NODE_ENV !== 'production') {\n const strategyCtrName = strategy[0].toUpperCase() + strategy.slice(1);\n logger.warn(`The 'workbox.strategies.${strategy}()' function has been ` +\n `deprecated and will be removed in a future version of Workbox.\\n` +\n `Please use 'new workbox.strategies.${strategyCtrName}()' instead.`);\n }\n return new StrategyCtr(options);\n };\n};\n\n/**\n * @function workbox.strategies.cacheFirst\n * @param {Object} options See the {@link workbox.strategies.CacheFirst}\n * constructor for more info.\n * @deprecated since v4.0.0\n */\nconst cacheFirst = deprecate('cacheFirst');\n\n/**\n * @function workbox.strategies.cacheOnly\n * @param {Object} options See the {@link workbox.strategies.CacheOnly}\n * constructor for more info.\n * @deprecated since v4.0.0\n */\nconst cacheOnly = deprecate('cacheOnly');\n\n/**\n * @function workbox.strategies.networkFirst\n * @param {Object} options See the {@link workbox.strategies.NetworkFirst}\n * constructor for more info.\n * @deprecated since v4.0.0\n */\nconst networkFirst = deprecate('networkFirst');\n\n/**\n * @function workbox.strategies.networkOnly\n * @param {Object} options See the {@link workbox.strategies.NetworkOnly}\n * constructor for more info.\n * @deprecated since v4.0.0\n */\nconst networkOnly = deprecate('networkOnly');\n\n/**\n * @function workbox.strategies.staleWhileRevalidate\n * @param {Object} options See the\n * {@link workbox.strategies.StaleWhileRevalidate} constructor for more info.\n * @deprecated since v4.0.0\n */\nconst staleWhileRevalidate = deprecate('staleWhileRevalidate');\n\n/**\n * There are common caching strategies that most service workers will need\n * and use. This module provides simple implementations of these strategies.\n *\n * @namespace workbox.strategies\n */\n\nexport {\n CacheFirst,\n CacheOnly,\n NetworkFirst,\n NetworkOnly,\n StaleWhileRevalidate,\n\n // Deprecated...\n cacheFirst,\n cacheOnly,\n networkFirst,\n networkOnly,\n staleWhileRevalidate,\n};\n\n"],"names":["self","_","e","getFriendlyURL","url","urlObj","URL","location","origin","pathname","href","messages","strategyStart","strategyName","request","printFinalResponse","response","logger","groupCollapsed","log","groupEnd","CacheFirst","constructor","options","_cacheName","cacheNames","getRuntimeName","cacheName","_plugins","plugins","_fetchOptions","fetchOptions","_matchOptions","matchOptions","handle","event","makeRequest","logs","Request","assert","isInstance","moduleName","className","funcName","paramName","cacheWrapper","match","error","push","_getFromNetwork","err","WorkboxError","fetchWrapper","fetch","responseClone","clone","cachePutPromise","put","waitUntil","warn","CacheOnly","cacheOkAndOpaquePlugin","cacheWillUpdate","status","NetworkFirst","isUsingCacheWillUpdate","some","plugin","_networkTimeoutSeconds","networkTimeoutSeconds","isType","promises","timeoutId","id","promise","_getTimeoutPromise","networkPromise","_getNetworkPromise","Promise","race","timeoutPromise","resolve","onNetworkTimeout","_respondFromCache","setTimeout","clearTimeout","cachePut","NetworkOnly","StaleWhileRevalidate","fetchAndCachePromise","mapping","cacheFirst","cacheOnly","networkFirst","networkOnly","staleWhileRevalidate","deprecate","strategy","StrategyCtr","strategyCtrName","toUpperCase","slice"],"mappings":"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"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-strategies.prod.js b/workbox-v4.3.1/workbox-strategies.prod.js new file mode 100644 index 00000000..29909af3 --- /dev/null +++ b/workbox-v4.3.1/workbox-strategies.prod.js @@ -0,0 +1,2 @@ +this.workbox=this.workbox||{},this.workbox.strategies=function(e,t,s,n,r){"use strict";try{self["workbox:strategies:4.3.1"]&&_()}catch(e){}class i{constructor(e={}){this.t=t.cacheNames.getRuntimeName(e.cacheName),this.s=e.plugins||[],this.i=e.fetchOptions||null,this.h=e.matchOptions||null}async handle({event:e,request:t}){return this.makeRequest({event:e,request:t||e.request})}async makeRequest({event:e,request:t}){"string"==typeof t&&(t=new Request(t));let n,i=await s.cacheWrapper.match({cacheName:this.t,request:t,event:e,matchOptions:this.h,plugins:this.s});if(!i)try{i=await this.u(t,e)}catch(e){n=e}if(!i)throw new r.WorkboxError("no-response",{url:t.url,error:n});return i}async u(e,t){const r=await n.fetchWrapper.fetch({request:e,event:t,fetchOptions:this.i,plugins:this.s}),i=r.clone(),h=s.cacheWrapper.put({cacheName:this.t,request:e,response:i,event:t,plugins:this.s});if(t)try{t.waitUntil(h)}catch(e){}return r}}class h{constructor(e={}){this.t=t.cacheNames.getRuntimeName(e.cacheName),this.s=e.plugins||[],this.h=e.matchOptions||null}async handle({event:e,request:t}){return this.makeRequest({event:e,request:t||e.request})}async makeRequest({event:e,request:t}){"string"==typeof t&&(t=new Request(t));const n=await s.cacheWrapper.match({cacheName:this.t,request:t,event:e,matchOptions:this.h,plugins:this.s});if(!n)throw new r.WorkboxError("no-response",{url:t.url});return n}}const u={cacheWillUpdate:({response:e})=>200===e.status||0===e.status?e:null};class a{constructor(e={}){if(this.t=t.cacheNames.getRuntimeName(e.cacheName),e.plugins){let t=e.plugins.some(e=>!!e.cacheWillUpdate);this.s=t?e.plugins:[u,...e.plugins]}else this.s=[u];this.o=e.networkTimeoutSeconds,this.i=e.fetchOptions||null,this.h=e.matchOptions||null}async handle({event:e,request:t}){return this.makeRequest({event:e,request:t||e.request})}async makeRequest({event:e,request:t}){const s=[];"string"==typeof t&&(t=new Request(t));const n=[];let i;if(this.o){const{id:r,promise:h}=this.l({request:t,event:e,logs:s});i=r,n.push(h)}const h=this.q({timeoutId:i,request:t,event:e,logs:s});n.push(h);let u=await Promise.race(n);if(u||(u=await h),!u)throw new r.WorkboxError("no-response",{url:t.url});return u}l({request:e,logs:t,event:s}){let n;return{promise:new Promise(t=>{n=setTimeout(async()=>{t(await this.p({request:e,event:s}))},1e3*this.o)}),id:n}}async q({timeoutId:e,request:t,logs:r,event:i}){let h,u;try{u=await n.fetchWrapper.fetch({request:t,event:i,fetchOptions:this.i,plugins:this.s})}catch(e){h=e}if(e&&clearTimeout(e),h||!u)u=await this.p({request:t,event:i});else{const e=u.clone(),n=s.cacheWrapper.put({cacheName:this.t,request:t,response:e,event:i,plugins:this.s});if(i)try{i.waitUntil(n)}catch(e){}}return u}p({event:e,request:t}){return s.cacheWrapper.match({cacheName:this.t,request:t,event:e,matchOptions:this.h,plugins:this.s})}}class c{constructor(e={}){this.t=t.cacheNames.getRuntimeName(e.cacheName),this.s=e.plugins||[],this.i=e.fetchOptions||null}async handle({event:e,request:t}){return this.makeRequest({event:e,request:t||e.request})}async makeRequest({event:e,request:t}){let s,i;"string"==typeof t&&(t=new Request(t));try{i=await n.fetchWrapper.fetch({request:t,event:e,fetchOptions:this.i,plugins:this.s})}catch(e){s=e}if(!i)throw new r.WorkboxError("no-response",{url:t.url,error:s});return i}}class o{constructor(e={}){if(this.t=t.cacheNames.getRuntimeName(e.cacheName),this.s=e.plugins||[],e.plugins){let t=e.plugins.some(e=>!!e.cacheWillUpdate);this.s=t?e.plugins:[u,...e.plugins]}else this.s=[u];this.i=e.fetchOptions||null,this.h=e.matchOptions||null}async handle({event:e,request:t}){return this.makeRequest({event:e,request:t||e.request})}async makeRequest({event:e,request:t}){"string"==typeof t&&(t=new Request(t));const n=this.u({request:t,event:e});let i,h=await s.cacheWrapper.match({cacheName:this.t,request:t,event:e,matchOptions:this.h,plugins:this.s});if(h){if(e)try{e.waitUntil(n)}catch(i){}}else try{h=await n}catch(e){i=e}if(!h)throw new r.WorkboxError("no-response",{url:t.url,error:i});return h}async u({request:e,event:t}){const r=await n.fetchWrapper.fetch({request:e,event:t,fetchOptions:this.i,plugins:this.s}),i=s.cacheWrapper.put({cacheName:this.t,request:e,response:r.clone(),event:t,plugins:this.s});if(t)try{t.waitUntil(i)}catch(e){}return r}}const l={cacheFirst:i,cacheOnly:h,networkFirst:a,networkOnly:c,staleWhileRevalidate:o},q=e=>{const t=l[e];return e=>new t(e)},w=q("cacheFirst"),p=q("cacheOnly"),v=q("networkFirst"),y=q("networkOnly"),m=q("staleWhileRevalidate");return e.CacheFirst=i,e.CacheOnly=h,e.NetworkFirst=a,e.NetworkOnly=c,e.StaleWhileRevalidate=o,e.cacheFirst=w,e.cacheOnly=p,e.networkFirst=v,e.networkOnly=y,e.staleWhileRevalidate=m,e}({},workbox.core._private,workbox.core._private,workbox.core._private,workbox.core._private); +//# sourceMappingURL=workbox-strategies.prod.js.map diff --git a/workbox-v4.3.1/workbox-strategies.prod.js.map b/workbox-v4.3.1/workbox-strategies.prod.js.map new file mode 100644 index 00000000..6ad0b3e3 --- /dev/null +++ b/workbox-v4.3.1/workbox-strategies.prod.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-strategies.prod.js","sources":["../_version.mjs","../CacheFirst.mjs","../CacheOnly.mjs","../plugins/cacheOkAndOpaquePlugin.mjs","../NetworkFirst.mjs","../NetworkOnly.mjs","../StaleWhileRevalidate.mjs","../index.mjs"],"sourcesContent":["try{self['workbox:strategies:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {cacheNames} from 'workbox-core/_private/cacheNames.mjs';\nimport {cacheWrapper} from 'workbox-core/_private/cacheWrapper.mjs';\nimport {fetchWrapper} from 'workbox-core/_private/fetchWrapper.mjs';\nimport {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\n\nimport {messages} from './utils/messages.mjs';\nimport './_version.mjs';\n\n/**\n * An implementation of a [cache-first]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#cache-falling-back-to-network}\n * request strategy.\n *\n * A cache first strategy is useful for assets that have been revisioned,\n * such as URLs like `/styles/example.a8f5f1.css`, since they\n * can be cached for long periods of time.\n *\n * If the network request fails, and there is no cache match, this will throw\n * a `WorkboxError` exception.\n *\n * @memberof workbox.strategies\n */\nclass CacheFirst {\n /**\n * @param {Object} options\n * @param {string} options.cacheName Cache name to store and retrieve\n * requests. Defaults to cache names provided by\n * [workbox-core]{@link workbox.core.cacheNames}.\n * @param {Array} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} options.fetchOptions Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of all fetch() requests made by this strategy.\n * @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions)\n */\n constructor(options = {}) {\n this._cacheName = cacheNames.getRuntimeName(options.cacheName);\n this._plugins = options.plugins || [];\n this._fetchOptions = options.fetchOptions || null;\n this._matchOptions = options.matchOptions || null;\n }\n\n /**\n * This method will perform a request strategy and follows an API that\n * will work with the\n * [Workbox Router]{@link workbox.routing.Router}.\n *\n * @param {Object} options\n * @param {Request} options.request The request to run this strategy for.\n * @param {Event} [options.event] The event that triggered the request.\n * @return {Promise}\n */\n async handle({event, request}) {\n return this.makeRequest({\n event,\n request: request || event.request,\n });\n }\n\n /**\n * This method can be used to perform a make a standalone request outside the\n * context of the [Workbox Router]{@link workbox.routing.Router}.\n *\n * See \"[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)\"\n * for more usage information.\n *\n * @param {Object} options\n * @param {Request|string} options.request Either a\n * [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request}\n * object, or a string URL, corresponding to the request to be made.\n * @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will\n be called automatically to extend the service worker's lifetime.\n * @return {Promise}\n */\n async makeRequest({event, request}) {\n const logs = [];\n\n if (typeof request === 'string') {\n request = new Request(request);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: 'CacheFirst',\n funcName: 'makeRequest',\n paramName: 'request',\n });\n }\n\n let response = await cacheWrapper.match({\n cacheName: this._cacheName,\n request,\n event,\n matchOptions: this._matchOptions,\n plugins: this._plugins,\n });\n\n let error;\n if (!response) {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(\n `No response found in the '${this._cacheName}' cache. ` +\n `Will respond with a network request.`);\n }\n try {\n response = await this._getFromNetwork(request, event);\n } catch (err) {\n error = err;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (response) {\n logs.push(`Got response from network.`);\n } else {\n logs.push(`Unable to get a response from the network.`);\n }\n }\n } else {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(\n `Found a cached response in the '${this._cacheName}' cache.`);\n }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(\n messages.strategyStart('CacheFirst', request));\n for (let log of logs) {\n logger.log(log);\n }\n messages.printFinalResponse(response);\n logger.groupEnd();\n }\n\n if (!response) {\n throw new WorkboxError('no-response', {url: request.url, error});\n }\n return response;\n }\n\n /**\n * Handles the network and cache part of CacheFirst.\n *\n * @param {Request} request\n * @param {FetchEvent} [event]\n * @return {Promise}\n *\n * @private\n */\n async _getFromNetwork(request, event) {\n const response = await fetchWrapper.fetch({\n request,\n event,\n fetchOptions: this._fetchOptions,\n plugins: this._plugins,\n });\n\n // Keep the service worker while we put the request to the cache\n const responseClone = response.clone();\n const cachePutPromise = cacheWrapper.put({\n cacheName: this._cacheName,\n request,\n response: responseClone,\n event,\n plugins: this._plugins,\n });\n\n if (event) {\n try {\n event.waitUntil(cachePutPromise);\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`Unable to ensure service worker stays alive when ` +\n `updating cache for '${getFriendlyURL(request.url)}'.`);\n }\n }\n }\n\n return response;\n }\n}\n\nexport {CacheFirst};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {cacheNames} from 'workbox-core/_private/cacheNames.mjs';\nimport {cacheWrapper} from 'workbox-core/_private/cacheWrapper.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\n\nimport {messages} from './utils/messages.mjs';\nimport './_version.mjs';\n\n\n/**\n * An implementation of a\n * [cache-only]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#cache-only}\n * request strategy.\n *\n * This class is useful if you want to take advantage of any\n * [Workbox plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}.\n *\n * If there is no cache match, this will throw a `WorkboxError` exception.\n *\n * @memberof workbox.strategies\n */\nclass CacheOnly {\n /**\n * @param {Object} options\n * @param {string} options.cacheName Cache name to store and retrieve\n * requests. Defaults to cache names provided by\n * [workbox-core]{@link workbox.core.cacheNames}.\n * @param {Array} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions)\n */\n constructor(options = {}) {\n this._cacheName = cacheNames.getRuntimeName(options.cacheName);\n this._plugins = options.plugins || [];\n this._matchOptions = options.matchOptions || null;\n }\n\n /**\n * This method will perform a request strategy and follows an API that\n * will work with the\n * [Workbox Router]{@link workbox.routing.Router}.\n *\n * @param {Object} options\n * @param {Request} options.request The request to run this strategy for.\n * @param {Event} [options.event] The event that triggered the request.\n * @return {Promise}\n */\n async handle({event, request}) {\n return this.makeRequest({\n event,\n request: request || event.request,\n });\n }\n\n /**\n * This method can be used to perform a make a standalone request outside the\n * context of the [Workbox Router]{@link workbox.routing.Router}.\n *\n * See \"[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)\"\n * for more usage information.\n *\n * @param {Object} options\n * @param {Request|string} options.request Either a\n * [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request}\n * object, or a string URL, corresponding to the request to be made.\n * @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will\n * be called automatically to extend the service worker's lifetime.\n * @return {Promise}\n */\n async makeRequest({event, request}) {\n if (typeof request === 'string') {\n request = new Request(request);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: 'CacheOnly',\n funcName: 'makeRequest',\n paramName: 'request',\n });\n }\n\n const response = await cacheWrapper.match({\n cacheName: this._cacheName,\n request,\n event,\n matchOptions: this._matchOptions,\n plugins: this._plugins,\n });\n\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(\n messages.strategyStart('CacheOnly', request));\n if (response) {\n logger.log(`Found a cached response in the '${this._cacheName}'` +\n ` cache.`);\n messages.printFinalResponse(response);\n } else {\n logger.log(`No response found in the '${this._cacheName}' cache.`);\n }\n logger.groupEnd();\n }\n\n if (!response) {\n throw new WorkboxError('no-response', {url: request.url});\n }\n return response;\n }\n}\n\nexport {CacheOnly};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\nexport const cacheOkAndOpaquePlugin = {\n /**\n * Returns a valid response (to allow caching) if the status is 200 (OK) or\n * 0 (opaque).\n *\n * @param {Object} options\n * @param {Response} options.response\n * @return {Response|null}\n *\n * @private\n */\n cacheWillUpdate: ({response}) => {\n if (response.status === 200 || response.status === 0) {\n return response;\n }\n return null;\n },\n};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {cacheNames} from 'workbox-core/_private/cacheNames.mjs';\nimport {cacheWrapper} from 'workbox-core/_private/cacheWrapper.mjs';\nimport {fetchWrapper} from 'workbox-core/_private/fetchWrapper.mjs';\nimport {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\n\nimport {messages} from './utils/messages.mjs';\nimport {cacheOkAndOpaquePlugin} from './plugins/cacheOkAndOpaquePlugin.mjs';\nimport './_version.mjs';\n\n/**\n * An implementation of a\n * [network first]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-falling-back-to-cache}\n * request strategy.\n *\n * By default, this strategy will cache responses with a 200 status code as\n * well as [opaque responses]{@link https://developers.google.com/web/tools/workbox/guides/handle-third-party-requests}.\n * Opaque responses are are cross-origin requests where the response doesn't\n * support [CORS]{@link https://enable-cors.org/}.\n *\n * If the network request fails, and there is no cache match, this will throw\n * a `WorkboxError` exception.\n *\n * @memberof workbox.strategies\n */\nclass NetworkFirst {\n /**\n * @param {Object} options\n * @param {string} options.cacheName Cache name to store and retrieve\n * requests. Defaults to cache names provided by\n * [workbox-core]{@link workbox.core.cacheNames}.\n * @param {Array} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} options.fetchOptions Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of all fetch() requests made by this strategy.\n * @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions)\n * @param {number} options.networkTimeoutSeconds If set, any network requests\n * that fail to respond within the timeout will fallback to the cache.\n *\n * This option can be used to combat\n * \"[lie-fi]{@link https://developers.google.com/web/fundamentals/performance/poor-connectivity/#lie-fi}\"\n * scenarios.\n */\n constructor(options = {}) {\n this._cacheName = cacheNames.getRuntimeName(options.cacheName);\n\n if (options.plugins) {\n let isUsingCacheWillUpdate =\n options.plugins.some((plugin) => !!plugin.cacheWillUpdate);\n this._plugins = isUsingCacheWillUpdate ?\n options.plugins : [cacheOkAndOpaquePlugin, ...options.plugins];\n } else {\n // No plugins passed in, use the default plugin.\n this._plugins = [cacheOkAndOpaquePlugin];\n }\n\n this._networkTimeoutSeconds = options.networkTimeoutSeconds;\n if (process.env.NODE_ENV !== 'production') {\n if (this._networkTimeoutSeconds) {\n assert.isType(this._networkTimeoutSeconds, 'number', {\n moduleName: 'workbox-strategies',\n className: 'NetworkFirst',\n funcName: 'constructor',\n paramName: 'networkTimeoutSeconds',\n });\n }\n }\n\n this._fetchOptions = options.fetchOptions || null;\n this._matchOptions = options.matchOptions || null;\n }\n\n /**\n * This method will perform a request strategy and follows an API that\n * will work with the\n * [Workbox Router]{@link workbox.routing.Router}.\n *\n * @param {Object} options\n * @param {Request} options.request The request to run this strategy for.\n * @param {Event} [options.event] The event that triggered the request.\n * @return {Promise}\n */\n async handle({event, request}) {\n return this.makeRequest({\n event,\n request: request || event.request,\n });\n }\n\n /**\n * This method can be used to perform a make a standalone request outside the\n * context of the [Workbox Router]{@link workbox.routing.Router}.\n *\n * See \"[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)\"\n * for more usage information.\n *\n * @param {Object} options\n * @param {Request|string} options.request Either a\n * [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request}\n * object, or a string URL, corresponding to the request to be made.\n * @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will\n * be called automatically to extend the service worker's lifetime.\n * @return {Promise}\n */\n async makeRequest({event, request}) {\n const logs = [];\n\n if (typeof request === 'string') {\n request = new Request(request);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: 'NetworkFirst',\n funcName: 'handle',\n paramName: 'makeRequest',\n });\n }\n\n const promises = [];\n let timeoutId;\n\n if (this._networkTimeoutSeconds) {\n const {id, promise} = this._getTimeoutPromise({request, event, logs});\n timeoutId = id;\n promises.push(promise);\n }\n\n const networkPromise =\n this._getNetworkPromise({timeoutId, request, event, logs});\n promises.push(networkPromise);\n\n // Promise.race() will resolve as soon as the first promise resolves.\n let response = await Promise.race(promises);\n // If Promise.race() resolved with null, it might be due to a network\n // timeout + a cache miss. If that were to happen, we'd rather wait until\n // the networkPromise resolves instead of returning null.\n // Note that it's fine to await an already-resolved promise, so we don't\n // have to check to see if it's still \"in flight\".\n if (!response) {\n response = await networkPromise;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(\n messages.strategyStart('NetworkFirst', request));\n for (let log of logs) {\n logger.log(log);\n }\n messages.printFinalResponse(response);\n logger.groupEnd();\n }\n\n if (!response) {\n throw new WorkboxError('no-response', {url: request.url});\n }\n return response;\n }\n\n /**\n * @param {Object} options\n * @param {Request} options.request\n * @param {Array} options.logs A reference to the logs array\n * @param {Event} [options.event]\n * @return {Promise}\n *\n * @private\n */\n _getTimeoutPromise({request, logs, event}) {\n let timeoutId;\n const timeoutPromise = new Promise((resolve) => {\n const onNetworkTimeout = async () => {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(`Timing out the network response at ` +\n `${this._networkTimeoutSeconds} seconds.`);\n }\n\n resolve(await this._respondFromCache({request, event}));\n };\n\n timeoutId = setTimeout(\n onNetworkTimeout,\n this._networkTimeoutSeconds * 1000,\n );\n });\n\n return {\n promise: timeoutPromise,\n id: timeoutId,\n };\n }\n\n /**\n * @param {Object} options\n * @param {number|undefined} options.timeoutId\n * @param {Request} options.request\n * @param {Array} options.logs A reference to the logs Array.\n * @param {Event} [options.event]\n * @return {Promise}\n *\n * @private\n */\n async _getNetworkPromise({timeoutId, request, logs, event}) {\n let error;\n let response;\n try {\n response = await fetchWrapper.fetch({\n request,\n event,\n fetchOptions: this._fetchOptions,\n plugins: this._plugins,\n });\n } catch (err) {\n error = err;\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n if (response) {\n logs.push(`Got response from network.`);\n } else {\n logs.push(`Unable to get a response from the network. Will respond ` +\n `with a cached response.`);\n }\n }\n\n if (error || !response) {\n response = await this._respondFromCache({request, event});\n if (process.env.NODE_ENV !== 'production') {\n if (response) {\n logs.push(`Found a cached response in the '${this._cacheName}'` +\n ` cache.`);\n } else {\n logs.push(`No response found in the '${this._cacheName}' cache.`);\n }\n }\n } else {\n // Keep the service worker alive while we put the request in the cache\n const responseClone = response.clone();\n const cachePut = cacheWrapper.put({\n cacheName: this._cacheName,\n request,\n response: responseClone,\n event,\n plugins: this._plugins,\n });\n\n if (event) {\n try {\n // The event has been responded to so we can keep the SW alive to\n // respond to the request\n event.waitUntil(cachePut);\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`Unable to ensure service worker stays alive when ` +\n `updating cache for '${getFriendlyURL(request.url)}'.`);\n }\n }\n }\n }\n\n return response;\n }\n\n /**\n * Used if the network timeouts or fails to make the request.\n *\n * @param {Object} options\n * @param {Request} request The request to match in the cache\n * @param {Event} [options.event]\n * @return {Promise}\n *\n * @private\n */\n _respondFromCache({event, request}) {\n return cacheWrapper.match({\n cacheName: this._cacheName,\n request,\n event,\n matchOptions: this._matchOptions,\n plugins: this._plugins,\n });\n }\n}\n\nexport {NetworkFirst};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {cacheNames} from 'workbox-core/_private/cacheNames.mjs';\nimport {fetchWrapper} from 'workbox-core/_private/fetchWrapper.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\n\nimport {messages} from './utils/messages.mjs';\nimport './_version.mjs';\n\n/**\n * An implementation of a\n * [network-only]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-only}\n * request strategy.\n *\n * This class is useful if you want to take advantage of any\n * [Workbox plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}.\n *\n * If the network request fails, this will throw a `WorkboxError` exception.\n *\n * @memberof workbox.strategies\n */\nclass NetworkOnly {\n /**\n * @param {Object} options\n * @param {string} options.cacheName Cache name to store and retrieve\n * requests. Defaults to cache names provided by\n * [workbox-core]{@link workbox.core.cacheNames}.\n * @param {Array} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} options.fetchOptions Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of all fetch() requests made by this strategy.\n */\n constructor(options = {}) {\n this._cacheName = cacheNames.getRuntimeName(options.cacheName);\n this._plugins = options.plugins || [];\n this._fetchOptions = options.fetchOptions || null;\n }\n\n /**\n * This method will perform a request strategy and follows an API that\n * will work with the\n * [Workbox Router]{@link workbox.routing.Router}.\n *\n * @param {Object} options\n * @param {Request} options.request The request to run this strategy for.\n * @param {Event} [options.event] The event that triggered the request.\n * @return {Promise}\n */\n async handle({event, request}) {\n return this.makeRequest({\n event,\n request: request || event.request,\n });\n }\n\n /**\n * This method can be used to perform a make a standalone request outside the\n * context of the [Workbox Router]{@link workbox.routing.Router}.\n *\n * See \"[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)\"\n * for more usage information.\n *\n * @param {Object} options\n * @param {Request|string} options.request Either a\n * [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request}\n * object, or a string URL, corresponding to the request to be made.\n * @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will\n * be called automatically to extend the service worker's lifetime.\n * @return {Promise}\n */\n async makeRequest({event, request}) {\n if (typeof request === 'string') {\n request = new Request(request);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: 'NetworkOnly',\n funcName: 'handle',\n paramName: 'request',\n });\n }\n\n let error;\n let response;\n try {\n response = await fetchWrapper.fetch({\n request,\n event,\n fetchOptions: this._fetchOptions,\n plugins: this._plugins,\n });\n } catch (err) {\n error = err;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(\n messages.strategyStart('NetworkOnly', request));\n if (response) {\n logger.log(`Got response from network.`);\n } else {\n logger.log(`Unable to get a response from the network.`);\n }\n messages.printFinalResponse(response);\n logger.groupEnd();\n }\n\n if (!response) {\n throw new WorkboxError('no-response', {url: request.url, error});\n }\n return response;\n }\n}\n\nexport {NetworkOnly};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {assert} from 'workbox-core/_private/assert.mjs';\nimport {cacheNames} from 'workbox-core/_private/cacheNames.mjs';\nimport {cacheWrapper} from 'workbox-core/_private/cacheWrapper.mjs';\nimport {fetchWrapper} from 'workbox-core/_private/fetchWrapper.mjs';\nimport {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {WorkboxError} from 'workbox-core/_private/WorkboxError.mjs';\n\nimport {messages} from './utils/messages.mjs';\nimport {cacheOkAndOpaquePlugin} from './plugins/cacheOkAndOpaquePlugin.mjs';\nimport './_version.mjs';\n\n/**\n * An implementation of a\n * [stale-while-revalidate]{@link https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#stale-while-revalidate}\n * request strategy.\n *\n * Resources are requested from both the cache and the network in parallel.\n * The strategy will respond with the cached version if available, otherwise\n * wait for the network response. The cache is updated with the network response\n * with each successful request.\n *\n * By default, this strategy will cache responses with a 200 status code as\n * well as [opaque responses]{@link https://developers.google.com/web/tools/workbox/guides/handle-third-party-requests}.\n * Opaque responses are are cross-origin requests where the response doesn't\n * support [CORS]{@link https://enable-cors.org/}.\n *\n * If the network request fails, and there is no cache match, this will throw\n * a `WorkboxError` exception.\n *\n * @memberof workbox.strategies\n */\nclass StaleWhileRevalidate {\n /**\n * @param {Object} options\n * @param {string} options.cacheName Cache name to store and retrieve\n * requests. Defaults to cache names provided by\n * [workbox-core]{@link workbox.core.cacheNames}.\n * @param {Array} options.plugins [Plugins]{@link https://developers.google.com/web/tools/workbox/guides/using-plugins}\n * to use in conjunction with this caching strategy.\n * @param {Object} options.fetchOptions Values passed along to the\n * [`init`](https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters)\n * of all fetch() requests made by this strategy.\n * @param {Object} options.matchOptions [`CacheQueryOptions`](https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions)\n */\n constructor(options = {}) {\n this._cacheName = cacheNames.getRuntimeName(options.cacheName);\n this._plugins = options.plugins || [];\n\n if (options.plugins) {\n let isUsingCacheWillUpdate =\n options.plugins.some((plugin) => !!plugin.cacheWillUpdate);\n this._plugins = isUsingCacheWillUpdate ?\n options.plugins : [cacheOkAndOpaquePlugin, ...options.plugins];\n } else {\n // No plugins passed in, use the default plugin.\n this._plugins = [cacheOkAndOpaquePlugin];\n }\n\n this._fetchOptions = options.fetchOptions || null;\n this._matchOptions = options.matchOptions || null;\n }\n\n /**\n * This method will perform a request strategy and follows an API that\n * will work with the\n * [Workbox Router]{@link workbox.routing.Router}.\n *\n * @param {Object} options\n * @param {Request} options.request The request to run this strategy for.\n * @param {Event} [options.event] The event that triggered the request.\n * @return {Promise}\n */\n async handle({event, request}) {\n return this.makeRequest({\n event,\n request: request || event.request,\n });\n }\n /**\n * This method can be used to perform a make a standalone request outside the\n * context of the [Workbox Router]{@link workbox.routing.Router}.\n *\n * See \"[Advanced Recipes](https://developers.google.com/web/tools/workbox/guides/advanced-recipes#make-requests)\"\n * for more usage information.\n *\n * @param {Object} options\n * @param {Request|string} options.request Either a\n * [`Request`]{@link https://developer.mozilla.org/en-US/docs/Web/API/Request}\n * object, or a string URL, corresponding to the request to be made.\n * @param {FetchEvent} [options.event] If provided, `event.waitUntil()` will\n * be called automatically to extend the service worker's lifetime.\n * @return {Promise}\n */\n async makeRequest({event, request}) {\n const logs = [];\n\n if (typeof request === 'string') {\n request = new Request(request);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n assert.isInstance(request, Request, {\n moduleName: 'workbox-strategies',\n className: 'StaleWhileRevalidate',\n funcName: 'handle',\n paramName: 'request',\n });\n }\n\n const fetchAndCachePromise = this._getFromNetwork({request, event});\n\n let response = await cacheWrapper.match({\n cacheName: this._cacheName,\n request,\n event,\n matchOptions: this._matchOptions,\n plugins: this._plugins,\n });\n let error;\n if (response) {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(`Found a cached response in the '${this._cacheName}'` +\n ` cache. Will update with the network response in the background.`);\n }\n\n if (event) {\n try {\n event.waitUntil(fetchAndCachePromise);\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`Unable to ensure service worker stays alive when ` +\n `updating cache for '${getFriendlyURL(request.url)}'.`);\n }\n }\n }\n } else {\n if (process.env.NODE_ENV !== 'production') {\n logs.push(`No response found in the '${this._cacheName}' cache. ` +\n `Will wait for the network response.`);\n }\n try {\n response = await fetchAndCachePromise;\n } catch (err) {\n error = err;\n }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(\n messages.strategyStart('StaleWhileRevalidate', request));\n for (let log of logs) {\n logger.log(log);\n }\n messages.printFinalResponse(response);\n logger.groupEnd();\n }\n\n if (!response) {\n throw new WorkboxError('no-response', {url: request.url, error});\n }\n return response;\n }\n\n /**\n * @param {Object} options\n * @param {Request} options.request\n * @param {Event} [options.event]\n * @return {Promise}\n *\n * @private\n */\n async _getFromNetwork({request, event}) {\n const response = await fetchWrapper.fetch({\n request,\n event,\n fetchOptions: this._fetchOptions,\n plugins: this._plugins,\n });\n\n const cachePutPromise = cacheWrapper.put({\n cacheName: this._cacheName,\n request,\n response: response.clone(),\n event,\n plugins: this._plugins,\n });\n\n if (event) {\n try {\n event.waitUntil(cachePutPromise);\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn(`Unable to ensure service worker stays alive when ` +\n `updating cache for '${getFriendlyURL(request.url)}'.`);\n }\n }\n }\n\n return response;\n }\n}\n\nexport {StaleWhileRevalidate};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {CacheFirst} from './CacheFirst.mjs';\nimport {CacheOnly} from './CacheOnly.mjs';\nimport {NetworkFirst} from './NetworkFirst.mjs';\nimport {NetworkOnly} from './NetworkOnly.mjs';\nimport {StaleWhileRevalidate} from './StaleWhileRevalidate.mjs';\nimport './_version.mjs';\n\n\nconst mapping = {\n cacheFirst: CacheFirst,\n cacheOnly: CacheOnly,\n networkFirst: NetworkFirst,\n networkOnly: NetworkOnly,\n staleWhileRevalidate: StaleWhileRevalidate,\n};\n\nconst deprecate = (strategy) => {\n const StrategyCtr = mapping[strategy];\n\n return (options) => {\n if (process.env.NODE_ENV !== 'production') {\n const strategyCtrName = strategy[0].toUpperCase() + strategy.slice(1);\n logger.warn(`The 'workbox.strategies.${strategy}()' function has been ` +\n `deprecated and will be removed in a future version of Workbox.\\n` +\n `Please use 'new workbox.strategies.${strategyCtrName}()' instead.`);\n }\n return new StrategyCtr(options);\n };\n};\n\n/**\n * @function workbox.strategies.cacheFirst\n * @param {Object} options See the {@link workbox.strategies.CacheFirst}\n * constructor for more info.\n * @deprecated since v4.0.0\n */\nconst cacheFirst = deprecate('cacheFirst');\n\n/**\n * @function workbox.strategies.cacheOnly\n * @param {Object} options See the {@link workbox.strategies.CacheOnly}\n * constructor for more info.\n * @deprecated since v4.0.0\n */\nconst cacheOnly = deprecate('cacheOnly');\n\n/**\n * @function workbox.strategies.networkFirst\n * @param {Object} options See the {@link workbox.strategies.NetworkFirst}\n * constructor for more info.\n * @deprecated since v4.0.0\n */\nconst networkFirst = deprecate('networkFirst');\n\n/**\n * @function workbox.strategies.networkOnly\n * @param {Object} options See the {@link workbox.strategies.NetworkOnly}\n * constructor for more info.\n * @deprecated since v4.0.0\n */\nconst networkOnly = deprecate('networkOnly');\n\n/**\n * @function workbox.strategies.staleWhileRevalidate\n * @param {Object} options See the\n * {@link workbox.strategies.StaleWhileRevalidate} constructor for more info.\n * @deprecated since v4.0.0\n */\nconst staleWhileRevalidate = deprecate('staleWhileRevalidate');\n\n/**\n * There are common caching strategies that most service workers will need\n * and use. This module provides simple implementations of these strategies.\n *\n * @namespace workbox.strategies\n */\n\nexport {\n CacheFirst,\n CacheOnly,\n NetworkFirst,\n NetworkOnly,\n StaleWhileRevalidate,\n\n // Deprecated...\n cacheFirst,\n cacheOnly,\n networkFirst,\n networkOnly,\n staleWhileRevalidate,\n};\n\n"],"names":["self","_","e","CacheFirst","constructor","options","_cacheName","cacheNames","getRuntimeName","cacheName","_plugins","plugins","_fetchOptions","fetchOptions","_matchOptions","matchOptions","event","request","this","makeRequest","Request","error","response","cacheWrapper","match","_getFromNetwork","err","WorkboxError","url","fetchWrapper","fetch","responseClone","clone","cachePutPromise","put","waitUntil","CacheOnly","cacheOkAndOpaquePlugin","cacheWillUpdate","status","NetworkFirst","isUsingCacheWillUpdate","some","plugin","_networkTimeoutSeconds","networkTimeoutSeconds","logs","promises","timeoutId","id","promise","_getTimeoutPromise","push","networkPromise","_getNetworkPromise","Promise","race","resolve","setTimeout","async","_respondFromCache","clearTimeout","cachePut","NetworkOnly","StaleWhileRevalidate","fetchAndCachePromise","mapping","cacheFirst","cacheOnly","networkFirst","networkOnly","staleWhileRevalidate","deprecate","strategy","StrategyCtr"],"mappings":"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"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-streams.dev.js b/workbox-v4.3.1/workbox-streams.dev.js new file mode 100644 index 00000000..c90b3dcd --- /dev/null +++ b/workbox-v4.3.1/workbox-streams.dev.js @@ -0,0 +1,337 @@ +this.workbox = this.workbox || {}; +this.workbox.streams = (function (exports, logger_mjs, assert_mjs) { + 'use strict'; + + try { + self['workbox:streams:4.3.1'] && _(); + } catch (e) {} // eslint-disable-line + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Takes either a Response, a ReadableStream, or a + * [BodyInit](https://fetch.spec.whatwg.org/#bodyinit) and returns the + * ReadableStreamReader object associated with it. + * + * @param {workbox.streams.StreamSource} source + * @return {ReadableStreamReader} + * @private + */ + + function _getReaderFromSource(source) { + if (source.body && source.body.getReader) { + return source.body.getReader(); + } + + if (source.getReader) { + return source.getReader(); + } // TODO: This should be possible to do by constructing a ReadableStream, but + // I can't get it to work. As a hack, construct a new Response, and use the + // reader associated with its body. + + + return new Response(source).body.getReader(); + } + /** + * Takes multiple source Promises, each of which could resolve to a Response, a + * ReadableStream, or a [BodyInit](https://fetch.spec.whatwg.org/#bodyinit). + * + * Returns an object exposing a ReadableStream with each individual stream's + * data returned in sequence, along with a Promise which signals when the + * stream is finished (useful for passing to a FetchEvent's waitUntil()). + * + * @param {Array>} sourcePromises + * @return {Object<{done: Promise, stream: ReadableStream}>} + * + * @memberof workbox.streams + */ + + + function concatenate(sourcePromises) { + { + assert_mjs.assert.isArray(sourcePromises, { + moduleName: 'workbox-streams', + funcName: 'concatenate', + paramName: 'sourcePromises' + }); + } + + const readerPromises = sourcePromises.map(sourcePromise => { + return Promise.resolve(sourcePromise).then(source => { + return _getReaderFromSource(source); + }); + }); + let fullyStreamedResolve; + let fullyStreamedReject; + const done = new Promise((resolve, reject) => { + fullyStreamedResolve = resolve; + fullyStreamedReject = reject; + }); + let i = 0; + const logMessages = []; + const stream = new ReadableStream({ + pull(controller) { + return readerPromises[i].then(reader => reader.read()).then(result => { + if (result.done) { + { + logMessages.push(['Reached the end of source:', sourcePromises[i]]); + } + + i++; + + if (i >= readerPromises.length) { + // Log all the messages in the group at once in a single group. + { + logger_mjs.logger.groupCollapsed(`Concatenating ${readerPromises.length} sources.`); + + for (const message of logMessages) { + if (Array.isArray(message)) { + logger_mjs.logger.log(...message); + } else { + logger_mjs.logger.log(message); + } + } + + logger_mjs.logger.log('Finished reading all sources.'); + logger_mjs.logger.groupEnd(); + } + + controller.close(); + fullyStreamedResolve(); + return; + } + + return this.pull(controller); + } else { + controller.enqueue(result.value); + } + }).catch(error => { + { + logger_mjs.logger.error('An error occurred:', error); + } + + fullyStreamedReject(error); + throw error; + }); + }, + + cancel() { + { + logger_mjs.logger.warn('The ReadableStream was cancelled.'); + } + + fullyStreamedResolve(); + } + + }); + return { + done, + stream + }; + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * This is a utility method that determines whether the current browser supports + * the features required to create streamed responses. Currently, it checks if + * [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/ReadableStream) + * is available. + * + * @param {HeadersInit} [headersInit] If there's no `Content-Type` specified, + * `'text/html'` will be used by default. + * @return {boolean} `true`, if the current browser meets the requirements for + * streaming responses, and `false` otherwise. + * + * @memberof workbox.streams + */ + + function createHeaders(headersInit = {}) { + // See https://github.com/GoogleChrome/workbox/issues/1461 + const headers = new Headers(headersInit); + + if (!headers.has('content-type')) { + headers.set('content-type', 'text/html'); + } + + return headers; + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Takes multiple source Promises, each of which could resolve to a Response, a + * ReadableStream, or a [BodyInit](https://fetch.spec.whatwg.org/#bodyinit), + * along with a + * [HeadersInit](https://fetch.spec.whatwg.org/#typedefdef-headersinit). + * + * Returns an object exposing a Response whose body consists of each individual + * stream's data returned in sequence, along with a Promise which signals when + * the stream is finished (useful for passing to a FetchEvent's waitUntil()). + * + * @param {Array>} sourcePromises + * @param {HeadersInit} [headersInit] If there's no `Content-Type` specified, + * `'text/html'` will be used by default. + * @return {Object<{done: Promise, response: Response}>} + * + * @memberof workbox.streams + */ + + function concatenateToResponse(sourcePromises, headersInit) { + const { + done, + stream + } = concatenate(sourcePromises); + const headers = createHeaders(headersInit); + const response = new Response(stream, { + headers + }); + return { + done, + response + }; + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + let cachedIsSupported = undefined; + /** + * This is a utility method that determines whether the current browser supports + * the features required to create streamed responses. Currently, it checks if + * [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/ReadableStream) + * can be created. + * + * @return {boolean} `true`, if the current browser meets the requirements for + * streaming responses, and `false` otherwise. + * + * @memberof workbox.streams + */ + + function isSupported() { + if (cachedIsSupported === undefined) { + // See https://github.com/GoogleChrome/workbox/issues/1473 + try { + new ReadableStream({ + start() {} + + }); + cachedIsSupported = true; + } catch (error) { + cachedIsSupported = false; + } + } + + return cachedIsSupported; + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * A shortcut to create a strategy that could be dropped-in to Workbox's router. + * + * On browsers that do not support constructing new `ReadableStream`s, this + * strategy will automatically wait for all the `sourceFunctions` to complete, + * and create a final response that concatenates their values together. + * + * @param { + * Array} sourceFunctions + * Each function should return a {@link workbox.streams.StreamSource} (or a + * Promise which resolves to one). + * @param {HeadersInit} [headersInit] If there's no `Content-Type` specified, + * `'text/html'` will be used by default. + * @return {workbox.routing.Route~handlerCallback} + * + * @memberof workbox.streams + */ + + function strategy(sourceFunctions, headersInit) { + return async ({ + event, + url, + params + }) => { + if (isSupported()) { + const { + done, + response + } = concatenateToResponse(sourceFunctions.map(fn => fn({ + event, + url, + params + })), headersInit); + event.waitUntil(done); + return response; + } + + { + logger_mjs.logger.log(`The current browser doesn't support creating response ` + `streams. Falling back to non-streaming response instead.`); + } // Fallback to waiting for everything to finish, and concatenating the + // responses. + + + const parts = await Promise.all(sourceFunctions.map(sourceFunction => sourceFunction({ + event, + url, + params + })).map(async responsePromise => { + const response = await responsePromise; + + if (response instanceof Response) { + return response.blob(); + } // Otherwise, assume it's something like a string which can be used + // as-is when constructing the final composite blob. + + + return response; + })); + const headers = createHeaders(headersInit); // Constructing a new Response from a Blob source is well-supported. + // So is constructing a new Blob from multiple source Blobs or strings. + + return new Response(new Blob(parts), { + headers + }); + }; + } + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + + exports.concatenate = concatenate; + exports.concatenateToResponse = concatenateToResponse; + exports.isSupported = isSupported; + exports.strategy = strategy; + + return exports; + +}({}, workbox.core._private, workbox.core._private)); +//# sourceMappingURL=workbox-streams.dev.js.map diff --git a/workbox-v4.3.1/workbox-streams.dev.js.map b/workbox-v4.3.1/workbox-streams.dev.js.map new file mode 100644 index 00000000..c175f5e8 --- /dev/null +++ b/workbox-v4.3.1/workbox-streams.dev.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-streams.dev.js","sources":["../_version.mjs","../concatenate.mjs","../utils/createHeaders.mjs","../concatenateToResponse.mjs","../isSupported.mjs","../strategy.mjs","../index.mjs"],"sourcesContent":["try{self['workbox:streams:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {assert} from 'workbox-core/_private/assert.mjs';\n\nimport './_version.mjs';\n\n/**\n * Takes either a Response, a ReadableStream, or a\n * [BodyInit](https://fetch.spec.whatwg.org/#bodyinit) and returns the\n * ReadableStreamReader object associated with it.\n *\n * @param {workbox.streams.StreamSource} source\n * @return {ReadableStreamReader}\n * @private\n */\nfunction _getReaderFromSource(source) {\n if (source.body && source.body.getReader) {\n return source.body.getReader();\n }\n\n if (source.getReader) {\n return source.getReader();\n }\n\n // TODO: This should be possible to do by constructing a ReadableStream, but\n // I can't get it to work. As a hack, construct a new Response, and use the\n // reader associated with its body.\n return new Response(source).body.getReader();\n}\n\n/**\n * Takes multiple source Promises, each of which could resolve to a Response, a\n * ReadableStream, or a [BodyInit](https://fetch.spec.whatwg.org/#bodyinit).\n *\n * Returns an object exposing a ReadableStream with each individual stream's\n * data returned in sequence, along with a Promise which signals when the\n * stream is finished (useful for passing to a FetchEvent's waitUntil()).\n *\n * @param {Array>} sourcePromises\n * @return {Object<{done: Promise, stream: ReadableStream}>}\n *\n * @memberof workbox.streams\n */\nfunction concatenate(sourcePromises) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isArray(sourcePromises, {\n moduleName: 'workbox-streams',\n funcName: 'concatenate',\n paramName: 'sourcePromises',\n });\n }\n\n const readerPromises = sourcePromises.map((sourcePromise) => {\n return Promise.resolve(sourcePromise).then((source) => {\n return _getReaderFromSource(source);\n });\n });\n\n let fullyStreamedResolve;\n let fullyStreamedReject;\n const done = new Promise((resolve, reject) => {\n fullyStreamedResolve = resolve;\n fullyStreamedReject = reject;\n });\n\n let i = 0;\n const logMessages = [];\n const stream = new ReadableStream({\n pull(controller) {\n return readerPromises[i]\n .then((reader) => reader.read())\n .then((result) => {\n if (result.done) {\n if (process.env.NODE_ENV !== 'production') {\n logMessages.push(['Reached the end of source:',\n sourcePromises[i]]);\n }\n\n i++;\n if (i >= readerPromises.length) {\n // Log all the messages in the group at once in a single group.\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(\n `Concatenating ${readerPromises.length} sources.`);\n for (const message of logMessages) {\n if (Array.isArray(message)) {\n logger.log(...message);\n } else {\n logger.log(message);\n }\n }\n logger.log('Finished reading all sources.');\n logger.groupEnd();\n }\n\n controller.close();\n fullyStreamedResolve();\n return;\n }\n\n return this.pull(controller);\n } else {\n controller.enqueue(result.value);\n }\n }).catch((error) => {\n if (process.env.NODE_ENV !== 'production') {\n logger.error('An error occurred:', error);\n }\n fullyStreamedReject(error);\n throw error;\n });\n },\n\n cancel() {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn('The ReadableStream was cancelled.');\n }\n\n fullyStreamedResolve();\n },\n });\n\n return {done, stream};\n}\n\nexport {concatenate};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n/**\n * This is a utility method that determines whether the current browser supports\n * the features required to create streamed responses. Currently, it checks if\n * [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/ReadableStream)\n * is available.\n *\n * @param {HeadersInit} [headersInit] If there's no `Content-Type` specified,\n * `'text/html'` will be used by default.\n * @return {boolean} `true`, if the current browser meets the requirements for\n * streaming responses, and `false` otherwise.\n *\n * @memberof workbox.streams\n */\nfunction createHeaders(headersInit = {}) {\n // See https://github.com/GoogleChrome/workbox/issues/1461\n const headers = new Headers(headersInit);\n if (!headers.has('content-type')) {\n headers.set('content-type', 'text/html');\n }\n return headers;\n}\n\nexport {createHeaders};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {createHeaders} from './utils/createHeaders.mjs';\nimport {concatenate} from './concatenate.mjs';\n\nimport './_version.mjs';\n\n/**\n * Takes multiple source Promises, each of which could resolve to a Response, a\n * ReadableStream, or a [BodyInit](https://fetch.spec.whatwg.org/#bodyinit),\n * along with a\n * [HeadersInit](https://fetch.spec.whatwg.org/#typedefdef-headersinit).\n *\n * Returns an object exposing a Response whose body consists of each individual\n * stream's data returned in sequence, along with a Promise which signals when\n * the stream is finished (useful for passing to a FetchEvent's waitUntil()).\n *\n * @param {Array>} sourcePromises\n * @param {HeadersInit} [headersInit] If there's no `Content-Type` specified,\n * `'text/html'` will be used by default.\n * @return {Object<{done: Promise, response: Response}>}\n *\n * @memberof workbox.streams\n */\nfunction concatenateToResponse(sourcePromises, headersInit) {\n const {done, stream} = concatenate(sourcePromises);\n\n const headers = createHeaders(headersInit);\n const response = new Response(stream, {headers});\n\n return {done, response};\n}\n\nexport {concatenateToResponse};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport './_version.mjs';\n\nlet cachedIsSupported = undefined;\n\n/**\n * This is a utility method that determines whether the current browser supports\n * the features required to create streamed responses. Currently, it checks if\n * [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/ReadableStream)\n * can be created.\n *\n * @return {boolean} `true`, if the current browser meets the requirements for\n * streaming responses, and `false` otherwise.\n *\n * @memberof workbox.streams\n */\nfunction isSupported() {\n if (cachedIsSupported === undefined) {\n // See https://github.com/GoogleChrome/workbox/issues/1473\n try {\n new ReadableStream({start() {}});\n cachedIsSupported = true;\n } catch (error) {\n cachedIsSupported = false;\n }\n }\n\n return cachedIsSupported;\n}\n\nexport {isSupported};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {logger} from 'workbox-core/_private/logger.mjs';\n\nimport {createHeaders} from './utils/createHeaders.mjs';\nimport {concatenateToResponse} from './concatenateToResponse.mjs';\nimport {isSupported} from './isSupported.mjs';\n\nimport './_version.mjs';\n\n/**\n * A shortcut to create a strategy that could be dropped-in to Workbox's router.\n *\n * On browsers that do not support constructing new `ReadableStream`s, this\n * strategy will automatically wait for all the `sourceFunctions` to complete,\n * and create a final response that concatenates their values together.\n *\n * @param {\n * Array} sourceFunctions\n * Each function should return a {@link workbox.streams.StreamSource} (or a\n * Promise which resolves to one).\n * @param {HeadersInit} [headersInit] If there's no `Content-Type` specified,\n * `'text/html'` will be used by default.\n * @return {workbox.routing.Route~handlerCallback}\n *\n * @memberof workbox.streams\n */\nexport function strategy(sourceFunctions, headersInit) {\n return async ({event, url, params}) => {\n if (isSupported()) {\n const {done, response} = concatenateToResponse(sourceFunctions.map(\n (fn) => fn({event, url, params})), headersInit);\n event.waitUntil(done);\n return response;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`The current browser doesn't support creating response ` +\n `streams. Falling back to non-streaming response instead.`);\n }\n\n // Fallback to waiting for everything to finish, and concatenating the\n // responses.\n const parts = await Promise.all(\n sourceFunctions.map(\n (sourceFunction) => sourceFunction({event, url, params})\n ).map(async (responsePromise) => {\n const response = await responsePromise;\n if (response instanceof Response) {\n return response.blob();\n }\n\n // Otherwise, assume it's something like a string which can be used\n // as-is when constructing the final composite blob.\n return response;\n })\n );\n\n const headers = createHeaders(headersInit);\n // Constructing a new Response from a Blob source is well-supported.\n // So is constructing a new Blob from multiple source Blobs or strings.\n return new Response(new Blob(parts), {headers});\n };\n}\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {concatenate} from './concatenate.mjs';\nimport {concatenateToResponse} from './concatenateToResponse.mjs';\nimport {isSupported} from './isSupported.mjs';\nimport {strategy} from './strategy.mjs';\nimport './_version.mjs';\n\n\n/**\n * @namespace workbox.streams\n */\n\nexport {\n concatenate,\n concatenateToResponse,\n isSupported,\n strategy,\n};\n"],"names":["self","_","e","_getReaderFromSource","source","body","getReader","Response","concatenate","sourcePromises","assert","isArray","moduleName","funcName","paramName","readerPromises","map","sourcePromise","Promise","resolve","then","fullyStreamedResolve","fullyStreamedReject","done","reject","i","logMessages","stream","ReadableStream","pull","controller","reader","read","result","push","length","logger","groupCollapsed","message","Array","log","groupEnd","close","enqueue","value","catch","error","cancel","warn","createHeaders","headersInit","headers","Headers","has","set","concatenateToResponse","response","cachedIsSupported","undefined","isSupported","start","strategy","sourceFunctions","event","url","params","fn","waitUntil","parts","all","sourceFunction","responsePromise","blob","Blob"],"mappings":"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"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-streams.prod.js b/workbox-v4.3.1/workbox-streams.prod.js new file mode 100644 index 00000000..dc348446 --- /dev/null +++ b/workbox-v4.3.1/workbox-streams.prod.js @@ -0,0 +1,2 @@ +this.workbox=this.workbox||{},this.workbox.streams=function(e){"use strict";try{self["workbox:streams:4.3.1"]&&_()}catch(e){}function n(e){const n=e.map(e=>Promise.resolve(e).then(e=>(function(e){return e.body&&e.body.getReader?e.body.getReader():e.getReader?e.getReader():new Response(e).body.getReader()})(e)));let t,r;const s=new Promise((e,n)=>{t=e,r=n});let o=0;return{done:s,stream:new ReadableStream({pull(e){return n[o].then(e=>e.read()).then(r=>{if(r.done)return++o>=n.length?(e.close(),void t()):this.pull(e);e.enqueue(r.value)}).catch(e=>{throw r(e),e})},cancel(){t()}})}}function t(e={}){const n=new Headers(e);return n.has("content-type")||n.set("content-type","text/html"),n}function r(e,r){const{done:s,stream:o}=n(e),a=t(r);return{done:s,response:new Response(o,{headers:a})}}let s=void 0;function o(){if(void 0===s)try{new ReadableStream({start(){}}),s=!0}catch(e){s=!1}return s}return e.concatenate=n,e.concatenateToResponse=r,e.isSupported=o,e.strategy=function(e,n){return async({event:s,url:a,params:c})=>{if(o()){const{done:t,response:o}=r(e.map(e=>e({event:s,url:a,params:c})),n);return s.waitUntil(t),o}const i=await Promise.all(e.map(e=>e({event:s,url:a,params:c})).map(async e=>{const n=await e;return n instanceof Response?n.blob():n})),u=t(n);return new Response(new Blob(i),{headers:u})}},e}({}); +//# sourceMappingURL=workbox-streams.prod.js.map diff --git a/workbox-v4.3.1/workbox-streams.prod.js.map b/workbox-v4.3.1/workbox-streams.prod.js.map new file mode 100644 index 00000000..ac76d02e --- /dev/null +++ b/workbox-v4.3.1/workbox-streams.prod.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-streams.prod.js","sources":["../_version.mjs","../concatenate.mjs","../utils/createHeaders.mjs","../concatenateToResponse.mjs","../isSupported.mjs","../strategy.mjs"],"sourcesContent":["try{self['workbox:streams:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {assert} from 'workbox-core/_private/assert.mjs';\n\nimport './_version.mjs';\n\n/**\n * Takes either a Response, a ReadableStream, or a\n * [BodyInit](https://fetch.spec.whatwg.org/#bodyinit) and returns the\n * ReadableStreamReader object associated with it.\n *\n * @param {workbox.streams.StreamSource} source\n * @return {ReadableStreamReader}\n * @private\n */\nfunction _getReaderFromSource(source) {\n if (source.body && source.body.getReader) {\n return source.body.getReader();\n }\n\n if (source.getReader) {\n return source.getReader();\n }\n\n // TODO: This should be possible to do by constructing a ReadableStream, but\n // I can't get it to work. As a hack, construct a new Response, and use the\n // reader associated with its body.\n return new Response(source).body.getReader();\n}\n\n/**\n * Takes multiple source Promises, each of which could resolve to a Response, a\n * ReadableStream, or a [BodyInit](https://fetch.spec.whatwg.org/#bodyinit).\n *\n * Returns an object exposing a ReadableStream with each individual stream's\n * data returned in sequence, along with a Promise which signals when the\n * stream is finished (useful for passing to a FetchEvent's waitUntil()).\n *\n * @param {Array>} sourcePromises\n * @return {Object<{done: Promise, stream: ReadableStream}>}\n *\n * @memberof workbox.streams\n */\nfunction concatenate(sourcePromises) {\n if (process.env.NODE_ENV !== 'production') {\n assert.isArray(sourcePromises, {\n moduleName: 'workbox-streams',\n funcName: 'concatenate',\n paramName: 'sourcePromises',\n });\n }\n\n const readerPromises = sourcePromises.map((sourcePromise) => {\n return Promise.resolve(sourcePromise).then((source) => {\n return _getReaderFromSource(source);\n });\n });\n\n let fullyStreamedResolve;\n let fullyStreamedReject;\n const done = new Promise((resolve, reject) => {\n fullyStreamedResolve = resolve;\n fullyStreamedReject = reject;\n });\n\n let i = 0;\n const logMessages = [];\n const stream = new ReadableStream({\n pull(controller) {\n return readerPromises[i]\n .then((reader) => reader.read())\n .then((result) => {\n if (result.done) {\n if (process.env.NODE_ENV !== 'production') {\n logMessages.push(['Reached the end of source:',\n sourcePromises[i]]);\n }\n\n i++;\n if (i >= readerPromises.length) {\n // Log all the messages in the group at once in a single group.\n if (process.env.NODE_ENV !== 'production') {\n logger.groupCollapsed(\n `Concatenating ${readerPromises.length} sources.`);\n for (const message of logMessages) {\n if (Array.isArray(message)) {\n logger.log(...message);\n } else {\n logger.log(message);\n }\n }\n logger.log('Finished reading all sources.');\n logger.groupEnd();\n }\n\n controller.close();\n fullyStreamedResolve();\n return;\n }\n\n return this.pull(controller);\n } else {\n controller.enqueue(result.value);\n }\n }).catch((error) => {\n if (process.env.NODE_ENV !== 'production') {\n logger.error('An error occurred:', error);\n }\n fullyStreamedReject(error);\n throw error;\n });\n },\n\n cancel() {\n if (process.env.NODE_ENV !== 'production') {\n logger.warn('The ReadableStream was cancelled.');\n }\n\n fullyStreamedResolve();\n },\n });\n\n return {done, stream};\n}\n\nexport {concatenate};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n/**\n * This is a utility method that determines whether the current browser supports\n * the features required to create streamed responses. Currently, it checks if\n * [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/ReadableStream)\n * is available.\n *\n * @param {HeadersInit} [headersInit] If there's no `Content-Type` specified,\n * `'text/html'` will be used by default.\n * @return {boolean} `true`, if the current browser meets the requirements for\n * streaming responses, and `false` otherwise.\n *\n * @memberof workbox.streams\n */\nfunction createHeaders(headersInit = {}) {\n // See https://github.com/GoogleChrome/workbox/issues/1461\n const headers = new Headers(headersInit);\n if (!headers.has('content-type')) {\n headers.set('content-type', 'text/html');\n }\n return headers;\n}\n\nexport {createHeaders};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {createHeaders} from './utils/createHeaders.mjs';\nimport {concatenate} from './concatenate.mjs';\n\nimport './_version.mjs';\n\n/**\n * Takes multiple source Promises, each of which could resolve to a Response, a\n * ReadableStream, or a [BodyInit](https://fetch.spec.whatwg.org/#bodyinit),\n * along with a\n * [HeadersInit](https://fetch.spec.whatwg.org/#typedefdef-headersinit).\n *\n * Returns an object exposing a Response whose body consists of each individual\n * stream's data returned in sequence, along with a Promise which signals when\n * the stream is finished (useful for passing to a FetchEvent's waitUntil()).\n *\n * @param {Array>} sourcePromises\n * @param {HeadersInit} [headersInit] If there's no `Content-Type` specified,\n * `'text/html'` will be used by default.\n * @return {Object<{done: Promise, response: Response}>}\n *\n * @memberof workbox.streams\n */\nfunction concatenateToResponse(sourcePromises, headersInit) {\n const {done, stream} = concatenate(sourcePromises);\n\n const headers = createHeaders(headersInit);\n const response = new Response(stream, {headers});\n\n return {done, response};\n}\n\nexport {concatenateToResponse};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport './_version.mjs';\n\nlet cachedIsSupported = undefined;\n\n/**\n * This is a utility method that determines whether the current browser supports\n * the features required to create streamed responses. Currently, it checks if\n * [`ReadableStream`](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream/ReadableStream)\n * can be created.\n *\n * @return {boolean} `true`, if the current browser meets the requirements for\n * streaming responses, and `false` otherwise.\n *\n * @memberof workbox.streams\n */\nfunction isSupported() {\n if (cachedIsSupported === undefined) {\n // See https://github.com/GoogleChrome/workbox/issues/1473\n try {\n new ReadableStream({start() {}});\n cachedIsSupported = true;\n } catch (error) {\n cachedIsSupported = false;\n }\n }\n\n return cachedIsSupported;\n}\n\nexport {isSupported};\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {logger} from 'workbox-core/_private/logger.mjs';\n\nimport {createHeaders} from './utils/createHeaders.mjs';\nimport {concatenateToResponse} from './concatenateToResponse.mjs';\nimport {isSupported} from './isSupported.mjs';\n\nimport './_version.mjs';\n\n/**\n * A shortcut to create a strategy that could be dropped-in to Workbox's router.\n *\n * On browsers that do not support constructing new `ReadableStream`s, this\n * strategy will automatically wait for all the `sourceFunctions` to complete,\n * and create a final response that concatenates their values together.\n *\n * @param {\n * Array} sourceFunctions\n * Each function should return a {@link workbox.streams.StreamSource} (or a\n * Promise which resolves to one).\n * @param {HeadersInit} [headersInit] If there's no `Content-Type` specified,\n * `'text/html'` will be used by default.\n * @return {workbox.routing.Route~handlerCallback}\n *\n * @memberof workbox.streams\n */\nexport function strategy(sourceFunctions, headersInit) {\n return async ({event, url, params}) => {\n if (isSupported()) {\n const {done, response} = concatenateToResponse(sourceFunctions.map(\n (fn) => fn({event, url, params})), headersInit);\n event.waitUntil(done);\n return response;\n }\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log(`The current browser doesn't support creating response ` +\n `streams. Falling back to non-streaming response instead.`);\n }\n\n // Fallback to waiting for everything to finish, and concatenating the\n // responses.\n const parts = await Promise.all(\n sourceFunctions.map(\n (sourceFunction) => sourceFunction({event, url, params})\n ).map(async (responsePromise) => {\n const response = await responsePromise;\n if (response instanceof Response) {\n return response.blob();\n }\n\n // Otherwise, assume it's something like a string which can be used\n // as-is when constructing the final composite blob.\n return response;\n })\n );\n\n const headers = createHeaders(headersInit);\n // Constructing a new Response from a Blob source is well-supported.\n // So is constructing a new Blob from multiple source Blobs or strings.\n return new Response(new Blob(parts), {headers});\n };\n}\n"],"names":["self","_","e","concatenate","sourcePromises","readerPromises","map","sourcePromise","Promise","resolve","then","source","body","getReader","Response","_getReaderFromSource","fullyStreamedResolve","fullyStreamedReject","done","reject","i","stream","ReadableStream","pull","controller","reader","read","result","length","close","this","enqueue","value","catch","error","cancel","createHeaders","headersInit","headers","Headers","has","set","concatenateToResponse","response","cachedIsSupported","undefined","isSupported","start","sourceFunctions","async","event","url","params","fn","waitUntil","parts","all","sourceFunction","responsePromise","blob","Blob"],"mappings":"4EAAA,IAAIA,KAAK,0BAA0BC,IAAI,MAAMC,ICkD7C,SAASC,EAAYC,SASbC,EAAiBD,EAAeE,IAAKC,GAClCC,QAAQC,QAAQF,GAAeG,KAAMC,IAtChD,SAA8BA,UACxBA,EAAOC,MAAQD,EAAOC,KAAKC,UACtBF,EAAOC,KAAKC,YAGjBF,EAAOE,UACFF,EAAOE,YAMT,IAAIC,SAASH,GAAQC,KAAKC,aA2BtBE,CAAqBJ,SAI5BK,EACAC,QACEC,EAAO,IAAIV,QAAQ,CAACC,EAASU,KACjCH,EAAuBP,EACvBQ,EAAsBE,QAGpBC,EAAI,QAyDD,CAACF,KAAAA,EAAMG,OAvDC,IAAIC,eAAe,CAChCC,KAAKC,UACInB,EAAee,GACjBV,KAAMe,GAAWA,EAAOC,QACxBhB,KAAMiB,OACDA,EAAOT,aAMTE,GACSf,EAAeuB,QAgBtBJ,EAAWK,aACXb,KAIKc,KAAKP,KAAKC,GAEjBA,EAAWO,QAAQJ,EAAOK,SAE3BC,MAAOC,UAIRjB,EAAoBiB,GACdA,KAIdC,SAKEnB,QCtGN,SAASoB,EAAcC,EAAc,UAE7BC,EAAU,IAAIC,QAAQF,UACvBC,EAAQE,IAAI,iBACfF,EAAQG,IAAI,eAAgB,aAEvBH,ECCT,SAASI,EAAsBtC,EAAgBiC,SACvCnB,KAACA,EAADG,OAAOA,GAAUlB,EAAYC,GAE7BkC,EAAUF,EAAcC,SAGvB,CAACnB,KAAAA,EAAMyB,SAFG,IAAI7B,SAASO,EAAQ,CAACiB,QAAAA,KCxBzC,IAAIM,OAAoBC,EAaxB,SAASC,YACmBD,IAAtBD,UAGItB,eAAe,CAACyB,YACpBH,GAAoB,EACpB,MAAOV,GACPU,GAAoB,SAIjBA,8ECDF,SAAkBI,EAAiBX,UACjCY,OAAQC,MAAAA,EAAOC,IAAAA,EAAKC,OAAAA,SACrBN,IAAe,OACX5B,KAACA,EAADyB,SAAOA,GAAYD,EAAsBM,EAAgB1C,IAC1D+C,GAAOA,EAAG,CAACH,MAAAA,EAAOC,IAAAA,EAAKC,OAAAA,KAAWf,UACvCa,EAAMI,UAAUpC,GACTyB,QAUHY,QAAc/C,QAAQgD,IACxBR,EAAgB1C,IACXmD,GAAmBA,EAAe,CAACP,MAAAA,EAAOC,IAAAA,EAAKC,OAAAA,KAClD9C,IAAI2C,MAAAA,UACEN,QAAiBe,SACnBf,aAAoB7B,SACf6B,EAASgB,OAKXhB,KAIPL,EAAUF,EAAcC,UAGvB,IAAIvB,SAAS,IAAI8C,KAAKL,GAAQ,CAACjB,QAAAA"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-sw.js b/workbox-v4.3.1/workbox-sw.js new file mode 100644 index 00000000..61b3289a --- /dev/null +++ b/workbox-v4.3.1/workbox-sw.js @@ -0,0 +1,2 @@ +!function(){"use strict";try{self["workbox:sw:4.3.1"]&&_()}catch(t){}const t="https://storage.googleapis.com/workbox-cdn/releases/4.3.1",e={backgroundSync:"background-sync",broadcastUpdate:"broadcast-update",cacheableResponse:"cacheable-response",core:"core",expiration:"expiration",googleAnalytics:"offline-ga",navigationPreload:"navigation-preload",precaching:"precaching",rangeRequests:"range-requests",routing:"routing",strategies:"strategies",streams:"streams"};self.workbox=new class{constructor(){return this.v={},this.t={debug:"localhost"===self.location.hostname,modulePathPrefix:null,modulePathCb:null},this.s=this.t.debug?"dev":"prod",this.o=!1,new Proxy(this,{get(t,s){if(t[s])return t[s];const o=e[s];return o&&t.loadModule(`workbox-${o}`),t[s]}})}setConfig(t={}){if(this.o)throw new Error("Config must be set before accessing workbox.* modules");Object.assign(this.t,t),this.s=this.t.debug?"dev":"prod"}loadModule(t){const e=this.i(t);try{importScripts(e),this.o=!0}catch(s){throw console.error(`Unable to import module '${t}' from '${e}'.`),s}}i(e){if(this.t.modulePathCb)return this.t.modulePathCb(e,this.t.debug);let s=[t];const o=`${e}.${this.s}.js`,r=this.t.modulePathPrefix;return r&&""===(s=r.split("/"))[s.length-1]&&s.splice(s.length-1,1),s.push(o),s.join("/")}}}(); +//# sourceMappingURL=workbox-sw.js.map diff --git a/workbox-v4.3.1/workbox-sw.js.map b/workbox-v4.3.1/workbox-sw.js.map new file mode 100644 index 00000000..efb3c365 --- /dev/null +++ b/workbox-v4.3.1/workbox-sw.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-sw.js","sources":["../_version.mjs","../controllers/WorkboxSW.mjs","../index.mjs"],"sourcesContent":["try{self['workbox:sw:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\nconst CDN_PATH = `WORKBOX_CDN_ROOT_URL`;\n\nconst MODULE_KEY_TO_NAME_MAPPING = {\n // TODO(philipwalton): add jsdoc tags to associate these with their module.\n // @name backgroundSync\n // @memberof workbox\n // @see module:workbox-background-sync\n backgroundSync: 'background-sync',\n broadcastUpdate: 'broadcast-update',\n cacheableResponse: 'cacheable-response',\n core: 'core',\n expiration: 'expiration',\n googleAnalytics: 'offline-ga',\n navigationPreload: 'navigation-preload',\n precaching: 'precaching',\n rangeRequests: 'range-requests',\n routing: 'routing',\n strategies: 'strategies',\n streams: 'streams',\n};\n\n/**\n * This class can be used to make it easy to use the various parts of\n * Workbox.\n *\n * @private\n */\nexport class WorkboxSW {\n /**\n * Creates a proxy that automatically loads workbox namespaces on demand.\n *\n * @private\n */\n constructor() {\n this.v = {};\n this._options = {\n debug: self.location.hostname === 'localhost',\n modulePathPrefix: null,\n modulePathCb: null,\n };\n\n this._env = this._options.debug ? 'dev' : 'prod';\n this._modulesLoaded = false;\n\n return new Proxy(this, {\n get(target, key) {\n if (target[key]) {\n return target[key];\n }\n\n const moduleName = MODULE_KEY_TO_NAME_MAPPING[key];\n if (moduleName) {\n target.loadModule(`workbox-${moduleName}`);\n }\n\n return target[key];\n },\n });\n }\n\n /**\n * Updates the configuration options. You can specify whether to treat as a\n * debug build and whether to use a CDN or a specific path when importing\n * other workbox-modules\n *\n * @param {Object} [options]\n * @param {boolean} [options.debug] If true, `dev` builds are using, otherwise\n * `prod` builds are used. By default, `prod` is used unless on localhost.\n * @param {Function} [options.modulePathPrefix] To avoid using the CDN with\n * `workbox-sw` set the path prefix of where modules should be loaded from.\n * For example `modulePathPrefix: '/third_party/workbox/v3.0.0/'`.\n * @param {workbox~ModulePathCallback} [options.modulePathCb] If defined,\n * this callback will be responsible for determining the path of each\n * workbox module.\n *\n * @alias workbox.setConfig\n */\n setConfig(options = {}) {\n if (!this._modulesLoaded) {\n Object.assign(this._options, options);\n this._env = this._options.debug ? 'dev' : 'prod';\n } else {\n throw new Error('Config must be set before accessing workbox.* modules');\n }\n }\n\n /**\n * Load a Workbox module by passing in the appropriate module name.\n *\n * This is not generally needed unless you know there are modules that are\n * dynamically used and you want to safe guard use of the module while the\n * user may be offline.\n *\n * @param {string} moduleName\n *\n * @alias workbox.loadModule\n */\n loadModule(moduleName) {\n const modulePath = this._getImportPath(moduleName);\n try {\n importScripts(modulePath);\n this._modulesLoaded = true;\n } catch (err) {\n // TODO Add context of this error if using the CDN vs the local file.\n\n // We can't rely on workbox-core being loaded so using console\n // eslint-disable-next-line\n console.error(\n `Unable to import module '${moduleName}' from '${modulePath}'.`);\n throw err;\n }\n }\n\n /**\n * This method will get the path / CDN URL to be used for importScript calls.\n *\n * @param {string} moduleName\n * @return {string} URL to the desired module.\n *\n * @private\n */\n _getImportPath(moduleName) {\n if (this._options.modulePathCb) {\n return this._options.modulePathCb(moduleName, this._options.debug);\n }\n\n // TODO: This needs to be dynamic some how.\n let pathParts = [CDN_PATH];\n\n const fileName = `${moduleName}.${this._env}.js`;\n\n const pathPrefix = this._options.modulePathPrefix;\n if (pathPrefix) {\n // Split to avoid issues with developers ending / not ending with slash\n pathParts = pathPrefix.split('/');\n\n // We don't need a slash at the end as we will be adding\n // a filename regardless\n if (pathParts[pathParts.length - 1] === '') {\n pathParts.splice(pathParts.length - 1, 1);\n }\n }\n\n pathParts.push(fileName);\n\n return pathParts.join('/');\n }\n}\n","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {WorkboxSW} from './controllers/WorkboxSW.mjs';\nimport './_version.mjs';\n\n/**\n * @namespace workbox\n */\n\n// Don't export anything, just expose a global.\nself.workbox = new WorkboxSW();\n"],"names":["self","_","e","CDN_PATH","MODULE_KEY_TO_NAME_MAPPING","backgroundSync","broadcastUpdate","cacheableResponse","core","expiration","googleAnalytics","navigationPreload","precaching","rangeRequests","routing","strategies","streams","workbox","constructor","v","_options","debug","location","hostname","modulePathPrefix","modulePathCb","_env","this","_modulesLoaded","Proxy","get","target","key","moduleName","loadModule","setConfig","options","Error","Object","assign","modulePath","_getImportPath","importScripts","err","console","error","pathParts","fileName","pathPrefix","split","length","splice","push","join"],"mappings":"yBAAA,IAAIA,KAAK,qBAAqBC,IAAI,MAAMC,ICUxC,MAAMC,EAAY,4DAEZC,EAA6B,CAKjCC,eAAgB,kBAChBC,gBAAiB,mBACjBC,kBAAmB,qBACnBC,KAAM,OACNC,WAAY,aACZC,gBAAiB,aACjBC,kBAAmB,qBACnBC,WAAY,aACZC,cAAe,iBACfC,QAAS,UACTC,WAAY,aACZC,QAAS,WCZXhB,KAAKiB,QAAU,IDqBR,MAMLC,0BACOC,EAAI,QACJC,EAAW,CACdC,MAAkC,cAA3BrB,KAAKsB,SAASC,SACrBC,iBAAkB,KAClBC,aAAc,WAGXC,EAAOC,KAAKP,EAASC,MAAQ,MAAQ,YACrCO,GAAiB,EAEf,IAAIC,MAAMF,KAAM,CACrBG,IAAIC,EAAQC,MACND,EAAOC,UACFD,EAAOC,SAGVC,EAAa7B,EAA2B4B,UAC1CC,GACFF,EAAOG,sBAAsBD,KAGxBF,EAAOC,MAsBpBG,UAAUC,EAAU,OACbT,KAAKC,QAIF,IAAIS,MAAM,yDAHhBC,OAAOC,OAAOZ,KAAKP,EAAUgB,QACxBV,EAAOC,KAAKP,EAASC,MAAQ,MAAQ,OAiB9Ca,WAAWD,SACHO,EAAab,KAAKc,EAAeR,OAErCS,cAAcF,QACTZ,GAAiB,EACtB,MAAOe,SAKPC,QAAQC,kCACwBZ,YAAqBO,OAC/CG,GAYVF,EAAeR,MACTN,KAAKP,EAASK,oBACTE,KAAKP,EAASK,aAAaQ,EAAYN,KAAKP,EAASC,WAI1DyB,EAAY,CAAC3C,SAEX4C,KAAcd,KAAcN,KAAKD,OAEjCsB,EAAarB,KAAKP,EAASI,wBAC7BwB,GAMsC,MAJxCF,EAAYE,EAAWC,MAAM,MAIfH,EAAUI,OAAS,IAC/BJ,EAAUK,OAAOL,EAAUI,OAAS,EAAG,GAI3CJ,EAAUM,KAAKL,GAERD,EAAUO,KAAK"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-window.dev.es5.mjs b/workbox-v4.3.1/workbox-window.dev.es5.mjs new file mode 100644 index 00000000..73240674 --- /dev/null +++ b/workbox-v4.3.1/workbox-window.dev.es5.mjs @@ -0,0 +1,885 @@ +try { + self['workbox:window:4.3.1'] && _(); +} catch (e) {} // eslint-disable-line + +/* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. +*/ +/** + * Sends a data object to a service worker via `postMessage` and resolves with + * a response (if any). + * + * A response can be set in a message handler in the service worker by + * calling `event.ports[0].postMessage(...)`, which will resolve the promise + * returned by `messageSW()`. If no response is set, the promise will not + * resolve. + * + * @param {ServiceWorker} sw The service worker to send the message to. + * @param {Object} data An object to send to the service worker. + * @return {Promise} + * + * @memberof module:workbox-window + */ + +var messageSW = function messageSW(sw, data) { + return new Promise(function (resolve) { + var messageChannel = new MessageChannel(); + + messageChannel.port1.onmessage = function (evt) { + return resolve(evt.data); + }; + + sw.postMessage(data, [messageChannel.port2]); + }); +}; + +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} + +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; +} + +function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; +} + +function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return self; +} + +try { + self['workbox:core:4.3.1'] && _(); +} catch (e) {} // eslint-disable-line + +/* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. +*/ +/** + * The Deferred class composes Promises in a way that allows for them to be + * resolved or rejected from outside the constructor. In most cases promises + * should be used directly, but Deferreds can be necessary when the logic to + * resolve a promise must be separate. + * + * @private + */ + +var Deferred = +/** + * Creates a promise and exposes its resolve and reject functions as methods. + */ +function Deferred() { + var _this = this; + + this.promise = new Promise(function (resolve, reject) { + _this.resolve = resolve; + _this.reject = reject; + }); +}; + +/* + Copyright 2019 Google LLC + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. +*/ +var logger = function () { + var inGroup = false; + var methodToColorMap = { + debug: "#7f8c8d", + // Gray + log: "#2ecc71", + // Green + warn: "#f39c12", + // Yellow + error: "#c0392b", + // Red + groupCollapsed: "#3498db", + // Blue + groupEnd: null // No colored prefix on groupEnd + + }; + + var print = function print(method, args) { + var _console2; + + if (method === 'groupCollapsed') { + // Safari doesn't print all console.groupCollapsed() arguments: + // https://bugs.webkit.org/show_bug.cgi?id=182754 + if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { + var _console; + + (_console = console)[method].apply(_console, args); + + return; + } + } + + var styles = ["background: " + methodToColorMap[method], "border-radius: 0.5em", "color: white", "font-weight: bold", "padding: 2px 0.5em"]; // When in a group, the workbox prefix is not displayed. + + var logPrefix = inGroup ? [] : ['%cworkbox', styles.join(';')]; + + (_console2 = console)[method].apply(_console2, logPrefix.concat(args)); + + if (method === 'groupCollapsed') { + inGroup = true; + } + + if (method === 'groupEnd') { + inGroup = false; + } + }; + + var api = {}; + + var _arr = Object.keys(methodToColorMap); + + var _loop = function _loop() { + var method = _arr[_i]; + + api[method] = function () { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + print(method, args); + }; + }; + + for (var _i = 0; _i < _arr.length; _i++) { + _loop(); + } + + return api; +}(); + +/* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. +*/ +/** + * A minimal `EventTarget` shim. + * This is necessary because not all browsers support constructable + * `EventTarget`, so using a real `EventTarget` will error. + * @private + */ + +var EventTargetShim = +/*#__PURE__*/ +function () { + /** + * Creates an event listener registry + * + * @private + */ + function EventTargetShim() { + // A registry of event types to listeners. + this._eventListenerRegistry = {}; + } + /** + * @param {string} type + * @param {Function} listener + * @private + */ + + + var _proto = EventTargetShim.prototype; + + _proto.addEventListener = function addEventListener(type, listener) { + this._getEventListenersByType(type).add(listener); + }; + /** + * @param {string} type + * @param {Function} listener + * @private + */ + + + _proto.removeEventListener = function removeEventListener(type, listener) { + this._getEventListenersByType(type).delete(listener); + }; + /** + * @param {Event} event + * @private + */ + + + _proto.dispatchEvent = function dispatchEvent(event) { + event.target = this; + + this._getEventListenersByType(event.type).forEach(function (listener) { + return listener(event); + }); + }; + /** + * Returns a Set of listeners associated with the passed event type. + * If no handlers have been registered, an empty Set is returned. + * + * @param {string} type The event type. + * @return {Set} An array of handler functions. + * @private + */ + + + _proto._getEventListenersByType = function _getEventListenersByType(type) { + return this._eventListenerRegistry[type] = this._eventListenerRegistry[type] || new Set(); + }; + + return EventTargetShim; +}(); + +/* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. +*/ +/** + * Returns true if two URLs have the same `.href` property. The URLS can be + * relative, and if they are the current location href is used to resolve URLs. + * + * @private + * @param {string} url1 + * @param {string} url2 + * @return {boolean} + */ + +var urlsMatch = function urlsMatch(url1, url2) { + return new URL(url1, location).href === new URL(url2, location).href; +}; + +/* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. +*/ +/** + * A minimal `Event` subclass shim. + * This doesn't *actually* subclass `Event` because not all browsers support + * constructable `EventTarget`, and using a real `Event` will error. + * @private + */ + +var WorkboxEvent = +/** + * @param {string} type + * @param {Object} props + */ +function WorkboxEvent(type, props) { + Object.assign(this, props, { + type: type + }); +}; + +function _catch(body, recover) { + try { + var result = body(); + } catch (e) { + return recover(e); + } + + if (result && result.then) { + return result.then(void 0, recover); + } + + return result; +} + +function _async(f) { + return function () { + for (var args = [], i = 0; i < arguments.length; i++) { + args[i] = arguments[i]; + } + + try { + return Promise.resolve(f.apply(this, args)); + } catch (e) { + return Promise.reject(e); + } + }; +} + +function _invoke(body, then) { + var result = body(); + + if (result && result.then) { + return result.then(then); + } + + return then(result); +} + +function _await(value, then, direct) { + if (direct) { + return then ? then(value) : value; + } + + if (!value || !value.then) { + value = Promise.resolve(value); + } + + return then ? value.then(then) : value; +} + +function _awaitIgnored(value, direct) { + if (!direct) { + return value && value.then ? value.then(_empty) : Promise.resolve(); + } +} + +function _empty() {} +// `skipWaiting()` wasn't called. This 200 amount wasn't scientifically +// chosen, but it seems to avoid false positives in my testing. + +var WAITING_TIMEOUT_DURATION = 200; // The amount of time after a registration that we can reasonably conclude +// that the registration didn't trigger an update. + +var REGISTRATION_TIMEOUT_DURATION = 60000; +/** + * A class to aid in handling service worker registration, updates, and + * reacting to service worker lifecycle events. + * + * @fires [message]{@link module:workbox-window.Workbox#message} + * @fires [installed]{@link module:workbox-window.Workbox#installed} + * @fires [waiting]{@link module:workbox-window.Workbox#waiting} + * @fires [controlling]{@link module:workbox-window.Workbox#controlling} + * @fires [activated]{@link module:workbox-window.Workbox#activated} + * @fires [redundant]{@link module:workbox-window.Workbox#redundant} + * @fires [externalinstalled]{@link module:workbox-window.Workbox#externalinstalled} + * @fires [externalwaiting]{@link module:workbox-window.Workbox#externalwaiting} + * @fires [externalactivated]{@link module:workbox-window.Workbox#externalactivated} + * + * @memberof module:workbox-window + */ + +var Workbox = +/*#__PURE__*/ +function (_EventTargetShim) { + _inheritsLoose(Workbox, _EventTargetShim); + + /** + * Creates a new Workbox instance with a script URL and service worker + * options. The script URL and options are the same as those used when + * calling `navigator.serviceWorker.register(scriptURL, options)`. See: + * https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/register + * + * @param {string} scriptURL The service worker script associated with this + * instance. + * @param {Object} [registerOptions] The service worker options associated + * with this instance. + */ + function Workbox(scriptURL, registerOptions) { + var _this; + + if (registerOptions === void 0) { + registerOptions = {}; + } + + _this = _EventTargetShim.call(this) || this; + _this._scriptURL = scriptURL; + _this._registerOptions = registerOptions; + _this._updateFoundCount = 0; // Deferreds we can resolve later. + + _this._swDeferred = new Deferred(); + _this._activeDeferred = new Deferred(); + _this._controllingDeferred = new Deferred(); // Bind event handler callbacks. + + _this._onMessage = _this._onMessage.bind(_assertThisInitialized(_assertThisInitialized(_this))); + _this._onStateChange = _this._onStateChange.bind(_assertThisInitialized(_assertThisInitialized(_this))); + _this._onUpdateFound = _this._onUpdateFound.bind(_assertThisInitialized(_assertThisInitialized(_this))); + _this._onControllerChange = _this._onControllerChange.bind(_assertThisInitialized(_assertThisInitialized(_this))); + return _this; + } + /** + * Registers a service worker for this instances script URL and service + * worker options. By default this method delays registration until after + * the window has loaded. + * + * @param {Object} [options] + * @param {Function} [options.immediate=false] Setting this to true will + * register the service worker immediately, even if the window has + * not loaded (not recommended). + */ + + + var _proto = Workbox.prototype; + _proto.register = _async(function (_temp) { + var _this2 = this; + + var _ref = _temp === void 0 ? {} : _temp, + _ref$immediate = _ref.immediate, + immediate = _ref$immediate === void 0 ? false : _ref$immediate; + + { + if (_this2._registrationTime) { + logger.error('Cannot re-register a Workbox instance after it has ' + 'been registered. Create a new instance instead.'); + return; + } + } + + return _invoke(function () { + if (!immediate && document.readyState !== 'complete') { + return _awaitIgnored(new Promise(function (res) { + return addEventListener('load', res); + })); + } + }, function () { + // Set this flag to true if any service worker was controlling the page + // at registration time. + _this2._isUpdate = Boolean(navigator.serviceWorker.controller); // Before registering, attempt to determine if a SW is already controlling + // the page, and if that SW script (and version, if specified) matches this + // instance's script. + + _this2._compatibleControllingSW = _this2._getControllingSWIfCompatible(); + return _await(_this2._registerScript(), function (_this2$_registerScrip) { + _this2._registration = _this2$_registerScrip; + + // If we have a compatible controller, store the controller as the "own" + // SW, resolve active/controlling deferreds and add necessary listeners. + if (_this2._compatibleControllingSW) { + _this2._sw = _this2._compatibleControllingSW; + + _this2._activeDeferred.resolve(_this2._compatibleControllingSW); + + _this2._controllingDeferred.resolve(_this2._compatibleControllingSW); + + _this2._reportWindowReady(_this2._compatibleControllingSW); + + _this2._compatibleControllingSW.addEventListener('statechange', _this2._onStateChange, { + once: true + }); + } // If there's a waiting service worker with a matching URL before the + // `updatefound` event fires, it likely means that this site is open + // in another tab, or the user refreshed the page (and thus the prevoius + // page wasn't fully unloaded before this page started loading). + // https://developers.google.com/web/fundamentals/primers/service-workers/lifecycle#waiting + + + var waitingSW = _this2._registration.waiting; + + if (waitingSW && urlsMatch(waitingSW.scriptURL, _this2._scriptURL)) { + // Store the waiting SW as the "own" Sw, even if it means overwriting + // a compatible controller. + _this2._sw = waitingSW; // Run this in the next microtask, so any code that adds an event + // listener after awaiting `register()` will get this event. + + Promise.resolve().then(function () { + _this2.dispatchEvent(new WorkboxEvent('waiting', { + sw: waitingSW, + wasWaitingBeforeRegister: true + })); + + { + logger.warn('A service worker was already waiting to activate ' + 'before this script was registered...'); + } + }); + } // If an "own" SW is already set, resolve the deferred. + + + if (_this2._sw) { + _this2._swDeferred.resolve(_this2._sw); + } + + { + logger.log('Successfully registered service worker.', _this2._scriptURL); + + if (navigator.serviceWorker.controller) { + if (_this2._compatibleControllingSW) { + logger.debug('A service worker with the same script URL ' + 'is already controlling this page.'); + } else { + logger.debug('A service worker with a different script URL is ' + 'currently controlling the page. The browser is now fetching ' + 'the new script now...'); + } + } + + var currentPageIsOutOfScope = function currentPageIsOutOfScope() { + var scopeURL = new URL(_this2._registerOptions.scope || _this2._scriptURL, document.baseURI); + var scopeURLBasePath = new URL('./', scopeURL.href).pathname; + return !location.pathname.startsWith(scopeURLBasePath); + }; + + if (currentPageIsOutOfScope()) { + logger.warn('The current page is not in scope for the registered ' + 'service worker. Was this a mistake?'); + } + } + + _this2._registration.addEventListener('updatefound', _this2._onUpdateFound); + + navigator.serviceWorker.addEventListener('controllerchange', _this2._onControllerChange, { + once: true + }); // Add message listeners. + + if ('BroadcastChannel' in self) { + _this2._broadcastChannel = new BroadcastChannel('workbox'); + + _this2._broadcastChannel.addEventListener('message', _this2._onMessage); + } + + navigator.serviceWorker.addEventListener('message', _this2._onMessage); + return _this2._registration; + }); + }); + }); + /** + * Resolves to the service worker registered by this instance as soon as it + * is active. If a service worker was already controlling at registration + * time then it will resolve to that if the script URLs (and optionally + * script versions) match, otherwise it will wait until an update is found + * and activates. + * + * @return {Promise} + */ + + /** + * Resolves with a reference to a service worker that matches the script URL + * of this instance, as soon as it's available. + * + * If, at registration time, there's already an active or waiting service + * worker with a matching script URL, it will be used (with the waiting + * service worker taking precedence over the active service worker if both + * match, since the waiting service worker would have been registered more + * recently). + * If there's no matching active or waiting service worker at registration + * time then the promise will not resolve until an update is found and starts + * installing, at which point the installing service worker is used. + * + * @return {Promise} + */ + _proto.getSW = _async(function () { + var _this3 = this; + + // If `this._sw` is set, resolve with that as we want `getSW()` to + // return the correct (new) service worker if an update is found. + return _this3._sw || _this3._swDeferred.promise; + }); + /** + * Sends the passed data object to the service worker registered by this + * instance (via [`getSW()`]{@link module:workbox-window.Workbox#getSW}) and resolves + * with a response (if any). + * + * A response can be set in a message handler in the service worker by + * calling `event.ports[0].postMessage(...)`, which will resolve the promise + * returned by `messageSW()`. If no response is set, the promise will never + * resolve. + * + * @param {Object} data An object to send to the service worker + * @return {Promise} + */ + + _proto.messageSW = _async(function (data) { + var _this4 = this; + + return _await(_this4.getSW(), function (sw) { + return messageSW(sw, data); + }); + }); + /** + * Checks for a service worker already controlling the page and returns + * it if its script URL matchs. + * + * @private + * @return {ServiceWorker|undefined} + */ + + _proto._getControllingSWIfCompatible = function _getControllingSWIfCompatible() { + var controller = navigator.serviceWorker.controller; + + if (controller && urlsMatch(controller.scriptURL, this._scriptURL)) { + return controller; + } + }; + /** + * Registers a service worker for this instances script URL and register + * options and tracks the time registration was complete. + * + * @private + */ + + + _proto._registerScript = _async(function () { + var _this5 = this; + + return _catch(function () { + return _await(navigator.serviceWorker.register(_this5._scriptURL, _this5._registerOptions), function (reg) { + // Keep track of when registration happened, so it can be used in the + // `this._onUpdateFound` heuristic. Also use the presence of this + // property as a way to see if `.register()` has been called. + _this5._registrationTime = performance.now(); + return reg; + }); + }, function (error) { + { + logger.error(error); + } // Re-throw the error. + + + throw error; + }); + }); + /** + * Sends a message to the passed service worker that the window is ready. + * + * @param {ServiceWorker} sw + * @private + */ + + _proto._reportWindowReady = function _reportWindowReady(sw) { + messageSW(sw, { + type: 'WINDOW_READY', + meta: 'workbox-window' + }); + }; + /** + * @private + */ + + + _proto._onUpdateFound = function _onUpdateFound() { + var installingSW = this._registration.installing; // If the script URL passed to `navigator.serviceWorker.register()` is + // different from the current controlling SW's script URL, we know any + // successful registration calls will trigger an `updatefound` event. + // But if the registered script URL is the same as the current controlling + // SW's script URL, we'll only get an `updatefound` event if the file + // changed since it was last registered. This can be a problem if the user + // opens up the same page in a different tab, and that page registers + // a SW that triggers an update. It's a problem because this page has no + // good way of knowing whether the `updatefound` event came from the SW + // script it registered or from a registration attempt made by a newer + // version of the page running in another tab. + // To minimize the possibility of a false positive, we use the logic here: + + var updateLikelyTriggeredExternally = // Since we enforce only calling `register()` once, and since we don't + // add the `updatefound` event listener until the `register()` call, if + // `_updateFoundCount` is > 0 then it means this method has already + // been called, thus this SW must be external + this._updateFoundCount > 0 || // If the script URL of the installing SW is different from this + // instance's script URL, we know it's definitely not from our + // registration. + !urlsMatch(installingSW.scriptURL, this._scriptURL) || // If all of the above are false, then we use a time-based heuristic: + // Any `updatefound` event that occurs long after our registration is + // assumed to be external. + performance.now() > this._registrationTime + REGISTRATION_TIMEOUT_DURATION ? // If any of the above are not true, we assume the update was + // triggered by this instance. + true : false; + + if (updateLikelyTriggeredExternally) { + this._externalSW = installingSW; + + this._registration.removeEventListener('updatefound', this._onUpdateFound); + } else { + // If the update was not triggered externally we know the installing + // SW is the one we registered, so we set it. + this._sw = installingSW; + + this._swDeferred.resolve(installingSW); // The `installing` state isn't something we have a dedicated + // callback for, but we do log messages for it in development. + + + { + if (navigator.serviceWorker.controller) { + logger.log('Updated service worker found. Installing now...'); + } else { + logger.log('Service worker is installing...'); + } + } + } // Increment the `updatefound` count, so future invocations of this + // method can be sure they were triggered externally. + + + ++this._updateFoundCount; // Add a `statechange` listener regardless of whether this update was + // triggered externally, since we have callbacks for both. + + installingSW.addEventListener('statechange', this._onStateChange); + }; + /** + * @private + * @param {Event} originalEvent + */ + + + _proto._onStateChange = function _onStateChange(originalEvent) { + var _this6 = this; + + var sw = originalEvent.target; + var state = sw.state; + var isExternal = sw === this._externalSW; + var eventPrefix = isExternal ? 'external' : ''; + var eventProps = { + sw: sw, + originalEvent: originalEvent + }; + + if (!isExternal && this._isUpdate) { + eventProps.isUpdate = true; + } + + this.dispatchEvent(new WorkboxEvent(eventPrefix + state, eventProps)); + + if (state === 'installed') { + // This timeout is used to ignore cases where the service worker calls + // `skipWaiting()` in the install event, thus moving it directly in the + // activating state. (Since all service workers *must* go through the + // waiting phase, the only way to detect `skipWaiting()` called in the + // install event is to observe that the time spent in the waiting phase + // is very short.) + // NOTE: we don't need separate timeouts for the own and external SWs + // since they can't go through these phases at the same time. + this._waitingTimeout = setTimeout(function () { + // Ensure the SW is still waiting (it may now be redundant). + if (state === 'installed' && _this6._registration.waiting === sw) { + _this6.dispatchEvent(new WorkboxEvent(eventPrefix + 'waiting', eventProps)); + + { + if (isExternal) { + logger.warn('An external service worker has installed but is ' + 'waiting for this client to close before activating...'); + } else { + logger.warn('The service worker has installed but is waiting ' + 'for existing clients to close before activating...'); + } + } + } + }, WAITING_TIMEOUT_DURATION); + } else if (state === 'activating') { + clearTimeout(this._waitingTimeout); + + if (!isExternal) { + this._activeDeferred.resolve(sw); + } + } + + { + switch (state) { + case 'installed': + if (isExternal) { + logger.warn('An external service worker has installed. ' + 'You may want to suggest users reload this page.'); + } else { + logger.log('Registered service worker installed.'); + } + + break; + + case 'activated': + if (isExternal) { + logger.warn('An external service worker has activated.'); + } else { + logger.log('Registered service worker activated.'); + + if (sw !== navigator.serviceWorker.controller) { + logger.warn('The registered service worker is active but ' + 'not yet controlling the page. Reload or run ' + '`clients.claim()` in the service worker.'); + } + } + + break; + + case 'redundant': + if (sw === this._compatibleControllingSW) { + logger.log('Previously controlling service worker now redundant!'); + } else if (!isExternal) { + logger.log('Registered service worker now redundant!'); + } + + break; + } + } + }; + /** + * @private + * @param {Event} originalEvent + */ + + + _proto._onControllerChange = function _onControllerChange(originalEvent) { + var sw = this._sw; + + if (sw === navigator.serviceWorker.controller) { + this.dispatchEvent(new WorkboxEvent('controlling', { + sw: sw, + originalEvent: originalEvent + })); + + { + logger.log('Registered service worker now controlling this page.'); + } + + this._controllingDeferred.resolve(sw); + } + }; + /** + * @private + * @param {Event} originalEvent + */ + + + _proto._onMessage = function _onMessage(originalEvent) { + var data = originalEvent.data; + this.dispatchEvent(new WorkboxEvent('message', { + data: data, + originalEvent: originalEvent + })); + }; + + _createClass(Workbox, [{ + key: "active", + get: function get() { + return this._activeDeferred.promise; + } + /** + * Resolves to the service worker registered by this instance as soon as it + * is controlling the page. If a service worker was already controlling at + * registration time then it will resolve to that if the script URLs (and + * optionally script versions) match, otherwise it will wait until an update + * is found and starts controlling the page. + * Note: the first time a service worker is installed it will active but + * not start controlling the page unless `clients.claim()` is called in the + * service worker. + * + * @return {Promise} + */ + + }, { + key: "controlling", + get: function get() { + return this._controllingDeferred.promise; + } + }]); + + return Workbox; +}(EventTargetShim); // The jsdoc comments below outline the events this instance may dispatch: + +/* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. +*/ + +export { Workbox, messageSW }; +//# sourceMappingURL=workbox-window.dev.es5.mjs.map diff --git a/workbox-v4.3.1/workbox-window.dev.es5.mjs.map b/workbox-v4.3.1/workbox-window.dev.es5.mjs.map new file mode 100644 index 00000000..f8eeed61 --- /dev/null +++ b/workbox-v4.3.1/workbox-window.dev.es5.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-window.dev.es5.mjs","sources":["../_version.mjs","../messageSW.mjs","../../workbox-core/_version.mjs","../../workbox-core/_private/Deferred.mjs","../../workbox-core/_private/logger.mjs","../utils/EventTargetShim.mjs","../utils/urlsMatch.mjs","../utils/WorkboxEvent.mjs","../Workbox.mjs","../index.mjs"],"sourcesContent":["try{self['workbox:window:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport './_version.mjs';\n\n\n/**\n * Sends a data object to a service worker via `postMessage` and resolves with\n * a response (if any).\n *\n * A response can be set in a message handler in the service worker by\n * calling `event.ports[0].postMessage(...)`, which will resolve the promise\n * returned by `messageSW()`. If no response is set, the promise will not\n * resolve.\n *\n * @param {ServiceWorker} sw The service worker to send the message to.\n * @param {Object} data An object to send to the service worker.\n * @return {Promise}\n *\n * @memberof module:workbox-window\n */\nconst messageSW = (sw, data) => {\n return new Promise((resolve) => {\n let messageChannel = new MessageChannel();\n messageChannel.port1.onmessage = (evt) => resolve(evt.data);\n sw.postMessage(data, [messageChannel.port2]);\n });\n};\n\nexport {messageSW};\n","try{self['workbox:core:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n/**\n * The Deferred class composes Promises in a way that allows for them to be\n * resolved or rejected from outside the constructor. In most cases promises\n * should be used directly, but Deferreds can be necessary when the logic to\n * resolve a promise must be separate.\n *\n * @private\n */\nexport class Deferred {\n /**\n * Creates a promise and exposes its resolve and reject functions as methods.\n */\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n}\n","/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\nconst logger = process.env.NODE_ENV === 'production' ? null : (() => {\n let inGroup = false;\n\n const methodToColorMap = {\n debug: `#7f8c8d`, // Gray\n log: `#2ecc71`, // Green\n warn: `#f39c12`, // Yellow\n error: `#c0392b`, // Red\n groupCollapsed: `#3498db`, // Blue\n groupEnd: null, // No colored prefix on groupEnd\n };\n\n const print = function(method, args) {\n if (method === 'groupCollapsed') {\n // Safari doesn't print all console.groupCollapsed() arguments:\n // https://bugs.webkit.org/show_bug.cgi?id=182754\n if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n console[method](...args);\n return;\n }\n }\n\n const styles = [\n `background: ${methodToColorMap[method]}`,\n `border-radius: 0.5em`,\n `color: white`,\n `font-weight: bold`,\n `padding: 2px 0.5em`,\n ];\n\n // When in a group, the workbox prefix is not displayed.\n const logPrefix = inGroup ? [] : ['%cworkbox', styles.join(';')];\n\n console[method](...logPrefix, ...args);\n\n if (method === 'groupCollapsed') {\n inGroup = true;\n }\n if (method === 'groupEnd') {\n inGroup = false;\n }\n };\n\n const api = {};\n for (const method of Object.keys(methodToColorMap)) {\n api[method] = (...args) => {\n print(method, args);\n };\n }\n\n return api;\n})();\n\nexport {logger};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n/**\n * A minimal `EventTarget` shim.\n * This is necessary because not all browsers support constructable\n * `EventTarget`, so using a real `EventTarget` will error.\n * @private\n */\nclass EventTargetShim {\n /**\n * Creates an event listener registry\n *\n * @private\n */\n constructor() {\n // A registry of event types to listeners.\n this._eventListenerRegistry = {};\n }\n /**\n * @param {string} type\n * @param {Function} listener\n * @private\n */\n addEventListener(type, listener) {\n this._getEventListenersByType(type).add(listener);\n }\n\n /**\n * @param {string} type\n * @param {Function} listener\n * @private\n */\n removeEventListener(type, listener) {\n this._getEventListenersByType(type).delete(listener);\n }\n\n /**\n * @param {Event} event\n * @private\n */\n dispatchEvent(event) {\n event.target = this;\n this._getEventListenersByType(event.type).forEach(\n (listener) => listener(event));\n }\n\n /**\n * Returns a Set of listeners associated with the passed event type.\n * If no handlers have been registered, an empty Set is returned.\n *\n * @param {string} type The event type.\n * @return {Set} An array of handler functions.\n * @private\n */\n _getEventListenersByType(type) {\n return this._eventListenerRegistry[type] =\n (this._eventListenerRegistry[type] || new Set());\n }\n}\n\nexport {EventTargetShim};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n/**\n * Returns true if two URLs have the same `.href` property. The URLS can be\n * relative, and if they are the current location href is used to resolve URLs.\n *\n * @private\n * @param {string} url1\n * @param {string} url2\n * @return {boolean}\n */\nconst urlsMatch = (url1, url2) => {\n return new URL(url1, location).href === new URL(url2, location).href;\n};\n\nexport {urlsMatch};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n/**\n * A minimal `Event` subclass shim.\n * This doesn't *actually* subclass `Event` because not all browsers support\n * constructable `EventTarget`, and using a real `Event` will error.\n * @private\n */\nclass WorkboxEvent {\n /**\n * @param {string} type\n * @param {Object} props\n */\n constructor(type, props) {\n Object.assign(this, props, {type});\n }\n}\n\nexport {WorkboxEvent};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {Deferred} from 'workbox-core/_private/Deferred.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {messageSW} from './messageSW.mjs';\nimport {EventTargetShim} from './utils/EventTargetShim.mjs';\nimport {urlsMatch} from './utils/urlsMatch.mjs';\nimport {WorkboxEvent} from './utils/WorkboxEvent.mjs';\nimport './_version.mjs';\n\n\n// The time a SW must be in the waiting phase before we can conclude\n// `skipWaiting()` wasn't called. This 200 amount wasn't scientifically\n// chosen, but it seems to avoid false positives in my testing.\nconst WAITING_TIMEOUT_DURATION = 200;\n\n// The amount of time after a registration that we can reasonably conclude\n// that the registration didn't trigger an update.\nconst REGISTRATION_TIMEOUT_DURATION = 60000;\n\n/**\n * A class to aid in handling service worker registration, updates, and\n * reacting to service worker lifecycle events.\n *\n * @fires [message]{@link module:workbox-window.Workbox#message}\n * @fires [installed]{@link module:workbox-window.Workbox#installed}\n * @fires [waiting]{@link module:workbox-window.Workbox#waiting}\n * @fires [controlling]{@link module:workbox-window.Workbox#controlling}\n * @fires [activated]{@link module:workbox-window.Workbox#activated}\n * @fires [redundant]{@link module:workbox-window.Workbox#redundant}\n * @fires [externalinstalled]{@link module:workbox-window.Workbox#externalinstalled}\n * @fires [externalwaiting]{@link module:workbox-window.Workbox#externalwaiting}\n * @fires [externalactivated]{@link module:workbox-window.Workbox#externalactivated}\n *\n * @memberof module:workbox-window\n */\nclass Workbox extends EventTargetShim {\n /**\n * Creates a new Workbox instance with a script URL and service worker\n * options. The script URL and options are the same as those used when\n * calling `navigator.serviceWorker.register(scriptURL, options)`. See:\n * https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/register\n *\n * @param {string} scriptURL The service worker script associated with this\n * instance.\n * @param {Object} [registerOptions] The service worker options associated\n * with this instance.\n */\n constructor(scriptURL, registerOptions = {}) {\n super();\n\n this._scriptURL = scriptURL;\n this._registerOptions = registerOptions;\n this._updateFoundCount = 0;\n\n // Deferreds we can resolve later.\n this._swDeferred = new Deferred();\n this._activeDeferred = new Deferred();\n this._controllingDeferred = new Deferred();\n\n // Bind event handler callbacks.\n this._onMessage = this._onMessage.bind(this);\n this._onStateChange = this._onStateChange.bind(this);\n this._onUpdateFound = this._onUpdateFound.bind(this);\n this._onControllerChange = this._onControllerChange.bind(this);\n }\n\n /**\n * Registers a service worker for this instances script URL and service\n * worker options. By default this method delays registration until after\n * the window has loaded.\n *\n * @param {Object} [options]\n * @param {Function} [options.immediate=false] Setting this to true will\n * register the service worker immediately, even if the window has\n * not loaded (not recommended).\n */\n async register({immediate = false} = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (this._registrationTime) {\n logger.error('Cannot re-register a Workbox instance after it has ' +\n 'been registered. Create a new instance instead.');\n return;\n }\n }\n\n if (!immediate && document.readyState !== 'complete') {\n await new Promise((res) => addEventListener('load', res));\n }\n\n // Set this flag to true if any service worker was controlling the page\n // at registration time.\n this._isUpdate = Boolean(navigator.serviceWorker.controller);\n\n // Before registering, attempt to determine if a SW is already controlling\n // the page, and if that SW script (and version, if specified) matches this\n // instance's script.\n this._compatibleControllingSW = this._getControllingSWIfCompatible();\n\n this._registration = await this._registerScript();\n\n // If we have a compatible controller, store the controller as the \"own\"\n // SW, resolve active/controlling deferreds and add necessary listeners.\n if (this._compatibleControllingSW) {\n this._sw = this._compatibleControllingSW;\n this._activeDeferred.resolve(this._compatibleControllingSW);\n this._controllingDeferred.resolve(this._compatibleControllingSW);\n\n this._reportWindowReady(this._compatibleControllingSW);\n this._compatibleControllingSW.addEventListener(\n 'statechange', this._onStateChange, {once: true});\n }\n\n // If there's a waiting service worker with a matching URL before the\n // `updatefound` event fires, it likely means that this site is open\n // in another tab, or the user refreshed the page (and thus the prevoius\n // page wasn't fully unloaded before this page started loading).\n // https://developers.google.com/web/fundamentals/primers/service-workers/lifecycle#waiting\n const waitingSW = this._registration.waiting;\n if (waitingSW && urlsMatch(waitingSW.scriptURL, this._scriptURL)) {\n // Store the waiting SW as the \"own\" Sw, even if it means overwriting\n // a compatible controller.\n this._sw = waitingSW;\n\n // Run this in the next microtask, so any code that adds an event\n // listener after awaiting `register()` will get this event.\n Promise.resolve().then(() => {\n this.dispatchEvent(new WorkboxEvent('waiting', {\n sw: waitingSW,\n wasWaitingBeforeRegister: true,\n }));\n if (process.env.NODE_ENV !== 'production') {\n logger.warn('A service worker was already waiting to activate ' +\n 'before this script was registered...');\n }\n });\n }\n\n // If an \"own\" SW is already set, resolve the deferred.\n if (this._sw) {\n this._swDeferred.resolve(this._sw);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Successfully registered service worker.', this._scriptURL);\n\n if (navigator.serviceWorker.controller) {\n if (this._compatibleControllingSW) {\n logger.debug('A service worker with the same script URL ' +\n 'is already controlling this page.');\n } else {\n logger.debug('A service worker with a different script URL is ' +\n 'currently controlling the page. The browser is now fetching ' +\n 'the new script now...');\n }\n }\n\n const currentPageIsOutOfScope = () => {\n const scopeURL = new URL(\n this._registerOptions.scope || this._scriptURL, document.baseURI);\n const scopeURLBasePath = new URL('./', scopeURL.href).pathname;\n return !location.pathname.startsWith(scopeURLBasePath);\n };\n if (currentPageIsOutOfScope()) {\n logger.warn('The current page is not in scope for the registered ' +\n 'service worker. Was this a mistake?');\n }\n }\n\n this._registration.addEventListener('updatefound', this._onUpdateFound);\n navigator.serviceWorker.addEventListener(\n 'controllerchange', this._onControllerChange, {once: true});\n\n // Add message listeners.\n if ('BroadcastChannel' in self) {\n this._broadcastChannel = new BroadcastChannel('workbox');\n this._broadcastChannel.addEventListener('message', this._onMessage);\n }\n navigator.serviceWorker.addEventListener('message', this._onMessage);\n\n return this._registration;\n }\n\n /**\n * Resolves to the service worker registered by this instance as soon as it\n * is active. If a service worker was already controlling at registration\n * time then it will resolve to that if the script URLs (and optionally\n * script versions) match, otherwise it will wait until an update is found\n * and activates.\n *\n * @return {Promise}\n */\n get active() {\n return this._activeDeferred.promise;\n }\n\n /**\n * Resolves to the service worker registered by this instance as soon as it\n * is controlling the page. If a service worker was already controlling at\n * registration time then it will resolve to that if the script URLs (and\n * optionally script versions) match, otherwise it will wait until an update\n * is found and starts controlling the page.\n * Note: the first time a service worker is installed it will active but\n * not start controlling the page unless `clients.claim()` is called in the\n * service worker.\n *\n * @return {Promise}\n */\n get controlling() {\n return this._controllingDeferred.promise;\n }\n\n /**\n * Resolves with a reference to a service worker that matches the script URL\n * of this instance, as soon as it's available.\n *\n * If, at registration time, there's already an active or waiting service\n * worker with a matching script URL, it will be used (with the waiting\n * service worker taking precedence over the active service worker if both\n * match, since the waiting service worker would have been registered more\n * recently).\n * If there's no matching active or waiting service worker at registration\n * time then the promise will not resolve until an update is found and starts\n * installing, at which point the installing service worker is used.\n *\n * @return {Promise}\n */\n async getSW() {\n // If `this._sw` is set, resolve with that as we want `getSW()` to\n // return the correct (new) service worker if an update is found.\n return this._sw || this._swDeferred.promise;\n }\n\n /**\n * Sends the passed data object to the service worker registered by this\n * instance (via [`getSW()`]{@link module:workbox-window.Workbox#getSW}) and resolves\n * with a response (if any).\n *\n * A response can be set in a message handler in the service worker by\n * calling `event.ports[0].postMessage(...)`, which will resolve the promise\n * returned by `messageSW()`. If no response is set, the promise will never\n * resolve.\n *\n * @param {Object} data An object to send to the service worker\n * @return {Promise}\n */\n async messageSW(data) {\n const sw = await this.getSW();\n return messageSW(sw, data);\n }\n\n /**\n * Checks for a service worker already controlling the page and returns\n * it if its script URL matchs.\n *\n * @private\n * @return {ServiceWorker|undefined}\n */\n _getControllingSWIfCompatible() {\n const controller = navigator.serviceWorker.controller;\n if (controller && urlsMatch(controller.scriptURL, this._scriptURL)) {\n return controller;\n }\n }\n\n /**\n * Registers a service worker for this instances script URL and register\n * options and tracks the time registration was complete.\n *\n * @private\n */\n async _registerScript() {\n try {\n const reg = await navigator.serviceWorker.register(\n this._scriptURL, this._registerOptions);\n\n // Keep track of when registration happened, so it can be used in the\n // `this._onUpdateFound` heuristic. Also use the presence of this\n // property as a way to see if `.register()` has been called.\n this._registrationTime = performance.now();\n\n return reg;\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.error(error);\n }\n // Re-throw the error.\n throw error;\n }\n }\n\n\n /**\n * Sends a message to the passed service worker that the window is ready.\n *\n * @param {ServiceWorker} sw\n * @private\n */\n _reportWindowReady(sw) {\n messageSW(sw, {\n type: 'WINDOW_READY',\n meta: 'workbox-window',\n });\n }\n\n /**\n * @private\n */\n _onUpdateFound() {\n const installingSW = this._registration.installing;\n\n // If the script URL passed to `navigator.serviceWorker.register()` is\n // different from the current controlling SW's script URL, we know any\n // successful registration calls will trigger an `updatefound` event.\n // But if the registered script URL is the same as the current controlling\n // SW's script URL, we'll only get an `updatefound` event if the file\n // changed since it was last registered. This can be a problem if the user\n // opens up the same page in a different tab, and that page registers\n // a SW that triggers an update. It's a problem because this page has no\n // good way of knowing whether the `updatefound` event came from the SW\n // script it registered or from a registration attempt made by a newer\n // version of the page running in another tab.\n // To minimize the possibility of a false positive, we use the logic here:\n let updateLikelyTriggeredExternally =\n // Since we enforce only calling `register()` once, and since we don't\n // add the `updatefound` event listener until the `register()` call, if\n // `_updateFoundCount` is > 0 then it means this method has already\n // been called, thus this SW must be external\n this._updateFoundCount > 0 ||\n // If the script URL of the installing SW is different from this\n // instance's script URL, we know it's definitely not from our\n // registration.\n !urlsMatch(installingSW.scriptURL, this._scriptURL) ||\n // If all of the above are false, then we use a time-based heuristic:\n // Any `updatefound` event that occurs long after our registration is\n // assumed to be external.\n (performance.now() >\n this._registrationTime + REGISTRATION_TIMEOUT_DURATION) ?\n // If any of the above are not true, we assume the update was\n // triggered by this instance.\n true : false;\n\n if (updateLikelyTriggeredExternally) {\n this._externalSW = installingSW;\n this._registration.removeEventListener(\n 'updatefound', this._onUpdateFound);\n } else {\n // If the update was not triggered externally we know the installing\n // SW is the one we registered, so we set it.\n this._sw = installingSW;\n this._swDeferred.resolve(installingSW);\n\n // The `installing` state isn't something we have a dedicated\n // callback for, but we do log messages for it in development.\n if (process.env.NODE_ENV !== 'production') {\n if (navigator.serviceWorker.controller) {\n logger.log('Updated service worker found. Installing now...');\n } else {\n logger.log('Service worker is installing...');\n }\n }\n }\n\n // Increment the `updatefound` count, so future invocations of this\n // method can be sure they were triggered externally.\n ++this._updateFoundCount;\n\n // Add a `statechange` listener regardless of whether this update was\n // triggered externally, since we have callbacks for both.\n installingSW.addEventListener('statechange', this._onStateChange);\n }\n\n /**\n * @private\n * @param {Event} originalEvent\n */\n _onStateChange(originalEvent) {\n const sw = originalEvent.target;\n const {state} = sw;\n const isExternal = sw === this._externalSW;\n const eventPrefix = isExternal ? 'external' : '';\n\n const eventProps = {sw, originalEvent};\n if (!isExternal && this._isUpdate) {\n eventProps.isUpdate = true;\n }\n\n this.dispatchEvent(new WorkboxEvent(\n eventPrefix + state, eventProps));\n\n if (state === 'installed') {\n // This timeout is used to ignore cases where the service worker calls\n // `skipWaiting()` in the install event, thus moving it directly in the\n // activating state. (Since all service workers *must* go through the\n // waiting phase, the only way to detect `skipWaiting()` called in the\n // install event is to observe that the time spent in the waiting phase\n // is very short.)\n // NOTE: we don't need separate timeouts for the own and external SWs\n // since they can't go through these phases at the same time.\n this._waitingTimeout = setTimeout(() => {\n // Ensure the SW is still waiting (it may now be redundant).\n if (state === 'installed' && this._registration.waiting === sw) {\n this.dispatchEvent(new WorkboxEvent(\n eventPrefix + 'waiting', eventProps));\n\n if (process.env.NODE_ENV !== 'production') {\n if (isExternal) {\n logger.warn('An external service worker has installed but is ' +\n 'waiting for this client to close before activating...');\n } else {\n logger.warn('The service worker has installed but is waiting ' +\n 'for existing clients to close before activating...');\n }\n }\n }\n }, WAITING_TIMEOUT_DURATION);\n } else if (state === 'activating') {\n clearTimeout(this._waitingTimeout);\n if (!isExternal) {\n this._activeDeferred.resolve(sw);\n }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n switch (state) {\n case 'installed':\n if (isExternal) {\n logger.warn('An external service worker has installed. ' +\n 'You may want to suggest users reload this page.');\n } else {\n logger.log('Registered service worker installed.');\n }\n break;\n case 'activated':\n if (isExternal) {\n logger.warn('An external service worker has activated.');\n } else {\n logger.log('Registered service worker activated.');\n if (sw !== navigator.serviceWorker.controller) {\n logger.warn('The registered service worker is active but ' +\n 'not yet controlling the page. Reload or run ' +\n '`clients.claim()` in the service worker.');\n }\n }\n break;\n case 'redundant':\n if (sw === this._compatibleControllingSW) {\n logger.log('Previously controlling service worker now redundant!');\n } else if (!isExternal) {\n logger.log('Registered service worker now redundant!');\n }\n break;\n }\n }\n }\n\n /**\n * @private\n * @param {Event} originalEvent\n */\n _onControllerChange(originalEvent) {\n const sw = this._sw;\n if (sw === navigator.serviceWorker.controller) {\n this.dispatchEvent(new WorkboxEvent('controlling', {sw, originalEvent}));\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Registered service worker now controlling this page.');\n }\n this._controllingDeferred.resolve(sw);\n }\n }\n\n /**\n * @private\n * @param {Event} originalEvent\n */\n _onMessage(originalEvent) {\n const {data} = originalEvent;\n this.dispatchEvent(new WorkboxEvent('message', {data, originalEvent}));\n }\n}\n\n// The jsdoc comments below outline the events this instance may dispatch:\n// -----------------------------------------------------------------------\n\n/**\n * The `message` event is dispatched any time a `postMessage` (or a\n * `BroadcastChannel` message with the `workbox` channel name) is received.\n *\n * @event module:workbox-window.Workbox#message\n * @type {WorkboxEvent}\n * @property {*} data The `data` property from the original `message` event.\n * @property {Event} originalEvent The original [`message`]{@link https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent}\n * event.\n * @property {string} type `message`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `installed` event is dispatched if the state of a\n * [`Workbox`]{@link module:workbox-window.Workbox} instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}\n * changes to `installed`.\n *\n * Then can happen either the very first time a service worker is installed,\n * or after an update to the current service worker is found. In the case\n * of an update being found, the event's `isUpdate` property will be `true`.\n *\n * @event module:workbox-window.Workbox#installed\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this `Workbox` instance called `register()`.\n * @property {string} type `installed`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `waiting` event is dispatched if the state of a\n * [`Workbox`]{@link module:workbox-window.Workbox} instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}\n * changes to `installed` and then doesn't immediately change to `activating`.\n * It may also be dispatched if a service worker with the same\n * [`scriptURL`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/scriptURL}\n * was already waiting when the [`register()`]{@link module:workbox-window.Workbox#register}\n * method was called.\n *\n * @event module:workbox-window.Workbox#waiting\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The native `controllerchange` event\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this `Workbox` instance called `register()`.\n * @property {boolean|undefined} wasWaitingBeforeRegister True if a service worker with\n * a matching `scriptURL` was already waiting when this `Workbox`\n * instance called `register()`.\n * @property {string} type `waiting`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `controlling` event is dispatched if a\n * [`controllerchange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/oncontrollerchange}\n * fires on the service worker [container]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer}\n * and the [`scriptURL`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/scriptURL}\n * of the new [controller]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/controller}\n * matches the `scriptURL` of the `Workbox` instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}.\n *\n * @event module:workbox-window.Workbox#controlling\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`controllerchange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/oncontrollerchange}\n * event.\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this service worker was registered.\n * @property {string} type `controlling`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `activated` event is dispatched if the state of a\n * [`Workbox`]{@link module:workbox-window.Workbox} instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}\n * changes to `activated`.\n *\n * @event module:workbox-window.Workbox#activated\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this `Workbox` instance called `register()`.\n * @property {string} type `activated`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `redundant` event is dispatched if the state of a\n * [`Workbox`]{@link module:workbox-window.Workbox} instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}\n * changes to `redundant`.\n *\n * @event module:workbox-window.Workbox#redundant\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this `Workbox` instance called `register()`.\n * @property {string} type `redundant`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `externalinstalled` event is dispatched if the state of an\n * [external service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-external-sw}\n * changes to `installed`.\n *\n * @event module:workbox-window.Workbox#externalinstalled\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {string} type `externalinstalled`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `externalwaiting` event is dispatched if the state of an\n * [external service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-external-sw}\n * changes to `waiting`.\n *\n * @event module:workbox-window.Workbox#externalwaiting\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event|undefined} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {string} type `externalwaiting`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `externalactivated` event is dispatched if the state of an\n * [external service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-external-sw}\n * changes to `activated`.\n *\n * @event module:workbox-window.Workbox#externalactivated\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {string} type `externalactivated`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\nexport {Workbox};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {messageSW} from './messageSW.mjs';\nimport {Workbox} from './Workbox.mjs';\nimport './_version.mjs';\n\n\n/**\n * @module workbox-window\n */\nexport {\n Workbox,\n messageSW,\n};\n"],"names":["self","_","e","messageSW","sw","data","Promise","resolve","messageChannel","MessageChannel","port1","onmessage","evt","postMessage","port2","Deferred","promise","reject","logger","process","inGroup","methodToColorMap","debug","log","warn","error","groupCollapsed","groupEnd","print","method","args","test","navigator","userAgent","console","styles","logPrefix","join","api","Object","keys","EventTargetShim","_eventListenerRegistry","addEventListener","type","listener","_getEventListenersByType","add","removeEventListener","delete","dispatchEvent","event","target","forEach","Set","urlsMatch","url1","url2","URL","location","href","WorkboxEvent","props","assign","body","recover","result","then","f","i","arguments","length","apply","value","direct","WAITING_TIMEOUT_DURATION","REGISTRATION_TIMEOUT_DURATION","Workbox","scriptURL","registerOptions","_scriptURL","_registerOptions","_updateFoundCount","_swDeferred","_activeDeferred","_controllingDeferred","_onMessage","bind","_onStateChange","_onUpdateFound","_onControllerChange","register","immediate","_registrationTime","document","readyState","res","_isUpdate","Boolean","serviceWorker","controller","_compatibleControllingSW","_getControllingSWIfCompatible","_registerScript","_registration","_sw","_reportWindowReady","once","waitingSW","waiting","wasWaitingBeforeRegister","currentPageIsOutOfScope","scopeURL","scope","baseURI","scopeURLBasePath","pathname","startsWith","_broadcastChannel","BroadcastChannel","getSW","reg","performance","now","meta","installingSW","installing","updateLikelyTriggeredExternally","_externalSW","originalEvent","state","isExternal","eventPrefix","eventProps","isUpdate","_waitingTimeout","setTimeout","clearTimeout"],"mappings":"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"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-window.dev.mjs b/workbox-v4.3.1/workbox-window.dev.mjs new file mode 100644 index 00000000..bc6380b1 --- /dev/null +++ b/workbox-v4.3.1/workbox-window.dev.mjs @@ -0,0 +1,751 @@ +try { + self['workbox:window:4.3.1'] && _(); +} catch (e) {} // eslint-disable-line + +/* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. +*/ +/** + * Sends a data object to a service worker via `postMessage` and resolves with + * a response (if any). + * + * A response can be set in a message handler in the service worker by + * calling `event.ports[0].postMessage(...)`, which will resolve the promise + * returned by `messageSW()`. If no response is set, the promise will not + * resolve. + * + * @param {ServiceWorker} sw The service worker to send the message to. + * @param {Object} data An object to send to the service worker. + * @return {Promise} + * + * @memberof module:workbox-window + */ + +const messageSW = (sw, data) => { + return new Promise(resolve => { + let messageChannel = new MessageChannel(); + + messageChannel.port1.onmessage = evt => resolve(evt.data); + + sw.postMessage(data, [messageChannel.port2]); + }); +}; + +try { + self['workbox:core:4.3.1'] && _(); +} catch (e) {} // eslint-disable-line + +/* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. +*/ +/** + * The Deferred class composes Promises in a way that allows for them to be + * resolved or rejected from outside the constructor. In most cases promises + * should be used directly, but Deferreds can be necessary when the logic to + * resolve a promise must be separate. + * + * @private + */ + +class Deferred { + /** + * Creates a promise and exposes its resolve and reject functions as methods. + */ + constructor() { + this.promise = new Promise((resolve, reject) => { + this.resolve = resolve; + this.reject = reject; + }); + } + +} + +/* + Copyright 2019 Google LLC + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. +*/ +const logger = (() => { + let inGroup = false; + const methodToColorMap = { + debug: `#7f8c8d`, + // Gray + log: `#2ecc71`, + // Green + warn: `#f39c12`, + // Yellow + error: `#c0392b`, + // Red + groupCollapsed: `#3498db`, + // Blue + groupEnd: null // No colored prefix on groupEnd + + }; + + const print = function (method, args) { + if (method === 'groupCollapsed') { + // Safari doesn't print all console.groupCollapsed() arguments: + // https://bugs.webkit.org/show_bug.cgi?id=182754 + if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { + console[method](...args); + return; + } + } + + const styles = [`background: ${methodToColorMap[method]}`, `border-radius: 0.5em`, `color: white`, `font-weight: bold`, `padding: 2px 0.5em`]; // When in a group, the workbox prefix is not displayed. + + const logPrefix = inGroup ? [] : ['%cworkbox', styles.join(';')]; + console[method](...logPrefix, ...args); + + if (method === 'groupCollapsed') { + inGroup = true; + } + + if (method === 'groupEnd') { + inGroup = false; + } + }; + + const api = {}; + + for (const method of Object.keys(methodToColorMap)) { + api[method] = (...args) => { + print(method, args); + }; + } + + return api; +})(); + +/* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. +*/ +/** + * A minimal `EventTarget` shim. + * This is necessary because not all browsers support constructable + * `EventTarget`, so using a real `EventTarget` will error. + * @private + */ + +class EventTargetShim { + /** + * Creates an event listener registry + * + * @private + */ + constructor() { + // A registry of event types to listeners. + this._eventListenerRegistry = {}; + } + /** + * @param {string} type + * @param {Function} listener + * @private + */ + + + addEventListener(type, listener) { + this._getEventListenersByType(type).add(listener); + } + /** + * @param {string} type + * @param {Function} listener + * @private + */ + + + removeEventListener(type, listener) { + this._getEventListenersByType(type).delete(listener); + } + /** + * @param {Event} event + * @private + */ + + + dispatchEvent(event) { + event.target = this; + + this._getEventListenersByType(event.type).forEach(listener => listener(event)); + } + /** + * Returns a Set of listeners associated with the passed event type. + * If no handlers have been registered, an empty Set is returned. + * + * @param {string} type The event type. + * @return {Set} An array of handler functions. + * @private + */ + + + _getEventListenersByType(type) { + return this._eventListenerRegistry[type] = this._eventListenerRegistry[type] || new Set(); + } + +} + +/* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. +*/ +/** + * Returns true if two URLs have the same `.href` property. The URLS can be + * relative, and if they are the current location href is used to resolve URLs. + * + * @private + * @param {string} url1 + * @param {string} url2 + * @return {boolean} + */ + +const urlsMatch = (url1, url2) => { + return new URL(url1, location).href === new URL(url2, location).href; +}; + +/* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. +*/ +/** + * A minimal `Event` subclass shim. + * This doesn't *actually* subclass `Event` because not all browsers support + * constructable `EventTarget`, and using a real `Event` will error. + * @private + */ + +class WorkboxEvent { + /** + * @param {string} type + * @param {Object} props + */ + constructor(type, props) { + Object.assign(this, props, { + type + }); + } + +} + +/* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. +*/ +// `skipWaiting()` wasn't called. This 200 amount wasn't scientifically +// chosen, but it seems to avoid false positives in my testing. + +const WAITING_TIMEOUT_DURATION = 200; // The amount of time after a registration that we can reasonably conclude +// that the registration didn't trigger an update. + +const REGISTRATION_TIMEOUT_DURATION = 60000; +/** + * A class to aid in handling service worker registration, updates, and + * reacting to service worker lifecycle events. + * + * @fires [message]{@link module:workbox-window.Workbox#message} + * @fires [installed]{@link module:workbox-window.Workbox#installed} + * @fires [waiting]{@link module:workbox-window.Workbox#waiting} + * @fires [controlling]{@link module:workbox-window.Workbox#controlling} + * @fires [activated]{@link module:workbox-window.Workbox#activated} + * @fires [redundant]{@link module:workbox-window.Workbox#redundant} + * @fires [externalinstalled]{@link module:workbox-window.Workbox#externalinstalled} + * @fires [externalwaiting]{@link module:workbox-window.Workbox#externalwaiting} + * @fires [externalactivated]{@link module:workbox-window.Workbox#externalactivated} + * + * @memberof module:workbox-window + */ + +class Workbox extends EventTargetShim { + /** + * Creates a new Workbox instance with a script URL and service worker + * options. The script URL and options are the same as those used when + * calling `navigator.serviceWorker.register(scriptURL, options)`. See: + * https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/register + * + * @param {string} scriptURL The service worker script associated with this + * instance. + * @param {Object} [registerOptions] The service worker options associated + * with this instance. + */ + constructor(scriptURL, registerOptions = {}) { + super(); + this._scriptURL = scriptURL; + this._registerOptions = registerOptions; + this._updateFoundCount = 0; // Deferreds we can resolve later. + + this._swDeferred = new Deferred(); + this._activeDeferred = new Deferred(); + this._controllingDeferred = new Deferred(); // Bind event handler callbacks. + + this._onMessage = this._onMessage.bind(this); + this._onStateChange = this._onStateChange.bind(this); + this._onUpdateFound = this._onUpdateFound.bind(this); + this._onControllerChange = this._onControllerChange.bind(this); + } + /** + * Registers a service worker for this instances script URL and service + * worker options. By default this method delays registration until after + * the window has loaded. + * + * @param {Object} [options] + * @param {Function} [options.immediate=false] Setting this to true will + * register the service worker immediately, even if the window has + * not loaded (not recommended). + */ + + + async register({ + immediate = false + } = {}) { + { + if (this._registrationTime) { + logger.error('Cannot re-register a Workbox instance after it has ' + 'been registered. Create a new instance instead.'); + return; + } + } + + if (!immediate && document.readyState !== 'complete') { + await new Promise(res => addEventListener('load', res)); + } // Set this flag to true if any service worker was controlling the page + // at registration time. + + + this._isUpdate = Boolean(navigator.serviceWorker.controller); // Before registering, attempt to determine if a SW is already controlling + // the page, and if that SW script (and version, if specified) matches this + // instance's script. + + this._compatibleControllingSW = this._getControllingSWIfCompatible(); + this._registration = await this._registerScript(); // If we have a compatible controller, store the controller as the "own" + // SW, resolve active/controlling deferreds and add necessary listeners. + + if (this._compatibleControllingSW) { + this._sw = this._compatibleControllingSW; + + this._activeDeferred.resolve(this._compatibleControllingSW); + + this._controllingDeferred.resolve(this._compatibleControllingSW); + + this._reportWindowReady(this._compatibleControllingSW); + + this._compatibleControllingSW.addEventListener('statechange', this._onStateChange, { + once: true + }); + } // If there's a waiting service worker with a matching URL before the + // `updatefound` event fires, it likely means that this site is open + // in another tab, or the user refreshed the page (and thus the prevoius + // page wasn't fully unloaded before this page started loading). + // https://developers.google.com/web/fundamentals/primers/service-workers/lifecycle#waiting + + + const waitingSW = this._registration.waiting; + + if (waitingSW && urlsMatch(waitingSW.scriptURL, this._scriptURL)) { + // Store the waiting SW as the "own" Sw, even if it means overwriting + // a compatible controller. + this._sw = waitingSW; // Run this in the next microtask, so any code that adds an event + // listener after awaiting `register()` will get this event. + + Promise.resolve().then(() => { + this.dispatchEvent(new WorkboxEvent('waiting', { + sw: waitingSW, + wasWaitingBeforeRegister: true + })); + + { + logger.warn('A service worker was already waiting to activate ' + 'before this script was registered...'); + } + }); + } // If an "own" SW is already set, resolve the deferred. + + + if (this._sw) { + this._swDeferred.resolve(this._sw); + } + + { + logger.log('Successfully registered service worker.', this._scriptURL); + + if (navigator.serviceWorker.controller) { + if (this._compatibleControllingSW) { + logger.debug('A service worker with the same script URL ' + 'is already controlling this page.'); + } else { + logger.debug('A service worker with a different script URL is ' + 'currently controlling the page. The browser is now fetching ' + 'the new script now...'); + } + } + + const currentPageIsOutOfScope = () => { + const scopeURL = new URL(this._registerOptions.scope || this._scriptURL, document.baseURI); + const scopeURLBasePath = new URL('./', scopeURL.href).pathname; + return !location.pathname.startsWith(scopeURLBasePath); + }; + + if (currentPageIsOutOfScope()) { + logger.warn('The current page is not in scope for the registered ' + 'service worker. Was this a mistake?'); + } + } + + this._registration.addEventListener('updatefound', this._onUpdateFound); + + navigator.serviceWorker.addEventListener('controllerchange', this._onControllerChange, { + once: true + }); // Add message listeners. + + if ('BroadcastChannel' in self) { + this._broadcastChannel = new BroadcastChannel('workbox'); + + this._broadcastChannel.addEventListener('message', this._onMessage); + } + + navigator.serviceWorker.addEventListener('message', this._onMessage); + return this._registration; + } + /** + * Resolves to the service worker registered by this instance as soon as it + * is active. If a service worker was already controlling at registration + * time then it will resolve to that if the script URLs (and optionally + * script versions) match, otherwise it will wait until an update is found + * and activates. + * + * @return {Promise} + */ + + + get active() { + return this._activeDeferred.promise; + } + /** + * Resolves to the service worker registered by this instance as soon as it + * is controlling the page. If a service worker was already controlling at + * registration time then it will resolve to that if the script URLs (and + * optionally script versions) match, otherwise it will wait until an update + * is found and starts controlling the page. + * Note: the first time a service worker is installed it will active but + * not start controlling the page unless `clients.claim()` is called in the + * service worker. + * + * @return {Promise} + */ + + + get controlling() { + return this._controllingDeferred.promise; + } + /** + * Resolves with a reference to a service worker that matches the script URL + * of this instance, as soon as it's available. + * + * If, at registration time, there's already an active or waiting service + * worker with a matching script URL, it will be used (with the waiting + * service worker taking precedence over the active service worker if both + * match, since the waiting service worker would have been registered more + * recently). + * If there's no matching active or waiting service worker at registration + * time then the promise will not resolve until an update is found and starts + * installing, at which point the installing service worker is used. + * + * @return {Promise} + */ + + + async getSW() { + // If `this._sw` is set, resolve with that as we want `getSW()` to + // return the correct (new) service worker if an update is found. + return this._sw || this._swDeferred.promise; + } + /** + * Sends the passed data object to the service worker registered by this + * instance (via [`getSW()`]{@link module:workbox-window.Workbox#getSW}) and resolves + * with a response (if any). + * + * A response can be set in a message handler in the service worker by + * calling `event.ports[0].postMessage(...)`, which will resolve the promise + * returned by `messageSW()`. If no response is set, the promise will never + * resolve. + * + * @param {Object} data An object to send to the service worker + * @return {Promise} + */ + + + async messageSW(data) { + const sw = await this.getSW(); + return messageSW(sw, data); + } + /** + * Checks for a service worker already controlling the page and returns + * it if its script URL matchs. + * + * @private + * @return {ServiceWorker|undefined} + */ + + + _getControllingSWIfCompatible() { + const controller = navigator.serviceWorker.controller; + + if (controller && urlsMatch(controller.scriptURL, this._scriptURL)) { + return controller; + } + } + /** + * Registers a service worker for this instances script URL and register + * options and tracks the time registration was complete. + * + * @private + */ + + + async _registerScript() { + try { + const reg = await navigator.serviceWorker.register(this._scriptURL, this._registerOptions); // Keep track of when registration happened, so it can be used in the + // `this._onUpdateFound` heuristic. Also use the presence of this + // property as a way to see if `.register()` has been called. + + this._registrationTime = performance.now(); + return reg; + } catch (error) { + { + logger.error(error); + } // Re-throw the error. + + + throw error; + } + } + /** + * Sends a message to the passed service worker that the window is ready. + * + * @param {ServiceWorker} sw + * @private + */ + + + _reportWindowReady(sw) { + messageSW(sw, { + type: 'WINDOW_READY', + meta: 'workbox-window' + }); + } + /** + * @private + */ + + + _onUpdateFound() { + const installingSW = this._registration.installing; // If the script URL passed to `navigator.serviceWorker.register()` is + // different from the current controlling SW's script URL, we know any + // successful registration calls will trigger an `updatefound` event. + // But if the registered script URL is the same as the current controlling + // SW's script URL, we'll only get an `updatefound` event if the file + // changed since it was last registered. This can be a problem if the user + // opens up the same page in a different tab, and that page registers + // a SW that triggers an update. It's a problem because this page has no + // good way of knowing whether the `updatefound` event came from the SW + // script it registered or from a registration attempt made by a newer + // version of the page running in another tab. + // To minimize the possibility of a false positive, we use the logic here: + + let updateLikelyTriggeredExternally = // Since we enforce only calling `register()` once, and since we don't + // add the `updatefound` event listener until the `register()` call, if + // `_updateFoundCount` is > 0 then it means this method has already + // been called, thus this SW must be external + this._updateFoundCount > 0 || // If the script URL of the installing SW is different from this + // instance's script URL, we know it's definitely not from our + // registration. + !urlsMatch(installingSW.scriptURL, this._scriptURL) || // If all of the above are false, then we use a time-based heuristic: + // Any `updatefound` event that occurs long after our registration is + // assumed to be external. + performance.now() > this._registrationTime + REGISTRATION_TIMEOUT_DURATION ? // If any of the above are not true, we assume the update was + // triggered by this instance. + true : false; + + if (updateLikelyTriggeredExternally) { + this._externalSW = installingSW; + + this._registration.removeEventListener('updatefound', this._onUpdateFound); + } else { + // If the update was not triggered externally we know the installing + // SW is the one we registered, so we set it. + this._sw = installingSW; + + this._swDeferred.resolve(installingSW); // The `installing` state isn't something we have a dedicated + // callback for, but we do log messages for it in development. + + + { + if (navigator.serviceWorker.controller) { + logger.log('Updated service worker found. Installing now...'); + } else { + logger.log('Service worker is installing...'); + } + } + } // Increment the `updatefound` count, so future invocations of this + // method can be sure they were triggered externally. + + + ++this._updateFoundCount; // Add a `statechange` listener regardless of whether this update was + // triggered externally, since we have callbacks for both. + + installingSW.addEventListener('statechange', this._onStateChange); + } + /** + * @private + * @param {Event} originalEvent + */ + + + _onStateChange(originalEvent) { + const sw = originalEvent.target; + const { + state + } = sw; + const isExternal = sw === this._externalSW; + const eventPrefix = isExternal ? 'external' : ''; + const eventProps = { + sw, + originalEvent + }; + + if (!isExternal && this._isUpdate) { + eventProps.isUpdate = true; + } + + this.dispatchEvent(new WorkboxEvent(eventPrefix + state, eventProps)); + + if (state === 'installed') { + // This timeout is used to ignore cases where the service worker calls + // `skipWaiting()` in the install event, thus moving it directly in the + // activating state. (Since all service workers *must* go through the + // waiting phase, the only way to detect `skipWaiting()` called in the + // install event is to observe that the time spent in the waiting phase + // is very short.) + // NOTE: we don't need separate timeouts for the own and external SWs + // since they can't go through these phases at the same time. + this._waitingTimeout = setTimeout(() => { + // Ensure the SW is still waiting (it may now be redundant). + if (state === 'installed' && this._registration.waiting === sw) { + this.dispatchEvent(new WorkboxEvent(eventPrefix + 'waiting', eventProps)); + + { + if (isExternal) { + logger.warn('An external service worker has installed but is ' + 'waiting for this client to close before activating...'); + } else { + logger.warn('The service worker has installed but is waiting ' + 'for existing clients to close before activating...'); + } + } + } + }, WAITING_TIMEOUT_DURATION); + } else if (state === 'activating') { + clearTimeout(this._waitingTimeout); + + if (!isExternal) { + this._activeDeferred.resolve(sw); + } + } + + { + switch (state) { + case 'installed': + if (isExternal) { + logger.warn('An external service worker has installed. ' + 'You may want to suggest users reload this page.'); + } else { + logger.log('Registered service worker installed.'); + } + + break; + + case 'activated': + if (isExternal) { + logger.warn('An external service worker has activated.'); + } else { + logger.log('Registered service worker activated.'); + + if (sw !== navigator.serviceWorker.controller) { + logger.warn('The registered service worker is active but ' + 'not yet controlling the page. Reload or run ' + '`clients.claim()` in the service worker.'); + } + } + + break; + + case 'redundant': + if (sw === this._compatibleControllingSW) { + logger.log('Previously controlling service worker now redundant!'); + } else if (!isExternal) { + logger.log('Registered service worker now redundant!'); + } + + break; + } + } + } + /** + * @private + * @param {Event} originalEvent + */ + + + _onControllerChange(originalEvent) { + const sw = this._sw; + + if (sw === navigator.serviceWorker.controller) { + this.dispatchEvent(new WorkboxEvent('controlling', { + sw, + originalEvent + })); + + { + logger.log('Registered service worker now controlling this page.'); + } + + this._controllingDeferred.resolve(sw); + } + } + /** + * @private + * @param {Event} originalEvent + */ + + + _onMessage(originalEvent) { + const { + data + } = originalEvent; + this.dispatchEvent(new WorkboxEvent('message', { + data, + originalEvent + })); + } + +} // The jsdoc comments below outline the events this instance may dispatch: + +/* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. +*/ + +export { Workbox, messageSW }; +//# sourceMappingURL=workbox-window.dev.mjs.map diff --git a/workbox-v4.3.1/workbox-window.dev.mjs.map b/workbox-v4.3.1/workbox-window.dev.mjs.map new file mode 100644 index 00000000..8abff037 --- /dev/null +++ b/workbox-v4.3.1/workbox-window.dev.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-window.dev.mjs","sources":["../_version.mjs","../messageSW.mjs","../../workbox-core/_version.mjs","../../workbox-core/_private/Deferred.mjs","../../workbox-core/_private/logger.mjs","../utils/EventTargetShim.mjs","../utils/urlsMatch.mjs","../utils/WorkboxEvent.mjs","../Workbox.mjs","../index.mjs"],"sourcesContent":["try{self['workbox:window:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport './_version.mjs';\n\n\n/**\n * Sends a data object to a service worker via `postMessage` and resolves with\n * a response (if any).\n *\n * A response can be set in a message handler in the service worker by\n * calling `event.ports[0].postMessage(...)`, which will resolve the promise\n * returned by `messageSW()`. If no response is set, the promise will not\n * resolve.\n *\n * @param {ServiceWorker} sw The service worker to send the message to.\n * @param {Object} data An object to send to the service worker.\n * @return {Promise}\n *\n * @memberof module:workbox-window\n */\nconst messageSW = (sw, data) => {\n return new Promise((resolve) => {\n let messageChannel = new MessageChannel();\n messageChannel.port1.onmessage = (evt) => resolve(evt.data);\n sw.postMessage(data, [messageChannel.port2]);\n });\n};\n\nexport {messageSW};\n","try{self['workbox:core:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n/**\n * The Deferred class composes Promises in a way that allows for them to be\n * resolved or rejected from outside the constructor. In most cases promises\n * should be used directly, but Deferreds can be necessary when the logic to\n * resolve a promise must be separate.\n *\n * @private\n */\nexport class Deferred {\n /**\n * Creates a promise and exposes its resolve and reject functions as methods.\n */\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n}\n","/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\nconst logger = process.env.NODE_ENV === 'production' ? null : (() => {\n let inGroup = false;\n\n const methodToColorMap = {\n debug: `#7f8c8d`, // Gray\n log: `#2ecc71`, // Green\n warn: `#f39c12`, // Yellow\n error: `#c0392b`, // Red\n groupCollapsed: `#3498db`, // Blue\n groupEnd: null, // No colored prefix on groupEnd\n };\n\n const print = function(method, args) {\n if (method === 'groupCollapsed') {\n // Safari doesn't print all console.groupCollapsed() arguments:\n // https://bugs.webkit.org/show_bug.cgi?id=182754\n if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n console[method](...args);\n return;\n }\n }\n\n const styles = [\n `background: ${methodToColorMap[method]}`,\n `border-radius: 0.5em`,\n `color: white`,\n `font-weight: bold`,\n `padding: 2px 0.5em`,\n ];\n\n // When in a group, the workbox prefix is not displayed.\n const logPrefix = inGroup ? [] : ['%cworkbox', styles.join(';')];\n\n console[method](...logPrefix, ...args);\n\n if (method === 'groupCollapsed') {\n inGroup = true;\n }\n if (method === 'groupEnd') {\n inGroup = false;\n }\n };\n\n const api = {};\n for (const method of Object.keys(methodToColorMap)) {\n api[method] = (...args) => {\n print(method, args);\n };\n }\n\n return api;\n})();\n\nexport {logger};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n/**\n * A minimal `EventTarget` shim.\n * This is necessary because not all browsers support constructable\n * `EventTarget`, so using a real `EventTarget` will error.\n * @private\n */\nclass EventTargetShim {\n /**\n * Creates an event listener registry\n *\n * @private\n */\n constructor() {\n // A registry of event types to listeners.\n this._eventListenerRegistry = {};\n }\n /**\n * @param {string} type\n * @param {Function} listener\n * @private\n */\n addEventListener(type, listener) {\n this._getEventListenersByType(type).add(listener);\n }\n\n /**\n * @param {string} type\n * @param {Function} listener\n * @private\n */\n removeEventListener(type, listener) {\n this._getEventListenersByType(type).delete(listener);\n }\n\n /**\n * @param {Event} event\n * @private\n */\n dispatchEvent(event) {\n event.target = this;\n this._getEventListenersByType(event.type).forEach(\n (listener) => listener(event));\n }\n\n /**\n * Returns a Set of listeners associated with the passed event type.\n * If no handlers have been registered, an empty Set is returned.\n *\n * @param {string} type The event type.\n * @return {Set} An array of handler functions.\n * @private\n */\n _getEventListenersByType(type) {\n return this._eventListenerRegistry[type] =\n (this._eventListenerRegistry[type] || new Set());\n }\n}\n\nexport {EventTargetShim};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n/**\n * Returns true if two URLs have the same `.href` property. The URLS can be\n * relative, and if they are the current location href is used to resolve URLs.\n *\n * @private\n * @param {string} url1\n * @param {string} url2\n * @return {boolean}\n */\nconst urlsMatch = (url1, url2) => {\n return new URL(url1, location).href === new URL(url2, location).href;\n};\n\nexport {urlsMatch};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n/**\n * A minimal `Event` subclass shim.\n * This doesn't *actually* subclass `Event` because not all browsers support\n * constructable `EventTarget`, and using a real `Event` will error.\n * @private\n */\nclass WorkboxEvent {\n /**\n * @param {string} type\n * @param {Object} props\n */\n constructor(type, props) {\n Object.assign(this, props, {type});\n }\n}\n\nexport {WorkboxEvent};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {Deferred} from 'workbox-core/_private/Deferred.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {messageSW} from './messageSW.mjs';\nimport {EventTargetShim} from './utils/EventTargetShim.mjs';\nimport {urlsMatch} from './utils/urlsMatch.mjs';\nimport {WorkboxEvent} from './utils/WorkboxEvent.mjs';\nimport './_version.mjs';\n\n\n// The time a SW must be in the waiting phase before we can conclude\n// `skipWaiting()` wasn't called. This 200 amount wasn't scientifically\n// chosen, but it seems to avoid false positives in my testing.\nconst WAITING_TIMEOUT_DURATION = 200;\n\n// The amount of time after a registration that we can reasonably conclude\n// that the registration didn't trigger an update.\nconst REGISTRATION_TIMEOUT_DURATION = 60000;\n\n/**\n * A class to aid in handling service worker registration, updates, and\n * reacting to service worker lifecycle events.\n *\n * @fires [message]{@link module:workbox-window.Workbox#message}\n * @fires [installed]{@link module:workbox-window.Workbox#installed}\n * @fires [waiting]{@link module:workbox-window.Workbox#waiting}\n * @fires [controlling]{@link module:workbox-window.Workbox#controlling}\n * @fires [activated]{@link module:workbox-window.Workbox#activated}\n * @fires [redundant]{@link module:workbox-window.Workbox#redundant}\n * @fires [externalinstalled]{@link module:workbox-window.Workbox#externalinstalled}\n * @fires [externalwaiting]{@link module:workbox-window.Workbox#externalwaiting}\n * @fires [externalactivated]{@link module:workbox-window.Workbox#externalactivated}\n *\n * @memberof module:workbox-window\n */\nclass Workbox extends EventTargetShim {\n /**\n * Creates a new Workbox instance with a script URL and service worker\n * options. The script URL and options are the same as those used when\n * calling `navigator.serviceWorker.register(scriptURL, options)`. See:\n * https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/register\n *\n * @param {string} scriptURL The service worker script associated with this\n * instance.\n * @param {Object} [registerOptions] The service worker options associated\n * with this instance.\n */\n constructor(scriptURL, registerOptions = {}) {\n super();\n\n this._scriptURL = scriptURL;\n this._registerOptions = registerOptions;\n this._updateFoundCount = 0;\n\n // Deferreds we can resolve later.\n this._swDeferred = new Deferred();\n this._activeDeferred = new Deferred();\n this._controllingDeferred = new Deferred();\n\n // Bind event handler callbacks.\n this._onMessage = this._onMessage.bind(this);\n this._onStateChange = this._onStateChange.bind(this);\n this._onUpdateFound = this._onUpdateFound.bind(this);\n this._onControllerChange = this._onControllerChange.bind(this);\n }\n\n /**\n * Registers a service worker for this instances script URL and service\n * worker options. By default this method delays registration until after\n * the window has loaded.\n *\n * @param {Object} [options]\n * @param {Function} [options.immediate=false] Setting this to true will\n * register the service worker immediately, even if the window has\n * not loaded (not recommended).\n */\n async register({immediate = false} = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (this._registrationTime) {\n logger.error('Cannot re-register a Workbox instance after it has ' +\n 'been registered. Create a new instance instead.');\n return;\n }\n }\n\n if (!immediate && document.readyState !== 'complete') {\n await new Promise((res) => addEventListener('load', res));\n }\n\n // Set this flag to true if any service worker was controlling the page\n // at registration time.\n this._isUpdate = Boolean(navigator.serviceWorker.controller);\n\n // Before registering, attempt to determine if a SW is already controlling\n // the page, and if that SW script (and version, if specified) matches this\n // instance's script.\n this._compatibleControllingSW = this._getControllingSWIfCompatible();\n\n this._registration = await this._registerScript();\n\n // If we have a compatible controller, store the controller as the \"own\"\n // SW, resolve active/controlling deferreds and add necessary listeners.\n if (this._compatibleControllingSW) {\n this._sw = this._compatibleControllingSW;\n this._activeDeferred.resolve(this._compatibleControllingSW);\n this._controllingDeferred.resolve(this._compatibleControllingSW);\n\n this._reportWindowReady(this._compatibleControllingSW);\n this._compatibleControllingSW.addEventListener(\n 'statechange', this._onStateChange, {once: true});\n }\n\n // If there's a waiting service worker with a matching URL before the\n // `updatefound` event fires, it likely means that this site is open\n // in another tab, or the user refreshed the page (and thus the prevoius\n // page wasn't fully unloaded before this page started loading).\n // https://developers.google.com/web/fundamentals/primers/service-workers/lifecycle#waiting\n const waitingSW = this._registration.waiting;\n if (waitingSW && urlsMatch(waitingSW.scriptURL, this._scriptURL)) {\n // Store the waiting SW as the \"own\" Sw, even if it means overwriting\n // a compatible controller.\n this._sw = waitingSW;\n\n // Run this in the next microtask, so any code that adds an event\n // listener after awaiting `register()` will get this event.\n Promise.resolve().then(() => {\n this.dispatchEvent(new WorkboxEvent('waiting', {\n sw: waitingSW,\n wasWaitingBeforeRegister: true,\n }));\n if (process.env.NODE_ENV !== 'production') {\n logger.warn('A service worker was already waiting to activate ' +\n 'before this script was registered...');\n }\n });\n }\n\n // If an \"own\" SW is already set, resolve the deferred.\n if (this._sw) {\n this._swDeferred.resolve(this._sw);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Successfully registered service worker.', this._scriptURL);\n\n if (navigator.serviceWorker.controller) {\n if (this._compatibleControllingSW) {\n logger.debug('A service worker with the same script URL ' +\n 'is already controlling this page.');\n } else {\n logger.debug('A service worker with a different script URL is ' +\n 'currently controlling the page. The browser is now fetching ' +\n 'the new script now...');\n }\n }\n\n const currentPageIsOutOfScope = () => {\n const scopeURL = new URL(\n this._registerOptions.scope || this._scriptURL, document.baseURI);\n const scopeURLBasePath = new URL('./', scopeURL.href).pathname;\n return !location.pathname.startsWith(scopeURLBasePath);\n };\n if (currentPageIsOutOfScope()) {\n logger.warn('The current page is not in scope for the registered ' +\n 'service worker. Was this a mistake?');\n }\n }\n\n this._registration.addEventListener('updatefound', this._onUpdateFound);\n navigator.serviceWorker.addEventListener(\n 'controllerchange', this._onControllerChange, {once: true});\n\n // Add message listeners.\n if ('BroadcastChannel' in self) {\n this._broadcastChannel = new BroadcastChannel('workbox');\n this._broadcastChannel.addEventListener('message', this._onMessage);\n }\n navigator.serviceWorker.addEventListener('message', this._onMessage);\n\n return this._registration;\n }\n\n /**\n * Resolves to the service worker registered by this instance as soon as it\n * is active. If a service worker was already controlling at registration\n * time then it will resolve to that if the script URLs (and optionally\n * script versions) match, otherwise it will wait until an update is found\n * and activates.\n *\n * @return {Promise}\n */\n get active() {\n return this._activeDeferred.promise;\n }\n\n /**\n * Resolves to the service worker registered by this instance as soon as it\n * is controlling the page. If a service worker was already controlling at\n * registration time then it will resolve to that if the script URLs (and\n * optionally script versions) match, otherwise it will wait until an update\n * is found and starts controlling the page.\n * Note: the first time a service worker is installed it will active but\n * not start controlling the page unless `clients.claim()` is called in the\n * service worker.\n *\n * @return {Promise}\n */\n get controlling() {\n return this._controllingDeferred.promise;\n }\n\n /**\n * Resolves with a reference to a service worker that matches the script URL\n * of this instance, as soon as it's available.\n *\n * If, at registration time, there's already an active or waiting service\n * worker with a matching script URL, it will be used (with the waiting\n * service worker taking precedence over the active service worker if both\n * match, since the waiting service worker would have been registered more\n * recently).\n * If there's no matching active or waiting service worker at registration\n * time then the promise will not resolve until an update is found and starts\n * installing, at which point the installing service worker is used.\n *\n * @return {Promise}\n */\n async getSW() {\n // If `this._sw` is set, resolve with that as we want `getSW()` to\n // return the correct (new) service worker if an update is found.\n return this._sw || this._swDeferred.promise;\n }\n\n /**\n * Sends the passed data object to the service worker registered by this\n * instance (via [`getSW()`]{@link module:workbox-window.Workbox#getSW}) and resolves\n * with a response (if any).\n *\n * A response can be set in a message handler in the service worker by\n * calling `event.ports[0].postMessage(...)`, which will resolve the promise\n * returned by `messageSW()`. If no response is set, the promise will never\n * resolve.\n *\n * @param {Object} data An object to send to the service worker\n * @return {Promise}\n */\n async messageSW(data) {\n const sw = await this.getSW();\n return messageSW(sw, data);\n }\n\n /**\n * Checks for a service worker already controlling the page and returns\n * it if its script URL matchs.\n *\n * @private\n * @return {ServiceWorker|undefined}\n */\n _getControllingSWIfCompatible() {\n const controller = navigator.serviceWorker.controller;\n if (controller && urlsMatch(controller.scriptURL, this._scriptURL)) {\n return controller;\n }\n }\n\n /**\n * Registers a service worker for this instances script URL and register\n * options and tracks the time registration was complete.\n *\n * @private\n */\n async _registerScript() {\n try {\n const reg = await navigator.serviceWorker.register(\n this._scriptURL, this._registerOptions);\n\n // Keep track of when registration happened, so it can be used in the\n // `this._onUpdateFound` heuristic. Also use the presence of this\n // property as a way to see if `.register()` has been called.\n this._registrationTime = performance.now();\n\n return reg;\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.error(error);\n }\n // Re-throw the error.\n throw error;\n }\n }\n\n\n /**\n * Sends a message to the passed service worker that the window is ready.\n *\n * @param {ServiceWorker} sw\n * @private\n */\n _reportWindowReady(sw) {\n messageSW(sw, {\n type: 'WINDOW_READY',\n meta: 'workbox-window',\n });\n }\n\n /**\n * @private\n */\n _onUpdateFound() {\n const installingSW = this._registration.installing;\n\n // If the script URL passed to `navigator.serviceWorker.register()` is\n // different from the current controlling SW's script URL, we know any\n // successful registration calls will trigger an `updatefound` event.\n // But if the registered script URL is the same as the current controlling\n // SW's script URL, we'll only get an `updatefound` event if the file\n // changed since it was last registered. This can be a problem if the user\n // opens up the same page in a different tab, and that page registers\n // a SW that triggers an update. It's a problem because this page has no\n // good way of knowing whether the `updatefound` event came from the SW\n // script it registered or from a registration attempt made by a newer\n // version of the page running in another tab.\n // To minimize the possibility of a false positive, we use the logic here:\n let updateLikelyTriggeredExternally =\n // Since we enforce only calling `register()` once, and since we don't\n // add the `updatefound` event listener until the `register()` call, if\n // `_updateFoundCount` is > 0 then it means this method has already\n // been called, thus this SW must be external\n this._updateFoundCount > 0 ||\n // If the script URL of the installing SW is different from this\n // instance's script URL, we know it's definitely not from our\n // registration.\n !urlsMatch(installingSW.scriptURL, this._scriptURL) ||\n // If all of the above are false, then we use a time-based heuristic:\n // Any `updatefound` event that occurs long after our registration is\n // assumed to be external.\n (performance.now() >\n this._registrationTime + REGISTRATION_TIMEOUT_DURATION) ?\n // If any of the above are not true, we assume the update was\n // triggered by this instance.\n true : false;\n\n if (updateLikelyTriggeredExternally) {\n this._externalSW = installingSW;\n this._registration.removeEventListener(\n 'updatefound', this._onUpdateFound);\n } else {\n // If the update was not triggered externally we know the installing\n // SW is the one we registered, so we set it.\n this._sw = installingSW;\n this._swDeferred.resolve(installingSW);\n\n // The `installing` state isn't something we have a dedicated\n // callback for, but we do log messages for it in development.\n if (process.env.NODE_ENV !== 'production') {\n if (navigator.serviceWorker.controller) {\n logger.log('Updated service worker found. Installing now...');\n } else {\n logger.log('Service worker is installing...');\n }\n }\n }\n\n // Increment the `updatefound` count, so future invocations of this\n // method can be sure they were triggered externally.\n ++this._updateFoundCount;\n\n // Add a `statechange` listener regardless of whether this update was\n // triggered externally, since we have callbacks for both.\n installingSW.addEventListener('statechange', this._onStateChange);\n }\n\n /**\n * @private\n * @param {Event} originalEvent\n */\n _onStateChange(originalEvent) {\n const sw = originalEvent.target;\n const {state} = sw;\n const isExternal = sw === this._externalSW;\n const eventPrefix = isExternal ? 'external' : '';\n\n const eventProps = {sw, originalEvent};\n if (!isExternal && this._isUpdate) {\n eventProps.isUpdate = true;\n }\n\n this.dispatchEvent(new WorkboxEvent(\n eventPrefix + state, eventProps));\n\n if (state === 'installed') {\n // This timeout is used to ignore cases where the service worker calls\n // `skipWaiting()` in the install event, thus moving it directly in the\n // activating state. (Since all service workers *must* go through the\n // waiting phase, the only way to detect `skipWaiting()` called in the\n // install event is to observe that the time spent in the waiting phase\n // is very short.)\n // NOTE: we don't need separate timeouts for the own and external SWs\n // since they can't go through these phases at the same time.\n this._waitingTimeout = setTimeout(() => {\n // Ensure the SW is still waiting (it may now be redundant).\n if (state === 'installed' && this._registration.waiting === sw) {\n this.dispatchEvent(new WorkboxEvent(\n eventPrefix + 'waiting', eventProps));\n\n if (process.env.NODE_ENV !== 'production') {\n if (isExternal) {\n logger.warn('An external service worker has installed but is ' +\n 'waiting for this client to close before activating...');\n } else {\n logger.warn('The service worker has installed but is waiting ' +\n 'for existing clients to close before activating...');\n }\n }\n }\n }, WAITING_TIMEOUT_DURATION);\n } else if (state === 'activating') {\n clearTimeout(this._waitingTimeout);\n if (!isExternal) {\n this._activeDeferred.resolve(sw);\n }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n switch (state) {\n case 'installed':\n if (isExternal) {\n logger.warn('An external service worker has installed. ' +\n 'You may want to suggest users reload this page.');\n } else {\n logger.log('Registered service worker installed.');\n }\n break;\n case 'activated':\n if (isExternal) {\n logger.warn('An external service worker has activated.');\n } else {\n logger.log('Registered service worker activated.');\n if (sw !== navigator.serviceWorker.controller) {\n logger.warn('The registered service worker is active but ' +\n 'not yet controlling the page. Reload or run ' +\n '`clients.claim()` in the service worker.');\n }\n }\n break;\n case 'redundant':\n if (sw === this._compatibleControllingSW) {\n logger.log('Previously controlling service worker now redundant!');\n } else if (!isExternal) {\n logger.log('Registered service worker now redundant!');\n }\n break;\n }\n }\n }\n\n /**\n * @private\n * @param {Event} originalEvent\n */\n _onControllerChange(originalEvent) {\n const sw = this._sw;\n if (sw === navigator.serviceWorker.controller) {\n this.dispatchEvent(new WorkboxEvent('controlling', {sw, originalEvent}));\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Registered service worker now controlling this page.');\n }\n this._controllingDeferred.resolve(sw);\n }\n }\n\n /**\n * @private\n * @param {Event} originalEvent\n */\n _onMessage(originalEvent) {\n const {data} = originalEvent;\n this.dispatchEvent(new WorkboxEvent('message', {data, originalEvent}));\n }\n}\n\n// The jsdoc comments below outline the events this instance may dispatch:\n// -----------------------------------------------------------------------\n\n/**\n * The `message` event is dispatched any time a `postMessage` (or a\n * `BroadcastChannel` message with the `workbox` channel name) is received.\n *\n * @event module:workbox-window.Workbox#message\n * @type {WorkboxEvent}\n * @property {*} data The `data` property from the original `message` event.\n * @property {Event} originalEvent The original [`message`]{@link https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent}\n * event.\n * @property {string} type `message`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `installed` event is dispatched if the state of a\n * [`Workbox`]{@link module:workbox-window.Workbox} instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}\n * changes to `installed`.\n *\n * Then can happen either the very first time a service worker is installed,\n * or after an update to the current service worker is found. In the case\n * of an update being found, the event's `isUpdate` property will be `true`.\n *\n * @event module:workbox-window.Workbox#installed\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this `Workbox` instance called `register()`.\n * @property {string} type `installed`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `waiting` event is dispatched if the state of a\n * [`Workbox`]{@link module:workbox-window.Workbox} instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}\n * changes to `installed` and then doesn't immediately change to `activating`.\n * It may also be dispatched if a service worker with the same\n * [`scriptURL`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/scriptURL}\n * was already waiting when the [`register()`]{@link module:workbox-window.Workbox#register}\n * method was called.\n *\n * @event module:workbox-window.Workbox#waiting\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The native `controllerchange` event\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this `Workbox` instance called `register()`.\n * @property {boolean|undefined} wasWaitingBeforeRegister True if a service worker with\n * a matching `scriptURL` was already waiting when this `Workbox`\n * instance called `register()`.\n * @property {string} type `waiting`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `controlling` event is dispatched if a\n * [`controllerchange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/oncontrollerchange}\n * fires on the service worker [container]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer}\n * and the [`scriptURL`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/scriptURL}\n * of the new [controller]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/controller}\n * matches the `scriptURL` of the `Workbox` instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}.\n *\n * @event module:workbox-window.Workbox#controlling\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`controllerchange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/oncontrollerchange}\n * event.\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this service worker was registered.\n * @property {string} type `controlling`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `activated` event is dispatched if the state of a\n * [`Workbox`]{@link module:workbox-window.Workbox} instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}\n * changes to `activated`.\n *\n * @event module:workbox-window.Workbox#activated\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this `Workbox` instance called `register()`.\n * @property {string} type `activated`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `redundant` event is dispatched if the state of a\n * [`Workbox`]{@link module:workbox-window.Workbox} instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}\n * changes to `redundant`.\n *\n * @event module:workbox-window.Workbox#redundant\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this `Workbox` instance called `register()`.\n * @property {string} type `redundant`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `externalinstalled` event is dispatched if the state of an\n * [external service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-external-sw}\n * changes to `installed`.\n *\n * @event module:workbox-window.Workbox#externalinstalled\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {string} type `externalinstalled`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `externalwaiting` event is dispatched if the state of an\n * [external service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-external-sw}\n * changes to `waiting`.\n *\n * @event module:workbox-window.Workbox#externalwaiting\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event|undefined} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {string} type `externalwaiting`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `externalactivated` event is dispatched if the state of an\n * [external service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-external-sw}\n * changes to `activated`.\n *\n * @event module:workbox-window.Workbox#externalactivated\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {string} type `externalactivated`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\nexport {Workbox};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {messageSW} from './messageSW.mjs';\nimport {Workbox} from './Workbox.mjs';\nimport './_version.mjs';\n\n\n/**\n * @module workbox-window\n */\nexport {\n Workbox,\n messageSW,\n};\n"],"names":["self","_","e","messageSW","sw","data","Promise","resolve","messageChannel","MessageChannel","port1","onmessage","evt","postMessage","port2","Deferred","constructor","promise","reject","logger","process","inGroup","methodToColorMap","debug","log","warn","error","groupCollapsed","groupEnd","print","method","args","test","navigator","userAgent","console","styles","logPrefix","join","api","Object","keys","EventTargetShim","_eventListenerRegistry","addEventListener","type","listener","_getEventListenersByType","add","removeEventListener","delete","dispatchEvent","event","target","forEach","Set","urlsMatch","url1","url2","URL","location","href","WorkboxEvent","props","assign","WAITING_TIMEOUT_DURATION","REGISTRATION_TIMEOUT_DURATION","Workbox","scriptURL","registerOptions","_scriptURL","_registerOptions","_updateFoundCount","_swDeferred","_activeDeferred","_controllingDeferred","_onMessage","bind","_onStateChange","_onUpdateFound","_onControllerChange","register","immediate","_registrationTime","document","readyState","res","_isUpdate","Boolean","serviceWorker","controller","_compatibleControllingSW","_getControllingSWIfCompatible","_registration","_registerScript","_sw","_reportWindowReady","once","waitingSW","waiting","then","wasWaitingBeforeRegister","currentPageIsOutOfScope","scopeURL","scope","baseURI","scopeURLBasePath","pathname","startsWith","_broadcastChannel","BroadcastChannel","active","controlling","getSW","reg","performance","now","meta","installingSW","installing","updateLikelyTriggeredExternally","_externalSW","originalEvent","state","isExternal","eventPrefix","eventProps","isUpdate","_waitingTimeout","setTimeout","clearTimeout"],"mappings":"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"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-window.dev.umd.js b/workbox-v4.3.1/workbox-window.dev.umd.js new file mode 100644 index 00000000..7e13ff6a --- /dev/null +++ b/workbox-v4.3.1/workbox-window.dev.umd.js @@ -0,0 +1,896 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.workbox = {})); +}(this, function (exports) { 'use strict'; + + try { + self['workbox:window:4.3.1'] && _(); + } catch (e) {} // eslint-disable-line + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Sends a data object to a service worker via `postMessage` and resolves with + * a response (if any). + * + * A response can be set in a message handler in the service worker by + * calling `event.ports[0].postMessage(...)`, which will resolve the promise + * returned by `messageSW()`. If no response is set, the promise will not + * resolve. + * + * @param {ServiceWorker} sw The service worker to send the message to. + * @param {Object} data An object to send to the service worker. + * @return {Promise} + * + * @memberof module:workbox-window + */ + + var messageSW = function messageSW(sw, data) { + return new Promise(function (resolve) { + var messageChannel = new MessageChannel(); + + messageChannel.port1.onmessage = function (evt) { + return resolve(evt.data); + }; + + sw.postMessage(data, [messageChannel.port2]); + }); + }; + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; + } + + function _assertThisInitialized(self) { + if (self === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + + return self; + } + + try { + self['workbox:core:4.3.1'] && _(); + } catch (e) {} // eslint-disable-line + + /* + Copyright 2018 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * The Deferred class composes Promises in a way that allows for them to be + * resolved or rejected from outside the constructor. In most cases promises + * should be used directly, but Deferreds can be necessary when the logic to + * resolve a promise must be separate. + * + * @private + */ + + var Deferred = + /** + * Creates a promise and exposes its resolve and reject functions as methods. + */ + function Deferred() { + var _this = this; + + this.promise = new Promise(function (resolve, reject) { + _this.resolve = resolve; + _this.reject = reject; + }); + }; + + /* + Copyright 2019 Google LLC + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + var logger = function () { + var inGroup = false; + var methodToColorMap = { + debug: "#7f8c8d", + // Gray + log: "#2ecc71", + // Green + warn: "#f39c12", + // Yellow + error: "#c0392b", + // Red + groupCollapsed: "#3498db", + // Blue + groupEnd: null // No colored prefix on groupEnd + + }; + + var print = function print(method, args) { + var _console2; + + if (method === 'groupCollapsed') { + // Safari doesn't print all console.groupCollapsed() arguments: + // https://bugs.webkit.org/show_bug.cgi?id=182754 + if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { + var _console; + + (_console = console)[method].apply(_console, args); + + return; + } + } + + var styles = ["background: " + methodToColorMap[method], "border-radius: 0.5em", "color: white", "font-weight: bold", "padding: 2px 0.5em"]; // When in a group, the workbox prefix is not displayed. + + var logPrefix = inGroup ? [] : ['%cworkbox', styles.join(';')]; + + (_console2 = console)[method].apply(_console2, logPrefix.concat(args)); + + if (method === 'groupCollapsed') { + inGroup = true; + } + + if (method === 'groupEnd') { + inGroup = false; + } + }; + + var api = {}; + + var _arr = Object.keys(methodToColorMap); + + var _loop = function _loop() { + var method = _arr[_i]; + + api[method] = function () { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + print(method, args); + }; + }; + + for (var _i = 0; _i < _arr.length; _i++) { + _loop(); + } + + return api; + }(); + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * A minimal `EventTarget` shim. + * This is necessary because not all browsers support constructable + * `EventTarget`, so using a real `EventTarget` will error. + * @private + */ + + var EventTargetShim = + /*#__PURE__*/ + function () { + /** + * Creates an event listener registry + * + * @private + */ + function EventTargetShim() { + // A registry of event types to listeners. + this._eventListenerRegistry = {}; + } + /** + * @param {string} type + * @param {Function} listener + * @private + */ + + + var _proto = EventTargetShim.prototype; + + _proto.addEventListener = function addEventListener(type, listener) { + this._getEventListenersByType(type).add(listener); + }; + /** + * @param {string} type + * @param {Function} listener + * @private + */ + + + _proto.removeEventListener = function removeEventListener(type, listener) { + this._getEventListenersByType(type).delete(listener); + }; + /** + * @param {Event} event + * @private + */ + + + _proto.dispatchEvent = function dispatchEvent(event) { + event.target = this; + + this._getEventListenersByType(event.type).forEach(function (listener) { + return listener(event); + }); + }; + /** + * Returns a Set of listeners associated with the passed event type. + * If no handlers have been registered, an empty Set is returned. + * + * @param {string} type The event type. + * @return {Set} An array of handler functions. + * @private + */ + + + _proto._getEventListenersByType = function _getEventListenersByType(type) { + return this._eventListenerRegistry[type] = this._eventListenerRegistry[type] || new Set(); + }; + + return EventTargetShim; + }(); + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * Returns true if two URLs have the same `.href` property. The URLS can be + * relative, and if they are the current location href is used to resolve URLs. + * + * @private + * @param {string} url1 + * @param {string} url2 + * @return {boolean} + */ + + var urlsMatch = function urlsMatch(url1, url2) { + return new URL(url1, location).href === new URL(url2, location).href; + }; + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + /** + * A minimal `Event` subclass shim. + * This doesn't *actually* subclass `Event` because not all browsers support + * constructable `EventTarget`, and using a real `Event` will error. + * @private + */ + + var WorkboxEvent = + /** + * @param {string} type + * @param {Object} props + */ + function WorkboxEvent(type, props) { + Object.assign(this, props, { + type: type + }); + }; + + function _catch(body, recover) { + try { + var result = body(); + } catch (e) { + return recover(e); + } + + if (result && result.then) { + return result.then(void 0, recover); + } + + return result; + } + + function _async(f) { + return function () { + for (var args = [], i = 0; i < arguments.length; i++) { + args[i] = arguments[i]; + } + + try { + return Promise.resolve(f.apply(this, args)); + } catch (e) { + return Promise.reject(e); + } + }; + } + + function _invoke(body, then) { + var result = body(); + + if (result && result.then) { + return result.then(then); + } + + return then(result); + } + + function _await(value, then, direct) { + if (direct) { + return then ? then(value) : value; + } + + if (!value || !value.then) { + value = Promise.resolve(value); + } + + return then ? value.then(then) : value; + } + + function _awaitIgnored(value, direct) { + if (!direct) { + return value && value.then ? value.then(_empty) : Promise.resolve(); + } + } + + function _empty() {} + // `skipWaiting()` wasn't called. This 200 amount wasn't scientifically + // chosen, but it seems to avoid false positives in my testing. + + var WAITING_TIMEOUT_DURATION = 200; // The amount of time after a registration that we can reasonably conclude + // that the registration didn't trigger an update. + + var REGISTRATION_TIMEOUT_DURATION = 60000; + /** + * A class to aid in handling service worker registration, updates, and + * reacting to service worker lifecycle events. + * + * @fires [message]{@link module:workbox-window.Workbox#message} + * @fires [installed]{@link module:workbox-window.Workbox#installed} + * @fires [waiting]{@link module:workbox-window.Workbox#waiting} + * @fires [controlling]{@link module:workbox-window.Workbox#controlling} + * @fires [activated]{@link module:workbox-window.Workbox#activated} + * @fires [redundant]{@link module:workbox-window.Workbox#redundant} + * @fires [externalinstalled]{@link module:workbox-window.Workbox#externalinstalled} + * @fires [externalwaiting]{@link module:workbox-window.Workbox#externalwaiting} + * @fires [externalactivated]{@link module:workbox-window.Workbox#externalactivated} + * + * @memberof module:workbox-window + */ + + var Workbox = + /*#__PURE__*/ + function (_EventTargetShim) { + _inheritsLoose(Workbox, _EventTargetShim); + + /** + * Creates a new Workbox instance with a script URL and service worker + * options. The script URL and options are the same as those used when + * calling `navigator.serviceWorker.register(scriptURL, options)`. See: + * https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/register + * + * @param {string} scriptURL The service worker script associated with this + * instance. + * @param {Object} [registerOptions] The service worker options associated + * with this instance. + */ + function Workbox(scriptURL, registerOptions) { + var _this; + + if (registerOptions === void 0) { + registerOptions = {}; + } + + _this = _EventTargetShim.call(this) || this; + _this._scriptURL = scriptURL; + _this._registerOptions = registerOptions; + _this._updateFoundCount = 0; // Deferreds we can resolve later. + + _this._swDeferred = new Deferred(); + _this._activeDeferred = new Deferred(); + _this._controllingDeferred = new Deferred(); // Bind event handler callbacks. + + _this._onMessage = _this._onMessage.bind(_assertThisInitialized(_assertThisInitialized(_this))); + _this._onStateChange = _this._onStateChange.bind(_assertThisInitialized(_assertThisInitialized(_this))); + _this._onUpdateFound = _this._onUpdateFound.bind(_assertThisInitialized(_assertThisInitialized(_this))); + _this._onControllerChange = _this._onControllerChange.bind(_assertThisInitialized(_assertThisInitialized(_this))); + return _this; + } + /** + * Registers a service worker for this instances script URL and service + * worker options. By default this method delays registration until after + * the window has loaded. + * + * @param {Object} [options] + * @param {Function} [options.immediate=false] Setting this to true will + * register the service worker immediately, even if the window has + * not loaded (not recommended). + */ + + + var _proto = Workbox.prototype; + _proto.register = _async(function (_temp) { + var _this2 = this; + + var _ref = _temp === void 0 ? {} : _temp, + _ref$immediate = _ref.immediate, + immediate = _ref$immediate === void 0 ? false : _ref$immediate; + + { + if (_this2._registrationTime) { + logger.error('Cannot re-register a Workbox instance after it has ' + 'been registered. Create a new instance instead.'); + return; + } + } + + return _invoke(function () { + if (!immediate && document.readyState !== 'complete') { + return _awaitIgnored(new Promise(function (res) { + return addEventListener('load', res); + })); + } + }, function () { + // Set this flag to true if any service worker was controlling the page + // at registration time. + _this2._isUpdate = Boolean(navigator.serviceWorker.controller); // Before registering, attempt to determine if a SW is already controlling + // the page, and if that SW script (and version, if specified) matches this + // instance's script. + + _this2._compatibleControllingSW = _this2._getControllingSWIfCompatible(); + return _await(_this2._registerScript(), function (_this2$_registerScrip) { + _this2._registration = _this2$_registerScrip; + + // If we have a compatible controller, store the controller as the "own" + // SW, resolve active/controlling deferreds and add necessary listeners. + if (_this2._compatibleControllingSW) { + _this2._sw = _this2._compatibleControllingSW; + + _this2._activeDeferred.resolve(_this2._compatibleControllingSW); + + _this2._controllingDeferred.resolve(_this2._compatibleControllingSW); + + _this2._reportWindowReady(_this2._compatibleControllingSW); + + _this2._compatibleControllingSW.addEventListener('statechange', _this2._onStateChange, { + once: true + }); + } // If there's a waiting service worker with a matching URL before the + // `updatefound` event fires, it likely means that this site is open + // in another tab, or the user refreshed the page (and thus the prevoius + // page wasn't fully unloaded before this page started loading). + // https://developers.google.com/web/fundamentals/primers/service-workers/lifecycle#waiting + + + var waitingSW = _this2._registration.waiting; + + if (waitingSW && urlsMatch(waitingSW.scriptURL, _this2._scriptURL)) { + // Store the waiting SW as the "own" Sw, even if it means overwriting + // a compatible controller. + _this2._sw = waitingSW; // Run this in the next microtask, so any code that adds an event + // listener after awaiting `register()` will get this event. + + Promise.resolve().then(function () { + _this2.dispatchEvent(new WorkboxEvent('waiting', { + sw: waitingSW, + wasWaitingBeforeRegister: true + })); + + { + logger.warn('A service worker was already waiting to activate ' + 'before this script was registered...'); + } + }); + } // If an "own" SW is already set, resolve the deferred. + + + if (_this2._sw) { + _this2._swDeferred.resolve(_this2._sw); + } + + { + logger.log('Successfully registered service worker.', _this2._scriptURL); + + if (navigator.serviceWorker.controller) { + if (_this2._compatibleControllingSW) { + logger.debug('A service worker with the same script URL ' + 'is already controlling this page.'); + } else { + logger.debug('A service worker with a different script URL is ' + 'currently controlling the page. The browser is now fetching ' + 'the new script now...'); + } + } + + var currentPageIsOutOfScope = function currentPageIsOutOfScope() { + var scopeURL = new URL(_this2._registerOptions.scope || _this2._scriptURL, document.baseURI); + var scopeURLBasePath = new URL('./', scopeURL.href).pathname; + return !location.pathname.startsWith(scopeURLBasePath); + }; + + if (currentPageIsOutOfScope()) { + logger.warn('The current page is not in scope for the registered ' + 'service worker. Was this a mistake?'); + } + } + + _this2._registration.addEventListener('updatefound', _this2._onUpdateFound); + + navigator.serviceWorker.addEventListener('controllerchange', _this2._onControllerChange, { + once: true + }); // Add message listeners. + + if ('BroadcastChannel' in self) { + _this2._broadcastChannel = new BroadcastChannel('workbox'); + + _this2._broadcastChannel.addEventListener('message', _this2._onMessage); + } + + navigator.serviceWorker.addEventListener('message', _this2._onMessage); + return _this2._registration; + }); + }); + }); + /** + * Resolves to the service worker registered by this instance as soon as it + * is active. If a service worker was already controlling at registration + * time then it will resolve to that if the script URLs (and optionally + * script versions) match, otherwise it will wait until an update is found + * and activates. + * + * @return {Promise} + */ + + /** + * Resolves with a reference to a service worker that matches the script URL + * of this instance, as soon as it's available. + * + * If, at registration time, there's already an active or waiting service + * worker with a matching script URL, it will be used (with the waiting + * service worker taking precedence over the active service worker if both + * match, since the waiting service worker would have been registered more + * recently). + * If there's no matching active or waiting service worker at registration + * time then the promise will not resolve until an update is found and starts + * installing, at which point the installing service worker is used. + * + * @return {Promise} + */ + _proto.getSW = _async(function () { + var _this3 = this; + + // If `this._sw` is set, resolve with that as we want `getSW()` to + // return the correct (new) service worker if an update is found. + return _this3._sw || _this3._swDeferred.promise; + }); + /** + * Sends the passed data object to the service worker registered by this + * instance (via [`getSW()`]{@link module:workbox-window.Workbox#getSW}) and resolves + * with a response (if any). + * + * A response can be set in a message handler in the service worker by + * calling `event.ports[0].postMessage(...)`, which will resolve the promise + * returned by `messageSW()`. If no response is set, the promise will never + * resolve. + * + * @param {Object} data An object to send to the service worker + * @return {Promise} + */ + + _proto.messageSW = _async(function (data) { + var _this4 = this; + + return _await(_this4.getSW(), function (sw) { + return messageSW(sw, data); + }); + }); + /** + * Checks for a service worker already controlling the page and returns + * it if its script URL matchs. + * + * @private + * @return {ServiceWorker|undefined} + */ + + _proto._getControllingSWIfCompatible = function _getControllingSWIfCompatible() { + var controller = navigator.serviceWorker.controller; + + if (controller && urlsMatch(controller.scriptURL, this._scriptURL)) { + return controller; + } + }; + /** + * Registers a service worker for this instances script URL and register + * options and tracks the time registration was complete. + * + * @private + */ + + + _proto._registerScript = _async(function () { + var _this5 = this; + + return _catch(function () { + return _await(navigator.serviceWorker.register(_this5._scriptURL, _this5._registerOptions), function (reg) { + // Keep track of when registration happened, so it can be used in the + // `this._onUpdateFound` heuristic. Also use the presence of this + // property as a way to see if `.register()` has been called. + _this5._registrationTime = performance.now(); + return reg; + }); + }, function (error) { + { + logger.error(error); + } // Re-throw the error. + + + throw error; + }); + }); + /** + * Sends a message to the passed service worker that the window is ready. + * + * @param {ServiceWorker} sw + * @private + */ + + _proto._reportWindowReady = function _reportWindowReady(sw) { + messageSW(sw, { + type: 'WINDOW_READY', + meta: 'workbox-window' + }); + }; + /** + * @private + */ + + + _proto._onUpdateFound = function _onUpdateFound() { + var installingSW = this._registration.installing; // If the script URL passed to `navigator.serviceWorker.register()` is + // different from the current controlling SW's script URL, we know any + // successful registration calls will trigger an `updatefound` event. + // But if the registered script URL is the same as the current controlling + // SW's script URL, we'll only get an `updatefound` event if the file + // changed since it was last registered. This can be a problem if the user + // opens up the same page in a different tab, and that page registers + // a SW that triggers an update. It's a problem because this page has no + // good way of knowing whether the `updatefound` event came from the SW + // script it registered or from a registration attempt made by a newer + // version of the page running in another tab. + // To minimize the possibility of a false positive, we use the logic here: + + var updateLikelyTriggeredExternally = // Since we enforce only calling `register()` once, and since we don't + // add the `updatefound` event listener until the `register()` call, if + // `_updateFoundCount` is > 0 then it means this method has already + // been called, thus this SW must be external + this._updateFoundCount > 0 || // If the script URL of the installing SW is different from this + // instance's script URL, we know it's definitely not from our + // registration. + !urlsMatch(installingSW.scriptURL, this._scriptURL) || // If all of the above are false, then we use a time-based heuristic: + // Any `updatefound` event that occurs long after our registration is + // assumed to be external. + performance.now() > this._registrationTime + REGISTRATION_TIMEOUT_DURATION ? // If any of the above are not true, we assume the update was + // triggered by this instance. + true : false; + + if (updateLikelyTriggeredExternally) { + this._externalSW = installingSW; + + this._registration.removeEventListener('updatefound', this._onUpdateFound); + } else { + // If the update was not triggered externally we know the installing + // SW is the one we registered, so we set it. + this._sw = installingSW; + + this._swDeferred.resolve(installingSW); // The `installing` state isn't something we have a dedicated + // callback for, but we do log messages for it in development. + + + { + if (navigator.serviceWorker.controller) { + logger.log('Updated service worker found. Installing now...'); + } else { + logger.log('Service worker is installing...'); + } + } + } // Increment the `updatefound` count, so future invocations of this + // method can be sure they were triggered externally. + + + ++this._updateFoundCount; // Add a `statechange` listener regardless of whether this update was + // triggered externally, since we have callbacks for both. + + installingSW.addEventListener('statechange', this._onStateChange); + }; + /** + * @private + * @param {Event} originalEvent + */ + + + _proto._onStateChange = function _onStateChange(originalEvent) { + var _this6 = this; + + var sw = originalEvent.target; + var state = sw.state; + var isExternal = sw === this._externalSW; + var eventPrefix = isExternal ? 'external' : ''; + var eventProps = { + sw: sw, + originalEvent: originalEvent + }; + + if (!isExternal && this._isUpdate) { + eventProps.isUpdate = true; + } + + this.dispatchEvent(new WorkboxEvent(eventPrefix + state, eventProps)); + + if (state === 'installed') { + // This timeout is used to ignore cases where the service worker calls + // `skipWaiting()` in the install event, thus moving it directly in the + // activating state. (Since all service workers *must* go through the + // waiting phase, the only way to detect `skipWaiting()` called in the + // install event is to observe that the time spent in the waiting phase + // is very short.) + // NOTE: we don't need separate timeouts for the own and external SWs + // since they can't go through these phases at the same time. + this._waitingTimeout = setTimeout(function () { + // Ensure the SW is still waiting (it may now be redundant). + if (state === 'installed' && _this6._registration.waiting === sw) { + _this6.dispatchEvent(new WorkboxEvent(eventPrefix + 'waiting', eventProps)); + + { + if (isExternal) { + logger.warn('An external service worker has installed but is ' + 'waiting for this client to close before activating...'); + } else { + logger.warn('The service worker has installed but is waiting ' + 'for existing clients to close before activating...'); + } + } + } + }, WAITING_TIMEOUT_DURATION); + } else if (state === 'activating') { + clearTimeout(this._waitingTimeout); + + if (!isExternal) { + this._activeDeferred.resolve(sw); + } + } + + { + switch (state) { + case 'installed': + if (isExternal) { + logger.warn('An external service worker has installed. ' + 'You may want to suggest users reload this page.'); + } else { + logger.log('Registered service worker installed.'); + } + + break; + + case 'activated': + if (isExternal) { + logger.warn('An external service worker has activated.'); + } else { + logger.log('Registered service worker activated.'); + + if (sw !== navigator.serviceWorker.controller) { + logger.warn('The registered service worker is active but ' + 'not yet controlling the page. Reload or run ' + '`clients.claim()` in the service worker.'); + } + } + + break; + + case 'redundant': + if (sw === this._compatibleControllingSW) { + logger.log('Previously controlling service worker now redundant!'); + } else if (!isExternal) { + logger.log('Registered service worker now redundant!'); + } + + break; + } + } + }; + /** + * @private + * @param {Event} originalEvent + */ + + + _proto._onControllerChange = function _onControllerChange(originalEvent) { + var sw = this._sw; + + if (sw === navigator.serviceWorker.controller) { + this.dispatchEvent(new WorkboxEvent('controlling', { + sw: sw, + originalEvent: originalEvent + })); + + { + logger.log('Registered service worker now controlling this page.'); + } + + this._controllingDeferred.resolve(sw); + } + }; + /** + * @private + * @param {Event} originalEvent + */ + + + _proto._onMessage = function _onMessage(originalEvent) { + var data = originalEvent.data; + this.dispatchEvent(new WorkboxEvent('message', { + data: data, + originalEvent: originalEvent + })); + }; + + _createClass(Workbox, [{ + key: "active", + get: function get() { + return this._activeDeferred.promise; + } + /** + * Resolves to the service worker registered by this instance as soon as it + * is controlling the page. If a service worker was already controlling at + * registration time then it will resolve to that if the script URLs (and + * optionally script versions) match, otherwise it will wait until an update + * is found and starts controlling the page. + * Note: the first time a service worker is installed it will active but + * not start controlling the page unless `clients.claim()` is called in the + * service worker. + * + * @return {Promise} + */ + + }, { + key: "controlling", + get: function get() { + return this._controllingDeferred.promise; + } + }]); + + return Workbox; + }(EventTargetShim); // The jsdoc comments below outline the events this instance may dispatch: + + /* + Copyright 2019 Google LLC + + Use of this source code is governed by an MIT-style + license that can be found in the LICENSE file or at + https://opensource.org/licenses/MIT. + */ + + exports.Workbox = Workbox; + exports.messageSW = messageSW; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); +//# sourceMappingURL=workbox-window.dev.umd.js.map diff --git a/workbox-v4.3.1/workbox-window.dev.umd.js.map b/workbox-v4.3.1/workbox-window.dev.umd.js.map new file mode 100644 index 00000000..0fc86b82 --- /dev/null +++ b/workbox-v4.3.1/workbox-window.dev.umd.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-window.dev.umd.js","sources":["../_version.mjs","../messageSW.mjs","../../workbox-core/_version.mjs","../../workbox-core/_private/Deferred.mjs","../../workbox-core/_private/logger.mjs","../utils/EventTargetShim.mjs","../utils/urlsMatch.mjs","../utils/WorkboxEvent.mjs","../Workbox.mjs","../index.mjs"],"sourcesContent":["try{self['workbox:window:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport './_version.mjs';\n\n\n/**\n * Sends a data object to a service worker via `postMessage` and resolves with\n * a response (if any).\n *\n * A response can be set in a message handler in the service worker by\n * calling `event.ports[0].postMessage(...)`, which will resolve the promise\n * returned by `messageSW()`. If no response is set, the promise will not\n * resolve.\n *\n * @param {ServiceWorker} sw The service worker to send the message to.\n * @param {Object} data An object to send to the service worker.\n * @return {Promise}\n *\n * @memberof module:workbox-window\n */\nconst messageSW = (sw, data) => {\n return new Promise((resolve) => {\n let messageChannel = new MessageChannel();\n messageChannel.port1.onmessage = (evt) => resolve(evt.data);\n sw.postMessage(data, [messageChannel.port2]);\n });\n};\n\nexport {messageSW};\n","try{self['workbox:core:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n/**\n * The Deferred class composes Promises in a way that allows for them to be\n * resolved or rejected from outside the constructor. In most cases promises\n * should be used directly, but Deferreds can be necessary when the logic to\n * resolve a promise must be separate.\n *\n * @private\n */\nexport class Deferred {\n /**\n * Creates a promise and exposes its resolve and reject functions as methods.\n */\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n}\n","/*\n Copyright 2019 Google LLC\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\nconst logger = process.env.NODE_ENV === 'production' ? null : (() => {\n let inGroup = false;\n\n const methodToColorMap = {\n debug: `#7f8c8d`, // Gray\n log: `#2ecc71`, // Green\n warn: `#f39c12`, // Yellow\n error: `#c0392b`, // Red\n groupCollapsed: `#3498db`, // Blue\n groupEnd: null, // No colored prefix on groupEnd\n };\n\n const print = function(method, args) {\n if (method === 'groupCollapsed') {\n // Safari doesn't print all console.groupCollapsed() arguments:\n // https://bugs.webkit.org/show_bug.cgi?id=182754\n if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n console[method](...args);\n return;\n }\n }\n\n const styles = [\n `background: ${methodToColorMap[method]}`,\n `border-radius: 0.5em`,\n `color: white`,\n `font-weight: bold`,\n `padding: 2px 0.5em`,\n ];\n\n // When in a group, the workbox prefix is not displayed.\n const logPrefix = inGroup ? [] : ['%cworkbox', styles.join(';')];\n\n console[method](...logPrefix, ...args);\n\n if (method === 'groupCollapsed') {\n inGroup = true;\n }\n if (method === 'groupEnd') {\n inGroup = false;\n }\n };\n\n const api = {};\n for (const method of Object.keys(methodToColorMap)) {\n api[method] = (...args) => {\n print(method, args);\n };\n }\n\n return api;\n})();\n\nexport {logger};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n/**\n * A minimal `EventTarget` shim.\n * This is necessary because not all browsers support constructable\n * `EventTarget`, so using a real `EventTarget` will error.\n * @private\n */\nclass EventTargetShim {\n /**\n * Creates an event listener registry\n *\n * @private\n */\n constructor() {\n // A registry of event types to listeners.\n this._eventListenerRegistry = {};\n }\n /**\n * @param {string} type\n * @param {Function} listener\n * @private\n */\n addEventListener(type, listener) {\n this._getEventListenersByType(type).add(listener);\n }\n\n /**\n * @param {string} type\n * @param {Function} listener\n * @private\n */\n removeEventListener(type, listener) {\n this._getEventListenersByType(type).delete(listener);\n }\n\n /**\n * @param {Event} event\n * @private\n */\n dispatchEvent(event) {\n event.target = this;\n this._getEventListenersByType(event.type).forEach(\n (listener) => listener(event));\n }\n\n /**\n * Returns a Set of listeners associated with the passed event type.\n * If no handlers have been registered, an empty Set is returned.\n *\n * @param {string} type The event type.\n * @return {Set} An array of handler functions.\n * @private\n */\n _getEventListenersByType(type) {\n return this._eventListenerRegistry[type] =\n (this._eventListenerRegistry[type] || new Set());\n }\n}\n\nexport {EventTargetShim};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n/**\n * Returns true if two URLs have the same `.href` property. The URLS can be\n * relative, and if they are the current location href is used to resolve URLs.\n *\n * @private\n * @param {string} url1\n * @param {string} url2\n * @return {boolean}\n */\nconst urlsMatch = (url1, url2) => {\n return new URL(url1, location).href === new URL(url2, location).href;\n};\n\nexport {urlsMatch};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n/**\n * A minimal `Event` subclass shim.\n * This doesn't *actually* subclass `Event` because not all browsers support\n * constructable `EventTarget`, and using a real `Event` will error.\n * @private\n */\nclass WorkboxEvent {\n /**\n * @param {string} type\n * @param {Object} props\n */\n constructor(type, props) {\n Object.assign(this, props, {type});\n }\n}\n\nexport {WorkboxEvent};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {Deferred} from 'workbox-core/_private/Deferred.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {messageSW} from './messageSW.mjs';\nimport {EventTargetShim} from './utils/EventTargetShim.mjs';\nimport {urlsMatch} from './utils/urlsMatch.mjs';\nimport {WorkboxEvent} from './utils/WorkboxEvent.mjs';\nimport './_version.mjs';\n\n\n// The time a SW must be in the waiting phase before we can conclude\n// `skipWaiting()` wasn't called. This 200 amount wasn't scientifically\n// chosen, but it seems to avoid false positives in my testing.\nconst WAITING_TIMEOUT_DURATION = 200;\n\n// The amount of time after a registration that we can reasonably conclude\n// that the registration didn't trigger an update.\nconst REGISTRATION_TIMEOUT_DURATION = 60000;\n\n/**\n * A class to aid in handling service worker registration, updates, and\n * reacting to service worker lifecycle events.\n *\n * @fires [message]{@link module:workbox-window.Workbox#message}\n * @fires [installed]{@link module:workbox-window.Workbox#installed}\n * @fires [waiting]{@link module:workbox-window.Workbox#waiting}\n * @fires [controlling]{@link module:workbox-window.Workbox#controlling}\n * @fires [activated]{@link module:workbox-window.Workbox#activated}\n * @fires [redundant]{@link module:workbox-window.Workbox#redundant}\n * @fires [externalinstalled]{@link module:workbox-window.Workbox#externalinstalled}\n * @fires [externalwaiting]{@link module:workbox-window.Workbox#externalwaiting}\n * @fires [externalactivated]{@link module:workbox-window.Workbox#externalactivated}\n *\n * @memberof module:workbox-window\n */\nclass Workbox extends EventTargetShim {\n /**\n * Creates a new Workbox instance with a script URL and service worker\n * options. The script URL and options are the same as those used when\n * calling `navigator.serviceWorker.register(scriptURL, options)`. See:\n * https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/register\n *\n * @param {string} scriptURL The service worker script associated with this\n * instance.\n * @param {Object} [registerOptions] The service worker options associated\n * with this instance.\n */\n constructor(scriptURL, registerOptions = {}) {\n super();\n\n this._scriptURL = scriptURL;\n this._registerOptions = registerOptions;\n this._updateFoundCount = 0;\n\n // Deferreds we can resolve later.\n this._swDeferred = new Deferred();\n this._activeDeferred = new Deferred();\n this._controllingDeferred = new Deferred();\n\n // Bind event handler callbacks.\n this._onMessage = this._onMessage.bind(this);\n this._onStateChange = this._onStateChange.bind(this);\n this._onUpdateFound = this._onUpdateFound.bind(this);\n this._onControllerChange = this._onControllerChange.bind(this);\n }\n\n /**\n * Registers a service worker for this instances script URL and service\n * worker options. By default this method delays registration until after\n * the window has loaded.\n *\n * @param {Object} [options]\n * @param {Function} [options.immediate=false] Setting this to true will\n * register the service worker immediately, even if the window has\n * not loaded (not recommended).\n */\n async register({immediate = false} = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (this._registrationTime) {\n logger.error('Cannot re-register a Workbox instance after it has ' +\n 'been registered. Create a new instance instead.');\n return;\n }\n }\n\n if (!immediate && document.readyState !== 'complete') {\n await new Promise((res) => addEventListener('load', res));\n }\n\n // Set this flag to true if any service worker was controlling the page\n // at registration time.\n this._isUpdate = Boolean(navigator.serviceWorker.controller);\n\n // Before registering, attempt to determine if a SW is already controlling\n // the page, and if that SW script (and version, if specified) matches this\n // instance's script.\n this._compatibleControllingSW = this._getControllingSWIfCompatible();\n\n this._registration = await this._registerScript();\n\n // If we have a compatible controller, store the controller as the \"own\"\n // SW, resolve active/controlling deferreds and add necessary listeners.\n if (this._compatibleControllingSW) {\n this._sw = this._compatibleControllingSW;\n this._activeDeferred.resolve(this._compatibleControllingSW);\n this._controllingDeferred.resolve(this._compatibleControllingSW);\n\n this._reportWindowReady(this._compatibleControllingSW);\n this._compatibleControllingSW.addEventListener(\n 'statechange', this._onStateChange, {once: true});\n }\n\n // If there's a waiting service worker with a matching URL before the\n // `updatefound` event fires, it likely means that this site is open\n // in another tab, or the user refreshed the page (and thus the prevoius\n // page wasn't fully unloaded before this page started loading).\n // https://developers.google.com/web/fundamentals/primers/service-workers/lifecycle#waiting\n const waitingSW = this._registration.waiting;\n if (waitingSW && urlsMatch(waitingSW.scriptURL, this._scriptURL)) {\n // Store the waiting SW as the \"own\" Sw, even if it means overwriting\n // a compatible controller.\n this._sw = waitingSW;\n\n // Run this in the next microtask, so any code that adds an event\n // listener after awaiting `register()` will get this event.\n Promise.resolve().then(() => {\n this.dispatchEvent(new WorkboxEvent('waiting', {\n sw: waitingSW,\n wasWaitingBeforeRegister: true,\n }));\n if (process.env.NODE_ENV !== 'production') {\n logger.warn('A service worker was already waiting to activate ' +\n 'before this script was registered...');\n }\n });\n }\n\n // If an \"own\" SW is already set, resolve the deferred.\n if (this._sw) {\n this._swDeferred.resolve(this._sw);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Successfully registered service worker.', this._scriptURL);\n\n if (navigator.serviceWorker.controller) {\n if (this._compatibleControllingSW) {\n logger.debug('A service worker with the same script URL ' +\n 'is already controlling this page.');\n } else {\n logger.debug('A service worker with a different script URL is ' +\n 'currently controlling the page. The browser is now fetching ' +\n 'the new script now...');\n }\n }\n\n const currentPageIsOutOfScope = () => {\n const scopeURL = new URL(\n this._registerOptions.scope || this._scriptURL, document.baseURI);\n const scopeURLBasePath = new URL('./', scopeURL.href).pathname;\n return !location.pathname.startsWith(scopeURLBasePath);\n };\n if (currentPageIsOutOfScope()) {\n logger.warn('The current page is not in scope for the registered ' +\n 'service worker. Was this a mistake?');\n }\n }\n\n this._registration.addEventListener('updatefound', this._onUpdateFound);\n navigator.serviceWorker.addEventListener(\n 'controllerchange', this._onControllerChange, {once: true});\n\n // Add message listeners.\n if ('BroadcastChannel' in self) {\n this._broadcastChannel = new BroadcastChannel('workbox');\n this._broadcastChannel.addEventListener('message', this._onMessage);\n }\n navigator.serviceWorker.addEventListener('message', this._onMessage);\n\n return this._registration;\n }\n\n /**\n * Resolves to the service worker registered by this instance as soon as it\n * is active. If a service worker was already controlling at registration\n * time then it will resolve to that if the script URLs (and optionally\n * script versions) match, otherwise it will wait until an update is found\n * and activates.\n *\n * @return {Promise}\n */\n get active() {\n return this._activeDeferred.promise;\n }\n\n /**\n * Resolves to the service worker registered by this instance as soon as it\n * is controlling the page. If a service worker was already controlling at\n * registration time then it will resolve to that if the script URLs (and\n * optionally script versions) match, otherwise it will wait until an update\n * is found and starts controlling the page.\n * Note: the first time a service worker is installed it will active but\n * not start controlling the page unless `clients.claim()` is called in the\n * service worker.\n *\n * @return {Promise}\n */\n get controlling() {\n return this._controllingDeferred.promise;\n }\n\n /**\n * Resolves with a reference to a service worker that matches the script URL\n * of this instance, as soon as it's available.\n *\n * If, at registration time, there's already an active or waiting service\n * worker with a matching script URL, it will be used (with the waiting\n * service worker taking precedence over the active service worker if both\n * match, since the waiting service worker would have been registered more\n * recently).\n * If there's no matching active or waiting service worker at registration\n * time then the promise will not resolve until an update is found and starts\n * installing, at which point the installing service worker is used.\n *\n * @return {Promise}\n */\n async getSW() {\n // If `this._sw` is set, resolve with that as we want `getSW()` to\n // return the correct (new) service worker if an update is found.\n return this._sw || this._swDeferred.promise;\n }\n\n /**\n * Sends the passed data object to the service worker registered by this\n * instance (via [`getSW()`]{@link module:workbox-window.Workbox#getSW}) and resolves\n * with a response (if any).\n *\n * A response can be set in a message handler in the service worker by\n * calling `event.ports[0].postMessage(...)`, which will resolve the promise\n * returned by `messageSW()`. If no response is set, the promise will never\n * resolve.\n *\n * @param {Object} data An object to send to the service worker\n * @return {Promise}\n */\n async messageSW(data) {\n const sw = await this.getSW();\n return messageSW(sw, data);\n }\n\n /**\n * Checks for a service worker already controlling the page and returns\n * it if its script URL matchs.\n *\n * @private\n * @return {ServiceWorker|undefined}\n */\n _getControllingSWIfCompatible() {\n const controller = navigator.serviceWorker.controller;\n if (controller && urlsMatch(controller.scriptURL, this._scriptURL)) {\n return controller;\n }\n }\n\n /**\n * Registers a service worker for this instances script URL and register\n * options and tracks the time registration was complete.\n *\n * @private\n */\n async _registerScript() {\n try {\n const reg = await navigator.serviceWorker.register(\n this._scriptURL, this._registerOptions);\n\n // Keep track of when registration happened, so it can be used in the\n // `this._onUpdateFound` heuristic. Also use the presence of this\n // property as a way to see if `.register()` has been called.\n this._registrationTime = performance.now();\n\n return reg;\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.error(error);\n }\n // Re-throw the error.\n throw error;\n }\n }\n\n\n /**\n * Sends a message to the passed service worker that the window is ready.\n *\n * @param {ServiceWorker} sw\n * @private\n */\n _reportWindowReady(sw) {\n messageSW(sw, {\n type: 'WINDOW_READY',\n meta: 'workbox-window',\n });\n }\n\n /**\n * @private\n */\n _onUpdateFound() {\n const installingSW = this._registration.installing;\n\n // If the script URL passed to `navigator.serviceWorker.register()` is\n // different from the current controlling SW's script URL, we know any\n // successful registration calls will trigger an `updatefound` event.\n // But if the registered script URL is the same as the current controlling\n // SW's script URL, we'll only get an `updatefound` event if the file\n // changed since it was last registered. This can be a problem if the user\n // opens up the same page in a different tab, and that page registers\n // a SW that triggers an update. It's a problem because this page has no\n // good way of knowing whether the `updatefound` event came from the SW\n // script it registered or from a registration attempt made by a newer\n // version of the page running in another tab.\n // To minimize the possibility of a false positive, we use the logic here:\n let updateLikelyTriggeredExternally =\n // Since we enforce only calling `register()` once, and since we don't\n // add the `updatefound` event listener until the `register()` call, if\n // `_updateFoundCount` is > 0 then it means this method has already\n // been called, thus this SW must be external\n this._updateFoundCount > 0 ||\n // If the script URL of the installing SW is different from this\n // instance's script URL, we know it's definitely not from our\n // registration.\n !urlsMatch(installingSW.scriptURL, this._scriptURL) ||\n // If all of the above are false, then we use a time-based heuristic:\n // Any `updatefound` event that occurs long after our registration is\n // assumed to be external.\n (performance.now() >\n this._registrationTime + REGISTRATION_TIMEOUT_DURATION) ?\n // If any of the above are not true, we assume the update was\n // triggered by this instance.\n true : false;\n\n if (updateLikelyTriggeredExternally) {\n this._externalSW = installingSW;\n this._registration.removeEventListener(\n 'updatefound', this._onUpdateFound);\n } else {\n // If the update was not triggered externally we know the installing\n // SW is the one we registered, so we set it.\n this._sw = installingSW;\n this._swDeferred.resolve(installingSW);\n\n // The `installing` state isn't something we have a dedicated\n // callback for, but we do log messages for it in development.\n if (process.env.NODE_ENV !== 'production') {\n if (navigator.serviceWorker.controller) {\n logger.log('Updated service worker found. Installing now...');\n } else {\n logger.log('Service worker is installing...');\n }\n }\n }\n\n // Increment the `updatefound` count, so future invocations of this\n // method can be sure they were triggered externally.\n ++this._updateFoundCount;\n\n // Add a `statechange` listener regardless of whether this update was\n // triggered externally, since we have callbacks for both.\n installingSW.addEventListener('statechange', this._onStateChange);\n }\n\n /**\n * @private\n * @param {Event} originalEvent\n */\n _onStateChange(originalEvent) {\n const sw = originalEvent.target;\n const {state} = sw;\n const isExternal = sw === this._externalSW;\n const eventPrefix = isExternal ? 'external' : '';\n\n const eventProps = {sw, originalEvent};\n if (!isExternal && this._isUpdate) {\n eventProps.isUpdate = true;\n }\n\n this.dispatchEvent(new WorkboxEvent(\n eventPrefix + state, eventProps));\n\n if (state === 'installed') {\n // This timeout is used to ignore cases where the service worker calls\n // `skipWaiting()` in the install event, thus moving it directly in the\n // activating state. (Since all service workers *must* go through the\n // waiting phase, the only way to detect `skipWaiting()` called in the\n // install event is to observe that the time spent in the waiting phase\n // is very short.)\n // NOTE: we don't need separate timeouts for the own and external SWs\n // since they can't go through these phases at the same time.\n this._waitingTimeout = setTimeout(() => {\n // Ensure the SW is still waiting (it may now be redundant).\n if (state === 'installed' && this._registration.waiting === sw) {\n this.dispatchEvent(new WorkboxEvent(\n eventPrefix + 'waiting', eventProps));\n\n if (process.env.NODE_ENV !== 'production') {\n if (isExternal) {\n logger.warn('An external service worker has installed but is ' +\n 'waiting for this client to close before activating...');\n } else {\n logger.warn('The service worker has installed but is waiting ' +\n 'for existing clients to close before activating...');\n }\n }\n }\n }, WAITING_TIMEOUT_DURATION);\n } else if (state === 'activating') {\n clearTimeout(this._waitingTimeout);\n if (!isExternal) {\n this._activeDeferred.resolve(sw);\n }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n switch (state) {\n case 'installed':\n if (isExternal) {\n logger.warn('An external service worker has installed. ' +\n 'You may want to suggest users reload this page.');\n } else {\n logger.log('Registered service worker installed.');\n }\n break;\n case 'activated':\n if (isExternal) {\n logger.warn('An external service worker has activated.');\n } else {\n logger.log('Registered service worker activated.');\n if (sw !== navigator.serviceWorker.controller) {\n logger.warn('The registered service worker is active but ' +\n 'not yet controlling the page. Reload or run ' +\n '`clients.claim()` in the service worker.');\n }\n }\n break;\n case 'redundant':\n if (sw === this._compatibleControllingSW) {\n logger.log('Previously controlling service worker now redundant!');\n } else if (!isExternal) {\n logger.log('Registered service worker now redundant!');\n }\n break;\n }\n }\n }\n\n /**\n * @private\n * @param {Event} originalEvent\n */\n _onControllerChange(originalEvent) {\n const sw = this._sw;\n if (sw === navigator.serviceWorker.controller) {\n this.dispatchEvent(new WorkboxEvent('controlling', {sw, originalEvent}));\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Registered service worker now controlling this page.');\n }\n this._controllingDeferred.resolve(sw);\n }\n }\n\n /**\n * @private\n * @param {Event} originalEvent\n */\n _onMessage(originalEvent) {\n const {data} = originalEvent;\n this.dispatchEvent(new WorkboxEvent('message', {data, originalEvent}));\n }\n}\n\n// The jsdoc comments below outline the events this instance may dispatch:\n// -----------------------------------------------------------------------\n\n/**\n * The `message` event is dispatched any time a `postMessage` (or a\n * `BroadcastChannel` message with the `workbox` channel name) is received.\n *\n * @event module:workbox-window.Workbox#message\n * @type {WorkboxEvent}\n * @property {*} data The `data` property from the original `message` event.\n * @property {Event} originalEvent The original [`message`]{@link https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent}\n * event.\n * @property {string} type `message`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `installed` event is dispatched if the state of a\n * [`Workbox`]{@link module:workbox-window.Workbox} instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}\n * changes to `installed`.\n *\n * Then can happen either the very first time a service worker is installed,\n * or after an update to the current service worker is found. In the case\n * of an update being found, the event's `isUpdate` property will be `true`.\n *\n * @event module:workbox-window.Workbox#installed\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this `Workbox` instance called `register()`.\n * @property {string} type `installed`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `waiting` event is dispatched if the state of a\n * [`Workbox`]{@link module:workbox-window.Workbox} instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}\n * changes to `installed` and then doesn't immediately change to `activating`.\n * It may also be dispatched if a service worker with the same\n * [`scriptURL`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/scriptURL}\n * was already waiting when the [`register()`]{@link module:workbox-window.Workbox#register}\n * method was called.\n *\n * @event module:workbox-window.Workbox#waiting\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The native `controllerchange` event\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this `Workbox` instance called `register()`.\n * @property {boolean|undefined} wasWaitingBeforeRegister True if a service worker with\n * a matching `scriptURL` was already waiting when this `Workbox`\n * instance called `register()`.\n * @property {string} type `waiting`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `controlling` event is dispatched if a\n * [`controllerchange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/oncontrollerchange}\n * fires on the service worker [container]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer}\n * and the [`scriptURL`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/scriptURL}\n * of the new [controller]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/controller}\n * matches the `scriptURL` of the `Workbox` instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}.\n *\n * @event module:workbox-window.Workbox#controlling\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`controllerchange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/oncontrollerchange}\n * event.\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this service worker was registered.\n * @property {string} type `controlling`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `activated` event is dispatched if the state of a\n * [`Workbox`]{@link module:workbox-window.Workbox} instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}\n * changes to `activated`.\n *\n * @event module:workbox-window.Workbox#activated\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this `Workbox` instance called `register()`.\n * @property {string} type `activated`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `redundant` event is dispatched if the state of a\n * [`Workbox`]{@link module:workbox-window.Workbox} instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}\n * changes to `redundant`.\n *\n * @event module:workbox-window.Workbox#redundant\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this `Workbox` instance called `register()`.\n * @property {string} type `redundant`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `externalinstalled` event is dispatched if the state of an\n * [external service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-external-sw}\n * changes to `installed`.\n *\n * @event module:workbox-window.Workbox#externalinstalled\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {string} type `externalinstalled`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `externalwaiting` event is dispatched if the state of an\n * [external service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-external-sw}\n * changes to `waiting`.\n *\n * @event module:workbox-window.Workbox#externalwaiting\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event|undefined} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {string} type `externalwaiting`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `externalactivated` event is dispatched if the state of an\n * [external service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-external-sw}\n * changes to `activated`.\n *\n * @event module:workbox-window.Workbox#externalactivated\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {string} type `externalactivated`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\nexport {Workbox};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {messageSW} from './messageSW.mjs';\nimport {Workbox} from './Workbox.mjs';\nimport './_version.mjs';\n\n\n/**\n * @module workbox-window\n */\nexport {\n Workbox,\n messageSW,\n};\n"],"names":["self","_","e","messageSW","sw","data","Promise","resolve","messageChannel","MessageChannel","port1","onmessage","evt","postMessage","port2","Deferred","promise","reject","logger","process","inGroup","methodToColorMap","debug","log","warn","error","groupCollapsed","groupEnd","print","method","args","test","navigator","userAgent","console","styles","logPrefix","join","api","Object","keys","EventTargetShim","_eventListenerRegistry","addEventListener","type","listener","_getEventListenersByType","add","removeEventListener","delete","dispatchEvent","event","target","forEach","Set","urlsMatch","url1","url2","URL","location","href","WorkboxEvent","props","assign","body","recover","result","then","f","i","arguments","length","apply","value","direct","WAITING_TIMEOUT_DURATION","REGISTRATION_TIMEOUT_DURATION","Workbox","scriptURL","registerOptions","_scriptURL","_registerOptions","_updateFoundCount","_swDeferred","_activeDeferred","_controllingDeferred","_onMessage","bind","_onStateChange","_onUpdateFound","_onControllerChange","register","immediate","_registrationTime","document","readyState","res","_isUpdate","Boolean","serviceWorker","controller","_compatibleControllingSW","_getControllingSWIfCompatible","_registerScript","_registration","_sw","_reportWindowReady","once","waitingSW","waiting","wasWaitingBeforeRegister","currentPageIsOutOfScope","scopeURL","scope","baseURI","scopeURLBasePath","pathname","startsWith","_broadcastChannel","BroadcastChannel","getSW","reg","performance","now","meta","installingSW","installing","updateLikelyTriggeredExternally","_externalSW","originalEvent","state","isExternal","eventPrefix","eventProps","isUpdate","_waitingTimeout","setTimeout","clearTimeout"],"mappings":"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"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-window.prod.es5.mjs b/workbox-v4.3.1/workbox-window.prod.es5.mjs new file mode 100644 index 00000000..7d15b620 --- /dev/null +++ b/workbox-v4.3.1/workbox-window.prod.es5.mjs @@ -0,0 +1,2 @@ +try{self["workbox:window:4.3.1"]&&_()}catch(n){}var n=function(n,t){return new Promise(function(i){var e=new MessageChannel;e.port1.onmessage=function(n){return i(n.data)},n.postMessage(t,[e.port2])})};function t(n,t){for(var i=0;i0||!r(n.scriptURL,this.t)||performance.now()>this.L+6e4?(this.W=n,this.B.removeEventListener("updatefound",this.g)):(this.O=n,this.u.resolve(n)),++this.o,n.addEventListener("statechange",this.l)},d.l=function(n){var t=this,i=n.target,e=i.state,r=i===this.W,u=r?"external":"",a={sw:i,originalEvent:n};!r&&this.p&&(a.isUpdate=!0),this.dispatchEvent(new o(u+e,a)),"installed"===e?this._=setTimeout(function(){"installed"===e&&t.B.waiting===i&&t.dispatchEvent(new o(u+"waiting",a))},200):"activating"===e&&(clearTimeout(this._),r||this.s.resolve(i))},d.m=function(n){var t=this.O;t===navigator.serviceWorker.controller&&(this.dispatchEvent(new o("controlling",{sw:t,originalEvent:n})),this.h.resolve(t))},d.v=function(n){var t=n.data;this.dispatchEvent(new o("message",{data:t,originalEvent:n}))},l=v,(w=[{key:"active",get:function(){return this.s.promise}},{key:"controlling",get:function(){return this.h.promise}}])&&t(l.prototype,w),g&&t(l,g),v}(function(){function n(){this.D={}}var t=n.prototype;return t.addEventListener=function(n,t){this.T(n).add(t)},t.removeEventListener=function(n,t){this.T(n).delete(t)},t.dispatchEvent=function(n){n.target=this,this.T(n.type).forEach(function(t){return t(n)})},t.T=function(n){return this.D[n]=this.D[n]||new Set},n}());export{c as Workbox,n as messageSW}; +//# sourceMappingURL=workbox-window.prod.es5.mjs.map diff --git a/workbox-v4.3.1/workbox-window.prod.es5.mjs.map b/workbox-v4.3.1/workbox-window.prod.es5.mjs.map new file mode 100644 index 00000000..d7e18f76 --- /dev/null +++ b/workbox-v4.3.1/workbox-window.prod.es5.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-window.prod.es5.mjs","sources":["../_version.mjs","../messageSW.mjs","../../workbox-core/_version.mjs","../../workbox-core/_private/Deferred.mjs","../utils/urlsMatch.mjs","../utils/WorkboxEvent.mjs","../Workbox.mjs","../utils/EventTargetShim.mjs"],"sourcesContent":["try{self['workbox:window:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport './_version.mjs';\n\n\n/**\n * Sends a data object to a service worker via `postMessage` and resolves with\n * a response (if any).\n *\n * A response can be set in a message handler in the service worker by\n * calling `event.ports[0].postMessage(...)`, which will resolve the promise\n * returned by `messageSW()`. If no response is set, the promise will not\n * resolve.\n *\n * @param {ServiceWorker} sw The service worker to send the message to.\n * @param {Object} data An object to send to the service worker.\n * @return {Promise}\n *\n * @memberof module:workbox-window\n */\nconst messageSW = (sw, data) => {\n return new Promise((resolve) => {\n let messageChannel = new MessageChannel();\n messageChannel.port1.onmessage = (evt) => resolve(evt.data);\n sw.postMessage(data, [messageChannel.port2]);\n });\n};\n\nexport {messageSW};\n","try{self['workbox:core:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n/**\n * The Deferred class composes Promises in a way that allows for them to be\n * resolved or rejected from outside the constructor. In most cases promises\n * should be used directly, but Deferreds can be necessary when the logic to\n * resolve a promise must be separate.\n *\n * @private\n */\nexport class Deferred {\n /**\n * Creates a promise and exposes its resolve and reject functions as methods.\n */\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n}\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n/**\n * Returns true if two URLs have the same `.href` property. The URLS can be\n * relative, and if they are the current location href is used to resolve URLs.\n *\n * @private\n * @param {string} url1\n * @param {string} url2\n * @return {boolean}\n */\nconst urlsMatch = (url1, url2) => {\n return new URL(url1, location).href === new URL(url2, location).href;\n};\n\nexport {urlsMatch};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n/**\n * A minimal `Event` subclass shim.\n * This doesn't *actually* subclass `Event` because not all browsers support\n * constructable `EventTarget`, and using a real `Event` will error.\n * @private\n */\nclass WorkboxEvent {\n /**\n * @param {string} type\n * @param {Object} props\n */\n constructor(type, props) {\n Object.assign(this, props, {type});\n }\n}\n\nexport {WorkboxEvent};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {Deferred} from 'workbox-core/_private/Deferred.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {messageSW} from './messageSW.mjs';\nimport {EventTargetShim} from './utils/EventTargetShim.mjs';\nimport {urlsMatch} from './utils/urlsMatch.mjs';\nimport {WorkboxEvent} from './utils/WorkboxEvent.mjs';\nimport './_version.mjs';\n\n\n// The time a SW must be in the waiting phase before we can conclude\n// `skipWaiting()` wasn't called. This 200 amount wasn't scientifically\n// chosen, but it seems to avoid false positives in my testing.\nconst WAITING_TIMEOUT_DURATION = 200;\n\n// The amount of time after a registration that we can reasonably conclude\n// that the registration didn't trigger an update.\nconst REGISTRATION_TIMEOUT_DURATION = 60000;\n\n/**\n * A class to aid in handling service worker registration, updates, and\n * reacting to service worker lifecycle events.\n *\n * @fires [message]{@link module:workbox-window.Workbox#message}\n * @fires [installed]{@link module:workbox-window.Workbox#installed}\n * @fires [waiting]{@link module:workbox-window.Workbox#waiting}\n * @fires [controlling]{@link module:workbox-window.Workbox#controlling}\n * @fires [activated]{@link module:workbox-window.Workbox#activated}\n * @fires [redundant]{@link module:workbox-window.Workbox#redundant}\n * @fires [externalinstalled]{@link module:workbox-window.Workbox#externalinstalled}\n * @fires [externalwaiting]{@link module:workbox-window.Workbox#externalwaiting}\n * @fires [externalactivated]{@link module:workbox-window.Workbox#externalactivated}\n *\n * @memberof module:workbox-window\n */\nclass Workbox extends EventTargetShim {\n /**\n * Creates a new Workbox instance with a script URL and service worker\n * options. The script URL and options are the same as those used when\n * calling `navigator.serviceWorker.register(scriptURL, options)`. See:\n * https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/register\n *\n * @param {string} scriptURL The service worker script associated with this\n * instance.\n * @param {Object} [registerOptions] The service worker options associated\n * with this instance.\n */\n constructor(scriptURL, registerOptions = {}) {\n super();\n\n this._scriptURL = scriptURL;\n this._registerOptions = registerOptions;\n this._updateFoundCount = 0;\n\n // Deferreds we can resolve later.\n this._swDeferred = new Deferred();\n this._activeDeferred = new Deferred();\n this._controllingDeferred = new Deferred();\n\n // Bind event handler callbacks.\n this._onMessage = this._onMessage.bind(this);\n this._onStateChange = this._onStateChange.bind(this);\n this._onUpdateFound = this._onUpdateFound.bind(this);\n this._onControllerChange = this._onControllerChange.bind(this);\n }\n\n /**\n * Registers a service worker for this instances script URL and service\n * worker options. By default this method delays registration until after\n * the window has loaded.\n *\n * @param {Object} [options]\n * @param {Function} [options.immediate=false] Setting this to true will\n * register the service worker immediately, even if the window has\n * not loaded (not recommended).\n */\n async register({immediate = false} = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (this._registrationTime) {\n logger.error('Cannot re-register a Workbox instance after it has ' +\n 'been registered. Create a new instance instead.');\n return;\n }\n }\n\n if (!immediate && document.readyState !== 'complete') {\n await new Promise((res) => addEventListener('load', res));\n }\n\n // Set this flag to true if any service worker was controlling the page\n // at registration time.\n this._isUpdate = Boolean(navigator.serviceWorker.controller);\n\n // Before registering, attempt to determine if a SW is already controlling\n // the page, and if that SW script (and version, if specified) matches this\n // instance's script.\n this._compatibleControllingSW = this._getControllingSWIfCompatible();\n\n this._registration = await this._registerScript();\n\n // If we have a compatible controller, store the controller as the \"own\"\n // SW, resolve active/controlling deferreds and add necessary listeners.\n if (this._compatibleControllingSW) {\n this._sw = this._compatibleControllingSW;\n this._activeDeferred.resolve(this._compatibleControllingSW);\n this._controllingDeferred.resolve(this._compatibleControllingSW);\n\n this._reportWindowReady(this._compatibleControllingSW);\n this._compatibleControllingSW.addEventListener(\n 'statechange', this._onStateChange, {once: true});\n }\n\n // If there's a waiting service worker with a matching URL before the\n // `updatefound` event fires, it likely means that this site is open\n // in another tab, or the user refreshed the page (and thus the prevoius\n // page wasn't fully unloaded before this page started loading).\n // https://developers.google.com/web/fundamentals/primers/service-workers/lifecycle#waiting\n const waitingSW = this._registration.waiting;\n if (waitingSW && urlsMatch(waitingSW.scriptURL, this._scriptURL)) {\n // Store the waiting SW as the \"own\" Sw, even if it means overwriting\n // a compatible controller.\n this._sw = waitingSW;\n\n // Run this in the next microtask, so any code that adds an event\n // listener after awaiting `register()` will get this event.\n Promise.resolve().then(() => {\n this.dispatchEvent(new WorkboxEvent('waiting', {\n sw: waitingSW,\n wasWaitingBeforeRegister: true,\n }));\n if (process.env.NODE_ENV !== 'production') {\n logger.warn('A service worker was already waiting to activate ' +\n 'before this script was registered...');\n }\n });\n }\n\n // If an \"own\" SW is already set, resolve the deferred.\n if (this._sw) {\n this._swDeferred.resolve(this._sw);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Successfully registered service worker.', this._scriptURL);\n\n if (navigator.serviceWorker.controller) {\n if (this._compatibleControllingSW) {\n logger.debug('A service worker with the same script URL ' +\n 'is already controlling this page.');\n } else {\n logger.debug('A service worker with a different script URL is ' +\n 'currently controlling the page. The browser is now fetching ' +\n 'the new script now...');\n }\n }\n\n const currentPageIsOutOfScope = () => {\n const scopeURL = new URL(\n this._registerOptions.scope || this._scriptURL, document.baseURI);\n const scopeURLBasePath = new URL('./', scopeURL.href).pathname;\n return !location.pathname.startsWith(scopeURLBasePath);\n };\n if (currentPageIsOutOfScope()) {\n logger.warn('The current page is not in scope for the registered ' +\n 'service worker. Was this a mistake?');\n }\n }\n\n this._registration.addEventListener('updatefound', this._onUpdateFound);\n navigator.serviceWorker.addEventListener(\n 'controllerchange', this._onControllerChange, {once: true});\n\n // Add message listeners.\n if ('BroadcastChannel' in self) {\n this._broadcastChannel = new BroadcastChannel('workbox');\n this._broadcastChannel.addEventListener('message', this._onMessage);\n }\n navigator.serviceWorker.addEventListener('message', this._onMessage);\n\n return this._registration;\n }\n\n /**\n * Resolves to the service worker registered by this instance as soon as it\n * is active. If a service worker was already controlling at registration\n * time then it will resolve to that if the script URLs (and optionally\n * script versions) match, otherwise it will wait until an update is found\n * and activates.\n *\n * @return {Promise}\n */\n get active() {\n return this._activeDeferred.promise;\n }\n\n /**\n * Resolves to the service worker registered by this instance as soon as it\n * is controlling the page. If a service worker was already controlling at\n * registration time then it will resolve to that if the script URLs (and\n * optionally script versions) match, otherwise it will wait until an update\n * is found and starts controlling the page.\n * Note: the first time a service worker is installed it will active but\n * not start controlling the page unless `clients.claim()` is called in the\n * service worker.\n *\n * @return {Promise}\n */\n get controlling() {\n return this._controllingDeferred.promise;\n }\n\n /**\n * Resolves with a reference to a service worker that matches the script URL\n * of this instance, as soon as it's available.\n *\n * If, at registration time, there's already an active or waiting service\n * worker with a matching script URL, it will be used (with the waiting\n * service worker taking precedence over the active service worker if both\n * match, since the waiting service worker would have been registered more\n * recently).\n * If there's no matching active or waiting service worker at registration\n * time then the promise will not resolve until an update is found and starts\n * installing, at which point the installing service worker is used.\n *\n * @return {Promise}\n */\n async getSW() {\n // If `this._sw` is set, resolve with that as we want `getSW()` to\n // return the correct (new) service worker if an update is found.\n return this._sw || this._swDeferred.promise;\n }\n\n /**\n * Sends the passed data object to the service worker registered by this\n * instance (via [`getSW()`]{@link module:workbox-window.Workbox#getSW}) and resolves\n * with a response (if any).\n *\n * A response can be set in a message handler in the service worker by\n * calling `event.ports[0].postMessage(...)`, which will resolve the promise\n * returned by `messageSW()`. If no response is set, the promise will never\n * resolve.\n *\n * @param {Object} data An object to send to the service worker\n * @return {Promise}\n */\n async messageSW(data) {\n const sw = await this.getSW();\n return messageSW(sw, data);\n }\n\n /**\n * Checks for a service worker already controlling the page and returns\n * it if its script URL matchs.\n *\n * @private\n * @return {ServiceWorker|undefined}\n */\n _getControllingSWIfCompatible() {\n const controller = navigator.serviceWorker.controller;\n if (controller && urlsMatch(controller.scriptURL, this._scriptURL)) {\n return controller;\n }\n }\n\n /**\n * Registers a service worker for this instances script URL and register\n * options and tracks the time registration was complete.\n *\n * @private\n */\n async _registerScript() {\n try {\n const reg = await navigator.serviceWorker.register(\n this._scriptURL, this._registerOptions);\n\n // Keep track of when registration happened, so it can be used in the\n // `this._onUpdateFound` heuristic. Also use the presence of this\n // property as a way to see if `.register()` has been called.\n this._registrationTime = performance.now();\n\n return reg;\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.error(error);\n }\n // Re-throw the error.\n throw error;\n }\n }\n\n\n /**\n * Sends a message to the passed service worker that the window is ready.\n *\n * @param {ServiceWorker} sw\n * @private\n */\n _reportWindowReady(sw) {\n messageSW(sw, {\n type: 'WINDOW_READY',\n meta: 'workbox-window',\n });\n }\n\n /**\n * @private\n */\n _onUpdateFound() {\n const installingSW = this._registration.installing;\n\n // If the script URL passed to `navigator.serviceWorker.register()` is\n // different from the current controlling SW's script URL, we know any\n // successful registration calls will trigger an `updatefound` event.\n // But if the registered script URL is the same as the current controlling\n // SW's script URL, we'll only get an `updatefound` event if the file\n // changed since it was last registered. This can be a problem if the user\n // opens up the same page in a different tab, and that page registers\n // a SW that triggers an update. It's a problem because this page has no\n // good way of knowing whether the `updatefound` event came from the SW\n // script it registered or from a registration attempt made by a newer\n // version of the page running in another tab.\n // To minimize the possibility of a false positive, we use the logic here:\n let updateLikelyTriggeredExternally =\n // Since we enforce only calling `register()` once, and since we don't\n // add the `updatefound` event listener until the `register()` call, if\n // `_updateFoundCount` is > 0 then it means this method has already\n // been called, thus this SW must be external\n this._updateFoundCount > 0 ||\n // If the script URL of the installing SW is different from this\n // instance's script URL, we know it's definitely not from our\n // registration.\n !urlsMatch(installingSW.scriptURL, this._scriptURL) ||\n // If all of the above are false, then we use a time-based heuristic:\n // Any `updatefound` event that occurs long after our registration is\n // assumed to be external.\n (performance.now() >\n this._registrationTime + REGISTRATION_TIMEOUT_DURATION) ?\n // If any of the above are not true, we assume the update was\n // triggered by this instance.\n true : false;\n\n if (updateLikelyTriggeredExternally) {\n this._externalSW = installingSW;\n this._registration.removeEventListener(\n 'updatefound', this._onUpdateFound);\n } else {\n // If the update was not triggered externally we know the installing\n // SW is the one we registered, so we set it.\n this._sw = installingSW;\n this._swDeferred.resolve(installingSW);\n\n // The `installing` state isn't something we have a dedicated\n // callback for, but we do log messages for it in development.\n if (process.env.NODE_ENV !== 'production') {\n if (navigator.serviceWorker.controller) {\n logger.log('Updated service worker found. Installing now...');\n } else {\n logger.log('Service worker is installing...');\n }\n }\n }\n\n // Increment the `updatefound` count, so future invocations of this\n // method can be sure they were triggered externally.\n ++this._updateFoundCount;\n\n // Add a `statechange` listener regardless of whether this update was\n // triggered externally, since we have callbacks for both.\n installingSW.addEventListener('statechange', this._onStateChange);\n }\n\n /**\n * @private\n * @param {Event} originalEvent\n */\n _onStateChange(originalEvent) {\n const sw = originalEvent.target;\n const {state} = sw;\n const isExternal = sw === this._externalSW;\n const eventPrefix = isExternal ? 'external' : '';\n\n const eventProps = {sw, originalEvent};\n if (!isExternal && this._isUpdate) {\n eventProps.isUpdate = true;\n }\n\n this.dispatchEvent(new WorkboxEvent(\n eventPrefix + state, eventProps));\n\n if (state === 'installed') {\n // This timeout is used to ignore cases where the service worker calls\n // `skipWaiting()` in the install event, thus moving it directly in the\n // activating state. (Since all service workers *must* go through the\n // waiting phase, the only way to detect `skipWaiting()` called in the\n // install event is to observe that the time spent in the waiting phase\n // is very short.)\n // NOTE: we don't need separate timeouts for the own and external SWs\n // since they can't go through these phases at the same time.\n this._waitingTimeout = setTimeout(() => {\n // Ensure the SW is still waiting (it may now be redundant).\n if (state === 'installed' && this._registration.waiting === sw) {\n this.dispatchEvent(new WorkboxEvent(\n eventPrefix + 'waiting', eventProps));\n\n if (process.env.NODE_ENV !== 'production') {\n if (isExternal) {\n logger.warn('An external service worker has installed but is ' +\n 'waiting for this client to close before activating...');\n } else {\n logger.warn('The service worker has installed but is waiting ' +\n 'for existing clients to close before activating...');\n }\n }\n }\n }, WAITING_TIMEOUT_DURATION);\n } else if (state === 'activating') {\n clearTimeout(this._waitingTimeout);\n if (!isExternal) {\n this._activeDeferred.resolve(sw);\n }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n switch (state) {\n case 'installed':\n if (isExternal) {\n logger.warn('An external service worker has installed. ' +\n 'You may want to suggest users reload this page.');\n } else {\n logger.log('Registered service worker installed.');\n }\n break;\n case 'activated':\n if (isExternal) {\n logger.warn('An external service worker has activated.');\n } else {\n logger.log('Registered service worker activated.');\n if (sw !== navigator.serviceWorker.controller) {\n logger.warn('The registered service worker is active but ' +\n 'not yet controlling the page. Reload or run ' +\n '`clients.claim()` in the service worker.');\n }\n }\n break;\n case 'redundant':\n if (sw === this._compatibleControllingSW) {\n logger.log('Previously controlling service worker now redundant!');\n } else if (!isExternal) {\n logger.log('Registered service worker now redundant!');\n }\n break;\n }\n }\n }\n\n /**\n * @private\n * @param {Event} originalEvent\n */\n _onControllerChange(originalEvent) {\n const sw = this._sw;\n if (sw === navigator.serviceWorker.controller) {\n this.dispatchEvent(new WorkboxEvent('controlling', {sw, originalEvent}));\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Registered service worker now controlling this page.');\n }\n this._controllingDeferred.resolve(sw);\n }\n }\n\n /**\n * @private\n * @param {Event} originalEvent\n */\n _onMessage(originalEvent) {\n const {data} = originalEvent;\n this.dispatchEvent(new WorkboxEvent('message', {data, originalEvent}));\n }\n}\n\n// The jsdoc comments below outline the events this instance may dispatch:\n// -----------------------------------------------------------------------\n\n/**\n * The `message` event is dispatched any time a `postMessage` (or a\n * `BroadcastChannel` message with the `workbox` channel name) is received.\n *\n * @event module:workbox-window.Workbox#message\n * @type {WorkboxEvent}\n * @property {*} data The `data` property from the original `message` event.\n * @property {Event} originalEvent The original [`message`]{@link https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent}\n * event.\n * @property {string} type `message`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `installed` event is dispatched if the state of a\n * [`Workbox`]{@link module:workbox-window.Workbox} instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}\n * changes to `installed`.\n *\n * Then can happen either the very first time a service worker is installed,\n * or after an update to the current service worker is found. In the case\n * of an update being found, the event's `isUpdate` property will be `true`.\n *\n * @event module:workbox-window.Workbox#installed\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this `Workbox` instance called `register()`.\n * @property {string} type `installed`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `waiting` event is dispatched if the state of a\n * [`Workbox`]{@link module:workbox-window.Workbox} instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}\n * changes to `installed` and then doesn't immediately change to `activating`.\n * It may also be dispatched if a service worker with the same\n * [`scriptURL`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/scriptURL}\n * was already waiting when the [`register()`]{@link module:workbox-window.Workbox#register}\n * method was called.\n *\n * @event module:workbox-window.Workbox#waiting\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The native `controllerchange` event\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this `Workbox` instance called `register()`.\n * @property {boolean|undefined} wasWaitingBeforeRegister True if a service worker with\n * a matching `scriptURL` was already waiting when this `Workbox`\n * instance called `register()`.\n * @property {string} type `waiting`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `controlling` event is dispatched if a\n * [`controllerchange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/oncontrollerchange}\n * fires on the service worker [container]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer}\n * and the [`scriptURL`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/scriptURL}\n * of the new [controller]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/controller}\n * matches the `scriptURL` of the `Workbox` instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}.\n *\n * @event module:workbox-window.Workbox#controlling\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`controllerchange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/oncontrollerchange}\n * event.\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this service worker was registered.\n * @property {string} type `controlling`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `activated` event is dispatched if the state of a\n * [`Workbox`]{@link module:workbox-window.Workbox} instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}\n * changes to `activated`.\n *\n * @event module:workbox-window.Workbox#activated\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this `Workbox` instance called `register()`.\n * @property {string} type `activated`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `redundant` event is dispatched if the state of a\n * [`Workbox`]{@link module:workbox-window.Workbox} instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}\n * changes to `redundant`.\n *\n * @event module:workbox-window.Workbox#redundant\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this `Workbox` instance called `register()`.\n * @property {string} type `redundant`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `externalinstalled` event is dispatched if the state of an\n * [external service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-external-sw}\n * changes to `installed`.\n *\n * @event module:workbox-window.Workbox#externalinstalled\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {string} type `externalinstalled`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `externalwaiting` event is dispatched if the state of an\n * [external service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-external-sw}\n * changes to `waiting`.\n *\n * @event module:workbox-window.Workbox#externalwaiting\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event|undefined} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {string} type `externalwaiting`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `externalactivated` event is dispatched if the state of an\n * [external service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-external-sw}\n * changes to `activated`.\n *\n * @event module:workbox-window.Workbox#externalactivated\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {string} type `externalactivated`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\nexport {Workbox};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n/**\n * A minimal `EventTarget` shim.\n * This is necessary because not all browsers support constructable\n * `EventTarget`, so using a real `EventTarget` will error.\n * @private\n */\nclass EventTargetShim {\n /**\n * Creates an event listener registry\n *\n * @private\n */\n constructor() {\n // A registry of event types to listeners.\n this._eventListenerRegistry = {};\n }\n /**\n * @param {string} type\n * @param {Function} listener\n * @private\n */\n addEventListener(type, listener) {\n this._getEventListenersByType(type).add(listener);\n }\n\n /**\n * @param {string} type\n * @param {Function} listener\n * @private\n */\n removeEventListener(type, listener) {\n this._getEventListenersByType(type).delete(listener);\n }\n\n /**\n * @param {Event} event\n * @private\n */\n dispatchEvent(event) {\n event.target = this;\n this._getEventListenersByType(event.type).forEach(\n (listener) => listener(event));\n }\n\n /**\n * Returns a Set of listeners associated with the passed event type.\n * If no handlers have been registered, an empty Set is returned.\n *\n * @param {string} type The event type.\n * @return {Set} An array of handler functions.\n * @private\n */\n _getEventListenersByType(type) {\n return this._eventListenerRegistry[type] =\n (this._eventListenerRegistry[type] || new Set());\n }\n}\n\nexport {EventTargetShim};\n"],"names":["self","_","e","messageSW","sw","data","Promise","resolve","messageChannel","MessageChannel","port1","onmessage","evt","postMessage","port2","Deferred","promise","reject","_this","urlsMatch","url1","url2","URL","location","href","WorkboxEvent","type","props","Object","assign","this","f","args","i","arguments","length","apply","value","then","direct","Workbox","scriptURL","registerOptions","_scriptURL","_registerOptions","_updateFoundCount","_swDeferred","_activeDeferred","_controllingDeferred","_onMessage","bind","_onStateChange","_onUpdateFound","_onControllerChange","register","result","immediate","_isUpdate","Boolean","navigator","serviceWorker","controller","_compatibleControllingSW","_this2","_getControllingSWIfCompatible","_registerScript","_registration","_sw","_reportWindowReady","addEventListener","once","waitingSW","waiting","dispatchEvent","wasWaitingBeforeRegister","_broadcastChannel","BroadcastChannel","document","readyState","res","body","getSW","recover","_this5","reg","_registrationTime","performance","now","error","meta","installingSW","installing","_externalSW","removeEventListener","originalEvent","target","state","isExternal","eventPrefix","eventProps","isUpdate","_waitingTimeout","setTimeout","_this6","clearTimeout","_eventListenerRegistry","listener","_getEventListenersByType","add","delete","event","forEach","Set"],"mappings":"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"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-window.prod.mjs b/workbox-v4.3.1/workbox-window.prod.mjs new file mode 100644 index 00000000..433ab7e4 --- /dev/null +++ b/workbox-v4.3.1/workbox-window.prod.mjs @@ -0,0 +1,2 @@ +try{self["workbox:window:4.3.1"]&&_()}catch(t){}const t=(t,s)=>new Promise(i=>{let e=new MessageChannel;e.port1.onmessage=(t=>i(t.data)),t.postMessage(s,[e.port2])});try{self["workbox:core:4.3.1"]&&_()}catch(t){}class s{constructor(){this.promise=new Promise((t,s)=>{this.resolve=t,this.reject=s})}}class i{constructor(){this.t={}}addEventListener(t,s){this.s(t).add(s)}removeEventListener(t,s){this.s(t).delete(s)}dispatchEvent(t){t.target=this,this.s(t.type).forEach(s=>s(t))}s(t){return this.t[t]=this.t[t]||new Set}}const e=(t,s)=>new URL(t,location).href===new URL(s,location).href;class n{constructor(t,s){Object.assign(this,s,{type:t})}}const h=200,a=6e4;class o extends i{constructor(t,i={}){super(),this.i=t,this.h=i,this.o=0,this.l=new s,this.g=new s,this.u=new s,this.m=this.m.bind(this),this.v=this.v.bind(this),this.p=this.p.bind(this),this._=this._.bind(this)}async register({immediate:t=!1}={}){t||"complete"===document.readyState||await new Promise(t=>addEventListener("load",t)),this.C=Boolean(navigator.serviceWorker.controller),this.W=this.L(),this.S=await this.B(),this.W&&(this.R=this.W,this.g.resolve(this.W),this.u.resolve(this.W),this.P(this.W),this.W.addEventListener("statechange",this.v,{once:!0}));const s=this.S.waiting;return s&&e(s.scriptURL,this.i)&&(this.R=s,Promise.resolve().then(()=>{this.dispatchEvent(new n("waiting",{sw:s,wasWaitingBeforeRegister:!0}))})),this.R&&this.l.resolve(this.R),this.S.addEventListener("updatefound",this.p),navigator.serviceWorker.addEventListener("controllerchange",this._,{once:!0}),"BroadcastChannel"in self&&(this.T=new BroadcastChannel("workbox"),this.T.addEventListener("message",this.m)),navigator.serviceWorker.addEventListener("message",this.m),this.S}get active(){return this.g.promise}get controlling(){return this.u.promise}async getSW(){return this.R||this.l.promise}async messageSW(s){const i=await this.getSW();return t(i,s)}L(){const t=navigator.serviceWorker.controller;if(t&&e(t.scriptURL,this.i))return t}async B(){try{const t=await navigator.serviceWorker.register(this.i,this.h);return this.U=performance.now(),t}catch(t){throw t}}P(s){t(s,{type:"WINDOW_READY",meta:"workbox-window"})}p(){const t=this.S.installing;this.o>0||!e(t.scriptURL,this.i)||performance.now()>this.U+a?(this.k=t,this.S.removeEventListener("updatefound",this.p)):(this.R=t,this.l.resolve(t)),++this.o,t.addEventListener("statechange",this.v)}v(t){const s=t.target,{state:i}=s,e=s===this.k,a=e?"external":"",o={sw:s,originalEvent:t};!e&&this.C&&(o.isUpdate=!0),this.dispatchEvent(new n(a+i,o)),"installed"===i?this.D=setTimeout(()=>{"installed"===i&&this.S.waiting===s&&this.dispatchEvent(new n(a+"waiting",o))},h):"activating"===i&&(clearTimeout(this.D),e||this.g.resolve(s))}_(t){const s=this.R;s===navigator.serviceWorker.controller&&(this.dispatchEvent(new n("controlling",{sw:s,originalEvent:t})),this.u.resolve(s))}m(t){const{data:s}=t;this.dispatchEvent(new n("message",{data:s,originalEvent:t}))}}export{o as Workbox,t as messageSW}; +//# sourceMappingURL=workbox-window.prod.mjs.map diff --git a/workbox-v4.3.1/workbox-window.prod.mjs.map b/workbox-v4.3.1/workbox-window.prod.mjs.map new file mode 100644 index 00000000..e4febb09 --- /dev/null +++ b/workbox-v4.3.1/workbox-window.prod.mjs.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-window.prod.mjs","sources":["../_version.mjs","../messageSW.mjs","../../workbox-core/_version.mjs","../../workbox-core/_private/Deferred.mjs","../utils/EventTargetShim.mjs","../utils/urlsMatch.mjs","../utils/WorkboxEvent.mjs","../Workbox.mjs"],"sourcesContent":["try{self['workbox:window:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport './_version.mjs';\n\n\n/**\n * Sends a data object to a service worker via `postMessage` and resolves with\n * a response (if any).\n *\n * A response can be set in a message handler in the service worker by\n * calling `event.ports[0].postMessage(...)`, which will resolve the promise\n * returned by `messageSW()`. If no response is set, the promise will not\n * resolve.\n *\n * @param {ServiceWorker} sw The service worker to send the message to.\n * @param {Object} data An object to send to the service worker.\n * @return {Promise}\n *\n * @memberof module:workbox-window\n */\nconst messageSW = (sw, data) => {\n return new Promise((resolve) => {\n let messageChannel = new MessageChannel();\n messageChannel.port1.onmessage = (evt) => resolve(evt.data);\n sw.postMessage(data, [messageChannel.port2]);\n });\n};\n\nexport {messageSW};\n","try{self['workbox:core:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n/**\n * The Deferred class composes Promises in a way that allows for them to be\n * resolved or rejected from outside the constructor. In most cases promises\n * should be used directly, but Deferreds can be necessary when the logic to\n * resolve a promise must be separate.\n *\n * @private\n */\nexport class Deferred {\n /**\n * Creates a promise and exposes its resolve and reject functions as methods.\n */\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n}\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n/**\n * A minimal `EventTarget` shim.\n * This is necessary because not all browsers support constructable\n * `EventTarget`, so using a real `EventTarget` will error.\n * @private\n */\nclass EventTargetShim {\n /**\n * Creates an event listener registry\n *\n * @private\n */\n constructor() {\n // A registry of event types to listeners.\n this._eventListenerRegistry = {};\n }\n /**\n * @param {string} type\n * @param {Function} listener\n * @private\n */\n addEventListener(type, listener) {\n this._getEventListenersByType(type).add(listener);\n }\n\n /**\n * @param {string} type\n * @param {Function} listener\n * @private\n */\n removeEventListener(type, listener) {\n this._getEventListenersByType(type).delete(listener);\n }\n\n /**\n * @param {Event} event\n * @private\n */\n dispatchEvent(event) {\n event.target = this;\n this._getEventListenersByType(event.type).forEach(\n (listener) => listener(event));\n }\n\n /**\n * Returns a Set of listeners associated with the passed event type.\n * If no handlers have been registered, an empty Set is returned.\n *\n * @param {string} type The event type.\n * @return {Set} An array of handler functions.\n * @private\n */\n _getEventListenersByType(type) {\n return this._eventListenerRegistry[type] =\n (this._eventListenerRegistry[type] || new Set());\n }\n}\n\nexport {EventTargetShim};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n/**\n * Returns true if two URLs have the same `.href` property. The URLS can be\n * relative, and if they are the current location href is used to resolve URLs.\n *\n * @private\n * @param {string} url1\n * @param {string} url2\n * @return {boolean}\n */\nconst urlsMatch = (url1, url2) => {\n return new URL(url1, location).href === new URL(url2, location).href;\n};\n\nexport {urlsMatch};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n/**\n * A minimal `Event` subclass shim.\n * This doesn't *actually* subclass `Event` because not all browsers support\n * constructable `EventTarget`, and using a real `Event` will error.\n * @private\n */\nclass WorkboxEvent {\n /**\n * @param {string} type\n * @param {Object} props\n */\n constructor(type, props) {\n Object.assign(this, props, {type});\n }\n}\n\nexport {WorkboxEvent};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {Deferred} from 'workbox-core/_private/Deferred.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {messageSW} from './messageSW.mjs';\nimport {EventTargetShim} from './utils/EventTargetShim.mjs';\nimport {urlsMatch} from './utils/urlsMatch.mjs';\nimport {WorkboxEvent} from './utils/WorkboxEvent.mjs';\nimport './_version.mjs';\n\n\n// The time a SW must be in the waiting phase before we can conclude\n// `skipWaiting()` wasn't called. This 200 amount wasn't scientifically\n// chosen, but it seems to avoid false positives in my testing.\nconst WAITING_TIMEOUT_DURATION = 200;\n\n// The amount of time after a registration that we can reasonably conclude\n// that the registration didn't trigger an update.\nconst REGISTRATION_TIMEOUT_DURATION = 60000;\n\n/**\n * A class to aid in handling service worker registration, updates, and\n * reacting to service worker lifecycle events.\n *\n * @fires [message]{@link module:workbox-window.Workbox#message}\n * @fires [installed]{@link module:workbox-window.Workbox#installed}\n * @fires [waiting]{@link module:workbox-window.Workbox#waiting}\n * @fires [controlling]{@link module:workbox-window.Workbox#controlling}\n * @fires [activated]{@link module:workbox-window.Workbox#activated}\n * @fires [redundant]{@link module:workbox-window.Workbox#redundant}\n * @fires [externalinstalled]{@link module:workbox-window.Workbox#externalinstalled}\n * @fires [externalwaiting]{@link module:workbox-window.Workbox#externalwaiting}\n * @fires [externalactivated]{@link module:workbox-window.Workbox#externalactivated}\n *\n * @memberof module:workbox-window\n */\nclass Workbox extends EventTargetShim {\n /**\n * Creates a new Workbox instance with a script URL and service worker\n * options. The script URL and options are the same as those used when\n * calling `navigator.serviceWorker.register(scriptURL, options)`. See:\n * https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/register\n *\n * @param {string} scriptURL The service worker script associated with this\n * instance.\n * @param {Object} [registerOptions] The service worker options associated\n * with this instance.\n */\n constructor(scriptURL, registerOptions = {}) {\n super();\n\n this._scriptURL = scriptURL;\n this._registerOptions = registerOptions;\n this._updateFoundCount = 0;\n\n // Deferreds we can resolve later.\n this._swDeferred = new Deferred();\n this._activeDeferred = new Deferred();\n this._controllingDeferred = new Deferred();\n\n // Bind event handler callbacks.\n this._onMessage = this._onMessage.bind(this);\n this._onStateChange = this._onStateChange.bind(this);\n this._onUpdateFound = this._onUpdateFound.bind(this);\n this._onControllerChange = this._onControllerChange.bind(this);\n }\n\n /**\n * Registers a service worker for this instances script URL and service\n * worker options. By default this method delays registration until after\n * the window has loaded.\n *\n * @param {Object} [options]\n * @param {Function} [options.immediate=false] Setting this to true will\n * register the service worker immediately, even if the window has\n * not loaded (not recommended).\n */\n async register({immediate = false} = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (this._registrationTime) {\n logger.error('Cannot re-register a Workbox instance after it has ' +\n 'been registered. Create a new instance instead.');\n return;\n }\n }\n\n if (!immediate && document.readyState !== 'complete') {\n await new Promise((res) => addEventListener('load', res));\n }\n\n // Set this flag to true if any service worker was controlling the page\n // at registration time.\n this._isUpdate = Boolean(navigator.serviceWorker.controller);\n\n // Before registering, attempt to determine if a SW is already controlling\n // the page, and if that SW script (and version, if specified) matches this\n // instance's script.\n this._compatibleControllingSW = this._getControllingSWIfCompatible();\n\n this._registration = await this._registerScript();\n\n // If we have a compatible controller, store the controller as the \"own\"\n // SW, resolve active/controlling deferreds and add necessary listeners.\n if (this._compatibleControllingSW) {\n this._sw = this._compatibleControllingSW;\n this._activeDeferred.resolve(this._compatibleControllingSW);\n this._controllingDeferred.resolve(this._compatibleControllingSW);\n\n this._reportWindowReady(this._compatibleControllingSW);\n this._compatibleControllingSW.addEventListener(\n 'statechange', this._onStateChange, {once: true});\n }\n\n // If there's a waiting service worker with a matching URL before the\n // `updatefound` event fires, it likely means that this site is open\n // in another tab, or the user refreshed the page (and thus the prevoius\n // page wasn't fully unloaded before this page started loading).\n // https://developers.google.com/web/fundamentals/primers/service-workers/lifecycle#waiting\n const waitingSW = this._registration.waiting;\n if (waitingSW && urlsMatch(waitingSW.scriptURL, this._scriptURL)) {\n // Store the waiting SW as the \"own\" Sw, even if it means overwriting\n // a compatible controller.\n this._sw = waitingSW;\n\n // Run this in the next microtask, so any code that adds an event\n // listener after awaiting `register()` will get this event.\n Promise.resolve().then(() => {\n this.dispatchEvent(new WorkboxEvent('waiting', {\n sw: waitingSW,\n wasWaitingBeforeRegister: true,\n }));\n if (process.env.NODE_ENV !== 'production') {\n logger.warn('A service worker was already waiting to activate ' +\n 'before this script was registered...');\n }\n });\n }\n\n // If an \"own\" SW is already set, resolve the deferred.\n if (this._sw) {\n this._swDeferred.resolve(this._sw);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Successfully registered service worker.', this._scriptURL);\n\n if (navigator.serviceWorker.controller) {\n if (this._compatibleControllingSW) {\n logger.debug('A service worker with the same script URL ' +\n 'is already controlling this page.');\n } else {\n logger.debug('A service worker with a different script URL is ' +\n 'currently controlling the page. The browser is now fetching ' +\n 'the new script now...');\n }\n }\n\n const currentPageIsOutOfScope = () => {\n const scopeURL = new URL(\n this._registerOptions.scope || this._scriptURL, document.baseURI);\n const scopeURLBasePath = new URL('./', scopeURL.href).pathname;\n return !location.pathname.startsWith(scopeURLBasePath);\n };\n if (currentPageIsOutOfScope()) {\n logger.warn('The current page is not in scope for the registered ' +\n 'service worker. Was this a mistake?');\n }\n }\n\n this._registration.addEventListener('updatefound', this._onUpdateFound);\n navigator.serviceWorker.addEventListener(\n 'controllerchange', this._onControllerChange, {once: true});\n\n // Add message listeners.\n if ('BroadcastChannel' in self) {\n this._broadcastChannel = new BroadcastChannel('workbox');\n this._broadcastChannel.addEventListener('message', this._onMessage);\n }\n navigator.serviceWorker.addEventListener('message', this._onMessage);\n\n return this._registration;\n }\n\n /**\n * Resolves to the service worker registered by this instance as soon as it\n * is active. If a service worker was already controlling at registration\n * time then it will resolve to that if the script URLs (and optionally\n * script versions) match, otherwise it will wait until an update is found\n * and activates.\n *\n * @return {Promise}\n */\n get active() {\n return this._activeDeferred.promise;\n }\n\n /**\n * Resolves to the service worker registered by this instance as soon as it\n * is controlling the page. If a service worker was already controlling at\n * registration time then it will resolve to that if the script URLs (and\n * optionally script versions) match, otherwise it will wait until an update\n * is found and starts controlling the page.\n * Note: the first time a service worker is installed it will active but\n * not start controlling the page unless `clients.claim()` is called in the\n * service worker.\n *\n * @return {Promise}\n */\n get controlling() {\n return this._controllingDeferred.promise;\n }\n\n /**\n * Resolves with a reference to a service worker that matches the script URL\n * of this instance, as soon as it's available.\n *\n * If, at registration time, there's already an active or waiting service\n * worker with a matching script URL, it will be used (with the waiting\n * service worker taking precedence over the active service worker if both\n * match, since the waiting service worker would have been registered more\n * recently).\n * If there's no matching active or waiting service worker at registration\n * time then the promise will not resolve until an update is found and starts\n * installing, at which point the installing service worker is used.\n *\n * @return {Promise}\n */\n async getSW() {\n // If `this._sw` is set, resolve with that as we want `getSW()` to\n // return the correct (new) service worker if an update is found.\n return this._sw || this._swDeferred.promise;\n }\n\n /**\n * Sends the passed data object to the service worker registered by this\n * instance (via [`getSW()`]{@link module:workbox-window.Workbox#getSW}) and resolves\n * with a response (if any).\n *\n * A response can be set in a message handler in the service worker by\n * calling `event.ports[0].postMessage(...)`, which will resolve the promise\n * returned by `messageSW()`. If no response is set, the promise will never\n * resolve.\n *\n * @param {Object} data An object to send to the service worker\n * @return {Promise}\n */\n async messageSW(data) {\n const sw = await this.getSW();\n return messageSW(sw, data);\n }\n\n /**\n * Checks for a service worker already controlling the page and returns\n * it if its script URL matchs.\n *\n * @private\n * @return {ServiceWorker|undefined}\n */\n _getControllingSWIfCompatible() {\n const controller = navigator.serviceWorker.controller;\n if (controller && urlsMatch(controller.scriptURL, this._scriptURL)) {\n return controller;\n }\n }\n\n /**\n * Registers a service worker for this instances script URL and register\n * options and tracks the time registration was complete.\n *\n * @private\n */\n async _registerScript() {\n try {\n const reg = await navigator.serviceWorker.register(\n this._scriptURL, this._registerOptions);\n\n // Keep track of when registration happened, so it can be used in the\n // `this._onUpdateFound` heuristic. Also use the presence of this\n // property as a way to see if `.register()` has been called.\n this._registrationTime = performance.now();\n\n return reg;\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.error(error);\n }\n // Re-throw the error.\n throw error;\n }\n }\n\n\n /**\n * Sends a message to the passed service worker that the window is ready.\n *\n * @param {ServiceWorker} sw\n * @private\n */\n _reportWindowReady(sw) {\n messageSW(sw, {\n type: 'WINDOW_READY',\n meta: 'workbox-window',\n });\n }\n\n /**\n * @private\n */\n _onUpdateFound() {\n const installingSW = this._registration.installing;\n\n // If the script URL passed to `navigator.serviceWorker.register()` is\n // different from the current controlling SW's script URL, we know any\n // successful registration calls will trigger an `updatefound` event.\n // But if the registered script URL is the same as the current controlling\n // SW's script URL, we'll only get an `updatefound` event if the file\n // changed since it was last registered. This can be a problem if the user\n // opens up the same page in a different tab, and that page registers\n // a SW that triggers an update. It's a problem because this page has no\n // good way of knowing whether the `updatefound` event came from the SW\n // script it registered or from a registration attempt made by a newer\n // version of the page running in another tab.\n // To minimize the possibility of a false positive, we use the logic here:\n let updateLikelyTriggeredExternally =\n // Since we enforce only calling `register()` once, and since we don't\n // add the `updatefound` event listener until the `register()` call, if\n // `_updateFoundCount` is > 0 then it means this method has already\n // been called, thus this SW must be external\n this._updateFoundCount > 0 ||\n // If the script URL of the installing SW is different from this\n // instance's script URL, we know it's definitely not from our\n // registration.\n !urlsMatch(installingSW.scriptURL, this._scriptURL) ||\n // If all of the above are false, then we use a time-based heuristic:\n // Any `updatefound` event that occurs long after our registration is\n // assumed to be external.\n (performance.now() >\n this._registrationTime + REGISTRATION_TIMEOUT_DURATION) ?\n // If any of the above are not true, we assume the update was\n // triggered by this instance.\n true : false;\n\n if (updateLikelyTriggeredExternally) {\n this._externalSW = installingSW;\n this._registration.removeEventListener(\n 'updatefound', this._onUpdateFound);\n } else {\n // If the update was not triggered externally we know the installing\n // SW is the one we registered, so we set it.\n this._sw = installingSW;\n this._swDeferred.resolve(installingSW);\n\n // The `installing` state isn't something we have a dedicated\n // callback for, but we do log messages for it in development.\n if (process.env.NODE_ENV !== 'production') {\n if (navigator.serviceWorker.controller) {\n logger.log('Updated service worker found. Installing now...');\n } else {\n logger.log('Service worker is installing...');\n }\n }\n }\n\n // Increment the `updatefound` count, so future invocations of this\n // method can be sure they were triggered externally.\n ++this._updateFoundCount;\n\n // Add a `statechange` listener regardless of whether this update was\n // triggered externally, since we have callbacks for both.\n installingSW.addEventListener('statechange', this._onStateChange);\n }\n\n /**\n * @private\n * @param {Event} originalEvent\n */\n _onStateChange(originalEvent) {\n const sw = originalEvent.target;\n const {state} = sw;\n const isExternal = sw === this._externalSW;\n const eventPrefix = isExternal ? 'external' : '';\n\n const eventProps = {sw, originalEvent};\n if (!isExternal && this._isUpdate) {\n eventProps.isUpdate = true;\n }\n\n this.dispatchEvent(new WorkboxEvent(\n eventPrefix + state, eventProps));\n\n if (state === 'installed') {\n // This timeout is used to ignore cases where the service worker calls\n // `skipWaiting()` in the install event, thus moving it directly in the\n // activating state. (Since all service workers *must* go through the\n // waiting phase, the only way to detect `skipWaiting()` called in the\n // install event is to observe that the time spent in the waiting phase\n // is very short.)\n // NOTE: we don't need separate timeouts for the own and external SWs\n // since they can't go through these phases at the same time.\n this._waitingTimeout = setTimeout(() => {\n // Ensure the SW is still waiting (it may now be redundant).\n if (state === 'installed' && this._registration.waiting === sw) {\n this.dispatchEvent(new WorkboxEvent(\n eventPrefix + 'waiting', eventProps));\n\n if (process.env.NODE_ENV !== 'production') {\n if (isExternal) {\n logger.warn('An external service worker has installed but is ' +\n 'waiting for this client to close before activating...');\n } else {\n logger.warn('The service worker has installed but is waiting ' +\n 'for existing clients to close before activating...');\n }\n }\n }\n }, WAITING_TIMEOUT_DURATION);\n } else if (state === 'activating') {\n clearTimeout(this._waitingTimeout);\n if (!isExternal) {\n this._activeDeferred.resolve(sw);\n }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n switch (state) {\n case 'installed':\n if (isExternal) {\n logger.warn('An external service worker has installed. ' +\n 'You may want to suggest users reload this page.');\n } else {\n logger.log('Registered service worker installed.');\n }\n break;\n case 'activated':\n if (isExternal) {\n logger.warn('An external service worker has activated.');\n } else {\n logger.log('Registered service worker activated.');\n if (sw !== navigator.serviceWorker.controller) {\n logger.warn('The registered service worker is active but ' +\n 'not yet controlling the page. Reload or run ' +\n '`clients.claim()` in the service worker.');\n }\n }\n break;\n case 'redundant':\n if (sw === this._compatibleControllingSW) {\n logger.log('Previously controlling service worker now redundant!');\n } else if (!isExternal) {\n logger.log('Registered service worker now redundant!');\n }\n break;\n }\n }\n }\n\n /**\n * @private\n * @param {Event} originalEvent\n */\n _onControllerChange(originalEvent) {\n const sw = this._sw;\n if (sw === navigator.serviceWorker.controller) {\n this.dispatchEvent(new WorkboxEvent('controlling', {sw, originalEvent}));\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Registered service worker now controlling this page.');\n }\n this._controllingDeferred.resolve(sw);\n }\n }\n\n /**\n * @private\n * @param {Event} originalEvent\n */\n _onMessage(originalEvent) {\n const {data} = originalEvent;\n this.dispatchEvent(new WorkboxEvent('message', {data, originalEvent}));\n }\n}\n\n// The jsdoc comments below outline the events this instance may dispatch:\n// -----------------------------------------------------------------------\n\n/**\n * The `message` event is dispatched any time a `postMessage` (or a\n * `BroadcastChannel` message with the `workbox` channel name) is received.\n *\n * @event module:workbox-window.Workbox#message\n * @type {WorkboxEvent}\n * @property {*} data The `data` property from the original `message` event.\n * @property {Event} originalEvent The original [`message`]{@link https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent}\n * event.\n * @property {string} type `message`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `installed` event is dispatched if the state of a\n * [`Workbox`]{@link module:workbox-window.Workbox} instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}\n * changes to `installed`.\n *\n * Then can happen either the very first time a service worker is installed,\n * or after an update to the current service worker is found. In the case\n * of an update being found, the event's `isUpdate` property will be `true`.\n *\n * @event module:workbox-window.Workbox#installed\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this `Workbox` instance called `register()`.\n * @property {string} type `installed`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `waiting` event is dispatched if the state of a\n * [`Workbox`]{@link module:workbox-window.Workbox} instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}\n * changes to `installed` and then doesn't immediately change to `activating`.\n * It may also be dispatched if a service worker with the same\n * [`scriptURL`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/scriptURL}\n * was already waiting when the [`register()`]{@link module:workbox-window.Workbox#register}\n * method was called.\n *\n * @event module:workbox-window.Workbox#waiting\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The native `controllerchange` event\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this `Workbox` instance called `register()`.\n * @property {boolean|undefined} wasWaitingBeforeRegister True if a service worker with\n * a matching `scriptURL` was already waiting when this `Workbox`\n * instance called `register()`.\n * @property {string} type `waiting`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `controlling` event is dispatched if a\n * [`controllerchange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/oncontrollerchange}\n * fires on the service worker [container]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer}\n * and the [`scriptURL`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/scriptURL}\n * of the new [controller]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/controller}\n * matches the `scriptURL` of the `Workbox` instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}.\n *\n * @event module:workbox-window.Workbox#controlling\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`controllerchange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/oncontrollerchange}\n * event.\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this service worker was registered.\n * @property {string} type `controlling`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `activated` event is dispatched if the state of a\n * [`Workbox`]{@link module:workbox-window.Workbox} instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}\n * changes to `activated`.\n *\n * @event module:workbox-window.Workbox#activated\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this `Workbox` instance called `register()`.\n * @property {string} type `activated`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `redundant` event is dispatched if the state of a\n * [`Workbox`]{@link module:workbox-window.Workbox} instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}\n * changes to `redundant`.\n *\n * @event module:workbox-window.Workbox#redundant\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this `Workbox` instance called `register()`.\n * @property {string} type `redundant`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `externalinstalled` event is dispatched if the state of an\n * [external service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-external-sw}\n * changes to `installed`.\n *\n * @event module:workbox-window.Workbox#externalinstalled\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {string} type `externalinstalled`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `externalwaiting` event is dispatched if the state of an\n * [external service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-external-sw}\n * changes to `waiting`.\n *\n * @event module:workbox-window.Workbox#externalwaiting\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event|undefined} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {string} type `externalwaiting`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `externalactivated` event is dispatched if the state of an\n * [external service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-external-sw}\n * changes to `activated`.\n *\n * @event module:workbox-window.Workbox#externalactivated\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {string} type `externalactivated`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\nexport {Workbox};\n"],"names":["self","_","e","messageSW","sw","data","Promise","resolve","messageChannel","MessageChannel","port1","onmessage","evt","postMessage","port2","Deferred","constructor","promise","reject","EventTargetShim","_eventListenerRegistry","addEventListener","type","listener","_getEventListenersByType","add","removeEventListener","delete","dispatchEvent","event","target","this","forEach","Set","urlsMatch","url1","url2","URL","location","href","WorkboxEvent","props","Object","assign","WAITING_TIMEOUT_DURATION","REGISTRATION_TIMEOUT_DURATION","Workbox","scriptURL","registerOptions","_scriptURL","_registerOptions","_updateFoundCount","_swDeferred","_activeDeferred","_controllingDeferred","_onMessage","bind","_onStateChange","_onUpdateFound","_onControllerChange","immediate","document","readyState","res","_isUpdate","Boolean","navigator","serviceWorker","controller","_compatibleControllingSW","_getControllingSWIfCompatible","_registration","_registerScript","_sw","_reportWindowReady","once","waitingSW","waiting","then","wasWaitingBeforeRegister","_broadcastChannel","BroadcastChannel","getSW","reg","register","_registrationTime","performance","now","error","meta","installingSW","installing","_externalSW","originalEvent","state","isExternal","eventPrefix","eventProps","isUpdate","_waitingTimeout","setTimeout","clearTimeout"],"mappings":"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"} \ No newline at end of file diff --git a/workbox-v4.3.1/workbox-window.prod.umd.js b/workbox-v4.3.1/workbox-window.prod.umd.js new file mode 100644 index 00000000..173c4b43 --- /dev/null +++ b/workbox-v4.3.1/workbox-window.prod.umd.js @@ -0,0 +1,2 @@ +!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((n=n||self).workbox={})}(this,function(n){"use strict";try{self["workbox:window:4.3.1"]&&_()}catch(n){}var t=function(n,t){return new Promise(function(i){var e=new MessageChannel;e.port1.onmessage=function(n){return i(n.data)},n.postMessage(t,[e.port2])})};function i(n,t){for(var i=0;i0||!o(n.scriptURL,this.t)||performance.now()>this.C+6e4?(this.L=n,this.R.removeEventListener("updatefound",this.g)):(this._=n,this.u.resolve(n)),++this.o,n.addEventListener("statechange",this.l)},g.l=function(n){var t=this,i=n.target,e=i.state,r=i===this.L,o=r?"external":"",s={sw:i,originalEvent:n};!r&&this.p&&(s.isUpdate=!0),this.dispatchEvent(new u(o+e,s)),"installed"===e?this.W=setTimeout(function(){"installed"===e&&t.R.waiting===i&&t.dispatchEvent(new u(o+"waiting",s))},200):"activating"===e&&(clearTimeout(this.W),r||this.s.resolve(i))},g.m=function(n){var t=this._;t===navigator.serviceWorker.controller&&(this.dispatchEvent(new u("controlling",{sw:t,originalEvent:n})),this.h.resolve(t))},g.v=function(n){var t=n.data;this.dispatchEvent(new u("message",{data:t,originalEvent:n}))},l=v,(w=[{key:"active",get:function(){return this.s.promise}},{key:"controlling",get:function(){return this.h.promise}}])&&i(l.prototype,w),d&&i(l,d),v}(function(){function n(){this.D={}}var t=n.prototype;return t.addEventListener=function(n,t){this.M(n).add(t)},t.removeEventListener=function(n,t){this.M(n).delete(t)},t.dispatchEvent=function(n){n.target=this,this.M(n.type).forEach(function(t){return t(n)})},t.M=function(n){return this.D[n]=this.D[n]||new Set},n}());n.Workbox=f,n.messageSW=t,Object.defineProperty(n,"__esModule",{value:!0})}); +//# sourceMappingURL=workbox-window.prod.umd.js.map diff --git a/workbox-v4.3.1/workbox-window.prod.umd.js.map b/workbox-v4.3.1/workbox-window.prod.umd.js.map new file mode 100644 index 00000000..67eaa1d9 --- /dev/null +++ b/workbox-v4.3.1/workbox-window.prod.umd.js.map @@ -0,0 +1 @@ +{"version":3,"file":"workbox-window.prod.umd.js","sources":["../_version.mjs","../messageSW.mjs","../../workbox-core/_version.mjs","../../workbox-core/_private/Deferred.mjs","../utils/urlsMatch.mjs","../utils/WorkboxEvent.mjs","../Workbox.mjs","../utils/EventTargetShim.mjs"],"sourcesContent":["try{self['workbox:window:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport './_version.mjs';\n\n\n/**\n * Sends a data object to a service worker via `postMessage` and resolves with\n * a response (if any).\n *\n * A response can be set in a message handler in the service worker by\n * calling `event.ports[0].postMessage(...)`, which will resolve the promise\n * returned by `messageSW()`. If no response is set, the promise will not\n * resolve.\n *\n * @param {ServiceWorker} sw The service worker to send the message to.\n * @param {Object} data An object to send to the service worker.\n * @return {Promise}\n *\n * @memberof module:workbox-window\n */\nconst messageSW = (sw, data) => {\n return new Promise((resolve) => {\n let messageChannel = new MessageChannel();\n messageChannel.port1.onmessage = (evt) => resolve(evt.data);\n sw.postMessage(data, [messageChannel.port2]);\n });\n};\n\nexport {messageSW};\n","try{self['workbox:core:4.3.1']&&_()}catch(e){}// eslint-disable-line","/*\n Copyright 2018 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n/**\n * The Deferred class composes Promises in a way that allows for them to be\n * resolved or rejected from outside the constructor. In most cases promises\n * should be used directly, but Deferreds can be necessary when the logic to\n * resolve a promise must be separate.\n *\n * @private\n */\nexport class Deferred {\n /**\n * Creates a promise and exposes its resolve and reject functions as methods.\n */\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n}\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n/**\n * Returns true if two URLs have the same `.href` property. The URLS can be\n * relative, and if they are the current location href is used to resolve URLs.\n *\n * @private\n * @param {string} url1\n * @param {string} url2\n * @return {boolean}\n */\nconst urlsMatch = (url1, url2) => {\n return new URL(url1, location).href === new URL(url2, location).href;\n};\n\nexport {urlsMatch};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n/**\n * A minimal `Event` subclass shim.\n * This doesn't *actually* subclass `Event` because not all browsers support\n * constructable `EventTarget`, and using a real `Event` will error.\n * @private\n */\nclass WorkboxEvent {\n /**\n * @param {string} type\n * @param {Object} props\n */\n constructor(type, props) {\n Object.assign(this, props, {type});\n }\n}\n\nexport {WorkboxEvent};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport {Deferred} from 'workbox-core/_private/Deferred.mjs';\nimport {logger} from 'workbox-core/_private/logger.mjs';\nimport {messageSW} from './messageSW.mjs';\nimport {EventTargetShim} from './utils/EventTargetShim.mjs';\nimport {urlsMatch} from './utils/urlsMatch.mjs';\nimport {WorkboxEvent} from './utils/WorkboxEvent.mjs';\nimport './_version.mjs';\n\n\n// The time a SW must be in the waiting phase before we can conclude\n// `skipWaiting()` wasn't called. This 200 amount wasn't scientifically\n// chosen, but it seems to avoid false positives in my testing.\nconst WAITING_TIMEOUT_DURATION = 200;\n\n// The amount of time after a registration that we can reasonably conclude\n// that the registration didn't trigger an update.\nconst REGISTRATION_TIMEOUT_DURATION = 60000;\n\n/**\n * A class to aid in handling service worker registration, updates, and\n * reacting to service worker lifecycle events.\n *\n * @fires [message]{@link module:workbox-window.Workbox#message}\n * @fires [installed]{@link module:workbox-window.Workbox#installed}\n * @fires [waiting]{@link module:workbox-window.Workbox#waiting}\n * @fires [controlling]{@link module:workbox-window.Workbox#controlling}\n * @fires [activated]{@link module:workbox-window.Workbox#activated}\n * @fires [redundant]{@link module:workbox-window.Workbox#redundant}\n * @fires [externalinstalled]{@link module:workbox-window.Workbox#externalinstalled}\n * @fires [externalwaiting]{@link module:workbox-window.Workbox#externalwaiting}\n * @fires [externalactivated]{@link module:workbox-window.Workbox#externalactivated}\n *\n * @memberof module:workbox-window\n */\nclass Workbox extends EventTargetShim {\n /**\n * Creates a new Workbox instance with a script URL and service worker\n * options. The script URL and options are the same as those used when\n * calling `navigator.serviceWorker.register(scriptURL, options)`. See:\n * https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/register\n *\n * @param {string} scriptURL The service worker script associated with this\n * instance.\n * @param {Object} [registerOptions] The service worker options associated\n * with this instance.\n */\n constructor(scriptURL, registerOptions = {}) {\n super();\n\n this._scriptURL = scriptURL;\n this._registerOptions = registerOptions;\n this._updateFoundCount = 0;\n\n // Deferreds we can resolve later.\n this._swDeferred = new Deferred();\n this._activeDeferred = new Deferred();\n this._controllingDeferred = new Deferred();\n\n // Bind event handler callbacks.\n this._onMessage = this._onMessage.bind(this);\n this._onStateChange = this._onStateChange.bind(this);\n this._onUpdateFound = this._onUpdateFound.bind(this);\n this._onControllerChange = this._onControllerChange.bind(this);\n }\n\n /**\n * Registers a service worker for this instances script URL and service\n * worker options. By default this method delays registration until after\n * the window has loaded.\n *\n * @param {Object} [options]\n * @param {Function} [options.immediate=false] Setting this to true will\n * register the service worker immediately, even if the window has\n * not loaded (not recommended).\n */\n async register({immediate = false} = {}) {\n if (process.env.NODE_ENV !== 'production') {\n if (this._registrationTime) {\n logger.error('Cannot re-register a Workbox instance after it has ' +\n 'been registered. Create a new instance instead.');\n return;\n }\n }\n\n if (!immediate && document.readyState !== 'complete') {\n await new Promise((res) => addEventListener('load', res));\n }\n\n // Set this flag to true if any service worker was controlling the page\n // at registration time.\n this._isUpdate = Boolean(navigator.serviceWorker.controller);\n\n // Before registering, attempt to determine if a SW is already controlling\n // the page, and if that SW script (and version, if specified) matches this\n // instance's script.\n this._compatibleControllingSW = this._getControllingSWIfCompatible();\n\n this._registration = await this._registerScript();\n\n // If we have a compatible controller, store the controller as the \"own\"\n // SW, resolve active/controlling deferreds and add necessary listeners.\n if (this._compatibleControllingSW) {\n this._sw = this._compatibleControllingSW;\n this._activeDeferred.resolve(this._compatibleControllingSW);\n this._controllingDeferred.resolve(this._compatibleControllingSW);\n\n this._reportWindowReady(this._compatibleControllingSW);\n this._compatibleControllingSW.addEventListener(\n 'statechange', this._onStateChange, {once: true});\n }\n\n // If there's a waiting service worker with a matching URL before the\n // `updatefound` event fires, it likely means that this site is open\n // in another tab, or the user refreshed the page (and thus the prevoius\n // page wasn't fully unloaded before this page started loading).\n // https://developers.google.com/web/fundamentals/primers/service-workers/lifecycle#waiting\n const waitingSW = this._registration.waiting;\n if (waitingSW && urlsMatch(waitingSW.scriptURL, this._scriptURL)) {\n // Store the waiting SW as the \"own\" Sw, even if it means overwriting\n // a compatible controller.\n this._sw = waitingSW;\n\n // Run this in the next microtask, so any code that adds an event\n // listener after awaiting `register()` will get this event.\n Promise.resolve().then(() => {\n this.dispatchEvent(new WorkboxEvent('waiting', {\n sw: waitingSW,\n wasWaitingBeforeRegister: true,\n }));\n if (process.env.NODE_ENV !== 'production') {\n logger.warn('A service worker was already waiting to activate ' +\n 'before this script was registered...');\n }\n });\n }\n\n // If an \"own\" SW is already set, resolve the deferred.\n if (this._sw) {\n this._swDeferred.resolve(this._sw);\n }\n\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Successfully registered service worker.', this._scriptURL);\n\n if (navigator.serviceWorker.controller) {\n if (this._compatibleControllingSW) {\n logger.debug('A service worker with the same script URL ' +\n 'is already controlling this page.');\n } else {\n logger.debug('A service worker with a different script URL is ' +\n 'currently controlling the page. The browser is now fetching ' +\n 'the new script now...');\n }\n }\n\n const currentPageIsOutOfScope = () => {\n const scopeURL = new URL(\n this._registerOptions.scope || this._scriptURL, document.baseURI);\n const scopeURLBasePath = new URL('./', scopeURL.href).pathname;\n return !location.pathname.startsWith(scopeURLBasePath);\n };\n if (currentPageIsOutOfScope()) {\n logger.warn('The current page is not in scope for the registered ' +\n 'service worker. Was this a mistake?');\n }\n }\n\n this._registration.addEventListener('updatefound', this._onUpdateFound);\n navigator.serviceWorker.addEventListener(\n 'controllerchange', this._onControllerChange, {once: true});\n\n // Add message listeners.\n if ('BroadcastChannel' in self) {\n this._broadcastChannel = new BroadcastChannel('workbox');\n this._broadcastChannel.addEventListener('message', this._onMessage);\n }\n navigator.serviceWorker.addEventListener('message', this._onMessage);\n\n return this._registration;\n }\n\n /**\n * Resolves to the service worker registered by this instance as soon as it\n * is active. If a service worker was already controlling at registration\n * time then it will resolve to that if the script URLs (and optionally\n * script versions) match, otherwise it will wait until an update is found\n * and activates.\n *\n * @return {Promise}\n */\n get active() {\n return this._activeDeferred.promise;\n }\n\n /**\n * Resolves to the service worker registered by this instance as soon as it\n * is controlling the page. If a service worker was already controlling at\n * registration time then it will resolve to that if the script URLs (and\n * optionally script versions) match, otherwise it will wait until an update\n * is found and starts controlling the page.\n * Note: the first time a service worker is installed it will active but\n * not start controlling the page unless `clients.claim()` is called in the\n * service worker.\n *\n * @return {Promise}\n */\n get controlling() {\n return this._controllingDeferred.promise;\n }\n\n /**\n * Resolves with a reference to a service worker that matches the script URL\n * of this instance, as soon as it's available.\n *\n * If, at registration time, there's already an active or waiting service\n * worker with a matching script URL, it will be used (with the waiting\n * service worker taking precedence over the active service worker if both\n * match, since the waiting service worker would have been registered more\n * recently).\n * If there's no matching active or waiting service worker at registration\n * time then the promise will not resolve until an update is found and starts\n * installing, at which point the installing service worker is used.\n *\n * @return {Promise}\n */\n async getSW() {\n // If `this._sw` is set, resolve with that as we want `getSW()` to\n // return the correct (new) service worker if an update is found.\n return this._sw || this._swDeferred.promise;\n }\n\n /**\n * Sends the passed data object to the service worker registered by this\n * instance (via [`getSW()`]{@link module:workbox-window.Workbox#getSW}) and resolves\n * with a response (if any).\n *\n * A response can be set in a message handler in the service worker by\n * calling `event.ports[0].postMessage(...)`, which will resolve the promise\n * returned by `messageSW()`. If no response is set, the promise will never\n * resolve.\n *\n * @param {Object} data An object to send to the service worker\n * @return {Promise}\n */\n async messageSW(data) {\n const sw = await this.getSW();\n return messageSW(sw, data);\n }\n\n /**\n * Checks for a service worker already controlling the page and returns\n * it if its script URL matchs.\n *\n * @private\n * @return {ServiceWorker|undefined}\n */\n _getControllingSWIfCompatible() {\n const controller = navigator.serviceWorker.controller;\n if (controller && urlsMatch(controller.scriptURL, this._scriptURL)) {\n return controller;\n }\n }\n\n /**\n * Registers a service worker for this instances script URL and register\n * options and tracks the time registration was complete.\n *\n * @private\n */\n async _registerScript() {\n try {\n const reg = await navigator.serviceWorker.register(\n this._scriptURL, this._registerOptions);\n\n // Keep track of when registration happened, so it can be used in the\n // `this._onUpdateFound` heuristic. Also use the presence of this\n // property as a way to see if `.register()` has been called.\n this._registrationTime = performance.now();\n\n return reg;\n } catch (error) {\n if (process.env.NODE_ENV !== 'production') {\n logger.error(error);\n }\n // Re-throw the error.\n throw error;\n }\n }\n\n\n /**\n * Sends a message to the passed service worker that the window is ready.\n *\n * @param {ServiceWorker} sw\n * @private\n */\n _reportWindowReady(sw) {\n messageSW(sw, {\n type: 'WINDOW_READY',\n meta: 'workbox-window',\n });\n }\n\n /**\n * @private\n */\n _onUpdateFound() {\n const installingSW = this._registration.installing;\n\n // If the script URL passed to `navigator.serviceWorker.register()` is\n // different from the current controlling SW's script URL, we know any\n // successful registration calls will trigger an `updatefound` event.\n // But if the registered script URL is the same as the current controlling\n // SW's script URL, we'll only get an `updatefound` event if the file\n // changed since it was last registered. This can be a problem if the user\n // opens up the same page in a different tab, and that page registers\n // a SW that triggers an update. It's a problem because this page has no\n // good way of knowing whether the `updatefound` event came from the SW\n // script it registered or from a registration attempt made by a newer\n // version of the page running in another tab.\n // To minimize the possibility of a false positive, we use the logic here:\n let updateLikelyTriggeredExternally =\n // Since we enforce only calling `register()` once, and since we don't\n // add the `updatefound` event listener until the `register()` call, if\n // `_updateFoundCount` is > 0 then it means this method has already\n // been called, thus this SW must be external\n this._updateFoundCount > 0 ||\n // If the script URL of the installing SW is different from this\n // instance's script URL, we know it's definitely not from our\n // registration.\n !urlsMatch(installingSW.scriptURL, this._scriptURL) ||\n // If all of the above are false, then we use a time-based heuristic:\n // Any `updatefound` event that occurs long after our registration is\n // assumed to be external.\n (performance.now() >\n this._registrationTime + REGISTRATION_TIMEOUT_DURATION) ?\n // If any of the above are not true, we assume the update was\n // triggered by this instance.\n true : false;\n\n if (updateLikelyTriggeredExternally) {\n this._externalSW = installingSW;\n this._registration.removeEventListener(\n 'updatefound', this._onUpdateFound);\n } else {\n // If the update was not triggered externally we know the installing\n // SW is the one we registered, so we set it.\n this._sw = installingSW;\n this._swDeferred.resolve(installingSW);\n\n // The `installing` state isn't something we have a dedicated\n // callback for, but we do log messages for it in development.\n if (process.env.NODE_ENV !== 'production') {\n if (navigator.serviceWorker.controller) {\n logger.log('Updated service worker found. Installing now...');\n } else {\n logger.log('Service worker is installing...');\n }\n }\n }\n\n // Increment the `updatefound` count, so future invocations of this\n // method can be sure they were triggered externally.\n ++this._updateFoundCount;\n\n // Add a `statechange` listener regardless of whether this update was\n // triggered externally, since we have callbacks for both.\n installingSW.addEventListener('statechange', this._onStateChange);\n }\n\n /**\n * @private\n * @param {Event} originalEvent\n */\n _onStateChange(originalEvent) {\n const sw = originalEvent.target;\n const {state} = sw;\n const isExternal = sw === this._externalSW;\n const eventPrefix = isExternal ? 'external' : '';\n\n const eventProps = {sw, originalEvent};\n if (!isExternal && this._isUpdate) {\n eventProps.isUpdate = true;\n }\n\n this.dispatchEvent(new WorkboxEvent(\n eventPrefix + state, eventProps));\n\n if (state === 'installed') {\n // This timeout is used to ignore cases where the service worker calls\n // `skipWaiting()` in the install event, thus moving it directly in the\n // activating state. (Since all service workers *must* go through the\n // waiting phase, the only way to detect `skipWaiting()` called in the\n // install event is to observe that the time spent in the waiting phase\n // is very short.)\n // NOTE: we don't need separate timeouts for the own and external SWs\n // since they can't go through these phases at the same time.\n this._waitingTimeout = setTimeout(() => {\n // Ensure the SW is still waiting (it may now be redundant).\n if (state === 'installed' && this._registration.waiting === sw) {\n this.dispatchEvent(new WorkboxEvent(\n eventPrefix + 'waiting', eventProps));\n\n if (process.env.NODE_ENV !== 'production') {\n if (isExternal) {\n logger.warn('An external service worker has installed but is ' +\n 'waiting for this client to close before activating...');\n } else {\n logger.warn('The service worker has installed but is waiting ' +\n 'for existing clients to close before activating...');\n }\n }\n }\n }, WAITING_TIMEOUT_DURATION);\n } else if (state === 'activating') {\n clearTimeout(this._waitingTimeout);\n if (!isExternal) {\n this._activeDeferred.resolve(sw);\n }\n }\n\n if (process.env.NODE_ENV !== 'production') {\n switch (state) {\n case 'installed':\n if (isExternal) {\n logger.warn('An external service worker has installed. ' +\n 'You may want to suggest users reload this page.');\n } else {\n logger.log('Registered service worker installed.');\n }\n break;\n case 'activated':\n if (isExternal) {\n logger.warn('An external service worker has activated.');\n } else {\n logger.log('Registered service worker activated.');\n if (sw !== navigator.serviceWorker.controller) {\n logger.warn('The registered service worker is active but ' +\n 'not yet controlling the page. Reload or run ' +\n '`clients.claim()` in the service worker.');\n }\n }\n break;\n case 'redundant':\n if (sw === this._compatibleControllingSW) {\n logger.log('Previously controlling service worker now redundant!');\n } else if (!isExternal) {\n logger.log('Registered service worker now redundant!');\n }\n break;\n }\n }\n }\n\n /**\n * @private\n * @param {Event} originalEvent\n */\n _onControllerChange(originalEvent) {\n const sw = this._sw;\n if (sw === navigator.serviceWorker.controller) {\n this.dispatchEvent(new WorkboxEvent('controlling', {sw, originalEvent}));\n if (process.env.NODE_ENV !== 'production') {\n logger.log('Registered service worker now controlling this page.');\n }\n this._controllingDeferred.resolve(sw);\n }\n }\n\n /**\n * @private\n * @param {Event} originalEvent\n */\n _onMessage(originalEvent) {\n const {data} = originalEvent;\n this.dispatchEvent(new WorkboxEvent('message', {data, originalEvent}));\n }\n}\n\n// The jsdoc comments below outline the events this instance may dispatch:\n// -----------------------------------------------------------------------\n\n/**\n * The `message` event is dispatched any time a `postMessage` (or a\n * `BroadcastChannel` message with the `workbox` channel name) is received.\n *\n * @event module:workbox-window.Workbox#message\n * @type {WorkboxEvent}\n * @property {*} data The `data` property from the original `message` event.\n * @property {Event} originalEvent The original [`message`]{@link https://developer.mozilla.org/en-US/docs/Web/API/MessageEvent}\n * event.\n * @property {string} type `message`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `installed` event is dispatched if the state of a\n * [`Workbox`]{@link module:workbox-window.Workbox} instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}\n * changes to `installed`.\n *\n * Then can happen either the very first time a service worker is installed,\n * or after an update to the current service worker is found. In the case\n * of an update being found, the event's `isUpdate` property will be `true`.\n *\n * @event module:workbox-window.Workbox#installed\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this `Workbox` instance called `register()`.\n * @property {string} type `installed`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `waiting` event is dispatched if the state of a\n * [`Workbox`]{@link module:workbox-window.Workbox} instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}\n * changes to `installed` and then doesn't immediately change to `activating`.\n * It may also be dispatched if a service worker with the same\n * [`scriptURL`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/scriptURL}\n * was already waiting when the [`register()`]{@link module:workbox-window.Workbox#register}\n * method was called.\n *\n * @event module:workbox-window.Workbox#waiting\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The native `controllerchange` event\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this `Workbox` instance called `register()`.\n * @property {boolean|undefined} wasWaitingBeforeRegister True if a service worker with\n * a matching `scriptURL` was already waiting when this `Workbox`\n * instance called `register()`.\n * @property {string} type `waiting`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `controlling` event is dispatched if a\n * [`controllerchange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/oncontrollerchange}\n * fires on the service worker [container]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer}\n * and the [`scriptURL`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/scriptURL}\n * of the new [controller]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/controller}\n * matches the `scriptURL` of the `Workbox` instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}.\n *\n * @event module:workbox-window.Workbox#controlling\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`controllerchange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/oncontrollerchange}\n * event.\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this service worker was registered.\n * @property {string} type `controlling`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `activated` event is dispatched if the state of a\n * [`Workbox`]{@link module:workbox-window.Workbox} instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}\n * changes to `activated`.\n *\n * @event module:workbox-window.Workbox#activated\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this `Workbox` instance called `register()`.\n * @property {string} type `activated`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `redundant` event is dispatched if the state of a\n * [`Workbox`]{@link module:workbox-window.Workbox} instance's\n * [registered service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-registered-sw}\n * changes to `redundant`.\n *\n * @event module:workbox-window.Workbox#redundant\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {boolean|undefined} isUpdate True if a service worker was already\n * controlling when this `Workbox` instance called `register()`.\n * @property {string} type `redundant`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `externalinstalled` event is dispatched if the state of an\n * [external service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-external-sw}\n * changes to `installed`.\n *\n * @event module:workbox-window.Workbox#externalinstalled\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {string} type `externalinstalled`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `externalwaiting` event is dispatched if the state of an\n * [external service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-external-sw}\n * changes to `waiting`.\n *\n * @event module:workbox-window.Workbox#externalwaiting\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event|undefined} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {string} type `externalwaiting`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\n/**\n * The `externalactivated` event is dispatched if the state of an\n * [external service worker]{@link https://developers.google.com/web/tools/workbox/modules/workbox-precaching#def-external-sw}\n * changes to `activated`.\n *\n * @event module:workbox-window.Workbox#externalactivated\n * @type {WorkboxEvent}\n * @property {ServiceWorker} sw The service worker instance.\n * @property {Event} originalEvent The original [`statechange`]{@link https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorker/onstatechange}\n * event.\n * @property {string} type `externalactivated`.\n * @property {Workbox} target The `Workbox` instance.\n */\n\nexport {Workbox};\n","/*\n Copyright 2019 Google LLC\n\n Use of this source code is governed by an MIT-style\n license that can be found in the LICENSE file or at\n https://opensource.org/licenses/MIT.\n*/\n\nimport '../_version.mjs';\n\n\n/**\n * A minimal `EventTarget` shim.\n * This is necessary because not all browsers support constructable\n * `EventTarget`, so using a real `EventTarget` will error.\n * @private\n */\nclass EventTargetShim {\n /**\n * Creates an event listener registry\n *\n * @private\n */\n constructor() {\n // A registry of event types to listeners.\n this._eventListenerRegistry = {};\n }\n /**\n * @param {string} type\n * @param {Function} listener\n * @private\n */\n addEventListener(type, listener) {\n this._getEventListenersByType(type).add(listener);\n }\n\n /**\n * @param {string} type\n * @param {Function} listener\n * @private\n */\n removeEventListener(type, listener) {\n this._getEventListenersByType(type).delete(listener);\n }\n\n /**\n * @param {Event} event\n * @private\n */\n dispatchEvent(event) {\n event.target = this;\n this._getEventListenersByType(event.type).forEach(\n (listener) => listener(event));\n }\n\n /**\n * Returns a Set of listeners associated with the passed event type.\n * If no handlers have been registered, an empty Set is returned.\n *\n * @param {string} type The event type.\n * @return {Set} An array of handler functions.\n * @private\n */\n _getEventListenersByType(type) {\n return this._eventListenerRegistry[type] =\n (this._eventListenerRegistry[type] || new Set());\n }\n}\n\nexport {EventTargetShim};\n"],"names":["self","_","e","messageSW","sw","data","Promise","resolve","messageChannel","MessageChannel","port1","onmessage","evt","postMessage","port2","Deferred","promise","reject","_this","urlsMatch","url1","url2","URL","location","href","WorkboxEvent","type","props","Object","assign","this","f","args","i","arguments","length","apply","value","then","direct","Workbox","scriptURL","registerOptions","_scriptURL","_registerOptions","_updateFoundCount","_swDeferred","_activeDeferred","_controllingDeferred","_onMessage","bind","_onStateChange","_onUpdateFound","_onControllerChange","register","result","immediate","_isUpdate","Boolean","navigator","serviceWorker","controller","_compatibleControllingSW","_this2","_getControllingSWIfCompatible","_registerScript","_registration","_sw","_reportWindowReady","addEventListener","once","waitingSW","waiting","dispatchEvent","wasWaitingBeforeRegister","_broadcastChannel","BroadcastChannel","document","readyState","res","body","getSW","recover","_this5","reg","_registrationTime","performance","now","error","meta","installingSW","installing","_externalSW","removeEventListener","originalEvent","target","state","isExternal","eventPrefix","eventProps","isUpdate","_waitingTimeout","setTimeout","_this6","clearTimeout","_eventListenerRegistry","listener","_getEventListenersByType","add","delete","event","forEach","Set"],"mappings":"oMAAA,IAAIA,KAAK,yBAAyBC,IAAI,MAAMC,QC0BtCC,EAAY,SAACC,EAAIC,UACd,IAAIC,QAAQ,SAACC,OACdC,EAAiB,IAAIC,eACzBD,EAAeE,MAAMC,UAAY,SAACC,UAAQL,EAAQK,EAAIP,OACtDD,EAAGS,YAAYR,EAAM,CAACG,EAAeM,4SC9BzC,IAAId,KAAK,uBAAuBC,IAAI,MAAMC,QCmB7Ba,EAIX,2BACOC,QAAU,IAAIV,QAAQ,SAACC,EAASU,GACnCC,EAAKX,QAAUA,EACfW,EAAKD,OAASA,KCNdE,EAAY,SAACC,EAAMC,UAChB,IAAIC,IAAIF,EAAMG,UAAUC,OAAS,IAAIF,IAAID,EAAME,UAAUC,MCL5DC,EAKJ,SAAYC,EAAMC,GAChBC,OAAOC,OAAOC,KAAMH,EAAO,CAACD,KAAAA,KCgDzB,WAAgBK,UACf,eACD,IAAIC,EAAO,GAAIC,EAAI,EAAGA,EAAIC,UAAUC,OAAQF,IAChDD,EAAKC,GAAKC,UAAUD,cAGb3B,QAAQC,QAAQwB,EAAEK,MAAMN,KAAME,IACpC,MAAM9B,UACAI,QAAQW,OAAOf,KAMlB,WAAgBmC,EAAOC,EAAMC,UAC/BA,EACID,EAAOA,EAAKD,GAASA,GAExBA,GAAUA,EAAMC,OACpBD,EAAQ/B,QAAQC,QAAQ8B,IAElBC,EAAOD,EAAMC,KAAKA,GAAQD,GAugB3B,cA9kBP,IAsBMG,iCAYQC,EAAWC,yBAAAA,IAAAA,EAAkB,2BAGlCC,EAAaF,IACbG,EAAmBF,IACnBG,EAAoB,IAGpBC,EAAc,IAAI/B,IAClBgC,EAAkB,IAAIhC,IACtBiC,EAAuB,IAAIjC,IAG3BkC,EAAa/B,EAAK+B,EAAWC,gBAC7BC,EAAiBjC,EAAKiC,EAAeD,gBACrCE,EAAiBlC,EAAKkC,EAAeF,gBACrCG,EAAsBnC,EAAKmC,EAAoBH,wIAahDI,2BAgdsBhB,EACzBiB,IA/cKzB,mBAF6B,MAArB0B,UAAAA,uBAgdYlB,sBAjcrBmB,EAAYC,QAAQC,UAAUC,cAAcC,cAK5CC,EAA2BC,EAAKC,MAEVD,EAAKE,kBAA3BC,IAIDH,EAAKD,MACFK,EAAMJ,EAAKD,IACXf,EAAgBxC,QAAQwD,EAAKD,KAC7Bd,EAAqBzC,QAAQwD,EAAKD,KAElCM,EAAmBL,EAAKD,KACxBA,EAAyBO,iBAC1B,cAAeN,EAAKZ,EAAgB,CAACmB,MAAM,SAQ3CC,EAAYR,EAAKG,EAAcM,eACjCD,GAAapD,EAAUoD,EAAU9B,UAAWsB,EAAKpB,OAG9CwB,EAAMI,EAIXjE,QAAQC,UAAU+B,KAAK,aAChBmC,cAAc,IAAIhD,EAAa,UAAW,CAC7CrB,GAAImE,EACJG,0BAA0B,QAU5BX,EAAKI,KACFrB,EAAYvC,QAAQwD,EAAKI,KA6B3BD,EAAcG,iBAAiB,cAAeN,EAAKX,GACxDO,UAAUC,cAAcS,iBACpB,mBAAoBN,EAAKV,EAAqB,CAACiB,MAAM,IAGrD,qBAAsBtE,SACnB2E,EAAoB,IAAIC,iBAAiB,aACzCD,EAAkBN,iBAAiB,UAAWN,EAAKd,IAE1DU,UAAUC,cAAcS,iBAAiB,UAAWN,EAAKd,GAElDc,EAAKG,MA0WXX,iBAxcIC,GAAqC,aAAxBqB,SAASC,kBAGxB,SAAuBzC,EAAOE,OAC/BA,SACGF,GAASA,EAAMC,KAAOD,EAAMC,QAAehC,QAAQC,WAJhD,IAAID,QAAQ,SAACyE,UAAQV,iBAAiB,OAAQU,MAuc5CC,KACCzB,EAAOjB,KACbiB,EAAOjB,KAAKA,GAEbA,EAAKiB,OA/TL0B,0BAGGnD,KAAKqC,GAALrC,KAAiBgB,EAAY9B,YAgBhCb,qBAAUE,YACGyB,KAAKmD,iBAAhB7E,UACCD,EAAUC,EAAIC,SAUvB2D,iBACQH,EAAaF,UAAUC,cAAcC,cACvCA,GAAc1C,EAAU0C,EAAWpB,UAAWX,KAAKa,UAC9CkB,KAULI,qBAGEnC,YA4RH,SAAgBkD,EAAME,WAEvB3B,EAASyB,IACZ,MAAM9E,UACAgF,EAAQhF,UAEZqD,GAAUA,EAAOjB,KACbiB,EAAOjB,UAAK,EAAQ4C,GAErB3B,uBAtSgBI,UAAUC,cAAcN,SACtC6B,EAAKxC,EAAYwC,EAAKvC,YADpBwC,YAMDC,EAAoBC,YAAYC,MAE9BH,cACAI,SAKDA,QAWVpB,WAAmBhE,GACjBD,EAAUC,EAAI,CACZsB,KAAM,eACN+D,KAAM,sBAOVrC,iBACQsC,EAAe5D,KAAKoC,EAAcyB,gBAmB/B9C,EAAoB,IAIxB1B,EAAUuE,EAAajD,UAAWX,KAAKa,IAIvC2C,YAAYC,MACTzD,KAAKuD,EA/TqB,UAqU3BO,EAAcF,OACdxB,EAAc2B,oBACf,cAAe/D,KAAKsB,UAInBe,EAAMuB,OACN5C,EAAYvC,QAAQmF,MAezB5D,KAAKe,EAIP6C,EAAarB,iBAAiB,cAAevC,KAAKqB,MAOpDA,WAAe2C,cACP1F,EAAK0F,EAAcC,OAClBC,EAAS5F,EAAT4F,MACDC,EAAa7F,IAAO0B,KAAK8D,EACzBM,EAAcD,EAAa,WAAa,GAExCE,EAAa,CAAC/F,GAAAA,EAAI0F,cAAAA,IACnBG,GAAcnE,KAAK2B,IACtB0C,EAAWC,UAAW,QAGnB3B,cAAc,IAAIhD,EACnByE,EAAcF,EAAOG,IAEX,cAAVH,OASGK,EAAkBC,WAAW,WAElB,cAAVN,GAAyBO,EAAKrC,EAAcM,UAAYpE,GAC1DmG,EAAK9B,cAAc,IAAIhD,EACnByE,EAAc,UAAWC,KArYN,KAkZR,eAAVH,IACTQ,aAAa1E,KAAKuE,GACbJ,QACElD,EAAgBxC,QAAQH,OAyCnCiD,WAAoByC,OACZ1F,EAAK0B,KAAKqC,EACZ/D,IAAOuD,UAAUC,cAAcC,kBAC5BY,cAAc,IAAIhD,EAAa,cAAe,CAACrB,GAAAA,EAAI0F,cAAAA,UAInD9C,EAAqBzC,QAAQH,OAQtC6C,WAAW6C,OACFzF,EAAQyF,EAARzF,UACFoE,cAAc,IAAIhD,EAAa,UAAW,CAACpB,KAAAA,EAAMyF,cAAAA,kDA5R/ChE,KAAKiB,EAAgB/B,mDAgBrBc,KAAKkB,EAAqBhC,wEC9L5ByF,EAAyB,8BAOhCpC,0BAAiB3C,EAAMgF,QAChBC,EAAyBjF,GAAMkF,IAAIF,MAQ1Cb,6BAAoBnE,EAAMgF,QACnBC,EAAyBjF,GAAMmF,OAAOH,MAO7CjC,uBAAcqC,GACZA,EAAMf,OAASjE,UACV6E,EAAyBG,EAAMpF,MAAMqF,QACtC,SAACL,UAAaA,EAASI,QAW7BH,WAAyBjF,UAChBI,KAAK2E,EAAuB/E,GAC9BI,KAAK2E,EAAuB/E,IAAS,IAAIsF"} \ No newline at end of file diff --git a/~partytown/debug/partytown-atomics.js b/~partytown/debug/partytown-atomics.js new file mode 100644 index 00000000..94e3d3d6 --- /dev/null +++ b/~partytown/debug/partytown-atomics.js @@ -0,0 +1,572 @@ +/* Partytown 0.7.6 - MIT builder.io */ +(window => { + const isPromise = v => "object" == typeof v && v && v.then; + const noop = () => {}; + const len = obj => obj.length; + const getConstructorName = obj => { + var _a, _b, _c; + try { + const constructorName = null === (_a = null == obj ? void 0 : obj.constructor) || void 0 === _a ? void 0 : _a.name; + if (constructorName) { + return constructorName; + } + } catch (e) {} + try { + const zoneJsConstructorName = null === (_c = null === (_b = null == obj ? void 0 : obj.__zone_symbol__originalInstance) || void 0 === _b ? void 0 : _b.constructor) || void 0 === _c ? void 0 : _c.name; + if (zoneJsConstructorName) { + return zoneJsConstructorName; + } + } catch (e) {} + return ""; + }; + const startsWith = (str, val) => str.startsWith(val); + const isValidMemberName = memberName => !(startsWith(memberName, "webkit") || startsWith(memberName, "toJSON") || startsWith(memberName, "constructor") || startsWith(memberName, "toString") || startsWith(memberName, "_")); + const getNodeName = node => 11 === node.nodeType && node.host ? "#s" : node.nodeName; + const randomId = () => Math.round(Math.random() * Number.MAX_SAFE_INTEGER).toString(36); + const defineConstructorName = (Cstr, value) => ((obj, memberName, descriptor) => Object.defineProperty(obj, memberName, { + ...descriptor, + configurable: true + }))(Cstr, "name", { + value: value + }); + const htmlConstructorTags = { + Anchor: "a", + DList: "dl", + Image: "img", + OList: "ol", + Paragraph: "p", + Quote: "q", + TableCaption: "caption", + TableCell: "td", + TableCol: "colgroup", + TableRow: "tr", + TableSection: "tbody", + UList: "ul" + }; + const svgConstructorTags = { + Graphics: "g", + SVG: "svg" + }; + const InstanceIdKey = Symbol(); + const CreatedKey = Symbol(); + const instances = new Map; + const mainRefs = new Map; + const winCtxs = {}; + const windowIds = new WeakMap; + const getAndSetInstanceId = (instance, instanceId) => { + if (instance) { + if (instanceId = windowIds.get(instance)) { + return instanceId; + } + (instanceId = instance[InstanceIdKey]) || setInstanceId(instance, instanceId = randomId()); + return instanceId; + } + }; + const getInstance = (winId, instanceId, win, doc, docId) => { + if ((win = winCtxs[winId]) && win.$window$) { + if (winId === instanceId) { + return win.$window$; + } + doc = win.$window$.document; + docId = instanceId.split(".").pop(); + if ("d" === docId) { + return doc; + } + if ("e" === docId) { + return doc.documentElement; + } + if ("h" === docId) { + return doc.head; + } + if ("b" === docId) { + return doc.body; + } + } + return instances.get(instanceId); + }; + const setInstanceId = (instance, instanceId, now) => { + if (instance) { + instances.set(instanceId, instance); + instance[InstanceIdKey] = instanceId; + instance[CreatedKey] = now = Date.now(); + if (now > lastCleanup + 5e3) { + instances.forEach(((storedInstance, instanceId) => { + storedInstance[CreatedKey] < lastCleanup && storedInstance.nodeType && !storedInstance.isConnected && instances.delete(instanceId); + })); + lastCleanup = now; + } + } + }; + let lastCleanup = 0; + const mainWindow = window.parent; + const docImpl = document.implementation.createHTMLDocument(); + const config = mainWindow.partytown || {}; + const libPath = (config.lib || "/~partytown/") + "debug/"; + const logMain = msg => { + console.debug.apply(console, [ "%cMain 🌎", "background: #717171; color: white; padding: 2px 3px; border-radius: 2px; font-size: 0.8em;", msg ]); + }; + const winIds = []; + const normalizedWinId = winId => { + winIds.includes(winId) || winIds.push(winId); + return winIds.indexOf(winId) + 1; + }; + const defineCustomElement = (winId, worker, ceData) => { + const Cstr = defineConstructorName(class extends winCtxs[winId].$window$.HTMLElement {}, ceData[0]); + const ceCallbackMethods = "connectedCallback,disconnectedCallback,attributeChangedCallback,adoptedCallback".split(","); + ceCallbackMethods.map((callbackMethodName => Cstr.prototype[callbackMethodName] = function(...args) { + worker.postMessage([ 15, winId, getAndSetInstanceId(this), callbackMethodName, args ]); + })); + Cstr.observedAttributes = ceData[1]; + return Cstr; + }; + const serializeForWorker = ($winId$, value, added, type, cstrName) => void 0 !== value && (type = typeof value) ? "string" === type || "number" === type || "boolean" === type || null == value ? [ 0, value ] : "function" === type ? [ 6 ] : (added = added || new Set) && Array.isArray(value) ? added.has(value) ? [ 1, [] ] : added.add(value) && [ 1, value.map((v => serializeForWorker($winId$, v, added))) ] : "object" === type ? serializedValueIsError(value) ? [ 14, { + name: value.name, + message: value.message, + stack: value.stack + } ] : "" === (cstrName = getConstructorName(value)) ? [ 2, {} ] : "Window" === cstrName ? [ 3, [ $winId$, $winId$ ] ] : "HTMLCollection" === cstrName || "NodeList" === cstrName ? [ 7, Array.from(value).map((v => serializeForWorker($winId$, v, added)[1])) ] : cstrName.endsWith("Event") ? [ 5, serializeObjectForWorker($winId$, value, added) ] : "CSSRuleList" === cstrName ? [ 12, Array.from(value).map(serializeCssRuleForWorker) ] : startsWith(cstrName, "CSS") && cstrName.endsWith("Rule") ? [ 11, serializeCssRuleForWorker(value) ] : "CSSStyleDeclaration" === cstrName ? [ 13, serializeObjectForWorker($winId$, value, added) ] : "Attr" === cstrName ? [ 10, [ value.name, value.value ] ] : value.nodeType ? [ 3, [ $winId$, getAndSetInstanceId(value), getNodeName(value) ] ] : [ 2, serializeObjectForWorker($winId$, value, added, true, true) ] : void 0 : value; + const serializeObjectForWorker = (winId, obj, added, includeFunctions, includeEmptyStrings, serializedObj, propName, propValue) => { + serializedObj = {}; + if (!added.has(obj)) { + added.add(obj); + for (propName in obj) { + if (isValidMemberName(propName)) { + propValue = "path" === propName && getConstructorName(obj).endsWith("Event") ? obj.composedPath() : obj[propName]; + (includeFunctions || "function" != typeof propValue) && (includeEmptyStrings || "" !== propValue) && (serializedObj[propName] = serializeForWorker(winId, propValue, added)); + } + } + } + return serializedObj; + }; + const serializeCssRuleForWorker = cssRule => { + let obj = {}; + let key; + for (key in cssRule) { + validCssRuleProps.includes(key) && (obj[key] = String(cssRule[key])); + } + return obj; + }; + const serializedValueIsError = value => value instanceof window.top.Error; + const deserializeFromWorker = (worker, serializedTransfer, serializedType, serializedValue) => { + if (serializedTransfer) { + serializedType = serializedTransfer[0]; + serializedValue = serializedTransfer[1]; + return 0 === serializedType ? serializedValue : 4 === serializedType ? deserializeRefFromWorker(worker, serializedValue) : 1 === serializedType ? serializedValue.map((v => deserializeFromWorker(worker, v))) : 3 === serializedType ? getInstance(serializedValue[0], serializedValue[1]) : 5 === serializedType ? constructEvent(deserializeObjectFromWorker(worker, serializedValue)) : 2 === serializedType ? deserializeObjectFromWorker(worker, serializedValue) : 8 === serializedType ? serializedValue : 9 === serializedType ? new window[serializedTransfer[2]](serializedValue) : void 0; + } + }; + const deserializeRefFromWorker = (worker, {$winId$: $winId$, $instanceId$: $instanceId$, $refId$: $refId$}, ref) => { + ref = mainRefs.get($refId$); + if (!ref) { + ref = function(...args) { + worker.postMessage([ 9, { + $winId$: $winId$, + $instanceId$: $instanceId$, + $refId$: $refId$, + $thisArg$: serializeForWorker($winId$, this), + $args$: serializeForWorker($winId$, args) + } ]); + }; + mainRefs.set($refId$, ref); + } + return ref; + }; + const constructEvent = eventProps => new ("detail" in eventProps ? CustomEvent : Event)(eventProps.type, eventProps); + const deserializeObjectFromWorker = (worker, serializedValue, obj, key) => { + obj = {}; + for (key in serializedValue) { + obj[key] = deserializeFromWorker(worker, serializedValue[key]); + } + return obj; + }; + const validCssRuleProps = "cssText,selectorText,href,media,namespaceURI,prefix,name,conditionText".split(","); + const mainAccessHandler = async (worker, accessReq) => { + let accessRsp = { + $msgId$: accessReq.$msgId$ + }; + let totalTasks = len(accessReq.$tasks$); + let i = 0; + let task; + let winId; + let applyPath; + let instance; + let rtnValue; + let isLast; + for (;i < totalTasks; i++) { + try { + isLast = i === totalTasks - 1; + task = accessReq.$tasks$[i]; + winId = task.$winId$; + applyPath = task.$applyPath$; + !winCtxs[winId] && winId.startsWith("f_") && await new Promise((resolve => { + let check = 0; + let callback = () => { + winCtxs[winId] || check++ > 1e3 ? resolve() : requestAnimationFrame(callback); + }; + callback(); + })); + if (1 === applyPath[0] && applyPath[1] in winCtxs[winId].$window$) { + setInstanceId(new winCtxs[winId].$window$[applyPath[1]](...deserializeFromWorker(worker, applyPath[2])), task.$instanceId$); + } else { + instance = getInstance(winId, task.$instanceId$); + if (instance) { + rtnValue = applyToInstance(worker, winId, instance, applyPath, isLast, task.$groupedGetters$); + task.$assignInstanceId$ && ("string" == typeof task.$assignInstanceId$ ? setInstanceId(rtnValue, task.$assignInstanceId$) : winCtxs[task.$assignInstanceId$.$winId$] = { + $winId$: task.$assignInstanceId$.$winId$, + $window$: { + document: rtnValue + } + }); + if (isPromise(rtnValue)) { + rtnValue = await rtnValue; + isLast && (accessRsp.$isPromise$ = true); + } + isLast && (accessRsp.$rtnValue$ = serializeForWorker(winId, rtnValue)); + } else { + accessRsp.$error$ = `Error finding instance "${task.$instanceId$}" on window ${normalizedWinId(winId)}`; + console.error(accessRsp.$error$, task); + } + } + } catch (e) { + isLast ? accessRsp.$error$ = String(e.stack || e) : console.error(e); + } + } + return accessRsp; + }; + const applyToInstance = (worker, winId, instance, applyPath, isLast, groupedGetters) => { + let i = 0; + let l = len(applyPath); + let next; + let current; + let previous; + let args; + let groupedRtnValues; + for (;i < l; i++) { + current = applyPath[i]; + next = applyPath[i + 1]; + previous = applyPath[i - 1]; + try { + if (!Array.isArray(next)) { + if ("string" == typeof current || "number" == typeof current) { + if (i + 1 === l && groupedGetters) { + groupedRtnValues = {}; + groupedGetters.map((propName => groupedRtnValues[propName] = instance[propName])); + return groupedRtnValues; + } + instance = instance[current]; + } else { + if (0 === next) { + instance[previous] = deserializeFromWorker(worker, current); + return; + } + if ("function" == typeof instance[previous]) { + args = deserializeFromWorker(worker, current); + "define" === previous && "CustomElementRegistry" === getConstructorName(instance) && (args[1] = defineCustomElement(winId, worker, args[1])); + "insertRule" === previous && args[1] > len(instance.cssRules) && (args[1] = len(instance.cssRules)); + instance = instance[previous].apply(instance, args); + if ("play" === previous) { + return Promise.resolve(); + } + } + } + } + } catch (err) { + if (isLast) { + throw err; + } + console.debug("Non-blocking setter error:", err); + } + } + return instance; + }; + const readNextScript = (worker, winCtx) => { + let $winId$ = winCtx.$winId$; + let win = winCtx.$window$; + let doc = win.document; + let scriptSelector = 'script[type="text/partytown"]:not([data-ptid]):not([data-pterror])'; + let scriptElm; + let $instanceId$; + let scriptData; + if (doc && doc.body) { + scriptElm = doc.querySelector('script[type="text/partytown"]:not([data-ptid]):not([data-pterror]):not([async]):not([defer])'); + scriptElm || (scriptElm = doc.querySelector(scriptSelector)); + if (scriptElm) { + scriptElm.dataset.ptid = $instanceId$ = getAndSetInstanceId(scriptElm, $winId$); + scriptData = { + $winId$: $winId$, + $instanceId$: $instanceId$ + }; + if (scriptElm.src) { + scriptData.$url$ = scriptElm.src; + scriptData.$orgUrl$ = scriptElm.dataset.ptsrc || scriptElm.src; + } else { + scriptData.$content$ = scriptElm.innerHTML; + } + worker.postMessage([ 7, scriptData ]); + } else { + if (!winCtx.$isInitialized$) { + winCtx.$isInitialized$ = 1; + ((worker, $winId$, win) => { + let queuedForwardCalls = win._ptf; + let forwards = (win.partytown || {}).forward || []; + let i; + let mainForwardFn; + let forwardCall = ($forward$, args) => worker.postMessage([ 10, { + $winId$: $winId$, + $forward$: $forward$, + $args$: serializeForWorker($winId$, Array.from(args)) + } ]); + win._ptf = void 0; + forwards.map((forwardProps => { + mainForwardFn = win; + forwardProps.split(".").map(((_, i, arr) => { + mainForwardFn = mainForwardFn[arr[i]] = i + 1 < len(arr) ? mainForwardFn[arr[i]] || ("push" === arr[i + 1] ? [] : {}) : (...args) => forwardCall(arr, args); + })); + })); + if (queuedForwardCalls) { + for (i = 0; i < len(queuedForwardCalls); i += 2) { + forwardCall(queuedForwardCalls[i], queuedForwardCalls[i + 1]); + } + } + })(worker, $winId$, win); + doc.dispatchEvent(new CustomEvent("pt0")); + { + const winType = win === win.top ? "top" : "iframe"; + logMain(`Executed ${winType} window ${normalizedWinId($winId$)} environment scripts in ${(performance.now() - winCtx.$startTime$).toFixed(1)}ms`); + } + } + worker.postMessage([ 8, $winId$ ]); + } + } else { + requestAnimationFrame((() => readNextScript(worker, winCtx))); + } + }; + const registerWindow = (worker, $winId$, $window$) => { + if (!windowIds.has($window$)) { + windowIds.set($window$, $winId$); + const doc = $window$.document; + const history = $window$.history; + const $parentWinId$ = windowIds.get($window$.parent); + let initialised = false; + const onInitialisedQueue = []; + const onInitialised = callback => { + initialised ? callback() : onInitialisedQueue.push(callback); + }; + const sendInitEnvData = () => { + worker.postMessage([ 5, { + $winId$: $winId$, + $parentWinId$: $parentWinId$, + $url$: doc.baseURI, + $visibilityState$: doc.visibilityState + } ]); + setTimeout((() => { + initialised = true; + onInitialisedQueue.forEach((callback => { + callback(); + })); + })); + }; + const pushState = history.pushState.bind(history); + const replaceState = history.replaceState.bind(history); + const onLocationChange = (type, state, newUrl, oldUrl) => () => { + setTimeout((() => { + worker.postMessage([ 13, { + $winId$: $winId$, + type: type, + state: state, + url: doc.baseURI, + newUrl: newUrl, + oldUrl: oldUrl + } ]); + })); + }; + history.pushState = (state, _, newUrl) => { + pushState(state, _, newUrl); + onInitialised(onLocationChange(0, state, null == newUrl ? void 0 : newUrl.toString())); + }; + history.replaceState = (state, _, newUrl) => { + replaceState(state, _, newUrl); + onInitialised(onLocationChange(1, state, null == newUrl ? void 0 : newUrl.toString())); + }; + $window$.addEventListener("popstate", (event => { + onInitialised(onLocationChange(2, event.state)); + })); + $window$.addEventListener("hashchange", (event => { + onInitialised(onLocationChange(3, {}, event.newURL, event.oldURL)); + })); + $window$.addEventListener("ptupdate", (() => { + readNextScript(worker, winCtxs[$winId$]); + })); + doc.addEventListener("visibilitychange", (() => worker.postMessage([ 14, $winId$, doc.visibilityState ]))); + winCtxs[$winId$] = { + $winId$: $winId$, + $window$: $window$ + }; + winCtxs[$winId$].$startTime$ = performance.now(); + { + const winType = $winId$ === $parentWinId$ ? "top" : "iframe"; + logMain(`Registered ${winType} window ${normalizedWinId($winId$)}`); + } + "complete" === doc.readyState ? sendInitEnvData() : $window$.addEventListener("load", sendInitEnvData); + } + }; + const onMessageFromWebWorker = (worker, msg, winCtx) => { + if (4 === msg[0]) { + registerWindow(worker, randomId(), mainWindow); + } else { + winCtx = winCtxs[msg[1]]; + winCtx && (7 === msg[0] ? requestAnimationFrame((() => readNextScript(worker, winCtx))) : 6 === msg[0] && ((worker, winCtx, instanceId, errorMsg, scriptElm) => { + scriptElm = winCtx.$window$.document.querySelector(`[data-ptid="${instanceId}"]`); + if (scriptElm) { + errorMsg ? scriptElm.dataset.pterror = errorMsg : scriptElm.type += "-x"; + delete scriptElm.dataset.ptid; + } + readNextScript(worker, winCtx); + })(worker, winCtx, msg[2], msg[3])); + } + }; + const readMainInterfaces = () => { + const elms = Object.getOwnPropertyNames(mainWindow).map((interfaceName => ((doc, interfaceName, r, tag) => { + r = interfaceName.match(/^(HTML|SVG)(.+)Element$/); + if (r) { + tag = r[2]; + return "S" == interfaceName[0] ? doc.createElementNS("http://www.w3.org/2000/svg", svgConstructorTags[tag] || tag.slice(0, 2).toLowerCase() + tag.slice(2)) : doc.createElement(htmlConstructorTags[tag] || tag); + } + })(docImpl, interfaceName))).filter((elm => elm)).map((elm => [ elm ])); + return readImplementations(elms, []); + }; + const cstrs = new Set([ "Object" ]); + const readImplementations = (impls, interfaces) => { + const cstrImpls = impls.filter((implData => implData[0])).map((implData => { + const impl = implData[0]; + const interfaceType = implData[1]; + const cstrName = getConstructorName(impl); + const CstrPrototype = mainWindow[cstrName].prototype; + return [ cstrName, CstrPrototype, impl, interfaceType ]; + })); + cstrImpls.map((([cstrName, CstrPrototype, impl, intefaceType]) => readOwnImplementation(cstrs, interfaces, cstrName, CstrPrototype, impl, intefaceType))); + return interfaces; + }; + const readImplementation = (cstrName, impl, memberName) => { + let interfaceMembers = []; + let interfaceInfo = [ cstrName, "Object", interfaceMembers ]; + for (memberName in impl) { + readImplementationMember(interfaceMembers, impl, memberName); + } + return interfaceInfo; + }; + const readOwnImplementation = (cstrs, interfaces, cstrName, CstrPrototype, impl, interfaceType) => { + if (!cstrs.has(cstrName)) { + cstrs.add(cstrName); + const SuperCstr = Object.getPrototypeOf(CstrPrototype); + const superCstrName = getConstructorName(SuperCstr); + const interfaceMembers = []; + const propDescriptors = Object.getOwnPropertyDescriptors(CstrPrototype); + readOwnImplementation(cstrs, interfaces, superCstrName, SuperCstr, impl, interfaceType); + for (const memberName in propDescriptors) { + readImplementationMember(interfaceMembers, impl, memberName); + } + interfaces.push([ cstrName, superCstrName, interfaceMembers, interfaceType, getNodeName(impl) ]); + } + }; + const readImplementationMember = (interfaceMembers, implementation, memberName, value, memberType, cstrName) => { + try { + if (isValidMemberName(memberName) && isNaN(memberName[0]) && "all" !== memberName) { + value = implementation[memberName]; + memberType = typeof value; + if ("function" === memberType) { + (String(value).includes("[native") || Object.getPrototypeOf(implementation)[memberName]) && interfaceMembers.push([ memberName, 5 ]); + } else if ("object" === memberType && null != value) { + cstrName = getConstructorName(value); + "Object" !== cstrName && self[cstrName] && interfaceMembers.push([ memberName, value.nodeType || cstrName ]); + } else { + "symbol" !== memberType && (memberName.toUpperCase() === memberName ? interfaceMembers.push([ memberName, 6, value ]) : interfaceMembers.push([ memberName, 6 ])); + } + } + } catch (e) { + console.warn(e); + } + }; + const readStorage = storageName => { + let items = []; + let i = 0; + let l = len(mainWindow[storageName]); + let key; + for (;i < l; i++) { + key = mainWindow[storageName].key(i); + items.push([ key, mainWindow[storageName].getItem(key) ]); + } + return items; + }; + const getGlobalConstructor = (mainWindow, cstrName) => void 0 !== mainWindow[cstrName] ? new mainWindow[cstrName](noop) : 0; + const addGlobalConstructorUsingPrototype = ($interfaces$, mainWindow, cstrName) => { + void 0 !== mainWindow[cstrName] && $interfaces$.push([ cstrName, "Object", Object.keys(mainWindow[cstrName].prototype).map((propName => [ propName, 6 ])), 12 ]); + }; + let worker; + (async receiveMessage => { + const sharedDataBuffer = new SharedArrayBuffer(1073741824); + const sharedData = new Int32Array(sharedDataBuffer); + return (worker, msg) => { + const msgType = msg[0]; + const accessReq = msg[1]; + if (0 === msgType) { + const initData = (() => { + const elm = docImpl.createElement("i"); + const textNode = docImpl.createTextNode(""); + const comment = docImpl.createComment(""); + const frag = docImpl.createDocumentFragment(); + const shadowRoot = docImpl.createElement("p").attachShadow({ + mode: "open" + }); + const intersectionObserver = getGlobalConstructor(mainWindow, "IntersectionObserver"); + const mutationObserver = getGlobalConstructor(mainWindow, "MutationObserver"); + const resizeObserver = getGlobalConstructor(mainWindow, "ResizeObserver"); + const perf = mainWindow.performance; + const screen = mainWindow.screen; + const impls = [ [ mainWindow.history ], [ perf ], [ perf.navigation ], [ perf.timing ], [ screen ], [ screen.orientation ], [ mainWindow.visualViewport ], [ intersectionObserver, 12 ], [ mutationObserver, 12 ], [ resizeObserver, 12 ], [ textNode ], [ comment ], [ frag ], [ shadowRoot ], [ elm ], [ elm.attributes ], [ elm.classList ], [ elm.dataset ], [ elm.style ], [ docImpl ], [ docImpl.doctype ] ]; + const initialInterfaces = [ readImplementation("Window", mainWindow), readImplementation("Node", textNode) ]; + const $config$ = JSON.stringify(config, ((k, v) => { + if ("function" == typeof v) { + v = String(v); + v.startsWith(k + "(") && (v = "function " + v); + } + return v; + })); + const initWebWorkerData = { + $config$: $config$, + $interfaces$: readImplementations(impls, initialInterfaces), + $libPath$: new URL(libPath, mainWindow.location) + "", + $origin$: origin, + $localStorage$: readStorage("localStorage"), + $sessionStorage$: readStorage("sessionStorage") + }; + addGlobalConstructorUsingPrototype(initWebWorkerData.$interfaces$, mainWindow, "IntersectionObserverEntry"); + return initWebWorkerData; + })(); + initData.$sharedDataBuffer$ = sharedDataBuffer; + worker.postMessage([ 1, initData ]); + } else { + 2 === msg[0] ? worker.postMessage([ 3, readMainInterfaces() ]) : 11 === msgType ? receiveMessage(accessReq, (accessRsp => { + const stringifiedData = JSON.stringify(accessRsp); + const stringifiedDataLength = stringifiedData.length; + for (let i = 0; i < stringifiedDataLength; i++) { + sharedData[i + 1] = stringifiedData.charCodeAt(i); + } + sharedData[0] = stringifiedDataLength; + Atomics.notify(sharedData, 0); + })) : onMessageFromWebWorker(worker, msg); + } + }; + })(((accessReq, responseCallback) => mainAccessHandler(worker, accessReq).then(responseCallback))).then((onMessageHandler => { + if (onMessageHandler) { + worker = new Worker(libPath + "partytown-ww-atomics.js?v=0.7.6", { + name: "Partytown 🎉" + }); + worker.onmessage = ev => { + const msg = ev.data; + 12 === msg[0] ? mainAccessHandler(worker, msg[1]) : onMessageHandler(worker, msg); + }; + logMain("Created Partytown web worker (0.7.6)"); + worker.onerror = ev => console.error("Web Worker Error", ev); + mainWindow.addEventListener("pt1", (ev => registerWindow(worker, getAndSetInstanceId(ev.detail.frameElement), ev.detail))); + } + })); +})(window); diff --git a/~partytown/debug/partytown-media.js b/~partytown/debug/partytown-media.js new file mode 100644 index 00000000..10c202db --- /dev/null +++ b/~partytown/debug/partytown-media.js @@ -0,0 +1,374 @@ +/* Partytown 0.7.6 - MIT builder.io */ +(self => { + const [getter, setter, callMethod, constructGlobal, definePrototypePropertyDescriptor, randomId, WinIdKey, InstanceIdKey, ApplyPathKey] = self.$bridgeToMedia$; + delete self.$bridgeToMedia$; + const ContextKey = Symbol(); + const MediaSourceKey = Symbol(); + const ReadyStateKey = Symbol(); + const SourceBuffersKey = Symbol(); + const SourceBufferTasksKey = Symbol(); + const TimeRangesKey = Symbol(); + const EMPTY_ARRAY = []; + const defineCstr = (win, cstrName, Cstr) => win[cstrName] = defineCstrName(cstrName, Cstr); + const defineCstrName = (cstrName, Cstr) => Object.defineProperty(Cstr, "name", { + value: cstrName + }); + const initCanvas = (WorkerBase, win) => { + const HTMLCanvasDescriptorMap = { + getContext: { + value(contextType, contextAttributes) { + this[ContextKey] || (this[ContextKey] = (contextType.includes("webgl") ? createContextWebGL : createContext2D)(this, contextType, contextAttributes)); + return this[ContextKey]; + } + } + }; + const WorkerCanvasGradient = defineCstr(win, "CanvasGradient", class extends WorkerBase { + addColorStop(...args) { + callMethod(this, [ "addColorStop" ], args, 2); + } + }); + const WorkerCanvasPattern = defineCstr(win, "CanvasPattern", class extends WorkerBase { + setTransform(...args) { + callMethod(this, [ "setTransform" ], args, 2); + } + }); + const createContext2D = (canvasInstance, contextType, contextAttributes) => { + const winId = canvasInstance[WinIdKey]; + const ctxInstanceId = randomId(); + const ctxInstance = { + [WinIdKey]: winId, + [InstanceIdKey]: ctxInstanceId, + [ApplyPathKey]: [] + }; + const ctx = callMethod(canvasInstance, [ "getContext" ], [ contextType, contextAttributes ], 1, ctxInstanceId); + const ctx2dGetterMethods = "getContextAttributes,getImageData,getLineDash,getTransform,isPointInPath,isPointInStroke,measureText".split(","); + const CanvasRenderingContext2D = { + get: (target, propName) => "string" == typeof propName && propName in ctx ? "function" == typeof ctx[propName] ? (...args) => { + if (propName.startsWith("create")) { + const instanceId = randomId(); + callMethod(ctxInstance, [ propName ], args, 2, instanceId); + if ("createImageData" === propName || "createPattern" === propName) { + (api => { + console.warn(`${api} not implemented`); + })(`${propName}()`); + return { + setTransform: () => {} + }; + } + return new WorkerCanvasGradient(winId, instanceId); + } + const methodCallType = ctx2dGetterMethods.includes(propName) ? 1 : 2; + return callMethod(ctxInstance, [ propName ], args, methodCallType); + } : ctx[propName] : target[propName], + set(target, propName, value) { + if ("string" == typeof propName && propName in ctx) { + ctx[propName] !== value && "function" != typeof value && setter(ctxInstance, [ propName ], value); + ctx[propName] = value; + } else { + target[propName] = value; + } + return true; + } + }; + return new Proxy(ctx, CanvasRenderingContext2D); + }; + const createContextWebGL = (canvasInstance, contextType, contextAttributes) => { + const winId = canvasInstance[WinIdKey]; + const ctxInstanceId = randomId(); + const ctxInstance = { + [WinIdKey]: winId, + [InstanceIdKey]: ctxInstanceId, + [ApplyPathKey]: [] + }; + const ctx = callMethod(canvasInstance, [ "getContext" ], [ contextType, contextAttributes ], 1, ctxInstanceId); + const WebGLRenderingContextHandler = { + get: (target, propName) => "string" == typeof propName ? "function" != typeof ctx[propName] ? ctx[propName] : (...args) => callMethod(ctxInstance, [ propName ], args, getWebGlMethodCallType(propName)) : target[propName], + set(target, propName, value) { + if ("string" == typeof propName && propName in ctx) { + ctx[propName] !== value && "function" != typeof value && setter(ctxInstance, [ propName ], value); + ctx[propName] = value; + } else { + target[propName] = value; + } + return true; + } + }; + return new Proxy(ctx, WebGLRenderingContextHandler); + }; + const ctxWebGLGetterMethods = "checkFramebufferStatus,makeXRCompatible".split(","); + const getWebGlMethodCallType = methodName => methodName.startsWith("create") || methodName.startsWith("get") || methodName.startsWith("is") || ctxWebGLGetterMethods.includes(methodName) ? 1 : 2; + defineCstr(win, "CanvasGradient", WorkerCanvasGradient); + defineCstr(win, "CanvasPattern", WorkerCanvasPattern); + definePrototypePropertyDescriptor(win.HTMLCanvasElement, HTMLCanvasDescriptorMap); + }; + const initMedia = (WorkerBase, WorkerEventTargetProxy, env, win) => { + var _a, _b; + win.Audio = defineCstrName("HTMLAudioElement", class { + constructor(src) { + const audio = env.$createNode$("audio", randomId()); + audio.src = src; + return audio; + } + }); + const WorkerAudioTrack = class extends WorkerBase { + get enabled() { + return getter(this, [ "enabled" ]); + } + set enabled(value) { + setter(this, [ "enabled" ], value); + } + get id() { + return getter(this, [ "id" ]); + } + get kind() { + return getter(this, [ "kind" ]); + } + get label() { + return getter(this, [ "label" ]); + } + get language() { + return getter(this, [ "language" ]); + } + get sourceBuffer() { + return new WorkerSourceBuffer(this); + } + }; + const WorkerAudioTrackList = class { + constructor(mediaElm) { + const winId = mediaElm[WinIdKey]; + const instanceId = mediaElm[InstanceIdKey]; + const instance = { + addEventListener(...args) { + callMethod(mediaElm, [ "audioTracks", "addEventListener" ], args, 3); + }, + getTrackById: (...args) => callMethod(mediaElm, [ "audioTracks", "getTrackById" ], args), + get length() { + return getter(mediaElm, [ "audioTracks", "length" ]); + }, + removeEventListener(...args) { + callMethod(mediaElm, [ "audioTracks", "removeEventListener" ], args, 3); + } + }; + return new Proxy(instance, { + get: (target, propName) => "number" == typeof propName ? new WorkerAudioTrack(winId, instanceId, [ "audioTracks", propName ]) : target[propName] + }); + } + }; + const WorkerSourceBufferList = defineCstr(win, "SourceBufferList", class extends Array { + constructor(mediaSource) { + super(); + this[MediaSourceKey] = mediaSource; + } + addEventListener(...args) { + callMethod(this[MediaSourceKey], [ "sourceBuffers", "addEventListener" ], args, 3); + } + removeEventListener(...args) { + callMethod(this[MediaSourceKey], [ "sourceBuffers", "removeEventListener" ], args, 3); + } + }); + const WorkerSourceBuffer = defineCstr(win, "SourceBuffer", (_b = class extends WorkerEventTargetProxy { + constructor(mediaSource) { + super(mediaSource[WinIdKey], mediaSource[InstanceIdKey], [ "sourceBuffers" ]); + this[_a] = []; + this[MediaSourceKey] = mediaSource; + } + abort() { + const sbIndex = getSourceBufferIndex(this); + callMethod(this, [ sbIndex, "appendWindowStart" ], EMPTY_ARRAY, 1); + } + addEventListener(...args) { + const sbIndex = getSourceBufferIndex(this); + callMethod(this, [ sbIndex, "addEventListener" ], args, 3); + } + appendBuffer(buf) { + this[SourceBufferTasksKey].push([ "appendBuffer", [ buf ], buf ]); + drainSourceBufferQueue(this); + } + get appendWindowStart() { + const sbIndex = getSourceBufferIndex(this); + return getter(this, [ sbIndex, "appendWindowStart" ]); + } + set appendWindowStart(value) { + const sbIndex = getSourceBufferIndex(this); + setter(this, [ sbIndex, "appendWindowStart" ], value); + } + get appendWindowEnd() { + const sbIndex = getSourceBufferIndex(this); + return getter(this, [ sbIndex, "appendWindowEnd" ]); + } + set appendWindowEnd(value) { + const sbIndex = getSourceBufferIndex(this); + setter(this, [ sbIndex, "appendWindowEnd" ], value); + } + get buffered() { + const mediaSource = this[MediaSourceKey]; + const sbIndex = getSourceBufferIndex(this); + const timeRanges = new WorkerTimeRanges(mediaSource[WinIdKey], mediaSource[InstanceIdKey], [ "sourceBuffers", sbIndex, "buffered" ]); + return timeRanges; + } + changeType(mimeType) { + const sbIndex = getSourceBufferIndex(this); + callMethod(this, [ sbIndex, "changeType" ], [ mimeType ], 2); + } + get mode() { + const sbIndex = getSourceBufferIndex(this); + return getter(this, [ sbIndex, "mode" ]); + } + set mode(value) { + const sbIndex = getSourceBufferIndex(this); + setter(this, [ sbIndex, "mode" ], value); + } + remove(start, end) { + this[SourceBufferTasksKey].push([ "remove", [ start, end ] ]); + drainSourceBufferQueue(this); + } + removeEventListener(...args) { + const sbIndex = getSourceBufferIndex(this); + callMethod(this, [ sbIndex, "removeEventListener" ], args, 3); + } + get timestampOffset() { + const sbIndex = getSourceBufferIndex(this); + return getter(this, [ sbIndex, "timestampOffset" ]); + } + set timestampOffset(value) { + const sbIndex = getSourceBufferIndex(this); + setter(this, [ sbIndex, "timestampOffset" ], value); + } + get updating() { + const sbIndex = getSourceBufferIndex(this); + return getter(this, [ sbIndex, "updating" ]); + } + }, _a = SourceBufferTasksKey, _b)); + const WorkerTimeRanges = defineCstr(win, "TimeRanges", class extends WorkerBase { + start(...args) { + return callMethod(this, [ "start" ], args); + } + end(...args) { + return callMethod(this, [ "end" ], args); + } + get length() { + return getter(this, [ "length" ]); + } + }); + const getSourceBufferIndex = sourceBuffer => { + if (sourceBuffer) { + const mediaSource = sourceBuffer[MediaSourceKey]; + const sourceBufferList = mediaSource[SourceBuffersKey]; + return sourceBufferList.indexOf(sourceBuffer); + } + return -1; + }; + const drainSourceBufferQueue = sourceBuffer => { + if (sourceBuffer[SourceBufferTasksKey].length) { + if (!sourceBuffer.updating) { + const task = sourceBuffer[SourceBufferTasksKey].shift(); + if (task) { + const sbIndex = getSourceBufferIndex(sourceBuffer); + callMethod(sourceBuffer, [ sbIndex, task[0] ], task[1], 3, void 0, task[2]); + } + } + setTimeout((() => drainSourceBufferQueue(sourceBuffer)), 50); + } + }; + const HTMLMediaDescriptorMap = { + buffered: { + get() { + if (!this[TimeRangesKey]) { + this[TimeRangesKey] = new WorkerTimeRanges(this[WinIdKey], this[InstanceIdKey], [ "buffered" ]); + setTimeout((() => { + this[TimeRangesKey] = void 0; + }), 5e3); + } + return this[TimeRangesKey]; + } + }, + readyState: { + get() { + if (4 === this[ReadyStateKey]) { + return 4; + } + if ("number" != typeof this[ReadyStateKey]) { + this[ReadyStateKey] = getter(this, [ "readyState" ]); + setTimeout((() => { + this[ReadyStateKey] = void 0; + }), 1e3); + } + return this[ReadyStateKey]; + } + } + }; + defineCstr(win, "MediaSource", class extends WorkerEventTargetProxy { + constructor() { + super(env.$winId$); + this[SourceBuffersKey] = new WorkerSourceBufferList(this); + constructGlobal(this, "MediaSource", EMPTY_ARRAY); + } + get activeSourceBuffers() { + return []; + } + addSourceBuffer(mimeType) { + const sourceBuffer = new WorkerSourceBuffer(this); + this[SourceBuffersKey].push(sourceBuffer); + callMethod(this, [ "addSourceBuffer" ], [ mimeType ]); + return sourceBuffer; + } + clearLiveSeekableRange() { + callMethod(this, [ "clearLiveSeekableRange" ], EMPTY_ARRAY, 2); + } + get duration() { + return getter(this, [ "duration" ]); + } + set duration(value) { + setter(this, [ "duration" ], value); + } + endOfStream(endOfStreamError) { + callMethod(this, [ "endOfStream" ], [ endOfStreamError ], 3); + } + get readyState() { + return getter(this, [ "readyState" ]); + } + removeSourceBuffer(sourceBuffer) { + const index = getSourceBufferIndex(sourceBuffer); + if (index > -1) { + this[SourceBuffersKey].splice(index, 1); + callMethod(this, [ "removeSourceBuffer" ], [ index ], 1); + } + } + setLiveSeekableRange(start, end) { + callMethod(this, [ "setLiveSeekableRange" ], [ start, end ], 2); + } + get sourceBuffers() { + return this[SourceBuffersKey]; + } + static isTypeSupported(mimeType) { + if (!isStaticTypeSupported.has(mimeType)) { + const isSupported = callMethod(win, [ "MediaSource", "isTypeSupported" ], [ mimeType ]); + isStaticTypeSupported.set(mimeType, isSupported); + } + return isStaticTypeSupported.get(mimeType); + } + }); + const winURL = win.URL = defineCstrName("URL", class extends URL {}); + const hasAudioTracks = "audioTracks" in win.HTMLMediaElement.prototype; + if (hasAudioTracks) { + defineCstr(win, "AudioTrackList", WorkerAudioTrackList); + defineCstr(win, "AudioTrack", WorkerAudioTrack); + HTMLMediaDescriptorMap.audioTracks = { + get() { + return new WorkerAudioTrackList(this); + } + }; + } + definePrototypePropertyDescriptor(win.HTMLMediaElement, HTMLMediaDescriptorMap); + winURL.createObjectURL = obj => callMethod(win, [ "URL", "createObjectURL" ], [ obj ]); + winURL.revokeObjectURL = obj => callMethod(win, [ "URL", "revokeObjectURL" ], [ obj ]); + }; + const isStaticTypeSupported = new Map; + self.$bridgeFromMedia$ = (WorkerBase, WorkerEventTargetProxy, env, win, windowMediaConstructors) => { + windowMediaConstructors.map((mediaCstrName => { + delete win[mediaCstrName]; + })); + initCanvas(WorkerBase, win); + initMedia(WorkerBase, WorkerEventTargetProxy, env, win); + }; +})(self); diff --git a/~partytown/debug/partytown-sandbox-sw.js b/~partytown/debug/partytown-sandbox-sw.js new file mode 100644 index 00000000..7ad6276f --- /dev/null +++ b/~partytown/debug/partytown-sandbox-sw.js @@ -0,0 +1,559 @@ +/* Partytown 0.7.6 - MIT builder.io */ +(window => { + const isPromise = v => "object" == typeof v && v && v.then; + const noop = () => {}; + const len = obj => obj.length; + const getConstructorName = obj => { + var _a, _b, _c; + try { + const constructorName = null === (_a = null == obj ? void 0 : obj.constructor) || void 0 === _a ? void 0 : _a.name; + if (constructorName) { + return constructorName; + } + } catch (e) {} + try { + const zoneJsConstructorName = null === (_c = null === (_b = null == obj ? void 0 : obj.__zone_symbol__originalInstance) || void 0 === _b ? void 0 : _b.constructor) || void 0 === _c ? void 0 : _c.name; + if (zoneJsConstructorName) { + return zoneJsConstructorName; + } + } catch (e) {} + return ""; + }; + const startsWith = (str, val) => str.startsWith(val); + const isValidMemberName = memberName => !(startsWith(memberName, "webkit") || startsWith(memberName, "toJSON") || startsWith(memberName, "constructor") || startsWith(memberName, "toString") || startsWith(memberName, "_")); + const getNodeName = node => 11 === node.nodeType && node.host ? "#s" : node.nodeName; + const randomId = () => Math.round(Math.random() * Number.MAX_SAFE_INTEGER).toString(36); + const defineConstructorName = (Cstr, value) => ((obj, memberName, descriptor) => Object.defineProperty(obj, memberName, { + ...descriptor, + configurable: true + }))(Cstr, "name", { + value: value + }); + const htmlConstructorTags = { + Anchor: "a", + DList: "dl", + Image: "img", + OList: "ol", + Paragraph: "p", + Quote: "q", + TableCaption: "caption", + TableCell: "td", + TableCol: "colgroup", + TableRow: "tr", + TableSection: "tbody", + UList: "ul" + }; + const svgConstructorTags = { + Graphics: "g", + SVG: "svg" + }; + const InstanceIdKey = Symbol(); + const CreatedKey = Symbol(); + const instances = new Map; + const mainRefs = new Map; + const winCtxs = {}; + const windowIds = new WeakMap; + const getAndSetInstanceId = (instance, instanceId) => { + if (instance) { + if (instanceId = windowIds.get(instance)) { + return instanceId; + } + (instanceId = instance[InstanceIdKey]) || setInstanceId(instance, instanceId = randomId()); + return instanceId; + } + }; + const getInstance = (winId, instanceId, win, doc, docId) => { + if ((win = winCtxs[winId]) && win.$window$) { + if (winId === instanceId) { + return win.$window$; + } + doc = win.$window$.document; + docId = instanceId.split(".").pop(); + if ("d" === docId) { + return doc; + } + if ("e" === docId) { + return doc.documentElement; + } + if ("h" === docId) { + return doc.head; + } + if ("b" === docId) { + return doc.body; + } + } + return instances.get(instanceId); + }; + const setInstanceId = (instance, instanceId, now) => { + if (instance) { + instances.set(instanceId, instance); + instance[InstanceIdKey] = instanceId; + instance[CreatedKey] = now = Date.now(); + if (now > lastCleanup + 5e3) { + instances.forEach(((storedInstance, instanceId) => { + storedInstance[CreatedKey] < lastCleanup && storedInstance.nodeType && !storedInstance.isConnected && instances.delete(instanceId); + })); + lastCleanup = now; + } + } + }; + let lastCleanup = 0; + const mainWindow = window.parent; + const docImpl = document.implementation.createHTMLDocument(); + const config = mainWindow.partytown || {}; + const libPath = (config.lib || "/~partytown/") + "debug/"; + const logMain = msg => { + console.debug.apply(console, [ "%cMain 🌎", "background: #717171; color: white; padding: 2px 3px; border-radius: 2px; font-size: 0.8em;", msg ]); + }; + const winIds = []; + const normalizedWinId = winId => { + winIds.includes(winId) || winIds.push(winId); + return winIds.indexOf(winId) + 1; + }; + const defineCustomElement = (winId, worker, ceData) => { + const Cstr = defineConstructorName(class extends winCtxs[winId].$window$.HTMLElement {}, ceData[0]); + const ceCallbackMethods = "connectedCallback,disconnectedCallback,attributeChangedCallback,adoptedCallback".split(","); + ceCallbackMethods.map((callbackMethodName => Cstr.prototype[callbackMethodName] = function(...args) { + worker.postMessage([ 15, winId, getAndSetInstanceId(this), callbackMethodName, args ]); + })); + Cstr.observedAttributes = ceData[1]; + return Cstr; + }; + const serializeForWorker = ($winId$, value, added, type, cstrName) => void 0 !== value && (type = typeof value) ? "string" === type || "number" === type || "boolean" === type || null == value ? [ 0, value ] : "function" === type ? [ 6 ] : (added = added || new Set) && Array.isArray(value) ? added.has(value) ? [ 1, [] ] : added.add(value) && [ 1, value.map((v => serializeForWorker($winId$, v, added))) ] : "object" === type ? serializedValueIsError(value) ? [ 14, { + name: value.name, + message: value.message, + stack: value.stack + } ] : "" === (cstrName = getConstructorName(value)) ? [ 2, {} ] : "Window" === cstrName ? [ 3, [ $winId$, $winId$ ] ] : "HTMLCollection" === cstrName || "NodeList" === cstrName ? [ 7, Array.from(value).map((v => serializeForWorker($winId$, v, added)[1])) ] : cstrName.endsWith("Event") ? [ 5, serializeObjectForWorker($winId$, value, added) ] : "CSSRuleList" === cstrName ? [ 12, Array.from(value).map(serializeCssRuleForWorker) ] : startsWith(cstrName, "CSS") && cstrName.endsWith("Rule") ? [ 11, serializeCssRuleForWorker(value) ] : "CSSStyleDeclaration" === cstrName ? [ 13, serializeObjectForWorker($winId$, value, added) ] : "Attr" === cstrName ? [ 10, [ value.name, value.value ] ] : value.nodeType ? [ 3, [ $winId$, getAndSetInstanceId(value), getNodeName(value) ] ] : [ 2, serializeObjectForWorker($winId$, value, added, true, true) ] : void 0 : value; + const serializeObjectForWorker = (winId, obj, added, includeFunctions, includeEmptyStrings, serializedObj, propName, propValue) => { + serializedObj = {}; + if (!added.has(obj)) { + added.add(obj); + for (propName in obj) { + if (isValidMemberName(propName)) { + propValue = "path" === propName && getConstructorName(obj).endsWith("Event") ? obj.composedPath() : obj[propName]; + (includeFunctions || "function" != typeof propValue) && (includeEmptyStrings || "" !== propValue) && (serializedObj[propName] = serializeForWorker(winId, propValue, added)); + } + } + } + return serializedObj; + }; + const serializeCssRuleForWorker = cssRule => { + let obj = {}; + let key; + for (key in cssRule) { + validCssRuleProps.includes(key) && (obj[key] = String(cssRule[key])); + } + return obj; + }; + const serializedValueIsError = value => value instanceof window.top.Error; + const deserializeFromWorker = (worker, serializedTransfer, serializedType, serializedValue) => { + if (serializedTransfer) { + serializedType = serializedTransfer[0]; + serializedValue = serializedTransfer[1]; + return 0 === serializedType ? serializedValue : 4 === serializedType ? deserializeRefFromWorker(worker, serializedValue) : 1 === serializedType ? serializedValue.map((v => deserializeFromWorker(worker, v))) : 3 === serializedType ? getInstance(serializedValue[0], serializedValue[1]) : 5 === serializedType ? constructEvent(deserializeObjectFromWorker(worker, serializedValue)) : 2 === serializedType ? deserializeObjectFromWorker(worker, serializedValue) : 8 === serializedType ? serializedValue : 9 === serializedType ? new window[serializedTransfer[2]](serializedValue) : void 0; + } + }; + const deserializeRefFromWorker = (worker, {$winId$: $winId$, $instanceId$: $instanceId$, $refId$: $refId$}, ref) => { + ref = mainRefs.get($refId$); + if (!ref) { + ref = function(...args) { + worker.postMessage([ 9, { + $winId$: $winId$, + $instanceId$: $instanceId$, + $refId$: $refId$, + $thisArg$: serializeForWorker($winId$, this), + $args$: serializeForWorker($winId$, args) + } ]); + }; + mainRefs.set($refId$, ref); + } + return ref; + }; + const constructEvent = eventProps => new ("detail" in eventProps ? CustomEvent : Event)(eventProps.type, eventProps); + const deserializeObjectFromWorker = (worker, serializedValue, obj, key) => { + obj = {}; + for (key in serializedValue) { + obj[key] = deserializeFromWorker(worker, serializedValue[key]); + } + return obj; + }; + const validCssRuleProps = "cssText,selectorText,href,media,namespaceURI,prefix,name,conditionText".split(","); + const mainAccessHandler = async (worker, accessReq) => { + let accessRsp = { + $msgId$: accessReq.$msgId$ + }; + let totalTasks = len(accessReq.$tasks$); + let i = 0; + let task; + let winId; + let applyPath; + let instance; + let rtnValue; + let isLast; + for (;i < totalTasks; i++) { + try { + isLast = i === totalTasks - 1; + task = accessReq.$tasks$[i]; + winId = task.$winId$; + applyPath = task.$applyPath$; + !winCtxs[winId] && winId.startsWith("f_") && await new Promise((resolve => { + let check = 0; + let callback = () => { + winCtxs[winId] || check++ > 1e3 ? resolve() : requestAnimationFrame(callback); + }; + callback(); + })); + if (1 === applyPath[0] && applyPath[1] in winCtxs[winId].$window$) { + setInstanceId(new winCtxs[winId].$window$[applyPath[1]](...deserializeFromWorker(worker, applyPath[2])), task.$instanceId$); + } else { + instance = getInstance(winId, task.$instanceId$); + if (instance) { + rtnValue = applyToInstance(worker, winId, instance, applyPath, isLast, task.$groupedGetters$); + task.$assignInstanceId$ && ("string" == typeof task.$assignInstanceId$ ? setInstanceId(rtnValue, task.$assignInstanceId$) : winCtxs[task.$assignInstanceId$.$winId$] = { + $winId$: task.$assignInstanceId$.$winId$, + $window$: { + document: rtnValue + } + }); + if (isPromise(rtnValue)) { + rtnValue = await rtnValue; + isLast && (accessRsp.$isPromise$ = true); + } + isLast && (accessRsp.$rtnValue$ = serializeForWorker(winId, rtnValue)); + } else { + accessRsp.$error$ = `Error finding instance "${task.$instanceId$}" on window ${normalizedWinId(winId)}`; + console.error(accessRsp.$error$, task); + } + } + } catch (e) { + isLast ? accessRsp.$error$ = String(e.stack || e) : console.error(e); + } + } + return accessRsp; + }; + const applyToInstance = (worker, winId, instance, applyPath, isLast, groupedGetters) => { + let i = 0; + let l = len(applyPath); + let next; + let current; + let previous; + let args; + let groupedRtnValues; + for (;i < l; i++) { + current = applyPath[i]; + next = applyPath[i + 1]; + previous = applyPath[i - 1]; + try { + if (!Array.isArray(next)) { + if ("string" == typeof current || "number" == typeof current) { + if (i + 1 === l && groupedGetters) { + groupedRtnValues = {}; + groupedGetters.map((propName => groupedRtnValues[propName] = instance[propName])); + return groupedRtnValues; + } + instance = instance[current]; + } else { + if (0 === next) { + instance[previous] = deserializeFromWorker(worker, current); + return; + } + if ("function" == typeof instance[previous]) { + args = deserializeFromWorker(worker, current); + "define" === previous && "CustomElementRegistry" === getConstructorName(instance) && (args[1] = defineCustomElement(winId, worker, args[1])); + "insertRule" === previous && args[1] > len(instance.cssRules) && (args[1] = len(instance.cssRules)); + instance = instance[previous].apply(instance, args); + if ("play" === previous) { + return Promise.resolve(); + } + } + } + } + } catch (err) { + if (isLast) { + throw err; + } + console.debug("Non-blocking setter error:", err); + } + } + return instance; + }; + const readNextScript = (worker, winCtx) => { + let $winId$ = winCtx.$winId$; + let win = winCtx.$window$; + let doc = win.document; + let scriptSelector = 'script[type="text/partytown"]:not([data-ptid]):not([data-pterror])'; + let scriptElm; + let $instanceId$; + let scriptData; + if (doc && doc.body) { + scriptElm = doc.querySelector('script[type="text/partytown"]:not([data-ptid]):not([data-pterror]):not([async]):not([defer])'); + scriptElm || (scriptElm = doc.querySelector(scriptSelector)); + if (scriptElm) { + scriptElm.dataset.ptid = $instanceId$ = getAndSetInstanceId(scriptElm, $winId$); + scriptData = { + $winId$: $winId$, + $instanceId$: $instanceId$ + }; + if (scriptElm.src) { + scriptData.$url$ = scriptElm.src; + scriptData.$orgUrl$ = scriptElm.dataset.ptsrc || scriptElm.src; + } else { + scriptData.$content$ = scriptElm.innerHTML; + } + worker.postMessage([ 7, scriptData ]); + } else { + if (!winCtx.$isInitialized$) { + winCtx.$isInitialized$ = 1; + ((worker, $winId$, win) => { + let queuedForwardCalls = win._ptf; + let forwards = (win.partytown || {}).forward || []; + let i; + let mainForwardFn; + let forwardCall = ($forward$, args) => worker.postMessage([ 10, { + $winId$: $winId$, + $forward$: $forward$, + $args$: serializeForWorker($winId$, Array.from(args)) + } ]); + win._ptf = void 0; + forwards.map((forwardProps => { + mainForwardFn = win; + forwardProps.split(".").map(((_, i, arr) => { + mainForwardFn = mainForwardFn[arr[i]] = i + 1 < len(arr) ? mainForwardFn[arr[i]] || ("push" === arr[i + 1] ? [] : {}) : (...args) => forwardCall(arr, args); + })); + })); + if (queuedForwardCalls) { + for (i = 0; i < len(queuedForwardCalls); i += 2) { + forwardCall(queuedForwardCalls[i], queuedForwardCalls[i + 1]); + } + } + })(worker, $winId$, win); + doc.dispatchEvent(new CustomEvent("pt0")); + { + const winType = win === win.top ? "top" : "iframe"; + logMain(`Executed ${winType} window ${normalizedWinId($winId$)} environment scripts in ${(performance.now() - winCtx.$startTime$).toFixed(1)}ms`); + } + } + worker.postMessage([ 8, $winId$ ]); + } + } else { + requestAnimationFrame((() => readNextScript(worker, winCtx))); + } + }; + const registerWindow = (worker, $winId$, $window$) => { + if (!windowIds.has($window$)) { + windowIds.set($window$, $winId$); + const doc = $window$.document; + const history = $window$.history; + const $parentWinId$ = windowIds.get($window$.parent); + let initialised = false; + const onInitialisedQueue = []; + const onInitialised = callback => { + initialised ? callback() : onInitialisedQueue.push(callback); + }; + const sendInitEnvData = () => { + worker.postMessage([ 5, { + $winId$: $winId$, + $parentWinId$: $parentWinId$, + $url$: doc.baseURI, + $visibilityState$: doc.visibilityState + } ]); + setTimeout((() => { + initialised = true; + onInitialisedQueue.forEach((callback => { + callback(); + })); + })); + }; + const pushState = history.pushState.bind(history); + const replaceState = history.replaceState.bind(history); + const onLocationChange = (type, state, newUrl, oldUrl) => () => { + setTimeout((() => { + worker.postMessage([ 13, { + $winId$: $winId$, + type: type, + state: state, + url: doc.baseURI, + newUrl: newUrl, + oldUrl: oldUrl + } ]); + })); + }; + history.pushState = (state, _, newUrl) => { + pushState(state, _, newUrl); + onInitialised(onLocationChange(0, state, null == newUrl ? void 0 : newUrl.toString())); + }; + history.replaceState = (state, _, newUrl) => { + replaceState(state, _, newUrl); + onInitialised(onLocationChange(1, state, null == newUrl ? void 0 : newUrl.toString())); + }; + $window$.addEventListener("popstate", (event => { + onInitialised(onLocationChange(2, event.state)); + })); + $window$.addEventListener("hashchange", (event => { + onInitialised(onLocationChange(3, {}, event.newURL, event.oldURL)); + })); + $window$.addEventListener("ptupdate", (() => { + readNextScript(worker, winCtxs[$winId$]); + })); + doc.addEventListener("visibilitychange", (() => worker.postMessage([ 14, $winId$, doc.visibilityState ]))); + winCtxs[$winId$] = { + $winId$: $winId$, + $window$: $window$ + }; + winCtxs[$winId$].$startTime$ = performance.now(); + { + const winType = $winId$ === $parentWinId$ ? "top" : "iframe"; + logMain(`Registered ${winType} window ${normalizedWinId($winId$)}`); + } + "complete" === doc.readyState ? sendInitEnvData() : $window$.addEventListener("load", sendInitEnvData); + } + }; + const onMessageFromWebWorker = (worker, msg, winCtx) => { + if (4 === msg[0]) { + registerWindow(worker, randomId(), mainWindow); + } else { + winCtx = winCtxs[msg[1]]; + winCtx && (7 === msg[0] ? requestAnimationFrame((() => readNextScript(worker, winCtx))) : 6 === msg[0] && ((worker, winCtx, instanceId, errorMsg, scriptElm) => { + scriptElm = winCtx.$window$.document.querySelector(`[data-ptid="${instanceId}"]`); + if (scriptElm) { + errorMsg ? scriptElm.dataset.pterror = errorMsg : scriptElm.type += "-x"; + delete scriptElm.dataset.ptid; + } + readNextScript(worker, winCtx); + })(worker, winCtx, msg[2], msg[3])); + } + }; + const readMainPlatform = () => { + const elm = docImpl.createElement("i"); + const textNode = docImpl.createTextNode(""); + const comment = docImpl.createComment(""); + const frag = docImpl.createDocumentFragment(); + const shadowRoot = docImpl.createElement("p").attachShadow({ + mode: "open" + }); + const intersectionObserver = getGlobalConstructor(mainWindow, "IntersectionObserver"); + const mutationObserver = getGlobalConstructor(mainWindow, "MutationObserver"); + const resizeObserver = getGlobalConstructor(mainWindow, "ResizeObserver"); + const perf = mainWindow.performance; + const screen = mainWindow.screen; + const impls = [ [ mainWindow.history ], [ perf ], [ perf.navigation ], [ perf.timing ], [ screen ], [ screen.orientation ], [ mainWindow.visualViewport ], [ intersectionObserver, 12 ], [ mutationObserver, 12 ], [ resizeObserver, 12 ], [ textNode ], [ comment ], [ frag ], [ shadowRoot ], [ elm ], [ elm.attributes ], [ elm.classList ], [ elm.dataset ], [ elm.style ], [ docImpl ], [ docImpl.doctype ] ]; + const initialInterfaces = [ readImplementation("Window", mainWindow), readImplementation("Node", textNode) ]; + const $config$ = JSON.stringify(config, ((k, v) => { + if ("function" == typeof v) { + v = String(v); + v.startsWith(k + "(") && (v = "function " + v); + } + return v; + })); + const initWebWorkerData = { + $config$: $config$, + $interfaces$: readImplementations(impls, initialInterfaces), + $libPath$: new URL(libPath, mainWindow.location) + "", + $origin$: origin, + $localStorage$: readStorage("localStorage"), + $sessionStorage$: readStorage("sessionStorage") + }; + addGlobalConstructorUsingPrototype(initWebWorkerData.$interfaces$, mainWindow, "IntersectionObserverEntry"); + return initWebWorkerData; + }; + const readMainInterfaces = () => { + const elms = Object.getOwnPropertyNames(mainWindow).map((interfaceName => ((doc, interfaceName, r, tag) => { + r = interfaceName.match(/^(HTML|SVG)(.+)Element$/); + if (r) { + tag = r[2]; + return "S" == interfaceName[0] ? doc.createElementNS("http://www.w3.org/2000/svg", svgConstructorTags[tag] || tag.slice(0, 2).toLowerCase() + tag.slice(2)) : doc.createElement(htmlConstructorTags[tag] || tag); + } + })(docImpl, interfaceName))).filter((elm => elm)).map((elm => [ elm ])); + return readImplementations(elms, []); + }; + const cstrs = new Set([ "Object" ]); + const readImplementations = (impls, interfaces) => { + const cstrImpls = impls.filter((implData => implData[0])).map((implData => { + const impl = implData[0]; + const interfaceType = implData[1]; + const cstrName = getConstructorName(impl); + const CstrPrototype = mainWindow[cstrName].prototype; + return [ cstrName, CstrPrototype, impl, interfaceType ]; + })); + cstrImpls.map((([cstrName, CstrPrototype, impl, intefaceType]) => readOwnImplementation(cstrs, interfaces, cstrName, CstrPrototype, impl, intefaceType))); + return interfaces; + }; + const readImplementation = (cstrName, impl, memberName) => { + let interfaceMembers = []; + let interfaceInfo = [ cstrName, "Object", interfaceMembers ]; + for (memberName in impl) { + readImplementationMember(interfaceMembers, impl, memberName); + } + return interfaceInfo; + }; + const readOwnImplementation = (cstrs, interfaces, cstrName, CstrPrototype, impl, interfaceType) => { + if (!cstrs.has(cstrName)) { + cstrs.add(cstrName); + const SuperCstr = Object.getPrototypeOf(CstrPrototype); + const superCstrName = getConstructorName(SuperCstr); + const interfaceMembers = []; + const propDescriptors = Object.getOwnPropertyDescriptors(CstrPrototype); + readOwnImplementation(cstrs, interfaces, superCstrName, SuperCstr, impl, interfaceType); + for (const memberName in propDescriptors) { + readImplementationMember(interfaceMembers, impl, memberName); + } + interfaces.push([ cstrName, superCstrName, interfaceMembers, interfaceType, getNodeName(impl) ]); + } + }; + const readImplementationMember = (interfaceMembers, implementation, memberName, value, memberType, cstrName) => { + try { + if (isValidMemberName(memberName) && isNaN(memberName[0]) && "all" !== memberName) { + value = implementation[memberName]; + memberType = typeof value; + if ("function" === memberType) { + (String(value).includes("[native") || Object.getPrototypeOf(implementation)[memberName]) && interfaceMembers.push([ memberName, 5 ]); + } else if ("object" === memberType && null != value) { + cstrName = getConstructorName(value); + "Object" !== cstrName && self[cstrName] && interfaceMembers.push([ memberName, value.nodeType || cstrName ]); + } else { + "symbol" !== memberType && (memberName.toUpperCase() === memberName ? interfaceMembers.push([ memberName, 6, value ]) : interfaceMembers.push([ memberName, 6 ])); + } + } + } catch (e) { + console.warn(e); + } + }; + const readStorage = storageName => { + let items = []; + let i = 0; + let l = len(mainWindow[storageName]); + let key; + for (;i < l; i++) { + key = mainWindow[storageName].key(i); + items.push([ key, mainWindow[storageName].getItem(key) ]); + } + return items; + }; + const getGlobalConstructor = (mainWindow, cstrName) => void 0 !== mainWindow[cstrName] ? new mainWindow[cstrName](noop) : 0; + const addGlobalConstructorUsingPrototype = ($interfaces$, mainWindow, cstrName) => { + void 0 !== mainWindow[cstrName] && $interfaces$.push([ cstrName, "Object", Object.keys(mainWindow[cstrName].prototype).map((propName => [ propName, 6 ])), 12 ]); + }; + let worker; + (receiveMessage => { + const swContainer = window.navigator.serviceWorker; + return swContainer.getRegistration().then((swRegistration => { + swContainer.addEventListener("message", (ev => receiveMessage(ev.data, (accessRsp => swRegistration.active && swRegistration.active.postMessage(accessRsp))))); + return (worker, msg) => { + 0 === msg[0] ? worker.postMessage([ 1, readMainPlatform() ]) : 2 === msg[0] ? worker.postMessage([ 3, readMainInterfaces() ]) : onMessageFromWebWorker(worker, msg); + }; + })); + })(((accessReq, responseCallback) => mainAccessHandler(worker, accessReq).then(responseCallback))).then((onMessageHandler => { + if (onMessageHandler) { + worker = new Worker(libPath + "partytown-ww-sw.js?v=0.7.6", { + name: "Partytown 🎉" + }); + worker.onmessage = ev => { + const msg = ev.data; + 12 === msg[0] ? mainAccessHandler(worker, msg[1]) : onMessageHandler(worker, msg); + }; + logMain("Created Partytown web worker (0.7.6)"); + worker.onerror = ev => console.error("Web Worker Error", ev); + mainWindow.addEventListener("pt1", (ev => registerWindow(worker, getAndSetInstanceId(ev.detail.frameElement), ev.detail))); + } + })); +})(window); diff --git a/~partytown/debug/partytown-sw.js b/~partytown/debug/partytown-sw.js new file mode 100644 index 00000000..d989f8a7 --- /dev/null +++ b/~partytown/debug/partytown-sw.js @@ -0,0 +1,59 @@ +/* Partytown 0.7.6 - MIT builder.io */ +const resolves = new Map; + +const swMessageError = (accessReq, $error$) => ({ + $msgId$: accessReq.$msgId$, + $error$: $error$ +}); + +const httpRequestFromWebWorker = req => new Promise((async resolve => { + const accessReq = await req.clone().json(); + const responseData = await (accessReq => new Promise((async resolve => { + const clients = await self.clients.matchAll(); + const client = [ ...clients ].sort(((a, b) => a.url > b.url ? -1 : a.url < b.url ? 1 : 0))[0]; + if (client) { + const timeout = 12e4; + const msgResolve = [ resolve, setTimeout((() => { + resolves.delete(accessReq.$msgId$); + resolve(swMessageError(accessReq, "Timeout")); + }), timeout) ]; + resolves.set(accessReq.$msgId$, msgResolve); + client.postMessage(accessReq); + } else { + resolve(swMessageError(accessReq, "NoParty")); + } + })))(accessReq); + resolve(response(JSON.stringify(responseData), "application/json")); +})); + +const response = (body, contentType) => new Response(body, { + headers: { + "content-type": contentType || "text/html", + "Cache-Control": "no-store" + } +}); + +self.oninstall = () => self.skipWaiting(); + +self.onactivate = () => self.clients.claim(); + +self.onmessage = ev => { + const accessRsp = ev.data; + const r = resolves.get(accessRsp.$msgId$); + if (r) { + resolves.delete(accessRsp.$msgId$); + clearTimeout(r[1]); + r[0](accessRsp); + } +}; + +self.onfetch = ev => { + const req = ev.request; + const url = new URL(req.url); + const pathname = url.pathname; + if (pathname.endsWith("sw.html")) { + ev.respondWith(response('

    Violentmonkey

    An open source userscript manager.

    + +

    Violentmonkey provides userscripts support for browsers.

    +

    Features

    +
      +
    • Powerful +
        +
      • Customize web pages.
      • +
      • Automate your work.
      • +
      +
    • +
    • Data on the cloud +
        +
      • Sync to Dropbox, OneDrive, Google Drive, or a WebDAV service.
      • +
      • Sync between different browsers.
      • +
      +
    • +
    • User-friendly +
        +
      • Keep simple, no need to make choices.
      • +
      • Communicate with external editors.
      • +
      +
    • +
    +

    Note: This extension does not contain any ads and does not modify web pages automatically. +Any changes and modifications on the sites are done by installed scripts. +Therefore, please install only scripts that you trust.

    +

    Installation

    +

    Violentmonkey is built with web extension APIs, thus supports many browsers.

    + +

    View all versions (including Beta) here.

    +

    Contribution

    +

    You are absolutely welcome to contribute to this project by:

    +

    Open Chat

c^JnyrQl& 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