Index: frontend/node_modules/workbox-precaching/LICENSE
===================================================================
--- frontend/node_modules/workbox-precaching/LICENSE	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/LICENSE	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,19 @@
+Copyright 2018 Google LLC
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
Index: frontend/node_modules/workbox-precaching/PrecacheController.d.ts
===================================================================
--- frontend/node_modules/workbox-precaching/PrecacheController.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/PrecacheController.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,142 @@
+import { Strategy } from 'workbox-strategies/Strategy.js';
+import { RouteHandlerCallback, WorkboxPlugin } from 'workbox-core/types.js';
+import { PrecacheEntry, InstallResult, CleanupResult } from './_types.js';
+import './_version.js';
+declare global {
+    interface ServiceWorkerGlobalScope {
+        __WB_MANIFEST: Array<PrecacheEntry | string>;
+    }
+}
+interface PrecacheControllerOptions {
+    cacheName?: string;
+    plugins?: WorkboxPlugin[];
+    fallbackToNetwork?: boolean;
+}
+/**
+ * Performs efficient precaching of assets.
+ *
+ * @memberof workbox-precaching
+ */
+declare class PrecacheController {
+    private _installAndActiveListenersAdded?;
+    private readonly _strategy;
+    private readonly _urlsToCacheKeys;
+    private readonly _urlsToCacheModes;
+    private readonly _cacheKeysToIntegrities;
+    /**
+     * Create a new PrecacheController.
+     *
+     * @param {Object} [options]
+     * @param {string} [options.cacheName] The cache to use for precaching.
+     * @param {string} [options.plugins] Plugins to use when precaching as well
+     * as responding to fetch events for precached assets.
+     * @param {boolean} [options.fallbackToNetwork=true] Whether to attempt to
+     * get the response from the network if there's a precache miss.
+     */
+    constructor({ cacheName, plugins, fallbackToNetwork, }?: PrecacheControllerOptions);
+    /**
+     * @type {workbox-precaching.PrecacheStrategy} The strategy created by this controller and
+     * used to cache assets and respond to fetch events.
+     */
+    get strategy(): Strategy;
+    /**
+     * Adds items to the precache list, removing any duplicates and
+     * stores the files in the
+     * {@link workbox-core.cacheNames|"precache cache"} when the service
+     * worker installs.
+     *
+     * This method can be called multiple times.
+     *
+     * @param {Array<Object|string>} [entries=[]] Array of entries to precache.
+     */
+    precache(entries: Array<PrecacheEntry | string>): void;
+    /**
+     * This method will add items to the precache list, removing duplicates
+     * and ensuring the information is valid.
+     *
+     * @param {Array<workbox-precaching.PrecacheController.PrecacheEntry|string>} entries
+     *     Array of entries to precache.
+     */
+    addToCacheList(entries: Array<PrecacheEntry | string>): void;
+    /**
+     * Precaches new and updated assets. Call this method from the service worker
+     * install event.
+     *
+     * Note: this method calls `event.waitUntil()` for you, so you do not need
+     * to call it yourself in your event handlers.
+     *
+     * @param {ExtendableEvent} event
+     * @return {Promise<workbox-precaching.InstallResult>}
+     */
+    install(event: ExtendableEvent): Promise<InstallResult>;
+    /**
+     * Deletes assets that are no longer present in the current precache manifest.
+     * Call this method from the service worker activate event.
+     *
+     * Note: this method calls `event.waitUntil()` for you, so you do not need
+     * to call it yourself in your event handlers.
+     *
+     * @param {ExtendableEvent} event
+     * @return {Promise<workbox-precaching.CleanupResult>}
+     */
+    activate(event: ExtendableEvent): Promise<CleanupResult>;
+    /**
+     * Returns a mapping of a precached URL to the corresponding cache key, taking
+     * into account the revision information for the URL.
+     *
+     * @return {Map<string, string>} A URL to cache key mapping.
+     */
+    getURLsToCacheKeys(): Map<string, string>;
+    /**
+     * Returns a list of all the URLs that have been precached by the current
+     * service worker.
+     *
+     * @return {Array<string>} The precached URLs.
+     */
+    getCachedURLs(): Array<string>;
+    /**
+     * 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: string): string | undefined;
+    /**
+     * @param {string} url A cache key whose SRI you want to look up.
+     * @return {string} The subresource integrity associated with the cache key,
+     * or undefined if it's not set.
+     */
+    getIntegrityForCacheKey(cacheKey: string): string | undefined;
+    /**
+     * This acts as a drop-in replacement for
+     * [`cache.match()`](https://developer.mozilla.org/en-US/docs/Web/API/Cache/match)
+     * with the following differences:
+     *
+     * - It knows what the name of the precache is, and only checks in that cache.
+     * - It allows you to pass in an "original" URL without versioning parameters,
+     * and it will automatically look up the correct cache key for the currently
+     * active revision of that URL.
+     *
+     * E.g., `matchPrecache('index.html')` will find the correct precached
+     * response for the currently active service worker, even if the actual cache
+     * key is `'/index.html?__WB_REVISION__=1234abcd'`.
+     *
+     * @param {string|Request} request The key (without revisioning parameters)
+     * to look up in the precache.
+     * @return {Promise<Response|undefined>}
+     */
+    matchPrecache(request: string | Request): Promise<Response | undefined>;
+    /**
+     * Returns a function that looks up `url` in the precache (taking into
+     * account revision information), and returns the corresponding `Response`.
+     *
+     * @param {string} url The precached URL which will be used to lookup the
+     * `Response`.
+     * @return {workbox-routing~handlerCallback}
+     */
+    createHandlerBoundToURL(url: string): RouteHandlerCallback;
+}
+export { PrecacheController };
Index: frontend/node_modules/workbox-precaching/PrecacheController.js
===================================================================
--- frontend/node_modules/workbox-precaching/PrecacheController.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/PrecacheController.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,292 @@
+/*
+  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.
+*/
+import { assert } from 'workbox-core/_private/assert.js';
+import { cacheNames } from 'workbox-core/_private/cacheNames.js';
+import { logger } from 'workbox-core/_private/logger.js';
+import { WorkboxError } from 'workbox-core/_private/WorkboxError.js';
+import { waitUntil } from 'workbox-core/_private/waitUntil.js';
+import { createCacheKey } from './utils/createCacheKey.js';
+import { PrecacheInstallReportPlugin } from './utils/PrecacheInstallReportPlugin.js';
+import { PrecacheCacheKeyPlugin } from './utils/PrecacheCacheKeyPlugin.js';
+import { printCleanupDetails } from './utils/printCleanupDetails.js';
+import { printInstallDetails } from './utils/printInstallDetails.js';
+import { PrecacheStrategy } from './PrecacheStrategy.js';
+import './_version.js';
+/**
+ * Performs efficient precaching of assets.
+ *
+ * @memberof workbox-precaching
+ */
+class PrecacheController {
+    /**
+     * Create a new PrecacheController.
+     *
+     * @param {Object} [options]
+     * @param {string} [options.cacheName] The cache to use for precaching.
+     * @param {string} [options.plugins] Plugins to use when precaching as well
+     * as responding to fetch events for precached assets.
+     * @param {boolean} [options.fallbackToNetwork=true] Whether to attempt to
+     * get the response from the network if there's a precache miss.
+     */
+    constructor({ cacheName, plugins = [], fallbackToNetwork = true, } = {}) {
+        this._urlsToCacheKeys = new Map();
+        this._urlsToCacheModes = new Map();
+        this._cacheKeysToIntegrities = new Map();
+        this._strategy = new PrecacheStrategy({
+            cacheName: cacheNames.getPrecacheName(cacheName),
+            plugins: [
+                ...plugins,
+                new PrecacheCacheKeyPlugin({ precacheController: this }),
+            ],
+            fallbackToNetwork,
+        });
+        // Bind the install and activate methods to the instance.
+        this.install = this.install.bind(this);
+        this.activate = this.activate.bind(this);
+    }
+    /**
+     * @type {workbox-precaching.PrecacheStrategy} The strategy created by this controller and
+     * used to cache assets and respond to fetch events.
+     */
+    get strategy() {
+        return this._strategy;
+    }
+    /**
+     * Adds items to the precache list, removing any duplicates and
+     * stores the files in the
+     * {@link workbox-core.cacheNames|"precache cache"} when the service
+     * worker installs.
+     *
+     * This method can be called multiple times.
+     *
+     * @param {Array<Object|string>} [entries=[]] Array of entries to precache.
+     */
+    precache(entries) {
+        this.addToCacheList(entries);
+        if (!this._installAndActiveListenersAdded) {
+            self.addEventListener('install', this.install);
+            self.addEventListener('activate', this.activate);
+            this._installAndActiveListenersAdded = true;
+        }
+    }
+    /**
+     * This method will add items to the precache list, removing duplicates
+     * and ensuring the information is valid.
+     *
+     * @param {Array<workbox-precaching.PrecacheController.PrecacheEntry|string>} entries
+     *     Array of entries to precache.
+     */
+    addToCacheList(entries) {
+        if (process.env.NODE_ENV !== 'production') {
+            assert.isArray(entries, {
+                moduleName: 'workbox-precaching',
+                className: 'PrecacheController',
+                funcName: 'addToCacheList',
+                paramName: 'entries',
+            });
+        }
+        const urlsToWarnAbout = [];
+        for (const entry of entries) {
+            // See https://github.com/GoogleChrome/workbox/issues/2259
+            if (typeof entry === 'string') {
+                urlsToWarnAbout.push(entry);
+            }
+            else if (entry && entry.revision === undefined) {
+                urlsToWarnAbout.push(entry.url);
+            }
+            const { cacheKey, url } = createCacheKey(entry);
+            const cacheMode = typeof entry !== 'string' && entry.revision ? 'reload' : 'default';
+            if (this._urlsToCacheKeys.has(url) &&
+                this._urlsToCacheKeys.get(url) !== cacheKey) {
+                throw new WorkboxError('add-to-cache-list-conflicting-entries', {
+                    firstEntry: this._urlsToCacheKeys.get(url),
+                    secondEntry: cacheKey,
+                });
+            }
+            if (typeof entry !== 'string' && entry.integrity) {
+                if (this._cacheKeysToIntegrities.has(cacheKey) &&
+                    this._cacheKeysToIntegrities.get(cacheKey) !== entry.integrity) {
+                    throw new WorkboxError('add-to-cache-list-conflicting-integrities', {
+                        url,
+                    });
+                }
+                this._cacheKeysToIntegrities.set(cacheKey, entry.integrity);
+            }
+            this._urlsToCacheKeys.set(url, cacheKey);
+            this._urlsToCacheModes.set(url, cacheMode);
+            if (urlsToWarnAbout.length > 0) {
+                const warningMessage = `Workbox is precaching URLs without revision ` +
+                    `info: ${urlsToWarnAbout.join(', ')}\nThis is generally NOT safe. ` +
+                    `Learn more at https://bit.ly/wb-precache`;
+                if (process.env.NODE_ENV === 'production') {
+                    // Use console directly to display this warning without bloating
+                    // bundle sizes by pulling in all of the logger codebase in prod.
+                    console.warn(warningMessage);
+                }
+                else {
+                    logger.warn(warningMessage);
+                }
+            }
+        }
+    }
+    /**
+     * Precaches new and updated assets. Call this method from the service worker
+     * install event.
+     *
+     * Note: this method calls `event.waitUntil()` for you, so you do not need
+     * to call it yourself in your event handlers.
+     *
+     * @param {ExtendableEvent} event
+     * @return {Promise<workbox-precaching.InstallResult>}
+     */
+    install(event) {
+        // waitUntil returns Promise<any>
+        // eslint-disable-next-line @typescript-eslint/no-unsafe-return
+        return waitUntil(event, async () => {
+            const installReportPlugin = new PrecacheInstallReportPlugin();
+            this.strategy.plugins.push(installReportPlugin);
+            // Cache entries one at a time.
+            // See https://github.com/GoogleChrome/workbox/issues/2528
+            for (const [url, cacheKey] of this._urlsToCacheKeys) {
+                const integrity = this._cacheKeysToIntegrities.get(cacheKey);
+                const cacheMode = this._urlsToCacheModes.get(url);
+                const request = new Request(url, {
+                    integrity,
+                    cache: cacheMode,
+                    credentials: 'same-origin',
+                });
+                await Promise.all(this.strategy.handleAll({
+                    params: { cacheKey },
+                    request,
+                    event,
+                }));
+            }
+            const { updatedURLs, notUpdatedURLs } = installReportPlugin;
+            if (process.env.NODE_ENV !== 'production') {
+                printInstallDetails(updatedURLs, notUpdatedURLs);
+            }
+            return { updatedURLs, notUpdatedURLs };
+        });
+    }
+    /**
+     * Deletes assets that are no longer present in the current precache manifest.
+     * Call this method from the service worker activate event.
+     *
+     * Note: this method calls `event.waitUntil()` for you, so you do not need
+     * to call it yourself in your event handlers.
+     *
+     * @param {ExtendableEvent} event
+     * @return {Promise<workbox-precaching.CleanupResult>}
+     */
+    activate(event) {
+        // waitUntil returns Promise<any>
+        // eslint-disable-next-line @typescript-eslint/no-unsafe-return
+        return waitUntil(event, async () => {
+            const cache = await self.caches.open(this.strategy.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);
+                }
+            }
+            if (process.env.NODE_ENV !== 'production') {
+                printCleanupDetails(deletedURLs);
+            }
+            return { deletedURLs };
+        });
+    }
+    /**
+     * Returns a mapping of a precached URL to the corresponding cache key, taking
+     * into account the revision information for the URL.
+     *
+     * @return {Map<string, string>} 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<string>} 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.href);
+        return this._urlsToCacheKeys.get(urlObject.href);
+    }
+    /**
+     * @param {string} url A cache key whose SRI you want to look up.
+     * @return {string} The subresource integrity associated with the cache key,
+     * or undefined if it's not set.
+     */
+    getIntegrityForCacheKey(cacheKey) {
+        return this._cacheKeysToIntegrities.get(cacheKey);
+    }
+    /**
+     * This acts as a drop-in replacement for
+     * [`cache.match()`](https://developer.mozilla.org/en-US/docs/Web/API/Cache/match)
+     * with the following differences:
+     *
+     * - It knows what the name of the precache is, and only checks in that cache.
+     * - It allows you to pass in an "original" URL without versioning parameters,
+     * and it will automatically look up the correct cache key for the currently
+     * active revision of that URL.
+     *
+     * E.g., `matchPrecache('index.html')` will find the correct precached
+     * response for the currently active service worker, even if the actual cache
+     * key is `'/index.html?__WB_REVISION__=1234abcd'`.
+     *
+     * @param {string|Request} request The key (without revisioning parameters)
+     * to look up in the precache.
+     * @return {Promise<Response|undefined>}
+     */
+    async matchPrecache(request) {
+        const url = request instanceof Request ? request.url : request;
+        const cacheKey = this.getCacheKeyForURL(url);
+        if (cacheKey) {
+            const cache = await self.caches.open(this.strategy.cacheName);
+            return cache.match(cacheKey);
+        }
+        return undefined;
+    }
+    /**
+     * Returns a function that looks up `url` in the precache (taking into
+     * account revision information), and returns the corresponding `Response`.
+     *
+     * @param {string} url The precached URL which will be used to lookup the
+     * `Response`.
+     * @return {workbox-routing~handlerCallback}
+     */
+    createHandlerBoundToURL(url) {
+        const cacheKey = this.getCacheKeyForURL(url);
+        if (!cacheKey) {
+            throw new WorkboxError('non-precached-url', { url });
+        }
+        return (options) => {
+            options.request = new Request(url);
+            options.params = Object.assign({ cacheKey }, options.params);
+            return this.strategy.handle(options);
+        };
+    }
+}
+export { PrecacheController };
Index: frontend/node_modules/workbox-precaching/PrecacheController.mjs
===================================================================
--- frontend/node_modules/workbox-precaching/PrecacheController.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/PrecacheController.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export * from './PrecacheController.js';
Index: frontend/node_modules/workbox-precaching/PrecacheFallbackPlugin.d.ts
===================================================================
--- frontend/node_modules/workbox-precaching/PrecacheFallbackPlugin.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/PrecacheFallbackPlugin.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,42 @@
+import { WorkboxPlugin } from 'workbox-core/types.js';
+import { PrecacheController } from './PrecacheController.js';
+import './_version.js';
+/**
+ * `PrecacheFallbackPlugin` allows you to specify an "offline fallback"
+ * response to be used when a given strategy is unable to generate a response.
+ *
+ * It does this by intercepting the `handlerDidError` plugin callback
+ * and returning a precached response, taking the expected revision parameter
+ * into account automatically.
+ *
+ * Unless you explicitly pass in a `PrecacheController` instance to the
+ * constructor, the default instance will be used. Generally speaking, most
+ * developers will end up using the default.
+ *
+ * @memberof workbox-precaching
+ */
+declare class PrecacheFallbackPlugin implements WorkboxPlugin {
+    private readonly _fallbackURL;
+    private readonly _precacheController;
+    /**
+     * Constructs a new PrecacheFallbackPlugin with the associated fallbackURL.
+     *
+     * @param {Object} config
+     * @param {string} config.fallbackURL A precached URL to use as the fallback
+     *     if the associated strategy can't generate a response.
+     * @param {PrecacheController} [config.precacheController] An optional
+     *     PrecacheController instance. If not provided, the default
+     *     PrecacheController will be used.
+     */
+    constructor({ fallbackURL, precacheController, }: {
+        fallbackURL: string;
+        precacheController?: PrecacheController;
+    });
+    /**
+     * @return {Promise<Response>} The precache response for the fallback URL.
+     *
+     * @private
+     */
+    handlerDidError: WorkboxPlugin['handlerDidError'];
+}
+export { PrecacheFallbackPlugin };
Index: frontend/node_modules/workbox-precaching/PrecacheFallbackPlugin.js
===================================================================
--- frontend/node_modules/workbox-precaching/PrecacheFallbackPlugin.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/PrecacheFallbackPlugin.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,47 @@
+/*
+  Copyright 2020 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.
+*/
+import { getOrCreatePrecacheController } from './utils/getOrCreatePrecacheController.js';
+import './_version.js';
+/**
+ * `PrecacheFallbackPlugin` allows you to specify an "offline fallback"
+ * response to be used when a given strategy is unable to generate a response.
+ *
+ * It does this by intercepting the `handlerDidError` plugin callback
+ * and returning a precached response, taking the expected revision parameter
+ * into account automatically.
+ *
+ * Unless you explicitly pass in a `PrecacheController` instance to the
+ * constructor, the default instance will be used. Generally speaking, most
+ * developers will end up using the default.
+ *
+ * @memberof workbox-precaching
+ */
+class PrecacheFallbackPlugin {
+    /**
+     * Constructs a new PrecacheFallbackPlugin with the associated fallbackURL.
+     *
+     * @param {Object} config
+     * @param {string} config.fallbackURL A precached URL to use as the fallback
+     *     if the associated strategy can't generate a response.
+     * @param {PrecacheController} [config.precacheController] An optional
+     *     PrecacheController instance. If not provided, the default
+     *     PrecacheController will be used.
+     */
+    constructor({ fallbackURL, precacheController, }) {
+        /**
+         * @return {Promise<Response>} The precache response for the fallback URL.
+         *
+         * @private
+         */
+        this.handlerDidError = () => this._precacheController.matchPrecache(this._fallbackURL);
+        this._fallbackURL = fallbackURL;
+        this._precacheController =
+            precacheController || getOrCreatePrecacheController();
+    }
+}
+export { PrecacheFallbackPlugin };
Index: frontend/node_modules/workbox-precaching/PrecacheFallbackPlugin.mjs
===================================================================
--- frontend/node_modules/workbox-precaching/PrecacheFallbackPlugin.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/PrecacheFallbackPlugin.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export * from './PrecacheFallbackPlugin.js';
Index: frontend/node_modules/workbox-precaching/PrecacheRoute.d.ts
===================================================================
--- frontend/node_modules/workbox-precaching/PrecacheRoute.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/PrecacheRoute.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,33 @@
+import { Route } from 'workbox-routing/Route.js';
+import { PrecacheRouteOptions } from './_types.js';
+import { PrecacheController } from './PrecacheController.js';
+import './_version.js';
+/**
+ * A subclass of {@link workbox-routing.Route} that takes a
+ * {@link workbox-precaching.PrecacheController}
+ * instance and uses it to match incoming requests and handle fetching
+ * responses from the precache.
+ *
+ * @memberof workbox-precaching
+ * @extends workbox-routing.Route
+ */
+declare class PrecacheRoute extends Route {
+    /**
+     * @param {PrecacheController} precacheController A `PrecacheController`
+     * instance used to both match requests and respond to fetch events.
+     * @param {Object} [options] Options to control how requests are matched
+     * against the list of precached URLs.
+     * @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<RegExp>} [options.ignoreURLParametersMatching=[/^utm_/, /^fbclid$/]] 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 URLs that should be checked for precache matches.
+     */
+    constructor(precacheController: PrecacheController, options?: PrecacheRouteOptions);
+}
+export { PrecacheRoute };
Index: frontend/node_modules/workbox-precaching/PrecacheRoute.js
===================================================================
--- frontend/node_modules/workbox-precaching/PrecacheRoute.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/PrecacheRoute.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,57 @@
+/*
+  Copyright 2020 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.
+*/
+import { logger } from 'workbox-core/_private/logger.js';
+import { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';
+import { Route } from 'workbox-routing/Route.js';
+import { generateURLVariations } from './utils/generateURLVariations.js';
+import './_version.js';
+/**
+ * A subclass of {@link workbox-routing.Route} that takes a
+ * {@link workbox-precaching.PrecacheController}
+ * instance and uses it to match incoming requests and handle fetching
+ * responses from the precache.
+ *
+ * @memberof workbox-precaching
+ * @extends workbox-routing.Route
+ */
+class PrecacheRoute extends Route {
+    /**
+     * @param {PrecacheController} precacheController A `PrecacheController`
+     * instance used to both match requests and respond to fetch events.
+     * @param {Object} [options] Options to control how requests are matched
+     * against the list of precached URLs.
+     * @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<RegExp>} [options.ignoreURLParametersMatching=[/^utm_/, /^fbclid$/]] 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 URLs that should be checked for precache matches.
+     */
+    constructor(precacheController, options) {
+        const match = ({ request, }) => {
+            const urlsToCacheKeys = precacheController.getURLsToCacheKeys();
+            for (const possibleURL of generateURLVariations(request.url, options)) {
+                const cacheKey = urlsToCacheKeys.get(possibleURL);
+                if (cacheKey) {
+                    const integrity = precacheController.getIntegrityForCacheKey(cacheKey);
+                    return { cacheKey, integrity };
+                }
+            }
+            if (process.env.NODE_ENV !== 'production') {
+                logger.debug(`Precaching did not find a match for ` + getFriendlyURL(request.url));
+            }
+            return;
+        };
+        super(match, precacheController.strategy);
+    }
+}
+export { PrecacheRoute };
Index: frontend/node_modules/workbox-precaching/PrecacheRoute.mjs
===================================================================
--- frontend/node_modules/workbox-precaching/PrecacheRoute.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/PrecacheRoute.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export * from './PrecacheRoute.js';
Index: frontend/node_modules/workbox-precaching/PrecacheStrategy.d.ts
===================================================================
--- frontend/node_modules/workbox-precaching/PrecacheStrategy.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/PrecacheStrategy.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,81 @@
+import { WorkboxPlugin } from 'workbox-core/types.js';
+import { Strategy, StrategyOptions } from 'workbox-strategies/Strategy.js';
+import { StrategyHandler } from 'workbox-strategies/StrategyHandler.js';
+import './_version.js';
+interface PrecacheStrategyOptions extends StrategyOptions {
+    fallbackToNetwork?: boolean;
+}
+/**
+ * A {@link workbox-strategies.Strategy} implementation
+ * specifically designed to work with
+ * {@link workbox-precaching.PrecacheController}
+ * to both cache and fetch precached assets.
+ *
+ * Note: an instance of this class is created automatically when creating a
+ * `PrecacheController`; it's generally not necessary to create this yourself.
+ *
+ * @extends workbox-strategies.Strategy
+ * @memberof workbox-precaching
+ */
+declare class PrecacheStrategy extends Strategy {
+    private readonly _fallbackToNetwork;
+    static readonly defaultPrecacheCacheabilityPlugin: WorkboxPlugin;
+    static readonly copyRedirectedCacheableResponsesPlugin: WorkboxPlugin;
+    /**
+     *
+     * @param {Object} [options]
+     * @param {string} [options.cacheName] Cache name to store and retrieve
+     * requests. Defaults to the cache names provided by
+     * {@link workbox-core.cacheNames}.
+     * @param {Array<Object>} [options.plugins] {@link https://developers.google.com/web/tools/workbox/guides/using-plugins|Plugins}
+     * to use in conjunction with this caching strategy.
+     * @param {Object} [options.fetchOptions] Values passed along to the
+     * {@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters|init}
+     * of all fetch() requests made by this strategy.
+     * @param {Object} [options.matchOptions] The
+     * {@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions|CacheQueryOptions}
+     * for any `cache.match()` or `cache.put()` calls made by this strategy.
+     * @param {boolean} [options.fallbackToNetwork=true] Whether to attempt to
+     * get the response from the network if there's a precache miss.
+     */
+    constructor(options?: PrecacheStrategyOptions);
+    /**
+     * @private
+     * @param {Request|string} request A request to run this strategy for.
+     * @param {workbox-strategies.StrategyHandler} handler The event that
+     *     triggered the request.
+     * @return {Promise<Response>}
+     */
+    _handle(request: Request, handler: StrategyHandler): Promise<Response>;
+    _handleFetch(request: Request, handler: StrategyHandler): Promise<Response>;
+    _handleInstall(request: Request, handler: StrategyHandler): Promise<Response>;
+    /**
+     * This method is complex, as there a number of things to account for:
+     *
+     * The `plugins` array can be set at construction, and/or it might be added to
+     * to at any time before the strategy is used.
+     *
+     * At the time the strategy is used (i.e. during an `install` event), there
+     * needs to be at least one plugin that implements `cacheWillUpdate` in the
+     * array, other than `copyRedirectedCacheableResponsesPlugin`.
+     *
+     * - If this method is called and there are no suitable `cacheWillUpdate`
+     * plugins, we need to add `defaultPrecacheCacheabilityPlugin`.
+     *
+     * - If this method is called and there is exactly one `cacheWillUpdate`, then
+     * we don't have to do anything (this might be a previously added
+     * `defaultPrecacheCacheabilityPlugin`, or it might be a custom plugin).
+     *
+     * - If this method is called and there is more than one `cacheWillUpdate`,
+     * then we need to check if one is `defaultPrecacheCacheabilityPlugin`. If so,
+     * we need to remove it. (This situation is unlikely, but it could happen if
+     * the strategy is used multiple times, the first without a `cacheWillUpdate`,
+     * and then later on after manually adding a custom `cacheWillUpdate`.)
+     *
+     * See https://github.com/GoogleChrome/workbox/issues/2737 for more context.
+     *
+     * @private
+     */
+    _useDefaultCacheabilityPluginIfNeeded(): void;
+}
+export { PrecacheStrategy };
Index: frontend/node_modules/workbox-precaching/PrecacheStrategy.js
===================================================================
--- frontend/node_modules/workbox-precaching/PrecacheStrategy.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/PrecacheStrategy.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,223 @@
+/*
+  Copyright 2020 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.
+*/
+import { copyResponse } from 'workbox-core/copyResponse.js';
+import { cacheNames } from 'workbox-core/_private/cacheNames.js';
+import { getFriendlyURL } from 'workbox-core/_private/getFriendlyURL.js';
+import { logger } from 'workbox-core/_private/logger.js';
+import { WorkboxError } from 'workbox-core/_private/WorkboxError.js';
+import { Strategy } from 'workbox-strategies/Strategy.js';
+import './_version.js';
+/**
+ * A {@link workbox-strategies.Strategy} implementation
+ * specifically designed to work with
+ * {@link workbox-precaching.PrecacheController}
+ * to both cache and fetch precached assets.
+ *
+ * Note: an instance of this class is created automatically when creating a
+ * `PrecacheController`; it's generally not necessary to create this yourself.
+ *
+ * @extends workbox-strategies.Strategy
+ * @memberof workbox-precaching
+ */
+class PrecacheStrategy extends Strategy {
+    /**
+     *
+     * @param {Object} [options]
+     * @param {string} [options.cacheName] Cache name to store and retrieve
+     * requests. Defaults to the cache names provided by
+     * {@link workbox-core.cacheNames}.
+     * @param {Array<Object>} [options.plugins] {@link https://developers.google.com/web/tools/workbox/guides/using-plugins|Plugins}
+     * to use in conjunction with this caching strategy.
+     * @param {Object} [options.fetchOptions] Values passed along to the
+     * {@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters|init}
+     * of all fetch() requests made by this strategy.
+     * @param {Object} [options.matchOptions] The
+     * {@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions|CacheQueryOptions}
+     * for any `cache.match()` or `cache.put()` calls made by this strategy.
+     * @param {boolean} [options.fallbackToNetwork=true] Whether to attempt to
+     * get the response from the network if there's a precache miss.
+     */
+    constructor(options = {}) {
+        options.cacheName = cacheNames.getPrecacheName(options.cacheName);
+        super(options);
+        this._fallbackToNetwork =
+            options.fallbackToNetwork === false ? false : true;
+        // Redirected responses cannot be used to satisfy a navigation request, so
+        // any redirected response must be "copied" rather than cloned, so the new
+        // response doesn't contain the `redirected` flag. See:
+        // https://bugs.chromium.org/p/chromium/issues/detail?id=669363&desc=2#c1
+        this.plugins.push(PrecacheStrategy.copyRedirectedCacheableResponsesPlugin);
+    }
+    /**
+     * @private
+     * @param {Request|string} request A request to run this strategy for.
+     * @param {workbox-strategies.StrategyHandler} handler The event that
+     *     triggered the request.
+     * @return {Promise<Response>}
+     */
+    async _handle(request, handler) {
+        const response = await handler.cacheMatch(request);
+        if (response) {
+            return response;
+        }
+        // If this is an `install` event for an entry that isn't already cached,
+        // then populate the cache.
+        if (handler.event && handler.event.type === 'install') {
+            return await this._handleInstall(request, handler);
+        }
+        // Getting here means something went wrong. An entry that should have been
+        // precached wasn't found in the cache.
+        return await this._handleFetch(request, handler);
+    }
+    async _handleFetch(request, handler) {
+        let response;
+        const params = (handler.params || {});
+        // Fall back to the network if we're configured to do so.
+        if (this._fallbackToNetwork) {
+            if (process.env.NODE_ENV !== 'production') {
+                logger.warn(`The precached response for ` +
+                    `${getFriendlyURL(request.url)} in ${this.cacheName} was not ` +
+                    `found. Falling back to the network.`);
+            }
+            const integrityInManifest = params.integrity;
+            const integrityInRequest = request.integrity;
+            const noIntegrityConflict = !integrityInRequest || integrityInRequest === integrityInManifest;
+            // Do not add integrity if the original request is no-cors
+            // See https://github.com/GoogleChrome/workbox/issues/3096
+            response = await handler.fetch(new Request(request, {
+                integrity: request.mode !== 'no-cors'
+                    ? integrityInRequest || integrityInManifest
+                    : undefined,
+            }));
+            // It's only "safe" to repair the cache if we're using SRI to guarantee
+            // that the response matches the precache manifest's expectations,
+            // and there's either a) no integrity property in the incoming request
+            // or b) there is an integrity, and it matches the precache manifest.
+            // See https://github.com/GoogleChrome/workbox/issues/2858
+            // Also if the original request users no-cors we don't use integrity.
+            // See https://github.com/GoogleChrome/workbox/issues/3096
+            if (integrityInManifest &&
+                noIntegrityConflict &&
+                request.mode !== 'no-cors') {
+                this._useDefaultCacheabilityPluginIfNeeded();
+                const wasCached = await handler.cachePut(request, response.clone());
+                if (process.env.NODE_ENV !== 'production') {
+                    if (wasCached) {
+                        logger.log(`A response for ${getFriendlyURL(request.url)} ` +
+                            `was used to "repair" the precache.`);
+                    }
+                }
+            }
+        }
+        else {
+            // This shouldn't normally happen, but there are edge cases:
+            // https://github.com/GoogleChrome/workbox/issues/1441
+            throw new WorkboxError('missing-precache-entry', {
+                cacheName: this.cacheName,
+                url: request.url,
+            });
+        }
+        if (process.env.NODE_ENV !== 'production') {
+            const cacheKey = params.cacheKey || (await handler.getCacheKey(request, 'read'));
+            // Workbox is going to handle the route.
+            // print the routing details to the console.
+            logger.groupCollapsed(`Precaching is responding to: ` + getFriendlyURL(request.url));
+            logger.log(`Serving the precached url: ${getFriendlyURL(cacheKey instanceof Request ? cacheKey.url : cacheKey)}`);
+            logger.groupCollapsed(`View request details here.`);
+            logger.log(request);
+            logger.groupEnd();
+            logger.groupCollapsed(`View response details here.`);
+            logger.log(response);
+            logger.groupEnd();
+            logger.groupEnd();
+        }
+        return response;
+    }
+    async _handleInstall(request, handler) {
+        this._useDefaultCacheabilityPluginIfNeeded();
+        const response = await handler.fetch(request);
+        // Make sure we defer cachePut() until after we know the response
+        // should be cached; see https://github.com/GoogleChrome/workbox/issues/2737
+        const wasCached = await handler.cachePut(request, response.clone());
+        if (!wasCached) {
+            // Throwing here will lead to the `install` handler failing, which
+            // we want to do if *any* of the responses aren't safe to cache.
+            throw new WorkboxError('bad-precaching-response', {
+                url: request.url,
+                status: response.status,
+            });
+        }
+        return response;
+    }
+    /**
+     * This method is complex, as there a number of things to account for:
+     *
+     * The `plugins` array can be set at construction, and/or it might be added to
+     * to at any time before the strategy is used.
+     *
+     * At the time the strategy is used (i.e. during an `install` event), there
+     * needs to be at least one plugin that implements `cacheWillUpdate` in the
+     * array, other than `copyRedirectedCacheableResponsesPlugin`.
+     *
+     * - If this method is called and there are no suitable `cacheWillUpdate`
+     * plugins, we need to add `defaultPrecacheCacheabilityPlugin`.
+     *
+     * - If this method is called and there is exactly one `cacheWillUpdate`, then
+     * we don't have to do anything (this might be a previously added
+     * `defaultPrecacheCacheabilityPlugin`, or it might be a custom plugin).
+     *
+     * - If this method is called and there is more than one `cacheWillUpdate`,
+     * then we need to check if one is `defaultPrecacheCacheabilityPlugin`. If so,
+     * we need to remove it. (This situation is unlikely, but it could happen if
+     * the strategy is used multiple times, the first without a `cacheWillUpdate`,
+     * and then later on after manually adding a custom `cacheWillUpdate`.)
+     *
+     * See https://github.com/GoogleChrome/workbox/issues/2737 for more context.
+     *
+     * @private
+     */
+    _useDefaultCacheabilityPluginIfNeeded() {
+        let defaultPluginIndex = null;
+        let cacheWillUpdatePluginCount = 0;
+        for (const [index, plugin] of this.plugins.entries()) {
+            // Ignore the copy redirected plugin when determining what to do.
+            if (plugin === PrecacheStrategy.copyRedirectedCacheableResponsesPlugin) {
+                continue;
+            }
+            // Save the default plugin's index, in case it needs to be removed.
+            if (plugin === PrecacheStrategy.defaultPrecacheCacheabilityPlugin) {
+                defaultPluginIndex = index;
+            }
+            if (plugin.cacheWillUpdate) {
+                cacheWillUpdatePluginCount++;
+            }
+        }
+        if (cacheWillUpdatePluginCount === 0) {
+            this.plugins.push(PrecacheStrategy.defaultPrecacheCacheabilityPlugin);
+        }
+        else if (cacheWillUpdatePluginCount > 1 && defaultPluginIndex !== null) {
+            // Only remove the default plugin; multiple custom plugins are allowed.
+            this.plugins.splice(defaultPluginIndex, 1);
+        }
+        // Nothing needs to be done if cacheWillUpdatePluginCount is 1
+    }
+}
+PrecacheStrategy.defaultPrecacheCacheabilityPlugin = {
+    async cacheWillUpdate({ response }) {
+        if (!response || response.status >= 400) {
+            return null;
+        }
+        return response;
+    },
+};
+PrecacheStrategy.copyRedirectedCacheableResponsesPlugin = {
+    async cacheWillUpdate({ response }) {
+        return response.redirected ? await copyResponse(response) : response;
+    },
+};
+export { PrecacheStrategy };
Index: frontend/node_modules/workbox-precaching/PrecacheStrategy.mjs
===================================================================
--- frontend/node_modules/workbox-precaching/PrecacheStrategy.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/PrecacheStrategy.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export * from './PrecacheStrategy.js';
Index: frontend/node_modules/workbox-precaching/README.md
===================================================================
--- frontend/node_modules/workbox-precaching/README.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/README.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+This module's documentation can be found at https://developers.google.com/web/tools/workbox/modules/workbox-precaching
Index: frontend/node_modules/workbox-precaching/_types.d.ts
===================================================================
--- frontend/node_modules/workbox-precaching/_types.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/_types.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,63 @@
+import './_version.js';
+export interface InstallResult {
+    updatedURLs: string[];
+    notUpdatedURLs: string[];
+}
+export interface CleanupResult {
+    deletedCacheRequests: string[];
+}
+export declare interface PrecacheEntry {
+    integrity?: string;
+    url: string;
+    revision?: string | null;
+}
+export interface PrecacheRouteOptions {
+    directoryIndex?: string;
+    ignoreURLParametersMatching?: RegExp[];
+    cleanURLs?: boolean;
+    urlManipulation?: urlManipulation;
+}
+export type urlManipulation = ({ url }: {
+    url: URL;
+}) => URL[];
+/**
+ * @typedef {Object} InstallResult
+ * @property {Array<string>} updatedURLs List of URLs that were updated during
+ * installation.
+ * @property {Array<string>} notUpdatedURLs List of URLs that were already up to
+ * date.
+ *
+ * @memberof workbox-precaching
+ */
+/**
+ * @typedef {Object} CleanupResult
+ * @property {Array<string>} deletedCacheRequests List of URLs that were deleted
+ * while cleaning up the cache.
+ *
+ * @memberof workbox-precaching
+ */
+/**
+ * @typedef {Object} PrecacheEntry
+ * @property {string} url URL to precache.
+ * @property {string} [revision] Revision information for the URL.
+ * @property {string} [integrity] Integrity metadata that will be used when
+ * making the network request for the URL.
+ *
+ * @memberof workbox-precaching
+ */
+/**
+ * The "urlManipulation" callback can be used to determine if there are any
+ * additional permutations of a URL that should be used to check against
+ * the available precached files.
+ *
+ * For example, Workbox supports checking for '/index.html' when the URL
+ * '/' is provided. This callback allows additional, custom checks.
+ *
+ * @callback ~urlManipulation
+ * @param {Object} context
+ * @param {URL} context.url The request's URL.
+ * @return {Array<URL>} To add additional urls to test, return an Array of
+ * URLs. Please note that these **should not be strings**, but URL objects.
+ *
+ * @memberof workbox-precaching
+ */
Index: frontend/node_modules/workbox-precaching/_types.js
===================================================================
--- frontend/node_modules/workbox-precaching/_types.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/_types.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,55 @@
+/*
+  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.
+*/
+import './_version.js';
+// * * * IMPORTANT! * * *
+// ------------------------------------------------------------------------- //
+// jdsoc type definitions cannot be declared above TypeScript definitions or
+// they'll be stripped from the built `.js` files, and they'll only be in the
+// `d.ts` files, which aren't read by the jsdoc generator. As a result we
+// have to put declare them below.
+/**
+ * @typedef {Object} InstallResult
+ * @property {Array<string>} updatedURLs List of URLs that were updated during
+ * installation.
+ * @property {Array<string>} notUpdatedURLs List of URLs that were already up to
+ * date.
+ *
+ * @memberof workbox-precaching
+ */
+/**
+ * @typedef {Object} CleanupResult
+ * @property {Array<string>} deletedCacheRequests List of URLs that were deleted
+ * while cleaning up the cache.
+ *
+ * @memberof workbox-precaching
+ */
+/**
+ * @typedef {Object} PrecacheEntry
+ * @property {string} url URL to precache.
+ * @property {string} [revision] Revision information for the URL.
+ * @property {string} [integrity] Integrity metadata that will be used when
+ * making the network request for the URL.
+ *
+ * @memberof workbox-precaching
+ */
+/**
+ * The "urlManipulation" callback can be used to determine if there are any
+ * additional permutations of a URL that should be used to check against
+ * the available precached files.
+ *
+ * For example, Workbox supports checking for '/index.html' when the URL
+ * '/' is provided. This callback allows additional, custom checks.
+ *
+ * @callback ~urlManipulation
+ * @param {Object} context
+ * @param {URL} context.url The request's URL.
+ * @return {Array<URL>} To add additional urls to test, return an Array of
+ * URLs. Please note that these **should not be strings**, but URL objects.
+ *
+ * @memberof workbox-precaching
+ */
Index: frontend/node_modules/workbox-precaching/_types.mjs
===================================================================
--- frontend/node_modules/workbox-precaching/_types.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/_types.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export * from './_types.js';
Index: frontend/node_modules/workbox-precaching/_version.js
===================================================================
--- frontend/node_modules/workbox-precaching/_version.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/_version.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,6 @@
+"use strict";
+// @ts-ignore
+try {
+    self['workbox:precaching:6.5.4'] && _();
+}
+catch (e) { }
Index: frontend/node_modules/workbox-precaching/_version.mjs
===================================================================
--- frontend/node_modules/workbox-precaching/_version.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/_version.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+try{self['workbox:precaching:6.6.0']&&_()}catch(e){}// eslint-disable-line
Index: frontend/node_modules/workbox-precaching/addPlugins.d.ts
===================================================================
--- frontend/node_modules/workbox-precaching/addPlugins.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/addPlugins.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,11 @@
+import { WorkboxPlugin } from 'workbox-core/types.js';
+import './_version.js';
+/**
+ * Adds plugins to the precaching strategy.
+ *
+ * @param {Array<Object>} plugins
+ *
+ * @memberof workbox-precaching
+ */
+declare function addPlugins(plugins: WorkboxPlugin[]): void;
+export { addPlugins };
Index: frontend/node_modules/workbox-precaching/addPlugins.js
===================================================================
--- frontend/node_modules/workbox-precaching/addPlugins.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/addPlugins.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,21 @@
+/*
+  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.
+*/
+import { getOrCreatePrecacheController } from './utils/getOrCreatePrecacheController.js';
+import './_version.js';
+/**
+ * Adds plugins to the precaching strategy.
+ *
+ * @param {Array<Object>} plugins
+ *
+ * @memberof workbox-precaching
+ */
+function addPlugins(plugins) {
+    const precacheController = getOrCreatePrecacheController();
+    precacheController.strategy.plugins.push(...plugins);
+}
+export { addPlugins };
Index: frontend/node_modules/workbox-precaching/addPlugins.mjs
===================================================================
--- frontend/node_modules/workbox-precaching/addPlugins.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/addPlugins.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export * from './addPlugins.js';
Index: frontend/node_modules/workbox-precaching/addRoute.d.ts
===================================================================
--- frontend/node_modules/workbox-precaching/addRoute.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/addRoute.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,19 @@
+import { PrecacheRouteOptions } from './_types.js';
+import './_version.js';
+/**
+ * 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] See the {@link workbox-precaching.PrecacheRoute}
+ * options.
+ *
+ * @memberof workbox-precaching
+ */
+declare function addRoute(options?: PrecacheRouteOptions): void;
+export { addRoute };
Index: frontend/node_modules/workbox-precaching/addRoute.js
===================================================================
--- frontend/node_modules/workbox-precaching/addRoute.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/addRoute.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,31 @@
+/*
+  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.
+*/
+import { registerRoute } from 'workbox-routing/registerRoute.js';
+import { getOrCreatePrecacheController } from './utils/getOrCreatePrecacheController.js';
+import { PrecacheRoute } from './PrecacheRoute.js';
+import './_version.js';
+/**
+ * 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] See the {@link workbox-precaching.PrecacheRoute}
+ * options.
+ *
+ * @memberof workbox-precaching
+ */
+function addRoute(options) {
+    const precacheController = getOrCreatePrecacheController();
+    const precacheRoute = new PrecacheRoute(precacheController, options);
+    registerRoute(precacheRoute);
+}
+export { addRoute };
Index: frontend/node_modules/workbox-precaching/addRoute.mjs
===================================================================
--- frontend/node_modules/workbox-precaching/addRoute.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/addRoute.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export * from './addRoute.js';
Index: frontend/node_modules/workbox-precaching/cleanupOutdatedCaches.d.ts
===================================================================
--- frontend/node_modules/workbox-precaching/cleanupOutdatedCaches.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/cleanupOutdatedCaches.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+import './_version.js';
+/**
+ * Adds an `activate` event listener which will clean up incompatible
+ * precaches that were created by older versions of Workbox.
+ *
+ * @memberof workbox-precaching
+ */
+declare function cleanupOutdatedCaches(): void;
+export { cleanupOutdatedCaches };
Index: frontend/node_modules/workbox-precaching/cleanupOutdatedCaches.js
===================================================================
--- frontend/node_modules/workbox-precaching/cleanupOutdatedCaches.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/cleanupOutdatedCaches.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,32 @@
+/*
+  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.
+*/
+import { cacheNames } from 'workbox-core/_private/cacheNames.js';
+import { logger } from 'workbox-core/_private/logger.js';
+import { deleteOutdatedCaches } from './utils/deleteOutdatedCaches.js';
+import './_version.js';
+/**
+ * Adds an `activate` event listener which will clean up incompatible
+ * precaches that were created by older versions of Workbox.
+ *
+ * @memberof workbox-precaching
+ */
+function cleanupOutdatedCaches() {
+    // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705
+    self.addEventListener('activate', ((event) => {
+        const cacheName = cacheNames.getPrecacheName();
+        event.waitUntil(deleteOutdatedCaches(cacheName).then((cachesDeleted) => {
+            if (process.env.NODE_ENV !== 'production') {
+                if (cachesDeleted.length > 0) {
+                    logger.log(`The following out-of-date precaches were cleaned up ` +
+                        `automatically:`, cachesDeleted);
+                }
+            }
+        }));
+    }));
+}
+export { cleanupOutdatedCaches };
Index: frontend/node_modules/workbox-precaching/cleanupOutdatedCaches.mjs
===================================================================
--- frontend/node_modules/workbox-precaching/cleanupOutdatedCaches.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/cleanupOutdatedCaches.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export * from './cleanupOutdatedCaches.js';
Index: frontend/node_modules/workbox-precaching/createHandlerBoundToURL.d.ts
===================================================================
--- frontend/node_modules/workbox-precaching/createHandlerBoundToURL.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/createHandlerBoundToURL.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,21 @@
+import { RouteHandlerCallback } from 'workbox-core/types.js';
+import './_version.js';
+/**
+ * Helper function that calls
+ * {@link PrecacheController#createHandlerBoundToURL} on the default
+ * {@link PrecacheController} instance.
+ *
+ * If you are creating your own {@link PrecacheController}, then call the
+ * {@link PrecacheController#createHandlerBoundToURL} on that instance,
+ * instead of using this function.
+ *
+ * @param {string} url The precached URL which will be used to lookup the
+ * `Response`.
+ * @param {boolean} [fallbackToNetwork=true] Whether to attempt to get the
+ * response from the network if there's a precache miss.
+ * @return {workbox-routing~handlerCallback}
+ *
+ * @memberof workbox-precaching
+ */
+declare function createHandlerBoundToURL(url: string): RouteHandlerCallback;
+export { createHandlerBoundToURL };
Index: frontend/node_modules/workbox-precaching/createHandlerBoundToURL.js
===================================================================
--- frontend/node_modules/workbox-precaching/createHandlerBoundToURL.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/createHandlerBoundToURL.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,31 @@
+/*
+  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.
+*/
+import { getOrCreatePrecacheController } from './utils/getOrCreatePrecacheController.js';
+import './_version.js';
+/**
+ * Helper function that calls
+ * {@link PrecacheController#createHandlerBoundToURL} on the default
+ * {@link PrecacheController} instance.
+ *
+ * If you are creating your own {@link PrecacheController}, then call the
+ * {@link PrecacheController#createHandlerBoundToURL} on that instance,
+ * instead of using this function.
+ *
+ * @param {string} url The precached URL which will be used to lookup the
+ * `Response`.
+ * @param {boolean} [fallbackToNetwork=true] Whether to attempt to get the
+ * response from the network if there's a precache miss.
+ * @return {workbox-routing~handlerCallback}
+ *
+ * @memberof workbox-precaching
+ */
+function createHandlerBoundToURL(url) {
+    const precacheController = getOrCreatePrecacheController();
+    return precacheController.createHandlerBoundToURL(url);
+}
+export { createHandlerBoundToURL };
Index: frontend/node_modules/workbox-precaching/createHandlerBoundToURL.mjs
===================================================================
--- frontend/node_modules/workbox-precaching/createHandlerBoundToURL.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/createHandlerBoundToURL.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export * from './createHandlerBoundToURL.js';
Index: frontend/node_modules/workbox-precaching/getCacheKeyForURL.d.ts
===================================================================
--- frontend/node_modules/workbox-precaching/getCacheKeyForURL.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/getCacheKeyForURL.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,22 @@
+import './_version.js';
+/**
+ * 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.
+ *
+ * @memberof workbox-precaching
+ */
+declare function getCacheKeyForURL(url: string): string | undefined;
+export { getCacheKeyForURL };
Index: frontend/node_modules/workbox-precaching/getCacheKeyForURL.js
===================================================================
--- frontend/node_modules/workbox-precaching/getCacheKeyForURL.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/getCacheKeyForURL.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,33 @@
+/*
+  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.
+*/
+import { getOrCreatePrecacheController } from './utils/getOrCreatePrecacheController.js';
+import './_version.js';
+/**
+ * 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.
+ *
+ * @memberof workbox-precaching
+ */
+function getCacheKeyForURL(url) {
+    const precacheController = getOrCreatePrecacheController();
+    return precacheController.getCacheKeyForURL(url);
+}
+export { getCacheKeyForURL };
Index: frontend/node_modules/workbox-precaching/getCacheKeyForURL.mjs
===================================================================
--- frontend/node_modules/workbox-precaching/getCacheKeyForURL.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/getCacheKeyForURL.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export * from './getCacheKeyForURL.js';
Index: frontend/node_modules/workbox-precaching/index.d.ts
===================================================================
--- frontend/node_modules/workbox-precaching/index.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/index.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,27 @@
+import { addPlugins } from './addPlugins.js';
+import { addRoute } from './addRoute.js';
+import { cleanupOutdatedCaches } from './cleanupOutdatedCaches.js';
+import { createHandlerBoundToURL } from './createHandlerBoundToURL.js';
+import { getCacheKeyForURL } from './getCacheKeyForURL.js';
+import { matchPrecache } from './matchPrecache.js';
+import { precache } from './precache.js';
+import { precacheAndRoute } from './precacheAndRoute.js';
+import { PrecacheController } from './PrecacheController.js';
+import { PrecacheRoute } from './PrecacheRoute.js';
+import { PrecacheStrategy } from './PrecacheStrategy.js';
+import { PrecacheFallbackPlugin } from './PrecacheFallbackPlugin.js';
+import './_version.js';
+/**
+ * Most consumers of this module will want to use the
+ * {@link workbox-precaching.precacheAndRoute}
+ * method to add assets to the cache and respond to network requests with these
+ * cached assets.
+ *
+ * If you require more control over caching and routing, you can use the
+ * {@link workbox-precaching.PrecacheController}
+ * interface.
+ *
+ * @module workbox-precaching
+ */
+export { addPlugins, addRoute, cleanupOutdatedCaches, createHandlerBoundToURL, getCacheKeyForURL, matchPrecache, precache, precacheAndRoute, PrecacheController, PrecacheRoute, PrecacheStrategy, PrecacheFallbackPlugin, };
+export * from './_types.js';
Index: frontend/node_modules/workbox-precaching/index.js
===================================================================
--- frontend/node_modules/workbox-precaching/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,34 @@
+/*
+  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.
+*/
+import { addPlugins } from './addPlugins.js';
+import { addRoute } from './addRoute.js';
+import { cleanupOutdatedCaches } from './cleanupOutdatedCaches.js';
+import { createHandlerBoundToURL } from './createHandlerBoundToURL.js';
+import { getCacheKeyForURL } from './getCacheKeyForURL.js';
+import { matchPrecache } from './matchPrecache.js';
+import { precache } from './precache.js';
+import { precacheAndRoute } from './precacheAndRoute.js';
+import { PrecacheController } from './PrecacheController.js';
+import { PrecacheRoute } from './PrecacheRoute.js';
+import { PrecacheStrategy } from './PrecacheStrategy.js';
+import { PrecacheFallbackPlugin } from './PrecacheFallbackPlugin.js';
+import './_version.js';
+/**
+ * Most consumers of this module will want to use the
+ * {@link workbox-precaching.precacheAndRoute}
+ * method to add assets to the cache and respond to network requests with these
+ * cached assets.
+ *
+ * If you require more control over caching and routing, you can use the
+ * {@link workbox-precaching.PrecacheController}
+ * interface.
+ *
+ * @module workbox-precaching
+ */
+export { addPlugins, addRoute, cleanupOutdatedCaches, createHandlerBoundToURL, getCacheKeyForURL, matchPrecache, precache, precacheAndRoute, PrecacheController, PrecacheRoute, PrecacheStrategy, PrecacheFallbackPlugin, };
+export * from './_types.js';
Index: frontend/node_modules/workbox-precaching/index.mjs
===================================================================
--- frontend/node_modules/workbox-precaching/index.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/index.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export * from './index.js';
Index: frontend/node_modules/workbox-precaching/matchPrecache.d.ts
===================================================================
--- frontend/node_modules/workbox-precaching/matchPrecache.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/matchPrecache.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,18 @@
+import './_version.js';
+/**
+ * Helper function that calls
+ * {@link PrecacheController#matchPrecache} on the default
+ * {@link PrecacheController} instance.
+ *
+ * If you are creating your own {@link PrecacheController}, then call
+ * {@link PrecacheController#matchPrecache} on that instance,
+ * instead of using this function.
+ *
+ * @param {string|Request} request The key (without revisioning parameters)
+ * to look up in the precache.
+ * @return {Promise<Response|undefined>}
+ *
+ * @memberof workbox-precaching
+ */
+declare function matchPrecache(request: string | Request): Promise<Response | undefined>;
+export { matchPrecache };
Index: frontend/node_modules/workbox-precaching/matchPrecache.js
===================================================================
--- frontend/node_modules/workbox-precaching/matchPrecache.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/matchPrecache.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,29 @@
+/*
+  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.
+*/
+import { getOrCreatePrecacheController } from './utils/getOrCreatePrecacheController.js';
+import './_version.js';
+/**
+ * Helper function that calls
+ * {@link PrecacheController#matchPrecache} on the default
+ * {@link PrecacheController} instance.
+ *
+ * If you are creating your own {@link PrecacheController}, then call
+ * {@link PrecacheController#matchPrecache} on that instance,
+ * instead of using this function.
+ *
+ * @param {string|Request} request The key (without revisioning parameters)
+ * to look up in the precache.
+ * @return {Promise<Response|undefined>}
+ *
+ * @memberof workbox-precaching
+ */
+function matchPrecache(request) {
+    const precacheController = getOrCreatePrecacheController();
+    return precacheController.matchPrecache(request);
+}
+export { matchPrecache };
Index: frontend/node_modules/workbox-precaching/matchPrecache.mjs
===================================================================
--- frontend/node_modules/workbox-precaching/matchPrecache.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/matchPrecache.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export * from './matchPrecache.js';
Index: frontend/node_modules/workbox-precaching/package.json
===================================================================
--- frontend/node_modules/workbox-precaching/package.json	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/package.json	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,29 @@
+{
+  "name": "workbox-precaching",
+  "version": "6.6.0",
+  "license": "MIT",
+  "author": "Google's Web DevRel Team",
+  "description": "This module efficiently precaches assets.",
+  "repository": "googlechrome/workbox",
+  "bugs": "https://github.com/googlechrome/workbox/issues",
+  "homepage": "https://github.com/GoogleChrome/workbox",
+  "keywords": [
+    "workbox",
+    "workboxjs",
+    "service worker",
+    "sw"
+  ],
+  "workbox": {
+    "browserNamespace": "workbox.precaching",
+    "packageType": "sw"
+  },
+  "main": "index.js",
+  "module": "index.mjs",
+  "types": "index.d.ts",
+  "dependencies": {
+    "workbox-core": "6.6.0",
+    "workbox-routing": "6.6.0",
+    "workbox-strategies": "6.6.0"
+  },
+  "gitHead": "252644491d9bb5a67518935ede6df530107c9475"
+}
Index: frontend/node_modules/workbox-precaching/precache.d.ts
===================================================================
--- frontend/node_modules/workbox-precaching/precache.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/precache.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,23 @@
+import { PrecacheEntry } from './_types.js';
+import './_version.js';
+/**
+ * Adds items to the precache list, removing any duplicates and
+ * stores the files in the
+ * {@link workbox-core.cacheNames|"precache cache"} 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
+ * {@link workbox-precaching.addRoute}.
+ *
+ * If you have a single array of files to precache, you can just call
+ * {@link workbox-precaching.precacheAndRoute}.
+ *
+ * @param {Array<Object|string>} [entries=[]] Array of entries to precache.
+ *
+ * @memberof workbox-precaching
+ */
+declare function precache(entries: Array<PrecacheEntry | string>): void;
+export { precache };
Index: frontend/node_modules/workbox-precaching/precache.js
===================================================================
--- frontend/node_modules/workbox-precaching/precache.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/precache.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,33 @@
+/*
+  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.
+*/
+import { getOrCreatePrecacheController } from './utils/getOrCreatePrecacheController.js';
+import './_version.js';
+/**
+ * Adds items to the precache list, removing any duplicates and
+ * stores the files in the
+ * {@link workbox-core.cacheNames|"precache cache"} 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
+ * {@link workbox-precaching.addRoute}.
+ *
+ * If you have a single array of files to precache, you can just call
+ * {@link workbox-precaching.precacheAndRoute}.
+ *
+ * @param {Array<Object|string>} [entries=[]] Array of entries to precache.
+ *
+ * @memberof workbox-precaching
+ */
+function precache(entries) {
+    const precacheController = getOrCreatePrecacheController();
+    precacheController.precache(entries);
+}
+export { precache };
Index: frontend/node_modules/workbox-precaching/precache.mjs
===================================================================
--- frontend/node_modules/workbox-precaching/precache.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/precache.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export * from './precache.js';
Index: frontend/node_modules/workbox-precaching/precacheAndRoute.d.ts
===================================================================
--- frontend/node_modules/workbox-precaching/precacheAndRoute.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/precacheAndRoute.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,18 @@
+import { PrecacheRouteOptions, PrecacheEntry } from './_types.js';
+import './_version.js';
+/**
+ * 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
+ * {@link workbox-precaching.precache} and
+ * {@link workbox-precaching.addRoute} in a single call.
+ *
+ * @param {Array<Object|string>} entries Array of entries to precache.
+ * @param {Object} [options] See the
+ * {@link workbox-precaching.PrecacheRoute} options.
+ *
+ * @memberof workbox-precaching
+ */
+declare function precacheAndRoute(entries: Array<PrecacheEntry | string>, options?: PrecacheRouteOptions): void;
+export { precacheAndRoute };
Index: frontend/node_modules/workbox-precaching/precacheAndRoute.js
===================================================================
--- frontend/node_modules/workbox-precaching/precacheAndRoute.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/precacheAndRoute.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,29 @@
+/*
+  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.
+*/
+import { addRoute } from './addRoute.js';
+import { precache } from './precache.js';
+import './_version.js';
+/**
+ * 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
+ * {@link workbox-precaching.precache} and
+ * {@link workbox-precaching.addRoute} in a single call.
+ *
+ * @param {Array<Object|string>} entries Array of entries to precache.
+ * @param {Object} [options] See the
+ * {@link workbox-precaching.PrecacheRoute} options.
+ *
+ * @memberof workbox-precaching
+ */
+function precacheAndRoute(entries, options) {
+    precache(entries);
+    addRoute(options);
+}
+export { precacheAndRoute };
Index: frontend/node_modules/workbox-precaching/precacheAndRoute.mjs
===================================================================
--- frontend/node_modules/workbox-precaching/precacheAndRoute.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/precacheAndRoute.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export * from './precacheAndRoute.js';
Index: frontend/node_modules/workbox-precaching/src/PrecacheController.ts
===================================================================
--- frontend/node_modules/workbox-precaching/src/PrecacheController.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/src/PrecacheController.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,366 @@
+/*
+  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.
+*/
+
+import {assert} from 'workbox-core/_private/assert.js';
+import {cacheNames} from 'workbox-core/_private/cacheNames.js';
+import {logger} from 'workbox-core/_private/logger.js';
+import {WorkboxError} from 'workbox-core/_private/WorkboxError.js';
+import {waitUntil} from 'workbox-core/_private/waitUntil.js';
+import {Strategy} from 'workbox-strategies/Strategy.js';
+import {RouteHandlerCallback, WorkboxPlugin} from 'workbox-core/types.js';
+
+import {createCacheKey} from './utils/createCacheKey.js';
+import {PrecacheInstallReportPlugin} from './utils/PrecacheInstallReportPlugin.js';
+import {PrecacheCacheKeyPlugin} from './utils/PrecacheCacheKeyPlugin.js';
+import {printCleanupDetails} from './utils/printCleanupDetails.js';
+import {printInstallDetails} from './utils/printInstallDetails.js';
+import {PrecacheStrategy} from './PrecacheStrategy.js';
+import {PrecacheEntry, InstallResult, CleanupResult} from './_types.js';
+import './_version.js';
+
+// Give TypeScript the correct global.
+declare let self: ServiceWorkerGlobalScope;
+
+declare global {
+  interface ServiceWorkerGlobalScope {
+    __WB_MANIFEST: Array<PrecacheEntry | string>;
+  }
+}
+
+interface PrecacheControllerOptions {
+  cacheName?: string;
+  plugins?: WorkboxPlugin[];
+  fallbackToNetwork?: boolean;
+}
+
+/**
+ * Performs efficient precaching of assets.
+ *
+ * @memberof workbox-precaching
+ */
+class PrecacheController {
+  private _installAndActiveListenersAdded?: boolean;
+  private readonly _strategy: Strategy;
+  private readonly _urlsToCacheKeys: Map<string, string> = new Map();
+  private readonly _urlsToCacheModes: Map<
+    string,
+    | 'reload'
+    | 'default'
+    | 'no-store'
+    | 'no-cache'
+    | 'force-cache'
+    | 'only-if-cached'
+  > = new Map();
+  private readonly _cacheKeysToIntegrities: Map<string, string> = new Map();
+
+  /**
+   * Create a new PrecacheController.
+   *
+   * @param {Object} [options]
+   * @param {string} [options.cacheName] The cache to use for precaching.
+   * @param {string} [options.plugins] Plugins to use when precaching as well
+   * as responding to fetch events for precached assets.
+   * @param {boolean} [options.fallbackToNetwork=true] Whether to attempt to
+   * get the response from the network if there's a precache miss.
+   */
+  constructor({
+    cacheName,
+    plugins = [],
+    fallbackToNetwork = true,
+  }: PrecacheControllerOptions = {}) {
+    this._strategy = new PrecacheStrategy({
+      cacheName: cacheNames.getPrecacheName(cacheName),
+      plugins: [
+        ...plugins,
+        new PrecacheCacheKeyPlugin({precacheController: this}),
+      ],
+      fallbackToNetwork,
+    });
+
+    // Bind the install and activate methods to the instance.
+    this.install = this.install.bind(this);
+    this.activate = this.activate.bind(this);
+  }
+
+  /**
+   * @type {workbox-precaching.PrecacheStrategy} The strategy created by this controller and
+   * used to cache assets and respond to fetch events.
+   */
+  get strategy(): Strategy {
+    return this._strategy;
+  }
+
+  /**
+   * Adds items to the precache list, removing any duplicates and
+   * stores the files in the
+   * {@link workbox-core.cacheNames|"precache cache"} when the service
+   * worker installs.
+   *
+   * This method can be called multiple times.
+   *
+   * @param {Array<Object|string>} [entries=[]] Array of entries to precache.
+   */
+  precache(entries: Array<PrecacheEntry | string>): void {
+    this.addToCacheList(entries);
+
+    if (!this._installAndActiveListenersAdded) {
+      self.addEventListener('install', this.install);
+      self.addEventListener('activate', this.activate);
+      this._installAndActiveListenersAdded = true;
+    }
+  }
+
+  /**
+   * This method will add items to the precache list, removing duplicates
+   * and ensuring the information is valid.
+   *
+   * @param {Array<workbox-precaching.PrecacheController.PrecacheEntry|string>} entries
+   *     Array of entries to precache.
+   */
+  addToCacheList(entries: Array<PrecacheEntry | string>): void {
+    if (process.env.NODE_ENV !== 'production') {
+      assert!.isArray(entries, {
+        moduleName: 'workbox-precaching',
+        className: 'PrecacheController',
+        funcName: 'addToCacheList',
+        paramName: 'entries',
+      });
+    }
+
+    const urlsToWarnAbout: string[] = [];
+    for (const entry of entries) {
+      // See https://github.com/GoogleChrome/workbox/issues/2259
+      if (typeof entry === 'string') {
+        urlsToWarnAbout.push(entry);
+      } else if (entry && entry.revision === undefined) {
+        urlsToWarnAbout.push(entry.url);
+      }
+
+      const {cacheKey, url} = createCacheKey(entry);
+      const cacheMode =
+        typeof entry !== 'string' && entry.revision ? 'reload' : 'default';
+
+      if (
+        this._urlsToCacheKeys.has(url) &&
+        this._urlsToCacheKeys.get(url) !== cacheKey
+      ) {
+        throw new WorkboxError('add-to-cache-list-conflicting-entries', {
+          firstEntry: this._urlsToCacheKeys.get(url),
+          secondEntry: cacheKey,
+        });
+      }
+
+      if (typeof entry !== 'string' && entry.integrity) {
+        if (
+          this._cacheKeysToIntegrities.has(cacheKey) &&
+          this._cacheKeysToIntegrities.get(cacheKey) !== entry.integrity
+        ) {
+          throw new WorkboxError('add-to-cache-list-conflicting-integrities', {
+            url,
+          });
+        }
+        this._cacheKeysToIntegrities.set(cacheKey, entry.integrity);
+      }
+
+      this._urlsToCacheKeys.set(url, cacheKey);
+      this._urlsToCacheModes.set(url, cacheMode);
+
+      if (urlsToWarnAbout.length > 0) {
+        const warningMessage =
+          `Workbox is precaching URLs without revision ` +
+          `info: ${urlsToWarnAbout.join(', ')}\nThis is generally NOT safe. ` +
+          `Learn more at https://bit.ly/wb-precache`;
+        if (process.env.NODE_ENV === 'production') {
+          // Use console directly to display this warning without bloating
+          // bundle sizes by pulling in all of the logger codebase in prod.
+          console.warn(warningMessage);
+        } else {
+          logger.warn(warningMessage);
+        }
+      }
+    }
+  }
+
+  /**
+   * Precaches new and updated assets. Call this method from the service worker
+   * install event.
+   *
+   * Note: this method calls `event.waitUntil()` for you, so you do not need
+   * to call it yourself in your event handlers.
+   *
+   * @param {ExtendableEvent} event
+   * @return {Promise<workbox-precaching.InstallResult>}
+   */
+  install(event: ExtendableEvent): Promise<InstallResult> {
+    // waitUntil returns Promise<any>
+    // eslint-disable-next-line @typescript-eslint/no-unsafe-return
+    return waitUntil(event, async () => {
+      const installReportPlugin = new PrecacheInstallReportPlugin();
+      this.strategy.plugins.push(installReportPlugin);
+
+      // Cache entries one at a time.
+      // See https://github.com/GoogleChrome/workbox/issues/2528
+      for (const [url, cacheKey] of this._urlsToCacheKeys) {
+        const integrity = this._cacheKeysToIntegrities.get(cacheKey);
+        const cacheMode = this._urlsToCacheModes.get(url);
+
+        const request = new Request(url, {
+          integrity,
+          cache: cacheMode,
+          credentials: 'same-origin',
+        });
+
+        await Promise.all(
+          this.strategy.handleAll({
+            params: {cacheKey},
+            request,
+            event,
+          }),
+        );
+      }
+
+      const {updatedURLs, notUpdatedURLs} = installReportPlugin;
+
+      if (process.env.NODE_ENV !== 'production') {
+        printInstallDetails(updatedURLs, notUpdatedURLs);
+      }
+
+      return {updatedURLs, notUpdatedURLs};
+    });
+  }
+
+  /**
+   * Deletes assets that are no longer present in the current precache manifest.
+   * Call this method from the service worker activate event.
+   *
+   * Note: this method calls `event.waitUntil()` for you, so you do not need
+   * to call it yourself in your event handlers.
+   *
+   * @param {ExtendableEvent} event
+   * @return {Promise<workbox-precaching.CleanupResult>}
+   */
+  activate(event: ExtendableEvent): Promise<CleanupResult> {
+    // waitUntil returns Promise<any>
+    // eslint-disable-next-line @typescript-eslint/no-unsafe-return
+    return waitUntil(event, async () => {
+      const cache = await self.caches.open(this.strategy.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);
+        }
+      }
+
+      if (process.env.NODE_ENV !== 'production') {
+        printCleanupDetails(deletedURLs);
+      }
+
+      return {deletedURLs};
+    });
+  }
+
+  /**
+   * Returns a mapping of a precached URL to the corresponding cache key, taking
+   * into account the revision information for the URL.
+   *
+   * @return {Map<string, string>} A URL to cache key mapping.
+   */
+  getURLsToCacheKeys(): Map<string, string> {
+    return this._urlsToCacheKeys;
+  }
+
+  /**
+   * Returns a list of all the URLs that have been precached by the current
+   * service worker.
+   *
+   * @return {Array<string>} The precached URLs.
+   */
+  getCachedURLs(): Array<string> {
+    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: string): string | undefined {
+    const urlObject = new URL(url, location.href);
+    return this._urlsToCacheKeys.get(urlObject.href);
+  }
+
+  /**
+   * @param {string} url A cache key whose SRI you want to look up.
+   * @return {string} The subresource integrity associated with the cache key,
+   * or undefined if it's not set.
+   */
+  getIntegrityForCacheKey(cacheKey: string): string | undefined {
+    return this._cacheKeysToIntegrities.get(cacheKey);
+  }
+
+  /**
+   * This acts as a drop-in replacement for
+   * [`cache.match()`](https://developer.mozilla.org/en-US/docs/Web/API/Cache/match)
+   * with the following differences:
+   *
+   * - It knows what the name of the precache is, and only checks in that cache.
+   * - It allows you to pass in an "original" URL without versioning parameters,
+   * and it will automatically look up the correct cache key for the currently
+   * active revision of that URL.
+   *
+   * E.g., `matchPrecache('index.html')` will find the correct precached
+   * response for the currently active service worker, even if the actual cache
+   * key is `'/index.html?__WB_REVISION__=1234abcd'`.
+   *
+   * @param {string|Request} request The key (without revisioning parameters)
+   * to look up in the precache.
+   * @return {Promise<Response|undefined>}
+   */
+  async matchPrecache(
+    request: string | Request,
+  ): Promise<Response | undefined> {
+    const url = request instanceof Request ? request.url : request;
+    const cacheKey = this.getCacheKeyForURL(url);
+    if (cacheKey) {
+      const cache = await self.caches.open(this.strategy.cacheName);
+      return cache.match(cacheKey);
+    }
+    return undefined;
+  }
+
+  /**
+   * Returns a function that looks up `url` in the precache (taking into
+   * account revision information), and returns the corresponding `Response`.
+   *
+   * @param {string} url The precached URL which will be used to lookup the
+   * `Response`.
+   * @return {workbox-routing~handlerCallback}
+   */
+  createHandlerBoundToURL(url: string): RouteHandlerCallback {
+    const cacheKey = this.getCacheKeyForURL(url);
+    if (!cacheKey) {
+      throw new WorkboxError('non-precached-url', {url});
+    }
+    return (options) => {
+      options.request = new Request(url);
+      options.params = {cacheKey, ...options.params};
+
+      return this.strategy.handle(options);
+    };
+  }
+}
+
+export {PrecacheController};
Index: frontend/node_modules/workbox-precaching/src/PrecacheFallbackPlugin.ts
===================================================================
--- frontend/node_modules/workbox-precaching/src/PrecacheFallbackPlugin.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/src/PrecacheFallbackPlugin.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,65 @@
+/*
+  Copyright 2020 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.
+*/
+
+import {WorkboxPlugin} from 'workbox-core/types.js';
+
+import {getOrCreatePrecacheController} from './utils/getOrCreatePrecacheController.js';
+import {PrecacheController} from './PrecacheController.js';
+
+import './_version.js';
+
+/**
+ * `PrecacheFallbackPlugin` allows you to specify an "offline fallback"
+ * response to be used when a given strategy is unable to generate a response.
+ *
+ * It does this by intercepting the `handlerDidError` plugin callback
+ * and returning a precached response, taking the expected revision parameter
+ * into account automatically.
+ *
+ * Unless you explicitly pass in a `PrecacheController` instance to the
+ * constructor, the default instance will be used. Generally speaking, most
+ * developers will end up using the default.
+ *
+ * @memberof workbox-precaching
+ */
+class PrecacheFallbackPlugin implements WorkboxPlugin {
+  private readonly _fallbackURL: string;
+  private readonly _precacheController: PrecacheController;
+
+  /**
+   * Constructs a new PrecacheFallbackPlugin with the associated fallbackURL.
+   *
+   * @param {Object} config
+   * @param {string} config.fallbackURL A precached URL to use as the fallback
+   *     if the associated strategy can't generate a response.
+   * @param {PrecacheController} [config.precacheController] An optional
+   *     PrecacheController instance. If not provided, the default
+   *     PrecacheController will be used.
+   */
+  constructor({
+    fallbackURL,
+    precacheController,
+  }: {
+    fallbackURL: string;
+    precacheController?: PrecacheController;
+  }) {
+    this._fallbackURL = fallbackURL;
+    this._precacheController =
+      precacheController || getOrCreatePrecacheController();
+  }
+
+  /**
+   * @return {Promise<Response>} The precache response for the fallback URL.
+   *
+   * @private
+   */
+  handlerDidError: WorkboxPlugin['handlerDidError'] = () =>
+    this._precacheController.matchPrecache(this._fallbackURL);
+}
+
+export {PrecacheFallbackPlugin};
Index: frontend/node_modules/workbox-precaching/src/PrecacheRoute.ts
===================================================================
--- frontend/node_modules/workbox-precaching/src/PrecacheRoute.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/src/PrecacheRoute.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,77 @@
+/*
+  Copyright 2020 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.
+*/
+
+import {logger} from 'workbox-core/_private/logger.js';
+import {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.js';
+import {
+  RouteMatchCallback,
+  RouteMatchCallbackOptions,
+} from 'workbox-core/types.js';
+import {Route} from 'workbox-routing/Route.js';
+
+import {PrecacheRouteOptions} from './_types.js';
+import {PrecacheController} from './PrecacheController.js';
+import {generateURLVariations} from './utils/generateURLVariations.js';
+
+import './_version.js';
+
+/**
+ * A subclass of {@link workbox-routing.Route} that takes a
+ * {@link workbox-precaching.PrecacheController}
+ * instance and uses it to match incoming requests and handle fetching
+ * responses from the precache.
+ *
+ * @memberof workbox-precaching
+ * @extends workbox-routing.Route
+ */
+class PrecacheRoute extends Route {
+  /**
+   * @param {PrecacheController} precacheController A `PrecacheController`
+   * instance used to both match requests and respond to fetch events.
+   * @param {Object} [options] Options to control how requests are matched
+   * against the list of precached URLs.
+   * @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<RegExp>} [options.ignoreURLParametersMatching=[/^utm_/, /^fbclid$/]] 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 URLs that should be checked for precache matches.
+   */
+  constructor(
+    precacheController: PrecacheController,
+    options?: PrecacheRouteOptions,
+  ) {
+    const match: RouteMatchCallback = ({
+      request,
+    }: RouteMatchCallbackOptions) => {
+      const urlsToCacheKeys = precacheController.getURLsToCacheKeys();
+      for (const possibleURL of generateURLVariations(request.url, options)) {
+        const cacheKey = urlsToCacheKeys.get(possibleURL);
+        if (cacheKey) {
+          const integrity =
+            precacheController.getIntegrityForCacheKey(cacheKey);
+          return {cacheKey, integrity};
+        }
+      }
+      if (process.env.NODE_ENV !== 'production') {
+        logger.debug(
+          `Precaching did not find a match for ` + getFriendlyURL(request.url),
+        );
+      }
+      return;
+    };
+
+    super(match, precacheController.strategy);
+  }
+}
+
+export {PrecacheRoute};
Index: frontend/node_modules/workbox-precaching/src/PrecacheStrategy.ts
===================================================================
--- frontend/node_modules/workbox-precaching/src/PrecacheStrategy.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/src/PrecacheStrategy.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,287 @@
+/*
+  Copyright 2020 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.
+*/
+
+import {copyResponse} from 'workbox-core/copyResponse.js';
+import {cacheNames} from 'workbox-core/_private/cacheNames.js';
+import {getFriendlyURL} from 'workbox-core/_private/getFriendlyURL.js';
+import {logger} from 'workbox-core/_private/logger.js';
+import {WorkboxError} from 'workbox-core/_private/WorkboxError.js';
+import {WorkboxPlugin} from 'workbox-core/types.js';
+import {Strategy, StrategyOptions} from 'workbox-strategies/Strategy.js';
+import {StrategyHandler} from 'workbox-strategies/StrategyHandler.js';
+
+import './_version.js';
+
+interface PrecacheStrategyOptions extends StrategyOptions {
+  fallbackToNetwork?: boolean;
+}
+
+/**
+ * A {@link workbox-strategies.Strategy} implementation
+ * specifically designed to work with
+ * {@link workbox-precaching.PrecacheController}
+ * to both cache and fetch precached assets.
+ *
+ * Note: an instance of this class is created automatically when creating a
+ * `PrecacheController`; it's generally not necessary to create this yourself.
+ *
+ * @extends workbox-strategies.Strategy
+ * @memberof workbox-precaching
+ */
+class PrecacheStrategy extends Strategy {
+  private readonly _fallbackToNetwork: boolean;
+
+  static readonly defaultPrecacheCacheabilityPlugin: WorkboxPlugin = {
+    async cacheWillUpdate({response}) {
+      if (!response || response.status >= 400) {
+        return null;
+      }
+
+      return response;
+    },
+  };
+
+  static readonly copyRedirectedCacheableResponsesPlugin: WorkboxPlugin = {
+    async cacheWillUpdate({response}) {
+      return response.redirected ? await copyResponse(response) : response;
+    },
+  };
+
+  /**
+   *
+   * @param {Object} [options]
+   * @param {string} [options.cacheName] Cache name to store and retrieve
+   * requests. Defaults to the cache names provided by
+   * {@link workbox-core.cacheNames}.
+   * @param {Array<Object>} [options.plugins] {@link https://developers.google.com/web/tools/workbox/guides/using-plugins|Plugins}
+   * to use in conjunction with this caching strategy.
+   * @param {Object} [options.fetchOptions] Values passed along to the
+   * {@link https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/fetch#Parameters|init}
+   * of all fetch() requests made by this strategy.
+   * @param {Object} [options.matchOptions] The
+   * {@link https://w3c.github.io/ServiceWorker/#dictdef-cachequeryoptions|CacheQueryOptions}
+   * for any `cache.match()` or `cache.put()` calls made by this strategy.
+   * @param {boolean} [options.fallbackToNetwork=true] Whether to attempt to
+   * get the response from the network if there's a precache miss.
+   */
+  constructor(options: PrecacheStrategyOptions = {}) {
+    options.cacheName = cacheNames.getPrecacheName(options.cacheName);
+    super(options);
+
+    this._fallbackToNetwork =
+      options.fallbackToNetwork === false ? false : true;
+
+    // Redirected responses cannot be used to satisfy a navigation request, so
+    // any redirected response must be "copied" rather than cloned, so the new
+    // response doesn't contain the `redirected` flag. See:
+    // https://bugs.chromium.org/p/chromium/issues/detail?id=669363&desc=2#c1
+    this.plugins.push(PrecacheStrategy.copyRedirectedCacheableResponsesPlugin);
+  }
+
+  /**
+   * @private
+   * @param {Request|string} request A request to run this strategy for.
+   * @param {workbox-strategies.StrategyHandler} handler The event that
+   *     triggered the request.
+   * @return {Promise<Response>}
+   */
+  async _handle(request: Request, handler: StrategyHandler): Promise<Response> {
+    const response = await handler.cacheMatch(request);
+    if (response) {
+      return response;
+    }
+
+    // If this is an `install` event for an entry that isn't already cached,
+    // then populate the cache.
+    if (handler.event && handler.event.type === 'install') {
+      return await this._handleInstall(request, handler);
+    }
+
+    // Getting here means something went wrong. An entry that should have been
+    // precached wasn't found in the cache.
+    return await this._handleFetch(request, handler);
+  }
+
+  async _handleFetch(
+    request: Request,
+    handler: StrategyHandler,
+  ): Promise<Response> {
+    let response;
+    const params = (handler.params || {}) as {
+      cacheKey?: string;
+      integrity?: string;
+    };
+
+    // Fall back to the network if we're configured to do so.
+    if (this._fallbackToNetwork) {
+      if (process.env.NODE_ENV !== 'production') {
+        logger.warn(
+          `The precached response for ` +
+            `${getFriendlyURL(request.url)} in ${this.cacheName} was not ` +
+            `found. Falling back to the network.`,
+        );
+      }
+
+      const integrityInManifest = params.integrity;
+      const integrityInRequest = request.integrity;
+      const noIntegrityConflict =
+        !integrityInRequest || integrityInRequest === integrityInManifest;
+
+      // Do not add integrity if the original request is no-cors
+      // See https://github.com/GoogleChrome/workbox/issues/3096
+      response = await handler.fetch(
+        new Request(request, {
+          integrity:
+            request.mode !== 'no-cors'
+              ? integrityInRequest || integrityInManifest
+              : undefined,
+        }),
+      );
+
+      // It's only "safe" to repair the cache if we're using SRI to guarantee
+      // that the response matches the precache manifest's expectations,
+      // and there's either a) no integrity property in the incoming request
+      // or b) there is an integrity, and it matches the precache manifest.
+      // See https://github.com/GoogleChrome/workbox/issues/2858
+      // Also if the original request users no-cors we don't use integrity.
+      // See https://github.com/GoogleChrome/workbox/issues/3096
+      if (
+        integrityInManifest &&
+        noIntegrityConflict &&
+        request.mode !== 'no-cors'
+      ) {
+        this._useDefaultCacheabilityPluginIfNeeded();
+        const wasCached = await handler.cachePut(request, response.clone());
+        if (process.env.NODE_ENV !== 'production') {
+          if (wasCached) {
+            logger.log(
+              `A response for ${getFriendlyURL(request.url)} ` +
+                `was used to "repair" the precache.`,
+            );
+          }
+        }
+      }
+    } else {
+      // This shouldn't normally happen, but there are edge cases:
+      // https://github.com/GoogleChrome/workbox/issues/1441
+      throw new WorkboxError('missing-precache-entry', {
+        cacheName: this.cacheName,
+        url: request.url,
+      });
+    }
+
+    if (process.env.NODE_ENV !== 'production') {
+      const cacheKey =
+        params.cacheKey || (await handler.getCacheKey(request, 'read'));
+
+      // Workbox is going to handle the route.
+      // print the routing details to the console.
+      logger.groupCollapsed(
+        `Precaching is responding to: ` + getFriendlyURL(request.url),
+      );
+      logger.log(
+        `Serving the precached url: ${getFriendlyURL(
+          cacheKey instanceof Request ? cacheKey.url : cacheKey,
+        )}`,
+      );
+
+      logger.groupCollapsed(`View request details here.`);
+      logger.log(request);
+      logger.groupEnd();
+
+      logger.groupCollapsed(`View response details here.`);
+      logger.log(response);
+      logger.groupEnd();
+
+      logger.groupEnd();
+    }
+
+    return response;
+  }
+
+  async _handleInstall(
+    request: Request,
+    handler: StrategyHandler,
+  ): Promise<Response> {
+    this._useDefaultCacheabilityPluginIfNeeded();
+
+    const response = await handler.fetch(request);
+
+    // Make sure we defer cachePut() until after we know the response
+    // should be cached; see https://github.com/GoogleChrome/workbox/issues/2737
+    const wasCached = await handler.cachePut(request, response.clone());
+    if (!wasCached) {
+      // Throwing here will lead to the `install` handler failing, which
+      // we want to do if *any* of the responses aren't safe to cache.
+      throw new WorkboxError('bad-precaching-response', {
+        url: request.url,
+        status: response.status,
+      });
+    }
+
+    return response;
+  }
+
+  /**
+   * This method is complex, as there a number of things to account for:
+   *
+   * The `plugins` array can be set at construction, and/or it might be added to
+   * to at any time before the strategy is used.
+   *
+   * At the time the strategy is used (i.e. during an `install` event), there
+   * needs to be at least one plugin that implements `cacheWillUpdate` in the
+   * array, other than `copyRedirectedCacheableResponsesPlugin`.
+   *
+   * - If this method is called and there are no suitable `cacheWillUpdate`
+   * plugins, we need to add `defaultPrecacheCacheabilityPlugin`.
+   *
+   * - If this method is called and there is exactly one `cacheWillUpdate`, then
+   * we don't have to do anything (this might be a previously added
+   * `defaultPrecacheCacheabilityPlugin`, or it might be a custom plugin).
+   *
+   * - If this method is called and there is more than one `cacheWillUpdate`,
+   * then we need to check if one is `defaultPrecacheCacheabilityPlugin`. If so,
+   * we need to remove it. (This situation is unlikely, but it could happen if
+   * the strategy is used multiple times, the first without a `cacheWillUpdate`,
+   * and then later on after manually adding a custom `cacheWillUpdate`.)
+   *
+   * See https://github.com/GoogleChrome/workbox/issues/2737 for more context.
+   *
+   * @private
+   */
+  _useDefaultCacheabilityPluginIfNeeded(): void {
+    let defaultPluginIndex: number | null = null;
+    let cacheWillUpdatePluginCount = 0;
+
+    for (const [index, plugin] of this.plugins.entries()) {
+      // Ignore the copy redirected plugin when determining what to do.
+      if (plugin === PrecacheStrategy.copyRedirectedCacheableResponsesPlugin) {
+        continue;
+      }
+
+      // Save the default plugin's index, in case it needs to be removed.
+      if (plugin === PrecacheStrategy.defaultPrecacheCacheabilityPlugin) {
+        defaultPluginIndex = index;
+      }
+
+      if (plugin.cacheWillUpdate) {
+        cacheWillUpdatePluginCount++;
+      }
+    }
+
+    if (cacheWillUpdatePluginCount === 0) {
+      this.plugins.push(PrecacheStrategy.defaultPrecacheCacheabilityPlugin);
+    } else if (cacheWillUpdatePluginCount > 1 && defaultPluginIndex !== null) {
+      // Only remove the default plugin; multiple custom plugins are allowed.
+      this.plugins.splice(defaultPluginIndex, 1);
+    }
+    // Nothing needs to be done if cacheWillUpdatePluginCount is 1
+  }
+}
+
+export {PrecacheStrategy};
Index: frontend/node_modules/workbox-precaching/src/_types.ts
===================================================================
--- frontend/node_modules/workbox-precaching/src/_types.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/src/_types.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,85 @@
+/*
+  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.
+*/
+
+import './_version.js';
+
+export interface InstallResult {
+  updatedURLs: string[];
+  notUpdatedURLs: string[];
+}
+
+export interface CleanupResult {
+  deletedCacheRequests: string[];
+}
+
+export declare interface PrecacheEntry {
+  integrity?: string;
+  url: string;
+  revision?: string | null;
+}
+
+export interface PrecacheRouteOptions {
+  directoryIndex?: string;
+  ignoreURLParametersMatching?: RegExp[];
+  cleanURLs?: boolean;
+  urlManipulation?: urlManipulation;
+}
+
+export type urlManipulation = ({url}: {url: URL}) => URL[];
+
+// * * * IMPORTANT! * * *
+// ------------------------------------------------------------------------- //
+// jdsoc type definitions cannot be declared above TypeScript definitions or
+// they'll be stripped from the built `.js` files, and they'll only be in the
+// `d.ts` files, which aren't read by the jsdoc generator. As a result we
+// have to put declare them below.
+
+/**
+ * @typedef {Object} InstallResult
+ * @property {Array<string>} updatedURLs List of URLs that were updated during
+ * installation.
+ * @property {Array<string>} notUpdatedURLs List of URLs that were already up to
+ * date.
+ *
+ * @memberof workbox-precaching
+ */
+
+/**
+ * @typedef {Object} CleanupResult
+ * @property {Array<string>} deletedCacheRequests List of URLs that were deleted
+ * while cleaning up the cache.
+ *
+ * @memberof workbox-precaching
+ */
+
+/**
+ * @typedef {Object} PrecacheEntry
+ * @property {string} url URL to precache.
+ * @property {string} [revision] Revision information for the URL.
+ * @property {string} [integrity] Integrity metadata that will be used when
+ * making the network request for the URL.
+ *
+ * @memberof workbox-precaching
+ */
+
+/**
+ * The "urlManipulation" callback can be used to determine if there are any
+ * additional permutations of a URL that should be used to check against
+ * the available precached files.
+ *
+ * For example, Workbox supports checking for '/index.html' when the URL
+ * '/' is provided. This callback allows additional, custom checks.
+ *
+ * @callback ~urlManipulation
+ * @param {Object} context
+ * @param {URL} context.url The request's URL.
+ * @return {Array<URL>} To add additional urls to test, return an Array of
+ * URLs. Please note that these **should not be strings**, but URL objects.
+ *
+ * @memberof workbox-precaching
+ */
Index: frontend/node_modules/workbox-precaching/src/_version.ts
===================================================================
--- frontend/node_modules/workbox-precaching/src/_version.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/src/_version.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+// @ts-ignore
+try{self['workbox:precaching:6.6.0']&&_()}catch(e){}
Index: frontend/node_modules/workbox-precaching/src/addPlugins.ts
===================================================================
--- frontend/node_modules/workbox-precaching/src/addPlugins.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/src/addPlugins.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,25 @@
+/*
+  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.
+*/
+
+import {WorkboxPlugin} from 'workbox-core/types.js';
+import {getOrCreatePrecacheController} from './utils/getOrCreatePrecacheController.js';
+import './_version.js';
+
+/**
+ * Adds plugins to the precaching strategy.
+ *
+ * @param {Array<Object>} plugins
+ *
+ * @memberof workbox-precaching
+ */
+function addPlugins(plugins: WorkboxPlugin[]): void {
+  const precacheController = getOrCreatePrecacheController();
+  precacheController.strategy.plugins.push(...plugins);
+}
+
+export {addPlugins};
Index: frontend/node_modules/workbox-precaching/src/addRoute.ts
===================================================================
--- frontend/node_modules/workbox-precaching/src/addRoute.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/src/addRoute.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,38 @@
+/*
+  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.
+*/
+
+import {registerRoute} from 'workbox-routing/registerRoute.js';
+
+import {getOrCreatePrecacheController} from './utils/getOrCreatePrecacheController.js';
+import {PrecacheRoute} from './PrecacheRoute.js';
+import {PrecacheRouteOptions} from './_types.js';
+
+import './_version.js';
+
+/**
+ * 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] See the {@link workbox-precaching.PrecacheRoute}
+ * options.
+ *
+ * @memberof workbox-precaching
+ */
+function addRoute(options?: PrecacheRouteOptions): void {
+  const precacheController = getOrCreatePrecacheController();
+
+  const precacheRoute = new PrecacheRoute(precacheController, options);
+  registerRoute(precacheRoute);
+}
+
+export {addRoute};
Index: frontend/node_modules/workbox-precaching/src/cleanupOutdatedCaches.ts
===================================================================
--- frontend/node_modules/workbox-precaching/src/cleanupOutdatedCaches.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/src/cleanupOutdatedCaches.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,41 @@
+/*
+  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.
+*/
+
+import {cacheNames} from 'workbox-core/_private/cacheNames.js';
+import {logger} from 'workbox-core/_private/logger.js';
+import {deleteOutdatedCaches} from './utils/deleteOutdatedCaches.js';
+import './_version.js';
+
+/**
+ * Adds an `activate` event listener which will clean up incompatible
+ * precaches that were created by older versions of Workbox.
+ *
+ * @memberof workbox-precaching
+ */
+function cleanupOutdatedCaches(): void {
+  // See https://github.com/Microsoft/TypeScript/issues/28357#issuecomment-436484705
+  self.addEventListener('activate', ((event: ExtendableEvent) => {
+    const cacheName = cacheNames.getPrecacheName();
+
+    event.waitUntil(
+      deleteOutdatedCaches(cacheName).then((cachesDeleted) => {
+        if (process.env.NODE_ENV !== 'production') {
+          if (cachesDeleted.length > 0) {
+            logger.log(
+              `The following out-of-date precaches were cleaned up ` +
+                `automatically:`,
+              cachesDeleted,
+            );
+          }
+        }
+      }),
+    );
+  }) as EventListener);
+}
+
+export {cleanupOutdatedCaches};
Index: frontend/node_modules/workbox-precaching/src/createHandlerBoundToURL.ts
===================================================================
--- frontend/node_modules/workbox-precaching/src/createHandlerBoundToURL.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/src/createHandlerBoundToURL.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,35 @@
+/*
+  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.
+*/
+
+import {getOrCreatePrecacheController} from './utils/getOrCreatePrecacheController.js';
+import {RouteHandlerCallback} from 'workbox-core/types.js';
+import './_version.js';
+
+/**
+ * Helper function that calls
+ * {@link PrecacheController#createHandlerBoundToURL} on the default
+ * {@link PrecacheController} instance.
+ *
+ * If you are creating your own {@link PrecacheController}, then call the
+ * {@link PrecacheController#createHandlerBoundToURL} on that instance,
+ * instead of using this function.
+ *
+ * @param {string} url The precached URL which will be used to lookup the
+ * `Response`.
+ * @param {boolean} [fallbackToNetwork=true] Whether to attempt to get the
+ * response from the network if there's a precache miss.
+ * @return {workbox-routing~handlerCallback}
+ *
+ * @memberof workbox-precaching
+ */
+function createHandlerBoundToURL(url: string): RouteHandlerCallback {
+  const precacheController = getOrCreatePrecacheController();
+  return precacheController.createHandlerBoundToURL(url);
+}
+
+export {createHandlerBoundToURL};
Index: frontend/node_modules/workbox-precaching/src/getCacheKeyForURL.ts
===================================================================
--- frontend/node_modules/workbox-precaching/src/getCacheKeyForURL.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/src/getCacheKeyForURL.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,36 @@
+/*
+  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.
+*/
+
+import {getOrCreatePrecacheController} from './utils/getOrCreatePrecacheController.js';
+import './_version.js';
+
+/**
+ * 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.
+ *
+ * @memberof workbox-precaching
+ */
+function getCacheKeyForURL(url: string): string | undefined {
+  const precacheController = getOrCreatePrecacheController();
+  return precacheController.getCacheKeyForURL(url);
+}
+
+export {getCacheKeyForURL};
Index: frontend/node_modules/workbox-precaching/src/index.ts
===================================================================
--- frontend/node_modules/workbox-precaching/src/index.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/src/index.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,52 @@
+/*
+  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.
+*/
+
+import {addPlugins} from './addPlugins.js';
+import {addRoute} from './addRoute.js';
+import {cleanupOutdatedCaches} from './cleanupOutdatedCaches.js';
+import {createHandlerBoundToURL} from './createHandlerBoundToURL.js';
+import {getCacheKeyForURL} from './getCacheKeyForURL.js';
+import {matchPrecache} from './matchPrecache.js';
+import {precache} from './precache.js';
+import {precacheAndRoute} from './precacheAndRoute.js';
+import {PrecacheController} from './PrecacheController.js';
+import {PrecacheRoute} from './PrecacheRoute.js';
+import {PrecacheStrategy} from './PrecacheStrategy.js';
+import {PrecacheFallbackPlugin} from './PrecacheFallbackPlugin.js';
+
+import './_version.js';
+
+/**
+ * Most consumers of this module will want to use the
+ * {@link workbox-precaching.precacheAndRoute}
+ * method to add assets to the cache and respond to network requests with these
+ * cached assets.
+ *
+ * If you require more control over caching and routing, you can use the
+ * {@link workbox-precaching.PrecacheController}
+ * interface.
+ *
+ * @module workbox-precaching
+ */
+
+export {
+  addPlugins,
+  addRoute,
+  cleanupOutdatedCaches,
+  createHandlerBoundToURL,
+  getCacheKeyForURL,
+  matchPrecache,
+  precache,
+  precacheAndRoute,
+  PrecacheController,
+  PrecacheRoute,
+  PrecacheStrategy,
+  PrecacheFallbackPlugin,
+};
+
+export * from './_types.js';
Index: frontend/node_modules/workbox-precaching/src/matchPrecache.ts
===================================================================
--- frontend/node_modules/workbox-precaching/src/matchPrecache.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/src/matchPrecache.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,35 @@
+/*
+  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.
+*/
+
+import {getOrCreatePrecacheController} from './utils/getOrCreatePrecacheController.js';
+
+import './_version.js';
+
+/**
+ * Helper function that calls
+ * {@link PrecacheController#matchPrecache} on the default
+ * {@link PrecacheController} instance.
+ *
+ * If you are creating your own {@link PrecacheController}, then call
+ * {@link PrecacheController#matchPrecache} on that instance,
+ * instead of using this function.
+ *
+ * @param {string|Request} request The key (without revisioning parameters)
+ * to look up in the precache.
+ * @return {Promise<Response|undefined>}
+ *
+ * @memberof workbox-precaching
+ */
+function matchPrecache(
+  request: string | Request,
+): Promise<Response | undefined> {
+  const precacheController = getOrCreatePrecacheController();
+  return precacheController.matchPrecache(request);
+}
+
+export {matchPrecache};
Index: frontend/node_modules/workbox-precaching/src/precache.ts
===================================================================
--- frontend/node_modules/workbox-precaching/src/precache.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/src/precache.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,37 @@
+/*
+  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.
+*/
+
+import {getOrCreatePrecacheController} from './utils/getOrCreatePrecacheController.js';
+import {PrecacheEntry} from './_types.js';
+import './_version.js';
+
+/**
+ * Adds items to the precache list, removing any duplicates and
+ * stores the files in the
+ * {@link workbox-core.cacheNames|"precache cache"} 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
+ * {@link workbox-precaching.addRoute}.
+ *
+ * If you have a single array of files to precache, you can just call
+ * {@link workbox-precaching.precacheAndRoute}.
+ *
+ * @param {Array<Object|string>} [entries=[]] Array of entries to precache.
+ *
+ * @memberof workbox-precaching
+ */
+function precache(entries: Array<PrecacheEntry | string>): void {
+  const precacheController = getOrCreatePrecacheController();
+  precacheController.precache(entries);
+}
+
+export {precache};
Index: frontend/node_modules/workbox-precaching/src/precacheAndRoute.ts
===================================================================
--- frontend/node_modules/workbox-precaching/src/precacheAndRoute.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/src/precacheAndRoute.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,36 @@
+/*
+  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.
+*/
+
+import {addRoute} from './addRoute.js';
+import {precache} from './precache.js';
+import {PrecacheRouteOptions, PrecacheEntry} from './_types.js';
+import './_version.js';
+
+/**
+ * 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
+ * {@link workbox-precaching.precache} and
+ * {@link workbox-precaching.addRoute} in a single call.
+ *
+ * @param {Array<Object|string>} entries Array of entries to precache.
+ * @param {Object} [options] See the
+ * {@link workbox-precaching.PrecacheRoute} options.
+ *
+ * @memberof workbox-precaching
+ */
+function precacheAndRoute(
+  entries: Array<PrecacheEntry | string>,
+  options?: PrecacheRouteOptions,
+): void {
+  precache(entries);
+  addRoute(options);
+}
+
+export {precacheAndRoute};
Index: frontend/node_modules/workbox-precaching/src/utils/PrecacheCacheKeyPlugin.ts
===================================================================
--- frontend/node_modules/workbox-precaching/src/utils/PrecacheCacheKeyPlugin.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/src/utils/PrecacheCacheKeyPlugin.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,45 @@
+/*
+  Copyright 2020 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.
+*/
+
+import {WorkboxPlugin, WorkboxPluginCallbackParam} from 'workbox-core/types.js';
+
+import {PrecacheController} from '../PrecacheController.js';
+
+import '../_version.js';
+
+/**
+ * A plugin, designed to be used with PrecacheController, to translate URLs into
+ * the corresponding cache key, based on the current revision info.
+ *
+ * @private
+ */
+class PrecacheCacheKeyPlugin implements WorkboxPlugin {
+  private readonly _precacheController: PrecacheController;
+
+  constructor({precacheController}: {precacheController: PrecacheController}) {
+    this._precacheController = precacheController;
+  }
+
+  cacheKeyWillBeUsed: WorkboxPlugin['cacheKeyWillBeUsed'] = async ({
+    request,
+    params,
+  }: WorkboxPluginCallbackParam['cacheKeyWillBeUsed']) => {
+    // Params is type any, can't change right now.
+    /* eslint-disable */
+    const cacheKey =
+      params?.cacheKey ||
+      this._precacheController.getCacheKeyForURL(request.url);
+    /* eslint-enable */
+
+    return cacheKey
+      ? new Request(cacheKey, {headers: request.headers})
+      : request;
+  };
+}
+
+export {PrecacheCacheKeyPlugin};
Index: frontend/node_modules/workbox-precaching/src/utils/PrecacheInstallReportPlugin.ts
===================================================================
--- frontend/node_modules/workbox-precaching/src/utils/PrecacheInstallReportPlugin.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/src/utils/PrecacheInstallReportPlugin.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,58 @@
+/*
+  Copyright 2020 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.
+*/
+
+import {WorkboxPlugin, WorkboxPluginCallbackParam} from 'workbox-core/types.js';
+
+import '../_version.js';
+
+/**
+ * A plugin, designed to be used with PrecacheController, to determine the
+ * of assets that were updated (or not updated) during the install event.
+ *
+ * @private
+ */
+class PrecacheInstallReportPlugin implements WorkboxPlugin {
+  updatedURLs: string[] = [];
+  notUpdatedURLs: string[] = [];
+
+  handlerWillStart: WorkboxPlugin['handlerWillStart'] = async ({
+    request,
+    state,
+  }: WorkboxPluginCallbackParam['handlerWillStart']) => {
+    // TODO: `state` should never be undefined...
+    if (state) {
+      state.originalRequest = request;
+    }
+  };
+
+  cachedResponseWillBeUsed: WorkboxPlugin['cachedResponseWillBeUsed'] = async ({
+    event,
+    state,
+    cachedResponse,
+  }: WorkboxPluginCallbackParam['cachedResponseWillBeUsed']) => {
+    if (event.type === 'install') {
+      if (
+        state &&
+        state.originalRequest &&
+        state.originalRequest instanceof Request
+      ) {
+        // TODO: `state` should never be undefined...
+        const url = state.originalRequest.url;
+
+        if (cachedResponse) {
+          this.notUpdatedURLs.push(url);
+        } else {
+          this.updatedURLs.push(url);
+        }
+      }
+    }
+    return cachedResponse;
+  };
+}
+
+export {PrecacheInstallReportPlugin};
Index: frontend/node_modules/workbox-precaching/src/utils/createCacheKey.ts
===================================================================
--- frontend/node_modules/workbox-precaching/src/utils/createCacheKey.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/src/utils/createCacheKey.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,69 @@
+/*
+  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.
+*/
+
+import {WorkboxError} from 'workbox-core/_private/WorkboxError.js';
+import {PrecacheEntry} from '../_types.js';
+import '../_version.js';
+
+interface CacheKey {
+  cacheKey: string;
+  url: string;
+}
+
+// Name of the search parameter used to store revision info.
+const REVISION_SEARCH_PARAM = '__WB_REVISION__';
+
+/**
+ * Converts a manifest entry into a versioned URL suitable for precaching.
+ *
+ * @param {Object|string} entry
+ * @return {string} A URL with versioning info.
+ *
+ * @private
+ * @memberof workbox-precaching
+ */
+export function createCacheKey(entry: PrecacheEntry | string): CacheKey {
+  if (!entry) {
+    throw new 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.href);
+    return {
+      cacheKey: urlObject.href,
+      url: urlObject.href,
+    };
+  }
+
+  const {revision, url} = entry;
+  if (!url) {
+    throw new 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.href);
+    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 cacheKeyURL = new URL(url, location.href);
+  const originalURL = new URL(url, location.href);
+  cacheKeyURL.searchParams.set(REVISION_SEARCH_PARAM, revision);
+  return {
+    cacheKey: cacheKeyURL.href,
+    url: originalURL.href,
+  };
+}
Index: frontend/node_modules/workbox-precaching/src/utils/deleteOutdatedCaches.ts
===================================================================
--- frontend/node_modules/workbox-precaching/src/utils/deleteOutdatedCaches.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/src/utils/deleteOutdatedCaches.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,55 @@
+/*
+  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.
+*/
+
+import '../_version.js';
+
+// Give TypeScript the correct global.
+declare let self: ServiceWorkerGlobalScope;
+
+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<string>} A list of all the cache names that were deleted.
+ *
+ * @private
+ * @memberof workbox-precaching
+ */
+const deleteOutdatedCaches = async (
+  currentPrecacheName: string,
+  substringToFind: string = SUBSTRING_TO_FIND,
+): Promise<string[]> => {
+  const cacheNames = await self.caches.keys();
+
+  const cacheNamesToDelete = cacheNames.filter((cacheName) => {
+    return (
+      cacheName.includes(substringToFind) &&
+      cacheName.includes(self.registration.scope) &&
+      cacheName !== currentPrecacheName
+    );
+  });
+
+  await Promise.all(
+    cacheNamesToDelete.map((cacheName) => self.caches.delete(cacheName)),
+  );
+
+  return cacheNamesToDelete;
+};
+
+export {deleteOutdatedCaches};
Index: frontend/node_modules/workbox-precaching/src/utils/generateURLVariations.ts
===================================================================
--- frontend/node_modules/workbox-precaching/src/utils/generateURLVariations.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/src/utils/generateURLVariations.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,60 @@
+/*
+  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.
+*/
+
+import {removeIgnoredSearchParams} from './removeIgnoredSearchParams.js';
+import {PrecacheRouteOptions} from '../_types.js';
+import '../_version.js';
+
+/**
+ * Generator function that yields possible variations on the original URL to
+ * check, one at a time.
+ *
+ * @param {string} url
+ * @param {Object} options
+ *
+ * @private
+ * @memberof workbox-precaching
+ */
+export function* generateURLVariations(
+  url: string,
+  {
+    ignoreURLParametersMatching = [/^utm_/, /^fbclid$/],
+    directoryIndex = 'index.html',
+    cleanURLs = true,
+    urlManipulation,
+  }: PrecacheRouteOptions = {},
+): Generator<string, void, unknown> {
+  const urlObject = new URL(url, location.href);
+  urlObject.hash = '';
+  yield urlObject.href;
+
+  const urlWithoutIgnoredParams = removeIgnoredSearchParams(
+    urlObject,
+    ignoreURLParametersMatching,
+  );
+  yield urlWithoutIgnoredParams.href;
+
+  if (directoryIndex && urlWithoutIgnoredParams.pathname.endsWith('/')) {
+    const directoryURL = new URL(urlWithoutIgnoredParams.href);
+    directoryURL.pathname += directoryIndex;
+    yield directoryURL.href;
+  }
+
+  if (cleanURLs) {
+    const cleanURL = new URL(urlWithoutIgnoredParams.href);
+    cleanURL.pathname += '.html';
+    yield cleanURL.href;
+  }
+
+  if (urlManipulation) {
+    const additionalURLs = urlManipulation({url: urlObject});
+    for (const urlToAttempt of additionalURLs) {
+      yield urlToAttempt.href;
+    }
+  }
+}
Index: frontend/node_modules/workbox-precaching/src/utils/getCacheKeyForURL.ts
===================================================================
--- frontend/node_modules/workbox-precaching/src/utils/getCacheKeyForURL.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/src/utils/getCacheKeyForURL.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,38 @@
+/*
+  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.
+*/
+
+import {getOrCreatePrecacheController} from './getOrCreatePrecacheController.js';
+import {generateURLVariations} from './generateURLVariations.js';
+import {PrecacheRouteOptions} from '../_types.js';
+import '../_version.js';
+
+/**
+ * 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
+ */
+export const getCacheKeyForURL = (
+  url: string,
+  options: PrecacheRouteOptions,
+): string | void => {
+  const precacheController = getOrCreatePrecacheController();
+
+  const urlsToCacheKeys = precacheController.getURLsToCacheKeys();
+  for (const possibleURL of generateURLVariations(url, options)) {
+    const possibleCacheKey = urlsToCacheKeys.get(possibleURL);
+    if (possibleCacheKey) {
+      return possibleCacheKey;
+    }
+  }
+};
Index: frontend/node_modules/workbox-precaching/src/utils/getOrCreatePrecacheController.ts
===================================================================
--- frontend/node_modules/workbox-precaching/src/utils/getOrCreatePrecacheController.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/src/utils/getOrCreatePrecacheController.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,23 @@
+/*
+  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.
+*/
+
+import {PrecacheController} from '../PrecacheController.js';
+import '../_version.js';
+
+let precacheController: PrecacheController | undefined;
+
+/**
+ * @return {PrecacheController}
+ * @private
+ */
+export const getOrCreatePrecacheController = (): PrecacheController => {
+  if (!precacheController) {
+    precacheController = new PrecacheController();
+  }
+  return precacheController;
+};
Index: frontend/node_modules/workbox-precaching/src/utils/printCleanupDetails.ts
===================================================================
--- frontend/node_modules/workbox-precaching/src/utils/printCleanupDetails.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/src/utils/printCleanupDetails.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,45 @@
+/*
+  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.
+*/
+
+import {logger} from 'workbox-core/_private/logger.js';
+import '../_version.js';
+
+/**
+ * @param {string} groupTitle
+ * @param {Array<string>} deletedURLs
+ *
+ * @private
+ */
+const logGroup = (groupTitle: string, deletedURLs: string[]) => {
+  logger.groupCollapsed(groupTitle);
+
+  for (const url of deletedURLs) {
+    logger.log(url);
+  }
+
+  logger.groupEnd();
+};
+
+/**
+ * @param {Array<string>} deletedURLs
+ *
+ * @private
+ * @memberof workbox-precaching
+ */
+export function printCleanupDetails(deletedURLs: string[]): void {
+  const deletionCount = deletedURLs.length;
+  if (deletionCount > 0) {
+    logger.groupCollapsed(
+      `During precaching cleanup, ` +
+        `${deletionCount} cached ` +
+        `request${deletionCount === 1 ? ' was' : 's were'} deleted.`,
+    );
+    logGroup('Deleted Cache Requests', deletedURLs);
+    logger.groupEnd();
+  }
+}
Index: frontend/node_modules/workbox-precaching/src/utils/printInstallDetails.ts
===================================================================
--- frontend/node_modules/workbox-precaching/src/utils/printInstallDetails.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/src/utils/printInstallDetails.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,63 @@
+/*
+  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.
+*/
+
+import {logger} from 'workbox-core/_private/logger.js';
+import '../_version.js';
+
+/**
+ * @param {string} groupTitle
+ * @param {Array<string>} urls
+ *
+ * @private
+ */
+function _nestedGroup(groupTitle: string, urls: string[]): void {
+  if (urls.length === 0) {
+    return;
+  }
+
+  logger.groupCollapsed(groupTitle);
+
+  for (const url of urls) {
+    logger.log(url);
+  }
+
+  logger.groupEnd();
+}
+
+/**
+ * @param {Array<string>} urlsToPrecache
+ * @param {Array<string>} urlsAlreadyPrecached
+ *
+ * @private
+ * @memberof workbox-precaching
+ */
+export function printInstallDetails(
+  urlsToPrecache: string[],
+  urlsAlreadyPrecached: string[],
+): void {
+  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.groupCollapsed(message);
+
+    _nestedGroup(`View newly precached URLs.`, urlsToPrecache);
+    _nestedGroup(`View previously precached URLs.`, urlsAlreadyPrecached);
+    logger.groupEnd();
+  }
+}
Index: frontend/node_modules/workbox-precaching/src/utils/removeIgnoredSearchParams.ts
===================================================================
--- frontend/node_modules/workbox-precaching/src/utils/removeIgnoredSearchParams.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/src/utils/removeIgnoredSearchParams.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,36 @@
+/*
+  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.
+*/
+
+import '../_version.js';
+
+/**
+ * Removes any URL search parameters that should be ignored.
+ *
+ * @param {URL} urlObject The original URL.
+ * @param {Array<RegExp>} 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 workbox-precaching
+ */
+export function removeIgnoredSearchParams(
+  urlObject: URL,
+  ignoreURLParametersMatching: RegExp[] = [],
+): URL {
+  // 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;
+}
Index: frontend/node_modules/workbox-precaching/tsconfig.json
===================================================================
--- frontend/node_modules/workbox-precaching/tsconfig.json	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/tsconfig.json	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,14 @@
+{
+  "extends": "../../tsconfig",
+  "compilerOptions": {
+    "outDir": "./",
+    "rootDir": "./src",
+    "tsBuildInfoFile": "./tsconfig.tsbuildinfo"
+  },
+  "include": ["src/**/*.ts"],
+  "references": [
+    {"path": "../workbox-core/"},
+    {"path": "../workbox-routing/"},
+    {"path": "../workbox-strategies/"}
+  ]
+}
Index: frontend/node_modules/workbox-precaching/tsconfig.tsbuildinfo
===================================================================
--- frontend/node_modules/workbox-precaching/tsconfig.tsbuildinfo	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/tsconfig.tsbuildinfo	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.webworker.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../infra/type-overrides.d.ts","../workbox-core/_version.d.ts","../workbox-core/types.d.ts","../workbox-core/_private/assert.d.ts","../workbox-core/_private/cachenames.d.ts","../workbox-core/_private/logger.d.ts","../workbox-core/_private/workboxerror.d.ts","../workbox-core/_private/waituntil.d.ts","../workbox-strategies/_version.d.ts","../workbox-strategies/strategyhandler.d.ts","../workbox-strategies/strategy.d.ts","./src/_version.ts","./src/_types.ts","./src/utils/createcachekey.ts","./src/utils/precacheinstallreportplugin.ts","./src/utils/precachecachekeyplugin.ts","./src/utils/printcleanupdetails.ts","./src/utils/printinstalldetails.ts","../workbox-core/copyresponse.d.ts","../workbox-core/_private/getfriendlyurl.d.ts","./src/precachestrategy.ts","./src/precachecontroller.ts","./src/utils/getorcreateprecachecontroller.ts","./src/precachefallbackplugin.ts","../workbox-routing/_version.d.ts","../workbox-routing/utils/constants.d.ts","../workbox-routing/route.d.ts","./src/utils/removeignoredsearchparams.ts","./src/utils/generateurlvariations.ts","./src/precacheroute.ts","./src/addplugins.ts","../workbox-routing/registerroute.d.ts","./src/addroute.ts","./src/utils/deleteoutdatedcaches.ts","./src/cleanupoutdatedcaches.ts","./src/createhandlerboundtourl.ts","./src/getcachekeyforurl.ts","./src/matchprecache.ts","./src/precache.ts","./src/precacheandroute.ts","./src/index.ts","./src/utils/getcachekeyforurl.ts","../../node_modules/@babel/types/lib/index.d.ts","../../node_modules/@types/babel__generator/index.d.ts","../../node_modules/@babel/parser/typings/babel-parser.d.ts","../../node_modules/@types/babel__template/index.d.ts","../../node_modules/@types/babel__traverse/index.d.ts","../../node_modules/@types/babel__core/index.d.ts","../../node_modules/@types/babel__preset-env/index.d.ts","../../node_modules/@types/common-tags/index.d.ts","../../node_modules/@types/eslint/helpers.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/eslint/index.d.ts","../../node_modules/@types/eslint-scope/index.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/ts3.4/base.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/ts3.6/base.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/base.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/@types/fs-extra/index.d.ts","../../node_modules/@types/minimatch/index.d.ts","../../node_modules/@types/glob/index.d.ts","../../node_modules/@types/html-minifier-terser/index.d.ts","../../node_modules/@types/linkify-it/index.d.ts","../../node_modules/@types/lodash/common/common.d.ts","../../node_modules/@types/lodash/common/array.d.ts","../../node_modules/@types/lodash/common/collection.d.ts","../../node_modules/@types/lodash/common/date.d.ts","../../node_modules/@types/lodash/common/function.d.ts","../../node_modules/@types/lodash/common/lang.d.ts","../../node_modules/@types/lodash/common/math.d.ts","../../node_modules/@types/lodash/common/number.d.ts","../../node_modules/@types/lodash/common/object.d.ts","../../node_modules/@types/lodash/common/seq.d.ts","../../node_modules/@types/lodash/common/string.d.ts","../../node_modules/@types/lodash/common/util.d.ts","../../node_modules/@types/lodash/index.d.ts","../../node_modules/@types/mdurl/encode.d.ts","../../node_modules/@types/mdurl/decode.d.ts","../../node_modules/@types/mdurl/parse.d.ts","../../node_modules/@types/mdurl/format.d.ts","../../node_modules/@types/mdurl/index.d.ts","../../node_modules/@types/markdown-it/lib/common/utils.d.ts","../../node_modules/@types/markdown-it/lib/token.d.ts","../../node_modules/@types/markdown-it/lib/rules_inline/state_inline.d.ts","../../node_modules/@types/markdown-it/lib/helpers/parse_link_label.d.ts","../../node_modules/@types/markdown-it/lib/helpers/parse_link_destination.d.ts","../../node_modules/@types/markdown-it/lib/helpers/parse_link_title.d.ts","../../node_modules/@types/markdown-it/lib/helpers/index.d.ts","../../node_modules/@types/markdown-it/lib/ruler.d.ts","../../node_modules/@types/markdown-it/lib/rules_block/state_block.d.ts","../../node_modules/@types/markdown-it/lib/parser_block.d.ts","../../node_modules/@types/markdown-it/lib/rules_core/state_core.d.ts","../../node_modules/@types/markdown-it/lib/parser_core.d.ts","../../node_modules/@types/markdown-it/lib/parser_inline.d.ts","../../node_modules/@types/markdown-it/lib/renderer.d.ts","../../node_modules/@types/markdown-it/lib/index.d.ts","../../node_modules/@types/markdown-it/index.d.ts","../../node_modules/@types/minimist/index.d.ts","../../node_modules/@types/normalize-package-data/index.d.ts","../../node_modules/@types/parse-json/index.d.ts","../../node_modules/@types/resolve/index.d.ts","../../node_modules/@types/semver/classes/semver.d.ts","../../node_modules/@types/semver/functions/parse.d.ts","../../node_modules/@types/semver/functions/valid.d.ts","../../node_modules/@types/semver/functions/clean.d.ts","../../node_modules/@types/semver/functions/inc.d.ts","../../node_modules/@types/semver/functions/diff.d.ts","../../node_modules/@types/semver/functions/major.d.ts","../../node_modules/@types/semver/functions/minor.d.ts","../../node_modules/@types/semver/functions/patch.d.ts","../../node_modules/@types/semver/functions/prerelease.d.ts","../../node_modules/@types/semver/functions/compare.d.ts","../../node_modules/@types/semver/functions/rcompare.d.ts","../../node_modules/@types/semver/functions/compare-loose.d.ts","../../node_modules/@types/semver/functions/compare-build.d.ts","../../node_modules/@types/semver/functions/sort.d.ts","../../node_modules/@types/semver/functions/rsort.d.ts","../../node_modules/@types/semver/functions/gt.d.ts","../../node_modules/@types/semver/functions/lt.d.ts","../../node_modules/@types/semver/functions/eq.d.ts","../../node_modules/@types/semver/functions/neq.d.ts","../../node_modules/@types/semver/functions/gte.d.ts","../../node_modules/@types/semver/functions/lte.d.ts","../../node_modules/@types/semver/functions/cmp.d.ts","../../node_modules/@types/semver/functions/coerce.d.ts","../../node_modules/@types/semver/classes/comparator.d.ts","../../node_modules/@types/semver/classes/range.d.ts","../../node_modules/@types/semver/functions/satisfies.d.ts","../../node_modules/@types/semver/ranges/max-satisfying.d.ts","../../node_modules/@types/semver/ranges/min-satisfying.d.ts","../../node_modules/@types/semver/ranges/to-comparators.d.ts","../../node_modules/@types/semver/ranges/min-version.d.ts","../../node_modules/@types/semver/ranges/valid.d.ts","../../node_modules/@types/semver/ranges/outside.d.ts","../../node_modules/@types/semver/ranges/gtr.d.ts","../../node_modules/@types/semver/ranges/ltr.d.ts","../../node_modules/@types/semver/ranges/intersects.d.ts","../../node_modules/@types/semver/ranges/simplify.d.ts","../../node_modules/@types/semver/ranges/subset.d.ts","../../node_modules/@types/semver/internals/identifiers.d.ts","../../node_modules/@types/semver/index.d.ts","../../node_modules/@types/source-list-map/index.d.ts","../../node_modules/@types/stringify-object/index.d.ts","../../node_modules/@types/tapable/index.d.ts","../../node_modules/@types/uglify-js/node_modules/source-map/source-map.d.ts","../../node_modules/@types/uglify-js/index.d.ts","../../node_modules/@types/webpack-sources/node_modules/source-map/source-map.d.ts","../../node_modules/@types/webpack-sources/lib/source.d.ts","../../node_modules/@types/webpack-sources/lib/compatsource.d.ts","../../node_modules/@types/webpack-sources/lib/concatsource.d.ts","../../node_modules/@types/webpack-sources/lib/originalsource.d.ts","../../node_modules/@types/webpack-sources/lib/prefixsource.d.ts","../../node_modules/@types/webpack-sources/lib/rawsource.d.ts","../../node_modules/@types/webpack-sources/lib/replacesource.d.ts","../../node_modules/@types/webpack-sources/lib/sizeonlysource.d.ts","../../node_modules/@types/webpack-sources/lib/sourcemapsource.d.ts","../../node_modules/@types/webpack-sources/lib/index.d.ts","../../node_modules/@types/webpack-sources/lib/cachedsource.d.ts","../../node_modules/@types/webpack-sources/index.d.ts"],"fileInfos":[{"version":"8730f4bf322026ff5229336391a18bcaa1f94d4f82416c8b2f3954e2ccaae2ba","affectsGlobalScope":true},"dc47c4fa66b9b9890cf076304de2a9c5201e94b740cffdf09f87296d877d71f6","7a387c58583dfca701b6c85e0adaf43fb17d590fb16d5b2dc0a2fbd89f35c467","8a12173c586e95f4433e0c6dc446bc88346be73ffe9ca6eec7aa63c8f3dca7f9","5f4e733ced4e129482ae2186aae29fde948ab7182844c3a5a51dd346182c7b06",{"version":"d3f4771304b6b07e5a2bb992e75af76ac060de78803b1b21f0475ffc5654d817","affectsGlobalScope":true},{"version":"adb996790133eb33b33aadb9c09f15c2c575e71fb57a62de8bf74dbf59ec7dfb","affectsGlobalScope":true},{"version":"8cc8c5a3bac513368b0157f3d8b31cfdcfe78b56d3724f30f80ed9715e404af8","affectsGlobalScope":true},{"version":"cdccba9a388c2ee3fd6ad4018c640a471a6c060e96f1232062223063b0a5ac6a","affectsGlobalScope":true},{"version":"c5c05907c02476e4bde6b7e76a79ffcd948aedd14b6a8f56e4674221b0417398","affectsGlobalScope":true},{"version":"5f406584aef28a331c36523df688ca3650288d14f39c5d2e555c95f0d2ff8f6f","affectsGlobalScope":true},{"version":"22f230e544b35349cfb3bd9110b6ef37b41c6d6c43c3314a31bd0d9652fcec72","affectsGlobalScope":true},{"version":"7ea0b55f6b315cf9ac2ad622b0a7813315bb6e97bf4bb3fbf8f8affbca7dc695","affectsGlobalScope":true},{"version":"3013574108c36fd3aaca79764002b3717da09725a36a6fc02eac386593110f93","affectsGlobalScope":true},{"version":"eb26de841c52236d8222f87e9e6a235332e0788af8c87a71e9e210314300410a","affectsGlobalScope":true},{"version":"3be5a1453daa63e031d266bf342f3943603873d890ab8b9ada95e22389389006","affectsGlobalScope":true},{"version":"17bb1fc99591b00515502d264fa55dc8370c45c5298f4a5c2083557dccba5a2a","affectsGlobalScope":true},{"version":"7ce9f0bde3307ca1f944119f6365f2d776d281a393b576a18a2f2893a2d75c98","affectsGlobalScope":true},{"version":"6a6b173e739a6a99629a8594bfb294cc7329bfb7b227f12e1f7c11bc163b8577","affectsGlobalScope":true},{"version":"81cac4cbc92c0c839c70f8ffb94eb61e2d32dc1c3cf6d95844ca099463cf37ea","affectsGlobalScope":true},{"version":"b0124885ef82641903d232172577f2ceb5d3e60aed4da1153bab4221e1f6dd4e","affectsGlobalScope":true},{"version":"0eb85d6c590b0d577919a79e0084fa1744c1beba6fd0d4e951432fa1ede5510a","affectsGlobalScope":true},{"version":"da233fc1c8a377ba9e0bed690a73c290d843c2c3d23a7bd7ec5cd3d7d73ba1e0","affectsGlobalScope":true},{"version":"d154ea5bb7f7f9001ed9153e876b2d5b8f5c2bb9ec02b3ae0d239ec769f1f2ae","affectsGlobalScope":true},{"version":"bb2d3fb05a1d2ffbca947cc7cbc95d23e1d053d6595391bd325deb265a18d36c","affectsGlobalScope":true},{"version":"c80df75850fea5caa2afe43b9949338ce4e2de086f91713e9af1a06f973872b8","affectsGlobalScope":true},{"version":"09aa50414b80c023553090e2f53827f007a301bc34b0495bfb2c3c08ab9ad1eb","affectsGlobalScope":true},{"version":"2768ef564cfc0689a1b76106c421a2909bdff0acbe87da010785adab80efdd5c","affectsGlobalScope":true},{"version":"52d1bb7ab7a3306fd0375c8bff560feed26ed676a5b0457fa8027b563aecb9a4","affectsGlobalScope":true},{"version":"0396119f8b76a074eddc16de8dbc4231a448f2534f4c64c5ab7b71908eb6e646","affectsGlobalScope":true},"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","f0ae1ac99c66a4827469b8942101642ae65971e36db438afe67d4985caa31222","7f5bced3f1bd3647585b59564e0b0fda67e1c2930325507ee922698fe8366aca","dda5c129fa8b8e72bee6609a4fc48148f58f2f656d70a395d3122431193569f9",{"version":"d763b9ef68a16f3896187af5b51b5a959b479218cc65c2930bcb440cbbf10728","affectsGlobalScope":true},"0b066351c69855f76970a460fe20a500d20f369a02d2069aa49e1195cd04c3c5","70d9e4746e3ba572a12da28136b854e5503119e96c2524d99575d4b7c7379e70","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","e2f6b922ccd7b58655b27ec94b0a05383cc045bf7d34a84c7f771d8685a5eb05","98962a67c31e31dbb0f7eb27082465ca9bfd4b59c9f36537a70c27b1a3982e65",{"version":"e3142c11bfab042fe83093201f723ce110e31f8cd71a55ce36093b15716fc159","signature":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","affectsGlobalScope":true},{"version":"717580c5220e7be35f3d1094397a6584054aca2974d1ac8b1120b08f43396d58","signature":"14fec12122e38fcbb50d67790413a06eb82cfceae2d5d6d701ed6cb7e0201386"},{"version":"318cceb64a9d525593c0b83fb01ab56f57501731a774f50374b8fd1bb3fdefa4","signature":"75cf664f9d7789dbfb02631947b1c92692be060794e9354ab1258bc5292e61b6"},{"version":"0bccbf130c403f382a3f764b7f29124714707575256f54422e9a13903d465474","signature":"07bb19ad16557bf77726a1ba8cacd61d2520485b2fdb0c5e9fb6f9ca4c5212d4"},{"version":"198263e8a544df822b565311b4c6838395e4ef7ed735bc907a6d0a7168d28a9a","signature":"f5130cc54750ddfe75faeca4a4b68b35f3864e5fa93c5dfe59646d61f961cce5"},{"version":"dedda7af4c58341ac1386cfe143987b6c82aefc61984d71bfbdd42e8169d9e0c","signature":"bb83191f176f70c773daaf6239f53c548b8798764a1cc80537d1d8562ca99c20"},{"version":"e3e65472dca112b309eb2045455e8b798cd16fe2c1d290647c4ce7e2a5a2bde6","signature":"a3ee0be941da59515eb02f2ee2e84619703fc991f781a9ee2962c94c5303a48a"},"3a5d48aa1814dbcc6a6a1d22bb94c6870450e168c5fed6b73825590372b3edb3","9fd40388bab591ded1f8c05b64fbfe3e342c6cd70d594d5238f42dd2186980ff",{"version":"04fc16b768e79fb4b197a30c7f5486fd43e595825a406c630609b6dbbd9381ea","signature":"4a73873d165994e1a298004edc8caa6328499cdec93a6ef7da4b726aa97ad5dd"},{"version":"2d31378456dc2b2adc805ee8a2a430eab0c791f691e3c73384bd3e8a96af718f","signature":"f6135bf64c7d1f8ff926b129274d6f7dd27617e901b6bb5010f2d30de6b54e67","affectsGlobalScope":true},{"version":"753e1ca9502457b2cc88f45bd975fab5aa824c9dde04cbae000bfcd3f69c338b","signature":"1319e659c3f79ed86ff73ec6752bffac628907b738ea890dbc73e466fc3d1ea1"},{"version":"ca19a3df4d8ce037f063c483fc2a432b1b9a0f704c833cb8fc16c382ee6317fb","signature":"ece766b45f14f581723c6fa3ffdb07af6f985d95fd350867d02187f987280620"},"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","8d0f0aa989374cc6c7bc141649a9ca7d76b221a39375c8b98b844c3ad8c9b090","03e238c606e3567428238c11720093a64d3ef151ba465b7bf0ae8cca27540853",{"version":"742162c4626ca8f07f0786cb927d72cc260068e6464296775f0b4f5b4ddc1781","signature":"975ceb4448c2de3ce38d844ac807eadffcbb416367e8d1fc285b4505f80ac8a2"},{"version":"96c0409441a71f58a78b0d38cc8fcab602becf411abd66813fd221e4ed65b914","signature":"0d5c90206c34b13ea68817077e2c29d071f537c999a743304ec85bf95f7c8267"},{"version":"42f9ae54d21027d366e31e5e2cbe7dfbd8f778a58ced5fb2148b88e40897afaf","signature":"02019739688164f9c2f40e6c9a2614bbd09d43646386266718a99660e3481d6e"},{"version":"a52f2606577756ee1b0a7eb89f248aa34b247dbab749d827c5cf4d995e42ea62","signature":"c4fec0a8801ab5524d3afde4835af651d22484abcd51dcd7701f3666b816faa5"},"3c7281c1b6ec0997a6d02f43a1946fbf32eabf25c3404e79d28c5d20c13fd6c6",{"version":"2db2e1106985de24808d19242d26b652156450ab221ec6824afb45fa3c3c5e11","signature":"c1996190abbc73c09f3b563504ebe2f538409406f94ad5faf84004312dec0bbf"},{"version":"55b6a20ae11b403a531bb54fbeeb9f96e19e811657bc4ff042106b29d5ea50df","signature":"dc199f077c3b26c127a65ad5254ac72ce4db64b87d2f0f1af5d3ca61dc2f3424"},{"version":"03b4ba2287d9a0860bf2c0db17a31c60f9a358119b6170ddc4db9d7eb2a48192","signature":"15518325c9a2dc356f39c671b9054e78e4333ec23d1dd14bd0f49ae7fbf7d7c3"},{"version":"bf0633930c7868784eb3d50b7a5c73d3ab3ab837d60017d695d8ad019c6dc420","signature":"f3d7c81878a3a516a2ee532eec1f09064836982f8f7ffc4bc1d86e480fb0e6fc"},{"version":"c468bcaa8849dbad9f717008831927efde1869fbc5ffc5b425b8ba9c290b46be","signature":"82eae436585acea3d48584754f6f9653f026fecdbd08e94d3ec436535b5dce7f"},{"version":"0b4e4105d9d063ccc30fc095ebee3d4ea9b46406698a3186ddbf541347edb78b","signature":"4b2df5d613f0277020ba60d7f59a794e9993b97e2be3dc98719bcae1b754e699"},{"version":"91e19848f3e624280552f1a1de4540e34f7ae0a52e8d002180045ab5690dbb97","signature":"cf382ef2386e23a254c173e40c6d3ae8ad42244faa93d765b90f7c16eb975503"},{"version":"cd76d3a165b1ddea2d62b7066b157bba6e84d28e4cc3d2da922e958fe5067c65","signature":"cfd7e03a8a7c58cfb04d86f60af79ff4185527d133d25aa8d4cf964c6a0d4db2"},{"version":"df6ca50bef9c8a82a43f4dcce9c9f892886102cf433002e619b4fba41df14742","signature":"d08df3a0744475c03a927841abf2d474d7b3582fbfaa736970e7e018351ec723"},{"version":"c0fabe840b4de8896eddfb083a602eecd2d4d431b78eb66981ec990ad86124df","signature":"e70119843c7d6ded01dc8d769605c9535be112875f3a9cc88ef0b14311b5cd18"},"3eb8ad25895d53cc6229dc83decbc338d649ed6f3d5b537c9966293b056b1f57","b25c5f2970d06c729f464c0aeaa64b1a5b5f1355aa93554bb5f9c199b8624b1e","8678956904af215fe917b2df07b6c54f876fa64eb1f8a158e4ff38404cef3ff4","3051751533eee92572241b3cef28333212401408c4e7aa21718714b793c0f4ed","691aea9772797ca98334eb743e7686e29325b02c6931391bcee4cc7bf27a9f3b","6f1d39d26959517da3bd105c552eded4c34702705c64d75b03f54d864b6e41c2","5d1b955e6b1974fe5f47fbde474343113ab701ca30b80e463635a29e58d80944","3b93231babdb3ee9470a7e6103e48bf6585c4185f96941c08a77e097f8f469ae",{"version":"f345b0888d003fd69cb32bad3a0aa04c615ccafc572019e4bd86a52bd5e49e46","affectsGlobalScope":true},"0359682c54e487c4cab2b53b2b4d35cc8dea4d9914bc6abcdb5701f8b8e745a4","6a38e250306ceccbab257d11b846d5bd12491157d20901fa01afe4050c93c1b5","ffa048767a32a0f6354e611b15d8b53d882da1a9a35455c35c3f6811f2416d17","e050a0afcdbb269720a900c85076d18e0c1ab73e580202a2bf6964978181222a",{"version":"68aba9c37b535b42ce96b78a4cfa93813bf4525f86dceb88a6d726c5f7c6c14f","affectsGlobalScope":true},"c438b413e94ff76dfa20ae005f33a1c84f2480d1d66e0fd687501020d0de9b50","bc6a78961535181265845bf9b9e8a147ffd0ca275097ceb670a9b92afa825152","1fc4b0908c44f39b1f2e5a728d472670a0ea0970d2c6b5691c88167fe541ff82","123ec69e4b3a686eb49afd94ebe3292a5c84a867ecbcb6bb84bdd720a12af803",{"version":"51851805d06a6878796c3a00ccf0839fe18111a38d1bae84964c269f16bcc2b7","affectsGlobalScope":true},"90c85ddbb8de82cd19198bda062065fc51b7407c0f206f2e399e65a52e979720","c5ecc351d5eaa36dc682b4c398b57a9d37c108857b71a09464a06e0185831ac2","7ecfe97b43aa6c8b8f90caa599d5648bb559962e74e6f038f73a77320569dd78","7db7569fbb3e2b01ba8751c761cdd3f0debd104170d5665b7dc20a11630df3a9",{"version":"cde4d7f6274468180fa39847b183aec22626e8212ff885d535c53f4cd7c225fd","affectsGlobalScope":true},{"version":"072b0ac82ae8fe05b0d4f2eadb7f6edd0ebd84175ecad2f9e09261290a86bcee","affectsGlobalScope":true},"f6eedd1053167b8a651d8d9c70b1772e1b501264a36dfa881d7d4b30d623a9bc","fb28748ff8d015f52e99daee4f454e57cec1a22141f1257c317f3630a15edeb7","08fb2b0e1ef13a2df43f6d8e97019c36dfbc0475cf4d274c6838e2c9223fe39d","5d9394b829cfd504b2fe17287aaad8ce1dcfb2a2183c962a90a85b96da2c1c90","c969bf4c7cdfe4d5dd28aa09432f99d09ad1d8d8b839959646579521d0467d1a","6c3857edaeeaaf43812f527830ebeece9266b6e8eb5271ab6d2f0008306c9947","bc6a77e750f4d34584e46b1405b771fb69a224197dd6bafe5b0392a29a70b665","46cac76114704902baa535b30fb66a26aeaf9430f3b3ab44746e329f12e85498","ed4ae81196cccc10f297d228bca8d02e31058e6d723a3c5bc4be5fb3c61c6a34","84044697c8b3e08ef24e4b32cfe6440143d07e469a5e34bda0635276d32d9f35","6999f789ed86a40f3bc4d7e644e8d42ffda569465969df8077cd6c4e3505dd76",{"version":"0c9f2b308e5696d0802b613aff47c99f092add29408e654f7ab6026134250c18","affectsGlobalScope":true},"4a9008d79750801375605e6cfefa4e04643f20f2aaa58404c6aae1c894e9b049","884560fda6c3868f925f022adc3a1289fe6507bbb45adb10fa1bbcc73a941bb0","6b2bb67b0942bcfce93e1d6fad5f70afd54940a2b13df7f311201fba54b2cbe9","dd3706b25d06fe23c73d16079e8c66ac775831ef419da00716bf2aee530a04a4","1298327149e93a60c24a3b5db6048f7cc8fd4e3259e91d05fc44306a04b1b873","d67e08745494b000da9410c1ae2fdc9965fc6d593fe0f381a47491f75417d457","b40652bf8ce4a18133b31349086523b219724dca8df3448c1a0742528e7ad5b9","3181290a158e54a78c1a57c41791ec1cbdc860ae565916daa1bf4e425b7edac7","a77fdb357c78b70142b2fdbbfb72958d69e8f765fd2a3c69946c1018e89d4638","3c2ac350c3baa61fd2b1925844109e098f4376d0768a4643abc82754fd752748","826d48e49c905cedb906cbde6ccaf758827ff5867d4daa006b5a79e0fb489357","5ef157fbb39494a581bd24f21b60488fe248d452c479738b5e41b48720ea69b8","289be113bad7ee27ee7fa5b1e373c964c9789a5e9ed7db5ddcb631371120b953","a1136cf18dbe1b9b600c65538fd48609a1a4772d115a0c1d775839fe6544487c","24638ed25631a94a9b0d7b580b146329f82e158e8d1e90171a73d87bebf79255","638f49a0db5d30977533a8cfabf3e10ab30724360424698e8d5fd41ca272e070","d44028ae0127eb3e9fcfa5f55a8b81d64775ce15aca1020fe25c511bbb055834",{"version":"2708349d5a11a5c2e5f3a0765259ebe7ee00cdcc8161cb9990cb4910328442a1","affectsGlobalScope":true},"4e0a4d84b15692ea8669fe4f3d05a4f204567906b1347da7a58b75f45bae48d3","0f04bc8950ad634ac8ac70f704f200ef06f8852af9017f97c446de4def5b3546","d0c575d48d6dad75648017ff18762eb97f9398cc9486541b3070e79ce12719e6","d20072cb51d8baad944bedd935a25c7f10c29744e9a648d2c72c215337356077","35cbbc58882d2c158032d7f24ba8953d7e1caeb8cb98918d85819496109f55d2","8d01c38ccb9af3a4035a68818799e5ef32ccc8cf70bdb83e181e1921d7ad32f6","1d1e6bd176eee5970968423d7e215bfd66828b6db8d54d17afec05a831322633","393137c76bd922ba70a2f8bf1ade4f59a16171a02fb25918c168d48875b0cfb0","6767cce098e1e6369c26258b7a1f9e569c5467d501a47a090136d5ea6e80ae6d","6503fb6addf62f9b10f8564d9869ad824565a914ec1ac3dd7d13da14a3f57036","3594c022901a1c8993b0f78a3f534cfb81e7b619ed215348f7f6882f3db02abc","438284c7c455a29b9c0e2d1e72abc62ee93d9a163029ffe918a34c5db3b92da2","0c75b204aed9cf6ff1c7b4bed87a3ece0d9d6fc857a6350c0c95ed0c38c814e8","187119ff4f9553676a884e296089e131e8cc01691c546273b1d0089c3533ce42","c9f396e71966bd3a890d8a36a6a497dbf260e9b868158ea7824d4b5421210afe","509235563ea2b939e1bbe92aae17e71e6a82ceab8f568b45fb4fce7d72523a32","9364c7566b0be2f7b70ff5285eb34686f83ccb01bda529b82d23b2a844653bfb","00baffbe8a2f2e4875367479489b5d43b5fc1429ecb4a4cc98cfc3009095f52a","c311349ec71bb69399ffc4092853e7d8a86c1ca39ddb4cd129e775c19d985793","3c92b6dfd43cc1c2485d9eba5ff0b74a19bb8725b692773ef1d66dac48cda4bd","4908e4c00832b26ce77a629de8501b0e23a903c094f9e79a7fec313a15da796a","2630a7cbb597e85d713b7ef47f2946d4280d3d4c02733282770741d40672b1a5",{"version":"0714e2046df66c0e93c3330d30dbc0565b3e8cd3ee302cf99e4ede6220e5fec8","affectsGlobalScope":true},"f313731860257325f13351575f381fef333d4dfe30daf5a2e72f894208feea08","951b37f7d86f6012f09e6b35f1de57c69d75f16908cb0adaa56b93675ea0b853","3816fc03ffd9cbd1a7a3362a264756a4a1d547caabea50ca68303046be40e376","0c417b4ec46b88fb62a43ec00204700b560d01eb5677c7faa8ecd34610f096a8","13d29cdeb64e8496424edf42749bbb47de5e42d201cf958911a4638cbcffbd3f","0f9e381eecc5860f693c31fe463b3ca20a64ca9b8db0cf6208cd4a053f064809","95902d5561c6aac5dfc40568a12b0aca324037749dcd32a81f23423bfde69bab","5dfb2aca4136abdc5a2740f14be8134a6e6b66fd53470bb2e954e40f8abfaf3e","577463167dd69bd81f76697dfc3f7b22b77a6152f60a602a9218e52e3183ad67","b8396e9024d554b611cbe31a024b176ba7116063d19354b5a02dccd8f0118989","4b28e1c5bf88d891e07a1403358b81a51b3ba2eae1ffada51cca7476b5ac6407","7150ad575d28bf98fae321a1c0f10ad17b127927811f488ded6ff1d88d4244e5","8b155c4757d197969553de3762c8d23d5866710301de41e1b66b97c9ed867003","93733466609dd8bf72eace502a24ca7574bd073d934216e628f1b615c8d3cb3c","45e9228761aabcadb79c82fb3008523db334491525bdb8e74e0f26eaf7a4f7f4","aeacac2778c9821512b6b889da79ac31606a863610c8f28da1e483579627bf90","569fdb354062fc098a6a3ba93a029edf22d6fe480cf72b231b3c07832b2e7c97","bf9876e62fb7f4237deafab8c7444770ef6e82b4cad2d5dc768664ff340feeb2","6cf60e76d37faf0fbc2f80a873eab0fd545f6b1bf300e7f0823f956ddb3083e9","6adaa6103086f931e3eee20f0987e86e8879e9d13aa6bd6075ccfc58b9c5681c","ee0af0f2b8d3b4d0baf669f2ff6fcef4a8816a473c894cc7c905029f7505fed0","3602dfff3072caea42f23a9b63fb34a7b0c95a62b93ce2add5fe6b159447845e","c9ad058b2cc9ce6dc2ed92960d6d009e8c04bef46d3f5312283debca6869f613","2b8264b2fefd7367e0f20e2c04eed5d3038831fe00f5efbc110ff0131aab899b","8a19491eba2108d5c333c249699f40aff05ad312c04a17504573b27d91f0aede","2b93035328f7778d200252681c1d86285d501ed424825a18f81e4c3028aa51d9","2ac9c8332c5f8510b8bdd571f8271e0f39b0577714d5e95c1e79a12b2616f069","42c21aa963e7b86fa00801d96e88b36803188018d5ad91db2a9101bccd40b3ff","d31eb848cdebb4c55b4893b335a7c0cca95ad66dee13cbb7d0893810c0a9c301","77c1d91a129ba60b8c405f9f539e42df834afb174fe0785f89d92a2c7c16b77a","7a9e0a564fee396cacf706523b5aeed96e04c6b871a8bebefad78499fbffc5bc","906c751ef5822ec0dadcea2f0e9db64a33fb4ee926cc9f7efa38afe5d5371b2a","5387c049e9702f2d2d7ece1a74836a14b47fbebe9bbeb19f94c580a37c855351","c68391fb9efad5d99ff332c65b1606248c4e4a9f1dd9a087204242b56c7126d6","e9cf02252d3a0ced987d24845dcb1f11c1be5541f17e5daa44c6de2d18138d0c","e8b02b879754d85f48489294f99147aeccc352c760d95a6fe2b6e49cd400b2fe","9f6908ab3d8a86c68b86e38578afc7095114e66b2fc36a2a96e9252aac3998e0","0eedb2344442b143ddcd788f87096961cd8572b64f10b4afc3356aa0460171c6","71405cc70f183d029cc5018375f6c35117ffdaf11846c35ebf85ee3956b1b2a6","c68baff4d8ba346130e9753cefe2e487a16731bf17e05fdacc81e8c9a26aae9d","2cd15528d8bb5d0453aa339b4b52e0696e8b07e790c153831c642c3dea5ac8af","479d622e66283ffa9883fbc33e441f7fc928b2277ff30aacbec7b7761b4e9579","ade307876dc5ca267ca308d09e737b611505e015c535863f22420a11fffc1c54","f8cdefa3e0dee639eccbe9794b46f90291e5fd3989fcba60d2f08fde56179fb9","86c5a62f99aac7053976e317dbe9acb2eaf903aaf3d2e5bb1cafe5c2df7b37a8","2b300954ce01a8343866f737656e13243e86e5baef51bd0631b21dcef1f6e954","a2d409a9ffd872d6b9d78ead00baa116bbc73cfa959fce9a2f29d3227876b2a1","b288936f560cd71f4a6002953290de9ff8dfbfbf37f5a9391be5c83322324898","61178a781ef82e0ff54f9430397e71e8f365fc1e3725e0e5346f2de7b0d50dfa","6a6ccb37feb3aad32d9be026a3337db195979cd5727a616fc0f557e974101a54","c649ea79205c029a02272ef55b7ab14ada0903db26144d2205021f24727ac7a3","38e2b02897c6357bbcff729ef84c736727b45cc152abe95a7567caccdfad2a1d","d6610ea7e0b1a7686dba062a1e5544dd7d34140f4545305b7c6afaebfb348341","3dee35db743bdba2c8d19aece7ac049bde6fa587e195d86547c882784e6ba34c","b15e55c5fa977c2f25ca0b1db52cfa2d1fd4bf0baf90a8b90d4a7678ca462ff1","f41d30972724714763a2698ae949fbc463afb203b5fa7c4ad7e4de0871129a17","843dd7b6a7c6269fd43827303f5cbe65c1fecabc30b4670a50d5a15d57daeeb9","f06d8b8567ee9fd799bf7f806efe93b67683ef24f4dea5b23ef12edff4434d9d","6017384f697ff38bc3ef6a546df5b230c3c31329db84cbfe686c83bec011e2b2","e1a5b30d9248549ca0c0bb1d653bafae20c64c4aa5928cc4cd3017b55c2177b0","a593632d5878f17295bd53e1c77f27bf4c15212822f764a2bfc1702f4b413fa0","a868a534ba1c2ca9060b8a13b0ffbbbf78b4be7b0ff80d8c75b02773f7192c29","da7545aba8f54a50fde23e2ede00158dc8112560d934cee58098dfb03aae9b9d","34baf65cfee92f110d6653322e2120c2d368ee64b3c7981dff08ed105c4f19b0","6aee496bf0ecfbf6731aa8cca32f4b6e92cdc0a444911a7d88410408a45ecc5d","67fc055eb86a0632e2e072838f889ffe1754083cb13c8c80a06a7d895d877aae","67d3e19b3b6e2c082ffd11ae5064c7a81b13d151326953b90fc26103067a1945","d558a0fe921ebcc88d3212c2c42108abf9f0d694d67ebdeba37d7728c044f579","2887592574fcdfd087647c539dcb0fbe5af2521270dad4a37f9d17c16190d579","9d74c7330800b325bb19cc8c1a153a612c080a60094e1ab6cfb6e39cf1b88c36","b90c59ac4682368a01c83881b814738eb151de8a58f52eb7edadea2bcffb11b9","8560a87b2e9f8e2c3808c8f6172c9b7eb6c9b08cb9f937db71c285ecf292c81d","ffe3931ff864f28d80ae2f33bd11123ad3d7bad9896b910a1e61504cc093e1f5","083c1bd82f8dc3a1ed6fc9e8eaddf141f7c05df418eca386598821e045253af9","274ebe605bd7f71ce161f9f5328febc7d547a2929f803f04b44ec4a7d8729517","6ca0207e70d985a24396583f55836b10dc181063ab6069733561bfde404d1bad","5908142efeaab38ffdf43927ee0af681ae77e0d7672b956dfb8b6c705dbfe106","f772b188b943549b5c5eb803133314b8aa7689eced80eed0b70e2f30ca07ab9c","0026b816ef05cfbf290e8585820eef0f13250438669107dfc44482bac007b14f","05d64cc1118031b29786632a9a0f6d7cf1dcacb303f27023a466cf3cdc860538","e0fff9119e1a5d2fdd46345734126cd6cb99c2d98a9debf0257047fe3937cc3f","d84398556ba4595ee6be554671da142cfe964cbdebb2f0c517a10f76f2b016c0","e275297155ec3251200abbb334c7f5641fecc68b2a9573e40eed50dff7584762"],"options":{"composite":true,"declaration":true,"module":99,"noFallthroughCasesInSwitch":true,"noImplicitReturns":true,"noUnusedLocals":true,"noUnusedParameters":true,"outDir":"./","preserveConstEnums":true,"rootDir":"./src","strict":true,"target":4,"tsBuildInfoFile":"./tsconfig.tsbuildinfo"},"fileIdsList":[[72],[72,73,74,75,76],[72,74],[82,83],[80,81,82],[97,131],[96,131,133],[137,139,140,141,142,143,144,145,146,147,148,149],[137,138,140,141,142,143,144,145,146,147,148,149],[138,139,140,141,142,143,144,145,146,147,148,149],[137,138,139,141,142,143,144,145,146,147,148,149],[137,138,139,140,142,143,144,145,146,147,148,149],[137,138,139,140,141,143,144,145,146,147,148,149],[137,138,139,140,141,142,144,145,146,147,148,149],[137,138,139,140,141,142,143,145,146,147,148,149],[137,138,139,140,141,142,143,144,146,147,148,149],[137,138,139,140,141,142,143,144,145,147,148,149],[137,138,139,140,141,142,143,144,145,146,148,149],[137,138,139,140,141,142,143,144,145,146,147,149],[137,138,139,140,141,142,143,144,145,146,147,148],[169],[154],[158,159,160],[157],[159],[136,155,156,161,164,166,167,168],[156,162,163,169],[162,165],[156,157,162,169],[156,169],[150,151,152,153],[128,129],[96,97,104,113],[88,96,104],[120],[92,97,105],[113],[94,96,104],[96],[96,98,113,119],[97],[104,113,119],[96,97,99,104,113,116,119],[96,99,116,119],[130],[119],[94,96,113],[86],[118],[96,113],[111,120,122],[92,94,104,113],[85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124],[125,126,127],[104],[110],[96,98,113,119,122],[131],[175,214],[175,199,214],[214],[175],[175,200,214],[175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213],[200,214],[218],[131,221,222,223,224,225,226,227,228,229,230,231],[220,221,230],[221,230],[215,220,221,230],[220,221,222,223,224,225,226,227,228,229,231],[221],[92,220,230],[32],[32,52],[42,52,59,61],[34,35,63],[52],[42,50,51,53,59,60,62,64,65,66,67,68,69],[42,52],[42,62,68],[32,33,34,35,36,37,40,42,43,44,45,46,47,50],[32,51,52],[32,35,42,49,51,56,58],[32,34,35,36,39,40,48,49],[36,42],[42,57],[42,52,58],[51],[32,51],[35],[32,55,56],[32,55],[32,39],[32,40],[42],[32,40,42],[42,51,56],[32,39,40]],"referencedMap":[[74,1],[77,2],[73,1],[75,3],[76,1],[84,4],[83,5],[132,6],[134,7],[138,8],[139,9],[137,10],[140,11],[141,12],[142,13],[143,14],[144,15],[145,16],[146,17],[147,18],[148,19],[149,20],[170,21],[155,22],[161,23],[158,24],[160,25],[169,26],[164,27],[166,28],[167,29],[168,30],[163,30],[165,30],[157,30],[153,22],[154,31],[152,22],[130,32],[88,33],[89,34],[90,35],[91,36],[92,37],[93,38],[95,39],[97,40],[98,41],[99,42],[100,43],[101,44],[131,45],[102,39],[103,46],[104,47],[107,48],[108,49],[111,50],[112,51],[113,39],[116,52],[125,53],[128,54],[118,55],[119,56],[121,37],[123,57],[124,37],[174,58],[199,59],[200,60],[175,61],[178,61],[197,59],[198,59],[188,59],[187,62],[185,59],[180,59],[193,59],[191,59],[195,59],[179,59],[192,59],[196,59],[181,59],[182,59],[194,59],[176,59],[183,59],[184,59],[186,59],[190,59],[201,63],[189,59],[177,59],[214,64],[208,63],[210,65],[209,63],[202,63],[203,63],[205,63],[207,63],[211,65],[212,65],[204,65],[206,65],[219,66],[232,67],[231,68],[222,69],[223,70],[230,71],[224,70],[225,69],[226,69],[227,69],[228,72],[221,73],[229,68],[33,74],[36,74],[60,75],[62,76],[64,77],[65,75],[66,78],[70,79],[67,78],[68,80],[69,81],[51,82],[53,83],[59,84],[50,85],[43,86],[58,87],[71,88],[52,89],[45,90],[44,74],[46,91],[47,91],[61,92],[56,93],[40,94],[39,95]],"exportedModulesMap":[[74,1],[77,2],[73,1],[75,3],[76,1],[84,4],[83,5],[132,6],[134,7],[138,8],[139,9],[137,10],[140,11],[141,12],[142,13],[143,14],[144,15],[145,16],[146,17],[147,18],[148,19],[149,20],[170,21],[155,22],[161,23],[158,24],[160,25],[169,26],[164,27],[166,28],[167,29],[168,30],[163,30],[165,30],[157,30],[153,22],[154,31],[152,22],[130,32],[88,33],[89,34],[90,35],[91,36],[92,37],[93,38],[95,39],[97,40],[98,41],[99,42],[100,43],[101,44],[131,45],[102,39],[103,46],[104,47],[107,48],[108,49],[111,50],[112,51],[113,39],[116,52],[125,53],[128,54],[118,55],[119,56],[121,37],[123,57],[124,37],[174,58],[199,59],[200,60],[175,61],[178,61],[197,59],[198,59],[188,59],[187,62],[185,59],[180,59],[193,59],[191,59],[195,59],[179,59],[192,59],[196,59],[181,59],[182,59],[194,59],[176,59],[183,59],[184,59],[186,59],[190,59],[201,63],[189,59],[177,59],[214,64],[208,63],[210,65],[209,63],[202,63],[203,63],[205,63],[207,63],[211,65],[212,65],[204,65],[206,65],[219,66],[232,67],[231,68],[222,69],[223,70],[230,71],[224,70],[225,69],[226,69],[227,69],[228,72],[221,73],[229,68],[33,74],[36,74],[60,74],[62,96],[65,74],[70,79],[68,96],[69,96],[51,97],[53,90],[59,98],[50,99],[43,96],[58,96],[71,96],[52,89],[45,90],[44,74],[61,92],[56,93],[40,94],[39,95]],"semanticDiagnosticsPerFile":[30,74,72,77,73,78,75,76,79,84,80,83,82,132,134,135,81,136,138,139,137,140,141,142,143,144,145,146,147,148,149,170,155,161,159,158,160,169,164,166,167,168,162,163,165,157,156,151,150,153,154,152,133,171,129,86,130,87,88,89,90,91,92,93,94,95,96,97,98,85,126,99,100,101,131,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,125,128,118,119,120,121,122,127,123,124,172,173,174,199,200,175,178,197,198,188,187,185,180,193,191,195,179,192,196,181,182,194,176,183,184,186,190,201,189,177,214,213,208,210,209,202,203,205,207,211,212,204,206,215,216,217,219,218,232,231,222,223,230,224,225,226,227,228,221,229,220,8,7,2,9,10,11,12,13,14,15,16,3,4,20,17,18,19,21,22,23,5,24,25,26,27,28,1,29,6,33,34,49,35,37,36,31,48,32,42,41,60,62,64,65,66,70,67,68,69,51,53,59,50,43,63,58,71,52,45,44,46,47,57,54,61,56,55,38,40,39],"latestChangedDtsFile":"./utils/getCacheKeyForURL.d.ts"},"version":"4.9.5"}
Index: frontend/node_modules/workbox-precaching/utils/PrecacheCacheKeyPlugin.d.ts
===================================================================
--- frontend/node_modules/workbox-precaching/utils/PrecacheCacheKeyPlugin.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/PrecacheCacheKeyPlugin.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,17 @@
+import { WorkboxPlugin } from 'workbox-core/types.js';
+import { PrecacheController } from '../PrecacheController.js';
+import '../_version.js';
+/**
+ * A plugin, designed to be used with PrecacheController, to translate URLs into
+ * the corresponding cache key, based on the current revision info.
+ *
+ * @private
+ */
+declare class PrecacheCacheKeyPlugin implements WorkboxPlugin {
+    private readonly _precacheController;
+    constructor({ precacheController }: {
+        precacheController: PrecacheController;
+    });
+    cacheKeyWillBeUsed: WorkboxPlugin['cacheKeyWillBeUsed'];
+}
+export { PrecacheCacheKeyPlugin };
Index: frontend/node_modules/workbox-precaching/utils/PrecacheCacheKeyPlugin.js
===================================================================
--- frontend/node_modules/workbox-precaching/utils/PrecacheCacheKeyPlugin.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/PrecacheCacheKeyPlugin.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,30 @@
+/*
+  Copyright 2020 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.
+*/
+import '../_version.js';
+/**
+ * A plugin, designed to be used with PrecacheController, to translate URLs into
+ * the corresponding cache key, based on the current revision info.
+ *
+ * @private
+ */
+class PrecacheCacheKeyPlugin {
+    constructor({ precacheController }) {
+        this.cacheKeyWillBeUsed = async ({ request, params, }) => {
+            // Params is type any, can't change right now.
+            /* eslint-disable */
+            const cacheKey = (params === null || params === void 0 ? void 0 : params.cacheKey) ||
+                this._precacheController.getCacheKeyForURL(request.url);
+            /* eslint-enable */
+            return cacheKey
+                ? new Request(cacheKey, { headers: request.headers })
+                : request;
+        };
+        this._precacheController = precacheController;
+    }
+}
+export { PrecacheCacheKeyPlugin };
Index: frontend/node_modules/workbox-precaching/utils/PrecacheCacheKeyPlugin.mjs
===================================================================
--- frontend/node_modules/workbox-precaching/utils/PrecacheCacheKeyPlugin.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/PrecacheCacheKeyPlugin.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export * from './PrecacheCacheKeyPlugin.js';
Index: frontend/node_modules/workbox-precaching/utils/PrecacheInstallReportPlugin.d.ts
===================================================================
--- frontend/node_modules/workbox-precaching/utils/PrecacheInstallReportPlugin.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/PrecacheInstallReportPlugin.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,15 @@
+import { WorkboxPlugin } from 'workbox-core/types.js';
+import '../_version.js';
+/**
+ * A plugin, designed to be used with PrecacheController, to determine the
+ * of assets that were updated (or not updated) during the install event.
+ *
+ * @private
+ */
+declare class PrecacheInstallReportPlugin implements WorkboxPlugin {
+    updatedURLs: string[];
+    notUpdatedURLs: string[];
+    handlerWillStart: WorkboxPlugin['handlerWillStart'];
+    cachedResponseWillBeUsed: WorkboxPlugin['cachedResponseWillBeUsed'];
+}
+export { PrecacheInstallReportPlugin };
Index: frontend/node_modules/workbox-precaching/utils/PrecacheInstallReportPlugin.js
===================================================================
--- frontend/node_modules/workbox-precaching/utils/PrecacheInstallReportPlugin.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/PrecacheInstallReportPlugin.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,44 @@
+/*
+  Copyright 2020 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.
+*/
+import '../_version.js';
+/**
+ * A plugin, designed to be used with PrecacheController, to determine the
+ * of assets that were updated (or not updated) during the install event.
+ *
+ * @private
+ */
+class PrecacheInstallReportPlugin {
+    constructor() {
+        this.updatedURLs = [];
+        this.notUpdatedURLs = [];
+        this.handlerWillStart = async ({ request, state, }) => {
+            // TODO: `state` should never be undefined...
+            if (state) {
+                state.originalRequest = request;
+            }
+        };
+        this.cachedResponseWillBeUsed = async ({ event, state, cachedResponse, }) => {
+            if (event.type === 'install') {
+                if (state &&
+                    state.originalRequest &&
+                    state.originalRequest instanceof Request) {
+                    // TODO: `state` should never be undefined...
+                    const url = state.originalRequest.url;
+                    if (cachedResponse) {
+                        this.notUpdatedURLs.push(url);
+                    }
+                    else {
+                        this.updatedURLs.push(url);
+                    }
+                }
+            }
+            return cachedResponse;
+        };
+    }
+}
+export { PrecacheInstallReportPlugin };
Index: frontend/node_modules/workbox-precaching/utils/PrecacheInstallReportPlugin.mjs
===================================================================
--- frontend/node_modules/workbox-precaching/utils/PrecacheInstallReportPlugin.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/PrecacheInstallReportPlugin.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export * from './PrecacheInstallReportPlugin.js';
Index: frontend/node_modules/workbox-precaching/utils/createCacheKey.d.ts
===================================================================
--- frontend/node_modules/workbox-precaching/utils/createCacheKey.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/createCacheKey.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,17 @@
+import { PrecacheEntry } from '../_types.js';
+import '../_version.js';
+interface CacheKey {
+    cacheKey: string;
+    url: string;
+}
+/**
+ * Converts a manifest entry into a versioned URL suitable for precaching.
+ *
+ * @param {Object|string} entry
+ * @return {string} A URL with versioning info.
+ *
+ * @private
+ * @memberof workbox-precaching
+ */
+export declare function createCacheKey(entry: PrecacheEntry | string): CacheKey;
+export {};
Index: frontend/node_modules/workbox-precaching/utils/createCacheKey.js
===================================================================
--- frontend/node_modules/workbox-precaching/utils/createCacheKey.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/createCacheKey.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,56 @@
+/*
+  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.
+*/
+import { WorkboxError } from 'workbox-core/_private/WorkboxError.js';
+import '../_version.js';
+// Name of the search parameter used to store revision info.
+const REVISION_SEARCH_PARAM = '__WB_REVISION__';
+/**
+ * Converts a manifest entry into a versioned URL suitable for precaching.
+ *
+ * @param {Object|string} entry
+ * @return {string} A URL with versioning info.
+ *
+ * @private
+ * @memberof workbox-precaching
+ */
+export function createCacheKey(entry) {
+    if (!entry) {
+        throw new 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.href);
+        return {
+            cacheKey: urlObject.href,
+            url: urlObject.href,
+        };
+    }
+    const { revision, url } = entry;
+    if (!url) {
+        throw new 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.href);
+        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 cacheKeyURL = new URL(url, location.href);
+    const originalURL = new URL(url, location.href);
+    cacheKeyURL.searchParams.set(REVISION_SEARCH_PARAM, revision);
+    return {
+        cacheKey: cacheKeyURL.href,
+        url: originalURL.href,
+    };
+}
Index: frontend/node_modules/workbox-precaching/utils/createCacheKey.mjs
===================================================================
--- frontend/node_modules/workbox-precaching/utils/createCacheKey.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/createCacheKey.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export * from './createCacheKey.js';
Index: frontend/node_modules/workbox-precaching/utils/deleteOutdatedCaches.d.ts
===================================================================
--- frontend/node_modules/workbox-precaching/utils/deleteOutdatedCaches.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/deleteOutdatedCaches.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,21 @@
+import '../_version.js';
+/**
+ * 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<string>} A list of all the cache names that were deleted.
+ *
+ * @private
+ * @memberof workbox-precaching
+ */
+declare const deleteOutdatedCaches: (currentPrecacheName: string, substringToFind?: string) => Promise<string[]>;
+export { deleteOutdatedCaches };
Index: frontend/node_modules/workbox-precaching/utils/deleteOutdatedCaches.js
===================================================================
--- frontend/node_modules/workbox-precaching/utils/deleteOutdatedCaches.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/deleteOutdatedCaches.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,38 @@
+/*
+  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.
+*/
+import '../_version.js';
+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<string>} A list of all the cache names that were deleted.
+ *
+ * @private
+ * @memberof workbox-precaching
+ */
+const deleteOutdatedCaches = async (currentPrecacheName, substringToFind = SUBSTRING_TO_FIND) => {
+    const cacheNames = await self.caches.keys();
+    const cacheNamesToDelete = cacheNames.filter((cacheName) => {
+        return (cacheName.includes(substringToFind) &&
+            cacheName.includes(self.registration.scope) &&
+            cacheName !== currentPrecacheName);
+    });
+    await Promise.all(cacheNamesToDelete.map((cacheName) => self.caches.delete(cacheName)));
+    return cacheNamesToDelete;
+};
+export { deleteOutdatedCaches };
Index: frontend/node_modules/workbox-precaching/utils/deleteOutdatedCaches.mjs
===================================================================
--- frontend/node_modules/workbox-precaching/utils/deleteOutdatedCaches.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/deleteOutdatedCaches.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export * from './deleteOutdatedCaches.js';
Index: frontend/node_modules/workbox-precaching/utils/generateURLVariations.d.ts
===================================================================
--- frontend/node_modules/workbox-precaching/utils/generateURLVariations.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/generateURLVariations.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,13 @@
+import { PrecacheRouteOptions } from '../_types.js';
+import '../_version.js';
+/**
+ * Generator function that yields possible variations on the original URL to
+ * check, one at a time.
+ *
+ * @param {string} url
+ * @param {Object} options
+ *
+ * @private
+ * @memberof workbox-precaching
+ */
+export declare function generateURLVariations(url: string, { ignoreURLParametersMatching, directoryIndex, cleanURLs, urlManipulation, }?: PrecacheRouteOptions): Generator<string, void, unknown>;
Index: frontend/node_modules/workbox-precaching/utils/generateURLVariations.js
===================================================================
--- frontend/node_modules/workbox-precaching/utils/generateURLVariations.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/generateURLVariations.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,42 @@
+/*
+  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.
+*/
+import { removeIgnoredSearchParams } from './removeIgnoredSearchParams.js';
+import '../_version.js';
+/**
+ * Generator function that yields possible variations on the original URL to
+ * check, one at a time.
+ *
+ * @param {string} url
+ * @param {Object} options
+ *
+ * @private
+ * @memberof workbox-precaching
+ */
+export function* generateURLVariations(url, { ignoreURLParametersMatching = [/^utm_/, /^fbclid$/], directoryIndex = 'index.html', cleanURLs = true, urlManipulation, } = {}) {
+    const urlObject = new URL(url, location.href);
+    urlObject.hash = '';
+    yield urlObject.href;
+    const urlWithoutIgnoredParams = removeIgnoredSearchParams(urlObject, ignoreURLParametersMatching);
+    yield urlWithoutIgnoredParams.href;
+    if (directoryIndex && urlWithoutIgnoredParams.pathname.endsWith('/')) {
+        const directoryURL = new URL(urlWithoutIgnoredParams.href);
+        directoryURL.pathname += directoryIndex;
+        yield directoryURL.href;
+    }
+    if (cleanURLs) {
+        const cleanURL = new URL(urlWithoutIgnoredParams.href);
+        cleanURL.pathname += '.html';
+        yield cleanURL.href;
+    }
+    if (urlManipulation) {
+        const additionalURLs = urlManipulation({ url: urlObject });
+        for (const urlToAttempt of additionalURLs) {
+            yield urlToAttempt.href;
+        }
+    }
+}
Index: frontend/node_modules/workbox-precaching/utils/generateURLVariations.mjs
===================================================================
--- frontend/node_modules/workbox-precaching/utils/generateURLVariations.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/generateURLVariations.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export * from './generateURLVariations.js';
Index: frontend/node_modules/workbox-precaching/utils/getCacheKeyForURL.d.ts
===================================================================
--- frontend/node_modules/workbox-precaching/utils/getCacheKeyForURL.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/getCacheKeyForURL.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,14 @@
+import { PrecacheRouteOptions } from '../_types.js';
+import '../_version.js';
+/**
+ * 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
+ */
+export declare const getCacheKeyForURL: (url: string, options: PrecacheRouteOptions) => string | void;
Index: frontend/node_modules/workbox-precaching/utils/getCacheKeyForURL.js
===================================================================
--- frontend/node_modules/workbox-precaching/utils/getCacheKeyForURL.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/getCacheKeyForURL.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,31 @@
+/*
+  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.
+*/
+import { getOrCreatePrecacheController } from './getOrCreatePrecacheController.js';
+import { generateURLVariations } from './generateURLVariations.js';
+import '../_version.js';
+/**
+ * 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
+ */
+export 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;
+        }
+    }
+};
Index: frontend/node_modules/workbox-precaching/utils/getCacheKeyForURL.mjs
===================================================================
--- frontend/node_modules/workbox-precaching/utils/getCacheKeyForURL.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/getCacheKeyForURL.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export * from './getCacheKeyForURL.js';
Index: frontend/node_modules/workbox-precaching/utils/getOrCreatePrecacheController.d.ts
===================================================================
--- frontend/node_modules/workbox-precaching/utils/getOrCreatePrecacheController.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/getOrCreatePrecacheController.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,7 @@
+import { PrecacheController } from '../PrecacheController.js';
+import '../_version.js';
+/**
+ * @return {PrecacheController}
+ * @private
+ */
+export declare const getOrCreatePrecacheController: () => PrecacheController;
Index: frontend/node_modules/workbox-precaching/utils/getOrCreatePrecacheController.js
===================================================================
--- frontend/node_modules/workbox-precaching/utils/getOrCreatePrecacheController.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/getOrCreatePrecacheController.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,20 @@
+/*
+  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.
+*/
+import { PrecacheController } from '../PrecacheController.js';
+import '../_version.js';
+let precacheController;
+/**
+ * @return {PrecacheController}
+ * @private
+ */
+export const getOrCreatePrecacheController = () => {
+    if (!precacheController) {
+        precacheController = new PrecacheController();
+    }
+    return precacheController;
+};
Index: frontend/node_modules/workbox-precaching/utils/getOrCreatePrecacheController.mjs
===================================================================
--- frontend/node_modules/workbox-precaching/utils/getOrCreatePrecacheController.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/getOrCreatePrecacheController.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export * from './getOrCreatePrecacheController.js';
Index: frontend/node_modules/workbox-precaching/utils/printCleanupDetails.d.ts
===================================================================
--- frontend/node_modules/workbox-precaching/utils/printCleanupDetails.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/printCleanupDetails.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,8 @@
+import '../_version.js';
+/**
+ * @param {Array<string>} deletedURLs
+ *
+ * @private
+ * @memberof workbox-precaching
+ */
+export declare function printCleanupDetails(deletedURLs: string[]): void;
Index: frontend/node_modules/workbox-precaching/utils/printCleanupDetails.js
===================================================================
--- frontend/node_modules/workbox-precaching/utils/printCleanupDetails.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/printCleanupDetails.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,38 @@
+/*
+  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.
+*/
+import { logger } from 'workbox-core/_private/logger.js';
+import '../_version.js';
+/**
+ * @param {string} groupTitle
+ * @param {Array<string>} deletedURLs
+ *
+ * @private
+ */
+const logGroup = (groupTitle, deletedURLs) => {
+    logger.groupCollapsed(groupTitle);
+    for (const url of deletedURLs) {
+        logger.log(url);
+    }
+    logger.groupEnd();
+};
+/**
+ * @param {Array<string>} deletedURLs
+ *
+ * @private
+ * @memberof workbox-precaching
+ */
+export function printCleanupDetails(deletedURLs) {
+    const deletionCount = deletedURLs.length;
+    if (deletionCount > 0) {
+        logger.groupCollapsed(`During precaching cleanup, ` +
+            `${deletionCount} cached ` +
+            `request${deletionCount === 1 ? ' was' : 's were'} deleted.`);
+        logGroup('Deleted Cache Requests', deletedURLs);
+        logger.groupEnd();
+    }
+}
Index: frontend/node_modules/workbox-precaching/utils/printCleanupDetails.mjs
===================================================================
--- frontend/node_modules/workbox-precaching/utils/printCleanupDetails.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/printCleanupDetails.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export * from './printCleanupDetails.js';
Index: frontend/node_modules/workbox-precaching/utils/printInstallDetails.d.ts
===================================================================
--- frontend/node_modules/workbox-precaching/utils/printInstallDetails.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/printInstallDetails.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+import '../_version.js';
+/**
+ * @param {Array<string>} urlsToPrecache
+ * @param {Array<string>} urlsAlreadyPrecached
+ *
+ * @private
+ * @memberof workbox-precaching
+ */
+export declare function printInstallDetails(urlsToPrecache: string[], urlsAlreadyPrecached: string[]): void;
Index: frontend/node_modules/workbox-precaching/utils/printInstallDetails.js
===================================================================
--- frontend/node_modules/workbox-precaching/utils/printInstallDetails.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/printInstallDetails.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,48 @@
+/*
+  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.
+*/
+import { logger } from 'workbox-core/_private/logger.js';
+import '../_version.js';
+/**
+ * @param {string} groupTitle
+ * @param {Array<string>} urls
+ *
+ * @private
+ */
+function _nestedGroup(groupTitle, urls) {
+    if (urls.length === 0) {
+        return;
+    }
+    logger.groupCollapsed(groupTitle);
+    for (const url of urls) {
+        logger.log(url);
+    }
+    logger.groupEnd();
+}
+/**
+ * @param {Array<string>} urlsToPrecache
+ * @param {Array<string>} urlsAlreadyPrecached
+ *
+ * @private
+ * @memberof workbox-precaching
+ */
+export 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.groupCollapsed(message);
+        _nestedGroup(`View newly precached URLs.`, urlsToPrecache);
+        _nestedGroup(`View previously precached URLs.`, urlsAlreadyPrecached);
+        logger.groupEnd();
+    }
+}
Index: frontend/node_modules/workbox-precaching/utils/printInstallDetails.mjs
===================================================================
--- frontend/node_modules/workbox-precaching/utils/printInstallDetails.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/printInstallDetails.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export * from './printInstallDetails.js';
Index: frontend/node_modules/workbox-precaching/utils/removeIgnoredSearchParams.d.ts
===================================================================
--- frontend/node_modules/workbox-precaching/utils/removeIgnoredSearchParams.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/removeIgnoredSearchParams.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,14 @@
+import '../_version.js';
+/**
+ * Removes any URL search parameters that should be ignored.
+ *
+ * @param {URL} urlObject The original URL.
+ * @param {Array<RegExp>} 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 workbox-precaching
+ */
+export declare function removeIgnoredSearchParams(urlObject: URL, ignoreURLParametersMatching?: RegExp[]): URL;
Index: frontend/node_modules/workbox-precaching/utils/removeIgnoredSearchParams.js
===================================================================
--- frontend/node_modules/workbox-precaching/utils/removeIgnoredSearchParams.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/removeIgnoredSearchParams.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,30 @@
+/*
+  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.
+*/
+import '../_version.js';
+/**
+ * Removes any URL search parameters that should be ignored.
+ *
+ * @param {URL} urlObject The original URL.
+ * @param {Array<RegExp>} 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 workbox-precaching
+ */
+export 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;
+}
Index: frontend/node_modules/workbox-precaching/utils/removeIgnoredSearchParams.mjs
===================================================================
--- frontend/node_modules/workbox-precaching/utils/removeIgnoredSearchParams.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/workbox-precaching/utils/removeIgnoredSearchParams.mjs	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export * from './removeIgnoredSearchParams.js';
