@givefreely/adunit 1.17.8-dev.0 → 1.17.8-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/GiveFreely-background.cjs.js +1 -1
- package/GiveFreely-background.cjs.js.map +1 -1
- package/GiveFreely-background.esm.js +1 -1
- package/GiveFreely-background.esm.js.map +1 -1
- package/GiveFreely-content.cjs.js +1 -1
- package/GiveFreely-content.cjs.js.map +1 -1
- package/GiveFreely-content.esm.js +1 -1
- package/GiveFreely-content.esm.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GiveFreely-background.esm.js","sources":["../../node_modules/.pnpm/webextension-polyfill@0.12.0/node_modules/webextension-polyfill/dist/browser-polyfill.js","../../src/shared/analytics/types.ts","../../src/shared/utils/logger/transports/console.transport.ts","../../src/shared/utils/logger/transports/analytics.transport.ts","../../src/shared/utils/logger/logger.ts","../../src/shared/utils/retry.ts","../../src/shared/browser.ts","../../src/shared/constants.ts","../../src/shared/utils/storage.ts","../../src/shared/utils/current-version.ts","../../src/shared/utils/cache.ts","../../src/shared/config/ConfigEventEmitter.ts","../../src/shared/config/configDiff.ts","../../src/shared/utils/circuit-breaker.ts","../../src/shared/config/giveFreelyConfig.ts","../../src/shared/config/giveFreelyConfigAdapters.ts","../../src/shared/analytics/index.ts","../../src/shared/utils/add-time.ts","../../src/shared/analytics/healthCheck.ts","../../src/shared/vendors/givefreely/giveFreelyApiClient.ts","../../src/shared/vendors/givefreely/giveFreelyUserService.ts","../../src/shared/vendors/wildfire/wildfireClient.ts","../../src/shared/vendors/wildfire/standdown.ts","../../src/shared/vendors/wildfire/trackingCode.ts","../../src/shared/vendors/wildfire/wildfireService.ts","../../src/shared/utils/is-valid-url.ts","../../src/background/listeners/handleAffiliateStandDown.ts","../../src/background/filters/affiliateWebFilter.ts","../../src/shared/utils/custom-errors.ts","../../src/shared/utils/assert-initialized.ts","../../src/background/strategies/MessageStrategy.ts","../../src/shared/utils.ts","../../src/background/listeners/index.ts","../../src/background/strategies/ActivateOfferStrategy.ts","../../src/background/strategies/GetDomainByShopIdStrategy.ts","../../src/background/strategies/GetLanguageContentStrategy.ts","../../src/background/strategies/GetPopupConfigStrategy.ts","../../src/background/strategies/HidePopupStrategy.ts","../../src/background/strategies/IsActiveDomainStrategy.ts","../../src/background/strategies/LogMerchantsInSearchResultsStrategy.ts","../../src/background/strategies/StoreShopifyShopIdStrategy.ts","../../src/background/strategies/shouldStandDownStrategy.ts","../../src/background/strategies/trackEventStrategy.ts","../../src/background/strategies/index.ts","../../src/shared/services/geolocation.ts","../../src/shared/i18n/index.ts","../../src/background/core/initialize.ts","../../src/background/utils/globalization.ts","../../src/background/utils/state-manager.ts","../../src/background/core/extensions/index.ts","../../src/background/core/extensions/config.ts","../../src/background/core/extensions/merchants.ts","../../src/background/core/extensions/observability.ts","../../src/background/core/extensions/standdown.ts","../../src/background/utils/regexMatch.ts","../../src/background/core/extensions/identity.ts","../../src/background/core/index.ts","../../src/background/giveFreelyService.ts","../../src/background/utils/isAdunitMessage.ts"],"sourcesContent":["(function (global, factory) {\n if (typeof define === \"function\" && define.amd) {\n define(\"webextension-polyfill\", [\"module\"], factory);\n } else if (typeof exports !== \"undefined\") {\n factory(module);\n } else {\n var mod = {\n exports: {}\n };\n factory(mod);\n global.browser = mod.exports;\n }\n})(typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : this, function (module) {\n /* webextension-polyfill - v0.12.0 - Tue May 14 2024 18:01:29 */\n /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */\n /* vim: set sts=2 sw=2 et tw=80: */\n /* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n \"use strict\";\n\n if (!(globalThis.chrome && globalThis.chrome.runtime && globalThis.chrome.runtime.id)) {\n throw new Error(\"This script should only be loaded in a browser extension.\");\n }\n if (!(globalThis.browser && globalThis.browser.runtime && globalThis.browser.runtime.id)) {\n const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = \"The message port closed before a response was received.\";\n\n // Wrapping the bulk of this polyfill in a one-time-use function is a minor\n // optimization for Firefox. Since Spidermonkey does not fully parse the\n // contents of a function until the first time it's called, and since it will\n // never actually need to be called, this allows the polyfill to be included\n // in Firefox nearly for free.\n const wrapAPIs = extensionAPIs => {\n // NOTE: apiMetadata is associated to the content of the api-metadata.json file\n // at build time by replacing the following \"include\" with the content of the\n // JSON file.\n const apiMetadata = {\n \"alarms\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"clearAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"bookmarks\": {\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getChildren\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getRecent\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getSubTree\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTree\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"move\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeTree\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"browserAction\": {\n \"disable\": {\n \"minArgs\": 0,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"enable\": {\n \"minArgs\": 0,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"getBadgeBackgroundColor\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getBadgeText\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"openPopup\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"setBadgeBackgroundColor\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setBadgeText\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"setPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"browsingData\": {\n \"remove\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"removeCache\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeCookies\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeDownloads\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeFormData\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeHistory\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeLocalStorage\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removePasswords\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removePluginData\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"settings\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"commands\": {\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"contextMenus\": {\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"cookies\": {\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAllCookieStores\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"devtools\": {\n \"inspectedWindow\": {\n \"eval\": {\n \"minArgs\": 1,\n \"maxArgs\": 2,\n \"singleCallbackArg\": false\n }\n },\n \"panels\": {\n \"create\": {\n \"minArgs\": 3,\n \"maxArgs\": 3,\n \"singleCallbackArg\": true\n },\n \"elements\": {\n \"createSidebarPane\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n }\n }\n },\n \"downloads\": {\n \"cancel\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"download\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"erase\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getFileIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"open\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"pause\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeFile\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"resume\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"show\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"extension\": {\n \"isAllowedFileSchemeAccess\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"isAllowedIncognitoAccess\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"history\": {\n \"addUrl\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"deleteAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"deleteRange\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"deleteUrl\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getVisits\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"i18n\": {\n \"detectLanguage\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAcceptLanguages\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"identity\": {\n \"launchWebAuthFlow\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"idle\": {\n \"queryState\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"management\": {\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getSelf\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"setEnabled\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"uninstallSelf\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"notifications\": {\n \"clear\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getPermissionLevel\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"pageAction\": {\n \"getPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"hide\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"setPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"show\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"permissions\": {\n \"contains\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"request\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"runtime\": {\n \"getBackgroundPage\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getPlatformInfo\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"openOptionsPage\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"requestUpdateCheck\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"sendMessage\": {\n \"minArgs\": 1,\n \"maxArgs\": 3\n },\n \"sendNativeMessage\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"setUninstallURL\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"sessions\": {\n \"getDevices\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getRecentlyClosed\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"restore\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"storage\": {\n \"local\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"managed\": {\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"sync\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n }\n },\n \"tabs\": {\n \"captureVisibleTab\": {\n \"minArgs\": 0,\n \"maxArgs\": 2\n },\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"detectLanguage\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"discard\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"duplicate\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"executeScript\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getCurrent\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getZoom\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getZoomSettings\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"goBack\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"goForward\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"highlight\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"insertCSS\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"move\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"query\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"reload\": {\n \"minArgs\": 0,\n \"maxArgs\": 2\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeCSS\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"sendMessage\": {\n \"minArgs\": 2,\n \"maxArgs\": 3\n },\n \"setZoom\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"setZoomSettings\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"update\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n }\n },\n \"topSites\": {\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"webNavigation\": {\n \"getAllFrames\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getFrame\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"webRequest\": {\n \"handlerBehaviorChanged\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"windows\": {\n \"create\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getCurrent\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getLastFocused\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n }\n };\n if (Object.keys(apiMetadata).length === 0) {\n throw new Error(\"api-metadata.json has not been included in browser-polyfill\");\n }\n\n /**\n * A WeakMap subclass which creates and stores a value for any key which does\n * not exist when accessed, but behaves exactly as an ordinary WeakMap\n * otherwise.\n *\n * @param {function} createItem\n * A function which will be called in order to create the value for any\n * key which does not exist, the first time it is accessed. The\n * function receives, as its only argument, the key being created.\n */\n class DefaultWeakMap extends WeakMap {\n constructor(createItem, items = undefined) {\n super(items);\n this.createItem = createItem;\n }\n get(key) {\n if (!this.has(key)) {\n this.set(key, this.createItem(key));\n }\n return super.get(key);\n }\n }\n\n /**\n * Returns true if the given object is an object with a `then` method, and can\n * therefore be assumed to behave as a Promise.\n *\n * @param {*} value The value to test.\n * @returns {boolean} True if the value is thenable.\n */\n const isThenable = value => {\n return value && typeof value === \"object\" && typeof value.then === \"function\";\n };\n\n /**\n * Creates and returns a function which, when called, will resolve or reject\n * the given promise based on how it is called:\n *\n * - If, when called, `chrome.runtime.lastError` contains a non-null object,\n * the promise is rejected with that value.\n * - If the function is called with exactly one argument, the promise is\n * resolved to that value.\n * - Otherwise, the promise is resolved to an array containing all of the\n * function's arguments.\n *\n * @param {object} promise\n * An object containing the resolution and rejection functions of a\n * promise.\n * @param {function} promise.resolve\n * The promise's resolution function.\n * @param {function} promise.reject\n * The promise's rejection function.\n * @param {object} metadata\n * Metadata about the wrapped method which has created the callback.\n * @param {boolean} metadata.singleCallbackArg\n * Whether or not the promise is resolved with only the first\n * argument of the callback, alternatively an array of all the\n * callback arguments is resolved. By default, if the callback\n * function is invoked with only a single argument, that will be\n * resolved to the promise, while all arguments will be resolved as\n * an array if multiple are given.\n *\n * @returns {function}\n * The generated callback function.\n */\n const makeCallback = (promise, metadata) => {\n return (...callbackArgs) => {\n if (extensionAPIs.runtime.lastError) {\n promise.reject(new Error(extensionAPIs.runtime.lastError.message));\n } else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) {\n promise.resolve(callbackArgs[0]);\n } else {\n promise.resolve(callbackArgs);\n }\n };\n };\n const pluralizeArguments = numArgs => numArgs == 1 ? \"argument\" : \"arguments\";\n\n /**\n * Creates a wrapper function for a method with the given name and metadata.\n *\n * @param {string} name\n * The name of the method which is being wrapped.\n * @param {object} metadata\n * Metadata about the method being wrapped.\n * @param {integer} metadata.minArgs\n * The minimum number of arguments which must be passed to the\n * function. If called with fewer than this number of arguments, the\n * wrapper will raise an exception.\n * @param {integer} metadata.maxArgs\n * The maximum number of arguments which may be passed to the\n * function. If called with more than this number of arguments, the\n * wrapper will raise an exception.\n * @param {boolean} metadata.singleCallbackArg\n * Whether or not the promise is resolved with only the first\n * argument of the callback, alternatively an array of all the\n * callback arguments is resolved. By default, if the callback\n * function is invoked with only a single argument, that will be\n * resolved to the promise, while all arguments will be resolved as\n * an array if multiple are given.\n *\n * @returns {function(object, ...*)}\n * The generated wrapper function.\n */\n const wrapAsyncFunction = (name, metadata) => {\n return function asyncFunctionWrapper(target, ...args) {\n if (args.length < metadata.minArgs) {\n throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);\n }\n if (args.length > metadata.maxArgs) {\n throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);\n }\n return new Promise((resolve, reject) => {\n if (metadata.fallbackToNoCallback) {\n // This API method has currently no callback on Chrome, but it return a promise on Firefox,\n // and so the polyfill will try to call it with a callback first, and it will fallback\n // to not passing the callback if the first call fails.\n try {\n target[name](...args, makeCallback({\n resolve,\n reject\n }, metadata));\n } catch (cbError) {\n console.warn(`${name} API method doesn't seem to support the callback parameter, ` + \"falling back to call it without a callback: \", cbError);\n target[name](...args);\n\n // Update the API method metadata, so that the next API calls will not try to\n // use the unsupported callback anymore.\n metadata.fallbackToNoCallback = false;\n metadata.noCallback = true;\n resolve();\n }\n } else if (metadata.noCallback) {\n target[name](...args);\n resolve();\n } else {\n target[name](...args, makeCallback({\n resolve,\n reject\n }, metadata));\n }\n });\n };\n };\n\n /**\n * Wraps an existing method of the target object, so that calls to it are\n * intercepted by the given wrapper function. The wrapper function receives,\n * as its first argument, the original `target` object, followed by each of\n * the arguments passed to the original method.\n *\n * @param {object} target\n * The original target object that the wrapped method belongs to.\n * @param {function} method\n * The method being wrapped. This is used as the target of the Proxy\n * object which is created to wrap the method.\n * @param {function} wrapper\n * The wrapper function which is called in place of a direct invocation\n * of the wrapped method.\n *\n * @returns {Proxy<function>}\n * A Proxy object for the given method, which invokes the given wrapper\n * method in its place.\n */\n const wrapMethod = (target, method, wrapper) => {\n return new Proxy(method, {\n apply(targetMethod, thisObj, args) {\n return wrapper.call(thisObj, target, ...args);\n }\n });\n };\n let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);\n\n /**\n * Wraps an object in a Proxy which intercepts and wraps certain methods\n * based on the given `wrappers` and `metadata` objects.\n *\n * @param {object} target\n * The target object to wrap.\n *\n * @param {object} [wrappers = {}]\n * An object tree containing wrapper functions for special cases. Any\n * function present in this object tree is called in place of the\n * method in the same location in the `target` object tree. These\n * wrapper methods are invoked as described in {@see wrapMethod}.\n *\n * @param {object} [metadata = {}]\n * An object tree containing metadata used to automatically generate\n * Promise-based wrapper functions for asynchronous. Any function in\n * the `target` object tree which has a corresponding metadata object\n * in the same location in the `metadata` tree is replaced with an\n * automatically-generated wrapper function, as described in\n * {@see wrapAsyncFunction}\n *\n * @returns {Proxy<object>}\n */\n const wrapObject = (target, wrappers = {}, metadata = {}) => {\n let cache = Object.create(null);\n let handlers = {\n has(proxyTarget, prop) {\n return prop in target || prop in cache;\n },\n get(proxyTarget, prop, receiver) {\n if (prop in cache) {\n return cache[prop];\n }\n if (!(prop in target)) {\n return undefined;\n }\n let value = target[prop];\n if (typeof value === \"function\") {\n // This is a method on the underlying object. Check if we need to do\n // any wrapping.\n\n if (typeof wrappers[prop] === \"function\") {\n // We have a special-case wrapper for this method.\n value = wrapMethod(target, target[prop], wrappers[prop]);\n } else if (hasOwnProperty(metadata, prop)) {\n // This is an async method that we have metadata for. Create a\n // Promise wrapper for it.\n let wrapper = wrapAsyncFunction(prop, metadata[prop]);\n value = wrapMethod(target, target[prop], wrapper);\n } else {\n // This is a method that we don't know or care about. Return the\n // original method, bound to the underlying object.\n value = value.bind(target);\n }\n } else if (typeof value === \"object\" && value !== null && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) {\n // This is an object that we need to do some wrapping for the children\n // of. Create a sub-object wrapper for it with the appropriate child\n // metadata.\n value = wrapObject(value, wrappers[prop], metadata[prop]);\n } else if (hasOwnProperty(metadata, \"*\")) {\n // Wrap all properties in * namespace.\n value = wrapObject(value, wrappers[prop], metadata[\"*\"]);\n } else {\n // We don't need to do any wrapping for this property,\n // so just forward all access to the underlying object.\n Object.defineProperty(cache, prop, {\n configurable: true,\n enumerable: true,\n get() {\n return target[prop];\n },\n set(value) {\n target[prop] = value;\n }\n });\n return value;\n }\n cache[prop] = value;\n return value;\n },\n set(proxyTarget, prop, value, receiver) {\n if (prop in cache) {\n cache[prop] = value;\n } else {\n target[prop] = value;\n }\n return true;\n },\n defineProperty(proxyTarget, prop, desc) {\n return Reflect.defineProperty(cache, prop, desc);\n },\n deleteProperty(proxyTarget, prop) {\n return Reflect.deleteProperty(cache, prop);\n }\n };\n\n // Per contract of the Proxy API, the \"get\" proxy handler must return the\n // original value of the target if that value is declared read-only and\n // non-configurable. For this reason, we create an object with the\n // prototype set to `target` instead of using `target` directly.\n // Otherwise we cannot return a custom object for APIs that\n // are declared read-only and non-configurable, such as `chrome.devtools`.\n //\n // The proxy handlers themselves will still use the original `target`\n // instead of the `proxyTarget`, so that the methods and properties are\n // dereferenced via the original targets.\n let proxyTarget = Object.create(target);\n return new Proxy(proxyTarget, handlers);\n };\n\n /**\n * Creates a set of wrapper functions for an event object, which handles\n * wrapping of listener functions that those messages are passed.\n *\n * A single wrapper is created for each listener function, and stored in a\n * map. Subsequent calls to `addListener`, `hasListener`, or `removeListener`\n * retrieve the original wrapper, so that attempts to remove a\n * previously-added listener work as expected.\n *\n * @param {DefaultWeakMap<function, function>} wrapperMap\n * A DefaultWeakMap object which will create the appropriate wrapper\n * for a given listener function when one does not exist, and retrieve\n * an existing one when it does.\n *\n * @returns {object}\n */\n const wrapEvent = wrapperMap => ({\n addListener(target, listener, ...args) {\n target.addListener(wrapperMap.get(listener), ...args);\n },\n hasListener(target, listener) {\n return target.hasListener(wrapperMap.get(listener));\n },\n removeListener(target, listener) {\n target.removeListener(wrapperMap.get(listener));\n }\n });\n const onRequestFinishedWrappers = new DefaultWeakMap(listener => {\n if (typeof listener !== \"function\") {\n return listener;\n }\n\n /**\n * Wraps an onRequestFinished listener function so that it will return a\n * `getContent()` property which returns a `Promise` rather than using a\n * callback API.\n *\n * @param {object} req\n * The HAR entry object representing the network request.\n */\n return function onRequestFinished(req) {\n const wrappedReq = wrapObject(req, {} /* wrappers */, {\n getContent: {\n minArgs: 0,\n maxArgs: 0\n }\n });\n listener(wrappedReq);\n };\n });\n const onMessageWrappers = new DefaultWeakMap(listener => {\n if (typeof listener !== \"function\") {\n return listener;\n }\n\n /**\n * Wraps a message listener function so that it may send responses based on\n * its return value, rather than by returning a sentinel value and calling a\n * callback. If the listener function returns a Promise, the response is\n * sent when the promise either resolves or rejects.\n *\n * @param {*} message\n * The message sent by the other end of the channel.\n * @param {object} sender\n * Details about the sender of the message.\n * @param {function(*)} sendResponse\n * A callback which, when called with an arbitrary argument, sends\n * that value as a response.\n * @returns {boolean}\n * True if the wrapped listener returned a Promise, which will later\n * yield a response. False otherwise.\n */\n return function onMessage(message, sender, sendResponse) {\n let didCallSendResponse = false;\n let wrappedSendResponse;\n let sendResponsePromise = new Promise(resolve => {\n wrappedSendResponse = function (response) {\n didCallSendResponse = true;\n resolve(response);\n };\n });\n let result;\n try {\n result = listener(message, sender, wrappedSendResponse);\n } catch (err) {\n result = Promise.reject(err);\n }\n const isResultThenable = result !== true && isThenable(result);\n\n // If the listener didn't returned true or a Promise, or called\n // wrappedSendResponse synchronously, we can exit earlier\n // because there will be no response sent from this listener.\n if (result !== true && !isResultThenable && !didCallSendResponse) {\n return false;\n }\n\n // A small helper to send the message if the promise resolves\n // and an error if the promise rejects (a wrapped sendMessage has\n // to translate the message into a resolved promise or a rejected\n // promise).\n const sendPromisedResult = promise => {\n promise.then(msg => {\n // send the message value.\n sendResponse(msg);\n }, error => {\n // Send a JSON representation of the error if the rejected value\n // is an instance of error, or the object itself otherwise.\n let message;\n if (error && (error instanceof Error || typeof error.message === \"string\")) {\n message = error.message;\n } else {\n message = \"An unexpected error occurred\";\n }\n sendResponse({\n __mozWebExtensionPolyfillReject__: true,\n message\n });\n }).catch(err => {\n // Print an error on the console if unable to send the response.\n console.error(\"Failed to send onMessage rejected reply\", err);\n });\n };\n\n // If the listener returned a Promise, send the resolved value as a\n // result, otherwise wait the promise related to the wrappedSendResponse\n // callback to resolve and send it as a response.\n if (isResultThenable) {\n sendPromisedResult(result);\n } else {\n sendPromisedResult(sendResponsePromise);\n }\n\n // Let Chrome know that the listener is replying.\n return true;\n };\n });\n const wrappedSendMessageCallback = ({\n reject,\n resolve\n }, reply) => {\n if (extensionAPIs.runtime.lastError) {\n // Detect when none of the listeners replied to the sendMessage call and resolve\n // the promise to undefined as in Firefox.\n // See https://github.com/mozilla/webextension-polyfill/issues/130\n if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) {\n resolve();\n } else {\n reject(new Error(extensionAPIs.runtime.lastError.message));\n }\n } else if (reply && reply.__mozWebExtensionPolyfillReject__) {\n // Convert back the JSON representation of the error into\n // an Error instance.\n reject(new Error(reply.message));\n } else {\n resolve(reply);\n }\n };\n const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => {\n if (args.length < metadata.minArgs) {\n throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);\n }\n if (args.length > metadata.maxArgs) {\n throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);\n }\n return new Promise((resolve, reject) => {\n const wrappedCb = wrappedSendMessageCallback.bind(null, {\n resolve,\n reject\n });\n args.push(wrappedCb);\n apiNamespaceObj.sendMessage(...args);\n });\n };\n const staticWrappers = {\n devtools: {\n network: {\n onRequestFinished: wrapEvent(onRequestFinishedWrappers)\n }\n },\n runtime: {\n onMessage: wrapEvent(onMessageWrappers),\n onMessageExternal: wrapEvent(onMessageWrappers),\n sendMessage: wrappedSendMessage.bind(null, \"sendMessage\", {\n minArgs: 1,\n maxArgs: 3\n })\n },\n tabs: {\n sendMessage: wrappedSendMessage.bind(null, \"sendMessage\", {\n minArgs: 2,\n maxArgs: 3\n })\n }\n };\n const settingMetadata = {\n clear: {\n minArgs: 1,\n maxArgs: 1\n },\n get: {\n minArgs: 1,\n maxArgs: 1\n },\n set: {\n minArgs: 1,\n maxArgs: 1\n }\n };\n apiMetadata.privacy = {\n network: {\n \"*\": settingMetadata\n },\n services: {\n \"*\": settingMetadata\n },\n websites: {\n \"*\": settingMetadata\n }\n };\n return wrapObject(extensionAPIs, staticWrappers, apiMetadata);\n };\n\n // The build process adds a UMD wrapper around this file, which makes the\n // `module` variable available.\n module.exports = wrapAPIs(chrome);\n } else {\n module.exports = globalThis.browser;\n }\n});\n//# sourceMappingURL=browser-polyfill.js.map\n",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":["globalThis","chrome","runtime","id","Error","browser","module","exports","CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE","wrapAPIs","extensionAPIs","apiMetadata","alarms","clear","minArgs","maxArgs","clearAll","get","getAll","bookmarks","create","getChildren","getRecent","getSubTree","getTree","move","remove","removeTree","search","update","browserAction","disable","fallbackToNoCallback","enable","getBadgeBackgroundColor","getBadgeText","getPopup","getTitle","openPopup","setBadgeBackgroundColor","setBadgeText","setIcon","setPopup","setTitle","browsingData","removeCache","removeCookies","removeDownloads","removeFormData","removeHistory","removeLocalStorage","removePasswords","removePluginData","settings","commands","contextMenus","removeAll","cookies","getAllCookieStores","set","devtools","inspectedWindow","eval","singleCallbackArg","panels","elements","createSidebarPane","downloads","cancel","download","erase","getFileIcon","open","pause","removeFile","resume","show","extension","isAllowedFileSchemeAccess","isAllowedIncognitoAccess","history","addUrl","deleteAll","deleteRange","deleteUrl","getVisits","i18n","detectLanguage","getAcceptLanguages","identity","launchWebAuthFlow","idle","queryState","management","getSelf","setEnabled","uninstallSelf","notifications","getPermissionLevel","pageAction","hide","permissions","contains","request","getBackgroundPage","getPlatformInfo","openOptionsPage","requestUpdateCheck","sendMessage","sendNativeMessage","setUninstallURL","sessions","getDevices","getRecentlyClosed","restore","storage","local","getBytesInUse","managed","sync","tabs","captureVisibleTab","discard","duplicate","executeScript","getCurrent","getZoom","getZoomSettings","goBack","goForward","highlight","insertCSS","query","reload","removeCSS","setZoom","setZoomSettings","topSites","webNavigation","getAllFrames","getFrame","webRequest","handlerBehaviorChanged","windows","getLastFocused","Object","keys","length","DefaultWeakMap","WeakMap","constructor","createItem","items","undefined","super","this","key","has","makeCallback","promise","metadata","callbackArgs","lastError","reject","message","resolve","pluralizeArguments","numArgs","wrapMethod","target","method","wrapper","Proxy","apply","targetMethod","thisObj","args","call","hasOwnProperty","Function","bind","prototype","wrapObject","wrappers","cache","handlers","proxyTarget","prop","receiver","value","wrapAsyncFunction","name","Promise","cbError","console","warn","noCallback","defineProperty","configurable","enumerable","desc","Reflect","deleteProperty","wrapEvent","wrapperMap","addListener","listener","hasListener","removeListener","onRequestFinishedWrappers","req","wrappedReq","getContent","onMessageWrappers","sender","sendResponse","wrappedSendResponse","result","didCallSendResponse","sendResponsePromise","response","err","isResultThenable","then","msg","error","__mozWebExtensionPolyfillReject__","catch","wrappedSendMessageCallback","reply","wrappedSendMessage","apiNamespaceObj","wrappedCb","push","staticWrappers","network","onRequestFinished","onMessage","onMessageExternal","settingMetadata","privacy","services","websites","PopupEvent","LoggingEvent","ConsoleTransport","isLocal","log","level","timestamp","data","title","consoleMethod","titlePrefix","LOGGER_PREFIX","AnalyticsTransport","backgroundService","trackEvent","adUnitLog","LOG_LEVELS","Logger","config","minLevel","enabled","transports","getInstance","instance","configure","shouldLog","indexOf","createLogMessage","version","LIB_VERSION","Date","toISOString","onlyLocal","logMessage","filter","transport","forEach","debug","info","critical","fatal","addTransport","clearTransports","MAX_RETRY_ATTEMPTS","defaultDelay","attempt","async","retryOperation","operation","options","returnOnFailure","maxAttempts","delayFn","setTimeout","logger","operationName","api","MESSAGE_TYPES","TRACK_EVENT","HIDE_POPUP","GET_POPUP_CONFIG","IS_ACTIVE_DOMAIN","LOG_MERCHANTS_IN_SEARCH_RESULTS","SHOULD_STAND_DOWN","ACTIVATE_OFFER","STORE_SHOPIFY_SHOP_ID","GET_DOMAIN_BY_SHOP_ID","GET_LANGUAGE_CONTENT","SHOPIFY_SHOP_IDS_STORAGE_KEY","LAST_HEALTH_CHECK_STORAGE_KEY","PARTNER_CONFIG_STORAGE_KEY","GLOBAL_CONFIG_STORAGE_KEY","COUNTRY_CODE_STORAGE_KEY","VERSION_STORAGE_KEY","ANONYMOUS_USER_STORAGE_KEY","ANONYMOUS_ENCRYPTED_TOKEN_STORAGE_KEY","GF_AD_EVENT_HISTORY_STORAGE_KEY","WILDFIRE_STORAGE_KEYS","DEFAULT_LANGUAGE","storagePrefix","prefixedKey","prefixedKeys","Array","isArray","map","getCurrentVersion","String","isNewVersion","updateStorageIfNew","storedVersion","currentVersion","isANewVersion","newVersion","hydrationFn","retentionInSeconds","forceRefresh","deriveRetentionInSeconds","cachedValue","staleValue","isStale","currentRetention","now","lastFetch","content","rawContent","derivedRetention","ex","effectiveRetention","ConfigEventEmitter","listeners","Map","wildcardListeners","Set","on","pattern","callback","once","off","delete","from","entry","includes","filtered","emit","event","exactListeners","path","listenersToCall","add","matchesPattern","patternListeners","size","regex","split","part","replace","join","RegExp","test","deepDiff","oldObj","newObj","diffs","isPrimitive","oldValue","newValue","JSON","stringify","isObject","oldObjRecord","newObjRecord","allKeys","currentPath","nestedDiffs","CircuitState","CircuitBreaker","state","CLOSED","failures","lastFailureTime","halfOpenCalls","failureThreshold","recoveryTimeout","monitoringWindow","halfOpenMaxCalls","storageKey","initialize","loadFromStorage","savedState","cleanupOldFailures","localStorage","getItem","parsedState","parse","saveToStorage","stateToSave","setItem","failure","execute","fallback","OPEN","shouldAttemptRecovery","HALF_OPEN","onSuccess","onFailure","getState","getFailureCount","reset","clearStorage","removeItem","getStatus","failureCount","nextAttemptTime","CONFIG_BASE_URL","GiveFreelyConfigService","partnerApiKey","partnerConfig","globalConfig","mergedConfig","globalConfigRefreshInterval","partnerConfigRefreshInterval","eventEmitter","isInitialized","partnerCircuitBreaker","globalCircuitBreaker","all","ensureInitialized","getRetryOptions","fetchPartnerConfig","cacheResult","fetch","ok","statusText","json","configRefreshInterval","fetchGlobalConfig","configResponse","status","getCachedConfig","getConfig","forceRefreshIfIsNewVersion","mergedConfigs","mergeConfigs","merchantExclusionsAdapter","destinationConfig","merchantExclusions","emitConfigChanges","clearCache","getCircuitBreakerStatus","partner","global","globalConfigRecord","partnerConfigRecord","newConfig","diff","Analytics","userService","configService","debounceWindowInMinutes","track","eventType","wfDeviceId","payload","anonymous","skipThrottling","_partnerApiKey","eventData","userId","_userService","user","libVersion","serializedEvent","_key","stack","eventsUrl","getEventsUrl","BroadcastEvent","_logger","getEventsHistory","lastHourDate","m","setTime","getTime","addMinutes","_debounceWindowInMinutes","typedHistory","x","createdAt","shouldBroadcastEvent","some","pushEventToHistory","_configService","headers","body","type","HealthCheck","lastCheck","lastHealthCheckStored","getToday","check","lastHealthCheck","today","checkoutPopupHealthCheck","language","getUILanguage","CommissionStatusEnum","GiveFreelyApiClient","adUnitId","getAnonymousUserCommissions","anonymousUserToken","filterParams","queryString","URLSearchParams","toString","apiConfig","baseUri","getAnonymousUserComissionsPath","createOrUpdateAnonymousUser","requestPayload","createAnonymousUserPath","setAnonymousUserTokenHeader","resultUser","charity","ein","selectedCharity","thirdPartyId","selectedCharityThirdPartyIdentifier","resultToken","GiveFreelyUserService","giveFreelyApiClient","_giveFreelyApiClient","resetUser","upsertUser","currentUser","fetchUser","changingPayload","deviceId","shouldCreateOrUpdateUser","anonymousEncriptedToken","WildfireClient","wfSecret","wfAppId","deviceUrl","dataUrl","getWildfireDevice","getActiveDomains","url","getStanddownPolicy","getMerchantRates","rates","shouldStandDown","activeDomain","affiliateStandDown","getStanddownHistory","updateStanddownHistory","refreshCache","policy","hasAffiliateParams","URL","hasAffiliation","hostNames","standDownPolicy","hostname","hasAffiliateDomain","wildfireStorageKeys","domain","hours","Domains","searchParams","Params","param","toLowerCase","TrackingCode","charityEin","charityThirdPartyIdentifier","partnerId","encodeUserId","btoa","WildfireService","wildfireClient","vanityBaseUrl","refreshInterval","hasAffilliation","domains","fetchActiveDomains","merchantId","cachedRates","fetchMerchantRates","generateAffiliateUrl","originalUrl","device","getDevice","trackingCode","generateTrackingCode","encodedUrl","encodeURIComponent","encodedTrackingCode","DeviceID","ID","clearDevice","forceSync","fetchStanddownPolicy","fetchAndStoreDevice","LostAttribution","Serp","merchantRates","createWildfireService","wfService","isValidURL","affiliatedRequests","ignoredRequests","affiliateWebFilter","urls","types","UninitializedServiceError","assertInitialized","MessageStrategyRegistry","register","messageType","strategy","strategies","exists","isValidMessage","knownMessageTypes","values","addListeners","adUnitBackground","cleanupWebRequestListeners","onBeforeRequestListener","gfService","getLogger","requestId","initiator","initiatorHostname","isCustomStandownMatch","standDownlisteners","onBeforeRequest","filters","onBeforeRedirectListener","redirectUrl","find","Domain","endsWith","onBeforeRedirect","onCompletedListener","onCompleted","messageListener","typedSendResponse","resp","maybePromise","handleMessage","addMessageListener","context","giveFreelyService","handle","ActivateOfferStrategy","initializeWfDeviceId","affiliateUrl","currentTab","tab","newTab","openerTabId","active","pinned","onUpdated","updatedTabId","changeInfo","tabId","waitForTabToLoad","createTab","checkoutPopupFailedActivation","GetDomainByShopIdStrategy","shopId","STORAGE_KEY","matchingShopInfo","found","shopInfo","GetLanguageContentStrategy","lang","getLanguage","translations","charities","GetPopupConfigStrategy","HidePopupStrategy","days","expiry","setDate","getDate","popupHide","ack","IsActiveDomainStrategy","activeDomains","healthCheck","disableDomain","isActive","count","Merchant","LogMerchantsInSearchResultsStrategy","currentUrl","searchResults","source","merchantsSearchResults","z","number","searchResultsId","Math","floor","random","checkoutPopupMerchantInResultsFound","searchResultUrl","sponsored","isSponsored","StoreShopifyShopIdStrategy","existingData","existingIndex","findIndex","item","success","ShouldStandDownStrategy","TrackEventStrategy","getCountryCode","requestOptions","Authorization","country","iso_code","detectUsersCountry","CDN_BASE_URL","cacheExpiration","ignoredLanguages","currentLang","defaultLanguageCacheKey","defaultLanguage","hydrateLanguage","languageCacheKey","resultLanguage","mergeLanguages","GLOBAL_LANGUAGE_PREFIX","PARTNER_LANGUAGE_PREFIX","globalLanguageFile","partnerLanguageResult","allSettled","fetchLanguage","globalFile","partnerLanguageFile","resultingLanguage","mergeGlobalAndPartner","globalConfiguration","partnerConfiguration","partnerFilter","initialized","dependencies","loggingEnabled","backgroundMinLogLevel","wildfireService","giveFreelyClient","giveFreelyUserService","analytics","existingDevice","initializeRegion","purgeLanguages","flatMap","initializeLanguage","getInitializedState","currentState","initializationPayload","StateManager","cleanupListeners","setupConfigChangeHandlers","onConfigChange","clearWildfireDevice","CoreExtensions","merchants","observability","standdown","hosts","customStandownPolicy","urlRegex","regexString","regexMatch","parsedUrl","mutePopups","updateHistory","geti18nLanguage","AdUnitCoreService","onceConfigChange","offConfigChange","getCurrentUser","destroy","GiveFreelyService","_adUnitService","isAdUnitMessage"],"mappings":"yVAQA,KAAMA,WAAWC,QAAUD,WAAWC,OAAOC,SAAWF,WAAWC,OAAOC,QAAQC,IAChF,MAAM,IAAIC,MAAM,6DAGlB,GAAMJ,WAAWK,SAAWL,WAAWK,QAAQH,SAAWF,WAAWK,QAAQH,QAAQC,GAirCnFG,EAAOC,QAAUP,WAAWK,YAjrC4D,CACxF,MAAMG,EAAmD,0DAOnDC,EAAWC,IAIf,MAAMC,EAAc,CAClBC,OAAU,CACRC,MAAS,CACPC,QAAW,EACXC,QAAW,GAEbC,SAAY,CACVF,QAAW,EACXC,QAAW,GAEbE,IAAO,CACLH,QAAW,EACXC,QAAW,GAEbG,OAAU,CACRJ,QAAW,EACXC,QAAW,IAGfI,UAAa,CACXC,OAAU,CACRN,QAAW,EACXC,QAAW,GAEbE,IAAO,CACLH,QAAW,EACXC,QAAW,GAEbM,YAAe,CACbP,QAAW,EACXC,QAAW,GAEbO,UAAa,CACXR,QAAW,EACXC,QAAW,GAEbQ,WAAc,CACZT,QAAW,EACXC,QAAW,GAEbS,QAAW,CACTV,QAAW,EACXC,QAAW,GAEbU,KAAQ,CACNX,QAAW,EACXC,QAAW,GAEbW,OAAU,CACRZ,QAAW,EACXC,QAAW,GAEbY,WAAc,CACZb,QAAW,EACXC,QAAW,GAEba,OAAU,CACRd,QAAW,EACXC,QAAW,GAEbc,OAAU,CACRf,QAAW,EACXC,QAAW,IAGfe,cAAiB,CACfC,QAAW,CACTjB,QAAW,EACXC,QAAW,EACXiB,sBAAwB,GAE1BC,OAAU,CACRnB,QAAW,EACXC,QAAW,EACXiB,sBAAwB,GAE1BE,wBAA2B,CACzBpB,QAAW,EACXC,QAAW,GAEboB,aAAgB,CACdrB,QAAW,EACXC,QAAW,GAEbqB,SAAY,CACVtB,QAAW,EACXC,QAAW,GAEbsB,SAAY,CACVvB,QAAW,EACXC,QAAW,GAEbuB,UAAa,CACXxB,QAAW,EACXC,QAAW,GAEbwB,wBAA2B,CACzBzB,QAAW,EACXC,QAAW,EACXiB,sBAAwB,GAE1BQ,aAAgB,CACd1B,QAAW,EACXC,QAAW,EACXiB,sBAAwB,GAE1BS,QAAW,CACT3B,QAAW,EACXC,QAAW,GAEb2B,SAAY,CACV5B,QAAW,EACXC,QAAW,EACXiB,sBAAwB,GAE1BW,SAAY,CACV7B,QAAW,EACXC,QAAW,EACXiB,sBAAwB,IAG5BY,aAAgB,CACdlB,OAAU,CACRZ,QAAW,EACXC,QAAW,GAEb8B,YAAe,CACb/B,QAAW,EACXC,QAAW,GAEb+B,cAAiB,CACfhC,QAAW,EACXC,QAAW,GAEbgC,gBAAmB,CACjBjC,QAAW,EACXC,QAAW,GAEbiC,eAAkB,CAChBlC,QAAW,EACXC,QAAW,GAEbkC,cAAiB,CACfnC,QAAW,EACXC,QAAW,GAEbmC,mBAAsB,CACpBpC,QAAW,EACXC,QAAW,GAEboC,gBAAmB,CACjBrC,QAAW,EACXC,QAAW,GAEbqC,iBAAoB,CAClBtC,QAAW,EACXC,QAAW,GAEbsC,SAAY,CACVvC,QAAW,EACXC,QAAW,IAGfuC,SAAY,CACVpC,OAAU,CACRJ,QAAW,EACXC,QAAW,IAGfwC,aAAgB,CACd7B,OAAU,CACRZ,QAAW,EACXC,QAAW,GAEbyC,UAAa,CACX1C,QAAW,EACXC,QAAW,GAEbc,OAAU,CACRf,QAAW,EACXC,QAAW,IAGf0C,QAAW,CACTxC,IAAO,CACLH,QAAW,EACXC,QAAW,GAEbG,OAAU,CACRJ,QAAW,EACXC,QAAW,GAEb2C,mBAAsB,CACpB5C,QAAW,EACXC,QAAW,GAEbW,OAAU,CACRZ,QAAW,EACXC,QAAW,GAEb4C,IAAO,CACL7C,QAAW,EACXC,QAAW,IAGf6C,SAAY,CACVC,gBAAmB,CACjBC,KAAQ,CACNhD,QAAW,EACXC,QAAW,EACXgD,mBAAqB,IAGzBC,OAAU,CACR5C,OAAU,CACRN,QAAW,EACXC,QAAW,EACXgD,mBAAqB,GAEvBE,SAAY,CACVC,kBAAqB,CACnBpD,QAAW,EACXC,QAAW,MAKnBoD,UAAa,CACXC,OAAU,CACRtD,QAAW,EACXC,QAAW,GAEbsD,SAAY,CACVvD,QAAW,EACXC,QAAW,GAEbuD,MAAS,CACPxD,QAAW,EACXC,QAAW,GAEbwD,YAAe,CACbzD,QAAW,EACXC,QAAW,GAEbyD,KAAQ,CACN1D,QAAW,EACXC,QAAW,EACXiB,sBAAwB,GAE1ByC,MAAS,CACP3D,QAAW,EACXC,QAAW,GAEb2D,WAAc,CACZ5D,QAAW,EACXC,QAAW,GAEb4D,OAAU,CACR7D,QAAW,EACXC,QAAW,GAEba,OAAU,CACRd,QAAW,EACXC,QAAW,GAEb6D,KAAQ,CACN9D,QAAW,EACXC,QAAW,EACXiB,sBAAwB,IAG5B6C,UAAa,CACXC,0BAA6B,CAC3BhE,QAAW,EACXC,QAAW,GAEbgE,yBAA4B,CAC1BjE,QAAW,EACXC,QAAW,IAGfiE,QAAW,CACTC,OAAU,CACRnE,QAAW,EACXC,QAAW,GAEbmE,UAAa,CACXpE,QAAW,EACXC,QAAW,GAEboE,YAAe,CACbrE,QAAW,EACXC,QAAW,GAEbqE,UAAa,CACXtE,QAAW,EACXC,QAAW,GAEbsE,UAAa,CACXvE,QAAW,EACXC,QAAW,GAEba,OAAU,CACRd,QAAW,EACXC,QAAW,IAGfuE,KAAQ,CACNC,eAAkB,CAChBzE,QAAW,EACXC,QAAW,GAEbyE,mBAAsB,CACpB1E,QAAW,EACXC,QAAW,IAGf0E,SAAY,CACVC,kBAAqB,CACnB5E,QAAW,EACXC,QAAW,IAGf4E,KAAQ,CACNC,WAAc,CACZ9E,QAAW,EACXC,QAAW,IAGf8E,WAAc,CACZ5E,IAAO,CACLH,QAAW,EACXC,QAAW,GAEbG,OAAU,CACRJ,QAAW,EACXC,QAAW,GAEb+E,QAAW,CACThF,QAAW,EACXC,QAAW,GAEbgF,WAAc,CACZjF,QAAW,EACXC,QAAW,GAEbiF,cAAiB,CACflF,QAAW,EACXC,QAAW,IAGfkF,cAAiB,CACfpF,MAAS,CACPC,QAAW,EACXC,QAAW,GAEbK,OAAU,CACRN,QAAW,EACXC,QAAW,GAEbG,OAAU,CACRJ,QAAW,EACXC,QAAW,GAEbmF,mBAAsB,CACpBpF,QAAW,EACXC,QAAW,GAEbc,OAAU,CACRf,QAAW,EACXC,QAAW,IAGfoF,WAAc,CACZ/D,SAAY,CACVtB,QAAW,EACXC,QAAW,GAEbsB,SAAY,CACVvB,QAAW,EACXC,QAAW,GAEbqF,KAAQ,CACNtF,QAAW,EACXC,QAAW,EACXiB,sBAAwB,GAE1BS,QAAW,CACT3B,QAAW,EACXC,QAAW,GAEb2B,SAAY,CACV5B,QAAW,EACXC,QAAW,EACXiB,sBAAwB,GAE1BW,SAAY,CACV7B,QAAW,EACXC,QAAW,EACXiB,sBAAwB,GAE1B4C,KAAQ,CACN9D,QAAW,EACXC,QAAW,EACXiB,sBAAwB,IAG5BqE,YAAe,CACbC,SAAY,CACVxF,QAAW,EACXC,QAAW,GAEbG,OAAU,CACRJ,QAAW,EACXC,QAAW,GAEbW,OAAU,CACRZ,QAAW,EACXC,QAAW,GAEbwF,QAAW,CACTzF,QAAW,EACXC,QAAW,IAGfb,QAAW,CACTsG,kBAAqB,CACnB1F,QAAW,EACXC,QAAW,GAEb0F,gBAAmB,CACjB3F,QAAW,EACXC,QAAW,GAEb2F,gBAAmB,CACjB5F,QAAW,EACXC,QAAW,GAEb4F,mBAAsB,CACpB7F,QAAW,EACXC,QAAW,GAEb6F,YAAe,CACb9F,QAAW,EACXC,QAAW,GAEb8F,kBAAqB,CACnB/F,QAAW,EACXC,QAAW,GAEb+F,gBAAmB,CACjBhG,QAAW,EACXC,QAAW,IAGfgG,SAAY,CACVC,WAAc,CACZlG,QAAW,EACXC,QAAW,GAEbkG,kBAAqB,CACnBnG,QAAW,EACXC,QAAW,GAEbmG,QAAW,CACTpG,QAAW,EACXC,QAAW,IAGfoG,QAAW,CACTC,MAAS,CACPvG,MAAS,CACPC,QAAW,EACXC,QAAW,GAEbE,IAAO,CACLH,QAAW,EACXC,QAAW,GAEbsG,cAAiB,CACfvG,QAAW,EACXC,QAAW,GAEbW,OAAU,CACRZ,QAAW,EACXC,QAAW,GAEb4C,IAAO,CACL7C,QAAW,EACXC,QAAW,IAGfuG,QAAW,CACTrG,IAAO,CACLH,QAAW,EACXC,QAAW,GAEbsG,cAAiB,CACfvG,QAAW,EACXC,QAAW,IAGfwG,KAAQ,CACN1G,MAAS,CACPC,QAAW,EACXC,QAAW,GAEbE,IAAO,CACLH,QAAW,EACXC,QAAW,GAEbsG,cAAiB,CACfvG,QAAW,EACXC,QAAW,GAEbW,OAAU,CACRZ,QAAW,EACXC,QAAW,GAEb4C,IAAO,CACL7C,QAAW,EACXC,QAAW,KAIjByG,KAAQ,CACNC,kBAAqB,CACnB3G,QAAW,EACXC,QAAW,GAEbK,OAAU,CACRN,QAAW,EACXC,QAAW,GAEbwE,eAAkB,CAChBzE,QAAW,EACXC,QAAW,GAEb2G,QAAW,CACT5G,QAAW,EACXC,QAAW,GAEb4G,UAAa,CACX7G,QAAW,EACXC,QAAW,GAEb6G,cAAiB,CACf9G,QAAW,EACXC,QAAW,GAEbE,IAAO,CACLH,QAAW,EACXC,QAAW,GAEb8G,WAAc,CACZ/G,QAAW,EACXC,QAAW,GAEb+G,QAAW,CACThH,QAAW,EACXC,QAAW,GAEbgH,gBAAmB,CACjBjH,QAAW,EACXC,QAAW,GAEbiH,OAAU,CACRlH,QAAW,EACXC,QAAW,GAEbkH,UAAa,CACXnH,QAAW,EACXC,QAAW,GAEbmH,UAAa,CACXpH,QAAW,EACXC,QAAW,GAEboH,UAAa,CACXrH,QAAW,EACXC,QAAW,GAEbU,KAAQ,CACNX,QAAW,EACXC,QAAW,GAEbqH,MAAS,CACPtH,QAAW,EACXC,QAAW,GAEbsH,OAAU,CACRvH,QAAW,EACXC,QAAW,GAEbW,OAAU,CACRZ,QAAW,EACXC,QAAW,GAEbuH,UAAa,CACXxH,QAAW,EACXC,QAAW,GAEb6F,YAAe,CACb9F,QAAW,EACXC,QAAW,GAEbwH,QAAW,CACTzH,QAAW,EACXC,QAAW,GAEbyH,gBAAmB,CACjB1H,QAAW,EACXC,QAAW,GAEbc,OAAU,CACRf,QAAW,EACXC,QAAW,IAGf0H,SAAY,CACVxH,IAAO,CACLH,QAAW,EACXC,QAAW,IAGf2H,cAAiB,CACfC,aAAgB,CACd7H,QAAW,EACXC,QAAW,GAEb6H,SAAY,CACV9H,QAAW,EACXC,QAAW,IAGf8H,WAAc,CACZC,uBAA0B,CACxBhI,QAAW,EACXC,QAAW,IAGfgI,QAAW,CACT3H,OAAU,CACRN,QAAW,EACXC,QAAW,GAEbE,IAAO,CACLH,QAAW,EACXC,QAAW,GAEbG,OAAU,CACRJ,QAAW,EACXC,QAAW,GAEb8G,WAAc,CACZ/G,QAAW,EACXC,QAAW,GAEbiI,eAAkB,CAChBlI,QAAW,EACXC,QAAW,GAEbW,OAAU,CACRZ,QAAW,EACXC,QAAW,GAEbc,OAAU,CACRf,QAAW,EACXC,QAAW,KAKjB,GAAwC,IAApCkI,OAAOC,KAAKvI,GAAawI,OAC3B,MAAM,IAAI/I,MAAM,+DAalB,MAAMgJ,UAAuBC,QAC3BC,WAAAA,CAAYC,EAAYC,OAAQC,GAC9BC,MAAMF,GACNG,KAAKJ,WAAaA,CACpB,CAEAtI,GAAAA,CAAI2I,GAKF,OAJKD,KAAKE,IAAID,IACZD,KAAKhG,IAAIiG,EAAKD,KAAKJ,WAAWK,IAGzBF,MAAMzI,IAAI2I,EACnB,EAUF,MAmCME,EAAeA,CAACC,EAASC,IACtB,IAAIC,KACLvJ,EAAcR,QAAQgK,UACxBH,EAAQI,OAAO,IAAI/J,MAAMM,EAAcR,QAAQgK,UAAUE,UAChDJ,EAASjG,mBACRkG,EAAad,QAAU,IAAoC,IAA/Ba,EAASjG,kBAC/CgG,EAAQM,QAAQJ,EAAa,IAE7BF,EAAQM,QAAQJ,EAClB,EAIEK,EAAsBC,GAAuB,GAAXA,EAAe,WAAa,YAuF9DC,EAAaA,CAACC,EAAQC,EAAQC,IAC3B,IAAIC,MAAMF,EAAQ,CACvBG,MAAKA,CAACC,EAAcC,EAASC,IACpBL,EAAQM,KAAKF,EAASN,KAAWO,KAK9C,IAAIE,EAAiBC,SAASF,KAAKG,KAAKnC,OAAOoC,UAAUH,gBAyBzD,MAAMI,EAAaA,CAACb,EAAQc,EAAW,CAAE,EAAEvB,EAAW,MACpD,IAAIwB,EAAQvC,OAAO7H,OAAO,MACtBqK,EAAW,CACb5B,IAAGA,CAAC6B,EAAaC,IACRA,KAAQlB,GAAUkB,KAAQH,EAGnCvK,GAAAA,CAAIyK,EAAaC,EAAMC,GACrB,GAAID,KAAQH,EACV,OAAOA,EAAMG,GAGf,KAAMA,KAAQlB,GACZ,OAGF,IAAIoB,EAAQpB,EAAOkB,GAEnB,GAAqB,mBAAVE,EAIT,GAA8B,mBAAnBN,EAASI,GAElBE,EAAQrB,EAAWC,EAAQA,EAAOkB,GAAOJ,EAASI,SAC7C,GAAIT,EAAelB,EAAU2B,GAAO,CAGzC,IAAIhB,EAxHYmB,EAACC,EAAM/B,IACxB,SAA8BS,KAAWO,GAC9C,GAAIA,EAAK7B,OAASa,EAASlJ,QACzB,MAAM,IAAIV,MAAO,qBAAoB4J,EAASlJ,WAAWwJ,EAAmBN,EAASlJ,gBAAgBiL,YAAef,EAAK7B,UAG3H,GAAI6B,EAAK7B,OAASa,EAASjJ,QACzB,MAAM,IAAIX,MAAO,oBAAmB4J,EAASjJ,WAAWuJ,EAAmBN,EAASjJ,gBAAgBgL,YAAef,EAAK7B,UAG1H,OAAO,IAAI6C,SAAQ,CAAC3B,EAASF,KAC3B,GAAIH,EAAShI,qBAIX,IACEyI,EAAOsB,MAASf,EAAMlB,EAAa,CAACO,UAASF,UAASH,GACvD,CAAC,MAAOiC,GACPC,QAAQC,KAAM,GAAEJ,4GAC6CE,GAE7DxB,EAAOsB,MAASf,GAIhBhB,EAAShI,sBAAuB,EAChCgI,EAASoC,YAAa,EAEtB/B,GACF,MACSL,EAASoC,YAClB3B,EAAOsB,MAASf,GAChBX,KAEAI,EAAOsB,MAASf,EAAMlB,EAAa,CAACO,UAASF,UAASH,GACxD,GAEH,EAmFqB8B,CAAkBH,EAAM3B,EAAS2B,IAC/CE,EAAQrB,EAAWC,EAAQA,EAAOkB,GAAOhB,EAC3C,MAGEkB,EAAQA,EAAMT,KAAKX,QAEhB,GAAqB,iBAAVoB,GAAgC,OAAVA,IAC5BX,EAAeK,EAAUI,IACzBT,EAAelB,EAAU2B,IAInCE,EAAQP,EAAWO,EAAON,EAASI,GAAO3B,EAAS2B,QAC9C,KAAIT,EAAelB,EAAU,KAiBlC,OAXAf,OAAOoD,eAAeb,EAAOG,EAAM,CACjCW,cAAc,EACdC,YAAY,EACZtL,IAAGA,IACMwJ,EAAOkB,GAEhBhI,GAAAA,CAAIkI,GACFpB,EAAOkB,GAAQE,CACjB,IAGKA,EAfPA,EAAQP,EAAWO,EAAON,EAASI,GAAO3B,EAAS,KAgBrD,CAGA,OADAwB,EAAMG,GAAQE,EACPA,CACR,EAEDlI,IAAGA,CAAC+H,EAAaC,EAAME,EAAOD,KACxBD,KAAQH,EACVA,EAAMG,GAAQE,EAEdpB,EAAOkB,GAAQE,GAEV,GAGTQ,eAAcA,CAACX,EAAaC,EAAMa,IACzBC,QAAQJ,eAAeb,EAAOG,EAAMa,GAG7CE,eAAcA,CAAChB,EAAaC,IACnBc,QAAQC,eAAelB,EAAOG,IAcrCD,EAAczC,OAAO7H,OAAOqJ,GAChC,OAAO,IAAIG,MAAMc,EAAaD,EAAS,EAmBnCkB,EAAYC,IAAe,CAC/BC,WAAAA,CAAYpC,EAAQqC,KAAa9B,GAC/BP,EAAOoC,YAAYD,EAAW3L,IAAI6L,MAAc9B,EACjD,EAED+B,YAAWA,CAACtC,EAAQqC,IACXrC,EAAOsC,YAAYH,EAAW3L,IAAI6L,IAG3CE,cAAAA,CAAevC,EAAQqC,GACrBrC,EAAOuC,eAAeJ,EAAW3L,IAAI6L,GACvC,IAGIG,EAA4B,IAAI7D,GAAe0D,GAC3B,mBAAbA,EACFA,EAWF,SAA2BI,GAChC,MAAMC,EAAa7B,EAAW4B,EAAK,GAAmB,CACpDE,WAAY,CACVtM,QAAS,EACTC,QAAS,KAGb+L,EAASK,EACV,IAGGE,EAAoB,IAAIjE,GAAe0D,GACnB,mBAAbA,EACFA,EAoBF,SAAmB1C,EAASkD,EAAQC,GACzC,IAEIC,EAQAC,EAVAC,GAAsB,EAGtBC,EAAsB,IAAI3B,SAAQ3B,IACpCmD,EAAsB,SAASI,GAC7BF,GAAsB,EACtBrD,EAAQuD,EACT,CAAA,IAIH,IACEH,EAASX,EAAS1C,EAASkD,EAAQE,EACpC,CAAC,MAAOK,GACPJ,EAASzB,QAAQ7B,OAAO0D,EAC1B,CAEA,MAAMC,GAA8B,IAAXL,KAxWV5B,EAwWwC4B,IAvWxB,iBAAV5B,GAA4C,mBAAfA,EAAMkC,MADzClC,MA6Wf,IAAe,IAAX4B,IAAoBK,IAAqBJ,EAC3C,OAAO,EA0CT,OAPII,EACiBL,EAEAE,GA9BXI,MAAKC,IAEXT,EAAaS,EAAI,IAChBC,IAGD,IAAI7D,EAGFA,EAFE6D,IAAUA,aAAiB7N,OACF,iBAAlB6N,EAAM7D,SACL6D,EAAM7D,QAEN,+BAGZmD,EAAa,CACXW,mCAAmC,EACnC9D,WACA,IACD+D,OAAMN,IAEP3B,QAAQ+B,MAAM,0CAA2CJ,EAAI,KAc1D,CACR,IAGGO,EAA6BA,EAAEjE,SAAQE,WAAUgE,KACjD3N,EAAcR,QAAQgK,UAIpBxJ,EAAcR,QAAQgK,UAAUE,UAAY5J,EAC9C6J,IAEAF,EAAO,IAAI/J,MAAMM,EAAcR,QAAQgK,UAAUE,UAE1CiE,GAASA,EAAMH,kCAGxB/D,EAAO,IAAI/J,MAAMiO,EAAMjE,UAEvBC,EAAQgE,EACV,EAGIC,EAAqBA,CAACvC,EAAM/B,EAAUuE,KAAoBvD,KAC9D,GAAIA,EAAK7B,OAASa,EAASlJ,QACzB,MAAM,IAAIV,MAAO,qBAAoB4J,EAASlJ,WAAWwJ,EAAmBN,EAASlJ,gBAAgBiL,YAAef,EAAK7B,UAG3H,GAAI6B,EAAK7B,OAASa,EAASjJ,QACzB,MAAM,IAAIX,MAAO,oBAAmB4J,EAASjJ,WAAWuJ,EAAmBN,EAASjJ,gBAAgBgL,YAAef,EAAK7B,UAG1H,OAAO,IAAI6C,SAAQ,CAAC3B,EAASF,KAC3B,MAAMqE,EAAYJ,EAA2BhD,KAAK,KAAM,CAACf,UAASF,WAClEa,EAAKyD,KAAKD,GACVD,EAAgB3H,eAAeoE,EAAK,GACpC,EAGE0D,EAAiB,CACrB9K,SAAU,CACR+K,QAAS,CACPC,kBAAmBjC,EAAUM,KAGjC/M,QAAS,CACP2O,UAAWlC,EAAUU,GACrByB,kBAAmBnC,EAAUU,GAC7BzG,YAAa0H,EAAmBlD,KAAK,KAAM,cAAe,CAACtK,QAAS,EAAGC,QAAS,KAElFyG,KAAM,CACJZ,YAAa0H,EAAmBlD,KAAK,KAAM,cAAe,CAACtK,QAAS,EAAGC,QAAS,MAG9EgO,EAAkB,CACtBlO,MAAO,CAACC,QAAS,EAAGC,QAAS,GAC7BE,IAAK,CAACH,QAAS,EAAGC,QAAS,GAC3B4C,IAAK,CAAC7C,QAAS,EAAGC,QAAS,IAQ7B,OANAJ,EAAYqO,QAAU,CACpBL,QAAS,CAAC,IAAKI,GACfE,SAAU,CAAC,IAAKF,GAChBG,SAAU,CAAC,IAAKH,IAGXzD,EAAW5K,EAAegO,EAAgB/N,EAAY,EAK/DL,EAAOC,QAAUE,EAASR,OAC5B,CAEC,SCxrCWkP,EAkBAC,6BCtBCC,EAAb/F,WAAAA,GAGEK,KAAO2F,SAAG,CAmCZ,CAjCEC,GAAAA,EAAIC,MACFA,EAAKpF,QAAEA,EAAOqF,UAAEA,EAASC,KAAEA,EAAIC,MAAEA,IAGjC,IAAIC,EACJ,OAAQJ,GACN,IAAK,QAcL,QACEI,EAAgB,YAZlB,IAAK,OACHA,EAAgB,OAChB,MACF,IAAK,OACHA,EAAgB,OAChB,MACF,IAAK,QACL,IAAK,WACL,IAAK,QACHA,EAAgB,QAKpB,MAAMC,EAAcF,EAAQ,IAAIA,KAAW,QAE9BlG,IAATiG,EAEFxD,QAAQ0D,GAAe,IAAIH,QAAgBJ,EAAiBS,iBAAiBD,KAAezF,IAAWsF,GAGvGxD,QAAQ0D,GAAe,IAAIH,QAAgBJ,EAAiBS,iBAAiBD,KAAezF,IAEhG,EApCeiF,EAAaS,cAAG,eDGjC,SAAYX,GACRA,EAAA,mBAAA,uBACAA,EAAA,sBAAA,2BACAA,EAAA,uBAAA,2BACAA,EAAA,sBAAA,0BACAA,EAAA,8BAAA,mCACAA,EAAA,+BAAA,oCACAA,EAAA,yBAAA,8BACAA,EAAA,6BAAA,mCACAA,EAAA,iCAAA,uCACAA,EAAA,qCAAA,8CACAA,EAAA,6BAAA,kCACAA,EAAA,0BAAA,+BACAA,EAAA,yBAAA,8BACAA,EAAA,oCAAA,qCACAA,EAAA,qCAAA,4CACH,CAhBD,CAAYA,IAAAA,EAgBX,CAAA,IAED,SAAYC,GACRA,EAAA,UAAA,YACH,CAFD,CAAYA,IAAAA,EAEX,CAAA,UEtBYW,EAGXzG,WAAAA,CAAY0G,GAIZrG,KAAO2F,SAAY,EAHjB3F,KAAKqG,kBAAoBA,CAC3B,CAIAT,GAAAA,EAAIC,MACFA,EAAKpF,QAAEA,EAAOsF,KAAEA,EAAIC,MAAEA,IAEjBhG,KAAKqG,kBAAkBC,WAAWb,EAAac,UAClD,CACEX,IAAK,CACHC,QAAOpF,UAASsF,OAAMC,UAG9B,ECjBF,MAAMQ,EAAyB,CAAC,QAAS,OAAQ,OAAQ,QAAS,WAAY,eAEjEC,EAIX9G,WAAAA,CAAoB+G,GAClB1G,KAAK0G,OAAS,CACZC,SAAUD,GAAQC,UAAY,QAC9BC,QAASF,GAAQE,UAAW,EAC5BC,WAAYH,GAAQG,YAAc,CAAC,IAAInB,GACvCM,MAAOU,GAAQV,OAAS,GAE5B,CAEA,kBAAOc,CAAYJ,GAIjB,OAHKD,EAAOM,WACVN,EAAOM,SAAW,IAAIN,EAAOC,IAExBD,EAAOM,QAChB,CAEAC,SAAAA,CAAUN,GACR1G,KAAK0G,OAAS,IAAK1G,KAAK0G,UAAWA,EACrC,CAEQO,SAAAA,CAAUpB,GAChB,QAAK7F,KAAK0G,OAAOE,SACVJ,EAAWU,QAAQrB,IAAUW,EAAWU,QAAQlH,KAAK0G,OAAOC,SACrE,CAEQQ,gBAAAA,CAAiBtB,EAAiBpF,EAAiBsF,GACzD,MAAO,CACLF,QAEAuB,QAASC,SACT5G,UACAqF,WAAW,IAAIwB,MAAOC,cACtBxB,OACAC,MAAOhG,KAAK0G,OAAOV,MAEvB,CAEQJ,GAAAA,CAAIC,EAAiBpF,EAAiB+G,EAAoBzB,GAChE,IAAK/F,KAAKiH,UAAUpB,GAAQ,OAE5B,MAAM4B,EAAazH,KAAKmH,iBAAiBtB,EAAOpF,EAASsF,GACzD/F,KAAK0G,OAAOG,WACTa,QAAQC,IAAeH,GAAaG,EAAUhC,UAC9CiC,SAASD,GAAcA,EAAU/B,IAAI6B,IAC1C,CAEAI,KAAAA,CAAMpH,EAAiBsF,EAAgByB,GAAY,GACjDxH,KAAK4F,IAAI,QAASnF,EAAS+G,EAAWzB,EACxC,CAEA+B,IAAAA,CAAKrH,EAAiBsF,EAAgByB,GAAY,GAChDxH,KAAK4F,IAAI,OAAQnF,EAAS+G,EAAWzB,EACvC,CAEAvD,IAAAA,CAAK/B,EAAiBsF,EAAgByB,GAAY,GAChDxH,KAAK4F,IAAI,OAAQnF,EAAS+G,EAAWzB,EACvC,CAEAzB,KAAAA,CAAM7D,EAAiBsF,EAAgByB,GAAY,GACjDxH,KAAK4F,IAAI,QAASnF,EAAS+G,EAAWzB,EACxC,CAEAgC,QAAAA,CAAStH,EAAiBsF,EAAgByB,GAAY,GACpDxH,KAAK4F,IAAI,WAAYnF,EAAS+G,EAAWzB,EAC3C,CAEAiC,KAAAA,CAAMvH,EAAiBsF,EAAgByB,GAAY,GACjDxH,KAAK4F,IAAI,QAASnF,EAAS+G,EAAWzB,EACxC,CAEAkC,YAAAA,CAAaN,GACX3H,KAAK0G,OAAOG,WAAW/B,KAAK6C,EAC9B,CAEAO,eAAAA,GACElI,KAAK0G,OAAOG,WAAa,EAC3B,CAEAzO,OAAAA,GACE4H,KAAK0G,OAAOE,SAAU,CACxB,CAEAtO,MAAAA,GACE0H,KAAK0G,OAAOE,SAAU,CACxB,EC7FK,MAAMuB,EAAqB,EAKrBC,EAA+BC,GAJT,IAImDA,EAS/EC,eAAeC,EACpBC,EACAC,EAAwB,CAAE,EAE1BC,GAEA,MAAMC,YACJA,EAAcR,EAAkBS,QAChCA,EAAUR,GACRK,EAEJ,IAAIlI,EAA0B,KAE9B,IAAK,IAAI8H,EAAU,EAAGA,GAAWM,EAAaN,GAAW,EACvD,IAEE,aAAaG,GACd,CAAC,MAAOlE,GACP/D,EAAY+D,EACR+D,EAAUM,SAEN,IAAItG,SAAS3B,IACjBmI,WAAWnI,EAASkI,EAAQP,GAAS,GAG3C,CAQF,GALI9H,GAAakI,EAAQK,QAAUL,EAAQM,eAEzCN,EAAQK,OAAOxE,MAAM,aAAamE,EAAQM,8BAA8BJ,cAAyBpI,GAAW,QAGtFT,IAApB4I,EACF,OAAOA,EAGT,MAAMnI,GAAa,IAAI9J,MAAM,2CAC/B,CC5CA,MAAMuS,EAAMtS,QCGCuS,EAAgB,CAC3BC,YAAa,iBAZbC,WAAY,gBACZC,iBAAkB,sBAClBC,iBAAkB,sBAClBC,gCAAiC,qCACjCC,kBAAmB,uBACnBC,eAAgB,oBAChBC,sBAAuB,2BACvBC,sBAAuB,2BACvBC,qBAAsB,2BAmBXC,EAA+B,mBAC/BC,EAAgC,uBAGhCC,EAA6B,oBAC7BC,EAA4B,mBAC5BC,EAA2B,cAC3BC,EAAsB,UACtBC,EAA6B,yBAC7BC,EAAwC,+BACxCC,EAAkC,sBAClCC,EACH,WADGA,EAEF,YAFEA,EAGO,oBAHPA,EAIQ,qBAJRA,EAMK,kBAQLC,EAAmB,KCnD1BC,EAAgB,eAET/M,EAAU,CACrB,SAAMlG,CAAO2I,GACX,MAAMuK,EAAc,GAAGD,IAAgBtK,IAEvC,aADqBvJ,QAAQ8G,QAAQC,MAAMnG,IAAIkT,IACjCA,IAAqB,IACpC,EAED,SAAMxQ,CAAOiG,EAAaiC,GACxB,MAAMsI,EAAc,GAAGD,IAAgBtK,UACjCvJ,QAAQ8G,QAAQC,MAAMzD,IAAI,CAAEwQ,CAACA,GAActI,GAClD,EAED,YAAMnK,CAAOwH,GACX,MAAMkL,EAAeC,MAAMC,QAAQpL,GAC/BA,EAAKqL,KAAK3K,GAAQ,GAAGsK,IAAgBtK,MACrC,GAAGsK,IAAgBhL,UACjB7I,QAAQ8G,QAAQC,MAAM1F,OAAO0S,EACrC,GClBWI,EAAoBA,IAAMC,iBAQ1BC,EAAezC,MAAO0C,GAA8B,KAC/D,MAAMC,QAAsBzN,EAAQlG,IAAY2S,GAC1CiB,QAAuBL,IACvBM,EAAgBF,IAAkBC,EATnBE,MAerB,OAJIJ,GAAsBG,SAXLC,EAYCF,EAZqC1N,EAAQxD,IAAIiQ,EAAqBmB,IAerFD,CAAa,ECjBhBrC,EAASrC,EAAOK,cAahBjF,EAAQ,CACZ,SAAMvK,CACJ2I,EACAoL,EACAC,EACAC,GAAwB,EACxBC,GAEA,IAAIC,QAAoBjO,EAAQlG,IAAoB2I,GACpD,MAAMyL,EAAaD,EACnB,IAAIE,GAAU,EAMVC,EAAmBN,GAAsBG,GAAaH,oBHwBvB,IGtBnC,GAAIG,GAAenE,KAAKuE,OAAUJ,EAAYK,UAA+B,IAAnBF,IAA6BL,EACrF,MAAO,CACLQ,QAASN,EAAYM,QACrBJ,WAIJ,IACE,MAAMK,QAAmBX,IAEnBY,EAAmBT,EAA2BA,EAAyBQ,GAAc,KACnE,MAApBC,IACFL,EAAmBK,GAGrBR,QAAoBzL,KAAKhG,IAAIiG,EAAK+L,EAAYJ,EAC/C,CAAC,MAAOM,GACPpD,EAAOxE,MAAM,6BAA8B,CAAEA,MAAO4H,IACpDP,GAAU,CACZ,CAEA,MAAO,CACLI,QAASN,GAAaM,SAAWL,GAAYK,QAC7CJ,UAEH,EAED,SAAM3R,CAAOiG,EAAa8L,EAAYT,GACpC,MAAMa,EAAqBb,GHNQ,IGO7BG,EAAc,CAClBM,UACAD,UAAWxE,KAAKuE,MAChBP,mBAAoBa,GAItB,aADM3O,EAAQxD,IAAoBiG,EAAKwL,GAChCA,CACR,EAED,WAAMvU,CAAM+I,SACJzC,EAAQzF,OAAOkI,EACvB,SC1DWmM,EAAbzM,WAAAA,GACUK,KAAAqM,UAA6C,IAAIC,IACjDtM,KAAAuM,kBAAwC,IAAIC,GA+GtD,CA7GSC,EAAAA,CAAGC,EAAiBC,GACzB,OAAO3M,KAAKkD,YAAYwJ,EAASC,GAAU,EAC7C,CAEOC,IAAAA,CAAKF,EAAiBC,GAC3B,OAAO3M,KAAKkD,YAAYwJ,EAASC,GAAU,EAC7C,CAEOE,GAAAA,CAAIH,EAAiBC,GAC1B,IAAKA,EAKH,OAJA3M,KAAKqM,UAAUS,OAAOJ,QACtB1M,KAAKuM,kBAAoB,IAAIC,IAC3B9B,MAAMqC,KAAK/M,KAAKuM,mBAAmB7E,QAAQsF,GAAUA,EAAMN,UAAYA,MAK3E,GAAIA,EAAQO,SAAS,KACnBjN,KAAKuM,kBAAoB,IAAIC,IAC3B9B,MAAMqC,KAAK/M,KAAKuM,mBAAmB7E,QAChCsF,KAAYA,EAAMN,UAAYA,GAAWM,EAAML,WAAaA,UAG5D,CACL,MAAMN,EAAYrM,KAAKqM,UAAU/U,IAAIoV,GACrC,GAAIL,EAAW,CACb,MAAMa,EAAWxC,MAAMqC,KAAKV,GAAW3E,QAAQsF,GAAUA,EAAML,WAAaA,IACxEO,EAAS1N,OAAS,EACpBQ,KAAKqM,UAAUrS,IAAI0S,EAAS,IAAIF,IAAIU,IAEpClN,KAAKqM,UAAUS,OAAOJ,EAE1B,CACF,CACF,CAEOS,IAAAA,CAAKC,GACV,MAAMC,EAAiBrN,KAAKqM,UAAU/U,IAAI8V,EAAME,OAAS,IAAId,IACvDe,EAAkB,IAAIf,IAE5B,IAAK,MAAMrJ,KAAYkK,EACrBE,EAAgBC,IAAIrK,GAGtB,IAAK,MAAMA,KAAYnD,KAAKuM,kBACtBvM,KAAKyN,eAAeL,EAAME,KAAMnK,EAASuJ,UAC3Ca,EAAgBC,IAAIrK,GAIxB,IAAK,MAAMA,KAAYoK,EACrBpK,EAASwJ,SAASS,GAEdjK,EAASyJ,MACX5M,KAAKqD,eAAeF,EAG1B,CAEOjM,KAAAA,GACL8I,KAAKqM,UAAUnV,QACf8I,KAAKuM,kBAAkBrV,OACzB,CAEQgM,WAAAA,CAAYwJ,EAAiBC,EAA+BC,GAClE,MAAMI,EAAuB,CAAEN,UAASC,WAAUC,QAElD,GAAIF,EAAQO,SAAS,KACnBjN,KAAKuM,kBAAkBiB,IAAIR,OACtB,CACL,MAAMU,EAAmB1N,KAAKqM,UAAU/U,IAAIoV,GACxCgB,EACFA,EAAiBF,IAAIR,GAErBhN,KAAKqM,UAAUrS,IAAI0S,EAAS,IAAIF,IAAI,CAACQ,IAEzC,CAEA,MAAO,IAAMhN,KAAK6M,IAAIH,EAASC,EACjC,CAEQtJ,cAAAA,CAAeF,GACrB,GAAIA,EAASuJ,QAAQO,SAAS,KAC5BjN,KAAKuM,kBAAkBO,OAAO3J,OACzB,CACL,MAAMkJ,EAAYrM,KAAKqM,UAAU/U,IAAI6L,EAASuJ,SAC1CL,IACFA,EAAUS,OAAO3J,GACM,IAAnBkJ,EAAUsB,MACZ3N,KAAKqM,UAAUS,OAAO3J,EAASuJ,SAGrC,CACF,CAEQe,cAAAA,CAAeH,EAAcZ,GACnC,GAAgB,MAAZA,EAAiB,OAAO,EAE5B,MAAMkB,EAAQlB,EACXmB,MAAM,KACNjD,KAAKkD,GACS,MAATA,EAAqB,QACZ,OAATA,EAAsB,KACnBA,EAAKC,QAAQ,sBAAuB,UAE5CC,KAAK,OAER,OAAO,IAAIC,OAAO,IAAIL,MAAUM,KAAKZ,EACvC,EC5HI,SAAUa,EAASC,EAAiBC,EAAiBf,EAAe,IACxE,MAAMgB,EAAsB,GAE5B,GAAIF,IAAWC,EACb,OAAOC,EAGT,GAAIC,EAAYH,IAAWG,EAAYF,GAIrC,OAHID,IAAWC,GACbC,EAAMxJ,KAAK,CAAEwI,KAAMA,GAAQ,OAAQkB,SAAUJ,EAAQK,SAAUJ,IAE1DC,EAGT,GAAI5D,MAAMC,QAAQyD,IAAW1D,MAAMC,QAAQ0D,GAIzC,OAHIK,KAAKC,UAAUP,KAAYM,KAAKC,UAAUN,IAC5CC,EAAMxJ,KAAK,CAAEwI,KAAMA,GAAQ,OAAQkB,SAAUJ,EAAQK,SAAUJ,IAE1DC,EAGT,GAAIM,EAASR,IAAWQ,EAASP,GAAS,CACxC,MAAMQ,EAAeT,EACfU,EAAeT,EACfU,EAAU,IAAIvC,IAAI,IAAIlN,OAAOC,KAAKsP,MAAkBvP,OAAOC,KAAKuP,KAEtE,IAAK,MAAM7O,KAAO8O,EAAS,CACzB,MAAMC,EAAc1B,EAAO,GAAGA,KAAQrN,IAAQA,EACxCuO,EAAWK,EAAa5O,GACxBwO,EAAWK,EAAa7O,GAE9B,GAAMA,KAAO4O,EAEN,GAAM5O,KAAO6O,EAEb,CACL,MAAMG,EAAcd,EAASK,EAAUC,EAAUO,GACjDV,EAAMxJ,QAAQmK,EAChB,MAJEX,EAAMxJ,KAAK,CAAEwI,KAAM0B,EAAaR,WAAUC,cAAU3O,SAFpDwO,EAAMxJ,KAAK,CAAEwI,KAAM0B,EAAaR,cAAU1O,EAAW2O,YAOzD,CACF,MAAWL,IAAWC,GACpBC,EAAMxJ,KAAK,CAAEwI,KAAMA,GAAQ,OAAQkB,SAAUJ,EAAQK,SAAUJ,IAGjE,OAAOC,CACT,CAEA,SAASC,EAAYrM,GACnB,OAAOA,SAA0D,iBAAVA,CACzD,CAEA,SAAS0M,EAAS1M,GAChB,OAAiB,OAAVA,GAAmC,iBAAVA,IAAuBwI,MAAMC,QAAQzI,EACvE,CCnDA,IAAYgN,GAAZ,SAAYA,GACVA,EAAA,OAAA,SACAA,EAAA,KAAA,OACAA,EAAuB,UAAA,WACxB,CAJD,CAAYA,IAAAA,EAIX,CAAA,UAsBYC,EASXxP,WAAAA,CAAY8I,EAA0C,IAR9CzI,KAAAoP,MAAsBF,EAAaG,OACnCrP,KAAQsP,SAAoB,GAC5BtP,KAAeuP,gBAAG,EAClBvP,KAAawP,cAAG,EAGPxP,KAAM8I,OAAGrC,EAAOK,YAAY,CAAEH,SAAU,SAGvD3G,KAAKyI,QAAU,CACbgH,iBAAkB,EAClBC,gBAAiB,IACjBC,iBAAkB,IAClBC,iBAAkB,EAClBC,WAAY,2BACTpH,GAELzI,KAAK6P,WAAa7P,KAAKyI,QAAQoH,UACjC,CAMO,gBAAMC,SACL9P,KAAK+P,iBACb,CAMO,mBAAatY,CAAOgR,EAA0C,IACnE,MAAM1B,EAAW,IAAIoI,EAAe1G,GAEpC,aADM1B,EAAS+I,aACR/I,CACT,CAEQ,qBAAMgJ,GACZ,IACE,GAAsB,oBAAXzZ,QAA0BA,OAAOkH,SAAWlH,OAAOkH,QAAQC,MAAO,CAC3E,MACMuS,SADe1Z,OAAOkH,QAAQC,MAAMnG,IAAI0I,KAAK6P,aACzB7P,KAAK6P,YAE3BG,IACFhQ,KAAKoP,MAAQY,EAAWZ,MACxBpP,KAAKsP,SAAWU,EAAWV,UAAY,GACvCtP,KAAKuP,gBAAkBS,EAAWT,iBAAmB,EACrDvP,KAAKwP,cAAgBQ,EAAWR,eAAiB,EAGjDxP,KAAKiQ,qBAET,MAAO,GAA4B,oBAAjBC,aAA8B,CAE9C,MAAMF,EAAaE,aAAaC,QAAQnQ,KAAK6P,YAC7C,GAAIG,EAAY,CACd,MAAMI,EAAc1B,KAAK2B,MAAML,GAC/BhQ,KAAKoP,MAAQgB,EAAYhB,MACzBpP,KAAKsP,SAAWc,EAAYd,UAAY,GACxCtP,KAAKuP,gBAAkBa,EAAYb,iBAAmB,EACtDvP,KAAKwP,cAAgBY,EAAYZ,eAAiB,EAGlDxP,KAAKiQ,oBACP,CACF,CACD,CAAC,MAAO3L,GACPtE,KAAK8I,OAAOtG,KAAK,qDAAsD8B,EAEzE,CACF,CAEQ,mBAAMgM,GACZ,IACE,MAAMC,EAAmC,CACvCnB,MAAOpP,KAAKoP,MACZE,SAAUtP,KAAKsP,SACfC,gBAAiBvP,KAAKuP,gBACtBC,cAAexP,KAAKwP,eAGA,oBAAXlZ,QAA0BA,OAAOkH,SAAWlH,OAAOkH,QAAQC,YAC9DnH,OAAOkH,QAAQC,MAAMzD,IAAI,CAAE,CAACgG,KAAK6P,YAAaU,IACnB,oBAAjBL,cAEhBA,aAAaM,QAAQxQ,KAAK6P,WAAYnB,KAAKC,UAAU4B,GAExD,CAAC,MAAOjM,GACPtE,KAAK8I,OAAOtG,KAAK,mDAAoD8B,EAEvE,CACF,CAEQ2L,kBAAAA,GACN,MAAMpE,EAAMvE,KAAKuE,MACjB7L,KAAKsP,SAAWtP,KAAKsP,SAAS5H,QAC3B+I,GAAY5E,EAAM4E,EAAQ3K,WAAa9F,KAAKyI,QAAQkH,kBAEzD,CAEA,aAAMe,CAAWlI,EAA6BmI,GAC5C,GAAI3Q,KAAKoP,QAAUF,EAAa0B,KAAM,CACpC,IAAI5Q,KAAK6Q,wBAIF,CACL,GAAIF,EACF,OAAOA,IAET,MAAM,IAAIla,MAAM,4DAClB,CAREuJ,KAAKoP,MAAQF,EAAa4B,UAC1B9Q,KAAKwP,cAAgB,QACfxP,KAAKsQ,eAOf,CAEA,GAAItQ,KAAKoP,QAAUF,EAAa4B,UAAW,CACzC,GAAI9Q,KAAKwP,eAAiBxP,KAAKyI,QAAQmH,iBACrC,MAAM,IAAInZ,MAAM,iDAElBuJ,KAAKwP,eAAiB,QAChBxP,KAAKsQ,eACb,CAEA,IACE,MAAMxM,QAAe0E,IAErB,aADMxI,KAAK+Q,YACJjN,CACR,CAAC,MAAOQ,GAEP,YADMtE,KAAKgR,UAAU1M,GACfA,CACR,CACF,CAEQ,eAAMyM,GACR/Q,KAAKoP,QAAUF,EAAa4B,YAC9B9Q,KAAKoP,MAAQF,EAAaG,OAC1BrP,KAAKsP,SAAW,SACVtP,KAAKsQ,gBAEf,CAEQ,eAAMU,CAAU1M,GACtB,MAAMuH,EAAMvE,KAAKuE,MACjB7L,KAAKuP,gBAAkB1D,EAGvB7L,KAAKsP,SAASxK,KAAK,CACjBgB,UAAW+F,EACXvH,MAAOA,EAAM7D,UAIfT,KAAKsP,SAAWtP,KAAKsP,SAAS5H,QAC3B+I,GAAY5E,EAAM4E,EAAQ3K,WAAa9F,KAAKyI,QAAQkH,mBAInD3P,KAAKsP,SAAS9P,QAAUQ,KAAKyI,QAAQgH,mBACvCzP,KAAKoP,MAAQF,EAAa0B,YAGtB5Q,KAAKsQ,eACb,CAEQO,qBAAAA,GACN,OAAOvJ,KAAKuE,MAAQ7L,KAAKuP,iBAAmBvP,KAAKyI,QAAQiH,eAC3D,CAEOuB,QAAAA,GACL,OAAOjR,KAAKoP,KACd,CAEO8B,eAAAA,GACL,MAAMrF,EAAMvE,KAAKuE,MACjB,OAAO7L,KAAKsP,SAAS5H,QAClB+I,GAAY5E,EAAM4E,EAAQ3K,WAAa9F,KAAKyI,QAAQkH,mBACrDnQ,MACJ,CAEO,WAAM2R,GACXnR,KAAKoP,MAAQF,EAAaG,OAC1BrP,KAAKsP,SAAW,GAChBtP,KAAKuP,gBAAkB,EACvBvP,KAAKwP,cAAgB,QACfxP,KAAKsQ,eACb,CAMO,kBAAMc,GACW,oBAAX9a,QAA0BA,OAAOkH,SAAWlH,OAAOkH,QAAQC,YAC9DnH,OAAOkH,QAAQC,MAAM1F,OAAOiI,KAAK6P,YACN,oBAAjBK,cAChBA,aAAamB,WAAWrR,KAAK6P,WAEjC,CAEOyB,SAAAA,GAKL,MAAO,CACLlC,MAAOpP,KAAKoP,MACZmC,aAAcvR,KAAKkR,kBACnBM,gBAAiBxR,KAAKoP,QAAUF,EAAa0B,KACzC5Q,KAAKuP,gBAAkBvP,KAAKyI,QAAQiH,gBACpC,KAER,ECrOF,MAAM+B,EAAkB,sDAUXC,EAYX/R,WAAAA,CAA6BgS,GAAA3R,KAAa2R,cAAbA,EAXrB3R,KAAa4R,cAAmC,KAChD5R,KAAY6R,aAAkC,KAC9C7R,KAAY8R,aAA4B,KAExC9R,KAA2B+R,4BAAkB,KAC7C/R,KAA4BgS,6BAAkB,KACrChS,KAAAiS,aAAe,IAAI7F,EAG5BpM,KAAakS,eAAG,EAGtBlS,KAAKmS,sBAAwB,IAAIhD,EAAe,CAC9CM,iBAAkB,EAClBC,gBAAiB,IACjBC,iBAAkB,IAClBE,WAAY,8BAA8B8B,MAE5C3R,KAAKoS,qBAAuB,IAAIjD,EAAe,CAC7CM,iBAAkB,EAClBC,gBAAiB,IACjBC,iBAAkB,IAClBE,WAAY,6BAEhB,CAMO,gBAAMC,GACP9P,KAAKkS,sBAEH7P,QAAQgQ,IAAI,CAChBrS,KAAKmS,sBAAsBrC,aAC3B9P,KAAKoS,qBAAqBtC,eAG5B9P,KAAKkS,eAAgB,EACvB,CAEQI,iBAAAA,GACN,IAAKtS,KAAKkS,cACR,MAAM,IAAIzb,MAAM,oGAEpB,CAEQ8b,eAAAA,GACN,MAAO,CACL3J,QAAUP,GAAY,IAAOA,EAC7BM,YAAa,EAEjB,CAEQ,wBAAM6J,GACZ,MAAMC,QAAoBlK,GACxBD,UACE,MAAM0D,QAAmB0G,MAAM,GAAGjB,IAAkBzR,KAAK2R,qBAAsB,CAAE9P,MAAO,aACxF,IAAKmK,EAAW2G,GACd,MAAM,IAAIlc,MAAM,mCAAmCuV,EAAW4G,cAEhE,OAAO5G,EAAW6G,MAAM,GAE1B7S,KAAKuS,mBAGP,IAAKE,EACH,MAAM,IAAIhc,MAAM,oDAIlB,OADAuJ,KAAKgS,6BAA+BS,EAAYK,uBAAyB9S,KAAKgS,6BACvES,CACT,CAEQ,uBAAMM,GACZ,MACM/G,QAAmBzD,GACvBD,UACE,MAAM0K,QAAuBN,MAAM,GAAGjB,eAAkC,CAAE5P,MAAO,aACjF,IAAKmR,EAAeL,GAClB,MAAM,IAAIlc,MAAM,iDAAiDuc,EAAeC,WAAWD,EAAeJ,cAE5G,OAAOI,EAAeH,MAAM,GAE9B7S,KAAKuS,mBAGP,IAAKvG,EACH,MAAM,IAAIvV,MAAM,kDAAmDuV,GAIrE,OADAhM,KAAK+R,4BAA8B/F,EAAW8G,uBAAyB9S,KAAK+R,4BACrE/F,CACT,CAEO,qBAAMkH,GACX,OAAOlT,KAAK8R,YACd,CAEO,eAAMqB,CAAUC,GAAsC,GAC3DpT,KAAKsS,oBAEL,IAAInH,GAAgB,EAEhBiI,IACFjI,QAAsBJ,KAGxB,MAAO6G,EAAeC,SAAsBxP,QAAQgQ,IAAI,CACtDxQ,EAAMvK,IACJwS,EACA9J,KAAKwS,mBAAmB/Q,KAAKzB,MAC7BA,KAAKgS,6BACL7G,GACCzE,GAAWA,GAAQoM,uBAAyB,OAE/CjR,EAAMvK,IACJyS,EACA/J,KAAK+S,kBAAkBtR,KAAKzB,MAC5BA,KAAK+R,4BACL5G,GACCzE,GAAWA,GAAQoM,uBAAyB,SAIjD,IAAKjB,EAAa9F,QAAS,MAAM,IAAItV,MAAM,6BAC3C,IAAKmb,EAAc7F,QAAS,MAAM,IAAItV,MAAM,8BAE5CuJ,KAAK4R,cAAgBA,EAAc7F,QACnC/L,KAAK6R,aAAeA,EAAa9F,QAGjC,MAAMsH,EAAgBrT,KAAKsT,aACzB5E,KAAK2B,MAAM3B,KAAKC,UAAU3O,KAAK6R,eAC/BnD,KAAK2B,MAAM3B,KAAKC,UAAU3O,KAAK4R,iBAGjC,IAAKyB,EAAe,MAAM,IAAI5c,MAAM,iCAQpC,MCpKqC8c,EACvCC,EACA3B,EACAD,KAGA,MAGM6B,EAAqB,IAHF5B,EAAa4B,oBAAsB,MAClC7B,EAAc6B,oBAAsB,IAG9DD,EAAkBC,mBAAqBA,CAAkB,EDqJvDF,CAA0BF,EAAerT,KAAK6R,aAAc7R,KAAK4R,eAGjE5R,KAAK0T,kBAAkBL,GAEhBA,CACT,CAEO,gBAAMM,GACX3T,KAAKsS,0BAECjQ,QAAQgQ,IAAI,CAChBxQ,EAAM3K,MAAM4S,GACZjI,EAAM3K,MAAM6S,KAGd/J,KAAK4R,cAAgB,KACrB5R,KAAK6R,aAAe,KACpB7R,KAAK8R,aAAe,KACpB9R,KAAKiS,aAAa/a,cAGZmL,QAAQgQ,IAAI,CAChBrS,KAAKmS,sBAAsBhB,QAC3BnR,KAAKoS,qBAAqBjB,SAE9B,CAEOyC,uBAAAA,GAML,OAFA5T,KAAKsS,oBAEE,CACLuB,QAAS7T,KAAKmS,sBAAsBb,YACpCwC,OAAQ9T,KAAKoS,qBAAqBd,YAEtC,CASQgC,YAAAA,CACNzB,EACAD,GAEA,IAAKA,EAAe,OAAOC,EAC3B,IAAKA,EAAc,OAAOD,EAE1B,MAAM9N,EAA8B,IAAK+N,GAgCzC,OA9BAvS,OAAOC,KAAKqS,GAAehK,SAAS3H,IAClC,IAAKX,OAAOoC,UAAUH,eAAeD,KAAKsQ,EAAe3R,GAAM,OAE/D,MAAM8T,EAAsBlC,EAAqC5R,GAC3D+T,EAAuBpC,EAAsC3R,QAGvCH,IAAxBkU,IAGAtJ,MAAMC,QAAQqJ,GAChBlQ,EAAO7D,GAAO,IAAI+T,GAgBpBlQ,EAAO7D,GAVmB,OAAxB+T,GACkC,iBAAxBA,GACgB,OAAvBD,GAC8B,iBAAvBA,EAOEC,EALEhU,KAAKsT,aAAaS,EAAoBC,GAKrB,IAG5BlQ,CACT,CASO2I,EAAAA,CAAGC,EAAiBC,GACzB,OAAO3M,KAAKiS,aAAaxF,GAAGC,EAASC,EACvC,CAQOC,IAAAA,CAAKF,EAAiBC,GAC3B,OAAO3M,KAAKiS,aAAarF,KAAKF,EAASC,EACzC,CAOOE,GAAAA,CAAIH,EAAiBC,GAC1B3M,KAAKiS,aAAapF,IAAIH,EAASC,EACjC,CAEQ+G,iBAAAA,CAAkBO,GACxB,IAAKjU,KAAK8R,aASR,OAPA9R,KAAK8R,aAAemC,OACpBjU,KAAKiS,aAAa9E,KAAK,CACrBG,KAAM,OACNkB,SAAU,KACVC,SAAUwF,EACVvN,OAAQuN,IAMZ,MAAM3F,EAAQH,EAASnO,KAAK8R,aAAcmC,GAC1C,IAAK,MAAMC,KAAQ5F,EACjBtO,KAAKiS,aAAa9E,KAAK,CACrBG,KAAM4G,EAAK5G,KACXkB,SAAU0F,EAAK1F,SACfC,SAAUyF,EAAKzF,SACf/H,OAAQuN,IAIZjU,KAAK8R,aAAemC,CACtB,QE9SWE,EAWXxU,WAAAA,CAAYgS,EAAuByC,EAAoCC,EAAwCC,EAA0B,IAsBzItU,KAAAuU,MAAQjM,MACPkM,EAAcC,EAAqBC,EAAmBC,GAAqB,EAAOC,GAA0B,KAC3G,MAAMxH,EAAoB,CACxByG,QAAS,UAAU7T,KAAK6U,iBACxBL,YACAM,UAAW,CACTC,OAAQJ,OAAY7U,EAAYE,KAAKgV,cAAcC,MAAMze,GACzD0e,WAAYrK,IACZ4J,gBACGC,IAIP,IACE,MAAMS,EAAkBzG,KAAKC,UAAUvB,GAAO,CAACgI,EAAMlT,IAC/CA,aAAiBzL,MACZ,CACL2L,KAAMF,EAAME,KACZ3B,QAASyB,EAAMzB,QACf4U,MAAOnT,EAAMmT,OAGVnT,IAGHoT,QAAkBtV,KAAKuV,eAC7B,OAAID,QACmBtV,KAAKwV,eAAeF,EAAWH,EAAiB/H,EAAOwH,IAI9E5U,KAAKyV,QAAQ3N,KAAK,gEAAiEsF,GAAO,IACnF,EACR,CAAC,MAAO9I,GAGP,OADAtE,KAAKyV,QAAQnR,MAAM,4DAA6D,CAAEA,QAAO8I,UAAS,IAC3F,CACT,GAsCMpN,KAAgB0V,iBAAGpN,UACzB,MAAMjN,QAAgBmC,EAAQlG,IAAyB8S,GAGjDuL,EC7GiBC,KACzB,MAAM/J,EAAM,IAAIvE,KAGhB,OAFAuE,EAAIgK,QAAQhK,EAAIiK,UAAiB,GAAJF,EAAS,KAE/B/J,EAAIiK,SAAS,EDyGGC,EAAY/V,KAAKgW,0BAEhCC,GAAiB5a,GAAW,IAC/BqM,QAAQwO,GAAMA,EAAEC,UAAYR,IAI/B,aAFMnY,EAAQxD,IAAIoQ,EAAiC6L,GAE5CA,CAAY,EAGbjW,KAAAoW,qBAAuB9N,MAAO6M,EAAyBP,MACzDA,WAEkB5U,KAAK0V,oBAEXW,MAAMrJ,GAAUA,EAAM0H,UAAYS,IAG5CnV,KAAAsW,mBAAqBhO,UAC3B,MAAMjN,QAAgB2E,KAAK0V,mBAE3Bra,EAAQyJ,KAAK,CACXqR,UAAW7O,KAAKuE,MAChB6I,QAASS,UAGL3X,EAAQxD,IAAIoQ,EAAiC/O,EAAQ,EA9H3D2E,KAAK6U,eAAiBlD,EACtB3R,KAAKgV,aAAeZ,EACpBpU,KAAKgW,yBAA2B1B,EAChCtU,KAAKyV,QAAUhP,EAAOK,YAAY,CAAEd,MAAO,cAC3ChG,KAAKuW,eAAiBlC,CACxB,CAwDQ,oBAAMmB,CAAeF,EAAmBH,EAC9C/H,EAA2BwH,GAC3B,SAAU5U,KAAKoW,qBAAqBjB,EAAiBP,GAAiB,CACpE,MAAM9Q,QAAe4O,MAAM4C,EAAW,CACpCkB,QAAS,CACP,eAAgB,oBAElBzV,OAAQ,OACR0V,KAAMtB,EACNtT,MAAO,aAGT,OAAKiC,EAAO6O,UASN3S,KAAKsW,mBAAmBnB,IACvB,IATLnV,KAAKyV,QAAQnR,MAAM,0DAA2D,CAC5E2O,OAAQnP,EAAOmP,OACfL,WAAY9O,EAAO8O,WACnBxF,UACC,IAEI,EAIX,CAGA,OADApN,KAAKyV,QAAQ3N,KAAK,+DAAgEsF,GAAO,IAClF,CACT,CAEQ,kBAAMmI,GAEZ,MAAM7O,QAAe1G,KAAKuW,eAAerD,kBACzC,OAAOxM,GAAQ4O,SACjB,EAnFOnB,EAAA7N,WAAagC,MAA2BkM,EAAcM,EAAoBH,GAAqB,EAAOC,GAA0B,WVRlItM,eACL7H,GAMA,aAAauI,EAAIzS,QAAQ0G,YAAYwD,EACvC,CUCUxD,CAAY,CAChByZ,KAAMzN,EAAcC,YACpBwL,QAAS,CACPF,YAAWM,YAAWH,YAAWC,mBAGnC,QE7BO+B,EAKXhX,WAAAA,CAAY2G,EAAgCwC,GAC1C9I,KAAK4W,UAAY,KACjB5W,KAAKsG,WAAaA,EAClBtG,KAAK8I,OAASA,CAChB,CAEO,gBAAMgH,GACX,MAAM+G,QAA8BrZ,EAAQlG,IAAYuS,GACpDgN,IACF7W,KAAK4W,UAAYC,EAErB,CAEQC,QAAAA,GAEN,OADc,IAAIxP,MACLC,cAAcsG,MAAM,KAAK,EACxC,CAEO,WAAMkJ,GACX,IACE,MAAMC,EAAkBhX,KAAK4W,WAAa,EACpCK,EAAQjX,KAAK8W,YACGE,EAAkB,IAAI1P,KAAK0P,GAAiBzP,cAAcsG,MAAM,KAAK,GAAK,QAE1EoJ,IACpBjX,KAAK4W,UAAYtP,KAAKuE,YAEhBrO,EAAQxD,IAAI6P,EAA+B7J,KAAK4W,iBAChD5W,KAAKsG,WACTd,EAAW0R,yBACX,CAAEC,SAAUzgB,QAAQiF,KAAKyb,kBAG9B,CAAC,MAAO9S,GAEPtE,KAAK8I,OAAOxE,MAAM,sBAAuB,CAAEA,MAAOA,aAAiB7N,MAAQ6N,EAAM7D,QAAU,kBAAmB,EAChH,CACF,ECnCF,IAAY4W,GAAZ,SAAYA,GAERA,EAAAA,EAAA,QAAA,GAAA,UACAA,EAAAA,EAAA,MAAA,GAAA,QACAA,EAAAA,EAAA,SAAA,GAAA,WACAA,EAAAA,EAAA,QAAA,GAAA,UACAA,EAAAA,EAAA,aAAA,GAAA,cACH,CAPD,CAAYA,IAAAA,EAOX,CAAA,UA4BYC,EAKX3X,WAAAA,CACE4X,EACA7Q,EACAoC,GAEA9I,KAAKuX,SAAWA,EAChBvX,KAAK0G,OAASA,EACd1G,KAAK8I,OAASA,CAChB,CAOO,iCAAM0O,CACXC,EACAC,GAEA,IACE,MAAMC,EAAc,IAAIC,gBAAgBF,GAAwCG,WAC1E5T,QAAiByO,MAAM,GAAG1S,KAAK0G,OAAOoR,UAAUC,WAAW/X,KAAK0G,OAAOoR,UAAUE,kCAAkCL,IAAe,CACtI5W,OAAQ,MACRyV,QAAS,CACP,eAAgB,mBAChB,uBAAwBiB,KAI5B,IAAKxT,EAAS0O,GACZ,MAAM,IAAIlc,MAAM,6CAA6CwN,EAASgP,WAAWhP,EAAS2O,cAI5F,aAD4C3O,EAAS4O,MAEtD,CAAC,MAAOvO,GAEP,MADAtE,KAAK8I,OAAOxE,MAAM,qEAAsE,CAAEA,UACpFA,CACR,CACF,CASO,iCAAM2T,CACXC,EACAT,GAEA,IACE,MAAMxT,QAAiByO,MAAM,GAAG1S,KAAK0G,OAAOoR,UAAUC,WAAW/X,KAAK0G,OAAOoR,UAAUK,oCAAoCnY,KAAKuX,WAAY,CAC1IxW,OAAQ,MACRyV,QAAS,CACP,eAAgB,mBAChB,gBAAiB,gBACjB,uBAAwBiB,GAAsB,IAEhDhB,KAAM/H,KAAKC,UAAUuJ,KAGvB,IAAKjU,EAAS0O,GAEZ,MADA3S,KAAK8I,OAAOxE,MAAM,wDAAwDL,EAASgP,WAAWhP,EAAS2O,cACjG,IAAInc,MAAM,wDAAwDwN,EAASgP,WAAWhP,EAAS2O,cAEvG5S,KAAK8I,OAAOhB,KAAK,sEAEjB,MAAMhE,QAAyCG,EAAS4O,OAClDuF,EAA8BnU,EAASuS,QAAQlf,IAAI,wBAEzD,MAAO,CACL+gB,WAAY,IACPvU,EACHwU,QAAS,CACPC,IAAKzU,EAAO0U,gBACZC,aAAc3U,EAAO4U,oCACrBtW,UAAMtC,IAGV6Y,YAAaP,EAEhB,CAAC,MAAO9T,GAEP,MADAtE,KAAK8I,OAAOxE,MAAM,uDAAwD,CAAEA,UAAS,GAC/EA,CACR,CACF,QC3IWsU,EAMXjZ,WAAAA,CAAYkZ,EAA0C/P,GACpD9I,KAAK8Y,qBAAuBD,EAC5B7Y,KAAKyV,QAAU3M,EACf9I,KAAKiV,KAAO,IACd,CAOO,eAAM8D,SACLvb,EAAQzF,OAAOoS,SACf3M,EAAQzF,OAAOmS,EACvB,CAEO,gBAAM8O,CAAWV,EAA6B7D,GACnD,IAAIwE,QAAoBjZ,KAAKkZ,YAE7B,IACE,MAAMC,EAAkB,CACtBX,gBAAiBF,GAASC,IAC1BG,oCAAqCJ,GAASG,aAC9CW,SAAU3E,GAIZ,UAAYzU,KAAKqZ,yBAAyBJ,EAAaE,GAAmB,OAAOF,EAEjF,MAAMK,QAAgC9b,EAAQlG,IAAY6S,IACpDkO,WAAEA,EAAUM,YAAEA,SAAsB3Y,KAAK8Y,qBAAqBb,4BAA4BkB,EAAiBG,GAC7GX,SAAmBnb,EAAQxD,IAAImQ,EAAuCwO,GACtEN,UACI7a,EAAQxD,IAAIkQ,EAA4BmO,GAC9CY,EAAcZ,EAEjB,CAAC,MAAO/T,GACPtE,KAAKyV,QAAQnR,MAAM,0CAA2CA,EAChE,CAGA,OADAtE,KAAKiV,KAAOgE,EACLA,CACT,CAOO,eAAMC,GACX,MAAMjE,QAAazX,EAAQlG,IAA6B4S,GAGxD,OAFAlK,KAAKiV,KAAOA,EAELA,CACT,CAEQ,8BAAMoE,CACZJ,EACAf,GAEA,OAEGe,GAEIA,EAAYX,SAASC,MAAQL,EAAeM,iBAAmBS,EAAYX,SAASG,eAAiBP,EAAeQ,qCAEpHO,EAAYG,WAAalB,EAAekB,QAEjD,QC3EWG,EAOX5Z,WAAAA,CACE6Z,EACAC,EACAC,EACAC,EACA7Q,GAEA9I,KAAKwZ,SAAWA,EAChBxZ,KAAKyZ,QAAUA,EACfzZ,KAAK0Z,UAAYA,EACjB1Z,KAAK2Z,QAAUA,EACf3Z,KAAKyV,QAAU3M,CACjB,CAEO,uBAAM8Q,GACX,IACE,MAAM3V,QAAiByO,MAAM1S,KAAK0Z,UAAW,CAC3C3Y,OAAQ,OACR0V,KAAM/H,KAAKC,UAAU,IACrB6H,QAAS,CACP,eAAgB,mBAChB,YAAaxW,KAAKwZ,SAClB,YAAaxZ,KAAKyZ,WAGtB,GAAIxV,EAAS0O,GAAI,OAAO1O,EAAS4O,OACjC,MAAM,IAAIpc,MAAM,wCAAwCuJ,KAAK0Z,qBAAqBzV,EAASgP,WAAWhP,EAAS2O,aAChH,CAAC,MAAO1O,GAEP,MADAlE,KAAKyV,QAAQnR,MAAM,sCAAuC,CAAEJ,QACtDA,CACR,CACF,CAEO,sBAAM2V,GACX,IACE,MAAMC,EAAM,GAAG9Z,KAAK2Z,WAAW3Z,KAAKyZ,0BAC9BxV,QAAiByO,MAAMoH,GAC7B,GAAI7V,EAAS0O,GAAI,OAAO1O,EAAS4O,OACjC,MAAM,IAAIpc,MAAM,uCAAuCqjB,aAAe7V,EAASgP,WAAWhP,EAAS2O,aACpG,CAAC,MAAO1O,GAEP,MADAlE,KAAKyV,QAAQnR,MAAM,qCAAsC,CAAEJ,QACrDA,CACR,CACF,CAEO,wBAAM6V,GACX,MAAMD,EAAM,GAAG9Z,KAAK2Z,WAAW3Z,KAAKyZ,8BAEpC,IACE,MAAMxV,QAAiByO,MAAMoH,GAE7B,GAAI7V,EAAS0O,GAAI,OAAO1O,EAAS4O,OAEjC,MAAM,IAAIpc,MAAM,yCAAyCqjB,aAAe7V,EAASgP,WAAWhP,EAAS2O,aACtG,CAAC,MAAO1O,GAEP,MADAlE,KAAKyV,QAAQnR,MAAM,uCAAwC,CAAEJ,MAAK4V,QAC5D5V,CACR,CACF,CAEO,sBAAM8V,GACX,MAAMF,EAAM,GAAG9Z,KAAK2Z,WAAW3Z,KAAKyZ,0BAEpC,IACE,MAAMxV,QAAiByO,MAAMoH,GAE7B,GADA9Z,KAAKyV,QAAQ5N,MAAM,0BAA2B,CAAE5D,cAC3CA,EAAS0O,GACZ,MAAM,IAAIlc,MAAM,uCAAuCqjB,aAAe7V,EAASgP,WAAWhP,EAAS2O,cAErG,MAAMqH,EAAQhW,EAAS4O,OAGvB,OAFA7S,KAAKyV,QAAQ5N,MAAM,iBAAkB,CAAEoS,UAEhCA,CACR,CAAC,MAAO/V,GAGP,MAFAlE,KAAKyV,QAAQnR,MAAM,qCAAsC,CAAEJ,MAAK4V,QAE1D5V,CACR,CACF,ECpFKoE,eAAe4R,EAAuCpR,EAAgBqR,EAAsBL,GACjG,IACE,MAAMM,SAA4BC,OAC7BF,GAEL,GAAIC,GAAsBA,EAAqB9S,KAAKuE,MAGlD,OAFA/C,EAAOhB,KAAK,8EACPwS,EAAuBH,IACrB,QAGHna,KAAKua,eACX,MAAMC,QAAexa,KAAK+Z,qBAE1B,GAAIU,EAAmBD,EAAQ,IAAIE,IAAIZ,GAAK7hB,QAG1C,OAFA6Q,EAAOhB,KAAK,kDACPwS,EAAuBH,IACrB,EAGTrR,EAAOhB,KAAK,yBACb,CAAC,MAAOxD,GACPwE,EAAOxE,MAAM,sEAAuEA,EACtF,CAEA,OAAO,CACT,CAGgB,SAAAqW,EAAsCC,EAAmC3iB,GACvF,IAAK+H,KAAK6a,gBAMR,OALA7a,KAAK8I,OAAOtG,KAAK,0DAEjBxC,KAAK+Z,qBAAqB3V,MAAMoW,IAC9Bxa,KAAK6a,gBAAkBL,CAAM,KAExB,EAGT,MAAM1W,EAAS8W,EAAUvE,MAAMyE,GAAaC,EAAmB/a,KAAK6a,gBAAkBC,MAC7EL,EAAmBza,KAAK6a,gBAAkB5iB,GAInD,OAFA+H,KAAK8I,OAAOhB,KAAK,uBAAwBhE,GAElCA,CACT,CAEA,MAAMuW,EAAsB/R,SAAsD9K,EAAQlG,IAA8B0jB,GAE3GV,EAAyBhS,MAAO2S,EAAgBC,EAAQ,KACnE,MAAM7f,QAAiBgf,KAA0B,CAAE,EACnDhf,EAAQ4f,GAAU3T,KAAKuE,MAAiB,GAARqP,EAAa,GAAK,UAE5C1d,EAAQxD,IAAIghB,EAAuC3f,EAAQ,EAG7D0f,EAAqBA,CAACP,EAAiCM,KAC3D,IAAKA,EAAU,OAAO,EACtB,MAAMK,QAAEA,GAAYX,EACpB,OAAOW,EAAQ9E,MAAM4E,GAAWH,EAAS7N,SAASgO,IAAQ,EAGtDR,EAAqBA,CAACD,EAAiCY,KAC3D,IAAKA,EAAc,OAAO,EAE1B,MAAMC,OAAEA,GAAWb,EAEnB,OACEa,EAAOhF,MAAMiF,GAAUF,EAAaG,cAActO,SAAS,IAAIqO,EAAMC,oBAC9DF,EAAOhF,MAAMiF,GAAUF,EAAaG,cAActO,SAAS,IAAIqO,EAAMC,kBAAiB,QC3EpFC,GAMX7b,WAAAA,CACEoV,EACA0G,EACAC,EACAC,GAEA3b,KAAK+U,OAASA,EACd/U,KAAKyb,WAAaA,EAClBzb,KAAK0b,4BAA8BA,EACnC1b,KAAK2b,UAAYA,CACnB,CAEA9D,QAAAA,GAEE,MAAO,UADe7X,KAAK4b,aAAa5b,KAAK+U,sBACA/U,KAAKyb,0CAA0Czb,KAAK0b,yCAAyC1b,KAAK2b,WACjJ,CAEQC,YAAAA,CAAa7G,GACnB,OAAO8G,KAAK9G,GAAQhH,QAAQ,KAAM,KAAKA,QAAQ,KAAM,IACvD,QCFW+N,GAOXnc,WAAAA,CACEoc,EACAjT,EACAkT,EACAC,EAb6B,OAe7B,GARQjc,KAAe6a,gBAAmC,KA6ErD7a,KAAAka,gBAAkBA,EAAgBzY,KAAKzB,MACvCA,KAAAkc,gBAAkBvB,EAAelZ,KAAKzB,OAtEtC+b,IAAmBC,EACtB,MAAM,IAAIvlB,MAAM,6DAGlBuJ,KAAK+b,eAAiBA,EACtB/b,KAAKgc,cAAgBA,EAAcjO,QAAQ,MAAO,IAClD/N,KAAKic,gBAAkBA,EACvBjc,KAAK8I,OAASA,CAChB,CAEO,sBAAM+Q,CAAiBtO,GAAwB,GACpD,IACE,MAMM4Q,SANsBta,EAAMvK,IAChC0jB,GACA1S,SAAYtI,KAAKoc,sBACjBpc,KAAKic,gBACL1Q,IAE4BQ,QAC9B,IAAKoQ,EAAS,MAAM1lB,MAAM,qCAE1B,OAAO0lB,CACR,CAAC,MAAO7X,GAEP,MADAtE,KAAK8I,OAAOxE,MAAM,gCAAiCA,GAC7C,IAAI7N,MAAM,oCAClB,CACF,CAEO,sBAAMujB,CAAiBqC,EAAoB9Q,GAAwB,GAExE,IACE,MAAM+Q,QAAoBza,EAAMvK,IAC9B0jB,GACA1S,SAAYtI,KAAKuc,sBACjBvc,KAAKic,gBACL1Q,GAEF,IAAK+Q,EAAYvQ,QAAS,MAAM,IAAItV,MAAM,gDAE1C,OADqB6lB,EAAYvQ,QAAQsQ,EAE1C,CAAC,MAAO/X,GAEP,MADAtE,KAAK8I,OAAOxE,MAAM,qCAAsCA,GAClD,IAAI7N,MAAM,oCAClB,CACF,CAEO,0BAAM+lB,CACXrC,EACAsC,EACAxH,EACApB,GAEA,IAAKsG,IAAiBsC,IAAgB5I,EACpC,MAAM,IAAIpd,MAAM,4DAGlB,IACE,MAAMimB,QAAe1c,KAAK2c,YACpBC,QAAqB5c,KAAK6c,qBAAqB5H,EAAMpB,EAAS6I,GAC9DI,EAAaC,mBAAmBN,GAChCO,EAAsBD,mBAAmBH,GAE/C,MAAO,GAAG5c,KAAKgc,qBAAqBU,EAAOO,cAAc9C,EAAa+C,SAASF,SAA2BF,GAC3G,CAAC,MAAOxY,GAEP,MADAtE,KAAK8I,OAAOxE,MAAM,oCAAqCA,GACjD,IAAI7N,MAAM,mCAClB,CACF,CAKO,gBAAMkd,GACX,UACQtR,QAAQgQ,IAAI,CAChBxQ,EAAM3K,MAAM8jB,GACZnZ,EAAM3K,MAAM8jB,GACZnZ,EAAM3K,MAAM8jB,IAEf,CAAC,MAAO1W,GAEP,MADAtE,KAAK8I,OAAOxE,MAAM,yBAA0BA,GACtC,IAAI7N,MAAM,wBAClB,CACF,CAEO,iBAAM0mB,GACX,UACQ3f,EAAQzF,OAAOijB,GACrBhb,KAAK8I,OAAOhB,KAAK,6BAClB,CAAC,MAAOxD,GAEP,MADAtE,KAAK8I,OAAOxE,MAAM,mCAAoCA,GAChD,IAAI7N,MAAM,kCAClB,CACF,CAEO,kBAAM8jB,CAAa6C,GAAqB,GAC7C,IACE,MAAM,CAAGvC,SAAyBxY,QAAQgQ,IAAI,CAC5CxQ,EAAMvK,IAAI0jB,GAA6B,IAAMhb,KAAKoc,sBAAsBpc,KAAKic,gBAAiBmB,GAC9Fvb,EAAMvK,IAAI0jB,GAAsC,IAAMhb,KAAKqd,wBAAwBrd,KAAKic,gBAAiBmB,GACzGvb,EAAMvK,IAAI0jB,GAAoC,IAAMhb,KAAKuc,sBAAsBvc,KAAKic,gBAAiBmB,KAGnGvC,GAAiB9O,UAAS/L,KAAK6a,gBAAkBA,EAAgB9O,QACtE,CAAC,MAAOzH,GAEP,MADAtE,KAAK8I,OAAOxE,MAAM,2BAA4BA,GACxC,IAAI7N,MAAM,0BAClB,CACF,CAEU,wBAAMsjB,GACd,IACE,MAAMc,QAAwBhZ,EAAMvK,IAClC0jB,GACA1S,SAAYtI,KAAKqd,wBACjBrd,KAAKic,iBAEP,IAAKpB,EAAgB9O,QACnB,MAAM,IAAItV,MAAM,kDAIlB,OAFAuJ,KAAK8I,OAAOhB,KAAK,wCAAyC+S,EAAgB9O,SAC1E/L,KAAK6a,gBAAkBA,EAAgB9O,QAChC/L,KAAK6a,eACb,CAAC,MAAOvW,GAEP,MADAtE,KAAK8I,OAAOxE,MAAM,6CAA8CA,GAC1D,IAAI7N,MAAM,sCAClB,CACF,CAEQ8b,eAAAA,CAAgBxJ,GACtB,MAAO,CACLH,QAAUP,GAAY,IAAOA,EAC7BM,YAAa,EACbG,OAAQ9I,KAAK8I,OACbC,gBAEJ,CAEO,eAAM4T,GACX,IAEE,MAAMD,QAAelf,EAAQlG,IAAoB0jB,GAEjD,OAAK0B,GAAQO,SAGNP,EAFEnU,GAAe,IAAMvI,KAAKsd,uBAAuBtd,KAAKuS,gBAAgB,cAGhF,CAAC,MAAOjO,GAEP,MADAtE,KAAK8I,OAAOxE,MAAM,wBAAyBA,GACrC,IAAI7N,MAAM,wCAClB,CACF,CAEQ,yBAAM6mB,GACZ,MAAMZ,QAAe1c,KAAK+b,eAAenC,oBAEzC,IAAK8C,GAAQO,SACX,MAAM,IAAIxmB,MAAM,yCAGlB,aADM+G,EAAQxD,IAAIghB,EAA4B0B,GACvCA,CACT,CAEQ,0BAAMG,CACZ5H,EACA0G,EACAe,GAEA,KAAKzH,GAAMze,IAAOye,GAAMqD,SAAYrD,GAAMqD,QAAQC,KAAQtD,GAAMqD,QAAQG,cAAc,CACpF,MAAMmE,EAAe,iBAAiBF,EAAOO,WAG7C,OAFAjd,KAAK8I,OAAOhB,KAAK,wDAAyD8U,GAEnEA,CACT,CASA,OAPqB,IAAIpB,GACvBvG,EAAKze,GACLye,EAAKqD,QAAQC,IACbtD,EAAKqD,QAAQG,aACbkD,GAGkB9D,UACtB,CAEQ,wBAAMuE,GACZ,MAAMD,QAAgB5T,GACpB,IAAMvI,KAAK+b,eAAelC,oBAAoB7Z,KAAKuS,gBAAgB,yBAIrE,OADAvS,KAAK8I,OAAOhB,KAAK,0BACVqU,CACT,CAEQ,0BAAMkB,GACZ,MAAM7C,QAAejS,GACnB,IAAMvI,KAAK+b,eAAehC,sBAC1B/Z,KAAKuS,gBAAgB,wBACrB,CACE4I,QAAS,GACToC,gBAAiB,GACjBlC,OAAQ,GACRmC,KAAM,KAKV,OADAxd,KAAK8I,OAAOhB,KAAK,4BACV0S,CACT,CAEQ,wBAAM+B,GACZ,MAAMkB,QAAsBlV,GAC1B,IAAMvI,KAAK+b,eAAe/B,oBAAoBha,KAAKuS,gBAAgB,wBAAyB,CAAA,GAI9F,OADAvS,KAAK8I,OAAOjB,MAAM,0BACX4V,CACT,CAEO,kCAAaC,CAAsB5U,EAAgBpC,GACxDoC,EAAOjB,MAAM,4CAA6CnB,GAC1D,MAAMqV,EAAiB,IAAIxC,EACzB7S,EAAO8S,SACP9S,EAAO+S,QACP/S,EAAOgT,UACPhT,EAAOiT,QACP7Q,GAGI6U,EAAY,IAAI7B,GACpBC,EACAjT,EACApC,EAAOsV,cACPtV,EAAOuV,iBAIH9Q,QAAsBJ,IAG5B,aAFM4S,EAAUpD,aAAapP,GAEtBwS,CACT,ECrRK,MAAMC,GAAc9D,IACzB,IAGE,OADA,IAAIY,IAAIZ,IACD,CACT,CAAE,MACA,OAAO,CACT,GCCI+D,GAAqB,IAAIrR,IACzBsR,GAAkB,IAAItR,ICPfuR,GAAuD,CAClEC,KAAM,CAAC,cACPC,MAAO,CAAC,eCDJ,MAAOC,WAAkCznB,MAC7CkJ,WAAAA,CAAYc,EAAkB,2BAC5BV,MAAMU,GACNT,KAAKoC,KAAO,2BACd,ECLK,MAAM+b,GAAqBjM,IAChC,IAAIA,EAEJ,MAAM,IAAIgM,EAA2B,QC6B1BE,GAkBX,eAAOC,CAASC,EAA+DC,GAC7Eve,KAAKwe,WAAWxkB,IAAIskB,EAAaC,EACnC,CAOA,UAAOjnB,CAAIgnB,GACT,OAAOte,KAAKwe,WAAWlnB,IAAIgnB,EAC7B,CAQA,aAAOG,CAAOhe,GACZ,QCvEE,SAA4BA,GAChC,MACqB,iBAAZA,GACY,OAAZA,GACA,SAAUA,GACV,YAAaA,GACW,iBAAjBA,EAAQiW,IAE1B,CD+DSgI,CAAeje,IAIbT,KAAK2e,kBAAkBze,IAAIO,EAAQiW,KAC5C,EAzCe0H,GAAAI,WAA2C,IAAIlS,IAO/C8R,GAAiBO,kBAAgB,IAAInS,IAAI,IACnDlN,OAAOsf,OAAO3V,KE9Bd,MAAM4V,GAAgBC,IAG3B,IAAIC,EAEJ,GAAIroB,QAAQwI,WAAY,CACtB,MAAM8f,ENLqCC,KAC7C,MAAMnW,EAASmW,EAAUC,YAEzB,MAAO,EAAGC,YAAWrF,MAAKsF,gBACxB,IAGE,GAAIvB,GAAmB3d,IAAIif,IAAcrB,GAAgB5d,IAAIif,KAAevB,GAAW9D,GAAM,OAC7F,MAAMgB,SAAEA,EAAQ7iB,OAAEA,GAAW,IAAIyiB,IAAIZ,GACrC,GAAIgB,EAAS7N,SAAS,aAGpB,OAFAnE,EAAOhB,KAAK,qFACZgW,GAAgBtQ,IAAI2R,GAGtB,IAAIE,EACAD,GAAaxB,GAAWwB,KAC1BC,EAAoB,IAAI3E,IAAI0E,GAAWtE,WAGrCmE,EAAUtE,eAAe,CAACG,EAAUuE,GAAoBpnB,IACnDgnB,EAAUK,sBAAsB,CAACxF,EAAKsF,OAC7CtW,EAAOhB,KAAK,iFAEZ+V,GAAmBrQ,IAAI2R,GAE1B,CAAC,MAAO7a,GACPwE,EAAOxE,MAAM,0CAA2CA,EAC1D,EACD,EMvBiCib,CAAkDT,GAClFpoB,QAAQwI,WAAWsgB,gBAAgBtc,YAAY8b,EAAyBS,IAExE,MAAMC,EN4BsCT,KAC9C,MAAMnW,EAASmW,EAAUC,YAEzB,OAAO5W,OAAS6W,YAAWQ,kBACzB,IAGE,IAAK9B,GAAmB3d,IAAIif,GAAY,OACxCrW,EAAOhB,KAAK,oCACZ,MAAMgT,SAAEA,GAAa,IAAIJ,IAAIiF,GAEvBxF,SADsB8E,EAAUpF,oBACH+F,MAAM1J,GAAM4E,IAAa5E,EAAE2J,QAAU/E,EAASgF,SAAS,IAAI5J,EAAE2J,YAEhG,IAAK1F,EAAc,OAEnBrR,EAAOhB,KAAK,uDAENwS,EAAuBH,EAAa0F,OAC3C,CAAC,MAAOvb,GACPwE,EAAOxE,MAAM,2CAA4CA,EAC3D,EACD,EMjDkCib,CAAmDT,GACpFpoB,QAAQwI,WAAW6gB,iBAAiB7c,YAAYwc,EAA0BD,IAE1E,MAAMO,ENiDiCf,KACzC,MAAMnW,EAASmW,EAAUC,YAEzB,MAAO,EAAGC,gBACR,IACMtB,GAAmB3d,IAAIif,KACzBrW,EAAOhB,KAAK,0CAA2CqX,GACvDtB,GAAmB/Q,OAAOqS,GAE7B,CAAC,MAAO7a,GACPwE,EAAOxE,MAAM,sCAAuCA,EACtD,EACD,EM7D6Bib,CAA8CT,GAC1EpoB,QAAQwI,WAAW+gB,YAAY/c,YAAY8c,EAAqBP,IAEhEV,EAA6BA,KAC3BroB,QAAQwI,WAAWsgB,gBAAgBnc,eAAe2b,GAClDtoB,QAAQwI,WAAW6gB,iBAAiB1c,eAAeqc,GACnDhpB,QAAQwI,WAAW+gB,YAAY5c,eAAe2c,EAAoB,CAEtE,CAGA,MAAME,E1BkCF,WAOJ,MAAMpX,EAASrC,EAAOK,cAGhBoZ,EAAkBA,CAACzf,EAAkBkD,EAAuCC,KAEhF,SAASuc,EAAkBC,GACzBxc,EAAawc,EACf,CAEA,MAAMC,E0BlDmC/X,OAAO7H,IAChDqe,EAAiBI,YACdrX,MAAM,mBAAoB,CAAE6O,KAAMjW,EAAQiW,KAAMhC,QAASjU,EAAQiU,UAE7D4L,GAAcxB,EAAkBre,I1B8ClBkM,CAASlM,EAA8BkD,GAG5D,OAAI0c,aAAwBhe,SAC1Bge,EAAajc,MAAMgc,IACbA,GAAMD,EAAkBC,EAAK,IAChC5b,OAAON,IACR4E,EAAOtG,KAAK,gCAAiC0B,EAAI,KAI5C,IAKY,IAAjBmc,QAAJ,CAKgB,EAKlB,OAFArX,EAAIzS,QAAQ2O,UAAUhC,YAAYgd,GAE3BA,CACT,C0B7E0BK,GAaxB,OALA,WACMxB,GAA4BA,IAChCroB,QAAQH,QAAQ2O,UAAU7B,eAAe6c,EAC3C,CAEc,EAGVI,GAAgBhY,MAAOwW,EAAqCre,KAChE0d,GAAkBW,EAAiB5M,iBAEnC,MAAMqM,EAAWH,GAAwB9mB,IAAImJ,EAAQiW,MACrD,IAAK6H,EAAU,OAEf,MAAMiC,EAAU,CACdC,kBAAmB3B,GAGrB,OAAOP,EAASmC,OAAOjgB,EAAS+f,EAAQ,QCtD7BG,GAOX,YAAMD,CACJjgB,EACA+f,GAEA,MAAMrG,aAAEA,EAAYsC,YAAEA,EAAWjE,gBAAEA,GAAoB/X,EAAQiU,SACzD+L,kBAAEA,GAAsBD,EAExB1X,EAAS2X,EAAkBvB,YAEjCpW,EAAOjB,MAAM,mBAAoB,CAAEsS,eAAc3B,oBAEjD,IACE,IAAKA,GAAiBD,MAAQC,GAAiBC,aAC7C,MAAM,IAAIhiB,MAAM,+BAElB,MAAMge,QAAmBgM,EAAkBG,uBAC3C,IAAKnM,EACH,MAAM,IAAIhe,MAAM,2CAElB,MAAMwiB,QAAoBwH,EAAkBzH,WAAWR,EAAiB/D,GACxE3L,EAAOjB,MAAM,gBAAiB,CAAEoR,gBAE3BA,GACHnQ,EAAOhB,KAAK,sDAGd,MAAM+Y,QAAqBJ,EAAkBjE,qBAAqBrC,EAAcsC,EAAaxD,GAO7F,OANAnQ,EAAOjB,MAAM,0BAA2B,CAAEgZ,iB3ByFvBvY,WACvB,MAAMwY,EAAa9X,EAAInL,KAAKK,aACtB6iB,QAAYD,EACZE,QAAehY,EAAInL,KAAKpG,OAAO,CACnCqiB,MACAmH,YAAaF,GAAKvqB,GAClB0qB,QAAQ,EACRC,QAAQ,SAgBa7Y,UAA2C,IAAIjG,SAAkB3B,IACxFsI,EAAInL,KAAKujB,UAAUle,aAAYoF,eAAenF,EAASke,EAAcC,GACnE,GAAID,IAAiBE,GAA+B,aAAtBD,EAAWrO,OAAuB,CAG9D,GAFAjK,EAAInL,KAAKujB,UAAU/d,eAAeF,WAChB6F,EAAInL,KAAKvG,IAAIiqB,IACtBzH,IAEP,YADApZ,GAAQ,GAIVA,GAAQ,EACV,CACF,GAAE,IA1B4B8gB,CAAiBR,EAAOxqB,KAMtDqS,YAAW,KAELmY,GAAQxqB,IACVwS,EAAInL,KAAK9F,OAAOipB,EAAOxqB,GACzB,GACC,IAAM,E2B3GAirB,CAAUZ,SAETJ,EAAkBnG,uBAAuBH,EAAa0F,QAC5D/W,EAAOjB,MAAM,kBAAmB,CAAEsS,eAAc3B,oBACzC,CACL9B,KAAMzN,EAAcO,eACpBkL,QAAS,CACPzQ,UAAU,GAGf,CAAC,MAAOK,GAGP,OAFAwE,EAAOxE,MAAM,yBAA0B,CAAE6V,eAAc7V,UAClDmc,EAAkBna,WAAWd,EAAWkc,8BAA+B,CAAEvH,eAAc7V,UACrF,CACLoS,KAAMzN,EAAcO,eACpBkL,QAAS,CACPzQ,UAAU,GAGhB,CACF,QC3DW0d,GAOX,YAAMjB,CACJjgB,EACA+f,GAEA,MAAMoB,OAAEA,GAAWnhB,EAAQiU,SACrB+L,kBAAEA,GAAsBD,EACxB1X,EAAS2X,EAAkBvB,YAEjC,IAEE,MAAM2C,EAAcjY,EAMdkY,SAHqBtkB,EAAQlG,IAAuBuqB,IAAgB,IAGpCjC,MAAM9X,GAASA,EAAK8Z,SAAWA,IAErE,OAAIE,GACFhZ,EAAOjB,MAAM,2BAA4B,CAAE+Z,SAAQ3G,OAAQ6G,EAAiB7G,SAErE,CACLvE,KAAMzN,EAAcS,sBACpBgL,QAAS,CACPqN,OAAO,EACP9G,OAAQ6G,EAAiB7G,OACzB+G,SAAUF,MAIhBhZ,EAAOjB,MAAM,8BAA+B,CAAE+Z,WAEvC,CACLlL,KAAMzN,EAAcS,sBACpBgL,QAAS,CACPqN,OAAO,IAGZ,CAAC,MAAOzd,GAGP,OAFAwE,EAAOxE,MAAM,mCAAoC,CAAEsd,SAAQtd,UAEpD,CACLoS,KAAMzN,EAAcS,sBACpBgL,QAAS,CACPqN,OAAO,GAGb,CACF,QCtDWE,GACX,YAAMvB,CAAOjgB,EAAoE+f,GAE/E,MAAM0B,KAAEA,GAASzhB,EAAQiU,SACnB+L,kBAAEA,GAAsBD,EACxB1X,EAAS2X,EAAkBvB,YACjCpW,EAAOjB,MAAM,2BAA4B,CAAEqa,SAE3C,IACE,MAAM/K,QAAiBsJ,EAAkB0B,YAAYD,GAErD,OADApZ,EAAOjB,MAAM,2BAA4B,CAAEsP,aACpC,CACLT,KAAMzN,EAAcU,qBACpB+K,QAAS,CACP0N,aAAcjL,EAASiL,aACvBC,UAAWlL,EAASkL,WAGzB,CAAC,MAAO/d,GAEP,OADAwE,EAAOxE,MAAM,iCAAkC,CAAEA,UAC1C,CACLoS,KAAMzN,EAAcU,qBACpB+K,QAAS,CACP0N,aAAc,KACdC,UAAW,MAGjB,CACF,QChCWC,GACX,YAAM5B,CAAOjgB,EAAa+f,GACxB,MAAMC,kBAAEA,GAAsBD,EAExB1X,EAAS2X,EAAkBvB,YAC3BxY,QAAe+Z,EAAkBvN,kBAEvC,IAEE,OADApK,EAAOjB,MAAM,yBACN,CACL6O,KAAMzN,EAAcG,iBACpBsL,QAAS,CAAEhO,UAEd,CAAC,MAAOpC,GAEP,OADAwE,EAAOxE,MAAM,8BAA+B,CAAEA,UACvC,CACLoS,KAAMzN,EAAcG,iBACpBsL,QAAS,CAAEhO,OAAQ,MAEvB,CACF,QCCW6b,GAQX,YAAM7B,CACJjgB,EACA+f,GAEA,MAAMgC,KAAEA,GAAS/hB,EAAQiU,SACnB+L,kBAAEA,GAAsBD,EAExB1X,EAAS2X,EAAkBvB,YAK7B,IACE,MAAMuD,EAAS,IAAInb,KAKnB,OAJAmb,EAAOC,QAAQD,EAAOE,UAAYH,SAC5BhlB,EAAQxD,I9BfgB,a8Be4B,CAAE4oB,UAAWH,EAAO3M,YAC9EhN,EAAOjB,MAAM,eAAgB,CAAE2a,OAAMC,WAE9B,CACL/L,KAAMzN,EAAcE,WACpBuL,QAAS,CACPmO,KAAK,GAGV,CAAC,MAAOve,GAEP,OADAwE,EAAOxE,MAAM,qBAAsB,CAAEke,OAAMle,UACpC,CACLoS,KAAMzN,EAAcE,WACpBuL,QAAS,CACPmO,KAAK,GAGX,CACN,QCpCWC,GAQX,YAAMpC,CACJjgB,EACA+f,GAEA,MAAM1F,SAAEA,GAAara,EAAQiU,SACvB+L,kBAAEA,GAAsBD,EAExB1X,EAAS2X,EAAkBvB,YAE3BzL,QAA2BgN,EAAkBtN,YAAYM,mBACzDsP,QAAsBtC,EAAkB5G,mBAE9C/Q,EAAOjB,MAAM,oBAAqB,CAAEiT,aAEpC,IAGE,GAFK2F,EAAkBuC,cAEnBvP,EAAmB4C,MAAMH,GAAMA,EAAE+M,gBAAkBnI,IAAa5E,EAAE+E,QAAUH,EAASgF,SAAS,IAAI5J,EAAE+E,aAEtG,OADAnS,EAAOjB,MAAM,qCAAsC,CAAEiT,aAC9C,CACLpE,KAAMzN,EAAcI,iBACpBqL,QAAS,CACPwO,UAAU,EACVjI,YAAQnb,EACRma,MAAO,KAKb,IAAK8I,GAA0C,IAAzBA,EAAcvjB,OAClC,MAAM,IAAI/I,MAAM,qBAElBqS,EAAOjB,MAAM,2BAA4B,CAAEsb,MAAOJ,EAAcvjB,SAChE,MAAMyb,EAAS8H,EAAcnD,MAAM1J,GAAM4E,IAAa5E,EAAE2J,QAAU/E,EAASgF,SAAS,IAAI5J,EAAE2J,YAC1F/W,EAAOjB,MAAM,sBAAuB,CAAEiT,WAAUoI,WAAYjI,IAE5D,IAAIhB,EAAyD,GAC7D,GAAIgB,GAAQiC,GAAI,CAEd,MAAMO,QAAsBgD,EAAkBzG,iBAAiBiB,EAAOmI,SAASlG,IAC3EO,IAEF3U,EAAOjB,MAAM,2BAA4B,CAAE4V,kBAC3CxD,EAAQwD,EAEZ,CAEA,MAAO,CACL/G,KAAMzN,EAAcI,iBACpBqL,QAAS,CACPwO,WAAYjI,EACZA,SACAhB,SAGL,CAAC,MAAO3V,GAEP,OADAwE,EAAOxE,MAAM,wBAAyB,CAAEwW,WAAUxW,UAC3C,CACLoS,KAAMzN,EAAcI,iBACpBqL,QAAS,CACPwO,UAAU,EACVjI,YAAQnb,EACRma,MAAO,IAGb,CACF,QC9FWoJ,GAQX,YAAM3C,CACJjgB,EACA+f,GAEA,MAAM8C,WAAEA,EAAUC,cAAEA,EAAaC,OAAEA,GAAW/iB,EAAQiU,SAChD+L,kBAAEA,GAAsBD,EAExB1X,EAAS2X,EAAkBvB,YAE3B6D,QAAsBtC,EAAkB5G,mBAE9C/Q,EAAOjB,MAAM,sCAAuC,CAAEyb,eACtD,IACE,MAAMG,EAAyBF,EAAc7b,QAAQwO,IACnD,IACE,MAAM4E,SAAEA,GAAa,IAAIJ,IAAIxE,EAAE4D,KAC/B,OAAOiJ,EAAc1M,MAAMqN,GAAMA,EAAE7D,SAAW/E,GAAYA,EAASgF,SAAS,IAAI4D,EAAE7D,WACpF,CAAE,MAEA,OADA/W,EAAOjB,MAAM,iDAAmD,CAAEqO,OAC3D,CACT,KAKF,GAFApN,EAAOhB,KAAK,sDAAuD,CAAE6b,OAAQF,EAAuBjkB,SAEhGikB,EAAuBjkB,OAAS,EAAG,CACrC,MAAMokB,EAAkBC,KAAKC,MAAMD,KAAKE,SAAWzc,KAAKuE,OACxD,IAAK,MAAM/H,KAAU2f,EACdjD,EAAQC,kBAAkBna,WAC7Bd,EAAWwe,oCACX,CACER,SACAI,kBACAN,aACAW,gBAAiBngB,EAAOgW,IACxBoK,UAAWpgB,EAAOqgB,cAEpB,EAEN,CAEA,MAAO,CACLzN,KAAMzN,EAAcK,gCACpBoL,QAAS,CACP5Q,QAAQ,GAGb,CAAC,MAAOQ,GAEP,OADAwE,EAAOxE,MAAM,qDAAsD,CAAEgf,aAAYhf,UAC1E,CACLoS,KAAMzN,EAAcK,gCACpBoL,QAAS,CACP5Q,QAAQ,GAGd,CACF,QC7DWsgB,GACX,YAAM1D,CACJjgB,EACA+f,GAEA,MAAMwB,EAAWvhB,EAAQiU,SACnB+L,kBAAEA,GAAsBD,EACxB1X,EAAS2X,EAAkBvB,YAEjC,IAEE,MAAM2C,EAAcjY,EAGdya,QAAqB7mB,EAAQlG,IAAuBuqB,IAAgB,GAGpEyC,EAAgBD,EAAaE,WAChCC,GAASA,EAAK5C,SAAWI,EAASJ,SAgBrC,OAbI0C,GAAiB,EAEnBD,EAAaC,GAAiBtC,EAG9BqC,EAAavf,KAAKkd,SAIdxkB,EAAQxD,IAAI6nB,EAAawC,GAE/Bvb,EAAOjB,MAAM,yBAA0B,CAAEma,aAElC,CACLtL,KAAMzN,EAAcQ,sBACpBiL,QAAS,CACP+P,SAAS,GAGd,CAAC,MAAOngB,GAGP,OAFAwE,EAAOxE,MAAM,gCAAiC,CAAE0d,WAAU1d,UAEnD,CACLoS,KAAMzN,EAAcQ,sBACpBiL,QAAS,CACP+P,SAAS,GAGf,CACF,QCtDWC,GAOX,YAAMhE,CACJjgB,EACA+f,GAEA,MAAMrG,aAAEA,EAAYL,IAAEA,GAAQrZ,EAAQiU,SAChC+L,kBAAEA,GAAsBD,EAExB1X,EAAS2X,EAAkBvB,YAEjCpW,EAAOjB,MAAM,mCAAoC,CAAEsS,iBAEnD,IACE,MAAMrW,QAAe2c,EAAkBvG,gBAAgBC,EAAcL,GAErE,MAAO,CACLpD,KAAMzN,EAAcM,kBACpBmL,QAAS,CACP5Q,UAGL,CAAC,MAAOQ,GAEP,OADAwE,EAAOxE,MAAM,0DAA2D,CAAE6V,eAAc7V,UACjF,CACLoS,KAAMzN,EAAcM,kBACpBmL,QAAS,CACP5Q,QAAQ,GAGd,CACF,QCpCW6gB,GAOX,YAAMjE,CACJjgB,EACA+f,GAEA,MAAMhM,UACJA,EAASM,UAAEA,EAASH,UAAEA,EAASC,eAAEA,GAC/BnU,EAAQiU,SACN+L,kBAAEA,GAAsBD,EAExB1X,EAAS2X,EAAkBvB,YAEjCpW,EAAOjB,MAAM,qBAAsB,CACjC2M,YAAWM,YAAWH,YAAWC,mBAGnC,IACE,MAAM9Q,QAAe2c,EAAkBna,WAAWkO,EAAWM,EAAWH,EAAWC,GAEnF,MAAO,CACL8B,KAAMzN,EAAcC,YACpBwL,QAAS,CACP5Q,UAGL,CAAC,MAAOQ,GAEP,OADAwE,EAAOxE,MAAM,4CAA6C,CAAEkQ,YAAWM,YAAWxQ,UAC3E,CACLoS,KAAMzN,EAAcC,YACpBwL,QAAS,CACP5Q,QAAQ,GAGd,CACF,EChCK,MCZDgF,GAASrC,EAAOK,cAkDT8d,GAAiBtc,eACF9K,EAAQlG,IAAY0S,IA3CrB1B,WACzBQ,GAAOjB,MAAM,qBACb,MAAMgd,EAAiB,CACrB9jB,OAAQ,MACRyV,QACE,CACE,eAAgB,mBAChBsO,cAAe,2EAIrB,IAEE,MAAM7gB,QAAiByO,MAAM,kDAAmDmS,GAEhF,GADA/b,GAAOjB,MAAM,gCAAiC,CAAEoL,OAAQhP,EAASgP,UAC5DhP,EAAS0O,GAEZ,YADA7J,GAAOxE,MAAM,iCAAkC,CAAE2O,OAAQhP,EAASgP,OAAQL,WAAY3O,EAAS2O,aAGjG,MAAM7M,QAAa9B,EAAS4O,OAC5B,IAAK9M,EACH,MAAM,IAAItP,MAAM,6CAGlB,aADM+G,EAAQxD,IAAIgQ,EAA0BjE,EAAKgf,QAAQC,UAClDjf,EAAKgf,QAAQC,QACrB,CAAC,MAAO9gB,GAGP,YADA4E,GAAOxE,MAAM,iCAAkC,CAAEA,MAAOJ,IAAO,EAEjE,GAgBO+gB,GChDHC,GAAe,6CAER/C,GAAc7Z,MAAOQ,EAAgB+K,EAAiBqO,EAAciD,EAA0BC,EAAyC,GAAI7Z,GAAwB,KAC9K,MAAM8Z,GAAeD,GAAoB,IAAInY,SAASiV,GAAQ5X,EAAmB4X,EACjFpZ,EAAOjB,MAAM,kBAAkBqa,sBAAyBmD,KACxD,MAAMC,EAA0B,QAAQhb,IAClCib,QAAwB1jB,EAAMvK,IAAcguB,GAAyBhd,UACzEQ,EAAOjB,MAAM,6BAA6ByC,iBAAgCuJ,KACnE2R,GAAgB3R,EAASvJ,KAC/B6a,GAV2B,IAUiB5Z,GAE/C,IAAKga,EAAgBxZ,QAAS,MAAM,IAAItV,MAAM,oCAAoC6T,oCAElF,GAAIA,IAAqB+a,EACvB,OAAOE,EAAgBxZ,QAGzB,MAAM0Z,EAAmB,QAAQJ,IAC3BlO,QAAiBtV,EAAMvK,IAAcmuB,GAAkBnd,UAC3DQ,EAAOjB,MAAM,qBAAqBwd,iBAA2BxR,KACtD2R,GAAgB3R,EAASwR,KAC/BF,GAtB2B,IAsBiB5Z,GAE/C,IAAK4L,EAASpL,QAAS,OAAOwZ,EAAgBxZ,QAE9C,MAAM2Z,EAAiBC,GACrBJ,EAAgBxZ,QAChBoL,EAASpL,SAIX,aADMlK,EAAM7H,IAAIyrB,EAAkBC,EAAgBP,GA/BpB,KAgCvBO,CAAc,EAUjBF,GAAkBld,MAAOuL,EAAiBqO,KAC9C,MAAM0D,EAAyB,WAAW1D,SACpC2D,EAA0B,IAAIhS,KAAWqO,UAGxC4D,EAAoBC,SAA+B1jB,QAAQ2jB,WAAW,CACvEC,GAAc,GAAGf,KAAeU,KAChCK,GAAc,GAAGf,KAAeW,OAGtC,IAAIK,EACAC,EAE8B,cAA9BL,EAAmB7S,SACrBiT,EAAaJ,EAAmB5jB,OAGG,cAAjC6jB,EAAsB9S,SACxBkT,EAAsBJ,EAAsB7jB,OAI9C,MAAMkkB,EAA8BC,GAAsBH,EAAYC,GAOtE,MALuB,CACrB/D,aAAcgE,EAAkBhE,aAChCC,UAAW+D,EAAkB/D,UAGV,EAGjB4D,GAAgB3d,UAEpB,MAAMxE,QAAe4O,MAAMoH,EAAK,CAAEjY,MAAO,aACzC,IAAKiC,EAAO6O,GACV,MAAM,IAAIlc,MAAM,yCAAyCqjB,cAAgBhW,EAAOmP,mBAAmBnP,EAAO8O,cAE5G,OAAO9O,EAAO+O,MAAM,EAUhBwT,GAAwBA,CAACC,EAAsCC,KAAsD,CACzHnE,aAAc,IACRkE,GAAqBlE,cAAgB,MACrCmE,GAAwB,CAAE,GAEhClE,UAAW,IACLiE,GAAqBjE,WAAa,CAAE,KAItCsD,GAAiBA,CAACJ,EAA2BpO,KAAkC,CACnFiL,aAAc,IACTmD,EAAgBnD,gBAChBjL,EAASiL,cAEdC,UAAW,IACNkD,EAAgBlD,aAChBlL,EAASkL,aCnGT/Z,eAAewH,GAAoC0W,EAAoCle,UAC5FtI,KAAK8I,OAAOjB,MAAM,iCACX,IAEP,IAAI7H,KAAKoP,MAAMqX,YAAf,CAIAzmB,KAAK8I,OAAOhB,KAAK,iDAEjB,UAEQ9H,KAAK0mB,aAAarS,cAAcvE,aAEtC,MAAMpJ,QAAe1G,KAAK0mB,aAAarS,cAAclB,WAAU,GAC/DnT,KAAK8I,OAAO9B,UAAU,CACpBJ,QAASF,EAAOigB,iBAAkB,EAClChgB,SAAUD,EAAOkgB,uBAAyB,UAE5C5mB,KAAK8I,OAAOhB,KAAK,iCAAkC,CAAE6J,cAAe3R,KAAK2R,gBAIzE,MAAMkV,QAAwB/K,GAAgB4B,sBAAsB1d,KAAK8I,OAAQpC,GAEjF1G,KAAKoP,MAAM4T,YAAc,IAAIrM,EAAY3W,KAAKsG,WAAW7E,KAAKzB,MAAOA,KAAK8I,cACpE9I,KAAKoP,MAAM4T,YAAYlT,aAE7B,MAAMgX,EAAmB,IAAIxP,EAAoBtX,KAAK2R,cAAejL,EAAQ1G,KAAK8I,QAClF9I,KAAKoP,MAAM2X,sBAAwB,IAAInO,EAAsBkO,EAAkB9mB,KAAK8I,cAG9E9I,KAAKoP,MAAM2X,sBAAuB7N,YACnClZ,KAAKoP,MAAM2X,sBAAuB9R,MAAMze,UACrCwJ,KAAKoP,MAAM2X,sBAAuB/N,aAI1ChZ,KAAKoP,MAAM4X,UAAY,IAAI7S,EAAUnU,KAAK2R,cAAe3R,KAAKoP,MAAM2X,sBAAwB/mB,KAAK0mB,aAAarS,eAI9G,IACE,MAAM4S,QAAuBzpB,EAAQlG,IAAoB0jB,GACrDiM,GAAgBhK,UAClBjd,KAAKoP,MAAMqF,WAAawS,EACxBjnB,KAAK8I,OAAOhB,KAAK,0CAA2C,CAAEsR,SAAU6N,EAAehK,YAEvFjd,KAAK8I,OAAOjB,MAAM,sFAErB,CAAC,MAAOvD,GAEPtE,KAAK8I,OAAOjB,MAAM,qDAAsDvD,EAC1E,CHnDF8Z,GAAwBC,SAASpV,EAAcI,iBAAkB,IAAIyZ,IACrE1E,GAAwBC,SAASpV,EAAcG,iBAAkB,IAAIkZ,IACrElE,GAAwBC,SAASpV,EAAcE,WAAY,IAAIoZ,IAC/DnE,GAAwBC,SAASpV,EAAcM,kBAAmB,IAAImb,IACtEtG,GAAwBC,SAASpV,EAAcC,YAAa,IAAIyb,IAChEvG,GAAwBC,SAASpV,EAAcO,eAAgB,IAAImX,IACnEvC,GAAwBC,SAASpV,EAAcQ,sBAAuB,IAAI2a,IAC1EhG,GAAwBC,SAASpV,EAAcS,sBAAuB,IAAIiY,IAC1EvD,GAAwBC,SAASpV,EAAcU,qBAAsB,IAAIsY,IACzE7D,GAAwBC,SAASpV,EAAcK,gCAAiC,IAAI+Z,SInBtD/a,WAE9B,UACQsc,IACP,CAAC,MAAO1gB,GACP4E,EAAOjB,MAAM,iCAAkC,CAAEvD,MAAOJ,GAC1D,GD2DQgjB,CAAiBlnB,KAAK8I,aCxDER,OAAOQ,EAAgBpC,EAAiCiL,KACpFjL,EAAOygB,gBAAkBzgB,EAAOygB,eAAe3nB,OAAS,SACpD6C,QAAQgQ,IACZ3L,EAAOygB,eAAeC,SAASlF,GAAS,CACtCrgB,EAAM3K,MAAM,QAAQgrB,KACpBrgB,EAAM3K,MAAM,UAAUgrB,SAM5B3Z,GAAeD,UACbQ,EAAOjB,MAAM,qDAAsD,CAAE8J,wBAC/DwQ,GAAYrZ,EAAQ6I,EAAerH,EAAkB5D,EAAOoM,sBAAsB,GACxF,ED2CMuU,CAAmBrnB,KAAK8I,OAAQpC,EAAQ1G,KAAK2R,eAGnD3R,KAAKoP,ME9C0BkY,EAACC,EAClCC,KAMA,MAAMX,gBAAEA,EAAeL,cAAEA,EAAa9f,OAAEA,GAAW8gB,EAUnD,MATiB,IACZD,EACHd,aAAa,EACbI,kBACAL,gBACA9f,SAIa,EF6BA+gB,CAAiCznB,KAAKoP,MACjD,CAAEyX,kBAAiBL,gBAAe9f,WAKpC1G,KAAK8I,OAAOb,aAAa,IAAI7B,EAAmBpG,OAGhDA,KAAK0nB,iBAAmB7I,GAAa7e,MAGrC2nB,GAA0BrmB,KAAKtB,MAE/BA,KAAK8I,OAAOhB,KAAK,6CAClB,CAAC,MAAOxD,GACP,MAAM7D,EAAU6D,aAAiB7N,MAAQ6N,EAAM7D,QAAU,gBAEzD,MADAT,KAAK8I,OAAOxE,MAAM,yCAA0C,CAAEA,MAAO7D,IAC/D,IAAIhK,MAAM,2CAA2CgK,IAC7D,CA1EA,CA2EF,UAEgByR,KACd,OAAOlS,KAAKoP,MAAMqX,WACpB,CAEA,SAASkB,KAEP3nB,KAAK4nB,eAAe,WAAWtf,UAC7BtI,KAAK8I,OAAOhB,KAAK,gCAAgCsF,EAAMoB,eAAepB,EAAMqB,oCACtEoZ,GAAoBvmB,KAAKtB,KAAK,IAGtCA,KAAK4nB,eAAe,YAAYtf,UAC9BtI,KAAK8I,OAAOhB,KAAK,mDACX+f,GAAoBvmB,KAAKtB,KAAK,GAExC,CAEAsI,eAAeuf,KACb,IACM7nB,KAAKoP,MAAMyX,wBACP7mB,KAAKoP,MAAMyX,gBAAgB1J,cAEjCnd,KAAKoP,MAAMqF,WAAa,KACxBzU,KAAK8I,OAAOhB,KAAK,gDAEpB,CAAC,MAAOxD,GACPtE,KAAK8I,OAAOxE,MAAM,mCAAoCA,EACxD,CACF,KGzHewjB,GAAA,CACbphB,qDCGK4B,iBAML,OALA6V,GAAkBne,KAAKoP,MAAMqX,aAC7BzmB,KAAKoP,MAAM1I,aAAe1G,KAAK0mB,aAAarS,cAAclB,YAC1DnT,KAAK8I,OAAO9B,UAAU,CACpBL,SAAU3G,KAAKoP,MAAM1I,OAAOkgB,uBAAyB,UAEhD5mB,KAAKoP,MAAM1I,MACpB,uBAVE,OADAyX,GAAkBne,KAAKoP,MAAMqX,aACtBzmB,KAAKoP,MAAM1I,MACpB,kBAqBgB,SAAyCgG,EAAiBC,GACxEwR,GAAkBne,KAAKoP,MAAMqX,aAC7BzmB,KAAK0mB,aAAarS,cAAcxH,IAAIH,EAASC,EAC/C,iBAbgB,SAAwCD,EAAiBC,GAEvE,OADAwR,GAAkBne,KAAKoP,MAAMqX,aACtBzmB,KAAK0mB,aAAarS,cAAc5H,GAAGC,EAASC,EACrD,mBAEgB,SAA0CD,EAAiBC,GAEzE,OADAwR,GAAkBne,KAAKoP,MAAMqX,aACtBzmB,KAAK0mB,aAAarS,cAAczH,KAAKF,EAASC,EACvD,IDpBUob,6DEGHzf,eAA6D6R,EAAoCsC,EAAqBxD,GAE3H,OADAkF,GAAkBne,KAAKoP,MAAMqX,aACtBzmB,KAAKoP,MAAMyX,gBAAiBrK,qBAAqBrC,EAAcsC,EAAaxD,EAAajZ,KAAKoP,MAAMuC,cAC7G,mBAROrJ,iBAEL,OADA6V,GAAkBne,KAAKoP,MAAMqX,aACtBzmB,KAAKoP,MAAMyX,gBAAiBhN,kBACrC,mBAOOvR,eAAyD+T,GAG9D,GAFA8B,GAAkBne,KAAKoP,MAAMqX,cAExBzmB,KAAKoP,MAAMyX,gBACd,MAAM,IAAIpwB,MAAM,oCAGlB,OAAOuJ,KAAKoP,MAAMyX,gBAAgB7M,iBAAiBqC,EACrD,IFhBqB2L,iEGKnB,OADA7J,GAAkBne,KAAKoP,MAAMqX,aACtBzmB,KAAK8I,MACd,cAEOR,iBACL6V,GAAkBne,KAAKoP,MAAMqX,mBAEvBzmB,KAAKoP,MAAM4T,YAAajM,OAChC,aAdM,SAA8CvC,EAAsBM,EAAoBH,GAAqB,EAAOC,GAA0B,GAElJ,OADAuJ,GAAkBne,KAAKoP,MAAMqX,aACtBzmB,KAAKoP,MAAM4X,UAAWzS,MAAMC,EAAWxU,KAAKoP,MAAMqF,YAAYwI,SAAUnI,EAAWH,EAAWC,EACvG,IHDoCqT,uDIwBpB,SAAwCC,EAA+BjwB,GACrF,IAAK+H,KAAKoP,MAAMyX,gBAEd,OADA7mB,KAAK8I,OAAOtG,KAAK,yCACV,EAGT,MAAMsB,EAAS9D,KAAKoP,MAAMyX,gBAAiB3K,gBAAgBgM,EAAOjwB,GAGlE,OAFI6L,GAAQ9D,KAAK8I,OAAOhB,KAAK,6BAEtBhE,CACT,wBAEM,SAAyDka,GAC7D,MAAMla,EAASka,EAAK3H,MAAMyD,GAAQ9Z,KAAKmT,YAAYgV,sBAAsBC,UAAU/R,MAAMzI,KAAWkM,GC5CtF,SAAWA,EAAauO,GAEtC,OADc,IAAIpa,OAAOoa,GACZna,KAAK4L,EACpB,CDyC4GwO,CAAWxO,EAAKlM,OAI1H,OAFI9J,GAAQ9D,KAAK8I,OAAOhB,KAAK,8BAEtBhE,CACT,kBA5COwE,eAAwD6R,EAAsBL,GACnFqE,GAAkBne,KAAKoP,MAAMqX,aAE7B,MAAM8B,EAAY,IAAI7N,IAAIZ,GAE1B,UADkC9Z,KAAKoP,MAAMoX,cAAe+B,EAAUzN,UAGpE,OADA9a,KAAK8I,OAAOhB,KAAK,4CACV,EAGT,GAAI9H,KAAKmT,YAAYM,mBAAmB4C,MAAMH,GAAMA,EAAEsS,YAAerO,IAAiBjE,EAAE+E,SAEtF,OADAjb,KAAK8I,OAAOhB,KAAK,gDACV,EAGT,MAAMhE,QAAe9D,KAAKoP,MAAMyX,gBAAiB3M,gBAAgBla,KAAK8I,OAAQqR,EAAcL,GAG5F,OAFIhW,GAAQ9D,KAAK8I,OAAOhB,KAAK,yCAEtBhE,CACT,yBAEM,SAA0DqW,GAE9D,OADAgE,GAAkBne,KAAKoP,MAAMqX,aACtBgC,EAActO,EACvB,IJtB+Cre,iEMe7C,OADAqiB,GAAkBne,KAAKoP,MAAMqX,aACtBzmB,KAAKoP,MAAM2X,sBAAuB9R,IAC3C,cAEO3M,eAAoD6O,GAEzD,OADAgH,GAAkBne,KAAKoP,MAAMqX,aACtBiC,GAAgB1oB,KAAK8I,OAAQ9I,KAAKoP,MAAMuC,cAAewF,EAAUnX,KAAKoP,MAAM1I,QAAQoM,sBAAuB9S,KAAKoP,MAAM1I,QAAQ0e,iBACvI,uBAtBO9c,iBAGL,GAFA6V,GAAkBne,KAAKoP,MAAMqX,aAC7BzmB,KAAKoP,MAAMqF,iBAAmBzU,KAAKoP,MAAMyX,gBAAiBlK,aACrD3c,KAAKoP,MAAMqF,WACd,MAAM,IAAIhe,MAAM,2CAElB,OAAOuJ,KAAKoP,MAAMqF,WAAWwI,QAC/B,aAEgB,SAAoC3E,EAA4B7D,GAE9E,OADA0J,GAAkBne,KAAKoP,MAAMqX,aACtBzmB,KAAKoP,MAAM2X,sBAAuB/N,WAAWV,EAAS7D,EAC/D,WCXakU,GAKXhpB,WAAAA,CAA4BgS,GAAA3R,KAAa2R,cAAbA,EADlB3R,KAAgB0nB,iBAAwB,KAa3C1nB,KAAA8P,WAAaA,GAAWrO,KAAKzB,MAC7BA,KAAAkS,cAAgBA,GAAczQ,KAAKzB,MAKnCA,KAASmT,UAAG2U,GAAephB,OAAOyM,UAAU1R,KAAKzB,MACjDA,KAAekT,gBAAG4U,GAAephB,OAAOwM,gBAAgBzR,KAAKzB,MAC7DA,KAAc4nB,eAAGE,GAAephB,OAAOkhB,eAAenmB,KAAKzB,MAC3DA,KAAgB4oB,iBAAGd,GAAephB,OAAOkiB,iBAAiBnnB,KAAKzB,MAC/DA,KAAe6oB,gBAAGf,GAAephB,OAAOmiB,gBAAgBpnB,KAAKzB,MAG7DA,KAASkf,UAAG4I,GAAeE,cAAc9I,UAAUzd,KAAKzB,MACxDA,KAAWgjB,YAAG8E,GAAeE,cAAchF,YAAYvhB,KAAKzB,MAC5DA,KAAUsG,WAAGwhB,GAAeE,cAAc1hB,WAAW7E,KAAKzB,MAG1DA,KAAoB4gB,qBAAGkH,GAAehsB,SAAS8kB,qBAAqBnf,KAAKzB,MACzEA,KAAUgZ,WAAG8O,GAAehsB,SAASkd,WAAWvX,KAAKzB,MACrDA,KAAc8oB,eAAGhB,GAAehsB,SAASgtB,eAAernB,KAAKzB,MAC7DA,KAAWmiB,YAAG2F,GAAehsB,SAASqmB,YAAY1gB,KAAKzB,MAGvDA,KAAgB6Z,iBAAGiO,GAAeC,UAAUlO,iBAAiBpY,KAAKzB,MAClEA,KAAoBwc,qBAAGsL,GAAeC,UAAUvL,qBAAqB/a,KAAKzB,MAC1EA,KAAgBga,iBAAG8N,GAAeC,UAAU/N,iBAAiBvY,KAAKzB,MAGlEA,KAAeka,gBAAG4N,GAAeG,UAAU/N,gBAAgBzY,KAAKzB,MAChEA,KAAsBsa,uBAAGwN,GAAeG,UAAU3N,uBAAuB7Y,KAAKzB,MAC9EA,KAAc2a,eAAGmN,GAAeG,UAAUtN,eAAelZ,KAAKzB,MAC9DA,KAAqBsf,sBAAGwI,GAAeG,UAAU3I,sBAAsB7d,KAAKzB,MA3CjFA,KAAK0mB,aAAe,CAClBrS,cAAe,IAAI3C,EAAwBC,IAE7C3R,KAAK8I,OAASrC,EAAOK,cACrB9G,KAAK8I,OAAO9B,UAAU,CACpBJ,SAAS,EACTZ,MAAO,mCAEThG,KAAKoP,MRjBuBuC,KAAyD,CACvF8U,aAAa,EACbI,gBAAiB,KACjBL,cAAe,KACf9f,OAAQ,KACR+N,WAAY,KACZuS,UAAW,KACXD,sBAAuB,KACvBpV,gBACAqR,YAAa,OQQEyE,CAA6B9V,EAC5C,CAoCO,aAAMoX,GR1CexB,MQ2C1BvnB,KAAK8I,OAAOhB,KAAK,sCACXzF,QAAQgQ,IAAI,CAChBrS,KAAK0mB,aAAarS,cAAcV,aAChC3T,KAAKoP,MAAMyX,iBAAiBlT,aAC5B3T,KAAKoP,MAAM2X,uBAAuBhO,cAGhC/Y,KAAK0nB,mBACP1nB,KAAK0nB,mBACL1nB,KAAK8I,OAAOhB,KAAK,4BACjB9H,KAAK0nB,iBAAmB,MAI1B1nB,KAAKoP,ORzDqBmY,EQyDcvnB,KAAKoP,MRvD9B,IACZmY,EACHd,aAAa,EACbI,gBAAiB,KACjBL,cAAe,KACfQ,UAAW,KACXtgB,OAAQ,MQkDV,QC/CWsiB,kBAGXrpB,WAAAA,CAA4BgS,GAAA3R,KAAa2R,cAAbA,EAI5B3R,KAAA8P,WAAc0W,GACZxmB,KAAKipB,eAAenZ,WAAW0W,GAEjCxmB,KAAO+oB,QAAG,IAAM/oB,KAAKipB,eAAeF,UANlC/oB,KAAKipB,eAAiB,IAAIN,GAAkBhX,EAC9C,EC9BK,MAAMuX,GAAmBzoB,GAAqB2d,GAAwBK,OAAOhe","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"GiveFreely-background.esm.js","sources":["../../node_modules/.pnpm/webextension-polyfill@0.12.0/node_modules/webextension-polyfill/dist/browser-polyfill.js","../../src/shared/analytics/types.ts","../../src/shared/utils/logger/transports/console.transport.ts","../../src/shared/utils/logger/transports/analytics.transport.ts","../../src/shared/utils/logger/logger.ts","../../src/shared/utils/retry.ts","../../src/shared/browser.ts","../../src/shared/constants.ts","../../src/shared/utils/storage.ts","../../src/shared/utils/current-version.ts","../../src/shared/utils/cache.ts","../../src/shared/config/ConfigEventEmitter.ts","../../src/shared/config/configDiff.ts","../../src/shared/utils/circuit-breaker.ts","../../src/shared/config/giveFreelyConfig.ts","../../src/shared/config/giveFreelyConfigAdapters.ts","../../src/shared/analytics/index.ts","../../src/shared/utils/add-time.ts","../../src/shared/analytics/healthCheck.ts","../../src/shared/vendors/givefreely/giveFreelyApiClient.ts","../../src/shared/vendors/givefreely/giveFreelyUserService.ts","../../src/shared/vendors/wildfire/wildfireClient.ts","../../src/shared/vendors/wildfire/standdown.ts","../../src/shared/vendors/wildfire/trackingCode.ts","../../src/shared/vendors/wildfire/wildfireService.ts","../../src/shared/utils/is-valid-url.ts","../../src/background/listeners/handleAffiliateStandDown.ts","../../src/background/filters/affiliateWebFilter.ts","../../src/shared/utils/custom-errors.ts","../../src/shared/utils/assert-initialized.ts","../../src/background/strategies/MessageStrategy.ts","../../src/shared/utils.ts","../../src/background/listeners/index.ts","../../src/background/strategies/ActivateOfferStrategy.ts","../../src/background/strategies/GetDomainByShopIdStrategy.ts","../../src/background/strategies/GetLanguageContentStrategy.ts","../../src/background/strategies/GetPopupConfigStrategy.ts","../../src/background/strategies/HidePopupStrategy.ts","../../src/background/strategies/IsActiveDomainStrategy.ts","../../src/background/strategies/LogMerchantsInSearchResultsStrategy.ts","../../src/background/strategies/StoreShopifyShopIdStrategy.ts","../../src/background/strategies/shouldStandDownStrategy.ts","../../src/background/strategies/trackEventStrategy.ts","../../src/background/strategies/index.ts","../../src/shared/services/geolocation.ts","../../src/shared/i18n/index.ts","../../src/background/core/initialize.ts","../../src/background/utils/globalization.ts","../../src/background/utils/state-manager.ts","../../src/background/core/extensions/index.ts","../../src/background/core/extensions/config.ts","../../src/background/core/extensions/merchants.ts","../../src/background/core/extensions/observability.ts","../../src/background/core/extensions/standdown.ts","../../src/background/utils/regexMatch.ts","../../src/background/core/extensions/identity.ts","../../src/background/core/index.ts","../../src/background/giveFreelyService.ts","../../src/background/utils/isAdunitMessage.ts"],"sourcesContent":["(function (global, factory) {\n if (typeof define === \"function\" && define.amd) {\n define(\"webextension-polyfill\", [\"module\"], factory);\n } else if (typeof exports !== \"undefined\") {\n factory(module);\n } else {\n var mod = {\n exports: {}\n };\n factory(mod);\n global.browser = mod.exports;\n }\n})(typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : this, function (module) {\n /* webextension-polyfill - v0.12.0 - Tue May 14 2024 18:01:29 */\n /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */\n /* vim: set sts=2 sw=2 et tw=80: */\n /* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/. */\n \"use strict\";\n\n if (!(globalThis.chrome && globalThis.chrome.runtime && globalThis.chrome.runtime.id)) {\n throw new Error(\"This script should only be loaded in a browser extension.\");\n }\n if (!(globalThis.browser && globalThis.browser.runtime && globalThis.browser.runtime.id)) {\n const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = \"The message port closed before a response was received.\";\n\n // Wrapping the bulk of this polyfill in a one-time-use function is a minor\n // optimization for Firefox. Since Spidermonkey does not fully parse the\n // contents of a function until the first time it's called, and since it will\n // never actually need to be called, this allows the polyfill to be included\n // in Firefox nearly for free.\n const wrapAPIs = extensionAPIs => {\n // NOTE: apiMetadata is associated to the content of the api-metadata.json file\n // at build time by replacing the following \"include\" with the content of the\n // JSON file.\n const apiMetadata = {\n \"alarms\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"clearAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"bookmarks\": {\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getChildren\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getRecent\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getSubTree\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTree\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"move\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeTree\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"browserAction\": {\n \"disable\": {\n \"minArgs\": 0,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"enable\": {\n \"minArgs\": 0,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"getBadgeBackgroundColor\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getBadgeText\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"openPopup\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"setBadgeBackgroundColor\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setBadgeText\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"setPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"browsingData\": {\n \"remove\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"removeCache\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeCookies\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeDownloads\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeFormData\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeHistory\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeLocalStorage\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removePasswords\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removePluginData\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"settings\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"commands\": {\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"contextMenus\": {\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"cookies\": {\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAllCookieStores\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"devtools\": {\n \"inspectedWindow\": {\n \"eval\": {\n \"minArgs\": 1,\n \"maxArgs\": 2,\n \"singleCallbackArg\": false\n }\n },\n \"panels\": {\n \"create\": {\n \"minArgs\": 3,\n \"maxArgs\": 3,\n \"singleCallbackArg\": true\n },\n \"elements\": {\n \"createSidebarPane\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n }\n }\n },\n \"downloads\": {\n \"cancel\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"download\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"erase\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getFileIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"open\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"pause\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeFile\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"resume\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"show\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"extension\": {\n \"isAllowedFileSchemeAccess\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"isAllowedIncognitoAccess\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"history\": {\n \"addUrl\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"deleteAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"deleteRange\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"deleteUrl\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getVisits\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"search\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"i18n\": {\n \"detectLanguage\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAcceptLanguages\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"identity\": {\n \"launchWebAuthFlow\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"idle\": {\n \"queryState\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"management\": {\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getSelf\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"setEnabled\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"uninstallSelf\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"notifications\": {\n \"clear\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getPermissionLevel\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n },\n \"pageAction\": {\n \"getPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"hide\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setIcon\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"setPopup\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"setTitle\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n },\n \"show\": {\n \"minArgs\": 1,\n \"maxArgs\": 1,\n \"fallbackToNoCallback\": true\n }\n },\n \"permissions\": {\n \"contains\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"request\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"runtime\": {\n \"getBackgroundPage\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getPlatformInfo\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"openOptionsPage\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"requestUpdateCheck\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"sendMessage\": {\n \"minArgs\": 1,\n \"maxArgs\": 3\n },\n \"sendNativeMessage\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"setUninstallURL\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"sessions\": {\n \"getDevices\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getRecentlyClosed\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"restore\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"storage\": {\n \"local\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"managed\": {\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n }\n },\n \"sync\": {\n \"clear\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getBytesInUse\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"set\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n }\n },\n \"tabs\": {\n \"captureVisibleTab\": {\n \"minArgs\": 0,\n \"maxArgs\": 2\n },\n \"create\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"detectLanguage\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"discard\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"duplicate\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"executeScript\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getCurrent\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n },\n \"getZoom\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getZoomSettings\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"goBack\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"goForward\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"highlight\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"insertCSS\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"move\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n },\n \"query\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"reload\": {\n \"minArgs\": 0,\n \"maxArgs\": 2\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"removeCSS\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"sendMessage\": {\n \"minArgs\": 2,\n \"maxArgs\": 3\n },\n \"setZoom\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"setZoomSettings\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"update\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n }\n },\n \"topSites\": {\n \"get\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"webNavigation\": {\n \"getAllFrames\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"getFrame\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n }\n },\n \"webRequest\": {\n \"handlerBehaviorChanged\": {\n \"minArgs\": 0,\n \"maxArgs\": 0\n }\n },\n \"windows\": {\n \"create\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"get\": {\n \"minArgs\": 1,\n \"maxArgs\": 2\n },\n \"getAll\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getCurrent\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"getLastFocused\": {\n \"minArgs\": 0,\n \"maxArgs\": 1\n },\n \"remove\": {\n \"minArgs\": 1,\n \"maxArgs\": 1\n },\n \"update\": {\n \"minArgs\": 2,\n \"maxArgs\": 2\n }\n }\n };\n if (Object.keys(apiMetadata).length === 0) {\n throw new Error(\"api-metadata.json has not been included in browser-polyfill\");\n }\n\n /**\n * A WeakMap subclass which creates and stores a value for any key which does\n * not exist when accessed, but behaves exactly as an ordinary WeakMap\n * otherwise.\n *\n * @param {function} createItem\n * A function which will be called in order to create the value for any\n * key which does not exist, the first time it is accessed. The\n * function receives, as its only argument, the key being created.\n */\n class DefaultWeakMap extends WeakMap {\n constructor(createItem, items = undefined) {\n super(items);\n this.createItem = createItem;\n }\n get(key) {\n if (!this.has(key)) {\n this.set(key, this.createItem(key));\n }\n return super.get(key);\n }\n }\n\n /**\n * Returns true if the given object is an object with a `then` method, and can\n * therefore be assumed to behave as a Promise.\n *\n * @param {*} value The value to test.\n * @returns {boolean} True if the value is thenable.\n */\n const isThenable = value => {\n return value && typeof value === \"object\" && typeof value.then === \"function\";\n };\n\n /**\n * Creates and returns a function which, when called, will resolve or reject\n * the given promise based on how it is called:\n *\n * - If, when called, `chrome.runtime.lastError` contains a non-null object,\n * the promise is rejected with that value.\n * - If the function is called with exactly one argument, the promise is\n * resolved to that value.\n * - Otherwise, the promise is resolved to an array containing all of the\n * function's arguments.\n *\n * @param {object} promise\n * An object containing the resolution and rejection functions of a\n * promise.\n * @param {function} promise.resolve\n * The promise's resolution function.\n * @param {function} promise.reject\n * The promise's rejection function.\n * @param {object} metadata\n * Metadata about the wrapped method which has created the callback.\n * @param {boolean} metadata.singleCallbackArg\n * Whether or not the promise is resolved with only the first\n * argument of the callback, alternatively an array of all the\n * callback arguments is resolved. By default, if the callback\n * function is invoked with only a single argument, that will be\n * resolved to the promise, while all arguments will be resolved as\n * an array if multiple are given.\n *\n * @returns {function}\n * The generated callback function.\n */\n const makeCallback = (promise, metadata) => {\n return (...callbackArgs) => {\n if (extensionAPIs.runtime.lastError) {\n promise.reject(new Error(extensionAPIs.runtime.lastError.message));\n } else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) {\n promise.resolve(callbackArgs[0]);\n } else {\n promise.resolve(callbackArgs);\n }\n };\n };\n const pluralizeArguments = numArgs => numArgs == 1 ? \"argument\" : \"arguments\";\n\n /**\n * Creates a wrapper function for a method with the given name and metadata.\n *\n * @param {string} name\n * The name of the method which is being wrapped.\n * @param {object} metadata\n * Metadata about the method being wrapped.\n * @param {integer} metadata.minArgs\n * The minimum number of arguments which must be passed to the\n * function. If called with fewer than this number of arguments, the\n * wrapper will raise an exception.\n * @param {integer} metadata.maxArgs\n * The maximum number of arguments which may be passed to the\n * function. If called with more than this number of arguments, the\n * wrapper will raise an exception.\n * @param {boolean} metadata.singleCallbackArg\n * Whether or not the promise is resolved with only the first\n * argument of the callback, alternatively an array of all the\n * callback arguments is resolved. By default, if the callback\n * function is invoked with only a single argument, that will be\n * resolved to the promise, while all arguments will be resolved as\n * an array if multiple are given.\n *\n * @returns {function(object, ...*)}\n * The generated wrapper function.\n */\n const wrapAsyncFunction = (name, metadata) => {\n return function asyncFunctionWrapper(target, ...args) {\n if (args.length < metadata.minArgs) {\n throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);\n }\n if (args.length > metadata.maxArgs) {\n throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);\n }\n return new Promise((resolve, reject) => {\n if (metadata.fallbackToNoCallback) {\n // This API method has currently no callback on Chrome, but it return a promise on Firefox,\n // and so the polyfill will try to call it with a callback first, and it will fallback\n // to not passing the callback if the first call fails.\n try {\n target[name](...args, makeCallback({\n resolve,\n reject\n }, metadata));\n } catch (cbError) {\n console.warn(`${name} API method doesn't seem to support the callback parameter, ` + \"falling back to call it without a callback: \", cbError);\n target[name](...args);\n\n // Update the API method metadata, so that the next API calls will not try to\n // use the unsupported callback anymore.\n metadata.fallbackToNoCallback = false;\n metadata.noCallback = true;\n resolve();\n }\n } else if (metadata.noCallback) {\n target[name](...args);\n resolve();\n } else {\n target[name](...args, makeCallback({\n resolve,\n reject\n }, metadata));\n }\n });\n };\n };\n\n /**\n * Wraps an existing method of the target object, so that calls to it are\n * intercepted by the given wrapper function. The wrapper function receives,\n * as its first argument, the original `target` object, followed by each of\n * the arguments passed to the original method.\n *\n * @param {object} target\n * The original target object that the wrapped method belongs to.\n * @param {function} method\n * The method being wrapped. This is used as the target of the Proxy\n * object which is created to wrap the method.\n * @param {function} wrapper\n * The wrapper function which is called in place of a direct invocation\n * of the wrapped method.\n *\n * @returns {Proxy<function>}\n * A Proxy object for the given method, which invokes the given wrapper\n * method in its place.\n */\n const wrapMethod = (target, method, wrapper) => {\n return new Proxy(method, {\n apply(targetMethod, thisObj, args) {\n return wrapper.call(thisObj, target, ...args);\n }\n });\n };\n let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);\n\n /**\n * Wraps an object in a Proxy which intercepts and wraps certain methods\n * based on the given `wrappers` and `metadata` objects.\n *\n * @param {object} target\n * The target object to wrap.\n *\n * @param {object} [wrappers = {}]\n * An object tree containing wrapper functions for special cases. Any\n * function present in this object tree is called in place of the\n * method in the same location in the `target` object tree. These\n * wrapper methods are invoked as described in {@see wrapMethod}.\n *\n * @param {object} [metadata = {}]\n * An object tree containing metadata used to automatically generate\n * Promise-based wrapper functions for asynchronous. Any function in\n * the `target` object tree which has a corresponding metadata object\n * in the same location in the `metadata` tree is replaced with an\n * automatically-generated wrapper function, as described in\n * {@see wrapAsyncFunction}\n *\n * @returns {Proxy<object>}\n */\n const wrapObject = (target, wrappers = {}, metadata = {}) => {\n let cache = Object.create(null);\n let handlers = {\n has(proxyTarget, prop) {\n return prop in target || prop in cache;\n },\n get(proxyTarget, prop, receiver) {\n if (prop in cache) {\n return cache[prop];\n }\n if (!(prop in target)) {\n return undefined;\n }\n let value = target[prop];\n if (typeof value === \"function\") {\n // This is a method on the underlying object. Check if we need to do\n // any wrapping.\n\n if (typeof wrappers[prop] === \"function\") {\n // We have a special-case wrapper for this method.\n value = wrapMethod(target, target[prop], wrappers[prop]);\n } else if (hasOwnProperty(metadata, prop)) {\n // This is an async method that we have metadata for. Create a\n // Promise wrapper for it.\n let wrapper = wrapAsyncFunction(prop, metadata[prop]);\n value = wrapMethod(target, target[prop], wrapper);\n } else {\n // This is a method that we don't know or care about. Return the\n // original method, bound to the underlying object.\n value = value.bind(target);\n }\n } else if (typeof value === \"object\" && value !== null && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) {\n // This is an object that we need to do some wrapping for the children\n // of. Create a sub-object wrapper for it with the appropriate child\n // metadata.\n value = wrapObject(value, wrappers[prop], metadata[prop]);\n } else if (hasOwnProperty(metadata, \"*\")) {\n // Wrap all properties in * namespace.\n value = wrapObject(value, wrappers[prop], metadata[\"*\"]);\n } else {\n // We don't need to do any wrapping for this property,\n // so just forward all access to the underlying object.\n Object.defineProperty(cache, prop, {\n configurable: true,\n enumerable: true,\n get() {\n return target[prop];\n },\n set(value) {\n target[prop] = value;\n }\n });\n return value;\n }\n cache[prop] = value;\n return value;\n },\n set(proxyTarget, prop, value, receiver) {\n if (prop in cache) {\n cache[prop] = value;\n } else {\n target[prop] = value;\n }\n return true;\n },\n defineProperty(proxyTarget, prop, desc) {\n return Reflect.defineProperty(cache, prop, desc);\n },\n deleteProperty(proxyTarget, prop) {\n return Reflect.deleteProperty(cache, prop);\n }\n };\n\n // Per contract of the Proxy API, the \"get\" proxy handler must return the\n // original value of the target if that value is declared read-only and\n // non-configurable. For this reason, we create an object with the\n // prototype set to `target` instead of using `target` directly.\n // Otherwise we cannot return a custom object for APIs that\n // are declared read-only and non-configurable, such as `chrome.devtools`.\n //\n // The proxy handlers themselves will still use the original `target`\n // instead of the `proxyTarget`, so that the methods and properties are\n // dereferenced via the original targets.\n let proxyTarget = Object.create(target);\n return new Proxy(proxyTarget, handlers);\n };\n\n /**\n * Creates a set of wrapper functions for an event object, which handles\n * wrapping of listener functions that those messages are passed.\n *\n * A single wrapper is created for each listener function, and stored in a\n * map. Subsequent calls to `addListener`, `hasListener`, or `removeListener`\n * retrieve the original wrapper, so that attempts to remove a\n * previously-added listener work as expected.\n *\n * @param {DefaultWeakMap<function, function>} wrapperMap\n * A DefaultWeakMap object which will create the appropriate wrapper\n * for a given listener function when one does not exist, and retrieve\n * an existing one when it does.\n *\n * @returns {object}\n */\n const wrapEvent = wrapperMap => ({\n addListener(target, listener, ...args) {\n target.addListener(wrapperMap.get(listener), ...args);\n },\n hasListener(target, listener) {\n return target.hasListener(wrapperMap.get(listener));\n },\n removeListener(target, listener) {\n target.removeListener(wrapperMap.get(listener));\n }\n });\n const onRequestFinishedWrappers = new DefaultWeakMap(listener => {\n if (typeof listener !== \"function\") {\n return listener;\n }\n\n /**\n * Wraps an onRequestFinished listener function so that it will return a\n * `getContent()` property which returns a `Promise` rather than using a\n * callback API.\n *\n * @param {object} req\n * The HAR entry object representing the network request.\n */\n return function onRequestFinished(req) {\n const wrappedReq = wrapObject(req, {} /* wrappers */, {\n getContent: {\n minArgs: 0,\n maxArgs: 0\n }\n });\n listener(wrappedReq);\n };\n });\n const onMessageWrappers = new DefaultWeakMap(listener => {\n if (typeof listener !== \"function\") {\n return listener;\n }\n\n /**\n * Wraps a message listener function so that it may send responses based on\n * its return value, rather than by returning a sentinel value and calling a\n * callback. If the listener function returns a Promise, the response is\n * sent when the promise either resolves or rejects.\n *\n * @param {*} message\n * The message sent by the other end of the channel.\n * @param {object} sender\n * Details about the sender of the message.\n * @param {function(*)} sendResponse\n * A callback which, when called with an arbitrary argument, sends\n * that value as a response.\n * @returns {boolean}\n * True if the wrapped listener returned a Promise, which will later\n * yield a response. False otherwise.\n */\n return function onMessage(message, sender, sendResponse) {\n let didCallSendResponse = false;\n let wrappedSendResponse;\n let sendResponsePromise = new Promise(resolve => {\n wrappedSendResponse = function (response) {\n didCallSendResponse = true;\n resolve(response);\n };\n });\n let result;\n try {\n result = listener(message, sender, wrappedSendResponse);\n } catch (err) {\n result = Promise.reject(err);\n }\n const isResultThenable = result !== true && isThenable(result);\n\n // If the listener didn't returned true or a Promise, or called\n // wrappedSendResponse synchronously, we can exit earlier\n // because there will be no response sent from this listener.\n if (result !== true && !isResultThenable && !didCallSendResponse) {\n return false;\n }\n\n // A small helper to send the message if the promise resolves\n // and an error if the promise rejects (a wrapped sendMessage has\n // to translate the message into a resolved promise or a rejected\n // promise).\n const sendPromisedResult = promise => {\n promise.then(msg => {\n // send the message value.\n sendResponse(msg);\n }, error => {\n // Send a JSON representation of the error if the rejected value\n // is an instance of error, or the object itself otherwise.\n let message;\n if (error && (error instanceof Error || typeof error.message === \"string\")) {\n message = error.message;\n } else {\n message = \"An unexpected error occurred\";\n }\n sendResponse({\n __mozWebExtensionPolyfillReject__: true,\n message\n });\n }).catch(err => {\n // Print an error on the console if unable to send the response.\n console.error(\"Failed to send onMessage rejected reply\", err);\n });\n };\n\n // If the listener returned a Promise, send the resolved value as a\n // result, otherwise wait the promise related to the wrappedSendResponse\n // callback to resolve and send it as a response.\n if (isResultThenable) {\n sendPromisedResult(result);\n } else {\n sendPromisedResult(sendResponsePromise);\n }\n\n // Let Chrome know that the listener is replying.\n return true;\n };\n });\n const wrappedSendMessageCallback = ({\n reject,\n resolve\n }, reply) => {\n if (extensionAPIs.runtime.lastError) {\n // Detect when none of the listeners replied to the sendMessage call and resolve\n // the promise to undefined as in Firefox.\n // See https://github.com/mozilla/webextension-polyfill/issues/130\n if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) {\n resolve();\n } else {\n reject(new Error(extensionAPIs.runtime.lastError.message));\n }\n } else if (reply && reply.__mozWebExtensionPolyfillReject__) {\n // Convert back the JSON representation of the error into\n // an Error instance.\n reject(new Error(reply.message));\n } else {\n resolve(reply);\n }\n };\n const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => {\n if (args.length < metadata.minArgs) {\n throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);\n }\n if (args.length > metadata.maxArgs) {\n throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);\n }\n return new Promise((resolve, reject) => {\n const wrappedCb = wrappedSendMessageCallback.bind(null, {\n resolve,\n reject\n });\n args.push(wrappedCb);\n apiNamespaceObj.sendMessage(...args);\n });\n };\n const staticWrappers = {\n devtools: {\n network: {\n onRequestFinished: wrapEvent(onRequestFinishedWrappers)\n }\n },\n runtime: {\n onMessage: wrapEvent(onMessageWrappers),\n onMessageExternal: wrapEvent(onMessageWrappers),\n sendMessage: wrappedSendMessage.bind(null, \"sendMessage\", {\n minArgs: 1,\n maxArgs: 3\n })\n },\n tabs: {\n sendMessage: wrappedSendMessage.bind(null, \"sendMessage\", {\n minArgs: 2,\n maxArgs: 3\n })\n }\n };\n const settingMetadata = {\n clear: {\n minArgs: 1,\n maxArgs: 1\n },\n get: {\n minArgs: 1,\n maxArgs: 1\n },\n set: {\n minArgs: 1,\n maxArgs: 1\n }\n };\n apiMetadata.privacy = {\n network: {\n \"*\": settingMetadata\n },\n services: {\n \"*\": settingMetadata\n },\n websites: {\n \"*\": settingMetadata\n }\n };\n return wrapObject(extensionAPIs, staticWrappers, apiMetadata);\n };\n\n // The build process adds a UMD wrapper around this file, which makes the\n // `module` variable available.\n module.exports = wrapAPIs(chrome);\n } else {\n module.exports = globalThis.browser;\n }\n});\n//# sourceMappingURL=browser-polyfill.js.map\n","export type EventHistoryEntry = {\n\n createdAt: number,\n payload: string\n}\n\nexport enum PopupEvent {\n checkoutPopupShown = 'CHECKOUT-POPUP-SHOWN',\n checkoutPopupNotShown = 'CHECKOUT-POPUP-NOT-SHOWN',\n checkoutPopupSupressed = 'CHECKOUT-POPUP-SUPRESSED',\n checkoutPopupDonation = 'CHECKOUT-POPUP-DONATION',\n checkoutPopupFailedActivation = 'CHECKOUT-POPUP-FAILED-ACTIVATION',\n checkoutPopupPurchaseConfirmed = 'CHECKOUT-POPUP-PURCHASE-CONFIRMED',\n checkoutPopupHealthCheck = 'CHECKOUT-POPUP-HEALTH-CHECK',\n checkouPopupActivationFailed = 'CHECKOUT-POPUP-ACTIVATION-FAILED',\n checkoutPopupOfferDetailsClicked = 'CHECKOUT-POPUP-OFFER-DETAILS-CLICKED',\n checkoutPopupWhyAmISeeingThisClicked = 'CHECKOUT-POPUP-WHY-AM-I-SEEING-THIS-CLICKED',\n checkoutPopupLooserExtension = 'CHECKOUT-POPUP-LOOSER-EXTENSION',\n checkoutPopupActiveDomain = 'CHECKOUT-POPUP-ACTIVE-DOMAIN',\n checkoutPopupSiteMatches = 'CHECKOUT-POPUP-SITE-MATCHES',\n checkoutPopupMerchantInResultsFound = 'CHECKOUT-MERCHANT-IN-RESULTS-FOUND',\n checkoutPopupNotShownPerViewportSize = 'CHECKOUT-POPUP-NOT-SHOWN-PER-VIEWPORT-SIZE',\n checkoutPopupHiddenProgrammatically = 'CHECKOUT-POPUP-HIDDEN-PROGRAMMATICALLY',\n}\n\nexport enum LoggingEvent {\n adUnitLog = 'ADUNIT-LOG'\n}\n\nexport type EventType = PopupEvent | LoggingEvent; // Unionize any event types here.\n\nexport type GfEvent<T extends EventType> = {\n partner: string,\n eventType: T,\n eventData?: unknown\n}\n","import { LogMessage, LoggerTransport } from '../types';\n\nexport class ConsoleTransport implements LoggerTransport {\n private static LOGGER_PREFIX = '[GFAdUnit] -';\n\n isLocal = true;\n\n log({\n level, message, timestamp, data, title,\n }: LogMessage): void {\n // Map log levels to available console methods\n let consoleMethod: 'log' | 'info' | 'warn' | 'error';\n switch (level) {\n case 'debug':\n consoleMethod = 'log';\n break;\n case 'info':\n consoleMethod = 'info';\n break;\n case 'warn':\n consoleMethod = 'warn';\n break;\n case 'error':\n case 'critical':\n case 'fatal':\n consoleMethod = 'error';\n break;\n default:\n consoleMethod = 'log';\n }\n const titlePrefix = title ? `[${title}]` : '';\n\n if (data !== undefined) {\n // eslint-disable-next-line no-console\n console[consoleMethod](`[${timestamp}] - ${ConsoleTransport.LOGGER_PREFIX} ${titlePrefix} ${message}`, data);\n } else {\n // eslint-disable-next-line no-console\n console[consoleMethod](`[${timestamp}] - ${ConsoleTransport.LOGGER_PREFIX} ${titlePrefix} ${message}`);\n }\n }\n}\n","import { LogMessage, LoggerTransport } from '../types';\nimport { LoggingEvent } from '@/shared/analytics/types';\nimport { AdUnitCoreService } from '../../../../background/core';\n\nexport class AnalyticsTransport implements LoggerTransport {\n private backgroundService: AdUnitCoreService;\n\n constructor(backgroundService: AdUnitCoreService) {\n this.backgroundService = backgroundService;\n }\n\n isLocal: boolean = false;\n\n log({\n level, message, data, title,\n }: LogMessage): void {\n void this.backgroundService.trackEvent(LoggingEvent.adUnitLog,\n {\n log: {\n level, message, data, title,\n },\n });\n }\n}\n","import {\n LogLevel, LogMessage, LoggerConfig, LoggerTransport,\n} from './types';\nimport { ConsoleTransport } from './transports';\n\nconst LOG_LEVELS: LogLevel[] = ['debug', 'info', 'warn', 'error', 'critical', 'fatal'];\n\nexport class Logger {\n private config: Required<LoggerConfig>;\n private static instance: Logger;\n\n private constructor(config?: LoggerConfig) {\n this.config = {\n minLevel: config?.minLevel ?? 'debug',\n enabled: config?.enabled ?? false,\n transports: config?.transports ?? [new ConsoleTransport()],\n title: config?.title ?? '',\n };\n }\n\n static getInstance(config?: LoggerConfig): Logger {\n if (!Logger.instance) {\n Logger.instance = new Logger(config);\n }\n return Logger.instance;\n }\n\n configure(config: Partial<LoggerConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n private shouldLog(level: LogLevel): boolean {\n if (!this.config.enabled) return false;\n return LOG_LEVELS.indexOf(level) >= LOG_LEVELS.indexOf(this.config.minLevel);\n }\n\n private createLogMessage(level: LogLevel, message: string, data?: unknown): LogMessage {\n return {\n level,\n // @ts-expect-error global variable\n version: LIB_VERSION ?? 'unknown',\n message,\n timestamp: new Date().toISOString(),\n data,\n title: this.config.title,\n };\n }\n\n private log(level: LogLevel, message: string, onlyLocal: boolean, data?: unknown): void {\n if (!this.shouldLog(level)) return;\n\n const logMessage = this.createLogMessage(level, message, data);\n this.config.transports\n .filter((transport) => !onlyLocal || transport.isLocal)\n .forEach((transport) => transport.log(logMessage));\n }\n\n debug(message: string, data?: unknown, onlyLocal = false): void {\n this.log('debug', message, onlyLocal, data);\n }\n\n info(message: string, data?: unknown, onlyLocal = false): void {\n this.log('info', message, onlyLocal, data);\n }\n\n warn(message: string, data?: unknown, onlyLocal = false): void {\n this.log('warn', message, onlyLocal, data);\n }\n\n error(message: string, data?: unknown, onlyLocal = false): void {\n this.log('error', message, onlyLocal, data);\n }\n\n critical(message: string, data?: unknown, onlyLocal = false): void {\n this.log('critical', message, onlyLocal, data);\n }\n\n fatal(message: string, data?: unknown, onlyLocal = false): void {\n this.log('fatal', message, onlyLocal, data);\n }\n\n addTransport(transport: LoggerTransport): void {\n this.config.transports.push(transport);\n }\n\n clearTransports(): void {\n this.config.transports = [];\n }\n\n disable(): void {\n this.config.enabled = false;\n }\n\n enable(): void {\n this.config.enabled = true;\n }\n}\n","import { Logger } from './logger';\n\nexport const MAX_RETRY_ATTEMPTS = 3;\nexport const DEFAULT_RETRY_DELAY = 1000; // 1 second\n\nexport type DelayFunction = (attempt: number) => number;\n\nexport const defaultDelay: DelayFunction = (attempt: number) => DEFAULT_RETRY_DELAY * attempt;\n\nexport interface RetryOptions {\n maxAttempts?: number;\n delayFn?: DelayFunction;\n logger?: Logger;\n operationName?: string;\n}\n\nexport async function retryOperation<T>(\n operation: () => Promise<T>,\n options: RetryOptions = {},\n // If the operation fails after the specified attempts, return this value instead of throwing\n returnOnFailure?: T,\n): Promise<T> {\n const {\n maxAttempts = MAX_RETRY_ATTEMPTS,\n delayFn = defaultDelay,\n } = options;\n\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n try {\n // eslint-disable-next-line no-await-in-loop\n return await operation();\n } catch (error) {\n lastError = error as Error;\n if (attempt < maxAttempts) {\n // eslint-disable-next-line no-await-in-loop\n await new Promise((resolve) => {\n setTimeout(resolve, delayFn(attempt));\n });\n }\n }\n }\n\n if (lastError && options.logger && options.operationName) {\n // Prevent logging this remotely to avoid further network errors and enter in an infinite loop\n options.logger.error(`Operation ${options.operationName} failed after ${maxAttempts} attempts.`, lastError, true);\n }\n\n if (returnOnFailure !== undefined) {\n return returnOnFailure;\n }\n\n throw lastError || new Error('Operation failed after multiple attempts');\n}\n","import browser from 'webextension-polyfill';\nimport {\n AnyRequestMessage, AnyResponseMessage, RequestMessage, RequestResponseMap, ResponseMessage,\n} from './requestResponse';\nimport { Logger } from './utils/logger';\nimport {\n defaultDelay, MAX_RETRY_ATTEMPTS, retryOperation, RetryOptions,\n} from './utils/retry';\n\n// Use webextension-polyfill API\nconst api = browser;\n\n// Re-export the browser object\nexport { browser };\n\ninterface SendOptions {\n tabId?: number;\n}\n\n/**\n * Type-safe wrapper for sending messages\n * @param message\n * @param options\n * @returns\n */\nexport async function sendMessage<K extends keyof RequestResponseMap>(\n message: RequestMessage<K>,\n options?: SendOptions,\n): Promise<ResponseMessage<K>> {\n if (options?.tabId) {\n return await api.tabs.sendMessage(options.tabId, message) as ResponseMessage<K>;\n }\n return await api.runtime.sendMessage(message) as ResponseMessage<K>;\n}\n\n/**\n * Type-safe wrapper for sending messages, with retry attempts\n * @param message\n * @param options\n * @param retryOptions\n * @returns\n */\nexport async function sendMessageWithRetry<K extends keyof RequestResponseMap>(\n message: RequestMessage<K>,\n options?: SendOptions,\n retryOptions?: RetryOptions,\n): Promise<ResponseMessage<K>> {\n const finalRetryOptions: RetryOptions = {\n maxAttempts: retryOptions?.maxAttempts ?? MAX_RETRY_ATTEMPTS,\n delayFn: retryOptions?.delayFn ?? defaultDelay,\n };\n\n return retryOperation<ResponseMessage<K>>(\n () => sendMessage(message, options),\n finalRetryOptions,\n );\n}\n\n/**\n * Type-safe wrapper for adding message listeners in an \"RPC style\".\n *\n * @param callback A function that takes:\n * - message: one of the possible request messages (AnyRequestMessage)\n * - sender: the sender details\n * - sendResponse: a function to call with a typed response (AnyResponseMessage)\n *\n * The callback can:\n * - return `void` (if it synchronously calls `sendResponse`),\n * - return `boolean` (to indicate if it will handle async),\n * - or return a `Promise<AnyResponseMessage>` (in which case we handle sendResponse automatically).\n */\nexport function addMessageListener(\n callback: (\n message: AnyRequestMessage,\n sender: browser.Runtime.MessageSender,\n sendResponse: (response: AnyResponseMessage) => void\n ) => void | boolean | Promise<AnyResponseMessage | void>,\n) {\n const logger = Logger.getInstance();\n\n // Attach a single runtime listener\n const messageListener = (message: unknown, sender: browser.Runtime.MessageSender, sendResponse: (response?: unknown) => void) => {\n // We'll provide a typed sendResponse function to the callback\n function typedSendResponse(resp: AnyResponseMessage) {\n sendResponse(resp);\n }\n\n const maybePromise = callback(message as AnyRequestMessage, sender, typedSendResponse);\n\n // If the callback returns a promise, we handle it asynchronously\n if (maybePromise instanceof Promise) {\n maybePromise.then((resp) => {\n if (resp) typedSendResponse(resp);\n }).catch((err) => {\n logger.warn('Async message callback error:', err);\n // You could also send an error response or handle differently\n });\n // Must return true so the message channel stays open\n return true;\n }\n\n // If the callback explicitly returned true, it means it will handle the response asynchronously\n // For webextension-polyfill, we can only return true or undefined (not false)\n if (maybePromise === true) {\n return true;\n }\n\n // Return undefined for synchronous operations (equivalent to not returning anything)\n return undefined;\n };\n\n api.runtime.onMessage.addListener(messageListener);\n\n return messageListener;\n}\n\n// Storage utilities with type safety\nexport const storage = {\n async get<T = unknown>(keys: string | string[] | null): Promise<T> {\n const result = await api.storage.local.get(keys);\n return result as T;\n },\n\n async set(items: Record<string, unknown>): Promise<void> {\n await api.storage.local.set(items);\n },\n\n async remove(keys: string | string[]): Promise<void> {\n await api.storage.local.remove(keys);\n },\n};\n\nexport const createTab = async (url: string) => {\n const currentTab = api.tabs.getCurrent();\n const tab = await currentTab;\n const newTab = await api.tabs.create({\n url,\n openerTabId: tab?.id,\n active: false,\n pinned: true,\n });\n const wasNewTabLoaded = await waitForTabToLoad(newTab.id!);\n if (!wasNewTabLoaded) {\n // TODO: Log activation error\n return;\n }\n\n setTimeout(() => {\n // Autoclose the new tab after 30 seconds\n if (newTab?.id) {\n api.tabs.remove(newTab.id);\n }\n }, 30000);\n};\n\nconst waitForTabToLoad = async (tabId: number): Promise<boolean> => new Promise<boolean>((resolve) => {\n api.tabs.onUpdated.addListener(async function listener(updatedTabId, changeInfo) {\n if (updatedTabId === tabId && changeInfo.status === 'complete') {\n api.tabs.onUpdated.removeListener(listener);\n const tab = await api.tabs.get(tabId);\n if (!tab.url) { // TODO: Evaluate url integrity\n resolve(false);\n return;\n }\n\n resolve(true);\n }\n });\n});\n","// Shared constants between content and background scripts\nconst POPUP_MESSAGE_TYPES = {\n HIDE_POPUP: 'GF_HIDE_POPUP',\n GET_POPUP_CONFIG: 'GF_GET_POPUP_CONFIG',\n IS_ACTIVE_DOMAIN: 'GF_IS_ACTIVE_DOMAIN',\n LOG_MERCHANTS_IN_SEARCH_RESULTS: 'GF_LOG_MERCHANTS_IN_SEARCH_RESULTS',\n SHOULD_STAND_DOWN: 'GF_SHOULD_STAND_DOWN',\n ACTIVATE_OFFER: 'GF_ACTIVATE_OFFER',\n STORE_SHOPIFY_SHOP_ID: 'GF_STORE_SHOPIFY_SHOP_ID', // Added new message type for Shopify ID\n GET_DOMAIN_BY_SHOP_ID: 'GF_GET_DOMAIN_BY_SHOP_ID', // Get domain information for a shop ID\n GET_LANGUAGE_CONTENT: 'GF_GET_LANGUAGE_CONTENT', // Get localized strings for a language + charities\n} as const;\n\nexport const MESSAGE_TYPES = {\n TRACK_EVENT: 'GF_TRACK_EVENT',\n ...POPUP_MESSAGE_TYPES,\n} as const;\n\n// Initial state\nexport const INITIAL_STATE = {\n isInitialized: false,\n data: {},\n settings: {\n enabled: true,\n theme: 'light',\n },\n} as const;\n\n// Storage Keys\nexport const SHOPIFY_SHOP_IDS_STORAGE_KEY = 'shopify_shop_ids' as const;\nexport const LAST_HEALTH_CHECK_STORAGE_KEY = 'gf_last_health_check' as const;\nexport const VISITED_WEBSITE_PREFIX_STORAGE_KEY = 'gfhv-' as const;\nexport const POPUP_HIDDEN_STORAGE_KEY = 'popup_hide' as const;\nexport const PARTNER_CONFIG_STORAGE_KEY = 'gf_partner_config' as const;\nexport const GLOBAL_CONFIG_STORAGE_KEY = 'gf_global_config' as const;\nexport const COUNTRY_CODE_STORAGE_KEY = 'countryCode' as const;\nexport const VERSION_STORAGE_KEY = 'version' as const;\nexport const ANONYMOUS_USER_STORAGE_KEY = 'gf_anonymous_user_info' as const;\nexport const ANONYMOUS_ENCRYPTED_TOKEN_STORAGE_KEY = 'gf_anonymous_encrypted_token' as const;\nexport const GF_AD_EVENT_HISTORY_STORAGE_KEY = 'gf_ad_event_history' as const;\nexport const WILDFIRE_STORAGE_KEYS = {\n DEVICE: 'wfDevice',\n DOMAINS: 'wfDomains',\n STANDDOWN_POLICY: 'wfStanddownPolicy',\n STANDDOWN_HISTORY: 'wfStanddownHistory',\n LAST_CACHE_REFRESH: 'wfLastCacheRefresh',\n MERCHANT_RATES: 'wfMerchantRates',\n} as const;\n\nexport const UNKNOWN_CHARITY = {\n ein: '0',\n tpi: '0',\n};\n\nexport const DEFAULT_LANGUAGE = 'en' as const;\nexport const DEFAULT_COUNTRY = 'us' as const;\n\nexport const DEFAULT_CACHE_RETENTION = 60 * 10; // 10 minutes\n","import browser from 'webextension-polyfill';\n\n// we want to ensure that we don't conflict with any other storage from the host extensions\nconst storagePrefix = 'GIVE_FREELY_';\n\nexport const storage = {\n async get<T>(key: string): Promise<T | null> {\n const prefixedKey = `${storagePrefix}${key}`;\n const result = await browser.storage.local.get(prefixedKey);\n return result[prefixedKey] as T || null;\n },\n\n async set<T>(key: string, value: T): Promise<void> {\n const prefixedKey = `${storagePrefix}${key}`;\n await browser.storage.local.set({ [prefixedKey]: value });\n },\n\n async remove(keys: string | string[]): Promise<void> {\n const prefixedKeys = Array.isArray(keys)\n ? keys.map((key) => `${storagePrefix}${key}`)\n : `${storagePrefix}${keys}`;\n await browser.storage.local.remove(prefixedKeys);\n },\n};\n","import { VERSION_STORAGE_KEY } from '../constants';\nimport { storage } from './storage';\n\n// @ts-expect-error global variable\nexport const getCurrentVersion = () => String(LIB_VERSION);\n\nconst updateVersion = (newVersion: string): Promise<void> => storage.set(VERSION_STORAGE_KEY, newVersion);\n\n/**\n *Determines if the current version is different than the one persisted in the storage\n *If updateStorageIfNew is true, it will update the current version in storage\n */\nexport const isNewVersion = async (updateStorageIfNew: boolean = true): Promise<boolean> => {\n const storedVersion = await storage.get<string>(VERSION_STORAGE_KEY);\n const currentVersion = await getCurrentVersion();\n const isANewVersion = storedVersion !== currentVersion;\n\n if (updateStorageIfNew && isANewVersion) {\n await updateVersion(currentVersion);\n }\n\n return isANewVersion;\n};\n\n/**\n * Updates the current version in storage\n */\nexport const updateCurrentVersion = async () => updateVersion(await getCurrentVersion());\n","import { DEFAULT_CACHE_RETENTION } from '../constants';\r\nimport { storage } from './storage';\r\nimport { Logger } from '../utils/logger';\r\n\r\nconst logger = Logger.getInstance();\r\n\r\nexport interface CachedValue<T> {\r\n content: T | undefined,\r\n lastFetch: number,\r\n retentionInSeconds: number,\r\n}\r\n\r\nexport interface CacheResult<T> {\r\n content: T | undefined,\r\n isStale: boolean,\r\n}\r\n\r\nconst cache = {\r\n async get<T>(\r\n key: string,\r\n hydrationFn: () => Promise<T>,\r\n retentionInSeconds: number | null,\r\n forceRefresh: boolean = false,\r\n deriveRetentionInSeconds?: (content: T) => number | null | undefined,\r\n ): Promise<CacheResult<T>> {\r\n let cachedValue = await storage.get<CachedValue<T>>(key);\r\n const staleValue = cachedValue;\r\n let isStale = false;\r\n\r\n // The freshness decision for this call is always based on the\r\n // pre-existing retention (argument -> cachedValue -> default).\r\n // Any derivedRetention from the hydrated content only affects\r\n // what gets stored for *future* freshness checks.\r\n let currentRetention = retentionInSeconds ?? cachedValue?.retentionInSeconds ?? DEFAULT_CACHE_RETENTION;\r\n\r\n if (cachedValue && Date.now() <= (cachedValue.lastFetch + currentRetention * 1000) && !forceRefresh) {\r\n return {\r\n content: cachedValue.content,\r\n isStale,\r\n };\r\n }\r\n\r\n try {\r\n const rawContent = await hydrationFn();\r\n\r\n const derivedRetention = deriveRetentionInSeconds ? deriveRetentionInSeconds(rawContent) : null;\r\n if (derivedRetention != null) {\r\n currentRetention = derivedRetention;\r\n }\r\n\r\n cachedValue = await this.set(key, rawContent, currentRetention);\r\n } catch (ex) {\r\n logger.error('Error getting cached value', { error: ex });\r\n isStale = true;\r\n }\r\n\r\n return {\r\n content: cachedValue?.content ?? staleValue?.content,\r\n isStale,\r\n };\r\n },\r\n\r\n async set<T>(key: string, content: T, retentionInSeconds: number | null | undefined): Promise<CachedValue<T>> {\r\n const effectiveRetention = retentionInSeconds ?? DEFAULT_CACHE_RETENTION;\r\n const cachedValue = {\r\n content,\r\n lastFetch: Date.now(),\r\n retentionInSeconds: effectiveRetention,\r\n };\r\n\r\n await storage.set<CachedValue<T>>(key, cachedValue);\r\n return cachedValue;\r\n },\r\n\r\n async clear(key: string): Promise<void> {\r\n await storage.remove(key);\r\n },\r\n};\r\n\r\nexport default cache;\r\n","import { GiveFreelyConfig } from './types';\n\nexport type ConfigChangeEvent = {\n path: string;\n oldValue: unknown;\n newValue: unknown;\n config: GiveFreelyConfig;\n};\n\nexport type ConfigEventListener = (event: ConfigChangeEvent) => void;\nexport type ConfigEventUnsubscribe = () => void;\n\ninterface ListenerEntry {\n pattern: string;\n callback: ConfigEventListener;\n once: boolean;\n}\n\nexport class ConfigEventEmitter {\n private listeners: Map<string, Set<ListenerEntry>> = new Map();\n private wildcardListeners: Set<ListenerEntry> = new Set();\n\n public on(pattern: string, callback: ConfigEventListener): ConfigEventUnsubscribe {\n return this.addListener(pattern, callback, false);\n }\n\n public once(pattern: string, callback: ConfigEventListener): ConfigEventUnsubscribe {\n return this.addListener(pattern, callback, true);\n }\n\n public off(pattern: string, callback?: ConfigEventListener): void {\n if (!callback) {\n this.listeners.delete(pattern);\n this.wildcardListeners = new Set(\n Array.from(this.wildcardListeners).filter((entry) => entry.pattern !== pattern),\n );\n return;\n }\n\n if (pattern.includes('*')) {\n this.wildcardListeners = new Set(\n Array.from(this.wildcardListeners).filter(\n (entry) => !(entry.pattern === pattern && entry.callback === callback),\n ),\n );\n } else {\n const listeners = this.listeners.get(pattern);\n if (listeners) {\n const filtered = Array.from(listeners).filter((entry) => entry.callback !== callback);\n if (filtered.length > 0) {\n this.listeners.set(pattern, new Set(filtered));\n } else {\n this.listeners.delete(pattern);\n }\n }\n }\n }\n\n public emit(event: ConfigChangeEvent): void {\n const exactListeners = this.listeners.get(event.path) || new Set();\n const listenersToCall = new Set<ListenerEntry>();\n\n for (const listener of exactListeners) {\n listenersToCall.add(listener);\n }\n\n for (const listener of this.wildcardListeners) {\n if (this.matchesPattern(event.path, listener.pattern)) {\n listenersToCall.add(listener);\n }\n }\n\n for (const listener of listenersToCall) {\n listener.callback(event);\n\n if (listener.once) {\n this.removeListener(listener);\n }\n }\n }\n\n public clear(): void {\n this.listeners.clear();\n this.wildcardListeners.clear();\n }\n\n private addListener(pattern: string, callback: ConfigEventListener, once: boolean): ConfigEventUnsubscribe {\n const entry: ListenerEntry = { pattern, callback, once };\n\n if (pattern.includes('*')) {\n this.wildcardListeners.add(entry);\n } else {\n const patternListeners = this.listeners.get(pattern);\n if (patternListeners) {\n patternListeners.add(entry);\n } else {\n this.listeners.set(pattern, new Set([entry]));\n }\n }\n\n return () => this.off(pattern, callback);\n }\n\n private removeListener(listener: ListenerEntry): void {\n if (listener.pattern.includes('*')) {\n this.wildcardListeners.delete(listener);\n } else {\n const listeners = this.listeners.get(listener.pattern);\n if (listeners) {\n listeners.delete(listener);\n if (listeners.size === 0) {\n this.listeners.delete(listener.pattern);\n }\n }\n }\n }\n\n private matchesPattern(path: string, pattern: string): boolean {\n if (pattern === '*') return true;\n\n const regex = pattern\n .split('.')\n .map((part) => {\n if (part === '*') return '[^.]+';\n if (part === '**') return '.*';\n return part.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n })\n .join('\\\\.');\n\n return new RegExp(`^${regex}$`).test(path);\n }\n}\n","export interface ConfigDiff {\n path: string;\n oldValue: unknown;\n newValue: unknown;\n}\n\nexport function deepDiff(oldObj: unknown, newObj: unknown, path: string = ''): ConfigDiff[] {\n const diffs: ConfigDiff[] = [];\n\n if (oldObj === newObj) {\n return diffs;\n }\n\n if (isPrimitive(oldObj) || isPrimitive(newObj)) {\n if (oldObj !== newObj) {\n diffs.push({ path: path || 'root', oldValue: oldObj, newValue: newObj });\n }\n return diffs;\n }\n\n if (Array.isArray(oldObj) && Array.isArray(newObj)) {\n if (JSON.stringify(oldObj) !== JSON.stringify(newObj)) {\n diffs.push({ path: path || 'root', oldValue: oldObj, newValue: newObj });\n }\n return diffs;\n }\n\n if (isObject(oldObj) && isObject(newObj)) {\n const oldObjRecord = oldObj as Record<string, unknown>;\n const newObjRecord = newObj as Record<string, unknown>;\n const allKeys = new Set([...Object.keys(oldObjRecord), ...Object.keys(newObjRecord)]);\n\n for (const key of allKeys) {\n const currentPath = path ? `${path}.${key}` : key;\n const oldValue = oldObjRecord[key];\n const newValue = newObjRecord[key];\n\n if (!(key in oldObjRecord)) {\n diffs.push({ path: currentPath, oldValue: undefined, newValue });\n } else if (!(key in newObjRecord)) {\n diffs.push({ path: currentPath, oldValue, newValue: undefined });\n } else {\n const nestedDiffs = deepDiff(oldValue, newValue, currentPath);\n diffs.push(...nestedDiffs);\n }\n }\n } else if (oldObj !== newObj) {\n diffs.push({ path: path || 'root', oldValue: oldObj, newValue: newObj });\n }\n\n return diffs;\n}\n\nfunction isPrimitive(value: unknown): boolean {\n return value === null || value === undefined || typeof value !== 'object';\n}\n\nfunction isObject(value: unknown): boolean {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n","/**\n * Circuit breaker pattern implementation to prevent cascading failures\n * Tracks failure rate and temporarily stops operations when threshold is exceeded\n * Persists state to local storage for Chrome extension background worker compatibility\n */\n\nimport { Logger } from './logger';\n\nexport enum CircuitState {\n CLOSED = 'CLOSED', // Normal operation\n OPEN = 'OPEN', // Failing fast, not executing operations\n HALF_OPEN = 'HALF_OPEN' // Testing if service has recovered\n}\n\nexport interface CircuitBreakerOptions {\n failureThreshold: number; // Number of failures before opening\n recoveryTimeout: number; // Time in ms before attempting recovery\n monitoringWindow: number; // Time window in ms for tracking failures\n halfOpenMaxCalls: number; // Max calls allowed in half-open state\n storageKey?: string; // Key for local storage persistence\n}\n\ninterface FailureRecord {\n timestamp: number;\n error: string;\n}\n\ninterface CircuitBreakerState {\n state: CircuitState;\n failures: FailureRecord[];\n lastFailureTime: number;\n halfOpenCalls: number;\n}\n\nexport class CircuitBreaker {\n private state: CircuitState = CircuitState.CLOSED;\n private failures: FailureRecord[] = [];\n private lastFailureTime = 0;\n private halfOpenCalls = 0;\n private readonly options: CircuitBreakerOptions;\n private readonly storageKey: string;\n private readonly logger = Logger.getInstance({ minLevel: 'warn' });\n\n constructor(options: Partial<CircuitBreakerOptions> = {}) {\n this.options = {\n failureThreshold: 5,\n recoveryTimeout: 60000, // 1 minute\n monitoringWindow: 300000, // 5 minutes\n halfOpenMaxCalls: 3,\n storageKey: 'circuit_breaker_state',\n ...options,\n };\n this.storageKey = this.options.storageKey!;\n }\n\n /**\n * Initialize the circuit breaker by loading state from storage.\n * This should be called after construction since constructors cannot be async.\n */\n public async initialize(): Promise<void> {\n await this.loadFromStorage();\n }\n\n /**\n * Create and initialize a circuit breaker instance.\n * This is a convenience method that handles the async initialization.\n */\n public static async create(options: Partial<CircuitBreakerOptions> = {}): Promise<CircuitBreaker> {\n const instance = new CircuitBreaker(options);\n await instance.initialize();\n return instance;\n }\n\n private async loadFromStorage(): Promise<void> {\n try {\n if (typeof chrome !== 'undefined' && chrome.storage && chrome.storage.local) {\n const result = await chrome.storage.local.get(this.storageKey);\n const savedState = result[this.storageKey] as CircuitBreakerState | undefined;\n\n if (savedState) {\n this.state = savedState.state;\n this.failures = savedState.failures || [];\n this.lastFailureTime = savedState.lastFailureTime || 0;\n this.halfOpenCalls = savedState.halfOpenCalls || 0;\n\n // Clean up old failures based on monitoring window\n this.cleanupOldFailures();\n }\n } else if (typeof localStorage !== 'undefined') {\n // Fallback to localStorage for non-extension environments\n const savedState = localStorage.getItem(this.storageKey);\n if (savedState) {\n const parsedState = JSON.parse(savedState) as CircuitBreakerState;\n this.state = parsedState.state;\n this.failures = parsedState.failures || [];\n this.lastFailureTime = parsedState.lastFailureTime || 0;\n this.halfOpenCalls = parsedState.halfOpenCalls || 0;\n\n // Clean up old failures based on monitoring window\n this.cleanupOldFailures();\n }\n }\n } catch (error) {\n this.logger.warn('Failed to load circuit breaker state from storage:', error);\n // Continue with default state if loading fails\n }\n }\n\n private async saveToStorage(): Promise<void> {\n try {\n const stateToSave: CircuitBreakerState = {\n state: this.state,\n failures: this.failures,\n lastFailureTime: this.lastFailureTime,\n halfOpenCalls: this.halfOpenCalls,\n };\n\n if (typeof chrome !== 'undefined' && chrome.storage && chrome.storage.local) {\n await chrome.storage.local.set({ [this.storageKey]: stateToSave });\n } else if (typeof localStorage !== 'undefined') {\n // Fallback to localStorage for non-extension environments\n localStorage.setItem(this.storageKey, JSON.stringify(stateToSave));\n }\n } catch (error) {\n this.logger.warn('Failed to save circuit breaker state to storage:', error);\n // Continue operation even if saving fails\n }\n }\n\n private cleanupOldFailures(): void {\n const now = Date.now();\n this.failures = this.failures.filter(\n (failure) => now - failure.timestamp <= this.options.monitoringWindow,\n );\n }\n\n async execute<T>(operation: () => Promise<T>, fallback?: () => Promise<T>): Promise<T> {\n if (this.state === CircuitState.OPEN) {\n if (this.shouldAttemptRecovery()) {\n this.state = CircuitState.HALF_OPEN;\n this.halfOpenCalls = 0;\n await this.saveToStorage();\n } else {\n if (fallback) {\n return fallback();\n }\n throw new Error('Circuit breaker is OPEN - service temporarily unavailable');\n }\n }\n\n if (this.state === CircuitState.HALF_OPEN) {\n if (this.halfOpenCalls >= this.options.halfOpenMaxCalls) {\n throw new Error('Circuit breaker HALF_OPEN call limit exceeded');\n }\n this.halfOpenCalls += 1;\n await this.saveToStorage();\n }\n\n try {\n const result = await operation();\n await this.onSuccess();\n return result;\n } catch (error) {\n await this.onFailure(error as Error);\n throw error;\n }\n }\n\n private async onSuccess(): Promise<void> {\n if (this.state === CircuitState.HALF_OPEN) {\n this.state = CircuitState.CLOSED;\n this.failures = [];\n await this.saveToStorage();\n }\n }\n\n private async onFailure(error: Error): Promise<void> {\n const now = Date.now();\n this.lastFailureTime = now;\n\n // Add failure to tracking\n this.failures.push({\n timestamp: now,\n error: error.message,\n });\n\n // Remove old failures outside monitoring window\n this.failures = this.failures.filter(\n (failure) => now - failure.timestamp <= this.options.monitoringWindow,\n );\n\n // Check if we should open the circuit\n if (this.failures.length >= this.options.failureThreshold) {\n this.state = CircuitState.OPEN;\n }\n\n await this.saveToStorage();\n }\n\n private shouldAttemptRecovery(): boolean {\n return Date.now() - this.lastFailureTime >= this.options.recoveryTimeout;\n }\n\n public getState(): CircuitState {\n return this.state;\n }\n\n public getFailureCount(): number {\n const now = Date.now();\n return this.failures.filter(\n (failure) => now - failure.timestamp <= this.options.monitoringWindow,\n ).length;\n }\n\n public async reset(): Promise<void> {\n this.state = CircuitState.CLOSED;\n this.failures = [];\n this.lastFailureTime = 0;\n this.halfOpenCalls = 0;\n await this.saveToStorage();\n }\n\n /**\n * Clear the circuit breaker state from storage.\n * Useful for cleanup or testing purposes.\n */\n public async clearStorage(): Promise<void> {\n if (typeof chrome !== 'undefined' && chrome.storage && chrome.storage.local) {\n await chrome.storage.local.remove(this.storageKey);\n } else if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(this.storageKey);\n }\n }\n\n public getStatus(): {\n state: CircuitState;\n failureCount: number;\n nextAttemptTime: number | null;\n } {\n return {\n state: this.state,\n failureCount: this.getFailureCount(),\n nextAttemptTime: this.state === CircuitState.OPEN\n ? this.lastFailureTime + this.options.recoveryTimeout\n : null,\n };\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { retryOperation, RetryOptions } from '../utils/retry';\nimport {\n GfCheckoutPopup,\n BaseGiveFreelyConfig,\n PartnerGiveFreelyConfig,\n GlobalGiveFreelyConfig,\n GiveFreelyConfig,\n} from './types';\nimport { merchantExclusionsAdapter } from './giveFreelyConfigAdapters';\nimport { isNewVersion } from '../utils/current-version';\nimport cache from '../utils/cache';\nimport { ConfigEventEmitter, ConfigEventListener, ConfigEventUnsubscribe } from './ConfigEventEmitter';\nimport { deepDiff } from './configDiff';\nimport { GLOBAL_CONFIG_STORAGE_KEY, PARTNER_CONFIG_STORAGE_KEY } from '../constants';\nimport { CircuitBreaker } from '../utils/circuit-breaker';\n\nconst CONFIG_BASE_URL = 'https://cdn.givefreely.com/adunit/behavioral/';\n\nexport type {\n GfCheckoutPopup,\n BaseGiveFreelyConfig,\n PartnerGiveFreelyConfig,\n GlobalGiveFreelyConfig,\n GiveFreelyConfig,\n};\n\nexport class GiveFreelyConfigService {\n private partnerConfig: PartnerGiveFreelyConfig | null = null;\n private globalConfig: GlobalGiveFreelyConfig | null = null;\n private mergedConfig: GiveFreelyConfig | null = null;\n // When the worker is killed, we default to no interval to honor the cache retention.\n private globalConfigRefreshInterval: number | null = null;\n private partnerConfigRefreshInterval: number | null = null;\n private readonly eventEmitter = new ConfigEventEmitter();\n private readonly partnerCircuitBreaker: CircuitBreaker;\n private readonly globalCircuitBreaker: CircuitBreaker;\n private isInitialized = false;\n\n constructor(private readonly partnerApiKey: string) {\n this.partnerCircuitBreaker = new CircuitBreaker({\n failureThreshold: 3,\n recoveryTimeout: 60000, // 1 minute\n monitoringWindow: 300000, // 5 minutes\n storageKey: `gf_partner_circuit_breaker_${partnerApiKey}`,\n });\n this.globalCircuitBreaker = new CircuitBreaker({\n failureThreshold: 3,\n recoveryTimeout: 60000, // 1 minute\n monitoringWindow: 300000, // 5 minutes\n storageKey: 'gf_global_circuit_breaker',\n });\n }\n\n /**\n * Initialize the service by loading circuit breaker states from storage.\n * This should be called before using any other methods.\n */\n public async initialize(): Promise<void> {\n if (this.isInitialized) return;\n\n await Promise.all([\n this.partnerCircuitBreaker.initialize(),\n this.globalCircuitBreaker.initialize(),\n ]);\n\n this.isInitialized = true;\n }\n\n private ensureInitialized(): void {\n if (!this.isInitialized) {\n throw new Error('GiveFreelyConfigService must be initialized before use. Call initialize() or use create() method.');\n }\n }\n\n private getRetryOptions(): RetryOptions {\n return {\n delayFn: (attempt) => 1000 * attempt,\n maxAttempts: 3,\n };\n }\n\n private async fetchPartnerConfig(): Promise<PartnerGiveFreelyConfig> {\n const cacheResult = await retryOperation(\n async () => {\n const rawContent = await fetch(`${CONFIG_BASE_URL}${this.partnerApiKey}.json`, { cache: 'no-store' });\n if (!rawContent.ok) {\n throw new Error(`Failed to fetch partner config: ${rawContent.statusText}`);\n }\n return rawContent.json();\n },\n this.getRetryOptions(),\n );\n\n if (!cacheResult) {\n throw new Error('Failed to fetch or get from cache partner config');\n }\n\n this.partnerConfigRefreshInterval = cacheResult.configRefreshInterval || this.partnerConfigRefreshInterval;\n return cacheResult;\n }\n\n private async fetchGlobalConfig(): Promise<GlobalGiveFreelyConfig> {\n const globalConfig = process.env.NODE_ENV === 'production' ? 'global.json' : 'global-dev.json';\n const rawContent = await retryOperation(\n async () => {\n const configResponse = await fetch(`${CONFIG_BASE_URL}${globalConfig}`, { cache: 'no-store' });\n if (!configResponse.ok) {\n throw new Error(`Failed to fetch global config => Status code: ${configResponse.status} .${configResponse.statusText}`);\n }\n return configResponse.json();\n },\n this.getRetryOptions(),\n );\n\n if (!rawContent) {\n throw new Error('Failed to fetch or get from cache global config', rawContent);\n }\n\n this.globalConfigRefreshInterval = rawContent.configRefreshInterval || this.globalConfigRefreshInterval;\n return rawContent;\n }\n\n public async getCachedConfig() {\n return this.mergedConfig;\n }\n\n public async getConfig(forceRefreshIfIsNewVersion: boolean = false): Promise<GiveFreelyConfig> {\n this.ensureInitialized();\n\n let isANewVersion = false;\n // If forceRefreshIfIsNewVersion is true, check if there is a new version\n if (forceRefreshIfIsNewVersion) {\n isANewVersion = await isNewVersion();\n }\n\n const [partnerConfig, globalConfig] = await Promise.all([\n cache.get(\n PARTNER_CONFIG_STORAGE_KEY,\n this.fetchPartnerConfig.bind(this),\n this.partnerConfigRefreshInterval,\n isANewVersion,\n (config) => config?.configRefreshInterval ?? null,\n ),\n cache.get(\n GLOBAL_CONFIG_STORAGE_KEY,\n this.fetchGlobalConfig.bind(this),\n this.globalConfigRefreshInterval,\n isANewVersion,\n (config) => config?.configRefreshInterval ?? null,\n ),\n ]);\n\n if (!globalConfig.content) throw new Error('Global config is required');\n if (!partnerConfig.content) throw new Error('Partner config is required');\n\n this.partnerConfig = partnerConfig.content;\n this.globalConfig = globalConfig.content;\n\n // Create a deep copy of the configs before merging to avoid side effects\n const mergedConfigs = this.mergeConfigs(\n JSON.parse(JSON.stringify(this.globalConfig)),\n JSON.parse(JSON.stringify(this.partnerConfig)),\n );\n\n if (!mergedConfigs) throw new Error('Was not able to merge configs');\n\n // If we need special handling for merchantExclusions, do it after the merge\n merchantExclusionsAdapter(mergedConfigs, this.globalConfig, this.partnerConfig);\n\n // Emit change events if config has changed\n this.emitConfigChanges(mergedConfigs);\n\n return mergedConfigs;\n }\n\n public async clearCache(): Promise<void> {\n this.ensureInitialized();\n\n await Promise.all([\n cache.clear(PARTNER_CONFIG_STORAGE_KEY),\n cache.clear(GLOBAL_CONFIG_STORAGE_KEY),\n ]);\n\n this.partnerConfig = null;\n this.globalConfig = null;\n this.mergedConfig = null;\n this.eventEmitter.clear();\n\n // Reset circuit breakers when clearing cache\n await Promise.all([\n this.partnerCircuitBreaker.reset(),\n this.globalCircuitBreaker.reset(),\n ]);\n }\n\n public getCircuitBreakerStatus(): {\n partner: ReturnType<CircuitBreaker['getStatus']>;\n global: ReturnType<CircuitBreaker['getStatus']>;\n } {\n this.ensureInitialized();\n\n return {\n partner: this.partnerCircuitBreaker.getStatus(),\n global: this.globalCircuitBreaker.getStatus(),\n };\n }\n\n /**\n * Deep merging both GlobalGiveFreelyConfig & PartnerGiveFreelyConfig\n * with PartnerGiveFreelyConfig taking precedence over GlobalGiveFreelyConfig\n * @param globalConfig\n * @param partnerConfig\n * @returns\n */\n private mergeConfigs(\n globalConfig: GlobalGiveFreelyConfig,\n partnerConfig: PartnerGiveFreelyConfig,\n ): GiveFreelyConfig {\n if (!partnerConfig) return globalConfig as GlobalGiveFreelyConfig & PartnerGiveFreelyConfig;\n if (!globalConfig) return partnerConfig;\n\n const result: Record<string, any> = { ...globalConfig };\n\n Object.keys(partnerConfig).forEach((key) => {\n if (!Object.prototype.hasOwnProperty.call(partnerConfig, key)) return;\n\n const globalConfigRecord = (globalConfig as Record<string, any>)[key];\n const partnerConfigRecord = (partnerConfig as Record<string, any>)[key];\n\n // When the value is undefined in partner config, keep the global value\n if (partnerConfigRecord === undefined) return;\n\n // For arrays, we replace the entire array with the partner's array\n if (Array.isArray(partnerConfigRecord)) {\n result[key] = [...partnerConfigRecord];\n return;\n }\n\n // For objects, we recursively merge them\n if (\n partnerConfigRecord !== null\n && typeof partnerConfigRecord === 'object'\n && globalConfigRecord !== null\n && typeof globalConfigRecord === 'object'\n ) {\n result[key] = this.mergeConfigs(globalConfigRecord, partnerConfigRecord);\n return;\n }\n\n // For primitive values, we use the partner's value\n result[key] = partnerConfigRecord;\n });\n\n return result as GiveFreelyConfig;\n }\n\n /**\n * Subscribe to config property changes\n * @param pattern - Property path pattern (supports wildcards: *, **)\n * Examples: 'displayName', 'apiConfig.*', '**'\n * @param callback - Function to call when matching properties change\n * @returns Unsubscribe function\n */\n public on(pattern: string, callback: ConfigEventListener): ConfigEventUnsubscribe {\n return this.eventEmitter.on(pattern, callback);\n }\n\n /**\n * Subscribe to config property changes (one-time)\n * @param pattern - Property path pattern (supports wildcards: *, **)\n * @param callback - Function to call when matching properties change\n * @returns Unsubscribe function\n */\n public once(pattern: string, callback: ConfigEventListener): ConfigEventUnsubscribe {\n return this.eventEmitter.once(pattern, callback);\n }\n\n /**\n * Unsubscribe from config property changes\n * @param pattern - Property path pattern\n * @param callback - Optional specific callback to remove\n */\n public off(pattern: string, callback?: ConfigEventListener): void {\n this.eventEmitter.off(pattern, callback);\n }\n\n private emitConfigChanges(newConfig: GiveFreelyConfig): void {\n if (!this.mergedConfig) {\n // First time loading config, emit for all properties\n this.mergedConfig = newConfig;\n this.eventEmitter.emit({\n path: 'root',\n oldValue: null,\n newValue: newConfig,\n config: newConfig,\n });\n return;\n }\n\n // Compare and emit changes\n const diffs = deepDiff(this.mergedConfig, newConfig);\n for (const diff of diffs) {\n this.eventEmitter.emit({\n path: diff.path,\n oldValue: diff.oldValue,\n newValue: diff.newValue,\n config: newConfig,\n });\n }\n\n this.mergedConfig = newConfig;\n }\n}\n\n/**\n * Create and initialize a GiveFreelyConfigService instance.\n * This is a convenience method that handles the async initialization.\n */\nexport async function create(partnerApiKey: string): Promise <GiveFreelyConfigService> {\n const instance = new GiveFreelyConfigService(partnerApiKey);\n await instance.initialize();\n return instance;\n}\n","import { GiveFreelyConfig, GlobalGiveFreelyConfig, PartnerGiveFreelyConfig } from './types';\n\n/**\n * adapt the end config file to have the combined merchantExclusions fields into it\n * @param destinationConfig the target config where the result should be injected into\n * @param globalConfig the global config file\n * @param partnerConfig the partner config file\n */\n/* eslint no-param-reassign: [\"error\", { \"props\": true, \"ignorePropertyModificationsFor\": [\"destinationConfig\"] }] */\nexport const merchantExclusionsAdapter = (\n destinationConfig: GiveFreelyConfig,\n globalConfig: GlobalGiveFreelyConfig,\n partnerConfig: PartnerGiveFreelyConfig,\n) => {\n // Ensure we are always working with arrays...otherwise we get into an exception in case one of them is null or undefined\n const globalExclusions = globalConfig.merchantExclusions ?? [];\n const partnerExclusions = partnerConfig.merchantExclusions ?? [];\n\n const merchantExclusions = [...globalExclusions, ...partnerExclusions];\n destinationConfig.merchantExclusions = merchantExclusions;\n};\n","import { sendMessage } from '../browser';\r\nimport { GiveFreelyConfigService } from '../config/giveFreelyConfig';\r\nimport { GF_AD_EVENT_HISTORY_STORAGE_KEY, MESSAGE_TYPES } from '../constants';\r\nimport { addMinutes } from '../utils/add-time';\r\nimport { getCurrentVersion } from '../utils/current-version';\r\nimport { Logger } from '../utils/logger';\r\nimport { storage } from '../utils/storage';\r\nimport { GiveFreelyUserService } from '../vendors/givefreely/giveFreelyUserService';\r\nimport { EventHistoryEntry, EventType, GfEvent } from './types';\r\n\r\nexport class Analytics {\r\n private _partnerApiKey: string;\r\n private readonly _configService: GiveFreelyConfigService;\r\n private _debounceWindowInMinutes: number;\r\n private readonly _userService: GiveFreelyUserService;\r\n private readonly _logger: Logger;\r\n\r\n /**\r\n * @param partnerApiKey The partner key\r\n * @param debounceWindowInMinutes Number of minutes after which the same event can be broadcasted again. Default is 60 minutes.\r\n */\r\n constructor(partnerApiKey: string, userService: GiveFreelyUserService, configService: GiveFreelyConfigService, debounceWindowInMinutes = 60) {\r\n this._partnerApiKey = partnerApiKey;\r\n this._userService = userService;\r\n this._debounceWindowInMinutes = debounceWindowInMinutes;\r\n this._logger = Logger.getInstance({ title: 'Analytics' });\r\n this._configService = configService;\r\n }\r\n\r\n /**\r\n * Sends a request for broadcasting an event in the background.\r\n * Call this method from content scripts only\r\n */\r\n static trackEvent = async<T extends EventType>(eventType: T, eventData: unknown, anonymous: boolean = false, skipThrottling: boolean = false) => {\r\n await sendMessage({\r\n type: MESSAGE_TYPES.TRACK_EVENT,\r\n payload: {\r\n eventType, eventData, anonymous, skipThrottling,\r\n },\r\n\r\n });\r\n };\r\n\r\n track = async<T extends EventType>\r\n (eventType: T, wfDeviceId?: number, payload?: unknown, anonymous: boolean = false, skipThrottling: boolean = false): Promise<boolean> => {\r\n const event: GfEvent<T> = {\r\n partner: `adUnit_${this._partnerApiKey}`,\r\n eventType,\r\n eventData: {\r\n userId: anonymous ? undefined : this._userService?.user?.id,\r\n libVersion: getCurrentVersion(),\r\n wfDeviceId,\r\n ...payload!,\r\n },\r\n };\r\n\r\n try {\r\n const serializedEvent = JSON.stringify(event, (_key, value) => {\r\n if (value instanceof Error) {\r\n return {\r\n name: value.name,\r\n message: value.message,\r\n stack: value.stack,\r\n };\r\n }\r\n return value;\r\n });\r\n\r\n const eventsUrl = await this.getEventsUrl();\r\n if (eventsUrl) {\n const result = await this.BroadcastEvent(eventsUrl, serializedEvent, event, skipThrottling);\n return result;\n }\r\n\r\n this._logger.info('Cant broadcast event. eventsUrl cant be retrieved from config', event, true);\r\n return false;\n } catch (error) {\r\n // Prevent logging this remotely to avoid further network errors and enter in an infinite loop\r\n this._logger.error('Something unexpected happened when dispatching a gf event', { error, event }, true);\r\n return false;\r\n }\r\n };\r\n\r\n private async BroadcastEvent(eventsUrl: string, serializedEvent: string,\r event: GfEvent<EventType>, skipThrottling: boolean): Promise<boolean> {\r\n if (await this.shouldBroadcastEvent(serializedEvent, skipThrottling)) {\r\n const result = await fetch(eventsUrl, {\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n method: 'POST',\r\n body: serializedEvent,\r\n cache: 'no-store',\r\n });\r\n\r\n if (!result.ok) {\r\n this._logger.error('Something unexpected happened when dispatching an event', {\r\n status: result.status,\r\n statusText: result.statusText,\r\n event,\r\n }, true);\r\n\r\n return false;\r\n }\r\n await this.pushEventToHistory(serializedEvent);\r\n return true;\r\n }\r\n\r\n this._logger.info('This event has already been broadcasted during the past hour', event, true);\r\n return false;\r\n }\r\n\r\n private async getEventsUrl(): Promise<string | undefined> {\r\n // Warning: Always get the cached config here to avoid infinite loops\r\n const config = await this._configService.getCachedConfig();\r\n return config?.eventsUrl;\r\n }\r\n\r\n private getEventsHistory = async (): Promise<EventHistoryEntry[]> => {\r\n const history = await storage.get<EventHistoryEntry[]>(GF_AD_EVENT_HISTORY_STORAGE_KEY);\r\n\r\n // Old entries cleanup (We remove any entry older than x minutes ago)\r\n const lastHourDate = addMinutes(-this._debounceWindowInMinutes);\r\n\r\n const typedHistory = ((history || []) as EventHistoryEntry[])\r\n .filter((x) => x.createdAt > lastHourDate);\r\n\r\n await storage.set(GF_AD_EVENT_HISTORY_STORAGE_KEY, typedHistory);\r\n\r\n return typedHistory;\r\n };\r\n\r\n private shouldBroadcastEvent = async (serializedEvent: string, skipThrottling: boolean): Promise<boolean> => {\r\n if (skipThrottling) return true;\r\n\r\n const history = await this.getEventsHistory();\r\n\r\n return !history.some((entry) => entry.payload === serializedEvent);\r\n };\r\n\r\n private pushEventToHistory = async (serializedEvent: string): Promise<void> => {\r\n const history = await this.getEventsHistory();\r\n\r\n history.push({\r\n createdAt: Date.now(),\r\n payload: serializedEvent,\r\n });\r\n\r\n await storage.set(GF_AD_EVENT_HISTORY_STORAGE_KEY, history);\r\n };\r\n}\r\n","/**\n * Adds the provided hours to the current date and returns it as a unix-like epoch\n */\nexport const addHours = (h: number): number => {\n const now = new Date();\n now.setTime(now.getTime() + (h * 60 * 60 * 1000));\n\n return now.getTime();\n};\n\n/**\n * Adds the provided minutes to the current date and returns it as a unix-like epoch\n */\nexport const addMinutes = (m: number): number => {\n const now = new Date();\n now.setTime(now.getTime() + (m * 60 * 1000));\n\n return now.getTime();\n};\n","import browser from 'webextension-polyfill';\r\nimport { LAST_HEALTH_CHECK_STORAGE_KEY } from '../constants';\r\nimport { Logger } from '../utils/logger';\r\nimport { storage } from '../utils/storage';\r\nimport { EventType, PopupEvent } from './types';\r\n\r\ntype TrackEventFunction = (\r\n eventType: EventType,\r\n eventData?: unknown,\r\n) => Promise<boolean>;\r\n\r\nexport class HealthCheck {\r\n private lastCheck: number | null;\r\n private trackEvent: TrackEventFunction;\r\n private logger: Logger;\r\n\r\n constructor(trackEvent: TrackEventFunction, logger: Logger) {\r\n this.lastCheck = null;\r\n this.trackEvent = trackEvent;\r\n this.logger = logger;\r\n }\r\n\r\n public async initialize(): Promise<void> {\r\n const lastHealthCheckStored = await storage.get<number>(LAST_HEALTH_CHECK_STORAGE_KEY);\r\n if (lastHealthCheckStored) {\r\n this.lastCheck = lastHealthCheckStored;\r\n }\r\n }\r\n\r\n private getToday(): string {\r\n const today = new Date();\r\n return today.toISOString().split('T')[0];\r\n }\r\n\r\n public async check(): Promise<void> {\r\n try {\r\n const lastHealthCheck = this.lastCheck ?? 0;\r\n const today = this.getToday();\r\n const lastCheckDate = lastHealthCheck ? new Date(lastHealthCheck).toISOString().split('T')[0] : null;\r\n\r\n if (lastCheckDate !== today) {\r\n this.lastCheck = Date.now();\r\n // We store the last health check date in storage in case the service is destroyed\r\n await storage.set(LAST_HEALTH_CHECK_STORAGE_KEY, this.lastCheck);\r\n await this.trackEvent(\r\n PopupEvent.checkoutPopupHealthCheck,\r\n { language: browser.i18n.getUILanguage() },\r\n );\r\n }\r\n } catch (error) {\r\n // No need to log this remotely to avoid potential loops. The absence of the health check is enough\r\n this.logger.error('Health check failed', { error: error instanceof Error ? error.message : 'Unknown error' }, true);\r\n }\r\n }\r\n}\r\n","/* eslint max-classes-per-file: \"off\" */\n\nimport { PartnerGiveFreelyConfig } from '../../config/giveFreelyConfig';\nimport { Logger } from '../../utils/logger';\nimport { GiveFreelyAnonymousUser, GiveFreelyCommissions } from './types';\n\ninterface PutAnonymousUserResponse {\n id: string,\n externalId: string,\n email: string,\n anonymousEmail: string\n firstName: string,\n lastName: string,\n selectedCharity: string,\n selectedCharityThirdPartyIdentifier: string,\n deviceId: number\n}\n\nexport enum CommissionStatusEnum\n{\n Pending = 0,\n Ready = 1,\n Received = 2,\n Donated = 3,\n Disqualified = 4\n}\n\nexport class GetAnonymousUserCommissionsRequest {\n fromDate?: string;\n toDate?: string;\n status?: CommissionStatusEnum;\n offset?: number = 0;\n pageSize?: number = 10;\n}\n\nexport class CreateOrUpdateAnonymousUserRequest {\n anonymousEmail?: string;\n firstName?: string;\n lastName?: string;\n selectedCharity?: string;\n selectedCharityThirdPartyIdentifier?: string;\n deviceId?: number;\n}\n\nexport interface CreateOrUpdateAnonymousUserResponse {\n resultUser: GiveFreelyAnonymousUser;\n resultToken: string | null;\n}\n/**\n * Client used to communicate with GiveFreely's api.\n * @param adUnitId - the uniqueid of the adUnit. ie.: chrome extension unique id\n * @param dependencies - internal dependencies\n */\nexport class GiveFreelyApiClient {\n private readonly adUnitId: string;\n private readonly config: PartnerGiveFreelyConfig;\n private readonly logger: Logger;\n\n constructor(\n adUnitId: string,\n config: PartnerGiveFreelyConfig,\n logger: Logger,\n ) {\n this.adUnitId = adUnitId;\n this.config = config;\n this.logger = logger;\n }\n\n /**\n * invoke it and it's gonna use the internal stored user token to fetch the commissons from the api\n * params fromDate=2024-01-01&toDate=2025-02-20&status=0&offset=1&pageSize=10\n * @returns anonymou user entity\n */\n public async getAnonymousUserCommissions(\n anonymousUserToken: string,\n filterParams?: GetAnonymousUserCommissionsRequest,\n ): Promise<GiveFreelyCommissions> {\n try {\n const queryString = new URLSearchParams(filterParams as Record<string, string>).toString();\n const response = await fetch(`${this.config.apiConfig.baseUri}/${this.config.apiConfig.getAnonymousUserComissionsPath}?${queryString}`, {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n 'X-AnonymousUserToken': anonymousUserToken,\n },\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch commissions. Status code: ${response.status} .${response.statusText}`);\n }\n\n const result: GiveFreelyCommissions = await response.json();\n return result;\n } catch (error) {\n this.logger.error(\"[GiveFreelyApiClient] Error fetching anonymous user's commissions:\", { error });\n throw error;\n }\n }\n\n /**\n * invoke it for the first time and it's gonna create an anonymous user.\n * invoke from 2nd time on, and it's gonna try to update the anonymous user\n * @param user - the user payload\n * @param adUnitId - the uniqueid of the adUnit. ie.: chrome extension unique id\n * @returns anonymou user entity\n */\n public async createOrUpdateAnonymousUser(\n requestPayload: CreateOrUpdateAnonymousUserRequest,\n anonymousUserToken: string | null,\n ): Promise<CreateOrUpdateAnonymousUserResponse> {\n try {\n const response = await fetch(`${this.config.apiConfig.baseUri}/${this.config.apiConfig.createAnonymousUserPath}?adUnitId=${this.adUnitId}`, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/json',\n 'X-GF-Platform': 'adUnitLibrary',\n 'X-AnonymousUserToken': anonymousUserToken ?? '',\n },\n body: JSON.stringify(requestPayload),\n });\n\n if (!response.ok) {\n this.logger.error(`Failed to create/update anonymous user. Status code: ${response.status}. ${response.statusText}`);\n throw new Error(`Failed to create/update anonymous user. Status code: ${response.status}. ${response.statusText}`);\n }\n this.logger.info('[GiveFreelyApiClient] anonymous user created/updated successfully.');\n\n const result: PutAnonymousUserResponse = await response.json();\n const setAnonymousUserTokenHeader = response.headers.get('X-AnonymousUserToken');\n\n return {\n resultUser: {\n ...result,\n charity: {\n ein: result.selectedCharity,\n thirdPartyId: result.selectedCharityThirdPartyIdentifier,\n name: undefined,\n },\n },\n resultToken: setAnonymousUserTokenHeader,\n };\n } catch (error) {\n this.logger.error('[GiveFreelyApiClient] Error creating anonymous user:', { error }, true);\n throw error;\n }\n }\n}\n","import { storage } from '../../utils/storage';\nimport { CreateOrUpdateAnonymousUserRequest, GiveFreelyApiClient } from './giveFreelyApiClient';\nimport { GiveFreelyAnonymousUser, GiveFreelyCharity } from './types';\nimport { Logger } from '../../utils/logger';\nimport { ANONYMOUS_ENCRYPTED_TOKEN_STORAGE_KEY, ANONYMOUS_USER_STORAGE_KEY } from '../../constants';\n\nexport class GiveFreelyUserService {\n private readonly _giveFreelyApiClient: GiveFreelyApiClient;\n private readonly _logger: Logger;\n\n public user: GiveFreelyAnonymousUser | null;\n\n constructor(giveFreelyApiClient: GiveFreelyApiClient, logger: Logger) {\n this._giveFreelyApiClient = giveFreelyApiClient;\n this._logger = logger;\n this.user = null;\n }\n\n /**\n * invoke it and all internal stored user data gets erased.\n * Note: you can then invoke upsertUser(...) again to create a new anonymous user\n * @returns void\n */\n public async resetUser(): Promise<void> {\n await storage.remove(ANONYMOUS_ENCRYPTED_TOKEN_STORAGE_KEY);\n await storage.remove(ANONYMOUS_USER_STORAGE_KEY);\n }\n\n public async upsertUser(charity?: GiveFreelyCharity, wfDeviceId?: number) : Promise<GiveFreelyAnonymousUser | null> {\n let currentUser = await this.fetchUser();\n\n try {\n const changingPayload = {\n selectedCharity: charity?.ein,\n selectedCharityThirdPartyIdentifier: charity?.thirdPartyId,\n deviceId: wfDeviceId,\n };\n\n // we want to prevent unecessary calls to the API, calling it only when data has changed\n if (!(await this.shouldCreateOrUpdateUser(currentUser, changingPayload))) return currentUser;\n\n const anonymousEncriptedToken = await storage.get<string>(ANONYMOUS_ENCRYPTED_TOKEN_STORAGE_KEY);\n const { resultUser, resultToken } = await this._giveFreelyApiClient.createOrUpdateAnonymousUser(changingPayload, anonymousEncriptedToken);\n if (resultToken) await storage.set(ANONYMOUS_ENCRYPTED_TOKEN_STORAGE_KEY, resultToken);\n if (resultUser) {\n await storage.set(ANONYMOUS_USER_STORAGE_KEY, resultUser);\n currentUser = resultUser;\n }\n } catch (error) {\n this._logger.error('Error creating/updating anonymous user:', error);\n }\n\n this.user = currentUser;\n return currentUser; // we want to either return the new/updated user, or the existing(currentUser) one even if its null\n }\n\n /**\n * fetches the latest version of the user.\n * Notice: Used while initializing giveFreelyService only, while this instance is not initialized yet. Otherwise, use <instance>.user instead, to avoid extra overhead.\n * @returns\n */\n public async fetchUser() : Promise<GiveFreelyAnonymousUser | null> {\n const user = await storage.get<GiveFreelyAnonymousUser>(ANONYMOUS_USER_STORAGE_KEY);\n this.user = user;\n\n return user;\n }\n\n private async shouldCreateOrUpdateUser(\n currentUser: GiveFreelyAnonymousUser | null,\n requestPayload: CreateOrUpdateAnonymousUserRequest,\n ) : Promise<boolean> {\n return (\n // user has not been stored yet\n !currentUser\n // charity has changed\n || currentUser.charity?.ein !== requestPayload.selectedCharity || currentUser.charity?.thirdPartyId !== requestPayload.selectedCharityThirdPartyIdentifier\n // deviceId has changed\n || currentUser.deviceId !== requestPayload.deviceId\n );\n }\n}\n","import { Logger } from '../../utils/logger';\nimport {\n WildfireActiveDomain, WildfireDevice, WildfireMerchantRates, WildfireStandDownPolicy,\n} from './types';\n\nexport class WildfireClient {\n private wfAppId: string;\n private wfSecret: string;\n private deviceUrl: string;\n private dataUrl: string;\n private _logger: Logger;\n\n constructor(\n wfSecret: string,\n wfAppId: string,\n deviceUrl: string,\n dataUrl: string,\n logger: Logger,\n ) {\n this.wfSecret = wfSecret;\n this.wfAppId = wfAppId;\n this.deviceUrl = deviceUrl;\n this.dataUrl = dataUrl;\n this._logger = logger;\n }\n\n public async getWildfireDevice(): Promise<WildfireDevice> {\n try {\n const response = await fetch(this.deviceUrl, {\n method: 'POST',\n body: JSON.stringify({}), // An empty body is required by WFs API\n headers: {\n 'Content-Type': 'application/json',\n 'WF-Secret': this.wfSecret,\n 'WF-App-ID': this.wfAppId,\n },\n });\n if (response.ok) return response.json() as Promise<WildfireDevice>;\n throw new Error(`Failed to fetch Wildfire device from ${this.deviceUrl}. Status ${response.status}. ${response.statusText}`);\n } catch (err) {\n this._logger.error('Failed to fetch the Wildfire device', { err });\n throw err;\n }\n }\n\n public async getActiveDomains(): Promise<WildfireActiveDomain[]> {\n try {\n const url = `${this.dataUrl}/${this.wfAppId}/active-domain/1`;\n const response = await fetch(url);\n if (response.ok) return response.json() as Promise<WildfireActiveDomain[]>;\n throw new Error(`Failed to fetch active domains from ${url}. Status ${response.status}. ${response.statusText}`);\n } catch (err) {\n this._logger.error('Failed to fetch the active domains', { err });\n throw err;\n }\n }\n\n public async getStanddownPolicy(): Promise<WildfireStandDownPolicy> {\n const url = `${this.dataUrl}/${this.wfAppId}/stand-down-policy/1`;\n\n try {\n const response = await fetch(url);\n\n if (response.ok) return response.json() as Promise<WildfireStandDownPolicy>;\n\n throw new Error(`Failed to fetch standdown policy from ${url}. Status ${response.status}. ${response.statusText}`);\n } catch (err) {\n this._logger.error('Failed to fetch the standdown policy', { err, url });\n throw err;\n }\n }\n\n public async getMerchantRates(): Promise<WildfireMerchantRates> {\n const url = `${this.dataUrl}/${this.wfAppId}/merchant-rate/1`;\n\n try {\n const response = await fetch(url);\n this._logger.debug('Merchant rates response', { response });\n if (!response.ok) {\n throw new Error(`Failed to fetch merchant rates from ${url}. Status ${response.status}. ${response.statusText}`);\n }\n const rates = response.json() as Promise<WildfireMerchantRates>;\n this._logger.debug('Merchant rates', { rates });\n\n return rates;\n } catch (err) {\n this._logger.error('Failed to fetch the merchant rates', { err, url });\n\n throw err;\n }\n }\n}\n","import { WildfireStandDownHistory, WildfireStandDownPolicy } from './types';\nimport type { WildfireService } from './wildfireService';\nimport { storage } from '../../utils/storage';\nimport { WILDFIRE_STORAGE_KEYS as wildfireStorageKeys } from '../../../shared/constants';\nimport { Logger } from '../../utils/logger';\n\nexport async function shouldStandDown(this: WildfireService, logger: Logger, activeDomain: string, url: string): Promise<boolean> {\n try {\n const affiliateStandDown = (await getStanddownHistory())\n ?.[activeDomain];\n\n if (affiliateStandDown && affiliateStandDown > Date.now()) {\n logger.info('Standing down because current affiliate stand down session has not expired');\n void updateStanddownHistory(activeDomain);\n return true;\n }\n\n await this.refreshCache();\n const policy = await this.getStanddownPolicy();\n\n if (hasAffiliateParams(policy, new URL(url).search)) {\n logger.info('Standing down because url has affiliate params');\n void updateStanddownHistory(activeDomain);\n return true;\n }\n\n logger.info('No need to stand down.');\n } catch (error) {\n logger.error('Exception produced when trying to determine if it should stand down', error);\n }\n\n return false;\n}\n\n// We want to keep this method synchronous so it can be called on the OnBeforeRequest listener that can't be async\nexport function hasAffiliation(this: WildfireService, hostNames: (string | undefined)[], search: string): boolean {\n if (!this.standDownPolicy) {\n this.logger.warn('Couldnt check affilliation. No stand down policy found');\n // Defensive code: Just in case the stand down policy is not being held by the service anymore\n this.getStanddownPolicy().then((policy) => {\n this.standDownPolicy = policy;\n });\n return false;\n }\n\n const result = hostNames.some((hostname) => hasAffiliateDomain(this.standDownPolicy!, hostname))\n || hasAffiliateParams(this.standDownPolicy!, search);\n\n this.logger.info('Affilliation result:', result);\n\n return result;\n}\n\nconst getStanddownHistory = async (): Promise<WildfireStandDownHistory | null> => storage.get<WildfireStandDownHistory>(wildfireStorageKeys.STANDDOWN_HISTORY);\n\nexport const updateStanddownHistory = async (domain: string, hours = 1): Promise<void> => {\n const history = (await getStanddownHistory()) ?? {};\n history[domain] = Date.now() + (hours * 60 * 60 * 1000);\n\n await storage.set(wildfireStorageKeys.STANDDOWN_HISTORY, history);\n};\n\nconst hasAffiliateDomain = (policy: WildfireStandDownPolicy, hostname?: string): boolean => {\n if (!hostname) return false;\n const { Domains } = policy;\n return Domains.some((domain) => hostname.includes(domain));\n};\n\nconst hasAffiliateParams = (policy: WildfireStandDownPolicy, searchParams?: string): boolean => {\n if (!searchParams) return false;\n\n const { Params } = policy;\n\n return (\n Params.some((param) => searchParams.toLowerCase().includes(`?${param.toLowerCase()}`))\n || Params.some((param) => searchParams.toLowerCase().includes(`&${param.toLowerCase()}`))\n );\n};\n","export class TrackingCode {\r\n private userId: string;\r\n private charityEin: string;\r\n private charityThirdPartyIdentifier: string;\r\n private partnerId: string;\r\n\r\n constructor(\r\n userId: string,\r\n charityEin: string,\r\n charityThirdPartyIdentifier: string,\r\n partnerId: string,\r\n ) {\r\n this.userId = userId;\r\n this.charityEin = charityEin;\r\n this.charityThirdPartyIdentifier = charityThirdPartyIdentifier;\r\n this.partnerId = partnerId;\r\n }\r\n\r\n toString(): string {\r\n const encodedUserId = this.encodeUserId(this.userId);\r\n return `userId=${encodedUserId},charityEin=${this.charityEin},charityThirdPartyIdentifier=${this.charityThirdPartyIdentifier},partnerId=${this.partnerId}`;\r\n }\r\n\r\n private encodeUserId(userId: string): string {\r\n return btoa(userId).replace(/_/g, '/').replace(/-/g, '+');\r\n }\r\n}\r\n","import { WildfireClient } from './wildfireClient';\nimport { storage } from '../../utils/storage';\nimport {\n RateKindMap,\n WildfireActiveDomain,\n WildfireDevice,\n WildfireMerchantRateDetail,\n WildfireMerchantRates,\n WildfireStandDownPolicy,\n} from './types';\nimport { retryOperation, RetryOptions } from '../../utils/retry';\nimport { WILDFIRE_STORAGE_KEYS as wildfireStorageKeys } from '../../../shared/constants';\nimport { shouldStandDown, hasAffiliation } from './standdown';\nimport { GiveFreelyAnonymousUser } from '../givefreely/types';\nimport { Logger } from '../../utils/logger';\nimport { TrackingCode } from './trackingCode';\nimport cache from '../../utils/cache';\nimport { PartnerGiveFreelyConfig } from '../../config/giveFreelyConfig';\nimport { isNewVersion } from '../../utils/current-version';\n\n// Six hours is the refresh rate of wildfire\nconst DEFAULT_REFRESH_INTERVAL = 6 * 60 * 60;\n\nexport class WildfireService {\n private vanityBaseUrl: string;\n private refreshInterval: number;\n private wildfireClient: WildfireClient;\n protected logger: Logger;\n protected standDownPolicy: WildfireStandDownPolicy | null = null;\n\n public constructor(\n wildfireClient: WildfireClient,\n logger: Logger,\n vanityBaseUrl: string,\n refreshInterval: number = DEFAULT_REFRESH_INTERVAL,\n ) {\n if (!wildfireClient || !vanityBaseUrl) {\n throw new Error('WildfireService requires wildfireClient and vanityBaseUrl');\n }\n\n this.wildfireClient = wildfireClient;\n this.vanityBaseUrl = vanityBaseUrl.replace(/\\/$/, ''); // Remove trailing slash if present\n this.refreshInterval = refreshInterval;\n this.logger = logger;\n }\n\n public async getActiveDomains(forceRefresh: boolean = false): Promise<WildfireActiveDomain[]> {\n try {\n const cachedDomains = await cache.get<WildfireActiveDomain[]>(\n wildfireStorageKeys.DOMAINS,\n async () => this.fetchActiveDomains(),\n this.refreshInterval,\n forceRefresh,\n );\n const domains = cachedDomains.content;\n if (!domains) throw Error('Failed to retrieve active domains');\n\n return domains;\n } catch (error) {\n this.logger.error('Failed to get active domains:', error);\n throw new Error('Failed to retrieve active domains');\n }\n }\n\n public async getMerchantRates(merchantId: number, forceRefresh: boolean = false):\n Promise<WildfireMerchantRateDetail<keyof RateKindMap>[]> {\n try {\n const cachedRates = await cache.get<WildfireMerchantRates>(\n wildfireStorageKeys.MERCHANT_RATES,\n async () => this.fetchMerchantRates(),\n this.refreshInterval,\n forceRefresh,\n );\n if (!cachedRates.content) throw new Error('Failed to retrieve merchant rates from cache');\n const merchantRate = cachedRates.content[merchantId];\n return merchantRate;\n } catch (error) {\n this.logger.error('Failed to retrieve merchant rates:', error);\n throw new Error('Failed to retrieve merchant rates');\n }\n }\n\n public async generateAffiliateUrl(\n activeDomain: WildfireActiveDomain,\n originalUrl: string,\n user: GiveFreelyAnonymousUser | null,\n partner: string,\n ): Promise<string> {\n if (!activeDomain || !originalUrl || !partner) {\n throw new Error('Missing required parameters for affiliate URL generation');\n }\n\n try {\n const device = await this.getDevice();\n const trackingCode = await this.generateTrackingCode(user, partner, device);\n const encodedUrl = encodeURIComponent(originalUrl);\n const encodedTrackingCode = encodeURIComponent(trackingCode);\n\n return `${this.vanityBaseUrl}/e?d=${device.DeviceID}&c=${activeDomain.ID}&tc=${encodedTrackingCode}&url=${encodedUrl}`;\n } catch (error) {\n this.logger.error('Failed to generate affiliate URL:', error);\n throw new Error('Failed to generate affiliate URL');\n }\n }\n\n public shouldStandDown = shouldStandDown.bind(this);\n public hasAffilliation = hasAffiliation.bind(this);\n\n public async clearCache(): Promise<void> {\n try {\n await Promise.all([\n cache.clear(wildfireStorageKeys.DOMAINS),\n cache.clear(wildfireStorageKeys.STANDDOWN_POLICY),\n cache.clear(wildfireStorageKeys.MERCHANT_RATES),\n ]);\n } catch (error) {\n this.logger.error('Failed to clear cache:', error);\n throw new Error('Failed to clear cache');\n }\n }\n\n public async clearDevice(): Promise<void> {\n try {\n await storage.remove(wildfireStorageKeys.DEVICE);\n this.logger.info('Cleared wildfire device ID');\n } catch (error) {\n this.logger.error('Failed to clear wildfire device:', error);\n throw new Error('Failed to clear wildfire device');\n }\n }\n\n public async refreshCache(forceSync: boolean = false): Promise<void> {\n try {\n const [, standDownPolicy] = await Promise.all([\n cache.get(wildfireStorageKeys.DOMAINS, () => this.fetchActiveDomains(), this.refreshInterval, forceSync),\n cache.get(wildfireStorageKeys.STANDDOWN_POLICY, () => this.fetchStanddownPolicy(), this.refreshInterval, forceSync),\n cache.get(wildfireStorageKeys.MERCHANT_RATES, () => this.fetchMerchantRates(), this.refreshInterval, forceSync),\n ]);\n\n if (standDownPolicy?.content) this.standDownPolicy = standDownPolicy.content;\n } catch (error) {\n this.logger.error('Failed to refresh cache:', error);\n throw new Error('Failed to refresh cache');\n }\n }\n\n protected async getStanddownPolicy(): Promise<WildfireStandDownPolicy> {\n try {\n const standDownPolicy = await cache.get<WildfireStandDownPolicy>(\n wildfireStorageKeys.STANDDOWN_POLICY,\n async () => this.fetchStanddownPolicy(),\n this.refreshInterval,\n );\n if (!standDownPolicy.content) {\n throw new Error('Failed to retrieve standdown policy from cache');\n }\n this.logger.info('Retrieved standdown policy from cache', standDownPolicy.content);\n this.standDownPolicy = standDownPolicy.content;\n return this.standDownPolicy;\n } catch (error) {\n this.logger.error('Failed to get standdown policy from cache:', error);\n throw new Error('Failed to retrieve standdown policy');\n }\n }\n\n private getRetryOptions(operationName?: string): RetryOptions {\n return {\n delayFn: (attempt) => 1000 * attempt,\n maxAttempts: 3,\n logger: this.logger,\n operationName,\n };\n }\n\n public async getDevice(): Promise<WildfireDevice> {\n try {\n // We don't use cache for the device because it is never expected to change\n const device = await storage.get<WildfireDevice>(wildfireStorageKeys.DEVICE);\n // If the device is malformed, we to try to fetch it again\n if (!device?.DeviceID) {\n return retryOperation(() => this.fetchAndStoreDevice(), this.getRetryOptions('Get Device'));\n }\n return device;\n } catch (error) {\n this.logger.error('Failed to get device:', error);\n throw new Error('Failed to retrieve device information');\n }\n }\n\n private async fetchAndStoreDevice(): Promise<WildfireDevice> {\n const device = await this.wildfireClient.getWildfireDevice();\n // If malformed, we want to retry\n if (!device?.DeviceID) {\n throw new Error('Failed to retrieve device information');\n }\n await storage.set(wildfireStorageKeys.DEVICE, device);\n return device;\n }\n\n private async generateTrackingCode(\n user: GiveFreelyAnonymousUser | null,\n partnerId: string,\n device: WildfireDevice,\n ): Promise<string> {\n if (!user?.id || !user?.charity || !user?.charity.ein || !user?.charity.thirdPartyId) {\n const trackingCode = `notregistered-${device.DeviceID}`; // Note: 'notregistered-...' allows us to have donations in the default donations bucket\n this.logger.info(\"User not provided. Using GF's default bucket instead.\", trackingCode);\n\n return trackingCode;\n }\n\n const trackingCode = new TrackingCode(\n user.id,\n user.charity.ein,\n user.charity.thirdPartyId,\n partnerId,\n );\n\n return trackingCode.toString();\n }\n\n private async fetchActiveDomains(): Promise<WildfireActiveDomain[]> {\n const domains = await retryOperation(\n () => this.wildfireClient.getActiveDomains(), this.getRetryOptions('Fetch Active Domains'),\n );\n\n this.logger.info('Updated active domains');\n return domains;\n }\n\n private async fetchStanddownPolicy(): Promise<WildfireStandDownPolicy> {\n const policy = await retryOperation(\n () => this.wildfireClient.getStanddownPolicy(),\n this.getRetryOptions('Get Standdown policy'),\n {\n Domains: [],\n LostAttribution: [],\n Params: [],\n Serp: [],\n },\n );\n\n this.logger.info('Updated standdown policy');\n return policy;\n }\n\n private async fetchMerchantRates(): Promise<WildfireMerchantRates> {\n const merchantRates = await retryOperation(\n () => this.wildfireClient.getMerchantRates(), this.getRetryOptions('Fetch Merchant Rates'), {},\n );\n\n this.logger.debug('Updated Merchant rates');\n return merchantRates;\n }\n\n public static async createWildfireService(logger: Logger, config: PartnerGiveFreelyConfig): Promise<WildfireService> {\n logger.debug('Initializing wildfire service with config', config);\n const wildfireClient = new WildfireClient(\n config.wfSecret,\n config.wfAppId,\n config.deviceUrl,\n config.dataUrl,\n logger,\n );\n\n const wfService = new WildfireService(\n wildfireClient,\n logger,\n config.vanityBaseUrl,\n config.refreshInterval,\n );\n\n // If a new version is detected we force a sync with wf server\n const isANewVersion = await isNewVersion();\n await wfService.refreshCache(isANewVersion);\n\n return wfService;\n }\n}\n","export const isValidURL = (url: string): boolean => {\n try {\n // eslint-disable-next-line no-new\n new URL(url);\n return true;\n } catch {\n return false;\n }\n};\n","import type browser from 'webextension-polyfill';\nimport { isValidURL } from '../../shared/utils/is-valid-url';\nimport { updateStanddownHistory } from '../../shared/vendors/wildfire/standdown';\nimport { AdUnitCoreService } from '../core';\n\n// Set to keep track of affiliated requests, we do not keep this in state\n// to avoid updating state so often, and this is not needed anywhere else\n// in the application\nconst affiliatedRequests = new Set<string>();\nconst ignoredRequests = new Set<string>();\n\n/*\n This function will fire off before every request the user makes. Whether it is\n a redirected request or a request the user's browser makes.\n*/\nexport const handleAffiliateOnBeforeRequest = (gfService: AdUnitCoreService) => {\n const logger = gfService.getLogger();\n\n return ({ requestId, url, initiator }: browser.WebRequest.OnBeforeRequestDetailsType): undefined => {\n try {\n // If we are already tracking this request id or identified this request as coming from activating cashback,\n // we don't need to check again\n if (affiliatedRequests.has(requestId) || ignoredRequests.has(requestId) || !isValidURL(url)) return;\n const { hostname, search } = new URL(url);\n if (hostname.includes('wild.link')) {\n logger.info('Cashback activation request identified, ignoring affiliate check for request');\n ignoredRequests.add(requestId);\n return;\n }\n let initiatorHostname;\n if (initiator && isValidURL(initiator)) {\n initiatorHostname = new URL(initiator).hostname;\n }\n\n if (gfService.hasAffiliation([hostname, initiatorHostname], search)\n || gfService.isCustomStandownMatch([url, initiator])) {\n logger.info('Affiliation found or custom standown match on url, adding request id to track');\n // If the url has an affiliated parameter or domain, then we will stand down in the onBeforeRedirect handler.\n affiliatedRequests.add(requestId);\n }\n } catch (error) {\n logger.error('Error on handleAffiliateOnBeforeRequest', error);\n }\n };\n};\n\n/*\n This function will fire off before every redirect the browser makes, but keep in mind\n in order for this function to do anything the onBeforeRequest handler has to\n decide whether or not we follow the request to check for a stand down\n*/\nexport const handleAffiliateOnBeforeRedirect = (gfService: AdUnitCoreService) => {\n const logger = gfService.getLogger();\n\n return async ({ requestId, redirectUrl }: browser.WebRequest.OnBeforeRedirectDetailsType): Promise<void> => {\n try {\n // The only time this if statement will be true is when the onBeforeRequest\n // handler picks up a request that has a an affiliated url in the route\n if (!affiliatedRequests.has(requestId)) return;\n logger.info('Attempting to find active domain');\n const { hostname } = new URL(redirectUrl);\n const activeDomains = await gfService.getActiveDomains();\n const activeDomain = activeDomains.find((x) => hostname === x.Domain || hostname.endsWith(`.${x.Domain}`));\n\n if (!activeDomain) return;\n\n logger.info('Found active domain. Updating standdown state');\n\n await updateStanddownHistory(activeDomain.Domain);\n } catch (error) {\n logger.error('Error on handleAffiliateOnBeforeRedirect', error);\n }\n };\n};\n\nexport const handleAffiliateOnCompleted = (gfService: AdUnitCoreService) => {\n const logger = gfService.getLogger();\n\n return ({ requestId }: browser.WebRequest.OnCompletedDetailsType): void => {\n try {\n if (affiliatedRequests.has(requestId)) {\n logger.info('Tracking request completed. Request Id:', requestId);\n affiliatedRequests.delete(requestId);\n }\n } catch (error) {\n logger.error('Error on handleAffiliateOnCompleted', error);\n }\n };\n};\n","import type browser from 'webextension-polyfill';\n\nexport const affiliateWebFilter: browser.WebRequest.RequestFilter = {\n urls: ['<all_urls>'],\n types: ['main_frame'],\n};\n","/**\n * Error thrown when attempting to use AdUnitCoreService before initialization\n */\nexport class UninitializedServiceError extends Error {\n constructor(message: string = 'Service not initialized') {\n super(message);\n this.name = 'UninitializedServiceError';\n }\n}\n","import { UninitializedServiceError } from './custom-errors';\n\nexport const assertInitialized = (isInitialized: boolean) => {\n if (isInitialized) return;\n\n throw new UninitializedServiceError();\n};\n","import { isValidMessage } from '../../shared';\nimport { MESSAGE_TYPES } from '../../shared/constants';\nimport { AnyRequestMessage, AnyResponseMessage } from '../../shared/requestResponse';\nimport { AdUnitCoreService } from '../core';\n\n/**\n * Context object passed to all message strategies containing shared dependencies.\n * This allows strategies to access only the dependencies they need while maintaining\n * a consistent interface.\n */\nexport interface MessageContext {\n giveFreelyService: AdUnitCoreService;\n}\n\n/**\n * Core interface for the Strategy pattern implementation.\n * Each concrete strategy implements this interface to handle a specific message type.\n * The handle method is typed to ensure type safety between request and response payloads.\n */\nexport interface MessageStrategy {\n /**\n * Processes an incoming message and returns a response\n * @param message - The incoming message with type and payload\n * @param context - Shared context containing dependencies\n * @returns Promise resolving to a typed response message\n */\n handle(message: AnyRequestMessage, context: MessageContext): Promise<AnyResponseMessage>;\n}\n\n/**\n * Registry for message strategies implementing the Strategy pattern.\n * Provides a centralized location to register and retrieve strategies based on message type.\n * This avoids the need for large switch statements and makes adding new message types easier.\n */\nexport class MessageStrategyRegistry {\n /** Map of message types to their corresponding strategy implementations */\n private static strategies: Map<string, MessageStrategy> = new Map();\n\n /**\n * Static set of all known GiveFreely message types that have strategies.\n * This is populated at module load time to avoid race conditions.\n * It includes all POPUP_MESSAGE_TYPES plus TRACK_EVENT which is also handled.\n */\n private static knownMessageTypes: Set<string> = new Set([\n ...Object.values(MESSAGE_TYPES),\n ]);\n\n /**\n * Registers a new strategy for a specific message type\n * @param messageType - The type of message this strategy handles\n * @param strategy - The strategy implementation\n */\n static register(messageType: typeof MESSAGE_TYPES[keyof typeof MESSAGE_TYPES], strategy: MessageStrategy): void {\n this.strategies.set(messageType, strategy);\n }\n\n /**\n * Retrieves the strategy for a given message type\n * @param messageType - The type of message to handle\n * @returns The corresponding strategy or undefined if not found\n */\n static get(messageType: string): MessageStrategy | undefined {\n return this.strategies.get(messageType);\n }\n\n /**\n * Checks if a message is a known GiveFreely message type.\n * This uses the static registry to avoid race conditions during initialization.\n * @param message - The message to check\n * @returns true if the message is a valid GiveFreely message type\n */\n static exists(message: unknown): boolean {\n if (!isValidMessage(message)) return false;\n\n // Check against the static registry of known types instead of the strategies Map\n // This ensures the function works correctly even before strategies are registered\n return this.knownMessageTypes.has(message.type);\n }\n}\n","// Utility functions shared between content and background scripts\nexport function isValidMessage<T>(message: unknown): message is { type: string; payload: T } {\n return (\n typeof message === 'object'\n && message !== null\n && 'type' in message\n && 'payload' in message\n && typeof message.type === 'string'\n );\n}\n\n/**\n * /\n * Merges two objects if a condition is met. Otherwise, returns the first object.\n */\nexport function mergeIf<T>(condition: boolean, left: T, right: T): T {\n return condition ? { ...left, ...right } : left;\n}\n\n// Add more shared utility functions as needed\n","import browser from 'webextension-polyfill';\n\nimport { AdUnitCoreService } from '../core';\nimport * as standDownlisteners from './handleAffiliateStandDown';\nimport * as filters from '../filters';\n\nimport { addMessageListener } from '../../shared';\nimport { AnyRequestMessage, AnyResponseMessage } from '../../shared/requestResponse';\nimport { assertInitialized } from '../../shared/utils/assert-initialized';\nimport { MessageStrategyRegistry } from '../strategies/MessageStrategy';\n\n/**\n * Adds all background listeners and returns a cleanup function\n */\nexport const addListeners = (adUnitBackground: AdUnitCoreService): (() => void) => {\n // If webRequest permission is not present browser.webRequest will be null.\n\n let cleanupWebRequestListeners: () => void | undefined;\n\n if (browser.webRequest) {\n const onBeforeRequestListener = standDownlisteners.handleAffiliateOnBeforeRequest(adUnitBackground);\n browser.webRequest.onBeforeRequest.addListener(onBeforeRequestListener, filters.affiliateWebFilter);\n\n const onBeforeRedirectListener = standDownlisteners.handleAffiliateOnBeforeRedirect(adUnitBackground);\n browser.webRequest.onBeforeRedirect.addListener(onBeforeRedirectListener, filters.affiliateWebFilter);\n\n const onCompletedListener = standDownlisteners.handleAffiliateOnCompleted(adUnitBackground);\n browser.webRequest.onCompleted.addListener(onCompletedListener, filters.affiliateWebFilter);\n\n cleanupWebRequestListeners = () => {\n browser.webRequest.onBeforeRequest.removeListener(onBeforeRequestListener);\n browser.webRequest.onBeforeRedirect.removeListener(onBeforeRedirectListener);\n browser.webRequest.onCompleted.removeListener(onCompletedListener);\n };\n }\n\n // Listen for messages\n const messageListener = addMessageListener(async (message, _sender) => {\n adUnitBackground.getLogger()\n .debug('Received message', { type: message.type, payload: message.payload });\n\n return handleMessage(adUnitBackground, message);\n });\n\n // Return cleanup for removing listeners\n function cleanup() {\n if (cleanupWebRequestListeners) cleanupWebRequestListeners();\n browser.runtime.onMessage.removeListener(messageListener);\n }\n\n return cleanup;\n};\n\nconst handleMessage = async (adUnitBackground: AdUnitCoreService, message: AnyRequestMessage): Promise<AnyResponseMessage | undefined> => {\n assertInitialized(adUnitBackground.isInitialized());\n\n const strategy = MessageStrategyRegistry.get(message.type);\n if (!strategy) return undefined;\n\n const context = {\n giveFreelyService: adUnitBackground,\n };\n\n return strategy.handle(message, context);\n};\n","import { MESSAGE_TYPES } from '../../shared/constants';\nimport { MessageStrategy, MessageContext } from './MessageStrategy';\nimport { RequestMessage, ResponseMessage } from '../../shared/requestResponse';\nimport { createTab } from '../../shared';\nimport { PopupEvent } from '../../shared/analytics/types';\n\n/**\n * Strategy for handling ACTIVATE_OFFER messages.\n */\nexport class ActivateOfferStrategy implements MessageStrategy {\n /**\n * Handles an ACTIVATE_OFFER message\n * @param message - The incoming message with activeDomain and selectedCharity payload\n * @param context - Shared context containing dependencies\n * @returns Promise with the result of the activation\n */\n async handle(\n message: RequestMessage<typeof MESSAGE_TYPES.ACTIVATE_OFFER>,\n context: MessageContext,\n ): Promise<ResponseMessage<typeof MESSAGE_TYPES.ACTIVATE_OFFER>> {\n const { activeDomain, originalUrl, selectedCharity } = message.payload;\n const { giveFreelyService } = context;\n\n const logger = giveFreelyService.getLogger();\n\n logger.debug('Activating offer', { activeDomain, selectedCharity });\n\n try {\n if (!selectedCharity?.ein || !selectedCharity?.thirdPartyId) {\n throw new Error('Missing charity information');\n }\n const wfDeviceId = await giveFreelyService.initializeWfDeviceId();\n if (!wfDeviceId) {\n throw new Error('Failed to initialize Wildfire device ID');\n }\n const currentUser = await giveFreelyService.upsertUser(selectedCharity, wfDeviceId);\n logger.debug('Upserted user', { currentUser });\n\n if (!currentUser) {\n logger.info(\"Failed to create user. Using default bucket's user\");\n }\n\n const affiliateUrl = await giveFreelyService.generateAffiliateUrl(activeDomain, originalUrl, currentUser);\n logger.debug('Generated affiliate URL', { affiliateUrl });\n\n void createTab(affiliateUrl);\n\n await giveFreelyService.updateStanddownHistory(activeDomain.Domain);\n logger.debug('Activated offer', { activeDomain, selectedCharity });\n return {\n type: MESSAGE_TYPES.ACTIVATE_OFFER,\n payload: {\n response: true,\n },\n };\n } catch (error) {\n logger.error('Error activating offer', { activeDomain, error });\n void giveFreelyService.trackEvent(PopupEvent.checkoutPopupFailedActivation, { activeDomain, error });\n return {\n type: MESSAGE_TYPES.ACTIVATE_OFFER,\n payload: {\n response: false,\n },\n };\n }\n }\n}\n","import { MESSAGE_TYPES, SHOPIFY_SHOP_IDS_STORAGE_KEY } from '../../shared/constants';\nimport { MessageStrategy, MessageContext } from './MessageStrategy';\nimport { RequestMessage, ResponseMessage } from '../../shared/requestResponse';\nimport { storage } from '../../shared/utils/storage';\nimport { ShopifyShopInfo } from './StoreShopifyShopIdStrategy';\n\nexport class GetDomainByShopIdStrategy implements MessageStrategy {\n /**\n * Handles a GET_DOMAIN_BY_SHOP_ID message\n * @param message - The incoming message with shop ID payload\n * @param context - Shared context containing dependencies\n * @returns Promise resolving to domain information if found\n */\n async handle(\n message: RequestMessage<typeof MESSAGE_TYPES.GET_DOMAIN_BY_SHOP_ID>,\n context: MessageContext,\n ): Promise<ResponseMessage<typeof MESSAGE_TYPES.GET_DOMAIN_BY_SHOP_ID>> {\n const { shopId } = message.payload;\n const { giveFreelyService } = context;\n const logger = giveFreelyService.getLogger();\n\n try {\n // Storage key for Shopify shop IDs\n const STORAGE_KEY = SHOPIFY_SHOP_IDS_STORAGE_KEY;\n\n // Get existing shop IDs from storage\n const existingData = await storage.get<ShopifyShopInfo[]>(STORAGE_KEY) || [];\n\n // Look for a matching shop ID\n const matchingShopInfo = existingData.find((info) => info.shopId === shopId);\n\n if (matchingShopInfo) {\n logger.debug('Found domain for shop ID', { shopId, domain: matchingShopInfo.domain });\n\n return {\n type: MESSAGE_TYPES.GET_DOMAIN_BY_SHOP_ID,\n payload: {\n found: true,\n domain: matchingShopInfo.domain,\n shopInfo: matchingShopInfo,\n },\n };\n }\n logger.debug('No domain found for shop ID', { shopId });\n\n return {\n type: MESSAGE_TYPES.GET_DOMAIN_BY_SHOP_ID,\n payload: {\n found: false,\n },\n };\n } catch (error) {\n logger.error('Error getting domain for shop ID', { shopId, error });\n\n return {\n type: MESSAGE_TYPES.GET_DOMAIN_BY_SHOP_ID,\n payload: {\n found: false,\n },\n };\n }\n }\n}\n","import { MessageContext, MessageStrategy } from './MessageStrategy';\nimport { MESSAGE_TYPES } from '../../shared/constants';\nimport { RequestMessage, ResponseMessage } from '../../shared/requestResponse';\n\n/**\n * Strategy for handling language strings requests\n */\nexport class GetLanguageContentStrategy implements MessageStrategy {\n async handle(message: RequestMessage<typeof MESSAGE_TYPES.GET_LANGUAGE_CONTENT>, context: MessageContext):\n Promise<ResponseMessage<typeof MESSAGE_TYPES.GET_LANGUAGE_CONTENT>> {\n const { lang } = message.payload;\n const { giveFreelyService } = context;\n const logger = giveFreelyService.getLogger();\n logger.debug('Getting language strings', { lang });\n\n try {\n const language = await giveFreelyService.getLanguage(lang);\n logger.debug('Language strings fetched', { language });\n return {\n type: MESSAGE_TYPES.GET_LANGUAGE_CONTENT,\n payload: {\n translations: language.translations,\n charities: language.charities,\n },\n };\n } catch (error) {\n logger.error('Error getting language strings', { error });\n return {\n type: MESSAGE_TYPES.GET_LANGUAGE_CONTENT,\n payload: {\n translations: null,\n charities: null,\n },\n };\n }\n }\n}\n","import { MESSAGE_TYPES } from '../../shared/constants';\nimport { MessageStrategy, MessageContext } from './MessageStrategy';\n\nexport class GetPopupConfigStrategy implements MessageStrategy {\n async handle(message: {}, context: MessageContext) {\n const { giveFreelyService } = context;\n\n const logger = giveFreelyService.getLogger();\n const config = await giveFreelyService.getCachedConfig();\n\n try {\n logger.debug('Fetching popup config');\n return {\n type: MESSAGE_TYPES.GET_POPUP_CONFIG,\n payload: { config },\n };\n } catch (error) {\n logger.error('Error fetching popup config', { error });\n return {\n type: MESSAGE_TYPES.GET_POPUP_CONFIG,\n payload: { config: null },\n };\n }\n }\n}\n","import { MESSAGE_TYPES, POPUP_HIDDEN_STORAGE_KEY } from '../../shared/constants';\nimport { MessageStrategy, MessageContext } from './MessageStrategy';\nimport { RequestMessage, ResponseMessage } from '../../shared/requestResponse';\nimport { storage } from '../../shared/utils/storage';\n\n/**\n * Strategy for handling HIDE_POPUP messages.\n * Manages the popup hide duration by storing it in extension storage.\n *\n * This strategy:\n * 1. Receives a number of days to hide the popup\n * 2. Calculates the expiry date and stores it\n * 3. Returns acknowledgment of the update\n *\n * The hide duration is used by other components to determine\n * if the popup should be shown to the user.\n *\n * @example\n * // Request\n * { type: 'GF_HIDE_POPUP', payload: { days: 7 } }\n *\n * // Response\n * { type: 'GF_HIDE_POPUP', payload: { ack: true } }\n */\nexport class HidePopupStrategy implements MessageStrategy {\n /**\n * Handles a HIDE_POPUP message\n * @param message - The incoming message with days payload\n * @param context - Shared context containing dependencies\n * @returns Promise resolving to acknowledgment of update\n * @throws Will be caught and return { ack: false } if update fails\n */\n async handle(\n message: RequestMessage<typeof MESSAGE_TYPES.HIDE_POPUP>,\n context: MessageContext,\n ): Promise<ResponseMessage<typeof MESSAGE_TYPES.HIDE_POPUP>> {\n const { days } = message.payload;\n const { giveFreelyService } = context;\n\n const logger = giveFreelyService.getLogger();\n\n interface StorageEntry {\n popupHide: number;\n }\n try {\n const expiry = new Date();\n expiry.setDate(expiry.getDate() + days);\n await storage.set<StorageEntry>(POPUP_HIDDEN_STORAGE_KEY, { popupHide: expiry.getTime() });\n logger.debug('Popup hidden', { days, expiry });\n\n return {\n type: MESSAGE_TYPES.HIDE_POPUP,\n payload: {\n ack: true,\n },\n };\n } catch (error) {\n logger.error('Error hiding popup', { days, error });\n return {\n type: MESSAGE_TYPES.HIDE_POPUP,\n payload: {\n ack: false,\n },\n };\n }\n }\n}\n","import { MESSAGE_TYPES } from '../../shared/constants';\nimport { MessageStrategy, MessageContext } from './MessageStrategy';\nimport { RequestMessage, ResponseMessage } from '../../shared/requestResponse';\nimport { RateKindMap, WildfireMerchantRateDetail } from '../../shared/vendors/wildfire/types';\n\n/**\n * Strategy for handling IS_ACTIVE_DOMAIN messages.\n * Checks if a given hostname is an active domain in the Wildfire system.\n *\n * This strategy:\n * 1. Receives a hostname in the request payload\n * 2. Queries Wildfire for all active domains\n * 3. Checks if the current domain is in the merchant exclusions\n * 4. Checks if the hostname matches or is a subdomain of any active domain\n * 5. Returns the match status and matching domain if found\n *\n * @example\n * // Request\n * { type: 'GF_IS_ACTIVE_DOMAIN', payload: { hostname: 'shop.example.com' } }\n *\n * // Response\n * {\n * type: 'GF_IS_ACTIVE_DOMAIN',\n * payload: {\n * isActive: true,\n * domain: { Domain: 'example.com', ... }\n * }\n * }\n */\nexport class IsActiveDomainStrategy implements MessageStrategy {\n /**\n * Handles an IS_ACTIVE_DOMAIN message\n * @param message - The incoming message with hostname payload\n * @param context - Shared context containing dependencies\n * @returns Promise resolving to domain check result\n * @throws Will be caught and return { isActive: false } if Wildfire API fails\n */\n async handle(\n message: RequestMessage<typeof MESSAGE_TYPES.IS_ACTIVE_DOMAIN>,\n context: MessageContext,\n ): Promise<ResponseMessage<typeof MESSAGE_TYPES.IS_ACTIVE_DOMAIN>> {\n const { hostname } = message.payload;\n const { giveFreelyService } = context;\n\n const logger = giveFreelyService.getLogger();\n\n const merchantExclusions = await giveFreelyService.getConfig().merchantExclusions;\n const activeDomains = await giveFreelyService.getActiveDomains();\n\n logger.debug('Checking hostname', { hostname });\n\n try {\n void giveFreelyService.healthCheck();\n\n if (merchantExclusions.some((x) => x.disableDomain && (hostname === x.domain || hostname.endsWith(`.${x.domain}`)))) {\n logger.debug('Hostname is in merchant exclusions', { hostname });\n return {\n type: MESSAGE_TYPES.IS_ACTIVE_DOMAIN,\n payload: {\n isActive: false,\n domain: undefined,\n rates: [],\n },\n };\n }\n\n if (!activeDomains || activeDomains.length === 0) {\n throw new Error('No active domains');\n }\n logger.debug('Retrieved active domains', { count: activeDomains.length });\n const domain = activeDomains.find((x) => hostname === x.Domain || hostname.endsWith(`.${x.Domain}`));\n logger.debug('Domain check result', { hostname, isActive: !!domain });\n\n let rates: WildfireMerchantRateDetail<keyof RateKindMap>[] = [];\n if (domain?.ID) {\n // Here we use Merchant ID (not the domain ID) to get the rates.\n const merchantRates = await giveFreelyService.getMerchantRates(domain.Merchant.ID);\n if (merchantRates) {\n // If rates are available for the merchant, we add them to the payload.\n logger.debug('Retrieved merchant rates', { merchantRates });\n rates = merchantRates;\n }\n }\n\n return {\n type: MESSAGE_TYPES.IS_ACTIVE_DOMAIN,\n payload: {\n isActive: !!domain,\n domain,\n rates,\n },\n };\n } catch (error) {\n logger.error('Error checking domain', { hostname, error });\n return {\n type: MESSAGE_TYPES.IS_ACTIVE_DOMAIN,\n payload: {\n isActive: false,\n domain: undefined,\n rates: [],\n },\n };\n }\n }\n}\n","import { MESSAGE_TYPES } from '../../shared/constants';\nimport { MessageStrategy, MessageContext } from './MessageStrategy';\nimport { RequestMessage, ResponseMessage } from '../../shared/requestResponse';\nimport { PopupEvent } from '../../shared/analytics/types';\n\n/**\n * Strategy for handling LOG_MERCHANTS_IN_SEARCH_RESULTS messages.\n * Checks & logs if a given set of search results are from affiliated merchants\n */\nexport class LogMerchantsInSearchResultsStrategy implements MessageStrategy {\n/**\n * Handles an LOG_MERCHANTS_IN_SEARCH_RESULTS message\n * @param message - The incoming message\n * @param context - Shared context containing dependencies\n * @returns Promise resolving to domain check result\n * @throws Will be caught and return { result: false } if operation fails\n */\n async handle(\n message: RequestMessage<typeof MESSAGE_TYPES.LOG_MERCHANTS_IN_SEARCH_RESULTS>,\n context: MessageContext,\n ): Promise<ResponseMessage<typeof MESSAGE_TYPES.LOG_MERCHANTS_IN_SEARCH_RESULTS>> {\n const { currentUrl, searchResults, source } = message.payload;\n const { giveFreelyService } = context;\n\n const logger = giveFreelyService.getLogger();\n\n const activeDomains = await giveFreelyService.getActiveDomains();\n\n logger.debug('Finding merchants in search results', { currentUrl });\n try {\n const merchantsSearchResults = searchResults.filter((x) => {\n try {\n const { hostname } = new URL(x.url);\n return activeDomains.some((z) => z.Domain === hostname || hostname.endsWith(`.${z.Domain}`));\n } catch {\n logger.debug('Couldn\\'t parse the following search result url', { x });\n return false;\n }\n });\n\n logger.info('Number of merchants identified in the search result', { number: merchantsSearchResults.length });\n\n if (merchantsSearchResults.length > 0) {\n const searchResultsId = Math.floor(Math.random() * Date.now());\n for (const result of merchantsSearchResults) {\n void context.giveFreelyService.trackEvent(\n PopupEvent.checkoutPopupMerchantInResultsFound,\n {\n source,\n searchResultsId,\n currentUrl,\n searchResultUrl: result.url,\n sponsored: result.isSponsored,\n },\n true);\n }\n }\n\n return {\n type: MESSAGE_TYPES.LOG_MERCHANTS_IN_SEARCH_RESULTS,\n payload: {\n result: true,\n },\n };\n } catch (error) {\n logger.error('Error sending logs for merchants in search results', { currentUrl, error });\n return {\n type: MESSAGE_TYPES.LOG_MERCHANTS_IN_SEARCH_RESULTS,\n payload: {\n result: false,\n },\n };\n }\n }\n}\n","import { MESSAGE_TYPES, SHOPIFY_SHOP_IDS_STORAGE_KEY } from '../../shared/constants';\nimport { MessageStrategy, MessageContext } from './MessageStrategy';\nimport { RequestMessage, ResponseMessage } from '../../shared/requestResponse';\nimport { storage } from '../../shared/utils/storage';\nimport { WildfireActiveDomain } from '../../shared/vendors/wildfire/types';\n\n// Type definition for Shopify shop info\nexport interface ShopifyShopInfo {\n shopId: number;\n domain: WildfireActiveDomain;\n}\n\nexport class StoreShopifyShopIdStrategy implements MessageStrategy {\n async handle(\n message: RequestMessage<typeof MESSAGE_TYPES.STORE_SHOPIFY_SHOP_ID>,\n context: MessageContext,\n ): Promise<ResponseMessage<typeof MESSAGE_TYPES.STORE_SHOPIFY_SHOP_ID>> {\n const shopInfo = message.payload;\n const { giveFreelyService } = context;\n const logger = giveFreelyService.getLogger();\n\n try {\n // Storage key for Shopify shop IDs\n const STORAGE_KEY = SHOPIFY_SHOP_IDS_STORAGE_KEY;\n\n // Get existing shop IDs from storage\n const existingData = await storage.get<ShopifyShopInfo[]>(STORAGE_KEY) || [];\n\n // Check if we already have this shop ID for this domain\n const existingIndex = existingData.findIndex(\n (item) => item.shopId === shopInfo.shopId,\n );\n\n if (existingIndex >= 0) {\n // Update existing entry\n existingData[existingIndex] = shopInfo;\n } else {\n // Add new entry\n existingData.push(shopInfo);\n }\n\n // Store updated list\n await storage.set(STORAGE_KEY, existingData);\n\n logger.debug('Stored Shopify shop ID', { shopInfo });\n\n return {\n type: MESSAGE_TYPES.STORE_SHOPIFY_SHOP_ID,\n payload: {\n success: true,\n },\n };\n } catch (error) {\n logger.error('Error storing Shopify shop ID', { shopInfo, error });\n\n return {\n type: MESSAGE_TYPES.STORE_SHOPIFY_SHOP_ID,\n payload: {\n success: false,\n },\n };\n }\n }\n}\n","import { MESSAGE_TYPES } from '../../shared/constants';\nimport { MessageStrategy, MessageContext } from './MessageStrategy';\nimport { RequestMessage, ResponseMessage } from '../../shared/requestResponse';\n\n/**\n * Strategy for handling SHOULD_STAND_DOWN messages.\n * Checks if we should stand down for a given active domain\n */\nexport class ShouldStandDownStrategy implements MessageStrategy {\n /**\n * Handles a SHOULD_STAND_DOWN message\n * @param message - The incoming message with the activeDomain and the current url\n * @param context - Shared context containing dependencies\n * @throws Will be caught and return { result: false } if something goes wrong\n */\n async handle(\n message: RequestMessage<typeof MESSAGE_TYPES.SHOULD_STAND_DOWN>,\n context: MessageContext,\n ): Promise<ResponseMessage<typeof MESSAGE_TYPES.SHOULD_STAND_DOWN>> {\n const { activeDomain, url } = message.payload;\n const { giveFreelyService } = context;\n\n const logger = giveFreelyService.getLogger();\n\n logger.debug('Checking if we should stand down', { activeDomain });\n\n try {\n const result = await giveFreelyService.shouldStandDown(activeDomain, url);\n\n return {\n type: MESSAGE_TYPES.SHOULD_STAND_DOWN,\n payload: {\n result,\n },\n };\n } catch (error) {\n logger.error('Error checking if we should stand down. Returning false', { activeDomain, error });\n return {\n type: MESSAGE_TYPES.SHOULD_STAND_DOWN,\n payload: {\n result: false,\n },\n };\n }\n }\n}\n","import { MESSAGE_TYPES } from '../../shared/constants';\nimport { MessageStrategy, MessageContext } from './MessageStrategy';\nimport { RequestMessage, ResponseMessage } from '../../shared/requestResponse';\n\n/**\n * Strategy for handling TRACK_EVENT messages.\n * Broadcasts the provided event for analytics purposes\n */\nexport class TrackEventStrategy implements MessageStrategy {\n /**\n * Handles a TRACK_EVENT message\n * @param message - The incoming message with the userId and the data to broadcast\n * @param context - Shared context containing dependencies\n * @throws Will be caught and return { result: false } if something goes wrong\n */\n async handle(\n message: RequestMessage<typeof MESSAGE_TYPES.TRACK_EVENT>,\n context: MessageContext,\n ): Promise<ResponseMessage<typeof MESSAGE_TYPES.TRACK_EVENT>> {\n const {\n eventType, eventData, anonymous, skipThrottling,\n } = message.payload;\n const { giveFreelyService } = context;\n\n const logger = giveFreelyService.getLogger();\n\n logger.debug('Broadcasting event', {\n eventType, eventData, anonymous, skipThrottling,\n });\n\n try {\n const result = await giveFreelyService.trackEvent(eventType, eventData, anonymous, skipThrottling);\n\n return {\n type: MESSAGE_TYPES.TRACK_EVENT,\n payload: {\n result,\n },\n };\n } catch (error) {\n logger.error('Error broadcasting event. Returning false', { eventType, eventData, error });\n return {\n type: MESSAGE_TYPES.TRACK_EVENT,\n payload: {\n result: false,\n },\n };\n }\n }\n}\n","import { MESSAGE_TYPES } from '../../shared';\nimport { ActivateOfferStrategy } from './ActivateOfferStrategy';\nimport { GetDomainByShopIdStrategy } from './GetDomainByShopIdStrategy';\nimport { GetLanguageContentStrategy } from './GetLanguageContentStrategy';\nimport { GetPopupConfigStrategy } from './GetPopupConfigStrategy';\nimport { HidePopupStrategy } from './HidePopupStrategy';\nimport { IsActiveDomainStrategy } from './IsActiveDomainStrategy';\nimport { LogMerchantsInSearchResultsStrategy } from './LogMerchantsInSearchResultsStrategy';\nimport { MessageStrategyRegistry } from './MessageStrategy';\nimport { StoreShopifyShopIdStrategy } from './StoreShopifyShopIdStrategy';\nimport { ShouldStandDownStrategy } from './shouldStandDownStrategy';\nimport { TrackEventStrategy } from './trackEventStrategy';\n\n/**\n * Registers all active message strategies.\n */\nexport const registerStrategies = (): void => {\n // Register message strategies\n MessageStrategyRegistry.register(MESSAGE_TYPES.IS_ACTIVE_DOMAIN, new IsActiveDomainStrategy());\n MessageStrategyRegistry.register(MESSAGE_TYPES.GET_POPUP_CONFIG, new GetPopupConfigStrategy());\n MessageStrategyRegistry.register(MESSAGE_TYPES.HIDE_POPUP, new HidePopupStrategy());\n MessageStrategyRegistry.register(MESSAGE_TYPES.SHOULD_STAND_DOWN, new ShouldStandDownStrategy());\n MessageStrategyRegistry.register(MESSAGE_TYPES.TRACK_EVENT, new TrackEventStrategy());\n MessageStrategyRegistry.register(MESSAGE_TYPES.ACTIVATE_OFFER, new ActivateOfferStrategy());\n MessageStrategyRegistry.register(MESSAGE_TYPES.STORE_SHOPIFY_SHOP_ID, new StoreShopifyShopIdStrategy());\n MessageStrategyRegistry.register(MESSAGE_TYPES.GET_DOMAIN_BY_SHOP_ID, new GetDomainByShopIdStrategy());\n MessageStrategyRegistry.register(MESSAGE_TYPES.GET_LANGUAGE_CONTENT, new GetLanguageContentStrategy());\n MessageStrategyRegistry.register(MESSAGE_TYPES.LOG_MERCHANTS_IN_SEARCH_RESULTS, new LogMerchantsInSearchResultsStrategy());\n};\n","import { storage } from '../utils/storage';\nimport { Logger } from '../utils/logger';\nimport { COUNTRY_CODE_STORAGE_KEY } from '../constants';\n\nconst logger = Logger.getInstance();\n\ninterface ILookUp {\n country: {\n 'iso_code': string\n }\n}\n\nconst detectUsersCountry = async (): Promise<string | undefined> => {\n logger.debug('detecting country');\n const requestOptions = {\n method: 'GET',\n headers:\n {\n 'Content-Type': 'application/json',\n Authorization: 'Basic OTEzOTkxOnFlYmpaWF9DOGNRY0lxSHA4WTVjNGxzU1pRSlM2VW9MMExzTF9tbWs=',\n },\n };\n\n try {\n // Make the fetch call to the geolocation API\n const response = await fetch('https://geoip.maxmind.com/geoip/v2.1/country/me', requestOptions);\n logger.debug('Received geolocation response', { status: response.status });\n if (!response.ok) {\n logger.error('Failed to get geolocation data', { status: response.status, statusText: response.statusText });\n return undefined;\n }\n const data = await response.json() as ILookUp;\n if (!data) {\n throw new Error('There was an error fetching geoip look up');\n }\n await storage.set(COUNTRY_CODE_STORAGE_KEY, data.country.iso_code);\n return data.country.iso_code;\n } catch (err) {\n // Prevent logging this remotely to avoid further network errors and enter in an infinite loop\n logger.error('Failed to get geolocation data', { error: err }, true);\n return undefined;\n }\n};\n\nexport const hydrateUserCountry = async (): Promise<void> => {\n try {\n await detectUsersCountry();\n } catch (error) {\n // Intentionally swallow errors to ensure this always resolves\n logger.error('Error in hydrateUserCountry', { error });\n }\n return undefined;\n};\n\nexport const getCountryCode = async (): Promise<string | undefined> => {\n const countryCode = await storage.get<string>(COUNTRY_CODE_STORAGE_KEY);\n if (countryCode) return countryCode;\n return detectUsersCountry();\n};\n","import { Logger } from '../utils/logger';\r\nimport {\r\n Language, LanguageGlobal, LanguagePartner,\r\n} from './types';\r\nimport cache from '../utils/cache';\r\nimport { DEFAULT_LANGUAGE } from '../constants';\r\n\r\n// TODO: Consider moving into the constants file\r\nconst LANGUAGE_CACHE_DURATION = 60 * 10; // 10 minutes\r\nconst CDN_BASE_URL = 'https://cdn.givefreely.com/adunit/language';\r\n\r\nexport const getLanguage = async (logger: Logger, partner: string, lang: string, cacheExpiration?: number, ignoredLanguages: string[] | undefined = [], forceRefresh: boolean = false): Promise<Language> => {\r\n const currentLang = (ignoredLanguages ?? []).includes(lang) ? DEFAULT_LANGUAGE : lang;\r\n logger.debug(`Requested lang ${lang} and current lang ${currentLang}`);\r\n const defaultLanguageCacheKey = `lang-${DEFAULT_LANGUAGE}`;\r\n const defaultLanguage = await cache.get<Language>(defaultLanguageCacheKey, async () => {\r\n logger.debug(`Fetching default language ${DEFAULT_LANGUAGE} for partner ${partner}`);\r\n return hydrateLanguage(partner, DEFAULT_LANGUAGE);\r\n }, cacheExpiration || LANGUAGE_CACHE_DURATION, forceRefresh);\r\n\r\n if (!defaultLanguage.content) throw new Error(`Failed to fetch default language ${DEFAULT_LANGUAGE} and no cache version available`);\r\n\r\n if (DEFAULT_LANGUAGE === currentLang) {\r\n return defaultLanguage.content;\r\n }\r\n\r\n const languageCacheKey = `lang-${currentLang}`;\r\n const language = await cache.get<Language>(languageCacheKey, async () => {\r\n logger.debug(`Fetching language ${currentLang} for partner ${partner}`);\r\n return hydrateLanguage(partner, currentLang);\r\n }, cacheExpiration || LANGUAGE_CACHE_DURATION, forceRefresh);\r\n\r\n if (!language.content) return defaultLanguage.content;\r\n\r\n const resultLanguage = mergeLanguages(\r\n defaultLanguage.content,\r\n language.content,\r\n );\r\n\r\n await cache.set(languageCacheKey, resultLanguage, cacheExpiration || LANGUAGE_CACHE_DURATION);\r\n return resultLanguage;\r\n};\r\n\r\n/**\r\n * Given a partner and a language, this function will fetch the language files from the CDN\r\n *\r\n * @param partner\r\n * @param lang\r\n * @returns\r\n */\r\nconst hydrateLanguage = async (partner: string, lang: string): Promise<Language> => {\r\n const GLOBAL_LANGUAGE_PREFIX = `/global-${lang}.json`;\r\n const PARTNER_LANGUAGE_PREFIX = `/${partner}/${lang}.json`;\r\n\r\n // Fetch both global and partner language files in parallel\r\n const [globalLanguageFile, partnerLanguageResult] = await Promise.allSettled([\r\n fetchLanguage(`${CDN_BASE_URL}${GLOBAL_LANGUAGE_PREFIX}`) as Promise<LanguageGlobal>,\r\n fetchLanguage(`${CDN_BASE_URL}${PARTNER_LANGUAGE_PREFIX}`) as Promise<LanguagePartner>,\r\n ]);\r\n\r\n let globalFile: LanguageGlobal | undefined;\r\n let partnerLanguageFile: LanguagePartner | undefined;\r\n\r\n if (globalLanguageFile.status === 'fulfilled') {\r\n globalFile = globalLanguageFile.value as LanguageGlobal;\r\n }\r\n\r\n if (partnerLanguageResult.status === 'fulfilled') {\r\n partnerLanguageFile = partnerLanguageResult.value as LanguagePartner;\r\n }\r\n\r\n // We do an indulgent merge, we are interested on getting either with content or none since it will be merged to the default afterwards.\r\n const resultingLanguage: Language = mergeGlobalAndPartner(globalFile, partnerLanguageFile);\r\n\r\n const cachedLanguage = {\r\n translations: resultingLanguage.translations,\r\n charities: resultingLanguage.charities,\r\n };\r\n\r\n return cachedLanguage;\r\n};\r\n\r\nconst fetchLanguage = async (url: string): Promise<LanguageGlobal | LanguagePartner> => {\r\n // We don't retry at this level because we want to fail fast if the file is not available\r\n const result = await fetch(url, { cache: 'no-store' });\r\n if (!result.ok) {\r\n throw new Error(`Failed to fetch partner language file ${url}. Status: ${result.status}. Reason: ${result.statusText}`);\r\n }\r\n return result.json();\r\n};\r\n\r\n/**\r\n * This will merge all the translations and keep the charities definitions from the global file\r\n * in an indulgent manner (if undefined will return empty typed objects).\r\n * @param globalConfiguration\r\n * @param partnerConfiguration\r\n * @returns\r\n */\r\nconst mergeGlobalAndPartner = (globalConfiguration?: LanguageGlobal, partnerConfiguration?: LanguagePartner): Language => ({\r\n translations: {\r\n ...(globalConfiguration?.translations ?? {}),\r\n ...(partnerConfiguration ?? {}),\r\n },\r\n charities: {\r\n ...(globalConfiguration?.charities ?? {}),\r\n },\r\n});\r\n\r\nconst mergeLanguages = (defaultLanguage: Language, language: Language): Language => ({\r\n translations: {\r\n ...defaultLanguage.translations,\r\n ...language.translations,\r\n },\r\n charities: {\r\n ...defaultLanguage.charities,\r\n ...language.charities,\r\n },\r\n});\r\n","import { AdUnitCoreService } from '.';\nimport { Analytics } from '@/shared/analytics';\nimport { HealthCheck } from '@/shared/analytics/healthCheck';\nimport { AnalyticsTransport } from '@/shared/utils/logger';\nimport { storage } from '@/shared/utils/storage';\nimport { WILDFIRE_STORAGE_KEYS as wildfireStorageKeys } from '@/shared/constants';\nimport { WildfireDevice } from '@/shared/vendors/wildfire/types';\nimport { GiveFreelyApiClient } from '@/shared/vendors/givefreely/giveFreelyApiClient';\nimport { GiveFreelyUserService } from '@/shared/vendors/givefreely/giveFreelyUserService';\nimport { WildfireService } from '@/shared/vendors/wildfire/wildfireService';\nimport { addListeners } from '../listeners';\nimport { registerStrategies } from '../strategies';\nimport { DomainAdUnitFilter } from '../types';\nimport { initializeRegion, initializeLanguage } from '../utils/globalization';\nimport * as StateManager from '../utils/state-manager';\n\nexport async function initialize(this: AdUnitCoreService, partnerFilter: DomainAdUnitFilter = async () => {\n this.logger.debug('Using default partnerFilter.');\n return true;\n}): Promise<void> {\n if (this.state.initialized) {\n return;\n }\n\n this.logger.info('Starting initialization with mutex protection');\n\n try {\n // Initialize config service circuit breakers first\n await this.dependencies.configService.initialize();\n\n const config = await this.dependencies.configService.getConfig(true);\n this.logger.configure({\n enabled: config.loggingEnabled ?? true,\n minLevel: config.backgroundMinLogLevel ?? 'error',\n });\n this.logger.info('Initializing GiveFreelyService', { partnerApiKey: this.partnerApiKey });\n\n // Initialize services.\n\n const wildfireService = await WildfireService.createWildfireService(this.logger, config);\n\n this.state.healthCheck = new HealthCheck(this.trackEvent.bind(this), this.logger);\n await this.state.healthCheck.initialize();\n\n const giveFreelyClient = new GiveFreelyApiClient(this.partnerApiKey, config, this.logger);\n this.state.giveFreelyUserService = new GiveFreelyUserService(giveFreelyClient, this.logger);\n\n // Create anonymous user if it doesn't exist\n await this.state.giveFreelyUserService!.fetchUser();\n if (!this.state.giveFreelyUserService!.user?.id) {\n await this.state.giveFreelyUserService!.upsertUser();\n }\n\n // Initialize analytics\n this.state.analytics = new Analytics(this.partnerApiKey, this.state.giveFreelyUserService!, this.dependencies.configService);\n\n // Load persisted wfDeviceId if it exists (from previous offer activations)\n // Check storage directly to avoid creating a new device if none exists\n try {\n const existingDevice = await storage.get<WildfireDevice>(wildfireStorageKeys.DEVICE);\n if (existingDevice?.DeviceID) {\n this.state.wfDeviceId = existingDevice;\n this.logger.info('Loaded existing wfDeviceId from storage', { deviceId: existingDevice.DeviceID });\n } else {\n this.logger.debug('No existing wfDeviceId found in storage - will be created on first offer activation');\n }\n } catch (error) {\n // Storage error - device will be created on first offer activation\n this.logger.debug('Could not check for existing wfDeviceId in storage', error);\n }\n\n registerStrategies();\n\n await initializeRegion(this.logger);\n await initializeLanguage(this.logger, config, this.partnerApiKey);\n\n // Update state atomically\n this.state = StateManager.getInitializedState(this.state,\n { wildfireService, partnerFilter, config });\n\n //* ** Post initialization steps ** //\n\n // Add analytics transport to logger\n this.logger.addTransport(new AnalyticsTransport(this));\n\n // Add listeners (message and webRequest) and persists a cleanup function for them\n this.cleanupListeners = addListeners(this);\n\n // Listen for config changes that require device clearing\n setupConfigChangeHandlers.call(this);\n\n this.logger.info('GiveFreelyService initialized successfully');\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n this.logger.error('Failed to initialize GiveFreelyService', { error: message });\n throw new Error(`Failed to initialize GiveFreelyService: ${message}`);\n }\n}\n\nexport function isInitialized(this: AdUnitCoreService): boolean {\n return this.state.initialized;\n}\n\nfunction setupConfigChangeHandlers(this: AdUnitCoreService): void {\n // Listen for changes to wfAppId or wfSecret that require device clearing\n this.onConfigChange('wfAppId', async (event) => {\n this.logger.info(`Wildfire App ID changed from ${event.oldValue} to ${event.newValue} - clearing device`);\n await clearWildfireDevice.call(this);\n });\n\n this.onConfigChange('wfSecret', async (_event) => {\n this.logger.info('Wildfire Secret changed - clearing device');\n await clearWildfireDevice.call(this);\n });\n}\n\nasync function clearWildfireDevice(this: AdUnitCoreService): Promise<void> {\n try {\n if (this.state.wildfireService) {\n await this.state.wildfireService.clearDevice();\n // Reset the device ID in state so it gets fetched again\n this.state.wfDeviceId = null;\n this.logger.info('Wildfire device cleared due to config change');\n }\n } catch (error) {\n this.logger.error('Failed to clear wildfire device:', error);\n }\n}\n","import { getCountryCode } from '@/shared/services/geolocation';\nimport { Logger } from '@/shared/utils/logger';\nimport { PartnerGiveFreelyConfig } from '@/shared/config/giveFreelyConfig';\nimport { DEFAULT_LANGUAGE } from '@/shared';\nimport { getLanguage } from '@/shared/i18n';\nimport cache from '@/shared/utils/cache';\nimport { retryOperation } from '@/shared/utils/retry';\n\nexport const initializeRegion = async (logger: Logger) => {\n // Try to get the country code, but if it fails, log a debug message, don't kill the process\n try {\n await getCountryCode();\n } catch (err) {\n logger.debug('Failed to get geolocation data', { error: err });\n }\n};\n\nexport const initializeLanguage = async (logger: Logger, config: PartnerGiveFreelyConfig, partnerApiKey: string) => {\n if (config.purgeLanguages && config.purgeLanguages.length > 0) {\n await Promise.all(\n config.purgeLanguages.flatMap((lang) => [\n cache.clear(`lang-${lang}`),\n cache.clear(`global-${lang}`),\n ]),\n );\n }\n\n // Initialize default language (will throw if no default language is available either online or locally)\n retryOperation(async () => {\n logger.debug('Initializing default language with partner API key', { partnerApiKey });\n await getLanguage(logger, partnerApiKey, DEFAULT_LANGUAGE, config.configRefreshInterval);\n });\n};\n","import { PartnerGiveFreelyConfig } from '../../shared/config/giveFreelyConfig';\nimport { WildfireService } from '../../shared/vendors/wildfire/wildfireService';\nimport { AdUnitBackgroundServiceState, DomainAdUnitFilter } from '../types';\n\nexport const getDefaultState = (partnerApiKey: string): AdUnitBackgroundServiceState => ({\n initialized: false,\n wildfireService: null,\n partnerFilter: null,\n config: null,\n wfDeviceId: null,\n analytics: null,\n giveFreelyUserService: null,\n partnerApiKey,\n healthCheck: null,\n});\n\nexport const getResetState = (currentState: AdUnitBackgroundServiceState)\n : AdUnitBackgroundServiceState => {\n const newState = {\n ...currentState,\n initialized: false,\n wildfireService: null,\n partnerFilter: null,\n analytics: null,\n config: null,\n\n } as AdUnitBackgroundServiceState;\n\n return newState;\n};\n\nexport const getInitializedState = (currentState: AdUnitBackgroundServiceState,\n initializationPayload: {\n wildfireService: WildfireService,\n partnerFilter: DomainAdUnitFilter,\n config: PartnerGiveFreelyConfig\n })\n : AdUnitBackgroundServiceState => {\n const { wildfireService, partnerFilter, config } = initializationPayload;\n const newState = {\n ...currentState,\n initialized: true,\n wildfireService,\n partnerFilter,\n config,\n\n } as AdUnitBackgroundServiceState;\n\n return newState;\n};\n","import * as config from './config';\nimport * as merchants from './merchants';\nimport * as observability from './observability';\nimport * as standdown from './standdown';\nimport * as identity from './identity';\n\nexport default {\n config, merchants, observability, standdown, identity,\n};\n","import { GiveFreelyConfig } from '@/shared/config/giveFreelyConfig';\nimport { ConfigEventListener, ConfigEventUnsubscribe } from '@/shared/config/ConfigEventEmitter';\nimport { assertInitialized } from '@/shared/utils/assert-initialized';\nimport { AdUnitCoreService } from '..';\n\nexport function getConfig(this: AdUnitCoreService): GiveFreelyConfig {\n assertInitialized(this.state.initialized);\n return this.state.config!;\n}\n\nexport async function getCachedConfig(this: AdUnitCoreService): Promise<GiveFreelyConfig> {\n assertInitialized(this.state.initialized);\n this.state.config = await this.dependencies.configService.getConfig();\n this.logger.configure({\n minLevel: this.state.config.backgroundMinLogLevel ?? 'error',\n });\n return this.state.config;\n}\n\nexport function onConfigChange(this: AdUnitCoreService, pattern: string, callback: ConfigEventListener): ConfigEventUnsubscribe {\n assertInitialized(this.state.initialized);\n return this.dependencies.configService.on(pattern, callback);\n}\n\nexport function onceConfigChange(this: AdUnitCoreService, pattern: string, callback: ConfigEventListener): ConfigEventUnsubscribe {\n assertInitialized(this.state.initialized);\n return this.dependencies.configService.once(pattern, callback);\n}\n\nexport function offConfigChange(this: AdUnitCoreService, pattern: string, callback?: ConfigEventListener): void {\n assertInitialized(this.state.initialized);\n this.dependencies.configService.off(pattern, callback);\n}\n","import { AdUnitCoreService } from '..';\nimport { assertInitialized } from '@/shared/utils/assert-initialized';\nimport { GiveFreelyAnonymousUser } from '@/shared/vendors/givefreely/types';\nimport { WildfireActiveDomain, WildfireMerchantRateDetail, RateKindMap } from '@/shared/vendors/wildfire/types';\n\nexport async function getActiveDomains(this: AdUnitCoreService): Promise<WildfireActiveDomain[]> {\n assertInitialized(this.state.initialized);\n return this.state.wildfireService!.getActiveDomains();\n}\n\nexport async function generateAffiliateUrl(this: AdUnitCoreService, activeDomain: WildfireActiveDomain, originalUrl: string, currentUser: GiveFreelyAnonymousUser | null): Promise<string> {\n assertInitialized(this.state.initialized);\n return this.state.wildfireService!.generateAffiliateUrl(activeDomain, originalUrl, currentUser, this.state.partnerApiKey);\n}\n\nexport async function getMerchantRates(this: AdUnitCoreService, merchantId: number): Promise<WildfireMerchantRateDetail<keyof RateKindMap>[]> {\n assertInitialized(this.state.initialized);\n\n if (!this.state.wildfireService) {\n throw new Error('Wildfire service not initialized');\n }\n\n return this.state.wildfireService.getMerchantRates(merchantId);\n}\n","import { AdUnitCoreService } from '..';\nimport { EventType } from '@/shared/analytics/types';\nimport { assertInitialized } from '@/shared/utils/assert-initialized';\nimport { Logger } from '@/shared/utils/logger';\n\nexport function trackEvent(this: AdUnitCoreService, eventType: EventType, eventData: unknown, anonymous: boolean = false, skipThrottling: boolean = false) {\n assertInitialized(this.state.initialized);\n return this.state.analytics!.track(eventType, this.state.wfDeviceId?.DeviceID, eventData, anonymous, skipThrottling);\n}\n\nexport function getLogger(this: AdUnitCoreService): Logger {\n assertInitialized(this.state.initialized);\n return this.logger;\n}\n\nexport async function healthCheck(this: AdUnitCoreService): Promise<void> {\n assertInitialized(this.state.initialized);\n\n await this.state.healthCheck!.check();\n}\n","import { assertInitialized } from '@/shared/utils/assert-initialized';\nimport { updateStanddownHistory as updateHistory } from '@/shared/vendors/wildfire/standdown';\nimport { regexMatch } from '../../utils/regexMatch';\nimport { AdUnitCoreService } from '..';\n\nexport async function shouldStandDown(this: AdUnitCoreService, activeDomain: string, url: string) {\n assertInitialized(this.state.initialized);\n\n const parsedUrl = new URL(url);\n const partnerFilterResult = await this.state.partnerFilter!(parsedUrl.hostname);\n if (!partnerFilterResult) {\n this.logger.info('Should standdown due to partner filter.');\n return true;\n }\n\n if (this.getConfig().merchantExclusions.some((x) => x.mutePopups && (activeDomain === x.domain))) {\n this.logger.info('Should standdown due to merchant exclusions');\n return true;\n }\n\n const result = await this.state.wildfireService!.shouldStandDown(this.logger, activeDomain, url);\n if (result) this.logger.info('Should standdown due to vendor policy');\n\n return result;\n}\n\nexport function updateStanddownHistory(this: AdUnitCoreService, activeDomain: string) {\n assertInitialized(this.state.initialized);\n return updateHistory(activeDomain);\n}\n\nexport function hasAffiliation(this: AdUnitCoreService, hosts: (string | undefined)[], search: string) {\n if (!this.state.wildfireService) {\n this.logger.warn('Wildfire service not initialized yet');\n return false;\n }\n\n const result = this.state.wildfireService!.hasAffilliation(hosts, search);\n if (result) this.logger.info('WF Affiliation identified');\n\n return result;\n}\n\nexport function isCustomStandownMatch(this: AdUnitCoreService, urls: (string | undefined)[]): boolean {\n const result = urls.some((url) => this.getConfig().customStandownPolicy?.urlRegex?.some((regex) => (url ? regexMatch(url, regex) : false)));\n\n if (result) this.logger.info('Custom Standown identified');\n\n return result;\n}\n","export function regexMatch(url: string, regexString: string): boolean {\n const regex = new RegExp(regexString);\n return regex.test(url);\n}\n","import { Language } from '@/shared/i18n/types';\nimport { getLanguage as geti18nLanguage } from '@/shared/i18n';\nimport { assertInitialized } from '@/shared/utils/assert-initialized';\nimport { GiveFreelyCharity, GiveFreelyAnonymousUser } from '@/shared/vendors/givefreely/types';\nimport { AdUnitCoreService } from '..';\n\nexport async function initializeWfDeviceId(this: AdUnitCoreService): Promise<number> {\n assertInitialized(this.state.initialized);\n this.state.wfDeviceId = await this.state.wildfireService!.getDevice();\n if (!this.state.wfDeviceId) {\n throw new Error('Failed to initialize Wildfire device ID');\n }\n return this.state.wfDeviceId.DeviceID;\n}\n\nexport function upsertUser(this: AdUnitCoreService, charity: GiveFreelyCharity, wfDeviceId?: number) {\n assertInitialized(this.state.initialized);\n return this.state.giveFreelyUserService!.upsertUser(charity, wfDeviceId);\n}\n\nexport function getCurrentUser(this: AdUnitCoreService): GiveFreelyAnonymousUser | null {\n assertInitialized(this.state.initialized);\n return this.state.giveFreelyUserService!.user;\n}\n\nexport async function getLanguage(this: AdUnitCoreService, language: string): Promise<Language> {\n assertInitialized(this.state.initialized);\n return geti18nLanguage(this.logger, this.state.partnerApiKey, language, this.state.config?.configRefreshInterval, this.state.config?.ignoredLanguages);\n}\n","import { GiveFreelyConfigService } from '../../shared/config/giveFreelyConfig';\nimport { Logger } from '../../shared/utils/logger';\nimport { AdUnitBackgroundServiceState, ServiceDependencies } from '../types';\nimport * as StateManager from '../utils/state-manager';\nimport { initialize, isInitialized } from './initialize';\nimport CoreExtensions from './extensions';\n\nexport class AdUnitCoreService {\n protected readonly dependencies: ServiceDependencies;\n protected readonly logger: Logger;\n protected state: AdUnitBackgroundServiceState;\n protected cleanupListeners: (() => void) | null = null;\n constructor(public readonly partnerApiKey: string) {\n this.dependencies = {\n configService: new GiveFreelyConfigService(partnerApiKey),\n };\n this.logger = Logger.getInstance();\n this.logger.configure({\n enabled: true,\n title: 'Background - GiveFreelyService',\n });\n this.state = StateManager.getDefaultState(partnerApiKey);\n }\n\n public initialize = initialize.bind(this);\n public isInitialized = isInitialized.bind(this);\n\n /* ** Extension Members ** */\n\n // Configuration members\n public getConfig = CoreExtensions.config.getConfig.bind(this);\n public getCachedConfig = CoreExtensions.config.getCachedConfig.bind(this);\n public onConfigChange = CoreExtensions.config.onConfigChange.bind(this);\n public onceConfigChange = CoreExtensions.config.onceConfigChange.bind(this);\n public offConfigChange = CoreExtensions.config.offConfigChange.bind(this);\n\n // Observability members\n public getLogger = CoreExtensions.observability.getLogger.bind(this);\n public healthCheck = CoreExtensions.observability.healthCheck.bind(this);\n public trackEvent = CoreExtensions.observability.trackEvent.bind(this);\n\n // Identity members\n public initializeWfDeviceId = CoreExtensions.identity.initializeWfDeviceId.bind(this);\n public upsertUser = CoreExtensions.identity.upsertUser.bind(this);\n public getCurrentUser = CoreExtensions.identity.getCurrentUser.bind(this);\n public getLanguage = CoreExtensions.identity.getLanguage.bind(this);\n\n // Merchants members\n public getActiveDomains = CoreExtensions.merchants.getActiveDomains.bind(this);\n public generateAffiliateUrl = CoreExtensions.merchants.generateAffiliateUrl.bind(this);\n public getMerchantRates = CoreExtensions.merchants.getMerchantRates.bind(this);\n\n // Standdwown policy members\n public shouldStandDown = CoreExtensions.standdown.shouldStandDown.bind(this);\n public updateStanddownHistory = CoreExtensions.standdown.updateStanddownHistory.bind(this);\n public hasAffiliation = CoreExtensions.standdown.hasAffiliation.bind(this);\n public isCustomStandownMatch = CoreExtensions.standdown.isCustomStandownMatch.bind(this);\n\n public async destroy(): Promise<void> {\n this.logger.info('Destroying GiveFreelyService');\n await Promise.all([\n this.dependencies.configService.clearCache(),\n this.state.wildfireService?.clearCache(),\n this.state.giveFreelyUserService?.resetUser(),\n ]);\n\n if (this.cleanupListeners) {\n this.cleanupListeners();\n this.logger.info('Event listeners cleared.');\n this.cleanupListeners = null;\n }\n\n // Reset state atomically\n this.state = StateManager.getResetState(this.state);\n }\n}\n","import { AdUnitCoreService } from './core';\nimport { DomainAdUnitFilter } from './types';\n\n/*\n **IMPORTANT:\n\n This is a facade class. Please don't add any class member that\n we don't want to expose to customers.\n*/\n\n/**\n * Main service for GiveFreely functionality\n *\n * Example usage:\n *\n * const giveFreely = new GiveFreely.GiveFreelyService(PARTNER_KEY);\n * const domainAdUnitFilter = async (domain) => {\n * const result = !(domain === 'www.temu.com')\n * return result\n * }\n *\n * giveFreely.initialize(domainAdUnitFilter)\n * .then(() => {\n * // Log to show the background script is running\n * console.log('GiveFreely background running');\n * });\n */\nexport class GiveFreelyService {\n private readonly _adUnitService: AdUnitCoreService;\n\n constructor(public readonly partnerApiKey: string) {\n this._adUnitService = new AdUnitCoreService(partnerApiKey);\n }\n\n initialize = (partnerFilter?: DomainAdUnitFilter) =>\n this._adUnitService.initialize(partnerFilter);\n\n destroy = () => this._adUnitService.destroy();\n}\n","import { MessageStrategyRegistry } from '../strategies/MessageStrategy';\r\n\r\nexport const isAdUnitMessage = (message: unknown) => MessageStrategyRegistry.exists(message);\r\n"],"names":["globalThis","chrome","runtime","id","Error","browser","module","exports","CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE","wrapAPIs","extensionAPIs","apiMetadata","alarms","clear","minArgs","maxArgs","clearAll","get","getAll","bookmarks","create","getChildren","getRecent","getSubTree","getTree","move","remove","removeTree","search","update","browserAction","disable","fallbackToNoCallback","enable","getBadgeBackgroundColor","getBadgeText","getPopup","getTitle","openPopup","setBadgeBackgroundColor","setBadgeText","setIcon","setPopup","setTitle","browsingData","removeCache","removeCookies","removeDownloads","removeFormData","removeHistory","removeLocalStorage","removePasswords","removePluginData","settings","commands","contextMenus","removeAll","cookies","getAllCookieStores","set","devtools","inspectedWindow","eval","singleCallbackArg","panels","elements","createSidebarPane","downloads","cancel","download","erase","getFileIcon","open","pause","removeFile","resume","show","extension","isAllowedFileSchemeAccess","isAllowedIncognitoAccess","history","addUrl","deleteAll","deleteRange","deleteUrl","getVisits","i18n","detectLanguage","getAcceptLanguages","identity","launchWebAuthFlow","idle","queryState","management","getSelf","setEnabled","uninstallSelf","notifications","getPermissionLevel","pageAction","hide","permissions","contains","request","getBackgroundPage","getPlatformInfo","openOptionsPage","requestUpdateCheck","sendMessage","sendNativeMessage","setUninstallURL","sessions","getDevices","getRecentlyClosed","restore","storage","local","getBytesInUse","managed","sync","tabs","captureVisibleTab","discard","duplicate","executeScript","getCurrent","getZoom","getZoomSettings","goBack","goForward","highlight","insertCSS","query","reload","removeCSS","setZoom","setZoomSettings","topSites","webNavigation","getAllFrames","getFrame","webRequest","handlerBehaviorChanged","windows","getLastFocused","Object","keys","length","DefaultWeakMap","WeakMap","constructor","createItem","items","undefined","super","this","key","has","makeCallback","promise","metadata","callbackArgs","lastError","reject","message","resolve","pluralizeArguments","numArgs","wrapMethod","target","method","wrapper","Proxy","apply","targetMethod","thisObj","args","call","hasOwnProperty","Function","bind","prototype","wrapObject","wrappers","cache","handlers","proxyTarget","prop","receiver","value","wrapAsyncFunction","name","Promise","cbError","console","warn","noCallback","defineProperty","configurable","enumerable","desc","Reflect","deleteProperty","wrapEvent","wrapperMap","addListener","listener","hasListener","removeListener","onRequestFinishedWrappers","req","wrappedReq","getContent","onMessageWrappers","sender","sendResponse","wrappedSendResponse","result","didCallSendResponse","sendResponsePromise","response","err","isResultThenable","then","msg","error","__mozWebExtensionPolyfillReject__","catch","wrappedSendMessageCallback","reply","wrappedSendMessage","apiNamespaceObj","wrappedCb","push","staticWrappers","network","onRequestFinished","onMessage","onMessageExternal","settingMetadata","privacy","services","websites","PopupEvent","LoggingEvent","ConsoleTransport","isLocal","log","level","timestamp","data","title","consoleMethod","titlePrefix","LOGGER_PREFIX","AnalyticsTransport","backgroundService","trackEvent","adUnitLog","LOG_LEVELS","Logger","config","minLevel","enabled","transports","getInstance","instance","configure","shouldLog","indexOf","createLogMessage","version","LIB_VERSION","Date","toISOString","onlyLocal","logMessage","filter","transport","forEach","debug","info","critical","fatal","addTransport","clearTransports","MAX_RETRY_ATTEMPTS","defaultDelay","attempt","async","retryOperation","operation","options","returnOnFailure","maxAttempts","delayFn","setTimeout","logger","operationName","api","MESSAGE_TYPES","TRACK_EVENT","HIDE_POPUP","GET_POPUP_CONFIG","IS_ACTIVE_DOMAIN","LOG_MERCHANTS_IN_SEARCH_RESULTS","SHOULD_STAND_DOWN","ACTIVATE_OFFER","STORE_SHOPIFY_SHOP_ID","GET_DOMAIN_BY_SHOP_ID","GET_LANGUAGE_CONTENT","SHOPIFY_SHOP_IDS_STORAGE_KEY","LAST_HEALTH_CHECK_STORAGE_KEY","PARTNER_CONFIG_STORAGE_KEY","GLOBAL_CONFIG_STORAGE_KEY","COUNTRY_CODE_STORAGE_KEY","VERSION_STORAGE_KEY","ANONYMOUS_USER_STORAGE_KEY","ANONYMOUS_ENCRYPTED_TOKEN_STORAGE_KEY","GF_AD_EVENT_HISTORY_STORAGE_KEY","WILDFIRE_STORAGE_KEYS","DEFAULT_LANGUAGE","storagePrefix","prefixedKey","prefixedKeys","Array","isArray","map","getCurrentVersion","String","isNewVersion","updateStorageIfNew","storedVersion","currentVersion","isANewVersion","newVersion","hydrationFn","retentionInSeconds","forceRefresh","deriveRetentionInSeconds","cachedValue","staleValue","isStale","currentRetention","now","lastFetch","content","rawContent","derivedRetention","ex","effectiveRetention","ConfigEventEmitter","listeners","Map","wildcardListeners","Set","on","pattern","callback","once","off","delete","from","entry","includes","filtered","emit","event","exactListeners","path","listenersToCall","add","matchesPattern","patternListeners","size","regex","split","part","replace","join","RegExp","test","deepDiff","oldObj","newObj","diffs","isPrimitive","oldValue","newValue","JSON","stringify","isObject","oldObjRecord","newObjRecord","allKeys","currentPath","nestedDiffs","CircuitState","CircuitBreaker","state","CLOSED","failures","lastFailureTime","halfOpenCalls","failureThreshold","recoveryTimeout","monitoringWindow","halfOpenMaxCalls","storageKey","initialize","loadFromStorage","savedState","cleanupOldFailures","localStorage","getItem","parsedState","parse","saveToStorage","stateToSave","setItem","failure","execute","fallback","OPEN","shouldAttemptRecovery","HALF_OPEN","onSuccess","onFailure","getState","getFailureCount","reset","clearStorage","removeItem","getStatus","failureCount","nextAttemptTime","CONFIG_BASE_URL","GiveFreelyConfigService","partnerApiKey","partnerConfig","globalConfig","mergedConfig","globalConfigRefreshInterval","partnerConfigRefreshInterval","eventEmitter","isInitialized","partnerCircuitBreaker","globalCircuitBreaker","all","ensureInitialized","getRetryOptions","fetchPartnerConfig","cacheResult","fetch","ok","statusText","json","configRefreshInterval","fetchGlobalConfig","configResponse","status","getCachedConfig","getConfig","forceRefreshIfIsNewVersion","mergedConfigs","mergeConfigs","merchantExclusionsAdapter","destinationConfig","merchantExclusions","emitConfigChanges","clearCache","getCircuitBreakerStatus","partner","global","globalConfigRecord","partnerConfigRecord","newConfig","diff","Analytics","userService","configService","debounceWindowInMinutes","track","eventType","wfDeviceId","payload","anonymous","skipThrottling","_partnerApiKey","eventData","userId","_userService","user","libVersion","serializedEvent","_key","stack","eventsUrl","getEventsUrl","BroadcastEvent","_logger","getEventsHistory","lastHourDate","m","setTime","getTime","addMinutes","_debounceWindowInMinutes","typedHistory","x","createdAt","shouldBroadcastEvent","some","pushEventToHistory","_configService","headers","body","type","HealthCheck","lastCheck","lastHealthCheckStored","getToday","check","lastHealthCheck","today","checkoutPopupHealthCheck","language","getUILanguage","CommissionStatusEnum","GiveFreelyApiClient","adUnitId","getAnonymousUserCommissions","anonymousUserToken","filterParams","queryString","URLSearchParams","toString","apiConfig","baseUri","getAnonymousUserComissionsPath","createOrUpdateAnonymousUser","requestPayload","createAnonymousUserPath","setAnonymousUserTokenHeader","resultUser","charity","ein","selectedCharity","thirdPartyId","selectedCharityThirdPartyIdentifier","resultToken","GiveFreelyUserService","giveFreelyApiClient","_giveFreelyApiClient","resetUser","upsertUser","currentUser","fetchUser","changingPayload","deviceId","shouldCreateOrUpdateUser","anonymousEncriptedToken","WildfireClient","wfSecret","wfAppId","deviceUrl","dataUrl","getWildfireDevice","getActiveDomains","url","getStanddownPolicy","getMerchantRates","rates","shouldStandDown","activeDomain","affiliateStandDown","getStanddownHistory","updateStanddownHistory","refreshCache","policy","hasAffiliateParams","URL","hasAffiliation","hostNames","standDownPolicy","hostname","hasAffiliateDomain","wildfireStorageKeys","domain","hours","Domains","searchParams","Params","param","toLowerCase","TrackingCode","charityEin","charityThirdPartyIdentifier","partnerId","encodeUserId","btoa","WildfireService","wildfireClient","vanityBaseUrl","refreshInterval","hasAffilliation","domains","fetchActiveDomains","merchantId","cachedRates","fetchMerchantRates","generateAffiliateUrl","originalUrl","device","getDevice","trackingCode","generateTrackingCode","encodedUrl","encodeURIComponent","encodedTrackingCode","DeviceID","ID","clearDevice","forceSync","fetchStanddownPolicy","fetchAndStoreDevice","LostAttribution","Serp","merchantRates","createWildfireService","wfService","isValidURL","affiliatedRequests","ignoredRequests","affiliateWebFilter","urls","types","UninitializedServiceError","assertInitialized","MessageStrategyRegistry","register","messageType","strategy","strategies","exists","isValidMessage","knownMessageTypes","values","addListeners","adUnitBackground","cleanupWebRequestListeners","onBeforeRequestListener","gfService","getLogger","requestId","initiator","initiatorHostname","isCustomStandownMatch","standDownlisteners","onBeforeRequest","filters","onBeforeRedirectListener","redirectUrl","find","Domain","endsWith","onBeforeRedirect","onCompletedListener","onCompleted","messageListener","typedSendResponse","resp","maybePromise","handleMessage","addMessageListener","context","giveFreelyService","handle","ActivateOfferStrategy","initializeWfDeviceId","affiliateUrl","currentTab","tab","newTab","openerTabId","active","pinned","onUpdated","updatedTabId","changeInfo","tabId","waitForTabToLoad","createTab","checkoutPopupFailedActivation","GetDomainByShopIdStrategy","shopId","STORAGE_KEY","matchingShopInfo","found","shopInfo","GetLanguageContentStrategy","lang","getLanguage","translations","charities","GetPopupConfigStrategy","HidePopupStrategy","days","expiry","setDate","getDate","popupHide","ack","IsActiveDomainStrategy","activeDomains","healthCheck","disableDomain","isActive","count","Merchant","LogMerchantsInSearchResultsStrategy","currentUrl","searchResults","source","merchantsSearchResults","z","number","searchResultsId","Math","floor","random","checkoutPopupMerchantInResultsFound","searchResultUrl","sponsored","isSponsored","StoreShopifyShopIdStrategy","existingData","existingIndex","findIndex","item","success","ShouldStandDownStrategy","TrackEventStrategy","getCountryCode","requestOptions","Authorization","country","iso_code","detectUsersCountry","CDN_BASE_URL","cacheExpiration","ignoredLanguages","currentLang","defaultLanguageCacheKey","defaultLanguage","hydrateLanguage","languageCacheKey","resultLanguage","mergeLanguages","GLOBAL_LANGUAGE_PREFIX","PARTNER_LANGUAGE_PREFIX","globalLanguageFile","partnerLanguageResult","allSettled","fetchLanguage","globalFile","partnerLanguageFile","resultingLanguage","mergeGlobalAndPartner","globalConfiguration","partnerConfiguration","partnerFilter","initialized","dependencies","loggingEnabled","backgroundMinLogLevel","wildfireService","giveFreelyClient","giveFreelyUserService","analytics","existingDevice","initializeRegion","purgeLanguages","flatMap","initializeLanguage","getInitializedState","currentState","initializationPayload","StateManager","cleanupListeners","setupConfigChangeHandlers","onConfigChange","clearWildfireDevice","CoreExtensions","merchants","observability","standdown","hosts","customStandownPolicy","urlRegex","regexString","regexMatch","parsedUrl","mutePopups","updateHistory","geti18nLanguage","AdUnitCoreService","onceConfigChange","offConfigChange","getCurrentUser","destroy","GiveFreelyService","_adUnitService","isAdUnitMessage"],"mappings":"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","x_google_ignoreList":[0]}
|