@amplitude/session-replay-browser 1.28.14 → 1.28.16

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index-min.js","sources":["../../../analytics-core/lib/esm/types/event/event.js","../../../analytics-core/lib/esm/types/constants.js","../../../analytics-core/lib/esm/types/status.js","../../../analytics-core/lib/esm/global-scope.js","../../../analytics-core/lib/esm/types/loglevel.js","../../../analytics-core/lib/esm/utils/return-wrapper.js","../../../analytics-core/lib/esm/logger.js","../../../analytics-core/lib/esm/config.js","../../../../node_modules/@amplitude/analytics-connector/dist/analytics-connector.esm.js","../../../analytics-core/lib/esm/types/server-zone.js","../../../analytics-core/lib/esm/utils/debug.js","../../../analytics-core/lib/esm/transports/base.js","../../../analytics-core/lib/esm/transports/fetch.js","../../../src/constants.ts","../../../src/logger.ts","../../../src/config/types.ts","../../../src/helpers.ts","../../../src/utils/get-input-type.ts","../../../src/config/local-config.ts","../../../../node_modules/@amplitude/rrweb-types/dist/rrweb-types.js","../../../analytics-remote-config/node_modules/@amplitude/analytics-types/lib/esm/server-zone.js","../../../analytics-remote-config/node_modules/@amplitude/analytics-types/lib/esm/status.js","../../../analytics-remote-config/node_modules/@amplitude/analytics-core/lib/esm/transports/base.js","../../../analytics-remote-config/lib/esm/remote-config.js","../../../analytics-remote-config/lib/esm/index.js","../../../src/config/joined-config.ts","../../../../node_modules/@amplitude/rrweb-packer/dist/base-BrE4jft0.js","../../../../node_modules/@amplitude/rrweb-packer/dist/pack.js","../../../src/events/event-compressor.ts","../../../src/messages.ts","../../../src/version.ts","../../../src/track-destination.ts","../../../src/events/base-events-store.ts","../../../src/events/legacy-idb-types.ts","../../../src/events/events-idb-store.ts","../../../src/events/events-memory-store.ts","../../../src/events/events-manager.ts","../../../src/events/multi-manager.ts","../../../../node_modules/@amplitude/rrweb-utils/dist/rrweb-utils.js","../../../src/utils/rrweb.ts","../../../src/libs/finder.ts","../../../src/hooks/click.ts","../../../src/beacon-transport.ts","../../../src/hooks/scroll.ts","../../../src/identifiers.ts","../../../src/targeting/targeting-idb-store.ts","../../../src/plugins/url-tracking-plugin.ts","../../../src/session-replay.ts","../../../src/targeting/targeting-manager.ts","../../../analytics-core/lib/esm/analytics-connector.js","../../../src/session-replay-factory.ts","../../../src/index.ts"],"sourcesContent":["export var IdentifyOperation;\n(function (IdentifyOperation) {\n // Base Operations to set values\n IdentifyOperation[\"SET\"] = \"$set\";\n IdentifyOperation[\"SET_ONCE\"] = \"$setOnce\";\n // Operations around modifying existing values\n IdentifyOperation[\"ADD\"] = \"$add\";\n IdentifyOperation[\"APPEND\"] = \"$append\";\n IdentifyOperation[\"PREPEND\"] = \"$prepend\";\n IdentifyOperation[\"REMOVE\"] = \"$remove\";\n // Operations around appending values *if* they aren't present\n IdentifyOperation[\"PREINSERT\"] = \"$preInsert\";\n IdentifyOperation[\"POSTINSERT\"] = \"$postInsert\";\n // Operations around removing properties/values\n IdentifyOperation[\"UNSET\"] = \"$unset\";\n IdentifyOperation[\"CLEAR_ALL\"] = \"$clearAll\";\n})(IdentifyOperation || (IdentifyOperation = {}));\n/**\n * Strings that have special meaning when used as an event's type\n * and have different specifications.\n */\nexport var SpecialEventType;\n(function (SpecialEventType) {\n SpecialEventType[\"IDENTIFY\"] = \"$identify\";\n SpecialEventType[\"GROUP_IDENTIFY\"] = \"$groupidentify\";\n SpecialEventType[\"REVENUE\"] = \"revenue_amount\";\n})(SpecialEventType || (SpecialEventType = {}));\n//# sourceMappingURL=event.js.map","export var UNSET_VALUE = '-';\nexport var AMPLITUDE_PREFIX = 'AMP';\nexport var STORAGE_PREFIX = \"\".concat(AMPLITUDE_PREFIX, \"_unsent\");\nexport var DEFAULT_INSTANCE_NAME = '$default_instance';\nexport var AMPLITUDE_SERVER_URL = 'https://api2.amplitude.com/2/httpapi';\nexport var EU_AMPLITUDE_SERVER_URL = 'https://api.eu.amplitude.com/2/httpapi';\nexport var AMPLITUDE_BATCH_SERVER_URL = 'https://api2.amplitude.com/batch';\nexport var EU_AMPLITUDE_BATCH_SERVER_URL = 'https://api.eu.amplitude.com/batch';\n// Campaign constants\nexport var UTM_CAMPAIGN = 'utm_campaign';\nexport var UTM_CONTENT = 'utm_content';\nexport var UTM_ID = 'utm_id';\nexport var UTM_MEDIUM = 'utm_medium';\nexport var UTM_SOURCE = 'utm_source';\nexport var UTM_TERM = 'utm_term';\nexport var DCLID = 'dclid';\nexport var FBCLID = 'fbclid';\nexport var GBRAID = 'gbraid';\nexport var GCLID = 'gclid';\nexport var KO_CLICK_ID = 'ko_click_id';\nexport var LI_FAT_ID = 'li_fat_id';\nexport var MSCLKID = 'msclkid';\nexport var RDT_CID = 'rdt_cid';\nexport var TTCLID = 'ttclid';\nexport var TWCLID = 'twclid';\nexport var WBRAID = 'wbraid';\nexport var EMPTY_VALUE = 'EMPTY';\nexport var BASE_CAMPAIGN = {\n utm_campaign: undefined,\n utm_content: undefined,\n utm_id: undefined,\n utm_medium: undefined,\n utm_source: undefined,\n utm_term: undefined,\n referrer: undefined,\n referring_domain: undefined,\n dclid: undefined,\n gbraid: undefined,\n gclid: undefined,\n fbclid: undefined,\n ko_click_id: undefined,\n li_fat_id: undefined,\n msclkid: undefined,\n rdt_cid: undefined,\n ttclid: undefined,\n twclid: undefined,\n wbraid: undefined,\n};\nexport var MKTG = 'MKTG';\n// list of Network headers that are safe to capture\nexport var SAFE_HEADERS = [\n 'access-control-allow-origin',\n 'access-control-allow-credentials',\n 'access-control-expose-headers',\n 'access-control-max-age',\n 'access-control-allow-methods',\n 'access-control-allow-headers',\n 'accept-patch',\n 'accept-ranges',\n 'age',\n 'allow',\n 'alt-svc',\n 'cache-control',\n 'connection',\n 'content-disposition',\n 'content-encoding',\n 'content-language',\n 'content-length',\n 'content-location',\n 'content-md5',\n 'content-range',\n 'content-type',\n 'date',\n 'delta-base',\n 'etag',\n 'expires',\n 'im',\n 'last-modified',\n 'link',\n 'location',\n 'permanent',\n 'p3p',\n 'pragma',\n 'proxy-authenticate',\n 'public-key-pins',\n 'retry-after',\n 'server',\n 'status',\n 'strict-transport-security',\n 'trailer',\n 'transfer-encoding',\n 'tk',\n 'upgrade',\n 'vary',\n 'via',\n 'warning',\n 'www-authenticate',\n 'x-b3-traceid',\n 'x-frame-options',\n];\n// list of Network headers to never capture\nexport var FORBIDDEN_HEADERS = ['authorization', 'cookie', 'set-cookie'];\n//# sourceMappingURL=constants.js.map","/** The status of an event. */\nexport var Status;\n(function (Status) {\n /** The status could not be determined. */\n Status[\"Unknown\"] = \"unknown\";\n /** The event was skipped due to configuration or callbacks. */\n Status[\"Skipped\"] = \"skipped\";\n /** The event was sent successfully. */\n Status[\"Success\"] = \"success\";\n /** A user or device in the payload is currently rate limited and should try again later. */\n Status[\"RateLimit\"] = \"rate_limit\";\n /** The sent payload was too large to be processed. */\n Status[\"PayloadTooLarge\"] = \"payload_too_large\";\n /** The event could not be processed. */\n Status[\"Invalid\"] = \"invalid\";\n /** A server-side error ocurred during submission. */\n Status[\"Failed\"] = \"failed\";\n /** a server or client side error occuring when a request takes too long and is cancelled */\n Status[\"Timeout\"] = \"Timeout\";\n /** NodeJS runtime environment error.. E.g. disconnected from network */\n Status[\"SystemError\"] = \"SystemError\";\n})(Status || (Status = {}));\n//# sourceMappingURL=status.js.map","/* eslint-disable no-restricted-globals */\n/* Only file allowed to access to globalThis, window, self */\nexport var getGlobalScope = function () {\n // This should only be used for integrations with Amplitude that are not running in a browser environment\n // We need to specify the name of the global variable as a string to prevent it from being minified\n var ampIntegrationContextName = 'ampIntegrationContext';\n if (typeof globalThis !== 'undefined' && typeof globalThis[ampIntegrationContextName] !== 'undefined') {\n return globalThis[ampIntegrationContextName];\n }\n if (typeof globalThis !== 'undefined') {\n return globalThis;\n }\n if (typeof window !== 'undefined') {\n return window;\n }\n if (typeof self !== 'undefined') {\n return self;\n }\n if (typeof global !== 'undefined') {\n return global;\n }\n return undefined;\n};\n//# sourceMappingURL=global-scope.js.map","export var LogLevel;\n(function (LogLevel) {\n LogLevel[LogLevel[\"None\"] = 0] = \"None\";\n LogLevel[LogLevel[\"Error\"] = 1] = \"Error\";\n LogLevel[LogLevel[\"Warn\"] = 2] = \"Warn\";\n LogLevel[LogLevel[\"Verbose\"] = 3] = \"Verbose\";\n LogLevel[LogLevel[\"Debug\"] = 4] = \"Debug\";\n})(LogLevel || (LogLevel = {}));\n//# sourceMappingURL=loglevel.js.map","export var returnWrapper = function (awaitable) { return ({\n promise: awaitable || Promise.resolve(),\n}); };\n//# sourceMappingURL=return-wrapper.js.map","import { LogLevel } from './types/loglevel';\nvar PREFIX = 'Amplitude Logger ';\nvar Logger = /** @class */ (function () {\n function Logger() {\n this.logLevel = LogLevel.None;\n }\n Logger.prototype.disable = function () {\n this.logLevel = LogLevel.None;\n };\n Logger.prototype.enable = function (logLevel) {\n if (logLevel === void 0) { logLevel = LogLevel.Warn; }\n this.logLevel = logLevel;\n };\n Logger.prototype.log = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (this.logLevel < LogLevel.Verbose) {\n return;\n }\n console.log(\"\".concat(PREFIX, \"[Log]: \").concat(args.join(' ')));\n };\n Logger.prototype.warn = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (this.logLevel < LogLevel.Warn) {\n return;\n }\n console.warn(\"\".concat(PREFIX, \"[Warn]: \").concat(args.join(' ')));\n };\n Logger.prototype.error = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (this.logLevel < LogLevel.Error) {\n return;\n }\n console.error(\"\".concat(PREFIX, \"[Error]: \").concat(args.join(' ')));\n };\n Logger.prototype.debug = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (this.logLevel < LogLevel.Debug) {\n return;\n }\n // console.debug output is hidden by default in chrome\n console.log(\"\".concat(PREFIX, \"[Debug]: \").concat(args.join(' ')));\n };\n return Logger;\n}());\nexport { Logger };\n//# sourceMappingURL=logger.js.map","import { AMPLITUDE_SERVER_URL, AMPLITUDE_BATCH_SERVER_URL, EU_AMPLITUDE_SERVER_URL, EU_AMPLITUDE_BATCH_SERVER_URL, DEFAULT_INSTANCE_NAME, } from './types/constants';\nimport { Logger } from './logger';\nimport { LogLevel } from './types/loglevel';\nexport var getDefaultConfig = function () { return ({\n flushMaxRetries: 12,\n flushQueueSize: 200,\n flushIntervalMillis: 10000,\n instanceName: DEFAULT_INSTANCE_NAME,\n logLevel: LogLevel.Warn,\n loggerProvider: new Logger(),\n offline: false,\n optOut: false,\n serverUrl: AMPLITUDE_SERVER_URL,\n serverZone: 'US',\n useBatch: false,\n}); };\nvar Config = /** @class */ (function () {\n function Config(options) {\n var _a, _b, _c, _d;\n this._optOut = false;\n var defaultConfig = getDefaultConfig();\n this.apiKey = options.apiKey;\n this.flushIntervalMillis = (_a = options.flushIntervalMillis) !== null && _a !== void 0 ? _a : defaultConfig.flushIntervalMillis;\n this.flushMaxRetries = options.flushMaxRetries || defaultConfig.flushMaxRetries;\n this.flushQueueSize = options.flushQueueSize || defaultConfig.flushQueueSize;\n this.instanceName = options.instanceName || defaultConfig.instanceName;\n this.loggerProvider = options.loggerProvider || defaultConfig.loggerProvider;\n this.logLevel = (_b = options.logLevel) !== null && _b !== void 0 ? _b : defaultConfig.logLevel;\n this.minIdLength = options.minIdLength;\n this.plan = options.plan;\n this.ingestionMetadata = options.ingestionMetadata;\n this.offline = options.offline !== undefined ? options.offline : defaultConfig.offline;\n this.optOut = (_c = options.optOut) !== null && _c !== void 0 ? _c : defaultConfig.optOut;\n this.serverUrl = options.serverUrl;\n this.serverZone = options.serverZone || defaultConfig.serverZone;\n this.storageProvider = options.storageProvider;\n this.transportProvider = options.transportProvider;\n this.useBatch = (_d = options.useBatch) !== null && _d !== void 0 ? _d : defaultConfig.useBatch;\n this.loggerProvider.enable(this.logLevel);\n var serverConfig = createServerConfig(options.serverUrl, options.serverZone, options.useBatch);\n this.serverZone = serverConfig.serverZone;\n this.serverUrl = serverConfig.serverUrl;\n }\n Object.defineProperty(Config.prototype, \"optOut\", {\n get: function () {\n return this._optOut;\n },\n set: function (optOut) {\n this._optOut = optOut;\n },\n enumerable: false,\n configurable: true\n });\n return Config;\n}());\nexport { Config };\nexport var getServerUrl = function (serverZone, useBatch) {\n if (serverZone === 'EU') {\n return useBatch ? EU_AMPLITUDE_BATCH_SERVER_URL : EU_AMPLITUDE_SERVER_URL;\n }\n return useBatch ? AMPLITUDE_BATCH_SERVER_URL : AMPLITUDE_SERVER_URL;\n};\nexport var createServerConfig = function (serverUrl, serverZone, useBatch) {\n if (serverUrl === void 0) { serverUrl = ''; }\n if (serverZone === void 0) { serverZone = getDefaultConfig().serverZone; }\n if (useBatch === void 0) { useBatch = getDefaultConfig().useBatch; }\n if (serverUrl) {\n return { serverUrl: serverUrl, serverZone: undefined };\n }\n var _serverZone = ['US', 'EU'].includes(serverZone) ? serverZone : getDefaultConfig().serverZone;\n return {\n serverZone: _serverZone,\n serverUrl: getServerUrl(_serverZone, useBatch),\n };\n};\nvar RequestMetadata = /** @class */ (function () {\n function RequestMetadata() {\n this.sdk = {\n metrics: {\n histogram: {},\n },\n };\n }\n RequestMetadata.prototype.recordHistogram = function (key, value) {\n this.sdk.metrics.histogram[key] = value;\n };\n return RequestMetadata;\n}());\nexport { RequestMetadata };\nvar HistogramOptions = /** @class */ (function () {\n function HistogramOptions() {\n }\n return HistogramOptions;\n}());\n//# sourceMappingURL=config.js.map","var ApplicationContextProviderImpl = /** @class */ (function () {\n function ApplicationContextProviderImpl() {\n }\n ApplicationContextProviderImpl.prototype.getApplicationContext = function () {\n return {\n versionName: this.versionName,\n language: getLanguage(),\n platform: 'Web',\n os: undefined,\n deviceModel: undefined,\n };\n };\n return ApplicationContextProviderImpl;\n}());\nvar getLanguage = function () {\n return ((typeof navigator !== 'undefined' &&\n ((navigator.languages && navigator.languages[0]) ||\n navigator.language)) ||\n '');\n};\n\nvar EventBridgeImpl = /** @class */ (function () {\n function EventBridgeImpl() {\n this.queue = [];\n }\n EventBridgeImpl.prototype.logEvent = function (event) {\n if (!this.receiver) {\n if (this.queue.length < 512) {\n this.queue.push(event);\n }\n }\n else {\n this.receiver(event);\n }\n };\n EventBridgeImpl.prototype.setEventReceiver = function (receiver) {\n this.receiver = receiver;\n if (this.queue.length > 0) {\n this.queue.forEach(function (event) {\n receiver(event);\n });\n this.queue = [];\n }\n };\n return EventBridgeImpl;\n}());\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\nvar __assign = function () {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nfunction __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator,\n m = s && o[s],\n i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return {\n value: o && o[i++],\n done: !o\n };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\nfunction __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o),\n r,\n ar = [],\n e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n } catch (error) {\n e = {\n error: error\n };\n } finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n } finally {\n if (e) throw e.error;\n }\n }\n return ar;\n}\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nvar isEqual = function (obj1, obj2) {\n var e_1, _a;\n var primitive = ['string', 'number', 'boolean', 'undefined'];\n var typeA = typeof obj1;\n var typeB = typeof obj2;\n if (typeA !== typeB) {\n return false;\n }\n try {\n for (var primitive_1 = __values(primitive), primitive_1_1 = primitive_1.next(); !primitive_1_1.done; primitive_1_1 = primitive_1.next()) {\n var p = primitive_1_1.value;\n if (p === typeA) {\n return obj1 === obj2;\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (primitive_1_1 && !primitive_1_1.done && (_a = primitive_1.return)) _a.call(primitive_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n // check null\n if (obj1 == null && obj2 == null) {\n return true;\n }\n else if (obj1 == null || obj2 == null) {\n return false;\n }\n // if got here - objects\n if (obj1.length !== obj2.length) {\n return false;\n }\n //check if arrays\n var isArrayA = Array.isArray(obj1);\n var isArrayB = Array.isArray(obj2);\n if (isArrayA !== isArrayB) {\n return false;\n }\n if (isArrayA && isArrayB) {\n //arrays\n for (var i = 0; i < obj1.length; i++) {\n if (!isEqual(obj1[i], obj2[i])) {\n return false;\n }\n }\n }\n else {\n //objects\n var sorted1 = Object.keys(obj1).sort();\n var sorted2 = Object.keys(obj2).sort();\n if (!isEqual(sorted1, sorted2)) {\n return false;\n }\n //compare object values\n var result_1 = true;\n Object.keys(obj1).forEach(function (key) {\n if (!isEqual(obj1[key], obj2[key])) {\n result_1 = false;\n }\n });\n return result_1;\n }\n return true;\n};\n\nvar ID_OP_SET = '$set';\nvar ID_OP_UNSET = '$unset';\nvar ID_OP_CLEAR_ALL = '$clearAll';\n// Polyfill for Object.entries\nif (!Object.entries) {\n Object.entries = function (obj) {\n var ownProps = Object.keys(obj);\n var i = ownProps.length;\n var resArray = new Array(i);\n while (i--) {\n resArray[i] = [ownProps[i], obj[ownProps[i]]];\n }\n return resArray;\n };\n}\nvar IdentityStoreImpl = /** @class */ (function () {\n function IdentityStoreImpl() {\n this.identity = { userProperties: {} };\n this.listeners = new Set();\n }\n IdentityStoreImpl.prototype.editIdentity = function () {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n var self = this;\n var actingUserProperties = __assign({}, this.identity.userProperties);\n var actingIdentity = __assign(__assign({}, this.identity), { userProperties: actingUserProperties });\n return {\n setUserId: function (userId) {\n actingIdentity.userId = userId;\n return this;\n },\n setDeviceId: function (deviceId) {\n actingIdentity.deviceId = deviceId;\n return this;\n },\n setUserProperties: function (userProperties) {\n actingIdentity.userProperties = userProperties;\n return this;\n },\n setOptOut: function (optOut) {\n actingIdentity.optOut = optOut;\n return this;\n },\n updateUserProperties: function (actions) {\n var e_1, _a, e_2, _b, e_3, _c;\n var actingProperties = actingIdentity.userProperties || {};\n try {\n for (var _d = __values(Object.entries(actions)), _e = _d.next(); !_e.done; _e = _d.next()) {\n var _f = __read(_e.value, 2), action = _f[0], properties = _f[1];\n switch (action) {\n case ID_OP_SET:\n try {\n for (var _g = (e_2 = void 0, __values(Object.entries(properties))), _h = _g.next(); !_h.done; _h = _g.next()) {\n var _j = __read(_h.value, 2), key = _j[0], value = _j[1];\n actingProperties[key] = value;\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (_h && !_h.done && (_b = _g.return)) _b.call(_g);\n }\n finally { if (e_2) throw e_2.error; }\n }\n break;\n case ID_OP_UNSET:\n try {\n for (var _k = (e_3 = void 0, __values(Object.keys(properties))), _l = _k.next(); !_l.done; _l = _k.next()) {\n var key = _l.value;\n delete actingProperties[key];\n }\n }\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\n finally {\n try {\n if (_l && !_l.done && (_c = _k.return)) _c.call(_k);\n }\n finally { if (e_3) throw e_3.error; }\n }\n break;\n case ID_OP_CLEAR_ALL:\n actingProperties = {};\n break;\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_e && !_e.done && (_a = _d.return)) _a.call(_d);\n }\n finally { if (e_1) throw e_1.error; }\n }\n actingIdentity.userProperties = actingProperties;\n return this;\n },\n commit: function () {\n self.setIdentity(actingIdentity);\n return this;\n },\n };\n };\n IdentityStoreImpl.prototype.getIdentity = function () {\n return __assign({}, this.identity);\n };\n IdentityStoreImpl.prototype.setIdentity = function (identity) {\n var originalIdentity = __assign({}, this.identity);\n this.identity = __assign({}, identity);\n if (!isEqual(originalIdentity, this.identity)) {\n this.listeners.forEach(function (listener) {\n listener(identity);\n });\n }\n };\n IdentityStoreImpl.prototype.addIdentityListener = function (listener) {\n this.listeners.add(listener);\n };\n IdentityStoreImpl.prototype.removeIdentityListener = function (listener) {\n this.listeners.delete(listener);\n };\n return IdentityStoreImpl;\n}());\n\nvar safeGlobal = typeof globalThis !== 'undefined'\n ? globalThis\n : typeof global !== 'undefined'\n ? global\n : self;\n\nvar AnalyticsConnector = /** @class */ (function () {\n function AnalyticsConnector() {\n this.identityStore = new IdentityStoreImpl();\n this.eventBridge = new EventBridgeImpl();\n this.applicationContextProvider = new ApplicationContextProviderImpl();\n }\n AnalyticsConnector.getInstance = function (instanceName) {\n if (!safeGlobal['analyticsConnectorInstances']) {\n safeGlobal['analyticsConnectorInstances'] = {};\n }\n if (!safeGlobal['analyticsConnectorInstances'][instanceName]) {\n safeGlobal['analyticsConnectorInstances'][instanceName] =\n new AnalyticsConnector();\n }\n return safeGlobal['analyticsConnectorInstances'][instanceName];\n };\n return AnalyticsConnector;\n}());\n\nexport { AnalyticsConnector };\n","/**\n * @deprecated use ServerZoneType instead\n */\nexport var ServerZone;\n(function (ServerZone) {\n ServerZone[\"US\"] = \"US\";\n ServerZone[\"EU\"] = \"EU\";\n /**\n * Add for session-replay-browser migration from analytics-type v1.x.\n */\n ServerZone[\"STAGING\"] = \"STAGING\";\n})(ServerZone || (ServerZone = {}));\n//# sourceMappingURL=server-zone.js.map","import { __assign, __values } from \"tslib\";\nimport { LogLevel } from '../types/loglevel';\nexport var getStacktrace = function (ignoreDepth) {\n if (ignoreDepth === void 0) { ignoreDepth = 0; }\n var trace = new Error().stack || '';\n return trace\n .split('\\n')\n .slice(2 + ignoreDepth)\n .map(function (text) { return text.trim(); });\n};\n// This hook makes sure we always get the latest logger and logLevel.\nexport var getClientLogConfig = function (client) { return function () {\n var _a = __assign({}, client.config), logger = _a.loggerProvider, logLevel = _a.logLevel;\n return {\n logger: logger,\n logLevel: logLevel,\n };\n}; };\n// This is a convenient function to get the attribute from object with string path, similar to lodash '#get'.\nexport var getValueByStringPath = function (obj, path) {\n var e_1, _a;\n path = path.replace(/\\[(\\w+)\\]/g, '.$1'); // convert indexes to properties\n path = path.replace(/^\\./, ''); // strip a leading dot\n try {\n for (var _b = __values(path.split('.')), _c = _b.next(); !_c.done; _c = _b.next()) {\n var attr = _c.value;\n if (attr in obj) {\n obj = obj[attr];\n }\n else {\n return;\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return obj;\n};\nexport var getClientStates = function (client, paths) { return function () {\n var e_2, _a;\n var res = {};\n try {\n for (var paths_1 = __values(paths), paths_1_1 = paths_1.next(); !paths_1_1.done; paths_1_1 = paths_1.next()) {\n var path = paths_1_1.value;\n res[path] = getValueByStringPath(client, path);\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (paths_1_1 && !paths_1_1.done && (_a = paths_1.return)) _a.call(paths_1);\n }\n finally { if (e_2) throw e_2.error; }\n }\n return res;\n}; };\nexport var debugWrapper = function (fn, fnName, getLogConfig, getStates, fnContext) {\n if (fnContext === void 0) { fnContext = null; }\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var _a = getLogConfig(), logger = _a.logger, logLevel = _a.logLevel;\n // return early if possible to reduce overhead\n if ((logLevel && logLevel < LogLevel.Debug) || !logLevel || !logger) {\n return fn.apply(fnContext, args);\n }\n var debugContext = {\n type: 'invoke public method',\n name: fnName,\n args: args,\n stacktrace: getStacktrace(1),\n time: {\n start: new Date().toISOString(),\n },\n states: {},\n };\n if (getStates && debugContext.states) {\n debugContext.states.before = getStates();\n }\n var result = fn.apply(fnContext, args);\n if (result && result.promise) {\n // if result is a promise, add the callback\n result.promise.then(function () {\n if (getStates && debugContext.states) {\n debugContext.states.after = getStates();\n }\n if (debugContext.time) {\n debugContext.time.end = new Date().toISOString();\n }\n logger.debug(JSON.stringify(debugContext, null, 2));\n });\n }\n else {\n if (getStates && debugContext.states) {\n debugContext.states.after = getStates();\n }\n if (debugContext.time) {\n debugContext.time.end = new Date().toISOString();\n }\n logger.debug(JSON.stringify(debugContext, null, 2));\n }\n return result;\n };\n};\n//# sourceMappingURL=debug.js.map","import { Status } from '../types/status';\nvar BaseTransport = /** @class */ (function () {\n function BaseTransport() {\n }\n BaseTransport.prototype.send = function (_serverUrl, _payload) {\n return Promise.resolve(null);\n };\n BaseTransport.prototype.buildResponse = function (responseJSON) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x;\n if (typeof responseJSON !== 'object') {\n return null;\n }\n var statusCode = responseJSON.code || 0;\n var status = this.buildStatus(statusCode);\n switch (status) {\n case Status.Success:\n return {\n status: status,\n statusCode: statusCode,\n body: {\n eventsIngested: (_a = responseJSON.events_ingested) !== null && _a !== void 0 ? _a : 0,\n payloadSizeBytes: (_b = responseJSON.payload_size_bytes) !== null && _b !== void 0 ? _b : 0,\n serverUploadTime: (_c = responseJSON.server_upload_time) !== null && _c !== void 0 ? _c : 0,\n },\n };\n case Status.Invalid:\n return {\n status: status,\n statusCode: statusCode,\n body: {\n error: (_d = responseJSON.error) !== null && _d !== void 0 ? _d : '',\n missingField: (_e = responseJSON.missing_field) !== null && _e !== void 0 ? _e : '',\n eventsWithInvalidFields: (_f = responseJSON.events_with_invalid_fields) !== null && _f !== void 0 ? _f : {},\n eventsWithMissingFields: (_g = responseJSON.events_with_missing_fields) !== null && _g !== void 0 ? _g : {},\n eventsWithInvalidIdLengths: (_h = responseJSON.events_with_invalid_id_lengths) !== null && _h !== void 0 ? _h : {},\n epsThreshold: (_j = responseJSON.eps_threshold) !== null && _j !== void 0 ? _j : 0,\n exceededDailyQuotaDevices: (_k = responseJSON.exceeded_daily_quota_devices) !== null && _k !== void 0 ? _k : {},\n silencedDevices: (_l = responseJSON.silenced_devices) !== null && _l !== void 0 ? _l : [],\n silencedEvents: (_m = responseJSON.silenced_events) !== null && _m !== void 0 ? _m : [],\n throttledDevices: (_o = responseJSON.throttled_devices) !== null && _o !== void 0 ? _o : {},\n throttledEvents: (_p = responseJSON.throttled_events) !== null && _p !== void 0 ? _p : [],\n },\n };\n case Status.PayloadTooLarge:\n return {\n status: status,\n statusCode: statusCode,\n body: {\n error: (_q = responseJSON.error) !== null && _q !== void 0 ? _q : '',\n },\n };\n case Status.RateLimit:\n return {\n status: status,\n statusCode: statusCode,\n body: {\n error: (_r = responseJSON.error) !== null && _r !== void 0 ? _r : '',\n epsThreshold: (_s = responseJSON.eps_threshold) !== null && _s !== void 0 ? _s : 0,\n throttledDevices: (_t = responseJSON.throttled_devices) !== null && _t !== void 0 ? _t : {},\n throttledUsers: (_u = responseJSON.throttled_users) !== null && _u !== void 0 ? _u : {},\n exceededDailyQuotaDevices: (_v = responseJSON.exceeded_daily_quota_devices) !== null && _v !== void 0 ? _v : {},\n exceededDailyQuotaUsers: (_w = responseJSON.exceeded_daily_quota_users) !== null && _w !== void 0 ? _w : {},\n throttledEvents: (_x = responseJSON.throttled_events) !== null && _x !== void 0 ? _x : [],\n },\n };\n case Status.Timeout:\n default:\n return {\n status: status,\n statusCode: statusCode,\n };\n }\n };\n BaseTransport.prototype.buildStatus = function (code) {\n if (code >= 200 && code < 300) {\n return Status.Success;\n }\n if (code === 429) {\n return Status.RateLimit;\n }\n if (code === 413) {\n return Status.PayloadTooLarge;\n }\n if (code === 408) {\n return Status.Timeout;\n }\n if (code >= 400 && code < 500) {\n return Status.Invalid;\n }\n if (code >= 500) {\n return Status.Failed;\n }\n return Status.Unknown;\n };\n return BaseTransport;\n}());\nexport { BaseTransport };\n//# sourceMappingURL=base.js.map","import { __awaiter, __extends, __generator } from \"tslib\";\nimport { BaseTransport } from './base';\nvar FetchTransport = /** @class */ (function (_super) {\n __extends(FetchTransport, _super);\n function FetchTransport() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n FetchTransport.prototype.send = function (serverUrl, payload) {\n return __awaiter(this, void 0, void 0, function () {\n var options, response, responseText;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n /* istanbul ignore if */\n if (typeof fetch === 'undefined') {\n throw new Error('FetchTransport is not supported');\n }\n options = {\n headers: {\n 'Content-Type': 'application/json',\n Accept: '*/*',\n },\n body: JSON.stringify(payload),\n method: 'POST',\n };\n return [4 /*yield*/, fetch(serverUrl, options)];\n case 1:\n response = _a.sent();\n return [4 /*yield*/, response.text()];\n case 2:\n responseText = _a.sent();\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n return [2 /*return*/, this.buildResponse(JSON.parse(responseText))];\n }\n catch (_b) {\n return [2 /*return*/, this.buildResponse({ code: response.status })];\n }\n return [2 /*return*/];\n }\n });\n });\n };\n return FetchTransport;\n}(BaseTransport));\nexport { FetchTransport };\n//# sourceMappingURL=fetch.js.map","import { AMPLITUDE_PREFIX, ServerZone } from '@amplitude/analytics-core';\n\nexport const DEFAULT_EVENT_PROPERTY_PREFIX = '[Amplitude]';\n\nexport const DEFAULT_SESSION_REPLAY_PROPERTY = `${DEFAULT_EVENT_PROPERTY_PREFIX} Session Replay ID`;\nexport const DEFAULT_SESSION_START_EVENT = 'session_start';\nexport const DEFAULT_SESSION_END_EVENT = 'session_end';\nexport const DEFAULT_SAMPLE_RATE = 0;\nexport const DEFAULT_SERVER_ZONE = ServerZone.US;\nexport const DEFAULT_PERFORMANCE_CONFIG = { enabled: true };\nexport const DEFAULT_URL_CHANGE_POLLING_INTERVAL = 1000;\n\nexport const SESSION_REPLAY_DEBUG_PROPERTY = `${DEFAULT_EVENT_PROPERTY_PREFIX} Session Replay Debug`;\n\nexport const BLOCK_CLASS = 'amp-block';\nexport const MASK_TEXT_CLASS = 'amp-mask';\nexport const UNMASK_TEXT_CLASS = 'amp-unmask';\nexport const SESSION_REPLAY_SERVER_URL = 'https://api-sr.amplitude.com/sessions/v2/track';\nexport const SESSION_REPLAY_EU_URL = 'https://api-sr.eu.amplitude.com/sessions/v2/track';\nexport const SESSION_REPLAY_STAGING_URL = 'https://api-sr.stag2.amplitude.com/sessions/v2/track';\nexport const STORAGE_PREFIX = `${AMPLITUDE_PREFIX}_replay_unsent`;\nexport const MAX_EVENT_LIST_SIZE = 1 * 1000000; // ~1 MB limit for JSON serialized events payload\nexport const INTERACTION_MIN_INTERVAL = 30_000; // 30 seconds\nexport const INTERACTION_MAX_INTERVAL = 60_000; // 1 minute\nexport const MIN_INTERVAL = 500; // 500 ms\nexport const MAX_INTERVAL = 10 * 1000; // 10 seconds\nexport const MAX_IDB_STORAGE_LENGTH = 1000 * 60 * 60 * 24 * 3; // 3 days\nexport const KB_SIZE = 1024;\nexport const MAX_URL_LENGTH = 1000;\n\nexport enum CustomRRwebEvent {\n GET_SR_PROPS = 'get-sr-props',\n DEBUG_INFO = 'debug-info',\n FETCH_REQUEST = 'fetch-request',\n METADATA = 'metadata',\n TARGETING_DECISION = 'targeting-decision',\n}\n","import { ILogger, LogLevel } from '@amplitude/analytics-core';\n\nexport class SafeLoggerProvider implements ILogger {\n private logger: ILogger;\n\n log: typeof console.log;\n warn: typeof console.warn;\n error: typeof console.error;\n debug: typeof console.debug;\n\n constructor(loggerProvider: ILogger) {\n this.logger = loggerProvider;\n this.log = this.getSafeMethod('log');\n this.warn = this.getSafeMethod('warn');\n this.error = this.getSafeMethod('error');\n this.debug = this.getSafeMethod('debug');\n }\n\n private getSafeMethod<K extends keyof ILogger>(method: K): ILogger[K] {\n if (!this.logger) {\n return (() => {\n // No-op function fallback\n }) as ILogger[K];\n }\n\n const fn = this.logger[method];\n if (typeof fn === 'function') {\n const originalFn = (fn as { __rrweb_original__?: ILogger[K] }).__rrweb_original__ ?? fn;\n return originalFn.bind(this.logger) as ILogger[K];\n }\n\n return (() => {\n // No-op function fallback\n }) as ILogger[K];\n }\n\n enable(logLevel: LogLevel) {\n this.logger.enable(logLevel);\n }\n\n disable() {\n this.logger.disable();\n }\n}\n","import { IConfig, LogLevel, ILogger } from '@amplitude/analytics-core';\nimport { StoreType, ConsoleLogLevel } from '../typings/session-replay';\nimport { TargetingFlag } from '@amplitude/targeting';\n\nexport interface SamplingConfig {\n sample_rate: number;\n capture_enabled: boolean;\n}\n\nexport interface InteractionConfig {\n trackEveryNms?: number;\n enabled: boolean; // defaults to false\n batch: boolean; // defaults to false\n /**\n * UGC filter rules.\n */\n ugcFilterRules?: UGCFilterRule[];\n}\n\nexport interface LoggingConfig {\n console: {\n enabled: boolean;\n levels: ConsoleLogLevel[];\n };\n network?: {\n enabled: boolean;\n };\n}\n\nexport type TargetingConfig = TargetingFlag;\n\nexport type SessionReplayRemoteConfig = {\n sr_sampling_config?: SamplingConfig;\n sr_privacy_config?: PrivacyConfig;\n sr_interaction_config?: InteractionConfig;\n sr_logging_config?: LoggingConfig;\n sr_targeting_config?: TargetingConfig;\n};\n\nexport interface SessionReplayRemoteConfigAPIResponse {\n configs: {\n sessionReplay: SessionReplayRemoteConfig;\n };\n}\n\nexport type MaskLevel =\n | 'light' // only mask a subset of inputs that's deemed sensitive - password, credit card, telephone #, email. These are information we never want to capture.\n | 'medium' // mask all inputs\n | 'conservative'; // mask all inputs and all texts\n\nexport const DEFAULT_MASK_LEVEL = 'medium';\n\n// err on the side of excluding more\nexport type PrivacyConfig = {\n blockSelector?: string | string[]; // exclude in the UI\n defaultMaskLevel?: MaskLevel;\n maskSelector?: string[];\n unmaskSelector?: string[];\n};\n\n/**\n * UGC filter rule.\n */\nexport type UGCFilterRule = {\n /**\n * The selector of the UGC element.\n */\n selector: string;\n /**\n * The replacement text for the UGC element.\n */\n replacement: string;\n};\n\nexport interface SessionReplayLocalConfig extends IConfig {\n apiKey: string;\n loggerProvider: ILogger;\n /**\n * LogLevel.None or LogLevel.Error or LogLevel.Warn or LogLevel.Verbose or LogLevel.Debug.\n * Sets the log level.\n *\n * @defaultValue LogLevel.Warn\n */\n logLevel: LogLevel;\n /**\n * The maximum number of retries allowed for sending replay events.\n * Once this limit is reached, failed events will no longer be sent.\n *\n * @defaultValue 2\n */\n flushMaxRetries: number;\n /**\n * Use this option to control how many sessions to select for replay collection.\n * The number should be a decimal between 0 and 1, for example 0.4, representing\n * the fraction of sessions to have randomly selected for replay collection.\n * Over a large number of sessions, 0.4 would select 40% of those sessions.\n * Sample rates as small as six decimal places (0.000001) are supported.\n *\n * @defaultValue 0\n */\n sampleRate: number;\n privacyConfig?: PrivacyConfig;\n /**\n * Adds additional debug event property to help debug instrumentation issues\n * (such as mismatching apps). Only recommended for debugging initial setup,\n * and not recommended for production.\n */\n debugMode?: boolean;\n /**\n * Specifies the endpoint URL to fetch remote configuration.\n * If provided, it overrides the default server zone configuration.\n */\n configServerUrl?: string;\n /**\n * Specifies the endpoint URL for sending session replay data.\n * If provided, it overrides the default server zone configuration.\n */\n trackServerUrl?: string;\n /**\n * If stylesheets are inlined, the contents of the stylesheet will be stored.\n * During replay, the stored stylesheet will be used instead of attempting to fetch it remotely.\n * This prevents replays from appearing broken due to missing stylesheets.\n * Note: Inlining stylesheets may not work in all cases.\n */\n shouldInlineStylesheet?: boolean;\n version?: SessionReplayVersion;\n /**\n * Performance configuration config. If enabled, we will defer compression\n * to be done during the browser's idle periods.\n */\n performanceConfig?: SessionReplayPerformanceConfig;\n /**\n * Specifies how replay events should be stored. `idb` uses IndexedDB to persist replay events\n * when all events cannot be sent during capture. `memory` stores replay events only in memory,\n * meaning events are lost when the page is closed. If IndexedDB is unavailable, the system falls back to `memory`.\n */\n storeType: StoreType;\n\n /**\n * Experimental features.\n */\n experimental?: {\n /**\n * If the SDK should compress the replay events using a webworker.\n */\n useWebWorker: boolean;\n };\n userProperties?: { [key: string]: any };\n\n /**\n * Remove certain parts of the DOM from being captured. These are typically ignored when blocking by selectors.\n */\n omitElementTags?: {\n /**\n * If true, removes script tags from the DOM, but not noscript tags.\n */\n script?: boolean;\n /**\n * If true, removes comment tags from the DOM.\n */\n comment?: boolean;\n };\n\n /**\n * If true, applies a background color to blocked elements in the replay.\n * This helps visualize which elements are blocked from being captured.\n */\n applyBackgroundColorToBlockedElements?: boolean;\n /**\n * Enables URL change polling as a fallback for SPA route tracking.\n * When enabled, the SDK will periodically check for URL changes every second\n * in addition to patching the History API. This is useful for edge cases where\n * route changes might bypass the standard History API methods.\n *\n * @defaultValue false\n */\n enableUrlChangePolling?: boolean;\n /**\n * Specifies the interval in milliseconds for URL change polling when enableUrlChangePolling is true.\n * The SDK will check for URL changes at this interval as a fallback for SPA route tracking.\n *\n * @defaultValue 1000\n */\n urlChangePollingInterval?: number;\n /**\n * Whether to capture document title in URL change events.\n * When disabled, the title field will be empty in URL change events.\n *\n * @defaultValue false\n */\n captureDocumentTitle?: boolean;\n interactionConfig?: InteractionConfig;\n}\n\nexport interface SessionReplayJoinedConfig extends SessionReplayLocalConfig {\n captureEnabled?: boolean;\n interactionConfig?: InteractionConfig;\n loggingConfig?: LoggingConfig;\n targetingConfig?: TargetingConfig;\n}\n\nexport interface SessionReplayRemoteConfigFetch {\n getServerUrl: () => void;\n getSamplingConfig: (sessionId?: number) => Promise<SessionReplayRemoteConfig['sr_sampling_config'] | void>;\n fetchRemoteConfig: (sessionId?: number) => Promise<SessionReplayRemoteConfig | void>;\n getRemoteConfig: (sessionId?: number) => Promise<SessionReplayRemoteConfig | void>;\n}\n\nexport interface SessionReplayConfigs {\n localConfig: SessionReplayLocalConfig;\n joinedConfig: SessionReplayJoinedConfig;\n remoteConfig: SessionReplayRemoteConfig | undefined;\n}\nexport interface SessionReplayJoinedConfigGenerator {\n generateJoinedConfig: (sessionId?: string | number) => Promise<SessionReplayConfigs>;\n}\n\nexport interface SessionReplayMetadata {\n remoteConfig: SessionReplayRemoteConfig | undefined;\n localConfig: SessionReplayLocalConfig;\n joinedConfig: SessionReplayJoinedConfig;\n framework?: {\n name: string;\n version: string;\n };\n sessionId: string | number | undefined;\n hashValue?: number;\n sampleRate: number;\n replaySDKType: string | null;\n replaySDKVersion: string | undefined;\n standaloneSDKType: string;\n standaloneSDKVersion: string | undefined;\n}\n\nexport interface SessionReplayVersion {\n version: string;\n type: SessionReplayType;\n}\n\n/**\n * Configuration options for session replay performance.\n */\nexport interface SessionReplayPerformanceConfig {\n /**\n * If enabled, event compression will be deferred to occur during the browser's idle periods.\n */\n enabled: boolean;\n /**\n * Optional timeout in milliseconds for the `requestIdleCallback` API.\n * If specified, this value will be used to set a maximum time for the browser to wait\n * before executing the deferred compression task, even if the browser is not idle.\n */\n timeout?: number;\n}\n\nexport type SessionReplayType = 'standalone' | 'plugin' | 'segment';\n","import { getGlobalScope, ServerZone } from '@amplitude/analytics-core';\nimport { DEFAULT_MASK_LEVEL, MaskLevel, PrivacyConfig, SessionReplayJoinedConfig, UGCFilterRule } from './config/types';\nimport {\n KB_SIZE,\n MASK_TEXT_CLASS,\n SESSION_REPLAY_EU_URL,\n SESSION_REPLAY_SERVER_URL,\n SESSION_REPLAY_STAGING_URL,\n UNMASK_TEXT_CLASS,\n} from './constants';\nimport { StorageData } from './typings/session-replay';\nimport { getInputType } from './utils/get-input-type';\n\ntype ChromeStorageEstimate = {\n quota?: number;\n usage?: number;\n usageDetails?: { [key: string]: number };\n};\n\n/**\n * Light: Subset of inputs\n * Medium: All inputs\n * Conservative: All inputs and all texts\n */\nconst isMaskedForLevel = (elementType: 'input' | 'text', level: MaskLevel, element: HTMLElement | null): boolean => {\n switch (level) {\n case 'light': {\n if (elementType !== 'input') {\n return true;\n }\n\n const inputType = element ? getInputType(element) : '';\n /* istanbul ignore if */ // TODO(lew): For some reason it's impossible to test this.\n if (!inputType) {\n return false;\n }\n\n if (['password', 'hidden', 'email', 'tel'].includes(inputType)) {\n return true;\n }\n\n if ((element as HTMLInputElement).autocomplete.startsWith('cc-')) {\n return true;\n }\n\n return false;\n }\n case 'medium':\n case 'conservative':\n return true;\n default:\n return isMaskedForLevel(elementType, DEFAULT_MASK_LEVEL, element);\n }\n};\n\n/**\n * Checks if the given element set to be masked by rrweb\n *\n * Priority is:\n * 1. [In code] Element/class based masking/unmasking <> [Config based] Selector based masking/unmasking\n * 2. Use app defaults\n */\nconst isMasked = (\n elementType: 'input' | 'text',\n config: PrivacyConfig = { defaultMaskLevel: DEFAULT_MASK_LEVEL },\n element: HTMLElement | null,\n): boolean => {\n if (element) {\n // Element or parent is explicitly instrumented in code to mask\n if (element.closest('.' + MASK_TEXT_CLASS)) {\n return true;\n }\n\n // Config has override for mask\n const shouldMask = (config.maskSelector ?? []).some((selector) => element.closest(selector));\n if (shouldMask) {\n return true;\n }\n\n // Code or config has override to unmask\n if (element.closest('.' + UNMASK_TEXT_CLASS)) {\n return false;\n }\n\n // Here we are probably sent an element, but we want to match if they have a\n // parent with an unmask selector.\n const shouldUnmask = (config.unmaskSelector ?? []).some((selector) => element.closest(selector));\n if (shouldUnmask) {\n return false;\n }\n }\n\n return isMaskedForLevel(elementType, config.defaultMaskLevel ?? DEFAULT_MASK_LEVEL, element);\n};\n\nexport const maskFn =\n (elementType: 'text' | 'input', config?: PrivacyConfig) =>\n (text: string, element: HTMLElement | null): string => {\n return isMasked(elementType, config, element) ? text.replace(/[^\\s]/g, '*') : text;\n };\n\nexport const generateHashCode = function (str: string) {\n let hash = 0;\n if (str.length === 0) return hash;\n for (let i = 0; i < str.length; i++) {\n const chr = str.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n hash |= 0;\n }\n return hash;\n};\n\nexport const isSessionInSample = function (sessionId: string | number, sampleRate: number) {\n const hashNumber = generateHashCode(sessionId.toString());\n const absHash = Math.abs(hashNumber);\n const absHashMultiply = absHash * 31;\n const mod = absHashMultiply % 1000000;\n return mod / 1000000 < sampleRate;\n};\n\nexport const getCurrentUrl = () => {\n const globalScope = getGlobalScope();\n return globalScope?.location ? globalScope.location.href : '';\n};\n\nexport const generateSessionReplayId = (sessionId: string | number, deviceId: string): string => {\n return `${deviceId}/${sessionId}`;\n};\n\nexport const getServerUrl = (serverZone?: keyof typeof ServerZone, trackServerUrl?: string): string => {\n if (trackServerUrl) {\n return trackServerUrl;\n }\n\n if (serverZone === ServerZone.STAGING) {\n return SESSION_REPLAY_STAGING_URL;\n }\n\n if (serverZone === ServerZone.EU) {\n return SESSION_REPLAY_EU_URL;\n }\n\n return SESSION_REPLAY_SERVER_URL;\n};\n\nconst isValidGlobUrl = (globUrl: string): boolean => {\n if (typeof globUrl !== 'string' || globUrl.trim() === '') return false;\n const urlPattern = /^\\/|^https?:\\/\\/[^\\s]+$/;\n if (!urlPattern.test(globUrl)) return false;\n return true;\n};\n\nconst globToRegex = (glob: string): RegExp => {\n // Escape special regex characters, then convert globs\n const escaped = glob\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // Escape regex specials\n .replace(/\\*/g, '.*') // Convert * to .*\n .replace(/\\?/g, '.'); // Convert ? to .\n\n return new RegExp(`^${escaped}$`);\n};\n\nexport const validateUGCFilterRules = (ugcFilterRules: UGCFilterRule[]) => {\n // validate ugcFilterRules\n if (!ugcFilterRules.every((rule) => typeof rule.selector === 'string' && typeof rule.replacement === 'string')) {\n throw new Error('ugcFilterRules must be an array of objects with selector and replacement properties');\n }\n\n // validate ugcFilterRules are valid globs\n if (!ugcFilterRules.every((rule) => isValidGlobUrl(rule.selector))) {\n throw new Error('ugcFilterRules must be an array of objects with valid globs');\n }\n};\n\nexport const getPageUrl = (pageUrl: string, ugcFilterRules: UGCFilterRule[]) => {\n // apply ugcFilterRules, order is important, first rule wins\n for (const rule of ugcFilterRules) {\n const regex = globToRegex(rule.selector);\n\n if (regex.test(pageUrl)) {\n return pageUrl.replace(regex, rule.replacement);\n }\n }\n\n return pageUrl;\n};\n\nexport const getStorageSize = async (): Promise<StorageData> => {\n try {\n const globalScope = getGlobalScope();\n if (globalScope) {\n const { usage, quota, usageDetails }: ChromeStorageEstimate = await globalScope.navigator.storage.estimate();\n const totalStorageSize = usage ? Math.round(usage / KB_SIZE) : 0;\n const percentOfQuota = usage && quota ? Math.round((usage / quota + Number.EPSILON) * 1000) / 1000 : 0;\n return { totalStorageSize, percentOfQuota, usageDetails: JSON.stringify(usageDetails) };\n }\n } catch (e) {\n // swallow\n }\n return { totalStorageSize: 0, percentOfQuota: 0, usageDetails: '' };\n};\n\nexport const getDebugConfig = (config: SessionReplayJoinedConfig) => {\n const debugConfig = {\n ...config,\n };\n const { apiKey } = debugConfig;\n debugConfig.apiKey = `****${apiKey.substring(apiKey.length - 4)}`;\n return debugConfig;\n};\n","export function toLowerCase<T extends string>(str: T): Lowercase<T> {\n return str.toLowerCase() as unknown as Lowercase<T>;\n}\n\n/**\n * Get the type of an input element.\n * This takes care of the case where a password input is changed to a text input.\n * In this case, we continue to consider this of type password, in order to avoid leaking sensitive data\n * where passwords should be masked.\n */\nexport function getInputType(element: HTMLElement): Lowercase<string> | null {\n // when omitting the type of input element(e.g. <input />), the type is treated as text\n const type = (element as HTMLInputElement).type;\n\n return element.hasAttribute('data-rr-is-password')\n ? 'password'\n : type\n ? // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n toLowerCase(type)\n : null;\n}\n","import { Config, Logger, FetchTransport, LogLevel } from '@amplitude/analytics-core';\nimport {\n DEFAULT_PERFORMANCE_CONFIG,\n DEFAULT_SAMPLE_RATE,\n DEFAULT_SERVER_ZONE,\n DEFAULT_URL_CHANGE_POLLING_INTERVAL,\n} from '../constants';\nimport { SessionReplayOptions, StoreType } from '../typings/session-replay';\nimport {\n SessionReplayLocalConfig as ISessionReplayLocalConfig,\n InteractionConfig,\n PrivacyConfig,\n SessionReplayPerformanceConfig,\n SessionReplayVersion,\n} from './types';\nimport { SafeLoggerProvider } from '../logger';\nimport { validateUGCFilterRules } from '../helpers';\n\nexport const getDefaultConfig = () => ({\n flushMaxRetries: 2,\n logLevel: LogLevel.Warn,\n loggerProvider: new Logger(),\n transportProvider: new FetchTransport(),\n});\n\nexport class SessionReplayLocalConfig extends Config implements ISessionReplayLocalConfig {\n apiKey: string;\n sampleRate: number;\n privacyConfig?: PrivacyConfig;\n interactionConfig?: InteractionConfig;\n debugMode?: boolean;\n configServerUrl?: string;\n trackServerUrl?: string;\n shouldInlineStylesheet?: boolean;\n version?: SessionReplayVersion;\n storeType: StoreType;\n performanceConfig?: SessionReplayPerformanceConfig;\n experimental?: { useWebWorker: boolean };\n applyBackgroundColorToBlockedElements?: boolean;\n omitElementTags?: {\n script?: boolean;\n comment?: boolean;\n };\n enableUrlChangePolling?: boolean;\n urlChangePollingInterval?: number;\n captureDocumentTitle?: boolean;\n\n constructor(apiKey: string, options: SessionReplayOptions) {\n const defaultConfig = getDefaultConfig();\n super({\n transportProvider: defaultConfig.transportProvider,\n loggerProvider: new SafeLoggerProvider(options.loggerProvider || defaultConfig.loggerProvider),\n ...options,\n apiKey,\n });\n this.flushMaxRetries =\n options.flushMaxRetries !== undefined && options.flushMaxRetries <= defaultConfig.flushMaxRetries\n ? options.flushMaxRetries\n : defaultConfig.flushMaxRetries;\n\n this.apiKey = apiKey;\n this.sampleRate = options.sampleRate || DEFAULT_SAMPLE_RATE;\n this.serverZone = options.serverZone || DEFAULT_SERVER_ZONE;\n this.configServerUrl = options.configServerUrl;\n this.trackServerUrl = options.trackServerUrl;\n this.shouldInlineStylesheet = options.shouldInlineStylesheet;\n this.version = options.version;\n this.performanceConfig = options.performanceConfig || DEFAULT_PERFORMANCE_CONFIG;\n this.storeType = options.storeType ?? 'idb';\n this.applyBackgroundColorToBlockedElements = options.applyBackgroundColorToBlockedElements ?? false;\n this.enableUrlChangePolling = options.enableUrlChangePolling ?? false;\n this.urlChangePollingInterval = options.urlChangePollingInterval ?? DEFAULT_URL_CHANGE_POLLING_INTERVAL;\n this.captureDocumentTitle = options.captureDocumentTitle ?? false;\n\n if (options.privacyConfig) {\n this.privacyConfig = options.privacyConfig;\n }\n if (options.interactionConfig) {\n this.interactionConfig = options.interactionConfig;\n\n // validate ugcFilterRules, throw error if invalid - throw error at the beginning of the config\n if (this.interactionConfig.ugcFilterRules) {\n validateUGCFilterRules(this.interactionConfig.ugcFilterRules);\n }\n }\n if (options.debugMode) {\n this.debugMode = options.debugMode;\n }\n if (options.experimental) {\n this.experimental = options.experimental;\n }\n if (options.omitElementTags) {\n this.omitElementTags = options.omitElementTags;\n }\n }\n}\n","var EventType = /* @__PURE__ */ ((EventType2) => {\n EventType2[EventType2[\"DomContentLoaded\"] = 0] = \"DomContentLoaded\";\n EventType2[EventType2[\"Load\"] = 1] = \"Load\";\n EventType2[EventType2[\"FullSnapshot\"] = 2] = \"FullSnapshot\";\n EventType2[EventType2[\"IncrementalSnapshot\"] = 3] = \"IncrementalSnapshot\";\n EventType2[EventType2[\"Meta\"] = 4] = \"Meta\";\n EventType2[EventType2[\"Custom\"] = 5] = \"Custom\";\n EventType2[EventType2[\"Plugin\"] = 6] = \"Plugin\";\n return EventType2;\n})(EventType || {});\nvar IncrementalSource = /* @__PURE__ */ ((IncrementalSource2) => {\n IncrementalSource2[IncrementalSource2[\"Mutation\"] = 0] = \"Mutation\";\n IncrementalSource2[IncrementalSource2[\"MouseMove\"] = 1] = \"MouseMove\";\n IncrementalSource2[IncrementalSource2[\"MouseInteraction\"] = 2] = \"MouseInteraction\";\n IncrementalSource2[IncrementalSource2[\"Scroll\"] = 3] = \"Scroll\";\n IncrementalSource2[IncrementalSource2[\"ViewportResize\"] = 4] = \"ViewportResize\";\n IncrementalSource2[IncrementalSource2[\"Input\"] = 5] = \"Input\";\n IncrementalSource2[IncrementalSource2[\"TouchMove\"] = 6] = \"TouchMove\";\n IncrementalSource2[IncrementalSource2[\"MediaInteraction\"] = 7] = \"MediaInteraction\";\n IncrementalSource2[IncrementalSource2[\"StyleSheetRule\"] = 8] = \"StyleSheetRule\";\n IncrementalSource2[IncrementalSource2[\"CanvasMutation\"] = 9] = \"CanvasMutation\";\n IncrementalSource2[IncrementalSource2[\"Font\"] = 10] = \"Font\";\n IncrementalSource2[IncrementalSource2[\"Log\"] = 11] = \"Log\";\n IncrementalSource2[IncrementalSource2[\"Drag\"] = 12] = \"Drag\";\n IncrementalSource2[IncrementalSource2[\"StyleDeclaration\"] = 13] = \"StyleDeclaration\";\n IncrementalSource2[IncrementalSource2[\"Selection\"] = 14] = \"Selection\";\n IncrementalSource2[IncrementalSource2[\"AdoptedStyleSheet\"] = 15] = \"AdoptedStyleSheet\";\n IncrementalSource2[IncrementalSource2[\"CustomElement\"] = 16] = \"CustomElement\";\n return IncrementalSource2;\n})(IncrementalSource || {});\nvar MouseInteractions = /* @__PURE__ */ ((MouseInteractions2) => {\n MouseInteractions2[MouseInteractions2[\"MouseUp\"] = 0] = \"MouseUp\";\n MouseInteractions2[MouseInteractions2[\"MouseDown\"] = 1] = \"MouseDown\";\n MouseInteractions2[MouseInteractions2[\"Click\"] = 2] = \"Click\";\n MouseInteractions2[MouseInteractions2[\"ContextMenu\"] = 3] = \"ContextMenu\";\n MouseInteractions2[MouseInteractions2[\"DblClick\"] = 4] = \"DblClick\";\n MouseInteractions2[MouseInteractions2[\"Focus\"] = 5] = \"Focus\";\n MouseInteractions2[MouseInteractions2[\"Blur\"] = 6] = \"Blur\";\n MouseInteractions2[MouseInteractions2[\"TouchStart\"] = 7] = \"TouchStart\";\n MouseInteractions2[MouseInteractions2[\"TouchMove_Departed\"] = 8] = \"TouchMove_Departed\";\n MouseInteractions2[MouseInteractions2[\"TouchEnd\"] = 9] = \"TouchEnd\";\n MouseInteractions2[MouseInteractions2[\"TouchCancel\"] = 10] = \"TouchCancel\";\n return MouseInteractions2;\n})(MouseInteractions || {});\nvar PointerTypes = /* @__PURE__ */ ((PointerTypes2) => {\n PointerTypes2[PointerTypes2[\"Mouse\"] = 0] = \"Mouse\";\n PointerTypes2[PointerTypes2[\"Pen\"] = 1] = \"Pen\";\n PointerTypes2[PointerTypes2[\"Touch\"] = 2] = \"Touch\";\n return PointerTypes2;\n})(PointerTypes || {});\nvar CanvasContext = /* @__PURE__ */ ((CanvasContext2) => {\n CanvasContext2[CanvasContext2[\"2D\"] = 0] = \"2D\";\n CanvasContext2[CanvasContext2[\"WebGL\"] = 1] = \"WebGL\";\n CanvasContext2[CanvasContext2[\"WebGL2\"] = 2] = \"WebGL2\";\n return CanvasContext2;\n})(CanvasContext || {});\nvar MediaInteractions = /* @__PURE__ */ ((MediaInteractions2) => {\n MediaInteractions2[MediaInteractions2[\"Play\"] = 0] = \"Play\";\n MediaInteractions2[MediaInteractions2[\"Pause\"] = 1] = \"Pause\";\n MediaInteractions2[MediaInteractions2[\"Seeked\"] = 2] = \"Seeked\";\n MediaInteractions2[MediaInteractions2[\"VolumeChange\"] = 3] = \"VolumeChange\";\n MediaInteractions2[MediaInteractions2[\"RateChange\"] = 4] = \"RateChange\";\n return MediaInteractions2;\n})(MediaInteractions || {});\nvar ReplayerEvents = /* @__PURE__ */ ((ReplayerEvents2) => {\n ReplayerEvents2[\"Start\"] = \"start\";\n ReplayerEvents2[\"Pause\"] = \"pause\";\n ReplayerEvents2[\"Resume\"] = \"resume\";\n ReplayerEvents2[\"Resize\"] = \"resize\";\n ReplayerEvents2[\"Finish\"] = \"finish\";\n ReplayerEvents2[\"FullsnapshotRebuilded\"] = \"fullsnapshot-rebuilded\";\n ReplayerEvents2[\"LoadStylesheetStart\"] = \"load-stylesheet-start\";\n ReplayerEvents2[\"LoadStylesheetEnd\"] = \"load-stylesheet-end\";\n ReplayerEvents2[\"SkipStart\"] = \"skip-start\";\n ReplayerEvents2[\"SkipEnd\"] = \"skip-end\";\n ReplayerEvents2[\"MouseInteraction\"] = \"mouse-interaction\";\n ReplayerEvents2[\"EventCast\"] = \"event-cast\";\n ReplayerEvents2[\"CustomEvent\"] = \"custom-event\";\n ReplayerEvents2[\"Flush\"] = \"flush\";\n ReplayerEvents2[\"StateChange\"] = \"state-change\";\n ReplayerEvents2[\"PlayBack\"] = \"play-back\";\n ReplayerEvents2[\"Destroy\"] = \"destroy\";\n return ReplayerEvents2;\n})(ReplayerEvents || {});\nvar NodeType = /* @__PURE__ */ ((NodeType2) => {\n NodeType2[NodeType2[\"Document\"] = 0] = \"Document\";\n NodeType2[NodeType2[\"DocumentType\"] = 1] = \"DocumentType\";\n NodeType2[NodeType2[\"Element\"] = 2] = \"Element\";\n NodeType2[NodeType2[\"Text\"] = 3] = \"Text\";\n NodeType2[NodeType2[\"CDATA\"] = 4] = \"CDATA\";\n NodeType2[NodeType2[\"Comment\"] = 5] = \"Comment\";\n return NodeType2;\n})(NodeType || {});\nexport {\n CanvasContext,\n EventType,\n IncrementalSource,\n MediaInteractions,\n MouseInteractions,\n NodeType,\n PointerTypes,\n ReplayerEvents\n};\n//# sourceMappingURL=rrweb-types.js.map\n","export var ServerZone;\n(function (ServerZone) {\n ServerZone[\"US\"] = \"US\";\n ServerZone[\"EU\"] = \"EU\";\n ServerZone[\"STAGING\"] = \"STAGING\";\n})(ServerZone || (ServerZone = {}));\n//# sourceMappingURL=server-zone.js.map","/** The status of an event. */\nexport var Status;\n(function (Status) {\n /** The status could not be determined. */\n Status[\"Unknown\"] = \"unknown\";\n /** The event was skipped due to configuration or callbacks. */\n Status[\"Skipped\"] = \"skipped\";\n /** The event was sent successfully. */\n Status[\"Success\"] = \"success\";\n /** A user or device in the payload is currently rate limited and should try again later. */\n Status[\"RateLimit\"] = \"rate_limit\";\n /** The sent payload was too large to be processed. */\n Status[\"PayloadTooLarge\"] = \"payload_too_large\";\n /** The event could not be processed. */\n Status[\"Invalid\"] = \"invalid\";\n /** A server-side error ocurred during submission. */\n Status[\"Failed\"] = \"failed\";\n /** a server or client side error occuring when a request takes too long and is cancelled */\n Status[\"Timeout\"] = \"Timeout\";\n /** NodeJS runtime environment error.. E.g. disconnected from network */\n Status[\"SystemError\"] = \"SystemError\";\n})(Status || (Status = {}));\n//# sourceMappingURL=status.js.map","/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\nimport { Status } from '@amplitude/analytics-types';\nvar BaseTransport = /** @class */ (function () {\n function BaseTransport() {\n }\n BaseTransport.prototype.send = function (_serverUrl, _payload) {\n return Promise.resolve(null);\n };\n BaseTransport.prototype.buildResponse = function (responseJSON) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x;\n if (typeof responseJSON !== 'object') {\n return null;\n }\n var statusCode = responseJSON.code || 0;\n var status = this.buildStatus(statusCode);\n switch (status) {\n case Status.Success:\n return {\n status: status,\n statusCode: statusCode,\n body: {\n eventsIngested: (_a = responseJSON.events_ingested) !== null && _a !== void 0 ? _a : 0,\n payloadSizeBytes: (_b = responseJSON.payload_size_bytes) !== null && _b !== void 0 ? _b : 0,\n serverUploadTime: (_c = responseJSON.server_upload_time) !== null && _c !== void 0 ? _c : 0,\n },\n };\n case Status.Invalid:\n return {\n status: status,\n statusCode: statusCode,\n body: {\n error: (_d = responseJSON.error) !== null && _d !== void 0 ? _d : '',\n missingField: (_e = responseJSON.missing_field) !== null && _e !== void 0 ? _e : '',\n eventsWithInvalidFields: (_f = responseJSON.events_with_invalid_fields) !== null && _f !== void 0 ? _f : {},\n eventsWithMissingFields: (_g = responseJSON.events_with_missing_fields) !== null && _g !== void 0 ? _g : {},\n eventsWithInvalidIdLengths: (_h = responseJSON.events_with_invalid_id_lengths) !== null && _h !== void 0 ? _h : {},\n epsThreshold: (_j = responseJSON.eps_threshold) !== null && _j !== void 0 ? _j : 0,\n exceededDailyQuotaDevices: (_k = responseJSON.exceeded_daily_quota_devices) !== null && _k !== void 0 ? _k : {},\n silencedDevices: (_l = responseJSON.silenced_devices) !== null && _l !== void 0 ? _l : [],\n silencedEvents: (_m = responseJSON.silenced_events) !== null && _m !== void 0 ? _m : [],\n throttledDevices: (_o = responseJSON.throttled_devices) !== null && _o !== void 0 ? _o : {},\n throttledEvents: (_p = responseJSON.throttled_events) !== null && _p !== void 0 ? _p : [],\n },\n };\n case Status.PayloadTooLarge:\n return {\n status: status,\n statusCode: statusCode,\n body: {\n error: (_q = responseJSON.error) !== null && _q !== void 0 ? _q : '',\n },\n };\n case Status.RateLimit:\n return {\n status: status,\n statusCode: statusCode,\n body: {\n error: (_r = responseJSON.error) !== null && _r !== void 0 ? _r : '',\n epsThreshold: (_s = responseJSON.eps_threshold) !== null && _s !== void 0 ? _s : 0,\n throttledDevices: (_t = responseJSON.throttled_devices) !== null && _t !== void 0 ? _t : {},\n throttledUsers: (_u = responseJSON.throttled_users) !== null && _u !== void 0 ? _u : {},\n exceededDailyQuotaDevices: (_v = responseJSON.exceeded_daily_quota_devices) !== null && _v !== void 0 ? _v : {},\n exceededDailyQuotaUsers: (_w = responseJSON.exceeded_daily_quota_users) !== null && _w !== void 0 ? _w : {},\n throttledEvents: (_x = responseJSON.throttled_events) !== null && _x !== void 0 ? _x : [],\n },\n };\n case Status.Timeout:\n default:\n return {\n status: status,\n statusCode: statusCode,\n };\n }\n };\n BaseTransport.prototype.buildStatus = function (code) {\n if (code >= 200 && code < 300) {\n return Status.Success;\n }\n if (code === 429) {\n return Status.RateLimit;\n }\n if (code === 413) {\n return Status.PayloadTooLarge;\n }\n if (code === 408) {\n return Status.Timeout;\n }\n if (code >= 400 && code < 500) {\n return Status.Invalid;\n }\n if (code >= 500) {\n return Status.Failed;\n }\n return Status.Unknown;\n };\n return BaseTransport;\n}());\nexport { BaseTransport };\n//# sourceMappingURL=base.js.map","import { __assign, __awaiter, __generator, __values } from \"tslib\";\nimport { BaseTransport } from '@amplitude/analytics-core';\nimport { ServerZone, Status } from '@amplitude/analytics-types';\nvar UNEXPECTED_NETWORK_ERROR_MESSAGE = 'Network error occurred, remote config fetch failed';\nvar SUCCESS_REMOTE_CONFIG = 'Remote config successfully fetched';\nvar MAX_RETRIES_EXCEEDED_MESSAGE = 'Remote config fetch rejected due to exceeded retry count';\nvar TIMEOUT_MESSAGE = 'Remote config fetch rejected due to timeout after 5 seconds';\nvar UNEXPECTED_ERROR_MESSAGE = 'Unexpected error occurred';\nexport var REMOTE_CONFIG_SERVER_URL = 'https://sr-client-cfg.amplitude.com/config';\nexport var REMOTE_CONFIG_SERVER_URL_STAGING = 'https://sr-client-cfg.stag2.amplitude.com/config';\nexport var REMOTE_CONFIG_SERVER_URL_EU = 'https://sr-client-cfg.eu.amplitude.com/config';\nvar RemoteConfigFetch = /** @class */ (function () {\n function RemoteConfigFetch(_a) {\n var localConfig = _a.localConfig, configKeys = _a.configKeys;\n var _this = this;\n this.retryTimeout = 1000;\n this.attempts = 0;\n this.sessionTargetingMatch = false;\n this.metrics = {};\n this.getRemoteNamespaceConfig = function (configNamespace, sessionId) { return __awaiter(_this, void 0, void 0, function () {\n var fetchStartTime, configAPIResponse, remoteConfig;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n fetchStartTime = Date.now();\n return [4 /*yield*/, this.fetchWithTimeout(sessionId)];\n case 1:\n configAPIResponse = _a.sent();\n if (configAPIResponse) {\n remoteConfig = configAPIResponse.configs && configAPIResponse.configs[configNamespace];\n if (remoteConfig) {\n this.metrics.fetchTimeAPISuccess = Date.now() - fetchStartTime;\n return [2 /*return*/, remoteConfig];\n }\n }\n this.metrics.fetchTimeAPIFail = Date.now() - fetchStartTime;\n return [2 /*return*/, undefined];\n }\n });\n }); };\n this.getRemoteConfig = function (configNamespace, key, sessionId) { return __awaiter(_this, void 0, void 0, function () {\n var namespaceConfig;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, this.getRemoteNamespaceConfig(configNamespace, sessionId)];\n case 1:\n namespaceConfig = _a.sent();\n return [2 /*return*/, namespaceConfig === null || namespaceConfig === void 0 ? void 0 : namespaceConfig[key]];\n }\n });\n }); };\n this.fetchWithTimeout = function (sessionId) { return __awaiter(_this, void 0, void 0, function () {\n var controller, timeoutId, remoteConfig;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n controller = new AbortController();\n timeoutId = setTimeout(function () { return controller.abort(); }, 5000);\n return [4 /*yield*/, this.fetchRemoteConfig(controller.signal, sessionId)];\n case 1:\n remoteConfig = _a.sent();\n clearTimeout(timeoutId);\n return [2 /*return*/, remoteConfig];\n }\n });\n }); };\n this.fetchRemoteConfig = function (signal, sessionId) { return __awaiter(_this, void 0, void 0, function () {\n var urlParams, _a, _b, configKey, options, serverUrl, res, parsedStatus, e_1, knownError;\n var e_2, _c;\n var _d;\n return __generator(this, function (_e) {\n switch (_e.label) {\n case 0:\n if (sessionId === this.lastFetchedSessionId && this.attempts >= this.localConfig.flushMaxRetries) {\n return [2 /*return*/, this.completeRequest({ err: MAX_RETRIES_EXCEEDED_MESSAGE })];\n }\n else if (signal.aborted) {\n return [2 /*return*/, this.completeRequest({ err: TIMEOUT_MESSAGE })];\n }\n else if (sessionId !== this.lastFetchedSessionId) {\n this.lastFetchedSessionId = sessionId;\n this.attempts = 0;\n }\n _e.label = 1;\n case 1:\n _e.trys.push([1, 3, , 4]);\n urlParams = new URLSearchParams({\n api_key: this.localConfig.apiKey,\n });\n try {\n for (_a = __values(this.configKeys), _b = _a.next(); !_b.done; _b = _a.next()) {\n configKey = _b.value;\n urlParams.append('config_keys', configKey);\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (_b && !_b.done && (_c = _a.return)) _c.call(_a);\n }\n finally { if (e_2) throw e_2.error; }\n }\n if (sessionId) {\n urlParams.set('session_id', String(sessionId));\n }\n options = {\n headers: {\n Accept: '*/*',\n },\n method: 'GET',\n };\n serverUrl = \"\".concat(this.getServerUrl(), \"?\").concat(urlParams.toString());\n this.attempts += 1;\n return [4 /*yield*/, fetch(serverUrl, __assign(__assign({}, options), { signal: signal }))];\n case 2:\n res = _e.sent();\n if (res === null) {\n return [2 /*return*/, this.completeRequest({ err: UNEXPECTED_ERROR_MESSAGE })];\n }\n parsedStatus = new BaseTransport().buildStatus(res.status);\n switch (parsedStatus) {\n case Status.Success:\n this.attempts = 0;\n return [2 /*return*/, this.parseAndStoreConfig(res)];\n case Status.Failed:\n return [2 /*return*/, this.retryFetch(signal, sessionId)];\n default:\n return [2 /*return*/, this.completeRequest({ err: UNEXPECTED_NETWORK_ERROR_MESSAGE })];\n }\n return [3 /*break*/, 4];\n case 3:\n e_1 = _e.sent();\n knownError = e_1;\n if (signal.aborted) {\n return [2 /*return*/, this.completeRequest({ err: TIMEOUT_MESSAGE })];\n }\n return [2 /*return*/, this.completeRequest({ err: (_d = knownError.message) !== null && _d !== void 0 ? _d : UNEXPECTED_ERROR_MESSAGE })];\n case 4: return [2 /*return*/];\n }\n });\n }); };\n this.retryFetch = function (signal, sessionId) { return __awaiter(_this, void 0, void 0, function () {\n var _this = this;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, _this.attempts * _this.retryTimeout); })];\n case 1:\n _a.sent();\n return [2 /*return*/, this.fetchRemoteConfig(signal, sessionId)];\n }\n });\n }); };\n this.parseAndStoreConfig = function (res) { return __awaiter(_this, void 0, void 0, function () {\n var remoteConfig;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, res.json()];\n case 1:\n remoteConfig = (_a.sent());\n this.completeRequest({ success: SUCCESS_REMOTE_CONFIG });\n return [2 /*return*/, remoteConfig];\n }\n });\n }); };\n this.localConfig = localConfig;\n this.configKeys = configKeys;\n }\n RemoteConfigFetch.prototype.getServerUrl = function () {\n if (this.localConfig.configServerUrl) {\n return this.localConfig.configServerUrl;\n }\n if (this.localConfig.serverZone === ServerZone.STAGING) {\n return REMOTE_CONFIG_SERVER_URL_STAGING;\n }\n if (this.localConfig.serverZone === ServerZone.EU) {\n return REMOTE_CONFIG_SERVER_URL_EU;\n }\n return REMOTE_CONFIG_SERVER_URL;\n };\n RemoteConfigFetch.prototype.completeRequest = function (_a) {\n var err = _a.err, success = _a.success;\n if (err) {\n throw new Error(err);\n }\n else if (success) {\n this.localConfig.loggerProvider.log(success);\n }\n };\n return RemoteConfigFetch;\n}());\nexport { RemoteConfigFetch };\nexport var createRemoteConfigFetch = function (_a) {\n var localConfig = _a.localConfig, configKeys = _a.configKeys;\n return __awaiter(void 0, void 0, void 0, function () {\n return __generator(this, function (_b) {\n return [2 /*return*/, new RemoteConfigFetch({ localConfig: localConfig, configKeys: configKeys })];\n });\n });\n};\n//# sourceMappingURL=remote-config.js.map","import * as remoteConfigFetch from './remote-config';\nexport var createRemoteConfigFetch = remoteConfigFetch.createRemoteConfigFetch;\n//# sourceMappingURL=index.js.map","import { RemoteConfigFetch, createRemoteConfigFetch } from '@amplitude/analytics-remote-config';\nimport { ILogger } from '@amplitude/analytics-core';\nimport { getDebugConfig } from '../helpers';\nimport { SessionReplayOptions } from '../typings/session-replay';\nimport { SessionReplayLocalConfig } from './local-config';\nimport {\n SessionReplayLocalConfig as ISessionReplayLocalConfig,\n PrivacyConfig,\n SessionReplayConfigs,\n SessionReplayJoinedConfig,\n SessionReplayRemoteConfig,\n} from './types';\n\nexport const removeInvalidSelectorsFromPrivacyConfig = (privacyConfig: PrivacyConfig, loggerProvider: ILogger) => {\n // This allows us to not search the DOM.\n const fragment = document.createDocumentFragment();\n\n const dropInvalidSelectors = (selectors: string[] | string = []): string[] | undefined => {\n if (typeof selectors === 'string') {\n selectors = [selectors];\n }\n selectors = selectors.filter((selector: string) => {\n try {\n fragment.querySelector(selector);\n } catch {\n loggerProvider.warn(`[session-replay-browser] omitting selector \"${selector}\" because it is invalid`);\n return false;\n }\n return true;\n });\n if (selectors.length === 0) {\n return undefined;\n }\n return selectors;\n };\n privacyConfig.blockSelector = dropInvalidSelectors(privacyConfig.blockSelector);\n privacyConfig.maskSelector = dropInvalidSelectors(privacyConfig.maskSelector);\n privacyConfig.unmaskSelector = dropInvalidSelectors(privacyConfig.unmaskSelector);\n return privacyConfig;\n};\nexport class SessionReplayJoinedConfigGenerator {\n private readonly localConfig: ISessionReplayLocalConfig;\n private readonly remoteConfigFetch: RemoteConfigFetch<SessionReplayRemoteConfig>;\n\n constructor(remoteConfigFetch: RemoteConfigFetch<SessionReplayRemoteConfig>, localConfig: ISessionReplayLocalConfig) {\n this.localConfig = localConfig;\n this.remoteConfigFetch = remoteConfigFetch;\n }\n\n async generateJoinedConfig(sessionId?: string | number): Promise<SessionReplayConfigs> {\n const config: SessionReplayJoinedConfig = { ...this.localConfig };\n // Special case here as optOut is implemented via getter/setter\n config.optOut = this.localConfig.optOut;\n // We always want captureEnabled to be true, unless there's an override\n // in the remote config.\n config.captureEnabled = true;\n let remoteConfig: SessionReplayRemoteConfig | undefined;\n try {\n const namespaceConfig = await this.remoteConfigFetch.getRemoteNamespaceConfig('sessionReplay', sessionId);\n if (namespaceConfig) {\n const samplingConfig = namespaceConfig.sr_sampling_config;\n const privacyConfig = namespaceConfig.sr_privacy_config;\n const targetingConfig = namespaceConfig.sr_targeting_config;\n\n const ugcFilterRules = config.interactionConfig?.ugcFilterRules;\n // This is intentionally forced to only be set through the remote config.\n config.interactionConfig = namespaceConfig.sr_interaction_config;\n if (config.interactionConfig && ugcFilterRules) {\n config.interactionConfig.ugcFilterRules = ugcFilterRules;\n }\n\n // This is intentionally forced to only be set through the remote config.\n config.loggingConfig = namespaceConfig.sr_logging_config;\n\n if (samplingConfig || privacyConfig || targetingConfig) {\n remoteConfig = {};\n if (samplingConfig) {\n remoteConfig.sr_sampling_config = samplingConfig;\n }\n if (privacyConfig) {\n remoteConfig.sr_privacy_config = privacyConfig;\n }\n if (targetingConfig) {\n remoteConfig.sr_targeting_config = targetingConfig;\n }\n }\n }\n } catch (err: unknown) {\n const knownError = err as Error;\n this.localConfig.loggerProvider.warn(knownError.message);\n config.captureEnabled = false;\n }\n\n if (!remoteConfig) {\n return {\n localConfig: this.localConfig,\n joinedConfig: config,\n remoteConfig,\n };\n }\n\n const {\n sr_sampling_config: samplingConfig,\n sr_privacy_config: remotePrivacyConfig,\n sr_targeting_config: targetingConfig,\n } = remoteConfig;\n if (samplingConfig && Object.keys(samplingConfig).length > 0) {\n if (Object.prototype.hasOwnProperty.call(samplingConfig, 'capture_enabled')) {\n config.captureEnabled = samplingConfig.capture_enabled;\n } else {\n config.captureEnabled = false;\n }\n\n if (Object.prototype.hasOwnProperty.call(samplingConfig, 'sample_rate')) {\n config.sampleRate = samplingConfig.sample_rate;\n }\n } else {\n // If config API response was valid (ie 200), but no config returned, assume that\n // customer has not yet set up config, and use sample rate from SDK options,\n // allowing for immediate replay capture\n config.captureEnabled = true;\n this.localConfig.loggerProvider.debug(\n 'Remote config successfully fetched, but no values set for project, Session Replay capture enabled.',\n );\n }\n\n // Remote config join acts somewhat like a left join between the remote and the local\n // config. That is, remote config has precedence over local values as with sampling.\n // However, non conflicting values will be added to the lists.\n // Here's an example to illustrate:\n //\n // Remote config: {'.selector1': 'MASK', '.selector2': 'UNMASK'}\n // Local config: {'.selector1': 'UNMASK', '.selector3': 'MASK'}\n //\n // Resolved config: {'.selector1': 'MASK', '.selector2': 'UNMASK', '.selector3': 'MASK'}\n // config.privacyConfig = {\n // ...(config.privacyConfig ?? {}),\n // ...remotePrivacyConfig,\n // };\n\n if (remotePrivacyConfig) {\n const localPrivacyConfig: PrivacyConfig = config.privacyConfig ?? {};\n\n const joinedPrivacyConfig: Required<PrivacyConfig> & { blockSelector: string[] } = {\n defaultMaskLevel: remotePrivacyConfig.defaultMaskLevel ?? localPrivacyConfig.defaultMaskLevel ?? 'medium',\n blockSelector: [],\n maskSelector: [],\n unmaskSelector: [],\n };\n\n const privacyConfigSelectorMap = (privacyConfig: PrivacyConfig): Record<string, 'mask' | 'unmask' | 'block'> => {\n const selectorMap: Record<string, 'mask' | 'unmask' | 'block'> = {};\n if (typeof privacyConfig.blockSelector === 'string') {\n privacyConfig.blockSelector = [privacyConfig.blockSelector];\n }\n\n for (const selector of privacyConfig.blockSelector ?? []) {\n selectorMap[selector] = 'block';\n }\n for (const selector of privacyConfig.maskSelector ?? []) {\n selectorMap[selector] = 'mask';\n }\n for (const selector of privacyConfig.unmaskSelector ?? []) {\n selectorMap[selector] = 'unmask';\n }\n return selectorMap;\n };\n\n const selectorMap: Record<string, 'mask' | 'unmask' | 'block'> = {\n ...privacyConfigSelectorMap(localPrivacyConfig),\n ...privacyConfigSelectorMap(remotePrivacyConfig),\n };\n\n for (const [selector, selectorType] of Object.entries(selectorMap)) {\n if (selectorType === 'mask') {\n joinedPrivacyConfig.maskSelector.push(selector);\n } else if (selectorType === 'block') {\n joinedPrivacyConfig.blockSelector.push(selector);\n } else if (selectorType === 'unmask') {\n joinedPrivacyConfig.unmaskSelector.push(selector);\n }\n }\n\n config.privacyConfig = removeInvalidSelectorsFromPrivacyConfig(\n joinedPrivacyConfig,\n this.localConfig.loggerProvider,\n );\n }\n\n if (targetingConfig && Object.keys(targetingConfig).length > 0) {\n config.targetingConfig = targetingConfig;\n }\n\n this.localConfig.loggerProvider.debug(\n JSON.stringify({ name: 'session replay joined config', config: getDebugConfig(config) }, null, 2),\n );\n\n return {\n localConfig: this.localConfig,\n joinedConfig: config,\n remoteConfig,\n };\n }\n}\n\nexport const createSessionReplayJoinedConfigGenerator = async (apiKey: string, options: SessionReplayOptions) => {\n const localConfig = new SessionReplayLocalConfig(apiKey, options);\n const remoteConfigFetch = await createRemoteConfigFetch<SessionReplayRemoteConfig>({\n localConfig,\n configKeys: ['sessionReplay'],\n });\n\n return new SessionReplayJoinedConfigGenerator(remoteConfigFetch, localConfig);\n};\n","var u8 = Uint8Array, u16 = Uint16Array, u32 = Uint32Array;\nvar fleb = new u8([\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 1,\n 1,\n 1,\n 1,\n 2,\n 2,\n 2,\n 2,\n 3,\n 3,\n 3,\n 3,\n 4,\n 4,\n 4,\n 4,\n 5,\n 5,\n 5,\n 5,\n 0,\n /* unused */\n 0,\n 0,\n /* impossible */\n 0\n]);\nvar fdeb = new u8([\n 0,\n 0,\n 0,\n 0,\n 1,\n 1,\n 2,\n 2,\n 3,\n 3,\n 4,\n 4,\n 5,\n 5,\n 6,\n 6,\n 7,\n 7,\n 8,\n 8,\n 9,\n 9,\n 10,\n 10,\n 11,\n 11,\n 12,\n 12,\n 13,\n 13,\n /* unused */\n 0,\n 0\n]);\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\nvar freb = function(eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n var r = new u32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = j - b[i] << 5 | i;\n }\n }\n return [b, r];\n};\nvar _a = freb(fleb, 2), fl = _a[0], revfl = _a[1];\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b[0], revfd = _b[1];\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n var x = (i & 43690) >>> 1 | (i & 21845) << 1;\n x = (x & 52428) >>> 2 | (x & 13107) << 2;\n x = (x & 61680) >>> 4 | (x & 3855) << 4;\n rev[i] = ((x & 65280) >>> 8 | (x & 255) << 8) >>> 1;\n}\nvar hMap = function(cd, mb, r) {\n var s = cd.length;\n var i = 0;\n var l = new u16(mb);\n for (; i < s; ++i)\n ++l[cd[i] - 1];\n var le = new u16(mb);\n for (i = 0; i < mb; ++i) {\n le[i] = le[i - 1] + l[i - 1] << 1;\n }\n var co;\n if (r) {\n co = new u16(1 << mb);\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n if (cd[i]) {\n var sv = i << 4 | cd[i];\n var r_1 = mb - cd[i];\n var v = le[cd[i] - 1]++ << r_1;\n for (var m = v | (1 << r_1) - 1; v <= m; ++v) {\n co[rev[v] >>> rvb] = sv;\n }\n }\n }\n } else {\n co = new u16(s);\n for (i = 0; i < s; ++i)\n co[i] = rev[le[cd[i] - 1]++] >>> 15 - cd[i];\n }\n return co;\n};\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\nvar flm = /* @__PURE__ */ hMap(flt, 9, 0), flrm = /* @__PURE__ */ hMap(flt, 9, 1);\nvar fdm = /* @__PURE__ */ hMap(fdt, 5, 0), fdrm = /* @__PURE__ */ hMap(fdt, 5, 1);\nvar max = function(a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\nvar bits = function(d, p, m) {\n var o = p / 8 >> 0;\n return (d[o] | d[o + 1] << 8) >>> (p & 7) & m;\n};\nvar bits16 = function(d, p) {\n var o = p / 8 >> 0;\n return (d[o] | d[o + 1] << 8 | d[o + 2] << 16) >>> (p & 7);\n};\nvar shft = function(p) {\n return (p / 8 >> 0) + (p & 7 && 1);\n};\nvar slc = function(v, s, e) {\n if (e == null || e > v.length)\n e = v.length;\n var n = new (v instanceof u16 ? u16 : v instanceof u32 ? u32 : u8)(e - s);\n n.set(v.subarray(s, e));\n return n;\n};\nvar inflt = function(dat, buf, st) {\n var sl = dat.length;\n var noBuf = !buf || st;\n var noSt = !st || st.i;\n if (!st)\n st = {};\n if (!buf)\n buf = new u8(sl * 3);\n var cbuf = function(l2) {\n var bl = buf.length;\n if (l2 > bl) {\n var nbuf = new u8(Math.max(bl * 2, l2));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n var tbts = sl * 8;\n do {\n if (!lm) {\n st.f = final = bits(dat, pos, 1);\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n var s = shft(pos) + 4, l = dat[s - 4] | dat[s - 3] << 8, t = s + l;\n if (t > sl) {\n if (noSt)\n throw \"unexpected EOF\";\n break;\n }\n if (noBuf)\n cbuf(bt + l);\n buf.set(dat.subarray(s, t), bt);\n st.b = bt += l, st.p = pos = t * 8;\n continue;\n } else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n var ldt = new u8(tl);\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n if (!noSt && pos + tl * (clb + 7) > tbts)\n break;\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl; ) {\n var r = clm[bits(dat, pos, clbmsk)];\n pos += r & 15;\n var s = r >>> 4;\n if (s < 16) {\n ldt[i++] = s;\n } else {\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n lbt = max(lt);\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n } else\n throw \"invalid block type\";\n if (pos > tbts)\n throw \"unexpected EOF\";\n }\n if (noBuf)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var mxa = lbt + dbt + 18;\n while (noSt || pos + mxa < tbts) {\n var c = lm[bits16(dat, pos) & lms], sym = c >>> 4;\n pos += c & 15;\n if (pos > tbts)\n throw \"unexpected EOF\";\n if (!c)\n throw \"invalid length/literal\";\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lm = null;\n break;\n } else {\n var add = sym - 254;\n if (sym > 264) {\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n var d = dm[bits16(dat, pos) & dms], dsym = d >>> 4;\n if (!d)\n throw \"invalid distance\";\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & (1 << b) - 1, pos += b;\n }\n if (pos > tbts)\n throw \"unexpected EOF\";\n if (noBuf)\n cbuf(bt + 131072);\n var end = bt + add;\n for (; bt < end; bt += 4) {\n buf[bt] = buf[bt - dt];\n buf[bt + 1] = buf[bt + 1 - dt];\n buf[bt + 2] = buf[bt + 2 - dt];\n buf[bt + 3] = buf[bt + 3 - dt];\n }\n bt = end;\n }\n }\n st.l = lm, st.p = pos, st.b = bt;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n return bt == buf.length ? buf : slc(buf, 0, bt);\n};\nvar wbits = function(d, p, v) {\n v <<= p & 7;\n var o = p / 8 >> 0;\n d[o] |= v;\n d[o + 1] |= v >>> 8;\n};\nvar wbits16 = function(d, p, v) {\n v <<= p & 7;\n var o = p / 8 >> 0;\n d[o] |= v;\n d[o + 1] |= v >>> 8;\n d[o + 2] |= v >>> 16;\n};\nvar hTree = function(d, mb) {\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return [new u8(0), 0];\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return [v, 1];\n }\n t.sort(function(a, b) {\n return a.f - b.f;\n });\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l, r };\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l, r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n var tr = new u16(maxSym + 1);\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n var i = 0, dt = 0;\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function(a, b) {\n return tr[b.s] - tr[a.s] || a.f - b.f;\n });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << mbt - tr[i2_1]);\n tr[i2_1] = mb;\n } else\n break;\n }\n dt >>>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << mb - tr[i2_2]++ - 1;\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return [new u8(tr), mbt];\n};\nvar ln = function(n, l, d) {\n return n.s == -1 ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1)) : l[n.s] = d;\n};\nvar lc = function(c) {\n var s = c.length;\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n var cli = 0, cln = c[0], cls = 1;\n var w = function(v) {\n cl[cli++] = v;\n };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? cls - 11 << 5 | 28690 : cls - 3 << 5 | 12305);\n cls = 0;\n }\n } else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(cls - 3 << 5 | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return [cl.subarray(0, cli), s];\n};\nvar clen = function(cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\nvar wfblk = function(out, pos, dat) {\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >>> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\nvar wblk = function(dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a2 = hTree(lf, 15), dlt = _a2[0], mlb = _a2[1];\n var _b2 = hTree(df, 15), ddt = _b2[0], mdb = _b2[1];\n var _c = lc(dlt), lclt = _c[0], nlc = _c[1];\n var _d = lc(ddt), lcdt = _d[0], ndc = _d[1];\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n lcfreq[lclt[i] & 31]++;\n for (var i = 0; i < lcdt.length; ++i)\n lcfreq[lcdt[i] & 31]++;\n var _e = hTree(lcfreq, 7), lct = _e[0], mlcb = _e[1];\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = bl + 5 << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + (2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18]);\n if (flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, clct[i] >>> 5 & 127), p += clct[i] >>> 12;\n }\n }\n } else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n if (syms[i] > 255) {\n var len = syms[i] >>> 18 & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, syms[i] >>> 23 & 31), p += fleb[len];\n var dst = syms[i] & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, syms[i] >>> 5 & 8191), p += fdeb[dst];\n } else {\n wbits16(out, p, lm[syms[i]]), p += ll[syms[i]];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\nvar deo = /* @__PURE__ */ new u32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\nvar dflt = function(dat, lvl, plvl, pre, post, lst) {\n var s = dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.floor(s / 7e3)) + post);\n var w = o.subarray(pre, o.length - post);\n var pos = 0;\n if (!lvl || s < 8) {\n for (var i = 0; i <= s; i += 65535) {\n var e = i + 65535;\n if (e < s) {\n pos = wfblk(w, pos, dat.subarray(i, e));\n } else {\n w[i] = lst;\n pos = wfblk(w, pos, dat.subarray(i, s));\n }\n }\n } else {\n var opt = deo[lvl - 1];\n var n = opt >>> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n var prev = new u16(32768), head = new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function(i2) {\n return (dat[i2] ^ dat[i2 + 1] << bs1_1 ^ dat[i2 + 2] << bs2_1) & msk_1;\n };\n var syms = new u32(25e3);\n var lf = new u16(288), df = new u16(32);\n var lc_1 = 0, eb = 0, i = 0, li = 0, wi = 0, bs = 0;\n for (; i < s; ++i) {\n var hv = hsh(i);\n var imod = i & 32767;\n var pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n if (wi <= i) {\n var rem = s - i;\n if ((lc_1 > 7e3 || li > 24576) && rem > 423) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n if (nl > maxn)\n break;\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = i - dif + j + 32768 & 32767;\n var pti = prev[ti];\n var cd = ti - pti + 32768 & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n imod = pimod, pimod = prev[imod];\n dif += imod - pimod + 32768 & 32767;\n }\n }\n if (d) {\n syms[li++] = 268435456 | revfl[l] << 18 | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n } else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\nvar adler = function() {\n var a = 1, b = 0;\n return {\n p: function(d) {\n var n = a, m = b;\n var l = d.length;\n for (var i = 0; i != l; ) {\n var e = Math.min(i + 5552, l);\n for (; i < e; ++i)\n n += d[i], m += n;\n n %= 65521, m %= 65521;\n }\n a = n, b = m;\n },\n d: function() {\n return (a >>> 8 << 16 | (b & 255) << 8 | b >>> 8) + ((a & 255) << 23) * 2;\n }\n };\n};\nvar dopt = function(dat, opt, pre, post, st) {\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 12 + opt.mem, pre, post, !st);\n};\nvar wbytes = function(d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\nvar zlh = function(c, o) {\n var lv = o.level, fl2 = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = fl2 << 6 | (fl2 ? 32 - 2 * fl2 : 1);\n};\nvar zlv = function(d) {\n if ((d[0] & 15) != 8 || d[0] >>> 4 > 7 || (d[0] << 8 | d[1]) % 31)\n throw \"invalid zlib data\";\n if (d[1] & 32)\n throw \"invalid zlib data: preset dictionaries not supported\";\n};\nfunction zlibSync(data, opts) {\n if (opts === void 0) {\n opts = {};\n }\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\nfunction unzlibSync(data, out) {\n return inflt((zlv(data), data.subarray(2, -4)), out);\n}\nfunction strToU8(str, latin1) {\n var l = str.length;\n if (!latin1 && typeof TextEncoder != \"undefined\")\n return new TextEncoder().encode(str);\n var ar = new u8(str.length + (str.length >>> 1));\n var ai = 0;\n var w = function(v) {\n ar[ai++] = v;\n };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + (l - i << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | c >>> 6), w(128 | c & 63);\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | str.charCodeAt(++i) & 1023, w(240 | c >>> 18), w(128 | c >>> 12 & 63), w(128 | c >>> 6 & 63), w(128 | c & 63);\n else\n w(224 | c >>> 12), w(128 | c >>> 6 & 63), w(128 | c & 63);\n }\n return slc(ar, 0, ai);\n}\nfunction strFromU8(dat, latin1) {\n var r = \"\";\n if (!latin1 && typeof TextDecoder != \"undefined\")\n return new TextDecoder().decode(dat);\n for (var i = 0; i < dat.length; ) {\n var c = dat[i++];\n if (c < 128 || latin1)\n r += String.fromCharCode(c);\n else if (c < 224)\n r += String.fromCharCode((c & 31) << 6 | dat[i++] & 63);\n else if (c < 240)\n r += String.fromCharCode((c & 15) << 12 | (dat[i++] & 63) << 6 | dat[i++] & 63);\n else\n c = ((c & 15) << 18 | (dat[i++] & 63) << 12 | (dat[i++] & 63) << 6 | dat[i++] & 63) - 65536, r += String.fromCharCode(55296 | c >> 10, 56320 | c & 1023);\n }\n return r;\n}\nconst MARK = \"v1\";\nexport {\n MARK as M,\n strToU8 as a,\n strFromU8 as s,\n unzlibSync as u,\n zlibSync as z\n};\n//# sourceMappingURL=base-BrE4jft0.js.map\n","import { M as MARK, s as strFromU8, z as zlibSync, a as strToU8 } from \"./base-BrE4jft0.js\";\nconst pack = (event) => {\n const _e = {\n ...event,\n v: MARK\n };\n return strFromU8(zlibSync(strToU8(JSON.stringify(_e))), true);\n};\nexport {\n pack\n};\n//# sourceMappingURL=pack.js.map\n","import { getGlobalScope } from '@amplitude/analytics-core';\nimport { pack } from '@amplitude/rrweb-packer';\nimport type { eventWithTime } from '@amplitude/rrweb-types';\nimport { SessionReplayJoinedConfig } from '../config/types';\nimport { SessionReplayEventsManager } from '../typings/session-replay';\n\ninterface TaskQueue {\n event: eventWithTime;\n sessionId: string | number;\n}\n\nconst DEFAULT_TIMEOUT = 2000;\nexport class EventCompressor {\n taskQueue: TaskQueue[] = [];\n isProcessing = false;\n eventsManager?: SessionReplayEventsManager<'replay' | 'interaction', string>;\n config: SessionReplayJoinedConfig;\n deviceId: string | undefined;\n canUseIdleCallback: boolean | undefined;\n timeout: number;\n worker?: Worker;\n\n constructor(\n eventsManager: SessionReplayEventsManager<'replay' | 'interaction', string>,\n config: SessionReplayJoinedConfig,\n deviceId: string | undefined,\n workerScript?: string,\n ) {\n const globalScope = getGlobalScope();\n this.canUseIdleCallback = globalScope && 'requestIdleCallback' in globalScope;\n this.eventsManager = eventsManager;\n this.config = config;\n this.deviceId = deviceId;\n this.timeout = config.performanceConfig?.timeout || DEFAULT_TIMEOUT;\n\n if (workerScript) {\n config.loggerProvider.log('[Experimental] Enabling web worker for compression');\n\n const worker = new Worker(URL.createObjectURL(new Blob([workerScript], { type: 'application/javascript' })));\n worker.onerror = (e) => {\n config.loggerProvider.error(e);\n };\n worker.onmessage = (e) => {\n const { compressedEvent, sessionId } = e.data as Record<string, string>;\n this.addCompressedEventToManager(compressedEvent, sessionId);\n };\n\n this.worker = worker;\n }\n }\n\n // Schedule processing during idle time\n public scheduleIdleProcessing(): void {\n if (!this.isProcessing) {\n this.isProcessing = true;\n requestIdleCallback(\n (idleDeadline) => {\n this.processQueue(idleDeadline);\n },\n { timeout: this.timeout },\n );\n }\n }\n\n // Add an event to the task queue if idle callback is supported or compress the event directly\n public enqueueEvent(event: eventWithTime, sessionId: string | number): void {\n if (this.canUseIdleCallback && this.config.performanceConfig?.enabled) {\n this.config.loggerProvider.debug('Enqueuing event for processing during idle time.');\n this.taskQueue.push({ event, sessionId });\n this.scheduleIdleProcessing();\n } else {\n this.config.loggerProvider.debug('Processing event without idle callback.');\n this.addCompressedEvent(event, sessionId);\n }\n }\n\n // Process the task queue during idle time\n public processQueue(idleDeadline: IdleDeadline): void {\n // Process tasks while there's idle time or until the max number of tasks is reached\n while (this.taskQueue.length > 0 && (idleDeadline.timeRemaining() > 0 || idleDeadline.didTimeout)) {\n const task = this.taskQueue.shift();\n if (task) {\n const { event, sessionId } = task;\n this.addCompressedEvent(event, sessionId);\n }\n }\n\n // If there are still tasks in the queue, schedule the next idle callback\n if (this.taskQueue.length > 0) {\n requestIdleCallback(\n (idleDeadline) => {\n this.processQueue(idleDeadline);\n },\n { timeout: this.timeout },\n );\n } else {\n this.isProcessing = false;\n }\n }\n\n compressEvent = (event: eventWithTime) => {\n const packedEvent = pack(event);\n return JSON.stringify(packedEvent);\n };\n\n private addCompressedEventToManager = (compressedEvent: string, sessionId: string | number) => {\n if (this.eventsManager && this.deviceId) {\n this.eventsManager.addEvent({\n event: { type: 'replay', data: compressedEvent },\n sessionId,\n deviceId: this.deviceId,\n });\n }\n };\n\n public addCompressedEvent = (event: eventWithTime, sessionId: string | number) => {\n if (this.worker) {\n // This indirectly compresses the event.\n try {\n this.worker.postMessage({ event, sessionId });\n } catch (err: any) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (err.name === 'DataCloneError') {\n // fallback: serialize\n this.worker.postMessage(JSON.stringify({ event, sessionId }));\n } else {\n this.config.loggerProvider.warn('Unexpected error while posting message to worker:', err);\n }\n }\n } else {\n const compressedEvent = this.compressEvent(event);\n this.addCompressedEventToManager(compressedEvent, sessionId);\n }\n };\n\n public terminate = () => {\n this.worker?.terminate();\n };\n}\n","export const UNEXPECTED_ERROR_MESSAGE = 'Unexpected error occurred';\nexport const UNEXPECTED_NETWORK_ERROR_MESSAGE = 'Network error occurred, event batch rejected';\nexport const MAX_RETRIES_EXCEEDED_MESSAGE = 'Session replay event batch rejected due to exceeded retry count';\nexport const STORAGE_FAILURE = 'Failed to store session replay events in IndexedDB';\nexport const MISSING_DEVICE_ID_MESSAGE = 'Session replay event batch not sent due to missing device ID';\nexport const MISSING_API_KEY_MESSAGE = 'Session replay event batch not sent due to missing api key';\n","// Autogenerated by `yarn version-file`. DO NOT EDIT\nexport const VERSION = '1.28.14';\n","import { BaseTransport, ILogger, Status } from '@amplitude/analytics-core';\nimport { getCurrentUrl, getServerUrl } from './helpers';\nimport {\n MAX_RETRIES_EXCEEDED_MESSAGE,\n MISSING_API_KEY_MESSAGE,\n MISSING_DEVICE_ID_MESSAGE,\n UNEXPECTED_ERROR_MESSAGE,\n UNEXPECTED_NETWORK_ERROR_MESSAGE,\n} from './messages';\nimport {\n SessionReplayTrackDestination as AmplitudeSessionReplayTrackDestination,\n SessionReplayDestination,\n SessionReplayDestinationContext,\n} from './typings/session-replay';\nimport { VERSION } from './version';\nimport { MAX_URL_LENGTH, KB_SIZE } from './constants';\n\nexport type PayloadBatcher = ({ version, events }: { version: number; events: string[] }) => {\n version: number;\n events: unknown[];\n};\n\nexport class SessionReplayTrackDestination implements AmplitudeSessionReplayTrackDestination {\n loggerProvider: ILogger;\n storageKey = '';\n trackServerUrl?: string;\n retryTimeout = 1000;\n private scheduled: ReturnType<typeof setTimeout> | null = null;\n payloadBatcher: PayloadBatcher;\n queue: SessionReplayDestinationContext[] = [];\n\n constructor({\n trackServerUrl,\n loggerProvider,\n payloadBatcher,\n }: {\n trackServerUrl?: string;\n loggerProvider: ILogger;\n payloadBatcher?: PayloadBatcher;\n }) {\n this.loggerProvider = loggerProvider;\n this.payloadBatcher = payloadBatcher ? payloadBatcher : (payload) => payload;\n this.trackServerUrl = trackServerUrl;\n }\n\n sendEventsList(destinationData: SessionReplayDestination) {\n this.addToQueue({\n ...destinationData,\n attempts: 0,\n timeout: 0,\n });\n }\n\n addToQueue(...list: SessionReplayDestinationContext[]) {\n const tryable = list.filter((context) => {\n if (context.attempts < (context.flushMaxRetries || 0)) {\n context.attempts += 1;\n return true;\n }\n this.completeRequest({\n context,\n err: MAX_RETRIES_EXCEEDED_MESSAGE,\n });\n return false;\n });\n tryable.forEach((context) => {\n this.queue = this.queue.concat(context);\n if (context.timeout === 0) {\n this.schedule(0);\n return;\n }\n\n setTimeout(() => {\n context.timeout = 0;\n this.schedule(0);\n }, context.timeout);\n });\n }\n\n schedule(timeout: number) {\n if (this.scheduled) return;\n this.scheduled = setTimeout(() => {\n void this.flush(true).then(() => {\n if (this.queue.length > 0) {\n this.schedule(timeout);\n }\n });\n }, timeout);\n }\n\n async flush(useRetry = false) {\n const list: SessionReplayDestinationContext[] = [];\n const later: SessionReplayDestinationContext[] = [];\n this.queue.forEach((context) => (context.timeout === 0 ? list.push(context) : later.push(context)));\n this.queue = later;\n\n if (this.scheduled) {\n clearTimeout(this.scheduled);\n this.scheduled = null;\n }\n\n await Promise.all(list.map((context) => this.send(context, useRetry)));\n }\n\n async send(context: SessionReplayDestinationContext, useRetry = true) {\n const apiKey = context.apiKey;\n if (!apiKey) {\n return this.completeRequest({ context, err: MISSING_API_KEY_MESSAGE });\n }\n const deviceId = context.deviceId;\n if (!deviceId) {\n return this.completeRequest({ context, err: MISSING_DEVICE_ID_MESSAGE });\n }\n const url = getCurrentUrl();\n const version = VERSION;\n const sampleRate = context.sampleRate;\n const urlParams = new URLSearchParams({\n device_id: deviceId,\n session_id: `${context.sessionId}`,\n type: `${context.type}`,\n });\n const sessionReplayLibrary = `${context.version?.type || 'standalone'}/${context.version?.version || version}`;\n const payload = this.payloadBatcher({\n version: 1,\n events: context.events,\n });\n\n if (payload.events.length === 0) {\n this.completeRequest({ context });\n return;\n }\n\n try {\n const options: RequestInit = {\n headers: {\n 'Content-Type': 'application/json',\n Accept: '*/*',\n Authorization: `Bearer ${apiKey}`,\n 'X-Client-Version': version,\n 'X-Client-Library': sessionReplayLibrary,\n 'X-Client-Url': url.substring(0, MAX_URL_LENGTH), // limit url length to 1000 characters to avoid ELB 400 error\n 'X-Client-Sample-Rate': `${sampleRate}`,\n },\n body: JSON.stringify(payload),\n method: 'POST',\n };\n\n const serverUrl = `${getServerUrl(context.serverZone, this.trackServerUrl)}?${urlParams.toString()}`;\n const res = await fetch(serverUrl, options);\n if (res === null) {\n this.completeRequest({ context, err: UNEXPECTED_ERROR_MESSAGE });\n return;\n }\n if (!useRetry) {\n let responseBody = '';\n try {\n responseBody = JSON.stringify(res.body, null, 2);\n } catch {\n // to avoid crash, but don't care about the error, add comment to avoid empty block lint error\n }\n this.completeRequest({ context, success: `${res.status}: ${responseBody}` });\n } else {\n this.handleReponse(res.status, context);\n }\n } catch (e) {\n this.completeRequest({ context, err: e as string });\n }\n }\n\n handleReponse(status: number, context: SessionReplayDestinationContext) {\n const parsedStatus = new BaseTransport().buildStatus(status);\n switch (parsedStatus) {\n case Status.Success:\n this.handleSuccessResponse(context);\n break;\n case Status.Failed:\n this.handleOtherResponse(context);\n break;\n default:\n this.completeRequest({ context, err: UNEXPECTED_NETWORK_ERROR_MESSAGE });\n }\n }\n\n handleSuccessResponse(context: SessionReplayDestinationContext) {\n const sizeOfEventsList = Math.round(new Blob(context.events).size / KB_SIZE);\n this.completeRequest({\n context,\n success: `Session replay event batch tracked successfully for session id ${context.sessionId}, size of events: ${sizeOfEventsList} KB`,\n });\n }\n\n handleOtherResponse(context: SessionReplayDestinationContext) {\n this.addToQueue({\n ...context,\n timeout: context.attempts * this.retryTimeout,\n });\n }\n\n completeRequest({\n context,\n err,\n success,\n }: {\n context: SessionReplayDestinationContext;\n err?: string;\n success?: string;\n }) {\n void context.onComplete();\n if (err) {\n this.loggerProvider.warn(err);\n } else if (success) {\n this.loggerProvider.log(success);\n }\n }\n}\n","import { MAX_EVENT_LIST_SIZE, MAX_INTERVAL, MIN_INTERVAL } from '../constants';\nimport { Events, EventsStore, SendingSequencesReturn } from '../typings/session-replay';\nimport { ILogger } from '@amplitude/analytics-core';\n\nexport type InstanceArgs = {\n loggerProvider: ILogger;\n minInterval?: number;\n maxInterval?: number;\n maxPersistedEventsSize?: number;\n};\n\nexport abstract class BaseEventsStore<KeyType> implements EventsStore<KeyType> {\n protected readonly loggerProvider: ILogger;\n private minInterval = MIN_INTERVAL;\n private maxInterval = MAX_INTERVAL;\n private maxPersistedEventsSize = MAX_EVENT_LIST_SIZE;\n private interval = this.minInterval;\n private _timeAtLastSplit = Date.now(); // Initialize this so we have a point of comparison when events are recorded\n\n public get timeAtLastSplit() {\n return this._timeAtLastSplit;\n }\n\n constructor(args: InstanceArgs) {\n this.loggerProvider = args.loggerProvider;\n this.minInterval = args.minInterval ?? this.minInterval;\n this.maxInterval = args.maxInterval ?? this.maxInterval;\n this.maxPersistedEventsSize = args.maxPersistedEventsSize ?? this.maxPersistedEventsSize;\n }\n\n abstract addEventToCurrentSequence(\n sessionId: string | number,\n event: string,\n ): Promise<SendingSequencesReturn<KeyType> | undefined>;\n abstract getSequencesToSend(): Promise<SendingSequencesReturn<KeyType>[] | undefined>;\n abstract storeCurrentSequence(sessionId: number): Promise<SendingSequencesReturn<KeyType> | undefined>;\n abstract storeSendingEvents(sessionId: string | number, events: Events): Promise<KeyType | undefined>;\n abstract cleanUpSessionEventsStore(sessionId: number, sequenceId: KeyType): Promise<void>;\n\n /**\n * Calculates the character length of a string as size approximation\n * Note: String length closely approximates byte size for most content\n */\n private getStringSize(str: string): number {\n return str.length;\n }\n\n /**\n * Calculates the total character length of events array\n * Accounts for JSON serialization overhead when sent to backend\n */\n private getEventsArraySize(events: Events): number {\n let totalSize = 0;\n for (const event of events) {\n totalSize += this.getStringSize(event);\n }\n\n // Additional overhead from using length instead of byte size\n // - Array brackets: [] = 2 characters\n // - Commas between events: events.length - 1\n // - Double quotes around each event: events.length * 2\n const overhead = 2 + Math.max(0, events.length - 1) + events.length * 2;\n\n return totalSize + overhead;\n }\n\n /**\n * Determines whether to send the events list to the backend and start a new\n * empty events list, based on the size of the list as well as the last time sent\n * @param nextEventString\n * @returns boolean\n */\n shouldSplitEventsList = (events: Events, nextEventString: string): boolean => {\n const sizeOfNextEvent = this.getStringSize(nextEventString);\n const sizeOfEventsList = this.getEventsArraySize(events);\n\n // Check size constraint first (most likely to trigger)\n if (sizeOfEventsList + sizeOfNextEvent >= this.maxPersistedEventsSize) {\n return true;\n }\n if (Date.now() - this.timeAtLastSplit > this.interval && events.length) {\n this.interval = Math.min(this.maxInterval, this.interval + this.minInterval);\n this._timeAtLastSplit = Date.now();\n return true;\n }\n return false;\n };\n}\n","import { SessionReplayRemoteConfig } from '../config/types';\nimport { Events } from '../typings/session-replay';\n\nexport enum RecordingStatus {\n RECORDING = 'recording',\n SENT = 'sent',\n}\n\nexport interface IDBStoreSequence {\n events: Events;\n status: RecordingStatus;\n}\n\ninterface IDBRemoteConfig {\n config: SessionReplayRemoteConfig;\n lastFetchedSessionId: number | undefined;\n}\nexport interface IDBStoreSession {\n currentSequenceId: number;\n sessionSequences: {\n [sequenceId: number]: IDBStoreSequence;\n };\n}\n\nexport interface IDBStore {\n remoteConfig?: IDBRemoteConfig;\n [sessionId: number]: IDBStoreSession;\n}\n","import { STORAGE_PREFIX, getGlobalScope } from '@amplitude/analytics-core';\nimport { DBSchema, IDBPDatabase, openDB } from 'idb';\nimport { STORAGE_FAILURE } from '../messages';\nimport { EventType, Events, SendingSequencesReturn } from '../typings/session-replay';\nimport { BaseEventsStore, InstanceArgs as BaseInstanceArgs } from './base-events-store';\nimport { IDBStore, IDBStoreSession, RecordingStatus } from './legacy-idb-types';\n\nexport const currentSequenceKey = 'sessionCurrentSequence';\nexport const sequencesToSendKey = 'sequencesToSend';\nexport const remoteConfigKey = 'remoteConfig';\n\nexport interface SessionReplayDB extends DBSchema {\n sessionCurrentSequence: {\n key: number;\n value: Omit<SendingSequencesReturn<number>, 'sequenceId'>;\n };\n sequencesToSend: {\n key: number;\n value: Omit<SendingSequencesReturn<number>, 'sequenceId'>;\n indexes: { sessionId: string | number };\n };\n}\n\nexport const keyValDatabaseExists = function (): Promise<IDBDatabase | void> {\n const globalScope = getGlobalScope();\n return new Promise((resolve, reject) => {\n if (!globalScope) {\n return reject(new Error('Global scope not found'));\n }\n\n if (!globalScope.indexedDB) {\n return reject(new Error('Session Replay: cannot find indexedDB'));\n }\n\n try {\n const request = globalScope.indexedDB.open('keyval-store');\n request.onupgradeneeded = function () {\n if (request.result.version === 1) {\n request.result.close();\n request.transaction && request.transaction.abort();\n globalScope.indexedDB.deleteDatabase('keyval-store');\n resolve();\n }\n };\n request.onsuccess = function () {\n resolve(request.result);\n };\n request.onerror = function () {\n reject(request.error);\n };\n } catch (e) {\n reject(e);\n }\n });\n};\n\nconst batchPromiseAll = async (promiseBatch: Promise<any>[]) => {\n while (promiseBatch.length > 0) {\n const chunkSize = 10;\n const batch = promiseBatch.splice(0, chunkSize);\n await Promise.all(batch);\n }\n};\n\nexport const defineObjectStores = (db: IDBPDatabase<SessionReplayDB>) => {\n let sequencesStore;\n let currentSequenceStore;\n if (!db.objectStoreNames.contains(currentSequenceKey)) {\n currentSequenceStore = db.createObjectStore(currentSequenceKey, {\n keyPath: 'sessionId',\n });\n }\n if (!db.objectStoreNames.contains(sequencesToSendKey)) {\n sequencesStore = db.createObjectStore(sequencesToSendKey, {\n keyPath: 'sequenceId',\n autoIncrement: true,\n });\n sequencesStore.createIndex('sessionId', 'sessionId');\n }\n return {\n sequencesStore,\n currentSequenceStore,\n };\n};\n\nexport const createStore = async (dbName: string) => {\n return await openDB<SessionReplayDB>(dbName, 1, {\n upgrade: defineObjectStores,\n });\n};\n\ntype InstanceArgs = {\n apiKey: string;\n db: IDBPDatabase<SessionReplayDB>;\n} & BaseInstanceArgs;\n\nexport class SessionReplayEventsIDBStore extends BaseEventsStore<number> {\n private readonly apiKey: string;\n private readonly db: IDBPDatabase<SessionReplayDB>;\n\n constructor(args: InstanceArgs) {\n super(args);\n this.apiKey = args.apiKey;\n this.db = args.db;\n }\n\n static async new(\n type: EventType,\n args: Omit<InstanceArgs, 'db'>,\n sessionId?: string | number,\n ): Promise<SessionReplayEventsIDBStore | undefined> {\n try {\n const dbSuffix = type === 'replay' ? '' : `_${type}`;\n const dbName = `${args.apiKey.substring(0, 10)}_amp_session_replay_events${dbSuffix}`;\n const db = await createStore(dbName);\n const eventsIDBStore = new SessionReplayEventsIDBStore({\n ...args,\n db,\n });\n await eventsIDBStore.transitionFromKeyValStore(sessionId);\n return eventsIDBStore;\n } catch (e) {\n args.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return;\n }\n\n async getCurrentSequenceEvents(sessionId?: number) {\n if (sessionId) {\n const events = await this.db.get('sessionCurrentSequence', sessionId);\n if (!events) {\n return undefined;\n }\n return [events];\n }\n\n const allEvents = [];\n for (const events of await this.db.getAll('sessionCurrentSequence')) {\n allEvents.push(events);\n }\n\n return allEvents;\n }\n\n getSequencesToSend = async (): Promise<SendingSequencesReturn<number>[] | undefined> => {\n try {\n const sequences: SendingSequencesReturn<number>[] = [];\n let cursor = await this.db.transaction('sequencesToSend').store.openCursor();\n while (cursor) {\n const { sessionId, events } = cursor.value;\n sequences.push({\n events,\n sequenceId: cursor.key,\n sessionId,\n });\n cursor = await cursor.continue();\n }\n\n return sequences;\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return undefined;\n };\n\n storeCurrentSequence = async (sessionId: number) => {\n try {\n const currentSequenceData = await this.db.get<'sessionCurrentSequence'>(currentSequenceKey, sessionId);\n if (!currentSequenceData) {\n return undefined;\n }\n\n const sequenceId = await this.db.put<'sequencesToSend'>(sequencesToSendKey, {\n sessionId: sessionId,\n events: currentSequenceData.events,\n });\n\n await this.db.put<'sessionCurrentSequence'>(currentSequenceKey, {\n sessionId,\n events: [],\n });\n\n return {\n ...currentSequenceData,\n sessionId,\n sequenceId,\n };\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return undefined;\n };\n\n addEventToCurrentSequence = async (sessionId: number, event: string) => {\n try {\n const tx = this.db.transaction<'sessionCurrentSequence', 'readwrite'>(currentSequenceKey, 'readwrite');\n const sequenceEvents = await tx.store.get(sessionId);\n if (!sequenceEvents) {\n await tx.store.put({ sessionId, events: [event] });\n return;\n }\n let eventsToSend;\n if (this.shouldSplitEventsList(sequenceEvents.events, event)) {\n eventsToSend = sequenceEvents.events;\n // set store to empty array\n await tx.store.put({ sessionId, events: [event] });\n } else {\n // add event to array\n const updatedEvents = sequenceEvents.events.concat(event);\n await tx.store.put({ sessionId, events: updatedEvents });\n }\n\n await tx.done;\n if (!eventsToSend) {\n return undefined;\n }\n\n const sequenceId = await this.storeSendingEvents(sessionId, eventsToSend);\n\n if (!sequenceId) {\n return undefined;\n }\n\n return {\n events: eventsToSend,\n sessionId,\n sequenceId,\n };\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return undefined;\n };\n\n storeSendingEvents = async (sessionId: number, events: Events) => {\n try {\n const sequenceId = await this.db.put<'sequencesToSend'>(sequencesToSendKey, {\n sessionId: sessionId,\n events: events,\n });\n return sequenceId;\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return undefined;\n };\n\n cleanUpSessionEventsStore = async (_sessionId: number, sequenceId?: number) => {\n if (!sequenceId) {\n return;\n }\n try {\n await this.db.delete<'sequencesToSend'>(sequencesToSendKey, sequenceId);\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n };\n\n transitionFromKeyValStore = async (sessionId?: string | number) => {\n try {\n const keyValDb = await keyValDatabaseExists();\n if (!keyValDb) {\n return;\n }\n\n const transitionCurrentSessionSequences = async (numericSessionId: number, sessionStore: IDBStoreSession) => {\n const currentSessionSequences = sessionStore.sessionSequences;\n const promisesToBatch: Promise<number | SendingSequencesReturn<number> | undefined>[] = [];\n\n Object.keys(currentSessionSequences).forEach((sequenceId) => {\n const numericSequenceId = parseInt(sequenceId, 10);\n const sequence = currentSessionSequences[numericSequenceId];\n if (numericSequenceId === sessionStore.currentSequenceId) {\n const eventAddPromises: Promise<SendingSequencesReturn<number> | undefined>[] = sequence.events.map(\n async (event) => this.addEventToCurrentSequence(numericSessionId, event),\n );\n promisesToBatch.push(...eventAddPromises);\n } else if (sequence.status !== RecordingStatus.SENT) {\n promisesToBatch.push(this.storeSendingEvents(numericSessionId, sequence.events));\n }\n });\n\n await batchPromiseAll(promisesToBatch);\n };\n\n const storageKey = `${STORAGE_PREFIX}_${this.apiKey.substring(0, 10)}`;\n try {\n const getAllRequest = keyValDb.transaction('keyval').objectStore('keyval').getAll(storageKey);\n const transitionPromise = new Promise<void>((resolve) => {\n getAllRequest.onsuccess = async (e) => {\n const storedReplaySessionContextList = e && ((e.target as IDBRequest).result as IDBStore[]);\n const storedReplaySessionContexts = storedReplaySessionContextList && storedReplaySessionContextList[0];\n if (storedReplaySessionContexts) {\n const promisesToBatch: Promise<any>[] = [];\n\n Object.keys(storedReplaySessionContexts).forEach((storedSessionId) => {\n const numericSessionId = parseInt(storedSessionId, 10);\n const oldSessionStore = storedReplaySessionContexts[numericSessionId];\n\n if (sessionId === numericSessionId) {\n promisesToBatch.push(transitionCurrentSessionSequences(numericSessionId, oldSessionStore));\n } else {\n const oldSessionSequences = oldSessionStore.sessionSequences;\n Object.keys(oldSessionSequences).forEach((sequenceId) => {\n const numericSequenceId = parseInt(sequenceId, 10);\n if (oldSessionSequences[numericSequenceId].status !== RecordingStatus.SENT) {\n promisesToBatch.push(\n this.storeSendingEvents(numericSessionId, oldSessionSequences[numericSequenceId].events),\n );\n }\n });\n }\n });\n\n await batchPromiseAll(promisesToBatch);\n }\n resolve();\n };\n });\n\n await transitionPromise;\n const globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.indexedDB.deleteDatabase('keyval-store');\n }\n } catch (e) {\n this.loggerProvider.warn(`Failed to transition session replay events from keyval to new store: ${e as string}`);\n }\n } catch (e) {\n this.loggerProvider.warn(\n `Failed to access keyval store: ${\n e as string\n }. For more information, visit: https://www.docs.developers.amplitude.com/session-replay/sdks/standalone/#indexeddb-best-practices`,\n );\n }\n };\n}\n","import { Events, SendingSequencesReturn } from '../typings/session-replay';\nimport { BaseEventsStore } from './base-events-store';\n\nexport class InMemoryEventsStore extends BaseEventsStore<number> {\n private finalizedSequences: Record<number, { sessionId: string | number; events: string[] }> = {};\n private sequences: Record<string | number, string[]> = {};\n private sequenceId = 0;\n\n private resetCurrentSequence(sessionId: string | number) {\n this.sequences[sessionId] = [];\n }\n\n private addSequence(sessionId: string | number): SendingSequencesReturn<number> {\n const sequenceId = this.sequenceId++;\n const events = [...this.sequences[sessionId]];\n this.finalizedSequences[sequenceId] = { sessionId, events };\n this.resetCurrentSequence(sessionId);\n return { sequenceId, events, sessionId };\n }\n\n async getSequencesToSend(): Promise<SendingSequencesReturn<number>[] | undefined> {\n return Object.entries(this.finalizedSequences).map(([sequenceId, { sessionId, events }]) => ({\n sequenceId: Number(sequenceId),\n sessionId,\n events,\n }));\n }\n\n async storeCurrentSequence(sessionId: string | number): Promise<SendingSequencesReturn<number> | undefined> {\n if (!this.sequences[sessionId]) {\n return undefined;\n }\n return this.addSequence(sessionId);\n }\n\n async addEventToCurrentSequence(\n sessionId: number,\n event: string,\n ): Promise<SendingSequencesReturn<number> | undefined> {\n if (!this.sequences[sessionId]) {\n this.resetCurrentSequence(sessionId);\n }\n\n let sequenceReturn: SendingSequencesReturn<number> | undefined;\n if (this.shouldSplitEventsList(this.sequences[sessionId], event)) {\n sequenceReturn = this.addSequence(sessionId);\n }\n\n this.sequences[sessionId].push(event);\n\n return sequenceReturn;\n }\n\n async storeSendingEvents(sessionId: number, events: Events): Promise<number | undefined> {\n this.finalizedSequences[this.sequenceId] = { sessionId, events };\n\n return this.sequenceId++;\n }\n\n async cleanUpSessionEventsStore(_sessionId: number, sequenceId?: number): Promise<void> {\n if (sequenceId !== undefined) {\n delete this.finalizedSequences[sequenceId];\n }\n }\n}\n","import {\n SessionReplayEventsManager as AmplitudeSessionReplayEventsManager,\n EventsStore,\n EventType,\n StoreType,\n} from '../typings/session-replay';\n\nimport { SessionReplayJoinedConfig } from '../config/types';\nimport { getStorageSize } from '../helpers';\nimport { PayloadBatcher, SessionReplayTrackDestination } from '../track-destination';\nimport { SessionReplayEventsIDBStore } from './events-idb-store';\nimport { InMemoryEventsStore } from './events-memory-store';\n\nexport const createEventsManager = async <Type extends EventType>({\n config,\n sessionId,\n minInterval,\n maxInterval,\n type,\n payloadBatcher,\n storeType,\n}: {\n config: SessionReplayJoinedConfig;\n type: Type;\n minInterval?: number;\n maxInterval?: number;\n sessionId?: string | number;\n payloadBatcher?: PayloadBatcher;\n storeType: StoreType;\n}): Promise<AmplitudeSessionReplayEventsManager<Type, string>> => {\n const trackDestination = new SessionReplayTrackDestination({\n ...config,\n loggerProvider: config.loggerProvider,\n payloadBatcher,\n });\n\n const getMemoryStore = (): EventsStore<number> => {\n return new InMemoryEventsStore({\n loggerProvider: config.loggerProvider,\n maxInterval,\n minInterval,\n });\n };\n\n const getIdbStoreOrFallback = async (): Promise<EventsStore<number>> => {\n const store = await SessionReplayEventsIDBStore.new(\n type,\n {\n loggerProvider: config.loggerProvider,\n minInterval,\n maxInterval,\n apiKey: config.apiKey,\n },\n sessionId,\n );\n config.loggerProvider.log('Failed to initialize idb store, falling back to memory store.');\n return store ?? getMemoryStore();\n };\n\n const store: EventsStore<number> = storeType === 'idb' ? await getIdbStoreOrFallback() : getMemoryStore();\n\n /**\n * Immediately sends events to the track destination.\n */\n const sendEventsList = ({\n events,\n sessionId,\n deviceId,\n sequenceId,\n }: {\n events: string[];\n sessionId: string | number;\n deviceId: string;\n sequenceId?: number;\n }) => {\n if (config.debugMode) {\n getStorageSize()\n .then(({ totalStorageSize, percentOfQuota, usageDetails }) => {\n config.loggerProvider.debug(\n `Total storage size: ${totalStorageSize} KB, percentage of quota: ${percentOfQuota}%, usage details: ${usageDetails}`,\n );\n })\n .catch(() => {\n // swallow error\n });\n }\n\n trackDestination.sendEventsList({\n events: events,\n sessionId: sessionId,\n flushMaxRetries: config.flushMaxRetries,\n apiKey: config.apiKey,\n deviceId: deviceId,\n sampleRate: config.sampleRate,\n serverZone: config.serverZone,\n version: config.version,\n type,\n onComplete: async () => {\n await store.cleanUpSessionEventsStore(sessionId, sequenceId);\n return;\n },\n });\n };\n\n const sendCurrentSequenceEvents = ({ sessionId, deviceId }: { sessionId: number; deviceId: string }) => {\n store\n .storeCurrentSequence(sessionId)\n .then((currentSequence) => {\n if (currentSequence) {\n sendEventsList({\n sequenceId: currentSequence.sequenceId,\n events: currentSequence.events,\n sessionId: currentSequence.sessionId,\n deviceId,\n });\n }\n })\n .catch((e) => {\n config.loggerProvider.warn('Failed to get current sequence of session replay events for session:', e);\n });\n };\n\n const sendStoredEvents = async ({ deviceId }: { deviceId: string }) => {\n const sequencesToSend = await store.getSequencesToSend();\n sequencesToSend &&\n sequencesToSend.forEach((sequence) => {\n sendEventsList({\n sequenceId: sequence.sequenceId,\n events: sequence.events,\n sessionId: sequence.sessionId,\n deviceId,\n });\n });\n };\n\n const addEvent = ({\n event,\n sessionId,\n deviceId,\n }: {\n event: { type: Type; data: string };\n sessionId: number;\n deviceId: string;\n }) => {\n store\n .addEventToCurrentSequence(sessionId, event.data)\n .then((sequenceToSend) => {\n return (\n sequenceToSend &&\n sendEventsList({\n sequenceId: sequenceToSend.sequenceId,\n events: sequenceToSend.events,\n sessionId: sequenceToSend.sessionId,\n deviceId,\n })\n );\n })\n .catch((e) => {\n config.loggerProvider.warn('Failed to add event to session replay capture:', e);\n });\n };\n\n async function flush(useRetry = false) {\n return trackDestination.flush(useRetry);\n }\n\n return {\n sendCurrentSequenceEvents,\n addEvent,\n sendStoredEvents,\n flush,\n };\n};\n","import {\n SessionReplayEventsManager as AmplitudeSessionReplayEventsManager,\n EventsManagerWithType,\n} from '../typings/session-replay';\n\n/**\n * \"Registers\" events managers internally. When an event is added this class routes the event to the correct\n * manager. For all send or flush methods this will invoke the event for all registered managers.\n */\nexport class MultiEventManager<EventType, EventDataType>\n implements AmplitudeSessionReplayEventsManager<EventType, EventDataType>\n{\n private managers: Map<EventType, AmplitudeSessionReplayEventsManager<EventType, EventDataType>>;\n\n constructor(...managers: EventsManagerWithType<EventType, EventDataType>[]) {\n const managersMap = new Map<EventType, AmplitudeSessionReplayEventsManager<EventType, EventDataType>>();\n managers.forEach((t) => {\n managersMap.set(t.name, t.manager);\n });\n this.managers = managersMap;\n }\n\n async sendStoredEvents(opts: { deviceId: string }): Promise<void> {\n const promises: Promise<void>[] = [];\n this.managers.forEach((manager) => {\n promises.push(manager.sendStoredEvents(opts));\n });\n await Promise.all(promises);\n }\n\n addEvent({\n sessionId,\n event,\n deviceId,\n }: {\n sessionId: number;\n event: { type: EventType; data: EventDataType };\n deviceId: string;\n }): void {\n this.managers.get(event.type)?.addEvent({ sessionId, event, deviceId });\n }\n\n sendCurrentSequenceEvents({ sessionId, deviceId }: { sessionId: number; deviceId: string }): void {\n this.managers.forEach((manager) => {\n manager.sendCurrentSequenceEvents({ sessionId, deviceId });\n });\n }\n\n async flush(useRetry?: boolean | undefined): Promise<void> {\n const promises: Promise<void>[] = [];\n this.managers.forEach((manager) => {\n promises.push(manager.flush(useRetry));\n });\n await Promise.all(promises);\n }\n}\n","const testableAccessors = {\n Node: [\"childNodes\", \"parentNode\", \"parentElement\", \"textContent\"],\n ShadowRoot: [\"host\", \"styleSheets\"],\n Element: [\"shadowRoot\", \"querySelector\", \"querySelectorAll\"],\n MutationObserver: []\n};\nconst testableMethods = {\n Node: [\"contains\", \"getRootNode\"],\n ShadowRoot: [\"getSelection\"],\n Element: [],\n MutationObserver: [\"constructor\"]\n};\nconst untaintedBasePrototype = {};\nfunction angularZoneUnpatchedAlternative(key) {\n var _a, _b;\n const angularUnpatchedVersionSymbol = (_b = (_a = globalThis == null ? void 0 : globalThis.Zone) == null ? void 0 : _a.__symbol__) == null ? void 0 : _b.call(_a, key);\n if (angularUnpatchedVersionSymbol && globalThis[angularUnpatchedVersionSymbol]) {\n return globalThis[angularUnpatchedVersionSymbol];\n } else {\n return void 0;\n }\n}\nfunction getUntaintedPrototype(key) {\n if (untaintedBasePrototype[key])\n return untaintedBasePrototype[key];\n const candidate = angularZoneUnpatchedAlternative(key) || globalThis[key];\n const defaultPrototype = candidate.prototype;\n const accessorNames = key in testableAccessors ? testableAccessors[key] : void 0;\n const isUntaintedAccessors = Boolean(\n accessorNames && // @ts-expect-error 2345\n accessorNames.every(\n (accessor) => {\n var _a, _b;\n return Boolean(\n (_b = (_a = Object.getOwnPropertyDescriptor(defaultPrototype, accessor)) == null ? void 0 : _a.get) == null ? void 0 : _b.toString().includes(\"[native code]\")\n );\n }\n )\n );\n const methodNames = key in testableMethods ? testableMethods[key] : void 0;\n const isUntaintedMethods = Boolean(\n methodNames && methodNames.every(\n // @ts-expect-error 2345\n (method) => {\n var _a;\n return typeof defaultPrototype[method] === \"function\" && ((_a = defaultPrototype[method]) == null ? void 0 : _a.toString().includes(\"[native code]\"));\n }\n )\n );\n if (isUntaintedAccessors && isUntaintedMethods) {\n untaintedBasePrototype[key] = candidate.prototype;\n return candidate.prototype;\n }\n try {\n const iframeEl = document.createElement(\"iframe\");\n document.body.appendChild(iframeEl);\n const win = iframeEl.contentWindow;\n if (!win) return candidate.prototype;\n const untaintedObject = win[key].prototype;\n document.body.removeChild(iframeEl);\n if (!untaintedObject) return defaultPrototype;\n return untaintedBasePrototype[key] = untaintedObject;\n } catch {\n return defaultPrototype;\n }\n}\nconst untaintedAccessorCache = {};\nfunction getUntaintedAccessor(key, instance, accessor) {\n var _a;\n const cacheKey = `${key}.${String(accessor)}`;\n if (untaintedAccessorCache[cacheKey])\n return untaintedAccessorCache[cacheKey].call(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedAccessor = (_a = Object.getOwnPropertyDescriptor(\n untaintedPrototype,\n accessor\n )) == null ? void 0 : _a.get;\n if (!untaintedAccessor) return instance[accessor];\n untaintedAccessorCache[cacheKey] = untaintedAccessor;\n return untaintedAccessor.call(instance);\n}\nconst untaintedMethodCache = {};\nfunction getUntaintedMethod(key, instance, method) {\n const cacheKey = `${key}.${String(method)}`;\n if (untaintedMethodCache[cacheKey])\n return untaintedMethodCache[cacheKey].bind(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedMethod = untaintedPrototype[method];\n if (typeof untaintedMethod !== \"function\") return instance[method];\n untaintedMethodCache[cacheKey] = untaintedMethod;\n return untaintedMethod.bind(instance);\n}\nfunction childNodes(n) {\n return getUntaintedAccessor(\"Node\", n, \"childNodes\");\n}\nfunction parentNode(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentNode\");\n}\nfunction parentElement(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentElement\");\n}\nfunction textContent(n) {\n return getUntaintedAccessor(\"Node\", n, \"textContent\");\n}\nfunction contains(n, other) {\n return getUntaintedMethod(\"Node\", n, \"contains\")(other);\n}\nfunction getRootNode(n) {\n return getUntaintedMethod(\"Node\", n, \"getRootNode\")();\n}\nfunction host(n) {\n if (!n || !(\"host\" in n)) return null;\n return getUntaintedAccessor(\"ShadowRoot\", n, \"host\");\n}\nfunction styleSheets(n) {\n return n.styleSheets;\n}\nfunction shadowRoot(n) {\n if (!n || !(\"shadowRoot\" in n)) return null;\n return getUntaintedAccessor(\"Element\", n, \"shadowRoot\");\n}\nfunction querySelector(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelector\")(selectors);\n}\nfunction querySelectorAll(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelectorAll\")(selectors);\n}\nfunction mutationObserverCtor() {\n return getUntaintedPrototype(\"MutationObserver\").constructor;\n}\nconst index = {\n childNodes,\n parentNode,\n parentElement,\n textContent,\n contains,\n getRootNode,\n host,\n styleSheets,\n shadowRoot,\n querySelector,\n querySelectorAll,\n mutationObserver: mutationObserverCtor\n};\nexport {\n childNodes,\n contains,\n index as default,\n getRootNode,\n getUntaintedAccessor,\n getUntaintedMethod,\n getUntaintedPrototype,\n host,\n mutationObserverCtor,\n parentElement,\n parentNode,\n querySelector,\n querySelectorAll,\n shadowRoot,\n styleSheets,\n textContent\n};\n//# sourceMappingURL=rrweb-utils.js.map\n","import { getGlobalScope } from '@amplitude/analytics-core';\nimport dom from '@amplitude/rrweb-utils';\nimport type { eventWithTime, scrollCallback } from '@amplitude/rrweb-types';\n\n// These functions are not exposed in rrweb package, so we will define it here to use\n// Ignoring this function since this is copied from rrweb\n/* istanbul ignore next */\nexport function getWindowScroll(win: Window) {\n const doc = win.document;\n return {\n left: doc.scrollingElement\n ? doc.scrollingElement.scrollLeft\n : win.pageXOffset !== undefined\n ? win.pageXOffset\n : doc.documentElement.scrollLeft ||\n (doc?.body && dom.parentElement(doc.body)?.scrollLeft) ||\n doc?.body?.scrollLeft ||\n 0,\n top: doc.scrollingElement\n ? doc.scrollingElement.scrollTop\n : win.pageYOffset !== undefined\n ? win.pageYOffset\n : doc?.documentElement.scrollTop ||\n (doc?.body && dom.parentElement(doc.body)?.scrollTop) ||\n doc?.body?.scrollTop ||\n 0,\n };\n}\n\nexport function getWindowHeight(): number {\n const globalScope = getGlobalScope();\n return (\n globalScope?.innerHeight ||\n (document.documentElement && document.documentElement.clientHeight) ||\n (document.body && document.body.clientHeight) ||\n 0\n );\n}\n\nexport function getWindowWidth(): number {\n const globalScope = getGlobalScope();\n return (\n globalScope?.innerWidth ||\n (document.documentElement && document.documentElement.clientWidth) ||\n (document.body && document.body.clientWidth) ||\n 0\n );\n}\n\nexport type Mirror = {\n getNode: (id: number) => Node | null;\n};\n\nexport type RecordFunction = {\n (options: {\n emit: (event: eventWithTime) => void;\n inlineStylesheet?: boolean;\n hooks?: {\n mouseInteraction?: any;\n scroll?: scrollCallback;\n };\n maskAllInputs?: boolean;\n maskTextClass?: string;\n blockClass?: string;\n blockSelector?: string;\n maskInputFn?: (text: string, element: HTMLElement | null) => string;\n maskTextFn?: (text: string, element: HTMLElement | null) => string;\n maskTextSelector?: string;\n recordCanvas?: boolean;\n slimDOMOptions?: {\n script?: boolean;\n comment?: boolean;\n };\n errorHandler?: (error: unknown) => boolean;\n plugins?: any[];\n applyBackgroundColorToBlockedElements?: boolean;\n }): (() => void) | undefined;\n addCustomEvent: (eventName: string, eventData: any) => void;\n mirror: Mirror;\n};\n","/* istanbul ignore file */\n\n// DO NOT EDIT (unless you know what you're doing)\n// Taken directly from git@github.com:antonmedv/finder.git@77d33158440dfffee4a300d2975b43a5283004ab\n\n/* eslint-disable @typescript-eslint/no-unnecessary-type-assertion */\n/* eslint-disable prefer-const */\n\n// License: MIT\n// Author: Anton Medvedev <anton@medv.io>\n// Source: https://github.com/antonmedv/finder\n\ntype Knot = {\n name: string;\n penalty: number;\n level?: number;\n};\n\ntype Path = Knot[];\n\nexport type Options = {\n root: Element;\n idName: (name: string) => boolean;\n className: (name: string) => boolean;\n tagName: (name: string) => boolean;\n attr: (name: string, value: string) => boolean;\n seedMinLength: number;\n optimizedMinLength: number;\n threshold: number;\n maxNumberOfTries: number;\n timeoutMs: number | undefined;\n};\n\nlet config: Options;\nlet rootDocument: Document | Element;\nlet start: Date;\n\nexport function finder(input: Element, options?: Partial<Options>): string {\n start = new Date();\n if (input.nodeType !== Node.ELEMENT_NODE) {\n throw new Error(`Can't generate CSS selector for non-element node type.`);\n }\n if ('html' === input.tagName.toLowerCase()) {\n return 'html';\n }\n const defaults: Options = {\n root: document.body,\n idName: (_name: string) => true,\n className: (_name: string) => true,\n tagName: (_name: string) => true,\n attr: (_name: string, _value: string) => false,\n seedMinLength: 1,\n optimizedMinLength: 2,\n threshold: 1000,\n maxNumberOfTries: 10000,\n timeoutMs: undefined,\n };\n\n config = { ...defaults, ...options };\n rootDocument = findRootDocument(config.root, defaults);\n\n let path = bottomUpSearch(input, 'all', () =>\n bottomUpSearch(input, 'two', () => bottomUpSearch(input, 'one', () => bottomUpSearch(input, 'none'))),\n );\n\n if (path) {\n const optimized = sort(optimize(path, input));\n if (optimized.length > 0) {\n path = optimized[0];\n }\n return selector(path);\n } else {\n throw new Error(`Selector was not found.`);\n }\n}\n\nfunction findRootDocument(rootNode: Element | Document, defaults: Options) {\n if (rootNode.nodeType === Node.DOCUMENT_NODE) {\n return rootNode;\n }\n if (rootNode === defaults.root) {\n return rootNode.ownerDocument as Document;\n }\n return rootNode;\n}\n\nfunction bottomUpSearch(\n input: Element,\n limit: 'all' | 'two' | 'one' | 'none',\n fallback?: () => Path | null,\n): Path | null {\n let path: Path | null = null;\n let stack: Knot[][] = [];\n let current: Element | null = input;\n let i = 0;\n while (current) {\n const elapsedTime = new Date().getTime() - start.getTime();\n if (config.timeoutMs !== undefined && elapsedTime > config.timeoutMs) {\n throw new Error(`Timeout: Can't find a unique selector after ${elapsedTime}ms`);\n }\n let level: Knot[] = maybe(id(current)) ||\n maybe(...attr(current)) ||\n maybe(...classNames(current)) ||\n maybe(tagName(current)) || [any()];\n const nth = index(current);\n if (limit == 'all') {\n if (nth) {\n level = level.concat(level.filter(dispensableNth).map((node) => nthChild(node, nth)));\n }\n } else if (limit == 'two') {\n level = level.slice(0, 1);\n if (nth) {\n level = level.concat(level.filter(dispensableNth).map((node) => nthChild(node, nth)));\n }\n } else if (limit == 'one') {\n const [node] = (level = level.slice(0, 1));\n if (nth && dispensableNth(node)) {\n level = [nthChild(node, nth)];\n }\n } else if (limit == 'none') {\n level = [any()];\n if (nth) {\n level = [nthChild(level[0], nth)];\n }\n }\n for (let node of level) {\n node.level = i;\n }\n stack.push(level);\n if (stack.length >= config.seedMinLength) {\n path = findUniquePath(stack, fallback);\n if (path) {\n break;\n }\n }\n current = current.parentElement;\n i++;\n }\n if (!path) {\n path = findUniquePath(stack, fallback);\n }\n if (!path && fallback) {\n return fallback();\n }\n return path;\n}\n\nfunction findUniquePath(stack: Knot[][], fallback?: () => Path | null): Path | null {\n const paths = sort(combinations(stack));\n if (paths.length > config.threshold) {\n return fallback ? fallback() : null;\n }\n for (let candidate of paths) {\n if (unique(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nfunction selector(path: Path): string {\n let node = path[0];\n let query = node.name;\n for (let i = 1; i < path.length; i++) {\n const level = path[i].level || 0;\n if (node.level === level - 1) {\n query = `${path[i].name} > ${query}`;\n } else {\n query = `${path[i].name} ${query}`;\n }\n node = path[i];\n }\n return query;\n}\n\nfunction penalty(path: Path): number {\n return path.map((node) => node.penalty).reduce((acc, i) => acc + i, 0);\n}\n\nfunction unique(path: Path) {\n const css = selector(path);\n switch (rootDocument.querySelectorAll(css).length) {\n case 0:\n throw new Error(`Can't select any node with this selector: ${css}`);\n case 1:\n return true;\n default:\n return false;\n }\n}\n\nfunction id(input: Element): Knot | null {\n const elementId = input.getAttribute('id');\n if (elementId && config.idName(elementId)) {\n return {\n name: '#' + CSS.escape(elementId),\n penalty: 0,\n };\n }\n return null;\n}\n\nfunction attr(input: Element): Knot[] {\n const attrs = Array.from(input.attributes).filter((attr) => config.attr(attr.name, attr.value));\n return attrs.map(\n (attr): Knot => ({\n name: `[${CSS.escape(attr.name)}=\"${CSS.escape(attr.value)}\"]`,\n penalty: 0.5,\n }),\n );\n}\n\nfunction classNames(input: Element): Knot[] {\n const names = Array.from(input.classList).filter(config.className);\n return names.map(\n (name): Knot => ({\n name: '.' + CSS.escape(name),\n penalty: 1,\n }),\n );\n}\n\nfunction tagName(input: Element): Knot | null {\n const name = input.tagName.toLowerCase();\n if (config.tagName(name)) {\n return {\n name,\n penalty: 2,\n };\n }\n return null;\n}\n\nfunction any(): Knot {\n return {\n name: '*',\n penalty: 3,\n };\n}\n\nfunction index(input: Element): number | null {\n const parent = input.parentNode;\n if (!parent) {\n return null;\n }\n let child = parent.firstChild;\n if (!child) {\n return null;\n }\n let i = 0;\n while (child) {\n if (child.nodeType === Node.ELEMENT_NODE) {\n i++;\n }\n if (child === input) {\n break;\n }\n child = child.nextSibling;\n }\n return i;\n}\n\nfunction nthChild(node: Knot, i: number): Knot {\n return {\n name: node.name + `:nth-child(${i})`,\n penalty: node.penalty + 1,\n };\n}\n\nfunction dispensableNth(node: Knot) {\n return node.name !== 'html' && !node.name.startsWith('#');\n}\n\nfunction maybe(...level: (Knot | null)[]): Knot[] | null {\n const list = level.filter(notEmpty);\n if (list.length > 0) {\n return list;\n }\n return null;\n}\n\nfunction notEmpty<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}\n\nfunction* combinations(stack: Knot[][], path: Knot[] = []): Generator<Knot[]> {\n if (stack.length > 0) {\n for (let node of stack[0]) {\n yield* combinations(stack.slice(1, stack.length), path.concat(node));\n }\n } else {\n yield path;\n }\n}\n\nfunction sort(paths: Iterable<Path>): Path[] {\n return [...paths].sort((a, b) => penalty(a) - penalty(b));\n}\n\ntype Scope = {\n counter: number;\n visited: Map<string, boolean>;\n};\n\nfunction* optimize(\n path: Path,\n input: Element,\n scope: Scope = {\n counter: 0,\n visited: new Map<string, boolean>(),\n },\n): Generator<Knot[]> {\n if (path.length > 2 && path.length > config.optimizedMinLength) {\n for (let i = 1; i < path.length - 1; i++) {\n if (scope.counter > config.maxNumberOfTries) {\n return; // Okay At least I tried!\n }\n scope.counter += 1;\n const newPath = [...path];\n newPath.splice(i, 1);\n const newPathKey = selector(newPath);\n if (scope.visited.has(newPathKey)) {\n return;\n }\n if (unique(newPath) && same(newPath, input)) {\n yield newPath;\n scope.visited.set(newPathKey, true);\n yield* optimize(newPath, input, scope);\n }\n }\n }\n}\n\nfunction same(path: Path, input: Element) {\n return rootDocument.querySelector(selector(path)) === input;\n}\n","import type { mouseInteractionCallBack } from '@amplitude/rrweb-types';\nimport { MouseInteractions } from '@amplitude/rrweb-types';\nimport { getWindowScroll, Mirror } from '../utils/rrweb';\nimport { SessionReplayEventsManager as AmplitudeSessionReplayEventsManager } from '../typings/session-replay';\nimport { PayloadBatcher } from 'src/track-destination';\nimport { finder } from '../libs/finder';\nimport { getGlobalScope, ILogger } from '@amplitude/analytics-core';\nimport { UGCFilterRule } from 'src/config/types';\nimport { getPageUrl } from '../helpers';\n\n// exported for testing\nexport type ClickEvent = {\n timestamp: number;\n x: number;\n y: number;\n viewportWidth: number;\n viewportHeight: number;\n pageUrl: string;\n selector?: string;\n type: 'click';\n};\n\n// exported for testing\nexport type ClickEventWithCount = ClickEvent & { count: number };\n\ntype Options = {\n sessionId: string | number;\n deviceIdFn: () => string | undefined;\n eventsManager: AmplitudeSessionReplayEventsManager<'interaction', string>;\n mirror: Mirror;\n ugcFilterRules: UGCFilterRule[];\n};\n\nconst HOUR_IN_MILLISECONDS = 3_600_000;\n\nexport const clickNonBatcher: PayloadBatcher = ({ version, events }) => {\n const clickEvents: ClickEvent[] = [];\n events.forEach((evt: string) => {\n const record = JSON.parse(evt) as Record<string, unknown>;\n record.count = 1;\n if (record.type === 'click') {\n clickEvents.push(record as ClickEvent);\n }\n });\n return { version, events: clickEvents };\n};\n\nexport const clickBatcher: PayloadBatcher = ({ version, events }) => {\n const clickEvents: ClickEvent[] = [];\n events.forEach((evt: string) => {\n const record = JSON.parse(evt) as Record<string, unknown>;\n if (record.type === 'click') {\n clickEvents.push(record as ClickEvent);\n }\n });\n\n const reduced = clickEvents.reduce<Record<string, ClickEventWithCount>>((prev, curr) => {\n const { x, y, selector, timestamp } = curr;\n\n // round down to nearest hour.\n const hour = timestamp - (timestamp % HOUR_IN_MILLISECONDS);\n\n const k = `${x}:${y}:${selector ?? ''}:${hour}`;\n if (!prev[k]) {\n prev[k] = { ...curr, timestamp: hour, count: 1 };\n } else {\n prev[k].count += 1;\n }\n return prev;\n }, {});\n\n return { version, events: Object.values(reduced) };\n};\n\nexport const clickHook: (logger: ILogger, options: Options) => mouseInteractionCallBack =\n (logger, { eventsManager, sessionId, deviceIdFn, mirror, ugcFilterRules }) =>\n (e) => {\n if (e.type !== MouseInteractions.Click) {\n return;\n }\n\n const globalScope = getGlobalScope();\n if (!globalScope) {\n return;\n }\n\n const { location, innerHeight, innerWidth } = globalScope;\n // it only makes sense to send events if a pageUrl exists\n if (!location) {\n return;\n }\n\n const { x, y } = e;\n if (x === undefined || y === undefined) {\n return;\n }\n\n const node = mirror.getNode(e.id);\n let selector;\n if (node) {\n try {\n selector = finder(node as Element);\n } catch (err) {\n logger.debug('error resolving selector from finder');\n }\n }\n\n const { left: scrollX, top: scrollY } = getWindowScroll(globalScope as unknown as Window);\n\n const pageUrl = getPageUrl(location.href, ugcFilterRules);\n\n const event: ClickEvent = {\n x: x + scrollX,\n y: y + scrollY,\n selector,\n\n viewportHeight: innerHeight,\n viewportWidth: innerWidth,\n pageUrl,\n timestamp: Date.now(),\n type: 'click',\n };\n const deviceId = deviceIdFn();\n if (deviceId) {\n eventsManager.addEvent({ sessionId, event: { type: 'interaction', data: JSON.stringify(event) }, deviceId });\n }\n };\n","import { getGlobalScope } from '@amplitude/analytics-core';\nimport { SessionReplayJoinedConfig } from './config/types';\nimport { SessionReplayDestinationSessionMetadata } from './typings/session-replay';\nimport { getServerUrl } from './helpers';\n\ntype BeaconSendFn<T> = (pageUrl: string, payload: T) => boolean;\n\n/**\n * For very small payloads it's preferable to use the [Beacon API](https://developer.mozilla.org/en-US/docs/Web/API/Beacon_API).\n * While it doesn't provide 100% guarantees on sends, it greatly helps with overall reliability and page load performance. As\n * the Beacon API has a potential to fail due to size constraints we want to fall back to XHR if need be. This is mostly to\n * be used with 'pagehide' or 'beforeunload' events.\n *\n * Note there are only 3 CORS safelisted Content-Types you can send:\n *\n * - application/x-www-form-urlencoded\n * - multipart/form-data\n * - text/plain\n *\n * If we do not send one of these, some browsers like Chrome may not send this at all. Also we incur the overhead of a preflight\n * request. In our case we will add no additional content-type header. If you are trying to ping a server that requires this\n * header, you may want to use the regular fetch API or a different mechanism.\n */\nexport class BeaconTransport<T> {\n private sendBeacon: BeaconSendFn<T>;\n private sendXhr: BeaconSendFn<T>;\n private readonly basePageUrl: string;\n private readonly context: Omit<SessionReplayDestinationSessionMetadata, 'deviceId'>;\n private readonly apiKey: string;\n\n constructor(context: Omit<SessionReplayDestinationSessionMetadata, 'deviceId'>, config: SessionReplayJoinedConfig) {\n const globalScope = getGlobalScope();\n if (globalScope && globalScope.navigator && typeof globalScope.navigator.sendBeacon === 'function') {\n this.sendBeacon = (pageUrl, payload) => {\n try {\n if (globalScope.navigator.sendBeacon(pageUrl, JSON.stringify(payload))) {\n return true;\n }\n } catch (e) {\n // not logging error, since it would be hard to view and just adds overhead.\n }\n return false;\n };\n } else {\n this.sendBeacon = () => false;\n }\n\n this.sendXhr = (pageUrl, payload) => {\n const xhr = new XMLHttpRequest();\n xhr.open('POST', pageUrl, true);\n xhr.setRequestHeader('Accept', '*/*');\n xhr.send(JSON.stringify(payload));\n return true;\n };\n\n this.basePageUrl = getServerUrl(config.serverZone, config.trackServerUrl);\n this.apiKey = config.apiKey;\n this.context = context;\n }\n\n send(deviceId: string, payload: T) {\n const { sessionId, type } = this.context;\n const urlParams = new URLSearchParams({\n device_id: deviceId,\n session_id: String(sessionId),\n type: String(type),\n api_key: this.apiKey,\n });\n\n const pageUrl = `${this.basePageUrl}?${urlParams.toString()}`;\n\n // ideally send using the beacon API, but there is a chance it may fail, possibly due to a payload\n // size limit. in this case, try best effort to send using xhr.\n this.sendBeacon(pageUrl, payload) || this.sendXhr(pageUrl, payload);\n }\n}\n","import { getWindowHeight, getWindowWidth } from '../utils/rrweb';\nimport type { scrollCallback, scrollPosition } from '@amplitude/rrweb-types';\nimport { BeaconTransport } from '../beacon-transport';\nimport { getGlobalScope } from '@amplitude/analytics-core';\nimport { SessionReplayJoinedConfig } from '../config/types';\nimport { SessionReplayDestinationSessionMetadata } from '../typings/session-replay';\nimport { getPageUrl } from '../helpers';\n\nexport type ScrollEvent = {\n timestamp: number; // Timestamp the event occurred\n maxScrollX: number; // Max window scroll X on a page\n maxScrollY: number; // Max window scroll Y on a page\n maxScrollHeight: number; // Max window scroll Y + window height on a page\n maxScrollWidth: number; // Max window scroll X + window width on a page\n viewportWidth: number;\n viewportHeight: number;\n pageUrl: string;\n type: 'scroll';\n};\n\nexport type ScrollEventPayload = { version: number; events: ScrollEvent[] };\n\n/**\n * This is intended to watch and update max scroll activity when loaded for a particular page.\n * A new instance should be created if the page URL changes, since by default it does not reset\n * it's max scroll state. It is intended to send very few and very small events utilizing the\n * Beacon API.\n * @see {@link BeaconTransport} for more details on Beacon API usage.\n */\nexport class ScrollWatcher {\n private timestamp = Date.now();\n private _maxScrollX: number;\n private _maxScrollY: number;\n private _maxScrollWidth: number;\n private _maxScrollHeight: number;\n private readonly transport: BeaconTransport<ScrollEventPayload>;\n private readonly config: Pick<SessionReplayJoinedConfig, 'loggerProvider' | 'interactionConfig'>;\n\n static default(\n context: Omit<SessionReplayDestinationSessionMetadata, 'deviceId'>,\n config: SessionReplayJoinedConfig,\n ): ScrollWatcher {\n return new ScrollWatcher(new BeaconTransport<ScrollEventPayload>(context, config), config);\n }\n\n constructor(\n transport: BeaconTransport<ScrollEventPayload>,\n config: Pick<SessionReplayJoinedConfig, 'loggerProvider' | 'interactionConfig'>,\n ) {\n this._maxScrollX = 0;\n this._maxScrollY = 0;\n this._maxScrollWidth = getWindowWidth();\n this._maxScrollHeight = getWindowHeight();\n this.config = config;\n\n this.transport = transport;\n }\n\n public get maxScrollX(): number {\n return this._maxScrollX;\n }\n\n public get maxScrollY(): number {\n return this._maxScrollY;\n }\n\n public get maxScrollWidth(): number {\n return this._maxScrollWidth;\n }\n\n public get maxScrollHeight(): number {\n return this._maxScrollHeight;\n }\n\n update(e: scrollPosition) {\n const now = Date.now();\n if (e.x > this._maxScrollX) {\n const width = getWindowWidth();\n this._maxScrollX = e.x;\n const maxScrollWidth = e.x + width;\n if (maxScrollWidth > this._maxScrollWidth) {\n this._maxScrollWidth = maxScrollWidth;\n }\n this.timestamp = now;\n }\n\n if (e.y > this._maxScrollY) {\n const height = getWindowHeight();\n this._maxScrollY = e.y;\n const maxScrollHeight = e.y + height;\n if (maxScrollHeight > this._maxScrollHeight) {\n this._maxScrollHeight = maxScrollHeight;\n }\n this.timestamp = now;\n }\n }\n\n hook: scrollCallback = (e: scrollPosition) => {\n this.update(e);\n };\n\n send: (deviceIdFn: () => string | undefined) => (_: PageTransitionEvent | Event) => void = (deviceIdFn) => (_) => {\n const deviceId = deviceIdFn();\n const globalScope = getGlobalScope();\n if (globalScope && deviceId) {\n this.transport.send(deviceId, {\n version: 1,\n events: [\n {\n maxScrollX: this._maxScrollX,\n maxScrollY: this._maxScrollY,\n maxScrollWidth: this._maxScrollWidth,\n maxScrollHeight: this._maxScrollHeight,\n\n viewportHeight: getWindowHeight(),\n viewportWidth: getWindowWidth(),\n pageUrl: getPageUrl(globalScope.location.href, this.config.interactionConfig?.ugcFilterRules ?? []),\n timestamp: this.timestamp,\n type: 'scroll',\n },\n ],\n });\n }\n };\n}\n","import { generateSessionReplayId } from './helpers';\nimport { SessionIdentifiers as ISessionIdentifiers } from './typings/session-replay';\n\nexport class SessionIdentifiers implements ISessionIdentifiers {\n deviceId?: string;\n sessionId?: string | number;\n sessionReplayId?: string;\n\n constructor({ sessionId, deviceId }: { sessionId?: string | number; deviceId?: string }) {\n this.deviceId = deviceId;\n this.sessionId = sessionId;\n\n if (sessionId && deviceId) {\n this.sessionReplayId = generateSessionReplayId(sessionId, deviceId);\n }\n }\n}\n","import { Logger as ILogger } from '@amplitude/analytics-types';\nimport { DBSchema, IDBPDatabase, openDB } from 'idb';\n\nexport const MAX_IDB_STORAGE_LENGTH = 1000 * 60 * 60 * 24 * 2; // 2 days\n\nexport interface SessionReplayTargetingDB extends DBSchema {\n sessionTargetingMatch: {\n key: string;\n value: {\n sessionId: string;\n targetingMatch: boolean;\n lastUpdated: number;\n };\n };\n}\n\nexport class TargetingIDBStore {\n dbs: { [apiKey: string]: IDBPDatabase<SessionReplayTargetingDB> } = {};\n\n createStore = async (dbName: string) => {\n return await openDB<SessionReplayTargetingDB>(dbName, 1, {\n upgrade: (db: IDBPDatabase<SessionReplayTargetingDB>) => {\n if (!db.objectStoreNames.contains('sessionTargetingMatch')) {\n db.createObjectStore('sessionTargetingMatch', {\n keyPath: 'sessionId',\n });\n }\n },\n });\n };\n\n openOrCreateDB = async (apiKey: string) => {\n if (this.dbs && this.dbs[apiKey]) {\n return this.dbs[apiKey];\n }\n const dbName = `${apiKey.substring(0, 10)}_amp_session_replay_targeting`;\n const db = await this.createStore(dbName);\n this.dbs[apiKey] = db;\n return db;\n };\n\n getTargetingMatchForSession = async ({\n loggerProvider,\n apiKey,\n sessionId,\n }: {\n loggerProvider: ILogger;\n apiKey: string;\n sessionId: string | number;\n }) => {\n try {\n const db = await this.openOrCreateDB(apiKey);\n const sessionIdStr = String(sessionId);\n const targetingMatchForSession = await db.get<'sessionTargetingMatch'>('sessionTargetingMatch', sessionIdStr);\n\n return targetingMatchForSession?.targetingMatch;\n } catch (e) {\n loggerProvider.warn(`Failed to get targeting match for session id ${sessionId}: ${e as string}`);\n }\n return undefined;\n };\n\n storeTargetingMatchForSession = async ({\n loggerProvider,\n apiKey,\n sessionId,\n targetingMatch,\n }: {\n loggerProvider: ILogger;\n apiKey: string;\n sessionId: string | number;\n targetingMatch: boolean;\n }) => {\n try {\n const db = await this.openOrCreateDB(apiKey);\n const sessionIdStr = String(sessionId);\n const targetingMatchForSession = await db.put<'sessionTargetingMatch'>('sessionTargetingMatch', {\n targetingMatch,\n sessionId: sessionIdStr,\n lastUpdated: Date.now(),\n });\n\n return targetingMatchForSession;\n } catch (e) {\n loggerProvider.warn(`Failed to store targeting match for session id ${sessionId}: ${e as string}`);\n }\n return undefined;\n };\n\n clearStoreOfOldSessions = async ({\n loggerProvider,\n apiKey,\n currentSessionId,\n }: {\n loggerProvider: ILogger;\n apiKey: string;\n currentSessionId: string | number;\n }) => {\n try {\n const db = await this.openOrCreateDB(apiKey);\n const currentSessionIdStr = String(currentSessionId);\n const tx = db.transaction<'sessionTargetingMatch', 'readwrite'>('sessionTargetingMatch', 'readwrite');\n const allTargetingMatchObjs = await tx.store.getAll();\n for (let i = 0; i < allTargetingMatchObjs.length; i++) {\n const targetingMatchObj = allTargetingMatchObjs[i];\n const amountOfTimeSinceSession = Date.now() - targetingMatchObj.lastUpdated;\n if (targetingMatchObj.sessionId !== currentSessionIdStr && amountOfTimeSinceSession > MAX_IDB_STORAGE_LENGTH) {\n await tx.store.delete(targetingMatchObj.sessionId);\n }\n }\n await tx.done;\n } catch (e) {\n loggerProvider.warn(`Failed to clear old targeting matches for sessions: ${e as string}`);\n }\n };\n}\nexport const targetingIDBStore = new TargetingIDBStore();\n","import { getPageUrl } from '../helpers';\nimport { UGCFilterRule } from '../config/types';\nimport { DEFAULT_URL_CHANGE_POLLING_INTERVAL } from '../constants';\nimport { RecordPlugin } from '@amplitude/rrweb-types';\n\n/**\n * Event emitted when URL changes are detected by the plugin\n * Contains the current page URL, title, and viewport dimensions\n */\nexport interface URLChangeEvent {\n /** The current page URL (may be filtered if UGC rules are applied) */\n href: string;\n /** The current page title */\n title: string;\n /** Viewport height in pixels */\n viewportHeight: number;\n /** Viewport width in pixels */\n viewportWidth: number;\n /** The type of URL change event */\n type: string;\n}\n\n/**\n * Configuration options for the URL tracking plugin\n */\nexport interface URLTrackingPluginOptions {\n /** Rules for filtering sensitive URLs (User Generated Content) */\n ugcFilterRules?: UGCFilterRule[];\n /** Whether to use polling instead of history API events for URL detection */\n enablePolling?: boolean;\n /** Interval in milliseconds for polling URL changes (default: 1000ms) */\n pollingInterval?: number;\n /** Whether to capture document title in URL change events (default: false) */\n captureDocumentTitle?: boolean;\n}\n\n/**\n * Creates a URL tracking plugin for rrweb record function\n *\n * This plugin monitors URL changes in the browser and emits events when the URL changes.\n * It supports three tracking modes:\n * 1. Polling (if explicitly enabled) - periodically checks for URL changes\n * 2. History API + Hash routing (default) - patches pushState/replaceState, listens to popstate and hashchange\n * 3. Hash routing only (fallback) - listens to hashchange events when History API is unavailable\n *\n * The plugin handles edge cases gracefully:\n * - Missing or null location objects\n * - Undefined, null, or empty location.href values\n * - Temporal dead zone issues with variable declarations\n * - Consistent URL normalization across all code paths\n *\n * @param options Configuration options for URL tracking\n * @returns RecordPlugin instance that can be used with rrweb\n */\nexport function createUrlTrackingPlugin(\n options: URLTrackingPluginOptions = {},\n): RecordPlugin<URLTrackingPluginOptions> {\n return {\n name: 'amplitude/url-tracking@1',\n observer(cb, globalScope, pluginOptions?: URLTrackingPluginOptions) {\n // Merge options with plugin-level options taking precedence over constructor options\n const config = { ...options, ...pluginOptions };\n const ugcFilterRules = config.ugcFilterRules || [];\n const enablePolling = config.enablePolling ?? false;\n const pollingInterval = config.pollingInterval ?? DEFAULT_URL_CHANGE_POLLING_INTERVAL;\n const captureDocumentTitle = config.captureDocumentTitle ?? false;\n\n // Early return if no global scope is available\n if (!globalScope) {\n return () => {\n // No cleanup needed if no global scope available\n };\n }\n\n // Track the last URL to prevent duplicate events\n // Initialize to undefined to ensure first call always emits an event\n let lastTrackedUrl: string | undefined = undefined;\n\n // Helper functions\n /**\n * Gets the current URL with proper normalization\n * Handles edge cases where location.href might be undefined, null, or empty\n * Ensures consistent behavior across all code paths\n * @returns Normalized URL string (empty string if location unavailable)\n */\n const getCurrentUrl = (): string => {\n if (!globalScope.location) return '';\n return globalScope.location.href || '';\n };\n\n /**\n * Creates a URL change event with current page information\n * Applies UGC filtering if rules are configured\n * Uses getCurrentUrl() for consistent URL normalization\n * @returns URLChangeEvent with current page state\n */\n const createUrlChangeEvent = (): URLChangeEvent => {\n const { innerHeight, innerWidth, document } = globalScope;\n const currentUrl = getCurrentUrl();\n let currentTitle = '';\n if (captureDocumentTitle) {\n currentTitle = document?.title || '';\n }\n\n // Apply UGC filtering if rules are provided, otherwise use original URL\n const filteredUrl = ugcFilterRules.length > 0 ? getPageUrl(currentUrl, ugcFilterRules) : currentUrl;\n\n return {\n href: filteredUrl,\n title: currentTitle,\n viewportHeight: innerHeight,\n viewportWidth: innerWidth,\n type: 'url-change-event',\n };\n };\n\n /**\n * Emits a URL change event if the URL has actually changed\n * Always emits on first call (when lastTrackedUrl is undefined)\n * Prevents duplicate events for the same URL on subsequent calls\n * Handles edge cases like undefined/null/empty URLs gracefully\n */\n const emitUrlChange = (): void => {\n const currentUrl = getCurrentUrl();\n\n // Always emit on first call, or if URL actually changed\n if (lastTrackedUrl === undefined || currentUrl !== lastTrackedUrl) {\n lastTrackedUrl = currentUrl;\n const event = createUrlChangeEvent();\n cb(event);\n }\n };\n\n /**\n * Creates a patched version of history methods (pushState/replaceState)\n * that calls the original method and then emits a URL change event\n * Ensures URL changes are detected even when history methods are called programmatically\n * @param originalMethod The original history method to patch\n * @returns Patched function that calls original method then emits URL change event\n */\n const createHistoryMethodPatch = <T extends typeof history.pushState | typeof history.replaceState>(\n originalMethod: T,\n ) => {\n return function (this: History, ...args: Parameters<T>) {\n // Call the original history method first\n const result = originalMethod.apply(this, args);\n // Then emit URL change event\n emitUrlChange();\n return result;\n };\n };\n\n // Hashchange event handler - delegates to emitUrlChange for consistency\n const hashChangeHandler = () => {\n emitUrlChange();\n };\n\n // 1. if explicitly enable polling → use polling\n if (enablePolling) {\n // Use polling (covers everything)\n const urlChangeInterval = globalScope.setInterval(() => {\n emitUrlChange();\n }, pollingInterval);\n\n // Emit initial URL immediately\n emitUrlChange();\n\n // Return cleanup function to stop polling\n return () => {\n if (urlChangeInterval) {\n globalScope.clearInterval(urlChangeInterval);\n }\n };\n }\n\n // 2. if polling not enabled → check history, if exist, use history\n if (globalScope.history) {\n // Use History API + hashchange (covers History API + hash routing)\n // Store original history methods for restoration during cleanup\n const originalPushState = globalScope.history.pushState.bind(globalScope.history);\n const originalReplaceState = globalScope.history.replaceState.bind(globalScope.history);\n\n /**\n * Sets up history method patching to intercept pushState and replaceState calls\n * This ensures URL changes are detected even when history methods are called programmatically\n */\n const setupHistoryPatching = (): void => {\n // Patch pushState to emit URL change events\n globalScope.history.pushState = createHistoryMethodPatch(originalPushState);\n\n // Patch replaceState to emit URL change events\n globalScope.history.replaceState = createHistoryMethodPatch(originalReplaceState);\n };\n\n // Apply history method patches\n setupHistoryPatching();\n\n // Listen to popstate events for browser back/forward navigation\n globalScope.addEventListener('popstate', emitUrlChange);\n // Listen to hashchange events for hash routing\n globalScope.addEventListener('hashchange', hashChangeHandler);\n\n // Emit initial URL immediately\n emitUrlChange();\n\n // Return cleanup function to restore original state\n return () => {\n // Restore original history methods\n globalScope.history.pushState = originalPushState;\n globalScope.history.replaceState = originalReplaceState;\n\n // Remove popstate event listener\n globalScope.removeEventListener('popstate', emitUrlChange);\n // Remove hashchange event listener\n globalScope.removeEventListener('hashchange', hashChangeHandler);\n };\n }\n\n // 3. if not, then the framework is probably using hash router → do hash\n // Fallback: just hashchange (for pure hash routing)\n globalScope.addEventListener('hashchange', hashChangeHandler);\n emitUrlChange();\n return () => {\n globalScope.removeEventListener('hashchange', hashChangeHandler);\n };\n },\n options,\n };\n}\n\n/**\n * Default URL tracking plugin instance with default options\n * Can be used directly without custom configuration\n */\nexport const urlTrackingPlugin = createUrlTrackingPlugin();\n","import {\n getAnalyticsConnector,\n getGlobalScope,\n ILogger,\n Logger,\n LogLevel,\n returnWrapper,\n SpecialEventType,\n} from '@amplitude/analytics-core';\n\n// Import only specific types to avoid pulling in the entire rrweb-types package\nimport { eventWithTime, EventType as RRWebEventType, scrollCallback } from '@amplitude/rrweb-types';\nimport { TargetingParameters } from '@amplitude/targeting';\nimport { createSessionReplayJoinedConfigGenerator } from './config/joined-config';\nimport {\n LoggingConfig,\n SessionReplayJoinedConfig,\n SessionReplayJoinedConfigGenerator,\n SessionReplayLocalConfig,\n SessionReplayMetadata,\n SessionReplayRemoteConfig,\n} from './config/types';\nimport {\n BLOCK_CLASS,\n CustomRRwebEvent,\n DEFAULT_SESSION_REPLAY_PROPERTY,\n INTERACTION_MAX_INTERVAL,\n INTERACTION_MIN_INTERVAL,\n MASK_TEXT_CLASS,\n SESSION_REPLAY_DEBUG_PROPERTY,\n} from './constants';\nimport { EventCompressor } from './events/event-compressor';\nimport { createEventsManager } from './events/events-manager';\nimport { MultiEventManager } from './events/multi-manager';\nimport { generateHashCode, getDebugConfig, getPageUrl, getStorageSize, isSessionInSample, maskFn } from './helpers';\nimport { clickBatcher, clickHook, clickNonBatcher } from './hooks/click';\nimport { ScrollWatcher } from './hooks/scroll';\nimport { SessionIdentifiers } from './identifiers';\nimport { SafeLoggerProvider } from './logger';\nimport { evaluateTargetingAndStore } from './targeting/targeting-manager';\nimport {\n AmplitudeSessionReplay,\n SessionReplayEventsManager as AmplitudeSessionReplayEventsManager,\n DebugInfo,\n EventsManagerWithType,\n EventType,\n SessionIdentifiers as ISessionIdentifiers,\n SessionReplayOptions,\n} from './typings/session-replay';\nimport { VERSION } from './version';\n\n// Import only the type for NetworkRequestEvent to keep type safety\nimport type { NetworkObservers, NetworkRequestEvent } from './observers';\nimport { createUrlTrackingPlugin } from './plugins/url-tracking-plugin';\nimport type { RecordFunction } from './utils/rrweb';\n\ntype PageLeaveFn = (e: PageTransitionEvent | Event) => void;\n\nexport class SessionReplay implements AmplitudeSessionReplay {\n name = '@amplitude/session-replay-browser';\n config: SessionReplayJoinedConfig | undefined;\n joinedConfigGenerator: SessionReplayJoinedConfigGenerator | undefined;\n identifiers: ISessionIdentifiers | undefined;\n eventsManager?: AmplitudeSessionReplayEventsManager<'replay' | 'interaction', string>;\n loggerProvider: ILogger;\n recordCancelCallback: ReturnType<RecordFunction> | null = null;\n eventCount = 0;\n eventCompressor: EventCompressor | undefined;\n sessionTargetingMatch = false;\n private lastTargetingParams?: Pick<TargetingParameters, 'event' | 'userProperties'>;\n private lastShouldRecordDecision?: boolean;\n\n // Visible for testing only\n pageLeaveFns: PageLeaveFn[] = [];\n private scrollHook?: scrollCallback;\n private networkObservers?: NetworkObservers;\n private metadata: SessionReplayMetadata | undefined;\n\n // Cache the dynamically imported record function\n private recordFunction: RecordFunction | null = null;\n\n constructor() {\n this.loggerProvider = new SafeLoggerProvider(new Logger());\n }\n\n init(apiKey: string, options: SessionReplayOptions) {\n return returnWrapper(this._init(apiKey, options));\n }\n\n private teardownEventListeners = (teardown: boolean) => {\n const globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.removeEventListener('blur', this.blurListener);\n globalScope.removeEventListener('focus', this.focusListener);\n !teardown && globalScope.addEventListener('blur', this.blurListener);\n !teardown && globalScope.addEventListener('focus', this.focusListener);\n // prefer pagehide to unload events, this is the standard going forward. it is not\n // 100% reliable, but is bfcache-compatible.\n if (globalScope.self && 'onpagehide' in globalScope.self) {\n globalScope.removeEventListener('pagehide', this.pageLeaveListener);\n !teardown && globalScope.addEventListener('pagehide', this.pageLeaveListener);\n } else {\n // this has performance implications, but is the only way we can reliably send events\n // in browser that don't support pagehide.\n globalScope.removeEventListener('beforeunload', this.pageLeaveListener);\n !teardown && globalScope.addEventListener('beforeunload', this.pageLeaveListener);\n }\n }\n };\n\n protected async _init(apiKey: string, options: SessionReplayOptions) {\n this.loggerProvider = new SafeLoggerProvider(options.loggerProvider || new Logger());\n Object.prototype.hasOwnProperty.call(options, 'logLevel') &&\n this.loggerProvider.enable(options.logLevel as LogLevel);\n this.identifiers = new SessionIdentifiers({ sessionId: options.sessionId, deviceId: options.deviceId });\n this.joinedConfigGenerator = await createSessionReplayJoinedConfigGenerator(apiKey, options);\n const { joinedConfig, localConfig, remoteConfig } = await this.joinedConfigGenerator.generateJoinedConfig(\n this.identifiers.sessionId,\n );\n this.config = joinedConfig;\n\n this.setMetadata(\n options.sessionId,\n joinedConfig,\n localConfig,\n remoteConfig,\n options.version?.version,\n VERSION,\n options.version?.type,\n );\n\n if (options.sessionId && this.config.interactionConfig?.enabled) {\n const scrollWatcher = ScrollWatcher.default(\n {\n sessionId: options.sessionId,\n type: 'interaction',\n },\n this.config,\n );\n this.pageLeaveFns = [scrollWatcher.send(this.getDeviceId.bind(this)).bind(scrollWatcher)];\n this.scrollHook = scrollWatcher.hook.bind(scrollWatcher);\n }\n\n const managers: EventsManagerWithType<EventType, string>[] = [];\n let { storeType } = this.config;\n if (storeType === 'idb' && !getGlobalScope()?.indexedDB) {\n storeType = 'memory';\n this.loggerProvider.warn('Could not use preferred indexedDB storage, reverting to in memory option.');\n }\n this.loggerProvider.log(`Using ${storeType} for event storage.`);\n try {\n const rrwebEventManager = await createEventsManager<'replay'>({\n config: this.config,\n sessionId: this.identifiers.sessionId,\n type: 'replay',\n storeType,\n });\n managers.push({ name: 'replay', manager: rrwebEventManager });\n } catch (error) {\n const typedError = error as Error;\n this.loggerProvider.warn(`Error occurred while creating replay events manager: ${typedError.toString()}`);\n }\n\n if (this.config.interactionConfig?.enabled) {\n const payloadBatcher = this.config.interactionConfig.batch ? clickBatcher : clickNonBatcher;\n try {\n const interactionEventManager = await createEventsManager<'interaction'>({\n config: this.config,\n sessionId: this.identifiers.sessionId,\n type: 'interaction',\n minInterval: this.config.interactionConfig.trackEveryNms ?? INTERACTION_MIN_INTERVAL,\n maxInterval: INTERACTION_MAX_INTERVAL,\n payloadBatcher,\n storeType,\n });\n managers.push({ name: 'interaction', manager: interactionEventManager });\n } catch (error) {\n const typedError = error as Error;\n this.loggerProvider.warn(`Error occurred while creating interaction events manager: ${typedError.toString()}`);\n }\n }\n\n this.eventsManager = new MultiEventManager<'replay' | 'interaction', string>(...managers);\n // To prevent too many threads.\n if (this.eventCompressor) {\n this.eventCompressor.terminate();\n }\n\n let workerScript = undefined;\n const globalScope = getGlobalScope();\n if (this.config.experimental?.useWebWorker && globalScope && globalScope.Worker) {\n const { compressionScript } = await import('./worker');\n\n workerScript = compressionScript;\n }\n\n this.eventCompressor = new EventCompressor(this.eventsManager, this.config, this.getDeviceId(), workerScript);\n\n await this.initializeNetworkObservers();\n\n this.loggerProvider.log('Installing @amplitude/session-replay-browser.');\n\n this.teardownEventListeners(false);\n\n await this.evaluateTargetingAndCapture({ userProperties: options.userProperties }, true);\n }\n\n setSessionId(sessionId: string | number, deviceId?: string) {\n return returnWrapper(this.asyncSetSessionId(sessionId, deviceId));\n }\n\n async asyncSetSessionId(\n sessionId: string | number,\n deviceId?: string,\n options?: { userProperties?: { [key: string]: any } },\n ) {\n this.sessionTargetingMatch = false;\n this.lastShouldRecordDecision = undefined; // Reset targeting decision for new session\n\n const previousSessionId = this.identifiers && this.identifiers.sessionId;\n if (previousSessionId) {\n this.sendEvents(previousSessionId);\n }\n\n const deviceIdForReplayId = deviceId || this.getDeviceId();\n this.identifiers = new SessionIdentifiers({\n sessionId: sessionId,\n deviceId: deviceIdForReplayId,\n });\n\n // If there is no previous session id, SDK is being initialized for the first time,\n // and config was just fetched in initialization, so no need to fetch it a second time\n if (this.joinedConfigGenerator && previousSessionId) {\n const { joinedConfig } = await this.joinedConfigGenerator.generateJoinedConfig(this.identifiers.sessionId);\n this.config = joinedConfig;\n }\n\n if (this.config?.targetingConfig) {\n await this.evaluateTargetingAndCapture({ userProperties: options?.userProperties });\n } else {\n await this.recordEvents();\n }\n }\n\n getSessionReplayProperties() {\n const config = this.config;\n const identifiers = this.identifiers;\n if (!config || !identifiers) {\n this.loggerProvider.warn('Session replay init has not been called, cannot get session replay properties.');\n return {};\n }\n\n const shouldRecord = this.getShouldRecord();\n let eventProperties: { [key: string]: string | null } = {};\n\n if (shouldRecord) {\n eventProperties = {\n [DEFAULT_SESSION_REPLAY_PROPERTY]: identifiers.sessionReplayId ? identifiers.sessionReplayId : null,\n };\n if (config.debugMode) {\n eventProperties[SESSION_REPLAY_DEBUG_PROPERTY] = JSON.stringify({\n appHash: generateHashCode(config.apiKey).toString(),\n });\n }\n }\n\n void this.addCustomRRWebEvent(\n CustomRRwebEvent.GET_SR_PROPS,\n {\n shouldRecord,\n eventProperties: eventProperties,\n },\n this.eventCount === 10,\n );\n if (this.eventCount === 10) {\n this.eventCount = 0;\n }\n this.eventCount++;\n\n return eventProperties;\n }\n\n blurListener = () => {\n this.sendEvents();\n };\n\n focusListener = () => {\n // Restart recording on focus to ensure that when user\n // switches tabs, we take a full snapshot\n void this.recordEvents(false);\n };\n\n /**\n * This is an instance member so that if init is called multiple times\n * it doesn't add another listener to the page leave event. This is to\n * prevent duplicate listener actions from firing.\n */\n private pageLeaveListener = (e: PageTransitionEvent | Event) => {\n this.pageLeaveFns.forEach((fn) => {\n fn(e);\n });\n };\n\n evaluateTargetingAndCapture = async (\n targetingParams: Pick<TargetingParameters, 'event' | 'userProperties'>,\n isInit = false,\n ) => {\n if (!this.identifiers || !this.identifiers.sessionId || !this.config) {\n if (this.identifiers && !this.identifiers.sessionId) {\n this.loggerProvider.log('Session ID has not been set yet, cannot evaluate targeting for Session Replay.');\n } else {\n this.loggerProvider.warn('Session replay init has not been called, cannot evaluate targeting.');\n }\n return;\n }\n\n // Handle cases where there's no targeting config\n if (!this.config.targetingConfig) {\n if (isInit) {\n this.loggerProvider.log('Targeting config has not been set yet, cannot evaluate targeting.');\n } else {\n this.loggerProvider.log('No targeting config set, skipping initialization/recording for event.');\n return;\n }\n }\n\n // Store targeting parameters for use in getShouldRecord\n this.lastTargetingParams = targetingParams;\n\n if (this.config.targetingConfig && !this.sessionTargetingMatch) {\n let eventForTargeting = targetingParams.event;\n if (\n eventForTargeting &&\n Object.values(SpecialEventType).includes(eventForTargeting.event_type as SpecialEventType)\n ) {\n eventForTargeting = undefined;\n }\n\n // We're setting this on this class because fetching the value from idb\n // is async, we need to access this value synchronously (for record\n // and for getSessionReplayProperties - both synchronous fns)\n this.sessionTargetingMatch = await evaluateTargetingAndStore({\n sessionId: this.identifiers.sessionId,\n targetingConfig: this.config.targetingConfig,\n loggerProvider: this.loggerProvider,\n apiKey: this.config.apiKey,\n targetingParams: { userProperties: targetingParams.userProperties, event: eventForTargeting },\n });\n\n // Log the targeting config to debug\n this.loggerProvider.debug(\n JSON.stringify(\n {\n name: 'targeted replay capture config',\n sessionTargetingMatch: this.sessionTargetingMatch,\n event: eventForTargeting,\n targetingParams: targetingParams,\n },\n null,\n 2,\n ),\n );\n }\n\n if (isInit) {\n void this.initialize(true);\n } else {\n await this.recordEvents();\n }\n };\n\n sendEvents(sessionId?: string | number) {\n const sessionIdToSend = sessionId || this.identifiers?.sessionId;\n const deviceId = this.getDeviceId();\n this.eventsManager &&\n sessionIdToSend &&\n deviceId &&\n this.eventsManager.sendCurrentSequenceEvents({ sessionId: sessionIdToSend, deviceId });\n }\n\n async initialize(shouldSendStoredEvents = false) {\n if (!this.identifiers?.sessionId) {\n this.loggerProvider.log(`Session is not being recorded due to lack of session id.`);\n return Promise.resolve();\n }\n\n const deviceId = this.getDeviceId();\n if (!deviceId) {\n this.loggerProvider.log(`Session is not being recorded due to lack of device id.`);\n return Promise.resolve();\n }\n this.eventsManager && shouldSendStoredEvents && void this.eventsManager.sendStoredEvents({ deviceId });\n\n return this.recordEvents();\n }\n\n shouldOptOut() {\n let identityStoreOptOut: boolean | undefined;\n if (this.config?.instanceName) {\n const identityStore = getAnalyticsConnector(this.config.instanceName).identityStore;\n identityStoreOptOut = identityStore.getIdentity().optOut;\n }\n\n return identityStoreOptOut !== undefined ? identityStoreOptOut : this.config?.optOut;\n }\n\n getShouldRecord() {\n if (!this.identifiers || !this.config || !this.identifiers.sessionId) {\n this.loggerProvider.warn(`Session is not being recorded due to lack of config, please call sessionReplay.init.`);\n return false;\n }\n if (!this.config.captureEnabled) {\n this.loggerProvider.log(\n `Session ${this.identifiers.sessionId} not being captured due to capture being disabled for project or because the remote config could not be fetched.`,\n );\n return false;\n }\n\n if (this.shouldOptOut()) {\n this.loggerProvider.log(`Opting session ${this.identifiers.sessionId} out of recording due to optOut config.`);\n return false;\n }\n\n let shouldRecord = false;\n let message = '';\n let matched = false;\n\n // If targetingConfig exists, we'll use the sessionTargetingMatch to determine whether to record\n // Otherwise, we'll evaluate the session against the overall sample rate\n if (this.config.targetingConfig) {\n if (!this.sessionTargetingMatch) {\n message = `Not capturing replays for session ${this.identifiers.sessionId} due to not matching targeting conditions.`;\n this.loggerProvider.log(message);\n shouldRecord = false;\n matched = false;\n } else {\n message = `Capturing replays for session ${this.identifiers.sessionId} due to matching targeting conditions.`;\n this.loggerProvider.log(message);\n shouldRecord = true;\n matched = true;\n }\n } else {\n const isInSample = isSessionInSample(this.identifiers.sessionId, this.config.sampleRate);\n if (!isInSample) {\n message = `Opting session ${this.identifiers.sessionId} out of recording due to sample rate.`;\n this.loggerProvider.log(message);\n shouldRecord = false;\n matched = false;\n } else {\n shouldRecord = true;\n matched = true;\n }\n }\n\n // Only send custom rrweb event for targeting decision when the decision changes\n if (this.lastShouldRecordDecision !== shouldRecord && this.config.targetingConfig) {\n void this.addCustomRRWebEvent(CustomRRwebEvent.TARGETING_DECISION, {\n message,\n sessionId: this.identifiers.sessionId,\n matched,\n targetingParams: this.lastTargetingParams,\n });\n this.lastShouldRecordDecision = shouldRecord;\n }\n\n return shouldRecord;\n }\n\n getBlockSelectors(): string | string[] | undefined {\n // For some reason, this defaults to empty array ([]) if undefined in the compiled script.\n // Empty arrays cause errors when being evaluated in Safari.\n // Force the selector to be undefined if it's an empty array.\n const blockSelector = this.config?.privacyConfig?.blockSelector ?? [];\n if (blockSelector.length === 0) {\n return undefined;\n }\n return blockSelector;\n }\n\n getMaskTextSelectors(): string | undefined {\n if (this.config?.privacyConfig?.defaultMaskLevel === 'conservative') {\n return '*';\n }\n\n const maskSelector = this.config?.privacyConfig?.maskSelector;\n if (!maskSelector) {\n return;\n }\n\n return maskSelector as unknown as string;\n }\n\n async getRecordingPlugins(loggingConfig: LoggingConfig | undefined) {\n const plugins = [];\n\n // Add URL tracking plugin\n try {\n const urlTrackingPlugin = createUrlTrackingPlugin({\n ugcFilterRules: this.config?.interactionConfig?.ugcFilterRules || [],\n enablePolling: this.config?.enableUrlChangePolling || false,\n pollingInterval: this.config?.urlChangePollingInterval,\n captureDocumentTitle: this.config?.captureDocumentTitle,\n });\n\n plugins.push(urlTrackingPlugin);\n } catch (error) {\n this.loggerProvider.warn('Failed to create URL tracking plugin:', error);\n }\n\n // Default plugin settings -\n // {\n // level: ['info', 'log', 'warn', 'error'],\n // lengthThreshold: 10000,\n // stringifyOptions: {\n // stringLengthLimit: undefined,\n // numOfKeysLimit: 50,\n // depthOfLimit: 4,\n // },\n // logger: window.console,\n // }\n if (loggingConfig?.console?.enabled) {\n try {\n // Dynamic import keeps console plugin separate and only loads when needed\n const { getRecordConsolePlugin } = await import('@amplitude/rrweb-plugin-console-record');\n plugins.push(getRecordConsolePlugin({ level: loggingConfig.console.levels }));\n } catch (error) {\n this.loggerProvider.warn('Failed to load console plugin:', error);\n }\n }\n\n return plugins.length > 0 ? plugins : undefined;\n }\n\n private async getRecordFunction(): Promise<RecordFunction | null> {\n if (this.recordFunction) {\n return this.recordFunction;\n }\n\n try {\n const { record } = await import('@amplitude/rrweb-record');\n this.recordFunction = record;\n return record;\n } catch (error) {\n this.loggerProvider.warn('Failed to load rrweb-record module:', error);\n return null;\n }\n }\n\n async recordEvents(shouldLogMetadata = true) {\n const config = this.config;\n const shouldRecord = this.getShouldRecord();\n const sessionId = this.identifiers?.sessionId;\n if (!shouldRecord || !sessionId || !config) {\n return;\n }\n this.stopRecordingEvents();\n\n const recordFunction = await this.getRecordFunction();\n\n // May be undefined if cannot import rrweb-record\n if (!recordFunction) {\n return;\n }\n\n await this.initializeNetworkObservers();\n\n this.networkObservers?.start((event: NetworkRequestEvent) => {\n void this.addCustomRRWebEvent(CustomRRwebEvent.FETCH_REQUEST, event);\n });\n const { privacyConfig, interactionConfig, loggingConfig } = config;\n\n const hooks = interactionConfig?.enabled\n ? {\n mouseInteraction:\n this.eventsManager &&\n clickHook(this.loggerProvider, {\n eventsManager: this.eventsManager,\n sessionId,\n deviceIdFn: this.getDeviceId.bind(this),\n mirror: recordFunction.mirror,\n ugcFilterRules: interactionConfig.ugcFilterRules ?? [],\n }),\n scroll: this.scrollHook,\n }\n : {};\n\n const ugcFilterRules =\n interactionConfig?.enabled && interactionConfig.ugcFilterRules ? interactionConfig.ugcFilterRules : [];\n\n this.loggerProvider.log(`Session Replay capture beginning for ${sessionId}.`);\n\n try {\n this.recordCancelCallback = recordFunction({\n emit: (event: eventWithTime) => {\n if (this.shouldOptOut()) {\n this.loggerProvider.log(`Opting session ${sessionId} out of recording due to optOut config.`);\n this.stopRecordingEvents();\n this.sendEvents();\n return;\n }\n\n if (event.type === RRWebEventType.Meta) {\n event.data.href = getPageUrl(event.data.href, ugcFilterRules);\n }\n\n if (this.eventCompressor) {\n // Schedule processing during idle time if the browser supports requestIdleCallback\n this.eventCompressor.enqueueEvent(event, sessionId);\n }\n },\n inlineStylesheet: config.shouldInlineStylesheet,\n hooks,\n maskAllInputs: true,\n maskTextClass: MASK_TEXT_CLASS,\n blockClass: BLOCK_CLASS,\n blockSelector: this.getBlockSelectors() as string | undefined,\n applyBackgroundColorToBlockedElements: config.applyBackgroundColorToBlockedElements,\n maskInputFn: maskFn('input', privacyConfig),\n maskTextFn: maskFn('text', privacyConfig),\n maskTextSelector: this.getMaskTextSelectors(),\n recordCanvas: false,\n slimDOMOptions: {\n script: config.omitElementTags?.script,\n comment: config.omitElementTags?.comment,\n },\n errorHandler: (error: unknown) => {\n const typedError = error as Error & { _external_?: boolean };\n\n // styled-components relies on this error being thrown and bubbled up, rrweb is otherwise suppressing it\n if (typedError.message.includes('insertRule') && typedError.message.includes('CSSStyleSheet')) {\n throw typedError;\n }\n\n // rrweb does monkey patching on certain window functions such as CSSStyleSheet.proptype.insertRule,\n // and errors from external clients calling these functions can get suppressed. Styled components depend\n // on these errors being re-thrown.\n if (typedError._external_) {\n throw typedError;\n }\n\n this.loggerProvider.warn('Error while capturing replay: ', typedError.toString());\n // Return true so that we don't clutter user's consoles with internal rrweb errors\n return true;\n },\n plugins: await this.getRecordingPlugins(loggingConfig),\n });\n\n void this.addCustomRRWebEvent(CustomRRwebEvent.DEBUG_INFO);\n if (shouldLogMetadata) {\n void this.addCustomRRWebEvent(CustomRRwebEvent.METADATA, this.metadata);\n }\n } catch (error) {\n this.loggerProvider.warn('Failed to initialize session replay:', error);\n }\n }\n\n addCustomRRWebEvent = async (\n eventName: CustomRRwebEvent,\n eventData: { [key: string]: any } = {},\n addStorageInfo = true,\n ) => {\n try {\n let debugInfo: DebugInfo | undefined = undefined;\n const config = this.config;\n // Only add debug info for non-metadata events\n if (config && eventName !== CustomRRwebEvent.METADATA) {\n debugInfo = {\n config: getDebugConfig(config),\n version: VERSION,\n };\n if (addStorageInfo) {\n const storageSizeData = await getStorageSize();\n debugInfo = {\n ...storageSizeData,\n ...debugInfo,\n };\n }\n }\n // Check first to ensure we are recording\n if (this.recordCancelCallback && this.recordFunction) {\n this.recordFunction.addCustomEvent(eventName, {\n ...eventData,\n ...debugInfo,\n });\n } else {\n this.loggerProvider.debug(\n `Not able to add custom replay capture event ${eventName} due to no ongoing recording.`,\n );\n }\n } catch (e) {\n this.loggerProvider.debug('Error while adding custom replay capture event: ', e);\n }\n };\n\n stopRecordingEvents = () => {\n try {\n this.loggerProvider.log('Session Replay capture stopping.');\n this.recordCancelCallback && this.recordCancelCallback();\n this.recordCancelCallback = null;\n this.networkObservers?.stop();\n } catch (error) {\n const typedError = error as Error;\n this.loggerProvider.warn(`Error occurred while stopping replay capture: ${typedError.toString()}`);\n }\n };\n\n getDeviceId() {\n return this.identifiers?.deviceId;\n }\n\n getSessionId() {\n return this.identifiers?.sessionId;\n }\n\n async flush(useRetry = false) {\n return this.eventsManager?.flush(useRetry);\n }\n\n shutdown() {\n this.teardownEventListeners(true);\n this.stopRecordingEvents();\n this.sendEvents();\n }\n\n private mapSDKType(sdkType: string | undefined) {\n if (sdkType === 'plugin') {\n return '@amplitude/plugin-session-replay-browser';\n }\n\n if (sdkType === 'segment') {\n return '@amplitude/segment-session-replay-plugin';\n }\n\n return null;\n }\n\n private setMetadata(\n sessionId: string | number | undefined,\n joinedConfig: SessionReplayJoinedConfig,\n localConfig: SessionReplayLocalConfig,\n remoteConfig: SessionReplayRemoteConfig | undefined,\n replaySDKVersion: string | undefined,\n standaloneSDKVersion: string | undefined,\n sdkType: string | undefined,\n ) {\n const hashValue = sessionId?.toString() ? generateHashCode(sessionId.toString()) : undefined;\n\n this.metadata = {\n joinedConfig,\n localConfig,\n remoteConfig,\n sessionId,\n hashValue,\n sampleRate: joinedConfig.sampleRate,\n replaySDKType: this.mapSDKType(sdkType),\n replaySDKVersion,\n standaloneSDKType: '@amplitude/session-replay-browser',\n standaloneSDKVersion,\n };\n }\n\n private async initializeNetworkObservers(): Promise<void> {\n if (this.config?.loggingConfig?.network?.enabled && !this.networkObservers) {\n try {\n const { NetworkObservers: NetworkObserversClass } = await import('./observers');\n this.networkObservers = new NetworkObserversClass();\n } catch (error) {\n this.loggerProvider.warn('Failed to import or instantiate NetworkObservers:', error);\n }\n }\n }\n}\n","import type { TargetingParameters } from '@amplitude/targeting';\nimport { TargetingConfig } from '../config/types';\nimport { Logger } from '@amplitude/analytics-types';\nimport { targetingIDBStore } from './targeting-idb-store';\n\nexport const evaluateTargetingAndStore = async ({\n sessionId,\n targetingConfig,\n loggerProvider,\n apiKey,\n targetingParams,\n}: {\n sessionId: string | number;\n targetingConfig: TargetingConfig;\n loggerProvider: Logger;\n apiKey: string;\n targetingParams?: Pick<TargetingParameters, 'event' | 'userProperties'>;\n}) => {\n await targetingIDBStore.clearStoreOfOldSessions({\n loggerProvider: loggerProvider,\n apiKey: apiKey,\n currentSessionId: sessionId,\n });\n\n const idbTargetingMatch = await targetingIDBStore.getTargetingMatchForSession({\n loggerProvider: loggerProvider,\n apiKey: apiKey,\n sessionId: sessionId,\n });\n if (idbTargetingMatch === true) {\n return true;\n }\n\n // If the targeting config is undefined or an empty object,\n // assume the response was valid but no conditions were set,\n // so all users match targeting\n let sessionTargetingMatch = true;\n try {\n // Dynamic import of the targeting package\n const { evaluateTargeting: evaluateTargetingPackage } = await import('@amplitude/targeting');\n\n const targetingResult = await evaluateTargetingPackage({\n ...targetingParams,\n flag: targetingConfig,\n sessionId: sessionId,\n apiKey: apiKey,\n loggerProvider: loggerProvider,\n });\n if (targetingResult && targetingResult.sr_targeting_config) {\n sessionTargetingMatch = targetingResult.sr_targeting_config.key === 'on';\n }\n\n void targetingIDBStore.storeTargetingMatchForSession({\n loggerProvider: loggerProvider,\n apiKey: apiKey,\n sessionId: sessionId,\n targetingMatch: sessionTargetingMatch,\n });\n } catch (err: unknown) {\n const knownError = err as Error;\n loggerProvider.warn(knownError.message);\n }\n return sessionTargetingMatch;\n};\n","import { AnalyticsConnector } from '@amplitude/analytics-connector';\nimport { DEFAULT_INSTANCE_NAME } from './types/constants';\nexport var getAnalyticsConnector = function (instanceName) {\n if (instanceName === void 0) { instanceName = DEFAULT_INSTANCE_NAME; }\n return AnalyticsConnector.getInstance(instanceName);\n};\nexport var setConnectorUserId = function (userId, instanceName) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n getAnalyticsConnector(instanceName).identityStore.editIdentity().setUserId(userId).commit();\n};\nexport var setConnectorDeviceId = function (deviceId, instanceName) {\n getAnalyticsConnector(instanceName).identityStore.editIdentity().setDeviceId(deviceId).commit();\n};\n//# sourceMappingURL=analytics-connector.js.map","import { debugWrapper, LogConfig } from '@amplitude/analytics-core';\nimport { getDefaultConfig } from './config/local-config';\nimport { SessionReplay } from './session-replay';\nimport { AmplitudeSessionReplay } from './typings/session-replay';\n\nexport const getLogConfig = (sessionReplay: SessionReplay) => (): LogConfig => {\n const { config } = sessionReplay;\n const { loggerProvider: logger, logLevel } = config || getDefaultConfig();\n return {\n logger,\n logLevel,\n };\n};\n\nconst createInstance: () => AmplitudeSessionReplay = () => {\n const sessionReplay = new SessionReplay();\n return {\n init: debugWrapper(sessionReplay.init.bind(sessionReplay), 'init', getLogConfig(sessionReplay)),\n evaluateTargetingAndCapture: debugWrapper(\n sessionReplay.evaluateTargetingAndCapture.bind(sessionReplay),\n 'evaluateTargetingAndRecord',\n getLogConfig(sessionReplay),\n ),\n setSessionId: debugWrapper(\n sessionReplay.setSessionId.bind(sessionReplay),\n 'setSessionId',\n getLogConfig(sessionReplay),\n ),\n getSessionId: debugWrapper(\n sessionReplay.getSessionId.bind(sessionReplay),\n 'getSessionId',\n getLogConfig(sessionReplay),\n ),\n getSessionReplayProperties: debugWrapper(\n sessionReplay.getSessionReplayProperties.bind(sessionReplay),\n 'getSessionReplayProperties',\n getLogConfig(sessionReplay),\n ),\n flush: debugWrapper(sessionReplay.flush.bind(sessionReplay), 'flush', getLogConfig(sessionReplay)),\n shutdown: debugWrapper(sessionReplay.shutdown.bind(sessionReplay), 'shutdown', getLogConfig(sessionReplay)),\n };\n};\n\nexport default createInstance();\n","import sessionReplay from './session-replay-factory';\nexport const {\n init,\n setSessionId,\n getSessionId,\n getSessionReplayProperties,\n flush,\n shutdown,\n evaluateTargetingAndCapture,\n} = sessionReplay;\nexport { SessionReplayOptions, StoreType } from './typings/session-replay';\nexport { SafeLoggerProvider } from './logger';\nexport { AmplitudeSessionReplay } from './typings/session-replay';\n"],"names":["IdentifyOperation","SpecialEventType","Status","STORAGE_PREFIX","concat","DEFAULT_INSTANCE_NAME","AMPLITUDE_SERVER_URL","LogLevel","getGlobalScope","ampIntegrationContextName","globalThis","window","self","global","returnWrapper","awaitable","promise","Promise","resolve","PREFIX","Logger","this","logLevel","None","prototype","disable","enable","Warn","log","args","_i","arguments","length","Verbose","console","join","warn","error","Error","debug","Debug","getDefaultConfig","flushMaxRetries","flushQueueSize","flushIntervalMillis","instanceName","loggerProvider","offline","optOut","serverUrl","serverZone","useBatch","Config","options","_a","_b","_c","_d","_optOut","defaultConfig","apiKey","minIdLength","plan","ingestionMetadata","undefined","storageProvider","transportProvider","serverConfig","createServerConfig","Object","defineProperty","get","set","enumerable","configurable","getServerUrl","_serverZone","includes","ApplicationContextProviderImpl","getApplicationContext","versionName","language","getLanguage","platform","os","deviceModel","navigator","languages","EventBridgeImpl","queue","logEvent","event","receiver","push","setEventReceiver","forEach","__assign","assign","t","s","i","n","p","hasOwnProperty","call","apply","__values","o","Symbol","iterator","m","next","value","done","TypeError","__read","r","e","ar","SuppressedError","isEqual","obj1","obj2","e_1","typeA","primitive_1","primitive_1_1","e_1_1","return","isArrayA","Array","isArray","isArrayB","sorted1","keys","sort","sorted2","result_1","key","entries","obj","ownProps","resArray","ServerZone","IdentityStoreImpl","identity","userProperties","listeners","Set","editIdentity","actingUserProperties","actingIdentity","setUserId","userId","setDeviceId","deviceId","setUserProperties","setOptOut","updateUserProperties","actions","e_2","e_3","actingProperties","_e","_f","action","properties","_g","_h","_j","e_2_1","_k","_l","e_3_1","commit","setIdentity","getIdentity","originalIdentity","listener","addIdentityListener","add","removeIdentityListener","delete","safeGlobal","AnalyticsConnector","identityStore","eventBridge","applicationContextProvider","getInstance","debugWrapper","fn","fnName","getLogConfig","getStates","fnContext","logger","ignoreDepth","debugContext","type","name","stacktrace","stack","split","slice","map","text","trim","time","start","Date","toISOString","states","before","result","then","after","end","JSON","stringify","BaseTransport","send","_serverUrl","_payload","buildResponse","responseJSON","_m","_o","_p","_q","_r","_s","_t","_u","_v","_w","_x","statusCode","code","status","buildStatus","Success","body","eventsIngested","events_ingested","payloadSizeBytes","payload_size_bytes","serverUploadTime","server_upload_time","Invalid","missingField","missing_field","eventsWithInvalidFields","events_with_invalid_fields","eventsWithMissingFields","events_with_missing_fields","eventsWithInvalidIdLengths","events_with_invalid_id_lengths","epsThreshold","eps_threshold","exceededDailyQuotaDevices","exceeded_daily_quota_devices","silencedDevices","silenced_devices","silencedEvents","silenced_events","throttledDevices","throttled_devices","throttledEvents","throttled_events","PayloadTooLarge","RateLimit","throttledUsers","throttled_users","exceededDailyQuotaUsers","exceeded_daily_quota_users","Timeout","Failed","Unknown","FetchTransport","_super","__extends","payload","__awaiter","response","responseText","__generator","label","fetch","headers","Accept","method","sent","parse","DEFAULT_EVENT_PROPERTY_PREFIX","DEFAULT_SESSION_REPLAY_PROPERTY","DEFAULT_SERVER_ZONE","US","DEFAULT_PERFORMANCE_CONFIG","enabled","SESSION_REPLAY_DEBUG_PROPERTY","MASK_TEXT_CLASS","CustomRRwebEvent","SafeLoggerProvider","constructor","getSafeMethod","__rrweb_original__","bind","DEFAULT_MASK_LEVEL","isMaskedForLevel","elementType","level","element","inputType","hasAttribute","toLowerCase","getInputType","autocomplete","startsWith","maskFn","config","defaultMaskLevel","closest","shouldMask","maskSelector","some","selector","shouldUnmask","unmaskSelector","isMasked","replace","generateHashCode","str","hash","charCodeAt","trackServerUrl","STAGING","EU","globToRegex","glob","escaped","RegExp","getPageUrl","pageUrl","ugcFilterRules","rule","regex","test","replacement","getStorageSize","globalScope","usage","quota","usageDetails","storage","estimate","totalStorageSize","Math","round","percentOfQuota","Number","EPSILON","getDebugConfig","debugConfig","substring","SessionReplayLocalConfig","super","sampleRate","configServerUrl","shouldInlineStylesheet","version","performanceConfig","storeType","applyBackgroundColorToBlockedElements","enableUrlChangePolling","urlChangePollingInterval","captureDocumentTitle","privacyConfig","interactionConfig","every","isValidGlobUrl","globUrl","validateUGCFilterRules","debugMode","experimental","omitElementTags","EventType","EventType2","MouseInteractions","MouseInteractions2","TIMEOUT_MESSAGE","UNEXPECTED_ERROR_MESSAGE","RemoteConfigFetch","localConfig","configKeys","_this","retryTimeout","attempts","sessionTargetingMatch","metrics","getRemoteNamespaceConfig","configNamespace","sessionId","fetchStartTime","configAPIResponse","remoteConfig","now","fetchWithTimeout","configs","fetchTimeAPISuccess","fetchTimeAPIFail","getRemoteConfig","namespaceConfig","controller","timeoutId","AbortController","setTimeout","abort","fetchRemoteConfig","signal","clearTimeout","urlParams","configKey","res","knownError","lastFetchedSessionId","completeRequest","err","aborted","trys","URLSearchParams","api_key","append","String","toString","parseAndStoreConfig","retryFetch","message","json","success","createRemoteConfigFetch","SessionReplayJoinedConfigGenerator","remoteConfigFetch","generateJoinedConfig","captureEnabled","samplingConfig","sr_sampling_config","sr_privacy_config","targetingConfig","sr_targeting_config","sr_interaction_config","loggingConfig","sr_logging_config","joinedConfig","remotePrivacyConfig","capture_enabled","sample_rate","localPrivacyConfig","joinedPrivacyConfig","blockSelector","privacyConfigSelectorMap","selectorMap","selectorType","fragment","document","createDocumentFragment","dropInvalidSelectors","selectors","filter","querySelector","removeInvalidSelectorsFromPrivacyConfig","u8","Uint8Array","u16","Uint16Array","u32","Uint32Array","fleb","fdeb","clim","freb","eb","b","j","fl","revfl","revfd","rev","x","hMap","cd","mb","l","co","le","rvb","sv","r_1","v","flt","fdt","flm","fdm","shft","slc","subarray","wbits","d","wbits16","hTree","f","t2","a","i0","i1","i2","maxSym","tr","mbt","ln","dt","lft","cst","i2_1","i2_2","i2_3","max","lc","c","cl","cli","cln","cls","w","clen","cf","wfblk","out","pos","dat","wblk","final","syms","lf","df","li","bs","bl","_a2","dlt","mlb","_b2","ddt","mdb","lclt","nlc","lcdt","ndc","lcfreq","lct","mlcb","nlcc","lm","ll","dm","dl","flen","ftlen","dtlen","llm","lcts","it","clct","len","dst","deo","dopt","opt","pre","post","st","lvl","plvl","lst","floor","msk_1","prev","head","bs1_1","ceil","bs2_1","hsh","lc_1","wi","hv","imod","pimod","rem","ch_1","dif","maxn","min","maxd","ml","nl","mmd","md","ti","lin","din","dflt","mem","zlibSync","data","opts","adler","lv","fl2","wbytes","pack","latin1","TextDecoder","decode","fromCharCode","strFromU8","TextEncoder","encode","ai","strToU8","EventCompressor","eventsManager","workerScript","taskQueue","isProcessing","compressEvent","packedEvent","addCompressedEventToManager","compressedEvent","addEvent","addCompressedEvent","worker","postMessage","terminate","canUseIdleCallback","timeout","Worker","URL","createObjectURL","Blob","onerror","onmessage","scheduleIdleProcessing","requestIdleCallback","idleDeadline","processQueue","enqueueEvent","timeRemaining","didTimeout","task","shift","STORAGE_FAILURE","VERSION","SessionReplayTrackDestination","payloadBatcher","storageKey","scheduled","sendEventsList","destinationData","addToQueue","list","context","schedule","flush","useRetry","later","all","url","location","href","getCurrentUrl","device_id","session_id","sessionReplayLibrary","events","Authorization","handleReponse","responseBody","handleSuccessResponse","handleOtherResponse","sizeOfEventsList","size","onComplete","BaseEventsStore","timeAtLastSplit","_timeAtLastSplit","minInterval","maxInterval","maxPersistedEventsSize","interval","shouldSplitEventsList","nextEventString","sizeOfNextEvent","getStringSize","getEventsArraySize","totalSize","RecordingStatus","currentSequenceKey","sequencesToSendKey","batchPromiseAll","promiseBatch","chunkSize","batch","splice","defineObjectStores","db","sequencesStore","currentSequenceStore","objectStoreNames","contains","createObjectStore","keyPath","autoIncrement","createIndex","SessionReplayEventsIDBStore","getSequencesToSend","sequences","cursor","transaction","store","openCursor","sequenceId","continue","storeCurrentSequence","currentSequenceData","put","addEventToCurrentSequence","tx","sequenceEvents","eventsToSend","updatedEvents","storeSendingEvents","cleanUpSessionEventsStore","_sessionId","transitionFromKeyValStore","keyValDb","reject","indexedDB","request","open","onupgradeneeded","close","deleteDatabase","onsuccess","keyValDatabaseExists","transitionCurrentSessionSequences","numericSessionId","sessionStore","currentSessionSequences","sessionSequences","promisesToBatch","numericSequenceId","parseInt","sequence","currentSequenceId","eventAddPromises","SENT","getAllRequest","objectStore","getAll","transitionPromise","storedReplaySessionContextList","target","storedReplaySessionContexts","storedSessionId","oldSessionStore","oldSessionSequences","dbSuffix","dbName","openDB","upgrade","createStore","eventsIDBStore","getCurrentSequenceEvents","allEvents","InMemoryEventsStore","finalizedSequences","resetCurrentSequence","addSequence","sequenceReturn","createEventsManager","trackDestination","getMemoryStore","new","catch","sendCurrentSequenceEvents","currentSequence","sequenceToSend","sendStoredEvents","sequencesToSend","MultiEventManager","managers","managersMap","Map","manager","promises","testableAccessors","Node","ShadowRoot","Element","MutationObserver","testableMethods","untaintedBasePrototype","getUntaintedPrototype","candidate","angularUnpatchedVersionSymbol","Zone","__symbol__","angularZoneUnpatchedAlternative","defaultPrototype","accessorNames","isUntaintedAccessors","Boolean","accessor","getOwnPropertyDescriptor","methodNames","isUntaintedMethods","iframeEl","createElement","appendChild","win","contentWindow","untaintedObject","removeChild","untaintedAccessorCache","getUntaintedAccessor","instance","cacheKey","untaintedPrototype","untaintedAccessor","untaintedMethodCache","getUntaintedMethod","untaintedMethod","index","childNodes","parentNode","parentElement","textContent","other","getRootNode","host","styleSheets","shadowRoot","querySelectorAll","mutationObserver","getWindowHeight","innerHeight","documentElement","clientHeight","getWindowWidth","innerWidth","clientWidth","rootDocument","finder","input","nodeType","ELEMENT_NODE","tagName","defaults","root","idName","_name","className","attr","_value","seedMinLength","optimizedMinLength","threshold","maxNumberOfTries","timeoutMs","rootNode","DOCUMENT_NODE","ownerDocument","findRootDocument","path","bottomUpSearch","optimized","optimize","limit","fallback","current","elapsedTime","getTime","maybe","id","classNames","penalty","nth","dispensableNth","node","nthChild","findUniquePath","paths","combinations","unique","query","reduce","acc","css","elementId","getAttribute","CSS","escape","attrs","from","attributes","classList","parent","child","firstChild","nextSibling","notEmpty","scope","counter","visited","newPath","newPathKey","has","same","clickNonBatcher","clickEvents","evt","record","count","clickBatcher","reduced","curr","y","timestamp","hour","k","values","clickHook","deviceIdFn","mirror","Click","getNode","left","scrollX","top","scrollY","doc","scrollingElement","scrollLeft","pageXOffset","dom","scrollTop","pageYOffset","getWindowScroll","viewportHeight","viewportWidth","BeaconTransport","sendBeacon","sendXhr","xhr","XMLHttpRequest","setRequestHeader","basePageUrl","ScrollWatcher","transport","hook","update","_","maxScrollX","_maxScrollX","maxScrollY","_maxScrollY","maxScrollWidth","_maxScrollWidth","maxScrollHeight","_maxScrollHeight","width","height","SessionIdentifiers","sessionReplayId","generateSessionReplayId","targetingIDBStore","dbs","openOrCreateDB","getTargetingMatchForSession","sessionIdStr","targetingMatchForSession","targetingMatch","storeTargetingMatchForSession","lastUpdated","clearStoreOfOldSessions","currentSessionId","currentSessionIdStr","allTargetingMatchObjs","targetingMatchObj","amountOfTimeSinceSession","createUrlTrackingPlugin","observer","cb","pluginOptions","enablePolling","pollingInterval","lastTrackedUrl","emitUrlChange","currentUrl","currentTitle","title","createUrlChangeEvent","createHistoryMethodPatch","originalMethod","hashChangeHandler","urlChangeInterval","setInterval","clearInterval","history","originalPushState","pushState","originalReplaceState","replaceState","setupHistoryPatching","addEventListener","removeEventListener","SessionReplay","recordCancelCallback","eventCount","pageLeaveFns","recordFunction","teardownEventListeners","teardown","blurListener","focusListener","pageLeaveListener","sendEvents","recordEvents","evaluateTargetingAndCapture","targetingParams","isInit","identifiers","lastTargetingParams","eventForTargeting","event_type","evaluateTargeting","evaluateTargetingPackage","import","targetingResult","flag","evaluateTargetingAndStore","initialize","addCustomRRWebEvent","eventName","eventData","addStorageInfo","debugInfo","METADATA","storageSizeData","addCustomEvent","stopRecordingEvents","networkObservers","stop","typedError","init","_init","joinedConfigGenerator","createSessionReplayJoinedConfigGenerator","setMetadata","scrollWatcher","default","getDeviceId","scrollHook","rrwebEventManager","interactionEventManager","trackEveryNms","eventCompressor","useWebWorker","compressionScript","initializeNetworkObservers","setSessionId","asyncSetSessionId","lastShouldRecordDecision","previousSessionId","deviceIdForReplayId","getSessionReplayProperties","shouldRecord","getShouldRecord","eventProperties","appHash","GET_SR_PROPS","sessionIdToSend","shouldSendStoredEvents","shouldOptOut","identityStoreOptOut","matched","hashNumber","abs","isSessionInSample","TARGETING_DECISION","getBlockSelectors","getMaskTextSelectors","getRecordingPlugins","plugins","urlTrackingPlugin","getRecordConsolePlugin","levels","getRecordFunction","shouldLogMetadata","FETCH_REQUEST","hooks","mouseInteraction","scroll","emit","RRWebEventType","Meta","inlineStylesheet","maskAllInputs","maskTextClass","blockClass","maskInputFn","maskTextFn","maskTextSelector","recordCanvas","slimDOMOptions","script","comment","errorHandler","_external_","DEBUG_INFO","metadata","getSessionId","shutdown","mapSDKType","sdkType","replaySDKVersion","standaloneSDKVersion","hashValue","replaySDKType","standaloneSDKType","network","NetworkObservers","NetworkObserversClass","sessionReplay","createInstance"],"mappings":"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"}
1
+ {"version":3,"file":"index-min.js","sources":["../../../analytics-core/lib/esm/types/event/event.js","../../../analytics-core/lib/esm/types/constants.js","../../../analytics-core/lib/esm/types/status.js","../../../analytics-core/lib/esm/global-scope.js","../../../analytics-core/lib/esm/types/loglevel.js","../../../analytics-core/lib/esm/utils/return-wrapper.js","../../../analytics-core/lib/esm/logger.js","../../../analytics-core/lib/esm/config.js","../../../../node_modules/@amplitude/analytics-connector/dist/analytics-connector.esm.js","../../../analytics-core/lib/esm/types/server-zone.js","../../../analytics-core/lib/esm/utils/debug.js","../../../analytics-core/lib/esm/utils/sampling.js","../../../analytics-core/lib/esm/transports/base.js","../../../analytics-core/lib/esm/transports/fetch.js","../../../src/constants.ts","../../../src/logger.ts","../../../src/config/types.ts","../../../src/helpers.ts","../../../src/utils/get-input-type.ts","../../../src/config/local-config.ts","../../../../node_modules/@amplitude/rrweb-types/dist/rrweb-types.js","../../../analytics-remote-config/node_modules/@amplitude/analytics-types/lib/esm/server-zone.js","../../../analytics-remote-config/node_modules/@amplitude/analytics-types/lib/esm/status.js","../../../analytics-remote-config/node_modules/@amplitude/analytics-core/lib/esm/transports/base.js","../../../analytics-remote-config/lib/esm/remote-config.js","../../../analytics-remote-config/lib/esm/index.js","../../../src/config/joined-config.ts","../../../../node_modules/@amplitude/rrweb-packer/dist/base-BrE4jft0.js","../../../../node_modules/@amplitude/rrweb-packer/dist/pack.js","../../../src/events/event-compressor.ts","../../../src/messages.ts","../../../src/version.ts","../../../src/track-destination.ts","../../../src/events/base-events-store.ts","../../../src/events/legacy-idb-types.ts","../../../src/events/events-idb-store.ts","../../../src/events/events-memory-store.ts","../../../src/events/events-manager.ts","../../../src/events/multi-manager.ts","../../../../node_modules/@amplitude/rrweb-utils/dist/rrweb-utils.js","../../../src/utils/rrweb.ts","../../../src/libs/finder.ts","../../../src/hooks/click.ts","../../../src/beacon-transport.ts","../../../src/hooks/scroll.ts","../../../src/identifiers.ts","../../../src/targeting/targeting-idb-store.ts","../../../src/plugins/url-tracking-plugin.ts","../../../src/session-replay.ts","../../../src/targeting/targeting-manager.ts","../../../analytics-core/lib/esm/analytics-connector.js","../../../src/session-replay-factory.ts","../../../src/index.ts"],"sourcesContent":["export var IdentifyOperation;\n(function (IdentifyOperation) {\n // Base Operations to set values\n IdentifyOperation[\"SET\"] = \"$set\";\n IdentifyOperation[\"SET_ONCE\"] = \"$setOnce\";\n // Operations around modifying existing values\n IdentifyOperation[\"ADD\"] = \"$add\";\n IdentifyOperation[\"APPEND\"] = \"$append\";\n IdentifyOperation[\"PREPEND\"] = \"$prepend\";\n IdentifyOperation[\"REMOVE\"] = \"$remove\";\n // Operations around appending values *if* they aren't present\n IdentifyOperation[\"PREINSERT\"] = \"$preInsert\";\n IdentifyOperation[\"POSTINSERT\"] = \"$postInsert\";\n // Operations around removing properties/values\n IdentifyOperation[\"UNSET\"] = \"$unset\";\n IdentifyOperation[\"CLEAR_ALL\"] = \"$clearAll\";\n})(IdentifyOperation || (IdentifyOperation = {}));\n/**\n * Strings that have special meaning when used as an event's type\n * and have different specifications.\n */\nexport var SpecialEventType;\n(function (SpecialEventType) {\n SpecialEventType[\"IDENTIFY\"] = \"$identify\";\n SpecialEventType[\"GROUP_IDENTIFY\"] = \"$groupidentify\";\n SpecialEventType[\"REVENUE\"] = \"revenue_amount\";\n})(SpecialEventType || (SpecialEventType = {}));\n//# sourceMappingURL=event.js.map","export var UNSET_VALUE = '-';\nexport var AMPLITUDE_PREFIX = 'AMP';\nexport var STORAGE_PREFIX = \"\".concat(AMPLITUDE_PREFIX, \"_unsent\");\nexport var DEFAULT_INSTANCE_NAME = '$default_instance';\nexport var AMPLITUDE_SERVER_URL = 'https://api2.amplitude.com/2/httpapi';\nexport var EU_AMPLITUDE_SERVER_URL = 'https://api.eu.amplitude.com/2/httpapi';\nexport var AMPLITUDE_BATCH_SERVER_URL = 'https://api2.amplitude.com/batch';\nexport var EU_AMPLITUDE_BATCH_SERVER_URL = 'https://api.eu.amplitude.com/batch';\n// Campaign constants\nexport var UTM_CAMPAIGN = 'utm_campaign';\nexport var UTM_CONTENT = 'utm_content';\nexport var UTM_ID = 'utm_id';\nexport var UTM_MEDIUM = 'utm_medium';\nexport var UTM_SOURCE = 'utm_source';\nexport var UTM_TERM = 'utm_term';\nexport var DCLID = 'dclid';\nexport var FBCLID = 'fbclid';\nexport var GBRAID = 'gbraid';\nexport var GCLID = 'gclid';\nexport var KO_CLICK_ID = 'ko_click_id';\nexport var LI_FAT_ID = 'li_fat_id';\nexport var MSCLKID = 'msclkid';\nexport var RDT_CID = 'rdt_cid';\nexport var TTCLID = 'ttclid';\nexport var TWCLID = 'twclid';\nexport var WBRAID = 'wbraid';\nexport var EMPTY_VALUE = 'EMPTY';\nexport var BASE_CAMPAIGN = {\n utm_campaign: undefined,\n utm_content: undefined,\n utm_id: undefined,\n utm_medium: undefined,\n utm_source: undefined,\n utm_term: undefined,\n referrer: undefined,\n referring_domain: undefined,\n dclid: undefined,\n gbraid: undefined,\n gclid: undefined,\n fbclid: undefined,\n ko_click_id: undefined,\n li_fat_id: undefined,\n msclkid: undefined,\n rdt_cid: undefined,\n ttclid: undefined,\n twclid: undefined,\n wbraid: undefined,\n};\nexport var MKTG = 'MKTG';\n// list of Network headers that are safe to capture\nexport var SAFE_HEADERS = [\n 'access-control-allow-origin',\n 'access-control-allow-credentials',\n 'access-control-expose-headers',\n 'access-control-max-age',\n 'access-control-allow-methods',\n 'access-control-allow-headers',\n 'accept-patch',\n 'accept-ranges',\n 'age',\n 'allow',\n 'alt-svc',\n 'cache-control',\n 'connection',\n 'content-disposition',\n 'content-encoding',\n 'content-language',\n 'content-length',\n 'content-location',\n 'content-md5',\n 'content-range',\n 'content-type',\n 'date',\n 'delta-base',\n 'etag',\n 'expires',\n 'im',\n 'last-modified',\n 'link',\n 'location',\n 'permanent',\n 'p3p',\n 'pragma',\n 'proxy-authenticate',\n 'public-key-pins',\n 'retry-after',\n 'server',\n 'status',\n 'strict-transport-security',\n 'trailer',\n 'transfer-encoding',\n 'tk',\n 'upgrade',\n 'vary',\n 'via',\n 'warning',\n 'www-authenticate',\n 'x-b3-traceid',\n 'x-frame-options',\n];\n// list of Network headers to never capture\nexport var FORBIDDEN_HEADERS = ['authorization', 'cookie', 'set-cookie'];\n//# sourceMappingURL=constants.js.map","/** The status of an event. */\nexport var Status;\n(function (Status) {\n /** The status could not be determined. */\n Status[\"Unknown\"] = \"unknown\";\n /** The event was skipped due to configuration or callbacks. */\n Status[\"Skipped\"] = \"skipped\";\n /** The event was sent successfully. */\n Status[\"Success\"] = \"success\";\n /** A user or device in the payload is currently rate limited and should try again later. */\n Status[\"RateLimit\"] = \"rate_limit\";\n /** The sent payload was too large to be processed. */\n Status[\"PayloadTooLarge\"] = \"payload_too_large\";\n /** The event could not be processed. */\n Status[\"Invalid\"] = \"invalid\";\n /** A server-side error ocurred during submission. */\n Status[\"Failed\"] = \"failed\";\n /** a server or client side error occuring when a request takes too long and is cancelled */\n Status[\"Timeout\"] = \"Timeout\";\n /** NodeJS runtime environment error.. E.g. disconnected from network */\n Status[\"SystemError\"] = \"SystemError\";\n})(Status || (Status = {}));\n//# sourceMappingURL=status.js.map","/* eslint-disable no-restricted-globals */\n/* Only file allowed to access to globalThis, window, self */\nexport var getGlobalScope = function () {\n // This should only be used for integrations with Amplitude that are not running in a browser environment\n // We need to specify the name of the global variable as a string to prevent it from being minified\n var ampIntegrationContextName = 'ampIntegrationContext';\n if (typeof globalThis !== 'undefined' && typeof globalThis[ampIntegrationContextName] !== 'undefined') {\n return globalThis[ampIntegrationContextName];\n }\n if (typeof globalThis !== 'undefined') {\n return globalThis;\n }\n if (typeof window !== 'undefined') {\n return window;\n }\n if (typeof self !== 'undefined') {\n return self;\n }\n if (typeof global !== 'undefined') {\n return global;\n }\n return undefined;\n};\n//# sourceMappingURL=global-scope.js.map","export var LogLevel;\n(function (LogLevel) {\n LogLevel[LogLevel[\"None\"] = 0] = \"None\";\n LogLevel[LogLevel[\"Error\"] = 1] = \"Error\";\n LogLevel[LogLevel[\"Warn\"] = 2] = \"Warn\";\n LogLevel[LogLevel[\"Verbose\"] = 3] = \"Verbose\";\n LogLevel[LogLevel[\"Debug\"] = 4] = \"Debug\";\n})(LogLevel || (LogLevel = {}));\n//# sourceMappingURL=loglevel.js.map","export var returnWrapper = function (awaitable) { return ({\n promise: awaitable || Promise.resolve(),\n}); };\n//# sourceMappingURL=return-wrapper.js.map","import { LogLevel } from './types/loglevel';\nvar PREFIX = 'Amplitude Logger ';\nvar Logger = /** @class */ (function () {\n function Logger() {\n this.logLevel = LogLevel.None;\n }\n Logger.prototype.disable = function () {\n this.logLevel = LogLevel.None;\n };\n Logger.prototype.enable = function (logLevel) {\n if (logLevel === void 0) { logLevel = LogLevel.Warn; }\n this.logLevel = logLevel;\n };\n Logger.prototype.log = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (this.logLevel < LogLevel.Verbose) {\n return;\n }\n console.log(\"\".concat(PREFIX, \"[Log]: \").concat(args.join(' ')));\n };\n Logger.prototype.warn = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (this.logLevel < LogLevel.Warn) {\n return;\n }\n console.warn(\"\".concat(PREFIX, \"[Warn]: \").concat(args.join(' ')));\n };\n Logger.prototype.error = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (this.logLevel < LogLevel.Error) {\n return;\n }\n console.error(\"\".concat(PREFIX, \"[Error]: \").concat(args.join(' ')));\n };\n Logger.prototype.debug = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (this.logLevel < LogLevel.Debug) {\n return;\n }\n // console.debug output is hidden by default in chrome\n console.log(\"\".concat(PREFIX, \"[Debug]: \").concat(args.join(' ')));\n };\n return Logger;\n}());\nexport { Logger };\n//# sourceMappingURL=logger.js.map","import { AMPLITUDE_SERVER_URL, AMPLITUDE_BATCH_SERVER_URL, EU_AMPLITUDE_SERVER_URL, EU_AMPLITUDE_BATCH_SERVER_URL, DEFAULT_INSTANCE_NAME, } from './types/constants';\nimport { Logger } from './logger';\nimport { LogLevel } from './types/loglevel';\nexport var getDefaultConfig = function () { return ({\n flushMaxRetries: 12,\n flushQueueSize: 200,\n flushIntervalMillis: 10000,\n instanceName: DEFAULT_INSTANCE_NAME,\n logLevel: LogLevel.Warn,\n loggerProvider: new Logger(),\n offline: false,\n optOut: false,\n serverUrl: AMPLITUDE_SERVER_URL,\n serverZone: 'US',\n useBatch: false,\n}); };\nvar Config = /** @class */ (function () {\n function Config(options) {\n var _a, _b, _c, _d;\n this._optOut = false;\n var defaultConfig = getDefaultConfig();\n this.apiKey = options.apiKey;\n this.flushIntervalMillis = (_a = options.flushIntervalMillis) !== null && _a !== void 0 ? _a : defaultConfig.flushIntervalMillis;\n this.flushMaxRetries = options.flushMaxRetries || defaultConfig.flushMaxRetries;\n this.flushQueueSize = options.flushQueueSize || defaultConfig.flushQueueSize;\n this.instanceName = options.instanceName || defaultConfig.instanceName;\n this.loggerProvider = options.loggerProvider || defaultConfig.loggerProvider;\n this.logLevel = (_b = options.logLevel) !== null && _b !== void 0 ? _b : defaultConfig.logLevel;\n this.minIdLength = options.minIdLength;\n this.plan = options.plan;\n this.ingestionMetadata = options.ingestionMetadata;\n this.offline = options.offline !== undefined ? options.offline : defaultConfig.offline;\n this.optOut = (_c = options.optOut) !== null && _c !== void 0 ? _c : defaultConfig.optOut;\n this.serverUrl = options.serverUrl;\n this.serverZone = options.serverZone || defaultConfig.serverZone;\n this.storageProvider = options.storageProvider;\n this.transportProvider = options.transportProvider;\n this.useBatch = (_d = options.useBatch) !== null && _d !== void 0 ? _d : defaultConfig.useBatch;\n this.loggerProvider.enable(this.logLevel);\n var serverConfig = createServerConfig(options.serverUrl, options.serverZone, options.useBatch);\n this.serverZone = serverConfig.serverZone;\n this.serverUrl = serverConfig.serverUrl;\n }\n Object.defineProperty(Config.prototype, \"optOut\", {\n get: function () {\n return this._optOut;\n },\n set: function (optOut) {\n this._optOut = optOut;\n },\n enumerable: false,\n configurable: true\n });\n return Config;\n}());\nexport { Config };\nexport var getServerUrl = function (serverZone, useBatch) {\n if (serverZone === 'EU') {\n return useBatch ? EU_AMPLITUDE_BATCH_SERVER_URL : EU_AMPLITUDE_SERVER_URL;\n }\n return useBatch ? AMPLITUDE_BATCH_SERVER_URL : AMPLITUDE_SERVER_URL;\n};\nexport var createServerConfig = function (serverUrl, serverZone, useBatch) {\n if (serverUrl === void 0) { serverUrl = ''; }\n if (serverZone === void 0) { serverZone = getDefaultConfig().serverZone; }\n if (useBatch === void 0) { useBatch = getDefaultConfig().useBatch; }\n if (serverUrl) {\n return { serverUrl: serverUrl, serverZone: undefined };\n }\n var _serverZone = ['US', 'EU'].includes(serverZone) ? serverZone : getDefaultConfig().serverZone;\n return {\n serverZone: _serverZone,\n serverUrl: getServerUrl(_serverZone, useBatch),\n };\n};\nvar RequestMetadata = /** @class */ (function () {\n function RequestMetadata() {\n this.sdk = {\n metrics: {\n histogram: {},\n },\n };\n }\n RequestMetadata.prototype.recordHistogram = function (key, value) {\n this.sdk.metrics.histogram[key] = value;\n };\n return RequestMetadata;\n}());\nexport { RequestMetadata };\nvar HistogramOptions = /** @class */ (function () {\n function HistogramOptions() {\n }\n return HistogramOptions;\n}());\n//# sourceMappingURL=config.js.map","var ApplicationContextProviderImpl = /** @class */ (function () {\n function ApplicationContextProviderImpl() {\n }\n ApplicationContextProviderImpl.prototype.getApplicationContext = function () {\n return {\n versionName: this.versionName,\n language: getLanguage(),\n platform: 'Web',\n os: undefined,\n deviceModel: undefined,\n };\n };\n return ApplicationContextProviderImpl;\n}());\nvar getLanguage = function () {\n return ((typeof navigator !== 'undefined' &&\n ((navigator.languages && navigator.languages[0]) ||\n navigator.language)) ||\n '');\n};\n\nvar EventBridgeImpl = /** @class */ (function () {\n function EventBridgeImpl() {\n this.queue = [];\n }\n EventBridgeImpl.prototype.logEvent = function (event) {\n if (!this.receiver) {\n if (this.queue.length < 512) {\n this.queue.push(event);\n }\n }\n else {\n this.receiver(event);\n }\n };\n EventBridgeImpl.prototype.setEventReceiver = function (receiver) {\n this.receiver = receiver;\n if (this.queue.length > 0) {\n this.queue.forEach(function (event) {\n receiver(event);\n });\n this.queue = [];\n }\n };\n return EventBridgeImpl;\n}());\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\nvar __assign = function () {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nfunction __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator,\n m = s && o[s],\n i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return {\n value: o && o[i++],\n done: !o\n };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\nfunction __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o),\n r,\n ar = [],\n e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n } catch (error) {\n e = {\n error: error\n };\n } finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n } finally {\n if (e) throw e.error;\n }\n }\n return ar;\n}\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nvar isEqual = function (obj1, obj2) {\n var e_1, _a;\n var primitive = ['string', 'number', 'boolean', 'undefined'];\n var typeA = typeof obj1;\n var typeB = typeof obj2;\n if (typeA !== typeB) {\n return false;\n }\n try {\n for (var primitive_1 = __values(primitive), primitive_1_1 = primitive_1.next(); !primitive_1_1.done; primitive_1_1 = primitive_1.next()) {\n var p = primitive_1_1.value;\n if (p === typeA) {\n return obj1 === obj2;\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (primitive_1_1 && !primitive_1_1.done && (_a = primitive_1.return)) _a.call(primitive_1);\n }\n finally { if (e_1) throw e_1.error; }\n }\n // check null\n if (obj1 == null && obj2 == null) {\n return true;\n }\n else if (obj1 == null || obj2 == null) {\n return false;\n }\n // if got here - objects\n if (obj1.length !== obj2.length) {\n return false;\n }\n //check if arrays\n var isArrayA = Array.isArray(obj1);\n var isArrayB = Array.isArray(obj2);\n if (isArrayA !== isArrayB) {\n return false;\n }\n if (isArrayA && isArrayB) {\n //arrays\n for (var i = 0; i < obj1.length; i++) {\n if (!isEqual(obj1[i], obj2[i])) {\n return false;\n }\n }\n }\n else {\n //objects\n var sorted1 = Object.keys(obj1).sort();\n var sorted2 = Object.keys(obj2).sort();\n if (!isEqual(sorted1, sorted2)) {\n return false;\n }\n //compare object values\n var result_1 = true;\n Object.keys(obj1).forEach(function (key) {\n if (!isEqual(obj1[key], obj2[key])) {\n result_1 = false;\n }\n });\n return result_1;\n }\n return true;\n};\n\nvar ID_OP_SET = '$set';\nvar ID_OP_UNSET = '$unset';\nvar ID_OP_CLEAR_ALL = '$clearAll';\n// Polyfill for Object.entries\nif (!Object.entries) {\n Object.entries = function (obj) {\n var ownProps = Object.keys(obj);\n var i = ownProps.length;\n var resArray = new Array(i);\n while (i--) {\n resArray[i] = [ownProps[i], obj[ownProps[i]]];\n }\n return resArray;\n };\n}\nvar IdentityStoreImpl = /** @class */ (function () {\n function IdentityStoreImpl() {\n this.identity = { userProperties: {} };\n this.listeners = new Set();\n }\n IdentityStoreImpl.prototype.editIdentity = function () {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n var self = this;\n var actingUserProperties = __assign({}, this.identity.userProperties);\n var actingIdentity = __assign(__assign({}, this.identity), { userProperties: actingUserProperties });\n return {\n setUserId: function (userId) {\n actingIdentity.userId = userId;\n return this;\n },\n setDeviceId: function (deviceId) {\n actingIdentity.deviceId = deviceId;\n return this;\n },\n setUserProperties: function (userProperties) {\n actingIdentity.userProperties = userProperties;\n return this;\n },\n setOptOut: function (optOut) {\n actingIdentity.optOut = optOut;\n return this;\n },\n updateUserProperties: function (actions) {\n var e_1, _a, e_2, _b, e_3, _c;\n var actingProperties = actingIdentity.userProperties || {};\n try {\n for (var _d = __values(Object.entries(actions)), _e = _d.next(); !_e.done; _e = _d.next()) {\n var _f = __read(_e.value, 2), action = _f[0], properties = _f[1];\n switch (action) {\n case ID_OP_SET:\n try {\n for (var _g = (e_2 = void 0, __values(Object.entries(properties))), _h = _g.next(); !_h.done; _h = _g.next()) {\n var _j = __read(_h.value, 2), key = _j[0], value = _j[1];\n actingProperties[key] = value;\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (_h && !_h.done && (_b = _g.return)) _b.call(_g);\n }\n finally { if (e_2) throw e_2.error; }\n }\n break;\n case ID_OP_UNSET:\n try {\n for (var _k = (e_3 = void 0, __values(Object.keys(properties))), _l = _k.next(); !_l.done; _l = _k.next()) {\n var key = _l.value;\n delete actingProperties[key];\n }\n }\n catch (e_3_1) { e_3 = { error: e_3_1 }; }\n finally {\n try {\n if (_l && !_l.done && (_c = _k.return)) _c.call(_k);\n }\n finally { if (e_3) throw e_3.error; }\n }\n break;\n case ID_OP_CLEAR_ALL:\n actingProperties = {};\n break;\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_e && !_e.done && (_a = _d.return)) _a.call(_d);\n }\n finally { if (e_1) throw e_1.error; }\n }\n actingIdentity.userProperties = actingProperties;\n return this;\n },\n commit: function () {\n self.setIdentity(actingIdentity);\n return this;\n },\n };\n };\n IdentityStoreImpl.prototype.getIdentity = function () {\n return __assign({}, this.identity);\n };\n IdentityStoreImpl.prototype.setIdentity = function (identity) {\n var originalIdentity = __assign({}, this.identity);\n this.identity = __assign({}, identity);\n if (!isEqual(originalIdentity, this.identity)) {\n this.listeners.forEach(function (listener) {\n listener(identity);\n });\n }\n };\n IdentityStoreImpl.prototype.addIdentityListener = function (listener) {\n this.listeners.add(listener);\n };\n IdentityStoreImpl.prototype.removeIdentityListener = function (listener) {\n this.listeners.delete(listener);\n };\n return IdentityStoreImpl;\n}());\n\nvar safeGlobal = typeof globalThis !== 'undefined'\n ? globalThis\n : typeof global !== 'undefined'\n ? global\n : self;\n\nvar AnalyticsConnector = /** @class */ (function () {\n function AnalyticsConnector() {\n this.identityStore = new IdentityStoreImpl();\n this.eventBridge = new EventBridgeImpl();\n this.applicationContextProvider = new ApplicationContextProviderImpl();\n }\n AnalyticsConnector.getInstance = function (instanceName) {\n if (!safeGlobal['analyticsConnectorInstances']) {\n safeGlobal['analyticsConnectorInstances'] = {};\n }\n if (!safeGlobal['analyticsConnectorInstances'][instanceName]) {\n safeGlobal['analyticsConnectorInstances'][instanceName] =\n new AnalyticsConnector();\n }\n return safeGlobal['analyticsConnectorInstances'][instanceName];\n };\n return AnalyticsConnector;\n}());\n\nexport { AnalyticsConnector };\n","/**\n * @deprecated use ServerZoneType instead\n */\nexport var ServerZone;\n(function (ServerZone) {\n ServerZone[\"US\"] = \"US\";\n ServerZone[\"EU\"] = \"EU\";\n /**\n * Add for session-replay-browser migration from analytics-type v1.x.\n */\n ServerZone[\"STAGING\"] = \"STAGING\";\n})(ServerZone || (ServerZone = {}));\n//# sourceMappingURL=server-zone.js.map","import { __assign, __values } from \"tslib\";\nimport { LogLevel } from '../types/loglevel';\nexport var getStacktrace = function (ignoreDepth) {\n if (ignoreDepth === void 0) { ignoreDepth = 0; }\n var trace = new Error().stack || '';\n return trace\n .split('\\n')\n .slice(2 + ignoreDepth)\n .map(function (text) { return text.trim(); });\n};\n// This hook makes sure we always get the latest logger and logLevel.\nexport var getClientLogConfig = function (client) { return function () {\n var _a = __assign({}, client.config), logger = _a.loggerProvider, logLevel = _a.logLevel;\n return {\n logger: logger,\n logLevel: logLevel,\n };\n}; };\n// This is a convenient function to get the attribute from object with string path, similar to lodash '#get'.\nexport var getValueByStringPath = function (obj, path) {\n var e_1, _a;\n path = path.replace(/\\[(\\w+)\\]/g, '.$1'); // convert indexes to properties\n path = path.replace(/^\\./, ''); // strip a leading dot\n try {\n for (var _b = __values(path.split('.')), _c = _b.next(); !_c.done; _c = _b.next()) {\n var attr = _c.value;\n if (attr in obj) {\n obj = obj[attr];\n }\n else {\n return;\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return obj;\n};\nexport var getClientStates = function (client, paths) { return function () {\n var e_2, _a;\n var res = {};\n try {\n for (var paths_1 = __values(paths), paths_1_1 = paths_1.next(); !paths_1_1.done; paths_1_1 = paths_1.next()) {\n var path = paths_1_1.value;\n res[path] = getValueByStringPath(client, path);\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (paths_1_1 && !paths_1_1.done && (_a = paths_1.return)) _a.call(paths_1);\n }\n finally { if (e_2) throw e_2.error; }\n }\n return res;\n}; };\nexport var debugWrapper = function (fn, fnName, getLogConfig, getStates, fnContext) {\n if (fnContext === void 0) { fnContext = null; }\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var _a = getLogConfig(), logger = _a.logger, logLevel = _a.logLevel;\n // return early if possible to reduce overhead\n if ((logLevel && logLevel < LogLevel.Debug) || !logLevel || !logger) {\n return fn.apply(fnContext, args);\n }\n var debugContext = {\n type: 'invoke public method',\n name: fnName,\n args: args,\n stacktrace: getStacktrace(1),\n time: {\n start: new Date().toISOString(),\n },\n states: {},\n };\n if (getStates && debugContext.states) {\n debugContext.states.before = getStates();\n }\n var result = fn.apply(fnContext, args);\n if (result && result.promise) {\n // if result is a promise, add the callback\n result.promise.then(function () {\n if (getStates && debugContext.states) {\n debugContext.states.after = getStates();\n }\n if (debugContext.time) {\n debugContext.time.end = new Date().toISOString();\n }\n logger.debug(JSON.stringify(debugContext, null, 2));\n });\n }\n else {\n if (getStates && debugContext.states) {\n debugContext.states.after = getStates();\n }\n if (debugContext.time) {\n debugContext.time.end = new Date().toISOString();\n }\n logger.debug(JSON.stringify(debugContext, null, 2));\n }\n return result;\n };\n};\n//# sourceMappingURL=debug.js.map","export var generateHashCode = function (str) {\n var hash = 0;\n if (str.length === 0)\n return hash;\n for (var i = 0; i < str.length; i++) {\n var chr = str.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n hash |= 0;\n }\n return hash;\n};\nexport var isTimestampInSample = function (timestamp, sampleRate) {\n var hashNumber = generateHashCode(timestamp.toString());\n var absHash = Math.abs(hashNumber);\n var absHashMultiply = absHash * 31;\n var mod = absHashMultiply % 1000000;\n return mod / 1000000 < sampleRate;\n};\n//# sourceMappingURL=sampling.js.map","import { Status } from '../types/status';\nvar BaseTransport = /** @class */ (function () {\n function BaseTransport() {\n }\n BaseTransport.prototype.send = function (_serverUrl, _payload) {\n return Promise.resolve(null);\n };\n BaseTransport.prototype.buildResponse = function (responseJSON) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x;\n if (typeof responseJSON !== 'object') {\n return null;\n }\n var statusCode = responseJSON.code || 0;\n var status = this.buildStatus(statusCode);\n switch (status) {\n case Status.Success:\n return {\n status: status,\n statusCode: statusCode,\n body: {\n eventsIngested: (_a = responseJSON.events_ingested) !== null && _a !== void 0 ? _a : 0,\n payloadSizeBytes: (_b = responseJSON.payload_size_bytes) !== null && _b !== void 0 ? _b : 0,\n serverUploadTime: (_c = responseJSON.server_upload_time) !== null && _c !== void 0 ? _c : 0,\n },\n };\n case Status.Invalid:\n return {\n status: status,\n statusCode: statusCode,\n body: {\n error: (_d = responseJSON.error) !== null && _d !== void 0 ? _d : '',\n missingField: (_e = responseJSON.missing_field) !== null && _e !== void 0 ? _e : '',\n eventsWithInvalidFields: (_f = responseJSON.events_with_invalid_fields) !== null && _f !== void 0 ? _f : {},\n eventsWithMissingFields: (_g = responseJSON.events_with_missing_fields) !== null && _g !== void 0 ? _g : {},\n eventsWithInvalidIdLengths: (_h = responseJSON.events_with_invalid_id_lengths) !== null && _h !== void 0 ? _h : {},\n epsThreshold: (_j = responseJSON.eps_threshold) !== null && _j !== void 0 ? _j : 0,\n exceededDailyQuotaDevices: (_k = responseJSON.exceeded_daily_quota_devices) !== null && _k !== void 0 ? _k : {},\n silencedDevices: (_l = responseJSON.silenced_devices) !== null && _l !== void 0 ? _l : [],\n silencedEvents: (_m = responseJSON.silenced_events) !== null && _m !== void 0 ? _m : [],\n throttledDevices: (_o = responseJSON.throttled_devices) !== null && _o !== void 0 ? _o : {},\n throttledEvents: (_p = responseJSON.throttled_events) !== null && _p !== void 0 ? _p : [],\n },\n };\n case Status.PayloadTooLarge:\n return {\n status: status,\n statusCode: statusCode,\n body: {\n error: (_q = responseJSON.error) !== null && _q !== void 0 ? _q : '',\n },\n };\n case Status.RateLimit:\n return {\n status: status,\n statusCode: statusCode,\n body: {\n error: (_r = responseJSON.error) !== null && _r !== void 0 ? _r : '',\n epsThreshold: (_s = responseJSON.eps_threshold) !== null && _s !== void 0 ? _s : 0,\n throttledDevices: (_t = responseJSON.throttled_devices) !== null && _t !== void 0 ? _t : {},\n throttledUsers: (_u = responseJSON.throttled_users) !== null && _u !== void 0 ? _u : {},\n exceededDailyQuotaDevices: (_v = responseJSON.exceeded_daily_quota_devices) !== null && _v !== void 0 ? _v : {},\n exceededDailyQuotaUsers: (_w = responseJSON.exceeded_daily_quota_users) !== null && _w !== void 0 ? _w : {},\n throttledEvents: (_x = responseJSON.throttled_events) !== null && _x !== void 0 ? _x : [],\n },\n };\n case Status.Timeout:\n default:\n return {\n status: status,\n statusCode: statusCode,\n };\n }\n };\n BaseTransport.prototype.buildStatus = function (code) {\n if (code >= 200 && code < 300) {\n return Status.Success;\n }\n if (code === 429) {\n return Status.RateLimit;\n }\n if (code === 413) {\n return Status.PayloadTooLarge;\n }\n if (code === 408) {\n return Status.Timeout;\n }\n if (code >= 400 && code < 500) {\n return Status.Invalid;\n }\n if (code >= 500) {\n return Status.Failed;\n }\n return Status.Unknown;\n };\n return BaseTransport;\n}());\nexport { BaseTransport };\n//# sourceMappingURL=base.js.map","import { __awaiter, __extends, __generator } from \"tslib\";\nimport { BaseTransport } from './base';\nvar FetchTransport = /** @class */ (function (_super) {\n __extends(FetchTransport, _super);\n function FetchTransport() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n FetchTransport.prototype.send = function (serverUrl, payload) {\n return __awaiter(this, void 0, void 0, function () {\n var options, response, responseText;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n /* istanbul ignore if */\n if (typeof fetch === 'undefined') {\n throw new Error('FetchTransport is not supported');\n }\n options = {\n headers: {\n 'Content-Type': 'application/json',\n Accept: '*/*',\n },\n body: JSON.stringify(payload),\n method: 'POST',\n };\n return [4 /*yield*/, fetch(serverUrl, options)];\n case 1:\n response = _a.sent();\n return [4 /*yield*/, response.text()];\n case 2:\n responseText = _a.sent();\n try {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n return [2 /*return*/, this.buildResponse(JSON.parse(responseText))];\n }\n catch (_b) {\n return [2 /*return*/, this.buildResponse({ code: response.status })];\n }\n return [2 /*return*/];\n }\n });\n });\n };\n return FetchTransport;\n}(BaseTransport));\nexport { FetchTransport };\n//# sourceMappingURL=fetch.js.map","import { AMPLITUDE_PREFIX, ServerZone } from '@amplitude/analytics-core';\n\nexport const DEFAULT_EVENT_PROPERTY_PREFIX = '[Amplitude]';\n\nexport const DEFAULT_SESSION_REPLAY_PROPERTY = `${DEFAULT_EVENT_PROPERTY_PREFIX} Session Replay ID`;\nexport const DEFAULT_SESSION_START_EVENT = 'session_start';\nexport const DEFAULT_SESSION_END_EVENT = 'session_end';\nexport const DEFAULT_SAMPLE_RATE = 0;\nexport const DEFAULT_SERVER_ZONE = ServerZone.US;\nexport const DEFAULT_PERFORMANCE_CONFIG = { enabled: true };\nexport const DEFAULT_URL_CHANGE_POLLING_INTERVAL = 1000;\n\nexport const SESSION_REPLAY_DEBUG_PROPERTY = `${DEFAULT_EVENT_PROPERTY_PREFIX} Session Replay Debug`;\n\nexport const BLOCK_CLASS = 'amp-block';\nexport const MASK_TEXT_CLASS = 'amp-mask';\nexport const UNMASK_TEXT_CLASS = 'amp-unmask';\nexport const SESSION_REPLAY_SERVER_URL = 'https://api-sr.amplitude.com/sessions/v2/track';\nexport const SESSION_REPLAY_EU_URL = 'https://api-sr.eu.amplitude.com/sessions/v2/track';\nexport const SESSION_REPLAY_STAGING_URL = 'https://api-sr.stag2.amplitude.com/sessions/v2/track';\nexport const STORAGE_PREFIX = `${AMPLITUDE_PREFIX}_replay_unsent`;\nexport const MAX_EVENT_LIST_SIZE = 1 * 1000000; // ~1 MB limit for JSON serialized events payload\nexport const INTERACTION_MIN_INTERVAL = 30_000; // 30 seconds\nexport const INTERACTION_MAX_INTERVAL = 60_000; // 1 minute\nexport const MIN_INTERVAL = 500; // 500 ms\nexport const MAX_INTERVAL = 10 * 1000; // 10 seconds\nexport const MAX_IDB_STORAGE_LENGTH = 1000 * 60 * 60 * 24 * 3; // 3 days\nexport const KB_SIZE = 1024;\nexport const MAX_URL_LENGTH = 1000;\n\nexport enum CustomRRwebEvent {\n GET_SR_PROPS = 'get-sr-props',\n DEBUG_INFO = 'debug-info',\n FETCH_REQUEST = 'fetch-request',\n METADATA = 'metadata',\n TARGETING_DECISION = 'targeting-decision',\n}\n","import { ILogger, LogLevel } from '@amplitude/analytics-core';\n\nexport class SafeLoggerProvider implements ILogger {\n private logger: ILogger;\n\n log: typeof console.log;\n warn: typeof console.warn;\n error: typeof console.error;\n debug: typeof console.debug;\n\n constructor(loggerProvider: ILogger) {\n this.logger = loggerProvider;\n this.log = this.getSafeMethod('log');\n this.warn = this.getSafeMethod('warn');\n this.error = this.getSafeMethod('error');\n this.debug = this.getSafeMethod('debug');\n }\n\n private getSafeMethod<K extends keyof ILogger>(method: K): ILogger[K] {\n if (!this.logger) {\n return (() => {\n // No-op function fallback\n }) as ILogger[K];\n }\n\n const fn = this.logger[method];\n if (typeof fn === 'function') {\n const originalFn = (fn as { __rrweb_original__?: ILogger[K] }).__rrweb_original__ ?? fn;\n return originalFn.bind(this.logger) as ILogger[K];\n }\n\n return (() => {\n // No-op function fallback\n }) as ILogger[K];\n }\n\n enable(logLevel: LogLevel) {\n this.logger.enable(logLevel);\n }\n\n disable() {\n this.logger.disable();\n }\n}\n","import { IConfig, LogLevel, ILogger } from '@amplitude/analytics-core';\nimport { StoreType, ConsoleLogLevel } from '../typings/session-replay';\nimport { TargetingFlag } from '@amplitude/targeting';\n\nexport interface SamplingConfig {\n sample_rate: number;\n capture_enabled: boolean;\n}\n\nexport interface InteractionConfig {\n trackEveryNms?: number;\n enabled: boolean; // defaults to false\n batch: boolean; // defaults to false\n /**\n * UGC filter rules.\n */\n ugcFilterRules?: UGCFilterRule[];\n}\n\nexport interface LoggingConfig {\n console: {\n enabled: boolean;\n levels: ConsoleLogLevel[];\n };\n network?: {\n enabled: boolean;\n };\n}\n\nexport type TargetingConfig = TargetingFlag;\n\nexport type SessionReplayRemoteConfig = {\n sr_sampling_config?: SamplingConfig;\n sr_privacy_config?: PrivacyConfig;\n sr_interaction_config?: InteractionConfig;\n sr_logging_config?: LoggingConfig;\n sr_targeting_config?: TargetingConfig;\n};\n\nexport interface SessionReplayRemoteConfigAPIResponse {\n configs: {\n sessionReplay: SessionReplayRemoteConfig;\n };\n}\n\nexport type MaskLevel =\n | 'light' // only mask a subset of inputs that's deemed sensitive - password, credit card, telephone #, email. These are information we never want to capture.\n | 'medium' // mask all inputs\n | 'conservative'; // mask all inputs and all texts\n\nexport const DEFAULT_MASK_LEVEL = 'medium';\n\n// err on the side of excluding more\nexport type PrivacyConfig = {\n blockSelector?: string | string[]; // exclude in the UI\n defaultMaskLevel?: MaskLevel;\n maskSelector?: string[];\n unmaskSelector?: string[];\n};\n\n/**\n * UGC filter rule.\n */\nexport type UGCFilterRule = {\n /**\n * The selector of the UGC element.\n */\n selector: string;\n /**\n * The replacement text for the UGC element.\n */\n replacement: string;\n};\n\nexport interface SessionReplayLocalConfig extends IConfig {\n apiKey: string;\n loggerProvider: ILogger;\n /**\n * LogLevel.None or LogLevel.Error or LogLevel.Warn or LogLevel.Verbose or LogLevel.Debug.\n * Sets the log level.\n *\n * @defaultValue LogLevel.Warn\n */\n logLevel: LogLevel;\n /**\n * The maximum number of retries allowed for sending replay events.\n * Once this limit is reached, failed events will no longer be sent.\n *\n * @defaultValue 2\n */\n flushMaxRetries: number;\n /**\n * Use this option to control how many sessions to select for replay collection.\n * The number should be a decimal between 0 and 1, for example 0.4, representing\n * the fraction of sessions to have randomly selected for replay collection.\n * Over a large number of sessions, 0.4 would select 40% of those sessions.\n * Sample rates as small as six decimal places (0.000001) are supported.\n *\n * @defaultValue 0\n */\n sampleRate: number;\n privacyConfig?: PrivacyConfig;\n /**\n * Adds additional debug event property to help debug instrumentation issues\n * (such as mismatching apps). Only recommended for debugging initial setup,\n * and not recommended for production.\n */\n debugMode?: boolean;\n /**\n * Specifies the endpoint URL to fetch remote configuration.\n * If provided, it overrides the default server zone configuration.\n */\n configServerUrl?: string;\n /**\n * Specifies the endpoint URL for sending session replay data.\n * If provided, it overrides the default server zone configuration.\n */\n trackServerUrl?: string;\n /**\n * If stylesheets are inlined, the contents of the stylesheet will be stored.\n * During replay, the stored stylesheet will be used instead of attempting to fetch it remotely.\n * This prevents replays from appearing broken due to missing stylesheets.\n * Note: Inlining stylesheets may not work in all cases.\n */\n shouldInlineStylesheet?: boolean;\n version?: SessionReplayVersion;\n /**\n * Performance configuration config. If enabled, we will defer compression\n * to be done during the browser's idle periods.\n */\n performanceConfig?: SessionReplayPerformanceConfig;\n /**\n * Specifies how replay events should be stored. `idb` uses IndexedDB to persist replay events\n * when all events cannot be sent during capture. `memory` stores replay events only in memory,\n * meaning events are lost when the page is closed. If IndexedDB is unavailable, the system falls back to `memory`.\n */\n storeType: StoreType;\n\n /**\n * Experimental features.\n */\n experimental?: {\n /**\n * If the SDK should compress the replay events using a webworker.\n */\n useWebWorker: boolean;\n };\n userProperties?: { [key: string]: any };\n\n /**\n * Remove certain parts of the DOM from being captured. These are typically ignored when blocking by selectors.\n */\n omitElementTags?: {\n /**\n * If true, removes script tags from the DOM, but not noscript tags.\n */\n script?: boolean;\n /**\n * If true, removes comment tags from the DOM.\n */\n comment?: boolean;\n };\n\n /**\n * If true, applies a background color to blocked elements in the replay.\n * This helps visualize which elements are blocked from being captured.\n */\n applyBackgroundColorToBlockedElements?: boolean;\n /**\n * Enables URL change polling as a fallback for SPA route tracking.\n * When enabled, the SDK will periodically check for URL changes every second\n * in addition to patching the History API. This is useful for edge cases where\n * route changes might bypass the standard History API methods.\n *\n * @defaultValue false\n */\n enableUrlChangePolling?: boolean;\n /**\n * Specifies the interval in milliseconds for URL change polling when enableUrlChangePolling is true.\n * The SDK will check for URL changes at this interval as a fallback for SPA route tracking.\n *\n * @defaultValue 1000\n */\n urlChangePollingInterval?: number;\n /**\n * Whether to capture document title in URL change events.\n * When disabled, the title field will be empty in URL change events.\n *\n * @defaultValue false\n */\n captureDocumentTitle?: boolean;\n interactionConfig?: InteractionConfig;\n}\n\nexport interface SessionReplayJoinedConfig extends SessionReplayLocalConfig {\n captureEnabled?: boolean;\n interactionConfig?: InteractionConfig;\n loggingConfig?: LoggingConfig;\n targetingConfig?: TargetingConfig;\n}\n\nexport interface SessionReplayRemoteConfigFetch {\n getServerUrl: () => void;\n getSamplingConfig: (sessionId?: number) => Promise<SessionReplayRemoteConfig['sr_sampling_config'] | void>;\n fetchRemoteConfig: (sessionId?: number) => Promise<SessionReplayRemoteConfig | void>;\n getRemoteConfig: (sessionId?: number) => Promise<SessionReplayRemoteConfig | void>;\n}\n\nexport interface SessionReplayConfigs {\n localConfig: SessionReplayLocalConfig;\n joinedConfig: SessionReplayJoinedConfig;\n remoteConfig: SessionReplayRemoteConfig | undefined;\n}\nexport interface SessionReplayJoinedConfigGenerator {\n generateJoinedConfig: (sessionId?: string | number) => Promise<SessionReplayConfigs>;\n}\n\nexport interface SessionReplayMetadata {\n remoteConfig: SessionReplayRemoteConfig | undefined;\n localConfig: SessionReplayLocalConfig;\n joinedConfig: SessionReplayJoinedConfig;\n framework?: {\n name: string;\n version: string;\n };\n sessionId: string | number | undefined;\n hashValue?: number;\n sampleRate: number;\n replaySDKType: string | null;\n replaySDKVersion: string | undefined;\n standaloneSDKType: string;\n standaloneSDKVersion: string | undefined;\n}\n\nexport interface SessionReplayVersion {\n version: string;\n type: SessionReplayType;\n}\n\n/**\n * Configuration options for session replay performance.\n */\nexport interface SessionReplayPerformanceConfig {\n /**\n * If enabled, event compression will be deferred to occur during the browser's idle periods.\n */\n enabled: boolean;\n /**\n * Optional timeout in milliseconds for the `requestIdleCallback` API.\n * If specified, this value will be used to set a maximum time for the browser to wait\n * before executing the deferred compression task, even if the browser is not idle.\n */\n timeout?: number;\n}\n\nexport type SessionReplayType = 'standalone' | 'plugin' | 'segment';\n","import { getGlobalScope, ServerZone } from '@amplitude/analytics-core';\nimport { DEFAULT_MASK_LEVEL, MaskLevel, PrivacyConfig, SessionReplayJoinedConfig, UGCFilterRule } from './config/types';\nimport {\n KB_SIZE,\n MASK_TEXT_CLASS,\n SESSION_REPLAY_EU_URL,\n SESSION_REPLAY_SERVER_URL,\n SESSION_REPLAY_STAGING_URL,\n UNMASK_TEXT_CLASS,\n} from './constants';\nimport { StorageData } from './typings/session-replay';\nimport { getInputType } from './utils/get-input-type';\n\ntype ChromeStorageEstimate = {\n quota?: number;\n usage?: number;\n usageDetails?: { [key: string]: number };\n};\n\n/**\n * Light: Subset of inputs\n * Medium: All inputs\n * Conservative: All inputs and all texts\n */\nconst isMaskedForLevel = (elementType: 'input' | 'text', level: MaskLevel, element: HTMLElement | null): boolean => {\n switch (level) {\n case 'light': {\n if (elementType !== 'input') {\n return true;\n }\n\n const inputType = element ? getInputType(element) : '';\n /* istanbul ignore if */ // TODO(lew): For some reason it's impossible to test this.\n if (!inputType) {\n return false;\n }\n\n if (['password', 'hidden', 'email', 'tel'].includes(inputType)) {\n return true;\n }\n\n if ((element as HTMLInputElement).autocomplete.startsWith('cc-')) {\n return true;\n }\n\n return false;\n }\n case 'medium':\n case 'conservative':\n return true;\n default:\n return isMaskedForLevel(elementType, DEFAULT_MASK_LEVEL, element);\n }\n};\n\n/**\n * Checks if the given element set to be masked by rrweb\n *\n * Priority is:\n * 1. [In code] Element/class based masking/unmasking <> [Config based] Selector based masking/unmasking\n * 2. Use app defaults\n */\nconst isMasked = (\n elementType: 'input' | 'text',\n config: PrivacyConfig = { defaultMaskLevel: DEFAULT_MASK_LEVEL },\n element: HTMLElement | null,\n): boolean => {\n if (element) {\n // Element or parent is explicitly instrumented in code to mask\n if (element.closest('.' + MASK_TEXT_CLASS)) {\n return true;\n }\n\n // Config has override for mask\n const shouldMask = (config.maskSelector ?? []).some((selector) => element.closest(selector));\n if (shouldMask) {\n return true;\n }\n\n // Code or config has override to unmask\n if (element.closest('.' + UNMASK_TEXT_CLASS)) {\n return false;\n }\n\n // Here we are probably sent an element, but we want to match if they have a\n // parent with an unmask selector.\n const shouldUnmask = (config.unmaskSelector ?? []).some((selector) => element.closest(selector));\n if (shouldUnmask) {\n return false;\n }\n }\n\n return isMaskedForLevel(elementType, config.defaultMaskLevel ?? DEFAULT_MASK_LEVEL, element);\n};\n\nexport const maskFn =\n (elementType: 'text' | 'input', config?: PrivacyConfig) =>\n (text: string, element: HTMLElement | null): string => {\n return isMasked(elementType, config, element) ? text.replace(/[^\\s]/g, '*') : text;\n };\n\nexport const getCurrentUrl = () => {\n const globalScope = getGlobalScope();\n return globalScope?.location ? globalScope.location.href : '';\n};\n\nexport const generateSessionReplayId = (sessionId: string | number, deviceId: string): string => {\n return `${deviceId}/${sessionId}`;\n};\n\nexport const getServerUrl = (serverZone?: keyof typeof ServerZone, trackServerUrl?: string): string => {\n if (trackServerUrl) {\n return trackServerUrl;\n }\n\n if (serverZone === ServerZone.STAGING) {\n return SESSION_REPLAY_STAGING_URL;\n }\n\n if (serverZone === ServerZone.EU) {\n return SESSION_REPLAY_EU_URL;\n }\n\n return SESSION_REPLAY_SERVER_URL;\n};\n\nconst isValidGlobUrl = (globUrl: string): boolean => {\n if (typeof globUrl !== 'string' || globUrl.trim() === '') return false;\n const urlPattern = /^\\/|^https?:\\/\\/[^\\s]+$/;\n if (!urlPattern.test(globUrl)) return false;\n return true;\n};\n\nconst globToRegex = (glob: string): RegExp => {\n // Escape special regex characters, then convert globs\n const escaped = glob\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // Escape regex specials\n .replace(/\\*/g, '.*') // Convert * to .*\n .replace(/\\?/g, '.'); // Convert ? to .\n\n return new RegExp(`^${escaped}$`);\n};\n\nexport const validateUGCFilterRules = (ugcFilterRules: UGCFilterRule[]) => {\n // validate ugcFilterRules\n if (!ugcFilterRules.every((rule) => typeof rule.selector === 'string' && typeof rule.replacement === 'string')) {\n throw new Error('ugcFilterRules must be an array of objects with selector and replacement properties');\n }\n\n // validate ugcFilterRules are valid globs\n if (!ugcFilterRules.every((rule) => isValidGlobUrl(rule.selector))) {\n throw new Error('ugcFilterRules must be an array of objects with valid globs');\n }\n};\n\nexport const getPageUrl = (pageUrl: string, ugcFilterRules: UGCFilterRule[]) => {\n // apply ugcFilterRules, order is important, first rule wins\n for (const rule of ugcFilterRules) {\n const regex = globToRegex(rule.selector);\n\n if (regex.test(pageUrl)) {\n return pageUrl.replace(regex, rule.replacement);\n }\n }\n\n return pageUrl;\n};\n\nexport const getStorageSize = async (): Promise<StorageData> => {\n try {\n const globalScope = getGlobalScope();\n if (globalScope) {\n const { usage, quota, usageDetails }: ChromeStorageEstimate = await globalScope.navigator.storage.estimate();\n const totalStorageSize = usage ? Math.round(usage / KB_SIZE) : 0;\n const percentOfQuota = usage && quota ? Math.round((usage / quota + Number.EPSILON) * 1000) / 1000 : 0;\n return { totalStorageSize, percentOfQuota, usageDetails: JSON.stringify(usageDetails) };\n }\n } catch (e) {\n // swallow\n }\n return { totalStorageSize: 0, percentOfQuota: 0, usageDetails: '' };\n};\n\nexport const getDebugConfig = (config: SessionReplayJoinedConfig) => {\n const debugConfig = {\n ...config,\n };\n const { apiKey } = debugConfig;\n debugConfig.apiKey = `****${apiKey.substring(apiKey.length - 4)}`;\n return debugConfig;\n};\n","export function toLowerCase<T extends string>(str: T): Lowercase<T> {\n return str.toLowerCase() as unknown as Lowercase<T>;\n}\n\n/**\n * Get the type of an input element.\n * This takes care of the case where a password input is changed to a text input.\n * In this case, we continue to consider this of type password, in order to avoid leaking sensitive data\n * where passwords should be masked.\n */\nexport function getInputType(element: HTMLElement): Lowercase<string> | null {\n // when omitting the type of input element(e.g. <input />), the type is treated as text\n const type = (element as HTMLInputElement).type;\n\n return element.hasAttribute('data-rr-is-password')\n ? 'password'\n : type\n ? // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n toLowerCase(type)\n : null;\n}\n","import { Config, Logger, FetchTransport, LogLevel } from '@amplitude/analytics-core';\nimport {\n DEFAULT_PERFORMANCE_CONFIG,\n DEFAULT_SAMPLE_RATE,\n DEFAULT_SERVER_ZONE,\n DEFAULT_URL_CHANGE_POLLING_INTERVAL,\n} from '../constants';\nimport { SessionReplayOptions, StoreType } from '../typings/session-replay';\nimport {\n SessionReplayLocalConfig as ISessionReplayLocalConfig,\n InteractionConfig,\n PrivacyConfig,\n SessionReplayPerformanceConfig,\n SessionReplayVersion,\n} from './types';\nimport { SafeLoggerProvider } from '../logger';\nimport { validateUGCFilterRules } from '../helpers';\n\nexport const getDefaultConfig = () => ({\n flushMaxRetries: 2,\n logLevel: LogLevel.Warn,\n loggerProvider: new Logger(),\n transportProvider: new FetchTransport(),\n});\n\nexport class SessionReplayLocalConfig extends Config implements ISessionReplayLocalConfig {\n apiKey: string;\n sampleRate: number;\n privacyConfig?: PrivacyConfig;\n interactionConfig?: InteractionConfig;\n debugMode?: boolean;\n configServerUrl?: string;\n trackServerUrl?: string;\n shouldInlineStylesheet?: boolean;\n version?: SessionReplayVersion;\n storeType: StoreType;\n performanceConfig?: SessionReplayPerformanceConfig;\n experimental?: { useWebWorker: boolean };\n applyBackgroundColorToBlockedElements?: boolean;\n omitElementTags?: {\n script?: boolean;\n comment?: boolean;\n };\n enableUrlChangePolling?: boolean;\n urlChangePollingInterval?: number;\n captureDocumentTitle?: boolean;\n\n constructor(apiKey: string, options: SessionReplayOptions) {\n const defaultConfig = getDefaultConfig();\n super({\n transportProvider: defaultConfig.transportProvider,\n loggerProvider: new SafeLoggerProvider(options.loggerProvider || defaultConfig.loggerProvider),\n ...options,\n apiKey,\n });\n this.flushMaxRetries =\n options.flushMaxRetries !== undefined && options.flushMaxRetries <= defaultConfig.flushMaxRetries\n ? options.flushMaxRetries\n : defaultConfig.flushMaxRetries;\n\n this.apiKey = apiKey;\n this.sampleRate = options.sampleRate || DEFAULT_SAMPLE_RATE;\n this.serverZone = options.serverZone || DEFAULT_SERVER_ZONE;\n this.configServerUrl = options.configServerUrl;\n this.trackServerUrl = options.trackServerUrl;\n this.shouldInlineStylesheet = options.shouldInlineStylesheet;\n this.version = options.version;\n this.performanceConfig = options.performanceConfig || DEFAULT_PERFORMANCE_CONFIG;\n this.storeType = options.storeType ?? 'idb';\n this.applyBackgroundColorToBlockedElements = options.applyBackgroundColorToBlockedElements ?? false;\n this.enableUrlChangePolling = options.enableUrlChangePolling ?? false;\n this.urlChangePollingInterval = options.urlChangePollingInterval ?? DEFAULT_URL_CHANGE_POLLING_INTERVAL;\n this.captureDocumentTitle = options.captureDocumentTitle ?? false;\n\n if (options.privacyConfig) {\n this.privacyConfig = options.privacyConfig;\n }\n if (options.interactionConfig) {\n this.interactionConfig = options.interactionConfig;\n\n // validate ugcFilterRules, throw error if invalid - throw error at the beginning of the config\n if (this.interactionConfig.ugcFilterRules) {\n validateUGCFilterRules(this.interactionConfig.ugcFilterRules);\n }\n }\n if (options.debugMode) {\n this.debugMode = options.debugMode;\n }\n if (options.experimental) {\n this.experimental = options.experimental;\n }\n if (options.omitElementTags) {\n this.omitElementTags = options.omitElementTags;\n }\n }\n}\n","var EventType = /* @__PURE__ */ ((EventType2) => {\n EventType2[EventType2[\"DomContentLoaded\"] = 0] = \"DomContentLoaded\";\n EventType2[EventType2[\"Load\"] = 1] = \"Load\";\n EventType2[EventType2[\"FullSnapshot\"] = 2] = \"FullSnapshot\";\n EventType2[EventType2[\"IncrementalSnapshot\"] = 3] = \"IncrementalSnapshot\";\n EventType2[EventType2[\"Meta\"] = 4] = \"Meta\";\n EventType2[EventType2[\"Custom\"] = 5] = \"Custom\";\n EventType2[EventType2[\"Plugin\"] = 6] = \"Plugin\";\n return EventType2;\n})(EventType || {});\nvar IncrementalSource = /* @__PURE__ */ ((IncrementalSource2) => {\n IncrementalSource2[IncrementalSource2[\"Mutation\"] = 0] = \"Mutation\";\n IncrementalSource2[IncrementalSource2[\"MouseMove\"] = 1] = \"MouseMove\";\n IncrementalSource2[IncrementalSource2[\"MouseInteraction\"] = 2] = \"MouseInteraction\";\n IncrementalSource2[IncrementalSource2[\"Scroll\"] = 3] = \"Scroll\";\n IncrementalSource2[IncrementalSource2[\"ViewportResize\"] = 4] = \"ViewportResize\";\n IncrementalSource2[IncrementalSource2[\"Input\"] = 5] = \"Input\";\n IncrementalSource2[IncrementalSource2[\"TouchMove\"] = 6] = \"TouchMove\";\n IncrementalSource2[IncrementalSource2[\"MediaInteraction\"] = 7] = \"MediaInteraction\";\n IncrementalSource2[IncrementalSource2[\"StyleSheetRule\"] = 8] = \"StyleSheetRule\";\n IncrementalSource2[IncrementalSource2[\"CanvasMutation\"] = 9] = \"CanvasMutation\";\n IncrementalSource2[IncrementalSource2[\"Font\"] = 10] = \"Font\";\n IncrementalSource2[IncrementalSource2[\"Log\"] = 11] = \"Log\";\n IncrementalSource2[IncrementalSource2[\"Drag\"] = 12] = \"Drag\";\n IncrementalSource2[IncrementalSource2[\"StyleDeclaration\"] = 13] = \"StyleDeclaration\";\n IncrementalSource2[IncrementalSource2[\"Selection\"] = 14] = \"Selection\";\n IncrementalSource2[IncrementalSource2[\"AdoptedStyleSheet\"] = 15] = \"AdoptedStyleSheet\";\n IncrementalSource2[IncrementalSource2[\"CustomElement\"] = 16] = \"CustomElement\";\n return IncrementalSource2;\n})(IncrementalSource || {});\nvar MouseInteractions = /* @__PURE__ */ ((MouseInteractions2) => {\n MouseInteractions2[MouseInteractions2[\"MouseUp\"] = 0] = \"MouseUp\";\n MouseInteractions2[MouseInteractions2[\"MouseDown\"] = 1] = \"MouseDown\";\n MouseInteractions2[MouseInteractions2[\"Click\"] = 2] = \"Click\";\n MouseInteractions2[MouseInteractions2[\"ContextMenu\"] = 3] = \"ContextMenu\";\n MouseInteractions2[MouseInteractions2[\"DblClick\"] = 4] = \"DblClick\";\n MouseInteractions2[MouseInteractions2[\"Focus\"] = 5] = \"Focus\";\n MouseInteractions2[MouseInteractions2[\"Blur\"] = 6] = \"Blur\";\n MouseInteractions2[MouseInteractions2[\"TouchStart\"] = 7] = \"TouchStart\";\n MouseInteractions2[MouseInteractions2[\"TouchMove_Departed\"] = 8] = \"TouchMove_Departed\";\n MouseInteractions2[MouseInteractions2[\"TouchEnd\"] = 9] = \"TouchEnd\";\n MouseInteractions2[MouseInteractions2[\"TouchCancel\"] = 10] = \"TouchCancel\";\n return MouseInteractions2;\n})(MouseInteractions || {});\nvar PointerTypes = /* @__PURE__ */ ((PointerTypes2) => {\n PointerTypes2[PointerTypes2[\"Mouse\"] = 0] = \"Mouse\";\n PointerTypes2[PointerTypes2[\"Pen\"] = 1] = \"Pen\";\n PointerTypes2[PointerTypes2[\"Touch\"] = 2] = \"Touch\";\n return PointerTypes2;\n})(PointerTypes || {});\nvar CanvasContext = /* @__PURE__ */ ((CanvasContext2) => {\n CanvasContext2[CanvasContext2[\"2D\"] = 0] = \"2D\";\n CanvasContext2[CanvasContext2[\"WebGL\"] = 1] = \"WebGL\";\n CanvasContext2[CanvasContext2[\"WebGL2\"] = 2] = \"WebGL2\";\n return CanvasContext2;\n})(CanvasContext || {});\nvar MediaInteractions = /* @__PURE__ */ ((MediaInteractions2) => {\n MediaInteractions2[MediaInteractions2[\"Play\"] = 0] = \"Play\";\n MediaInteractions2[MediaInteractions2[\"Pause\"] = 1] = \"Pause\";\n MediaInteractions2[MediaInteractions2[\"Seeked\"] = 2] = \"Seeked\";\n MediaInteractions2[MediaInteractions2[\"VolumeChange\"] = 3] = \"VolumeChange\";\n MediaInteractions2[MediaInteractions2[\"RateChange\"] = 4] = \"RateChange\";\n return MediaInteractions2;\n})(MediaInteractions || {});\nvar ReplayerEvents = /* @__PURE__ */ ((ReplayerEvents2) => {\n ReplayerEvents2[\"Start\"] = \"start\";\n ReplayerEvents2[\"Pause\"] = \"pause\";\n ReplayerEvents2[\"Resume\"] = \"resume\";\n ReplayerEvents2[\"Resize\"] = \"resize\";\n ReplayerEvents2[\"Finish\"] = \"finish\";\n ReplayerEvents2[\"FullsnapshotRebuilded\"] = \"fullsnapshot-rebuilded\";\n ReplayerEvents2[\"LoadStylesheetStart\"] = \"load-stylesheet-start\";\n ReplayerEvents2[\"LoadStylesheetEnd\"] = \"load-stylesheet-end\";\n ReplayerEvents2[\"SkipStart\"] = \"skip-start\";\n ReplayerEvents2[\"SkipEnd\"] = \"skip-end\";\n ReplayerEvents2[\"MouseInteraction\"] = \"mouse-interaction\";\n ReplayerEvents2[\"EventCast\"] = \"event-cast\";\n ReplayerEvents2[\"CustomEvent\"] = \"custom-event\";\n ReplayerEvents2[\"Flush\"] = \"flush\";\n ReplayerEvents2[\"StateChange\"] = \"state-change\";\n ReplayerEvents2[\"PlayBack\"] = \"play-back\";\n ReplayerEvents2[\"Destroy\"] = \"destroy\";\n return ReplayerEvents2;\n})(ReplayerEvents || {});\nvar NodeType = /* @__PURE__ */ ((NodeType2) => {\n NodeType2[NodeType2[\"Document\"] = 0] = \"Document\";\n NodeType2[NodeType2[\"DocumentType\"] = 1] = \"DocumentType\";\n NodeType2[NodeType2[\"Element\"] = 2] = \"Element\";\n NodeType2[NodeType2[\"Text\"] = 3] = \"Text\";\n NodeType2[NodeType2[\"CDATA\"] = 4] = \"CDATA\";\n NodeType2[NodeType2[\"Comment\"] = 5] = \"Comment\";\n return NodeType2;\n})(NodeType || {});\nexport {\n CanvasContext,\n EventType,\n IncrementalSource,\n MediaInteractions,\n MouseInteractions,\n NodeType,\n PointerTypes,\n ReplayerEvents\n};\n//# sourceMappingURL=rrweb-types.js.map\n","export var ServerZone;\n(function (ServerZone) {\n ServerZone[\"US\"] = \"US\";\n ServerZone[\"EU\"] = \"EU\";\n ServerZone[\"STAGING\"] = \"STAGING\";\n})(ServerZone || (ServerZone = {}));\n//# sourceMappingURL=server-zone.js.map","/** The status of an event. */\nexport var Status;\n(function (Status) {\n /** The status could not be determined. */\n Status[\"Unknown\"] = \"unknown\";\n /** The event was skipped due to configuration or callbacks. */\n Status[\"Skipped\"] = \"skipped\";\n /** The event was sent successfully. */\n Status[\"Success\"] = \"success\";\n /** A user or device in the payload is currently rate limited and should try again later. */\n Status[\"RateLimit\"] = \"rate_limit\";\n /** The sent payload was too large to be processed. */\n Status[\"PayloadTooLarge\"] = \"payload_too_large\";\n /** The event could not be processed. */\n Status[\"Invalid\"] = \"invalid\";\n /** A server-side error ocurred during submission. */\n Status[\"Failed\"] = \"failed\";\n /** a server or client side error occuring when a request takes too long and is cancelled */\n Status[\"Timeout\"] = \"Timeout\";\n /** NodeJS runtime environment error.. E.g. disconnected from network */\n Status[\"SystemError\"] = \"SystemError\";\n})(Status || (Status = {}));\n//# sourceMappingURL=status.js.map","/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\nimport { Status } from '@amplitude/analytics-types';\nvar BaseTransport = /** @class */ (function () {\n function BaseTransport() {\n }\n BaseTransport.prototype.send = function (_serverUrl, _payload) {\n return Promise.resolve(null);\n };\n BaseTransport.prototype.buildResponse = function (responseJSON) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x;\n if (typeof responseJSON !== 'object') {\n return null;\n }\n var statusCode = responseJSON.code || 0;\n var status = this.buildStatus(statusCode);\n switch (status) {\n case Status.Success:\n return {\n status: status,\n statusCode: statusCode,\n body: {\n eventsIngested: (_a = responseJSON.events_ingested) !== null && _a !== void 0 ? _a : 0,\n payloadSizeBytes: (_b = responseJSON.payload_size_bytes) !== null && _b !== void 0 ? _b : 0,\n serverUploadTime: (_c = responseJSON.server_upload_time) !== null && _c !== void 0 ? _c : 0,\n },\n };\n case Status.Invalid:\n return {\n status: status,\n statusCode: statusCode,\n body: {\n error: (_d = responseJSON.error) !== null && _d !== void 0 ? _d : '',\n missingField: (_e = responseJSON.missing_field) !== null && _e !== void 0 ? _e : '',\n eventsWithInvalidFields: (_f = responseJSON.events_with_invalid_fields) !== null && _f !== void 0 ? _f : {},\n eventsWithMissingFields: (_g = responseJSON.events_with_missing_fields) !== null && _g !== void 0 ? _g : {},\n eventsWithInvalidIdLengths: (_h = responseJSON.events_with_invalid_id_lengths) !== null && _h !== void 0 ? _h : {},\n epsThreshold: (_j = responseJSON.eps_threshold) !== null && _j !== void 0 ? _j : 0,\n exceededDailyQuotaDevices: (_k = responseJSON.exceeded_daily_quota_devices) !== null && _k !== void 0 ? _k : {},\n silencedDevices: (_l = responseJSON.silenced_devices) !== null && _l !== void 0 ? _l : [],\n silencedEvents: (_m = responseJSON.silenced_events) !== null && _m !== void 0 ? _m : [],\n throttledDevices: (_o = responseJSON.throttled_devices) !== null && _o !== void 0 ? _o : {},\n throttledEvents: (_p = responseJSON.throttled_events) !== null && _p !== void 0 ? _p : [],\n },\n };\n case Status.PayloadTooLarge:\n return {\n status: status,\n statusCode: statusCode,\n body: {\n error: (_q = responseJSON.error) !== null && _q !== void 0 ? _q : '',\n },\n };\n case Status.RateLimit:\n return {\n status: status,\n statusCode: statusCode,\n body: {\n error: (_r = responseJSON.error) !== null && _r !== void 0 ? _r : '',\n epsThreshold: (_s = responseJSON.eps_threshold) !== null && _s !== void 0 ? _s : 0,\n throttledDevices: (_t = responseJSON.throttled_devices) !== null && _t !== void 0 ? _t : {},\n throttledUsers: (_u = responseJSON.throttled_users) !== null && _u !== void 0 ? _u : {},\n exceededDailyQuotaDevices: (_v = responseJSON.exceeded_daily_quota_devices) !== null && _v !== void 0 ? _v : {},\n exceededDailyQuotaUsers: (_w = responseJSON.exceeded_daily_quota_users) !== null && _w !== void 0 ? _w : {},\n throttledEvents: (_x = responseJSON.throttled_events) !== null && _x !== void 0 ? _x : [],\n },\n };\n case Status.Timeout:\n default:\n return {\n status: status,\n statusCode: statusCode,\n };\n }\n };\n BaseTransport.prototype.buildStatus = function (code) {\n if (code >= 200 && code < 300) {\n return Status.Success;\n }\n if (code === 429) {\n return Status.RateLimit;\n }\n if (code === 413) {\n return Status.PayloadTooLarge;\n }\n if (code === 408) {\n return Status.Timeout;\n }\n if (code >= 400 && code < 500) {\n return Status.Invalid;\n }\n if (code >= 500) {\n return Status.Failed;\n }\n return Status.Unknown;\n };\n return BaseTransport;\n}());\nexport { BaseTransport };\n//# sourceMappingURL=base.js.map","import { __assign, __awaiter, __generator, __values } from \"tslib\";\nimport { BaseTransport } from '@amplitude/analytics-core';\nimport { ServerZone, Status } from '@amplitude/analytics-types';\nvar UNEXPECTED_NETWORK_ERROR_MESSAGE = 'Network error occurred, remote config fetch failed';\nvar SUCCESS_REMOTE_CONFIG = 'Remote config successfully fetched';\nvar MAX_RETRIES_EXCEEDED_MESSAGE = 'Remote config fetch rejected due to exceeded retry count';\nvar TIMEOUT_MESSAGE = 'Remote config fetch rejected due to timeout after 5 seconds';\nvar UNEXPECTED_ERROR_MESSAGE = 'Unexpected error occurred';\nexport var REMOTE_CONFIG_SERVER_URL = 'https://sr-client-cfg.amplitude.com/config';\nexport var REMOTE_CONFIG_SERVER_URL_STAGING = 'https://sr-client-cfg.stag2.amplitude.com/config';\nexport var REMOTE_CONFIG_SERVER_URL_EU = 'https://sr-client-cfg.eu.amplitude.com/config';\nvar RemoteConfigFetch = /** @class */ (function () {\n function RemoteConfigFetch(_a) {\n var localConfig = _a.localConfig, configKeys = _a.configKeys;\n var _this = this;\n this.retryTimeout = 1000;\n this.attempts = 0;\n this.sessionTargetingMatch = false;\n this.metrics = {};\n this.getRemoteNamespaceConfig = function (configNamespace, sessionId) { return __awaiter(_this, void 0, void 0, function () {\n var fetchStartTime, configAPIResponse, remoteConfig;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n fetchStartTime = Date.now();\n return [4 /*yield*/, this.fetchWithTimeout(sessionId)];\n case 1:\n configAPIResponse = _a.sent();\n if (configAPIResponse) {\n remoteConfig = configAPIResponse.configs && configAPIResponse.configs[configNamespace];\n if (remoteConfig) {\n this.metrics.fetchTimeAPISuccess = Date.now() - fetchStartTime;\n return [2 /*return*/, remoteConfig];\n }\n }\n this.metrics.fetchTimeAPIFail = Date.now() - fetchStartTime;\n return [2 /*return*/, undefined];\n }\n });\n }); };\n this.getRemoteConfig = function (configNamespace, key, sessionId) { return __awaiter(_this, void 0, void 0, function () {\n var namespaceConfig;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, this.getRemoteNamespaceConfig(configNamespace, sessionId)];\n case 1:\n namespaceConfig = _a.sent();\n return [2 /*return*/, namespaceConfig === null || namespaceConfig === void 0 ? void 0 : namespaceConfig[key]];\n }\n });\n }); };\n this.fetchWithTimeout = function (sessionId) { return __awaiter(_this, void 0, void 0, function () {\n var controller, timeoutId, remoteConfig;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n controller = new AbortController();\n timeoutId = setTimeout(function () { return controller.abort(); }, 5000);\n return [4 /*yield*/, this.fetchRemoteConfig(controller.signal, sessionId)];\n case 1:\n remoteConfig = _a.sent();\n clearTimeout(timeoutId);\n return [2 /*return*/, remoteConfig];\n }\n });\n }); };\n this.fetchRemoteConfig = function (signal, sessionId) { return __awaiter(_this, void 0, void 0, function () {\n var urlParams, _a, _b, configKey, options, serverUrl, res, parsedStatus, e_1, knownError;\n var e_2, _c;\n var _d;\n return __generator(this, function (_e) {\n switch (_e.label) {\n case 0:\n if (sessionId === this.lastFetchedSessionId && this.attempts >= this.localConfig.flushMaxRetries) {\n return [2 /*return*/, this.completeRequest({ err: MAX_RETRIES_EXCEEDED_MESSAGE })];\n }\n else if (signal.aborted) {\n return [2 /*return*/, this.completeRequest({ err: TIMEOUT_MESSAGE })];\n }\n else if (sessionId !== this.lastFetchedSessionId) {\n this.lastFetchedSessionId = sessionId;\n this.attempts = 0;\n }\n _e.label = 1;\n case 1:\n _e.trys.push([1, 3, , 4]);\n urlParams = new URLSearchParams({\n api_key: this.localConfig.apiKey,\n });\n try {\n for (_a = __values(this.configKeys), _b = _a.next(); !_b.done; _b = _a.next()) {\n configKey = _b.value;\n urlParams.append('config_keys', configKey);\n }\n }\n catch (e_2_1) { e_2 = { error: e_2_1 }; }\n finally {\n try {\n if (_b && !_b.done && (_c = _a.return)) _c.call(_a);\n }\n finally { if (e_2) throw e_2.error; }\n }\n if (sessionId) {\n urlParams.set('session_id', String(sessionId));\n }\n options = {\n headers: {\n Accept: '*/*',\n },\n method: 'GET',\n };\n serverUrl = \"\".concat(this.getServerUrl(), \"?\").concat(urlParams.toString());\n this.attempts += 1;\n return [4 /*yield*/, fetch(serverUrl, __assign(__assign({}, options), { signal: signal }))];\n case 2:\n res = _e.sent();\n if (res === null) {\n return [2 /*return*/, this.completeRequest({ err: UNEXPECTED_ERROR_MESSAGE })];\n }\n parsedStatus = new BaseTransport().buildStatus(res.status);\n switch (parsedStatus) {\n case Status.Success:\n this.attempts = 0;\n return [2 /*return*/, this.parseAndStoreConfig(res)];\n case Status.Failed:\n return [2 /*return*/, this.retryFetch(signal, sessionId)];\n default:\n return [2 /*return*/, this.completeRequest({ err: UNEXPECTED_NETWORK_ERROR_MESSAGE })];\n }\n return [3 /*break*/, 4];\n case 3:\n e_1 = _e.sent();\n knownError = e_1;\n if (signal.aborted) {\n return [2 /*return*/, this.completeRequest({ err: TIMEOUT_MESSAGE })];\n }\n return [2 /*return*/, this.completeRequest({ err: (_d = knownError.message) !== null && _d !== void 0 ? _d : UNEXPECTED_ERROR_MESSAGE })];\n case 4: return [2 /*return*/];\n }\n });\n }); };\n this.retryFetch = function (signal, sessionId) { return __awaiter(_this, void 0, void 0, function () {\n var _this = this;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, _this.attempts * _this.retryTimeout); })];\n case 1:\n _a.sent();\n return [2 /*return*/, this.fetchRemoteConfig(signal, sessionId)];\n }\n });\n }); };\n this.parseAndStoreConfig = function (res) { return __awaiter(_this, void 0, void 0, function () {\n var remoteConfig;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, res.json()];\n case 1:\n remoteConfig = (_a.sent());\n this.completeRequest({ success: SUCCESS_REMOTE_CONFIG });\n return [2 /*return*/, remoteConfig];\n }\n });\n }); };\n this.localConfig = localConfig;\n this.configKeys = configKeys;\n }\n RemoteConfigFetch.prototype.getServerUrl = function () {\n if (this.localConfig.configServerUrl) {\n return this.localConfig.configServerUrl;\n }\n if (this.localConfig.serverZone === ServerZone.STAGING) {\n return REMOTE_CONFIG_SERVER_URL_STAGING;\n }\n if (this.localConfig.serverZone === ServerZone.EU) {\n return REMOTE_CONFIG_SERVER_URL_EU;\n }\n return REMOTE_CONFIG_SERVER_URL;\n };\n RemoteConfigFetch.prototype.completeRequest = function (_a) {\n var err = _a.err, success = _a.success;\n if (err) {\n throw new Error(err);\n }\n else if (success) {\n this.localConfig.loggerProvider.log(success);\n }\n };\n return RemoteConfigFetch;\n}());\nexport { RemoteConfigFetch };\nexport var createRemoteConfigFetch = function (_a) {\n var localConfig = _a.localConfig, configKeys = _a.configKeys;\n return __awaiter(void 0, void 0, void 0, function () {\n return __generator(this, function (_b) {\n return [2 /*return*/, new RemoteConfigFetch({ localConfig: localConfig, configKeys: configKeys })];\n });\n });\n};\n//# sourceMappingURL=remote-config.js.map","import * as remoteConfigFetch from './remote-config';\nexport var createRemoteConfigFetch = remoteConfigFetch.createRemoteConfigFetch;\n//# sourceMappingURL=index.js.map","import { RemoteConfigFetch, createRemoteConfigFetch } from '@amplitude/analytics-remote-config';\nimport { ILogger } from '@amplitude/analytics-core';\nimport { getDebugConfig } from '../helpers';\nimport { SessionReplayOptions } from '../typings/session-replay';\nimport { SessionReplayLocalConfig } from './local-config';\nimport {\n SessionReplayLocalConfig as ISessionReplayLocalConfig,\n PrivacyConfig,\n SessionReplayConfigs,\n SessionReplayJoinedConfig,\n SessionReplayRemoteConfig,\n} from './types';\n\nexport const removeInvalidSelectorsFromPrivacyConfig = (privacyConfig: PrivacyConfig, loggerProvider: ILogger) => {\n // This allows us to not search the DOM.\n const fragment = document.createDocumentFragment();\n\n const dropInvalidSelectors = (selectors: string[] | string = []): string[] | undefined => {\n if (typeof selectors === 'string') {\n selectors = [selectors];\n }\n selectors = selectors.filter((selector: string) => {\n try {\n fragment.querySelector(selector);\n } catch {\n loggerProvider.warn(`[session-replay-browser] omitting selector \"${selector}\" because it is invalid`);\n return false;\n }\n return true;\n });\n if (selectors.length === 0) {\n return undefined;\n }\n return selectors;\n };\n privacyConfig.blockSelector = dropInvalidSelectors(privacyConfig.blockSelector);\n privacyConfig.maskSelector = dropInvalidSelectors(privacyConfig.maskSelector);\n privacyConfig.unmaskSelector = dropInvalidSelectors(privacyConfig.unmaskSelector);\n return privacyConfig;\n};\nexport class SessionReplayJoinedConfigGenerator {\n private readonly localConfig: ISessionReplayLocalConfig;\n private readonly remoteConfigFetch: RemoteConfigFetch<SessionReplayRemoteConfig>;\n\n constructor(remoteConfigFetch: RemoteConfigFetch<SessionReplayRemoteConfig>, localConfig: ISessionReplayLocalConfig) {\n this.localConfig = localConfig;\n this.remoteConfigFetch = remoteConfigFetch;\n }\n\n async generateJoinedConfig(sessionId?: string | number): Promise<SessionReplayConfigs> {\n const config: SessionReplayJoinedConfig = { ...this.localConfig };\n // Special case here as optOut is implemented via getter/setter\n config.optOut = this.localConfig.optOut;\n // We always want captureEnabled to be true, unless there's an override\n // in the remote config.\n config.captureEnabled = true;\n let remoteConfig: SessionReplayRemoteConfig | undefined;\n try {\n const namespaceConfig = await this.remoteConfigFetch.getRemoteNamespaceConfig('sessionReplay', sessionId);\n if (namespaceConfig) {\n const samplingConfig = namespaceConfig.sr_sampling_config;\n const privacyConfig = namespaceConfig.sr_privacy_config;\n const targetingConfig = namespaceConfig.sr_targeting_config;\n\n const ugcFilterRules = config.interactionConfig?.ugcFilterRules;\n // This is intentionally forced to only be set through the remote config.\n config.interactionConfig = namespaceConfig.sr_interaction_config;\n if (config.interactionConfig && ugcFilterRules) {\n config.interactionConfig.ugcFilterRules = ugcFilterRules;\n }\n\n // This is intentionally forced to only be set through the remote config.\n config.loggingConfig = namespaceConfig.sr_logging_config;\n\n if (samplingConfig || privacyConfig || targetingConfig) {\n remoteConfig = {};\n if (samplingConfig) {\n remoteConfig.sr_sampling_config = samplingConfig;\n }\n if (privacyConfig) {\n remoteConfig.sr_privacy_config = privacyConfig;\n }\n if (targetingConfig) {\n remoteConfig.sr_targeting_config = targetingConfig;\n }\n }\n }\n } catch (err: unknown) {\n const knownError = err as Error;\n this.localConfig.loggerProvider.warn(knownError.message);\n config.captureEnabled = false;\n }\n\n if (!remoteConfig) {\n return {\n localConfig: this.localConfig,\n joinedConfig: config,\n remoteConfig,\n };\n }\n\n const {\n sr_sampling_config: samplingConfig,\n sr_privacy_config: remotePrivacyConfig,\n sr_targeting_config: targetingConfig,\n } = remoteConfig;\n if (samplingConfig && Object.keys(samplingConfig).length > 0) {\n if (Object.prototype.hasOwnProperty.call(samplingConfig, 'capture_enabled')) {\n config.captureEnabled = samplingConfig.capture_enabled;\n } else {\n config.captureEnabled = false;\n }\n\n if (Object.prototype.hasOwnProperty.call(samplingConfig, 'sample_rate')) {\n config.sampleRate = samplingConfig.sample_rate;\n }\n } else {\n // If config API response was valid (ie 200), but no config returned, assume that\n // customer has not yet set up config, and use sample rate from SDK options,\n // allowing for immediate replay capture\n config.captureEnabled = true;\n this.localConfig.loggerProvider.debug(\n 'Remote config successfully fetched, but no values set for project, Session Replay capture enabled.',\n );\n }\n\n // Remote config join acts somewhat like a left join between the remote and the local\n // config. That is, remote config has precedence over local values as with sampling.\n // However, non conflicting values will be added to the lists.\n // Here's an example to illustrate:\n //\n // Remote config: {'.selector1': 'MASK', '.selector2': 'UNMASK'}\n // Local config: {'.selector1': 'UNMASK', '.selector3': 'MASK'}\n //\n // Resolved config: {'.selector1': 'MASK', '.selector2': 'UNMASK', '.selector3': 'MASK'}\n // config.privacyConfig = {\n // ...(config.privacyConfig ?? {}),\n // ...remotePrivacyConfig,\n // };\n\n if (remotePrivacyConfig) {\n const localPrivacyConfig: PrivacyConfig = config.privacyConfig ?? {};\n\n const joinedPrivacyConfig: Required<PrivacyConfig> & { blockSelector: string[] } = {\n defaultMaskLevel: remotePrivacyConfig.defaultMaskLevel ?? localPrivacyConfig.defaultMaskLevel ?? 'medium',\n blockSelector: [],\n maskSelector: [],\n unmaskSelector: [],\n };\n\n const privacyConfigSelectorMap = (privacyConfig: PrivacyConfig): Record<string, 'mask' | 'unmask' | 'block'> => {\n const selectorMap: Record<string, 'mask' | 'unmask' | 'block'> = {};\n if (typeof privacyConfig.blockSelector === 'string') {\n privacyConfig.blockSelector = [privacyConfig.blockSelector];\n }\n\n for (const selector of privacyConfig.blockSelector ?? []) {\n selectorMap[selector] = 'block';\n }\n for (const selector of privacyConfig.maskSelector ?? []) {\n selectorMap[selector] = 'mask';\n }\n for (const selector of privacyConfig.unmaskSelector ?? []) {\n selectorMap[selector] = 'unmask';\n }\n return selectorMap;\n };\n\n const selectorMap: Record<string, 'mask' | 'unmask' | 'block'> = {\n ...privacyConfigSelectorMap(localPrivacyConfig),\n ...privacyConfigSelectorMap(remotePrivacyConfig),\n };\n\n for (const [selector, selectorType] of Object.entries(selectorMap)) {\n if (selectorType === 'mask') {\n joinedPrivacyConfig.maskSelector.push(selector);\n } else if (selectorType === 'block') {\n joinedPrivacyConfig.blockSelector.push(selector);\n } else if (selectorType === 'unmask') {\n joinedPrivacyConfig.unmaskSelector.push(selector);\n }\n }\n\n config.privacyConfig = removeInvalidSelectorsFromPrivacyConfig(\n joinedPrivacyConfig,\n this.localConfig.loggerProvider,\n );\n }\n\n if (targetingConfig && Object.keys(targetingConfig).length > 0) {\n config.targetingConfig = targetingConfig;\n }\n\n this.localConfig.loggerProvider.debug(\n JSON.stringify({ name: 'session replay joined config', config: getDebugConfig(config) }, null, 2),\n );\n\n return {\n localConfig: this.localConfig,\n joinedConfig: config,\n remoteConfig,\n };\n }\n}\n\nexport const createSessionReplayJoinedConfigGenerator = async (apiKey: string, options: SessionReplayOptions) => {\n const localConfig = new SessionReplayLocalConfig(apiKey, options);\n const remoteConfigFetch = await createRemoteConfigFetch<SessionReplayRemoteConfig>({\n localConfig,\n configKeys: ['sessionReplay'],\n });\n\n return new SessionReplayJoinedConfigGenerator(remoteConfigFetch, localConfig);\n};\n","var u8 = Uint8Array, u16 = Uint16Array, u32 = Uint32Array;\nvar fleb = new u8([\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 1,\n 1,\n 1,\n 1,\n 2,\n 2,\n 2,\n 2,\n 3,\n 3,\n 3,\n 3,\n 4,\n 4,\n 4,\n 4,\n 5,\n 5,\n 5,\n 5,\n 0,\n /* unused */\n 0,\n 0,\n /* impossible */\n 0\n]);\nvar fdeb = new u8([\n 0,\n 0,\n 0,\n 0,\n 1,\n 1,\n 2,\n 2,\n 3,\n 3,\n 4,\n 4,\n 5,\n 5,\n 6,\n 6,\n 7,\n 7,\n 8,\n 8,\n 9,\n 9,\n 10,\n 10,\n 11,\n 11,\n 12,\n 12,\n 13,\n 13,\n /* unused */\n 0,\n 0\n]);\nvar clim = new u8([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]);\nvar freb = function(eb, start) {\n var b = new u16(31);\n for (var i = 0; i < 31; ++i) {\n b[i] = start += 1 << eb[i - 1];\n }\n var r = new u32(b[30]);\n for (var i = 1; i < 30; ++i) {\n for (var j = b[i]; j < b[i + 1]; ++j) {\n r[j] = j - b[i] << 5 | i;\n }\n }\n return [b, r];\n};\nvar _a = freb(fleb, 2), fl = _a[0], revfl = _a[1];\nfl[28] = 258, revfl[258] = 28;\nvar _b = freb(fdeb, 0), fd = _b[0], revfd = _b[1];\nvar rev = new u16(32768);\nfor (var i = 0; i < 32768; ++i) {\n var x = (i & 43690) >>> 1 | (i & 21845) << 1;\n x = (x & 52428) >>> 2 | (x & 13107) << 2;\n x = (x & 61680) >>> 4 | (x & 3855) << 4;\n rev[i] = ((x & 65280) >>> 8 | (x & 255) << 8) >>> 1;\n}\nvar hMap = function(cd, mb, r) {\n var s = cd.length;\n var i = 0;\n var l = new u16(mb);\n for (; i < s; ++i)\n ++l[cd[i] - 1];\n var le = new u16(mb);\n for (i = 0; i < mb; ++i) {\n le[i] = le[i - 1] + l[i - 1] << 1;\n }\n var co;\n if (r) {\n co = new u16(1 << mb);\n var rvb = 15 - mb;\n for (i = 0; i < s; ++i) {\n if (cd[i]) {\n var sv = i << 4 | cd[i];\n var r_1 = mb - cd[i];\n var v = le[cd[i] - 1]++ << r_1;\n for (var m = v | (1 << r_1) - 1; v <= m; ++v) {\n co[rev[v] >>> rvb] = sv;\n }\n }\n }\n } else {\n co = new u16(s);\n for (i = 0; i < s; ++i)\n co[i] = rev[le[cd[i] - 1]++] >>> 15 - cd[i];\n }\n return co;\n};\nvar flt = new u8(288);\nfor (var i = 0; i < 144; ++i)\n flt[i] = 8;\nfor (var i = 144; i < 256; ++i)\n flt[i] = 9;\nfor (var i = 256; i < 280; ++i)\n flt[i] = 7;\nfor (var i = 280; i < 288; ++i)\n flt[i] = 8;\nvar fdt = new u8(32);\nfor (var i = 0; i < 32; ++i)\n fdt[i] = 5;\nvar flm = /* @__PURE__ */ hMap(flt, 9, 0), flrm = /* @__PURE__ */ hMap(flt, 9, 1);\nvar fdm = /* @__PURE__ */ hMap(fdt, 5, 0), fdrm = /* @__PURE__ */ hMap(fdt, 5, 1);\nvar max = function(a) {\n var m = a[0];\n for (var i = 1; i < a.length; ++i) {\n if (a[i] > m)\n m = a[i];\n }\n return m;\n};\nvar bits = function(d, p, m) {\n var o = p / 8 >> 0;\n return (d[o] | d[o + 1] << 8) >>> (p & 7) & m;\n};\nvar bits16 = function(d, p) {\n var o = p / 8 >> 0;\n return (d[o] | d[o + 1] << 8 | d[o + 2] << 16) >>> (p & 7);\n};\nvar shft = function(p) {\n return (p / 8 >> 0) + (p & 7 && 1);\n};\nvar slc = function(v, s, e) {\n if (e == null || e > v.length)\n e = v.length;\n var n = new (v instanceof u16 ? u16 : v instanceof u32 ? u32 : u8)(e - s);\n n.set(v.subarray(s, e));\n return n;\n};\nvar inflt = function(dat, buf, st) {\n var sl = dat.length;\n var noBuf = !buf || st;\n var noSt = !st || st.i;\n if (!st)\n st = {};\n if (!buf)\n buf = new u8(sl * 3);\n var cbuf = function(l2) {\n var bl = buf.length;\n if (l2 > bl) {\n var nbuf = new u8(Math.max(bl * 2, l2));\n nbuf.set(buf);\n buf = nbuf;\n }\n };\n var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;\n var tbts = sl * 8;\n do {\n if (!lm) {\n st.f = final = bits(dat, pos, 1);\n var type = bits(dat, pos + 1, 3);\n pos += 3;\n if (!type) {\n var s = shft(pos) + 4, l = dat[s - 4] | dat[s - 3] << 8, t = s + l;\n if (t > sl) {\n if (noSt)\n throw \"unexpected EOF\";\n break;\n }\n if (noBuf)\n cbuf(bt + l);\n buf.set(dat.subarray(s, t), bt);\n st.b = bt += l, st.p = pos = t * 8;\n continue;\n } else if (type == 1)\n lm = flrm, dm = fdrm, lbt = 9, dbt = 5;\n else if (type == 2) {\n var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;\n var tl = hLit + bits(dat, pos + 5, 31) + 1;\n pos += 14;\n var ldt = new u8(tl);\n var clt = new u8(19);\n for (var i = 0; i < hcLen; ++i) {\n clt[clim[i]] = bits(dat, pos + i * 3, 7);\n }\n pos += hcLen * 3;\n var clb = max(clt), clbmsk = (1 << clb) - 1;\n if (!noSt && pos + tl * (clb + 7) > tbts)\n break;\n var clm = hMap(clt, clb, 1);\n for (var i = 0; i < tl; ) {\n var r = clm[bits(dat, pos, clbmsk)];\n pos += r & 15;\n var s = r >>> 4;\n if (s < 16) {\n ldt[i++] = s;\n } else {\n var c = 0, n = 0;\n if (s == 16)\n n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];\n else if (s == 17)\n n = 3 + bits(dat, pos, 7), pos += 3;\n else if (s == 18)\n n = 11 + bits(dat, pos, 127), pos += 7;\n while (n--)\n ldt[i++] = c;\n }\n }\n var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);\n lbt = max(lt);\n dbt = max(dt);\n lm = hMap(lt, lbt, 1);\n dm = hMap(dt, dbt, 1);\n } else\n throw \"invalid block type\";\n if (pos > tbts)\n throw \"unexpected EOF\";\n }\n if (noBuf)\n cbuf(bt + 131072);\n var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;\n var mxa = lbt + dbt + 18;\n while (noSt || pos + mxa < tbts) {\n var c = lm[bits16(dat, pos) & lms], sym = c >>> 4;\n pos += c & 15;\n if (pos > tbts)\n throw \"unexpected EOF\";\n if (!c)\n throw \"invalid length/literal\";\n if (sym < 256)\n buf[bt++] = sym;\n else if (sym == 256) {\n lm = null;\n break;\n } else {\n var add = sym - 254;\n if (sym > 264) {\n var i = sym - 257, b = fleb[i];\n add = bits(dat, pos, (1 << b) - 1) + fl[i];\n pos += b;\n }\n var d = dm[bits16(dat, pos) & dms], dsym = d >>> 4;\n if (!d)\n throw \"invalid distance\";\n pos += d & 15;\n var dt = fd[dsym];\n if (dsym > 3) {\n var b = fdeb[dsym];\n dt += bits16(dat, pos) & (1 << b) - 1, pos += b;\n }\n if (pos > tbts)\n throw \"unexpected EOF\";\n if (noBuf)\n cbuf(bt + 131072);\n var end = bt + add;\n for (; bt < end; bt += 4) {\n buf[bt] = buf[bt - dt];\n buf[bt + 1] = buf[bt + 1 - dt];\n buf[bt + 2] = buf[bt + 2 - dt];\n buf[bt + 3] = buf[bt + 3 - dt];\n }\n bt = end;\n }\n }\n st.l = lm, st.p = pos, st.b = bt;\n if (lm)\n final = 1, st.m = lbt, st.d = dm, st.n = dbt;\n } while (!final);\n return bt == buf.length ? buf : slc(buf, 0, bt);\n};\nvar wbits = function(d, p, v) {\n v <<= p & 7;\n var o = p / 8 >> 0;\n d[o] |= v;\n d[o + 1] |= v >>> 8;\n};\nvar wbits16 = function(d, p, v) {\n v <<= p & 7;\n var o = p / 8 >> 0;\n d[o] |= v;\n d[o + 1] |= v >>> 8;\n d[o + 2] |= v >>> 16;\n};\nvar hTree = function(d, mb) {\n var t = [];\n for (var i = 0; i < d.length; ++i) {\n if (d[i])\n t.push({ s: i, f: d[i] });\n }\n var s = t.length;\n var t2 = t.slice();\n if (!s)\n return [new u8(0), 0];\n if (s == 1) {\n var v = new u8(t[0].s + 1);\n v[t[0].s] = 1;\n return [v, 1];\n }\n t.sort(function(a, b) {\n return a.f - b.f;\n });\n t.push({ s: -1, f: 25001 });\n var l = t[0], r = t[1], i0 = 0, i1 = 1, i2 = 2;\n t[0] = { s: -1, f: l.f + r.f, l, r };\n while (i1 != s - 1) {\n l = t[t[i0].f < t[i2].f ? i0++ : i2++];\n r = t[i0 != i1 && t[i0].f < t[i2].f ? i0++ : i2++];\n t[i1++] = { s: -1, f: l.f + r.f, l, r };\n }\n var maxSym = t2[0].s;\n for (var i = 1; i < s; ++i) {\n if (t2[i].s > maxSym)\n maxSym = t2[i].s;\n }\n var tr = new u16(maxSym + 1);\n var mbt = ln(t[i1 - 1], tr, 0);\n if (mbt > mb) {\n var i = 0, dt = 0;\n var lft = mbt - mb, cst = 1 << lft;\n t2.sort(function(a, b) {\n return tr[b.s] - tr[a.s] || a.f - b.f;\n });\n for (; i < s; ++i) {\n var i2_1 = t2[i].s;\n if (tr[i2_1] > mb) {\n dt += cst - (1 << mbt - tr[i2_1]);\n tr[i2_1] = mb;\n } else\n break;\n }\n dt >>>= lft;\n while (dt > 0) {\n var i2_2 = t2[i].s;\n if (tr[i2_2] < mb)\n dt -= 1 << mb - tr[i2_2]++ - 1;\n else\n ++i;\n }\n for (; i >= 0 && dt; --i) {\n var i2_3 = t2[i].s;\n if (tr[i2_3] == mb) {\n --tr[i2_3];\n ++dt;\n }\n }\n mbt = mb;\n }\n return [new u8(tr), mbt];\n};\nvar ln = function(n, l, d) {\n return n.s == -1 ? Math.max(ln(n.l, l, d + 1), ln(n.r, l, d + 1)) : l[n.s] = d;\n};\nvar lc = function(c) {\n var s = c.length;\n while (s && !c[--s])\n ;\n var cl = new u16(++s);\n var cli = 0, cln = c[0], cls = 1;\n var w = function(v) {\n cl[cli++] = v;\n };\n for (var i = 1; i <= s; ++i) {\n if (c[i] == cln && i != s)\n ++cls;\n else {\n if (!cln && cls > 2) {\n for (; cls > 138; cls -= 138)\n w(32754);\n if (cls > 2) {\n w(cls > 10 ? cls - 11 << 5 | 28690 : cls - 3 << 5 | 12305);\n cls = 0;\n }\n } else if (cls > 3) {\n w(cln), --cls;\n for (; cls > 6; cls -= 6)\n w(8304);\n if (cls > 2)\n w(cls - 3 << 5 | 8208), cls = 0;\n }\n while (cls--)\n w(cln);\n cls = 1;\n cln = c[i];\n }\n }\n return [cl.subarray(0, cli), s];\n};\nvar clen = function(cf, cl) {\n var l = 0;\n for (var i = 0; i < cl.length; ++i)\n l += cf[i] * cl[i];\n return l;\n};\nvar wfblk = function(out, pos, dat) {\n var s = dat.length;\n var o = shft(pos + 2);\n out[o] = s & 255;\n out[o + 1] = s >>> 8;\n out[o + 2] = out[o] ^ 255;\n out[o + 3] = out[o + 1] ^ 255;\n for (var i = 0; i < s; ++i)\n out[o + i + 4] = dat[i];\n return (o + 4 + s) * 8;\n};\nvar wblk = function(dat, out, final, syms, lf, df, eb, li, bs, bl, p) {\n wbits(out, p++, final);\n ++lf[256];\n var _a2 = hTree(lf, 15), dlt = _a2[0], mlb = _a2[1];\n var _b2 = hTree(df, 15), ddt = _b2[0], mdb = _b2[1];\n var _c = lc(dlt), lclt = _c[0], nlc = _c[1];\n var _d = lc(ddt), lcdt = _d[0], ndc = _d[1];\n var lcfreq = new u16(19);\n for (var i = 0; i < lclt.length; ++i)\n lcfreq[lclt[i] & 31]++;\n for (var i = 0; i < lcdt.length; ++i)\n lcfreq[lcdt[i] & 31]++;\n var _e = hTree(lcfreq, 7), lct = _e[0], mlcb = _e[1];\n var nlcc = 19;\n for (; nlcc > 4 && !lct[clim[nlcc - 1]]; --nlcc)\n ;\n var flen = bl + 5 << 3;\n var ftlen = clen(lf, flt) + clen(df, fdt) + eb;\n var dtlen = clen(lf, dlt) + clen(df, ddt) + eb + 14 + 3 * nlcc + clen(lcfreq, lct) + (2 * lcfreq[16] + 3 * lcfreq[17] + 7 * lcfreq[18]);\n if (flen <= ftlen && flen <= dtlen)\n return wfblk(out, p, dat.subarray(bs, bs + bl));\n var lm, ll, dm, dl;\n wbits(out, p, 1 + (dtlen < ftlen)), p += 2;\n if (dtlen < ftlen) {\n lm = hMap(dlt, mlb, 0), ll = dlt, dm = hMap(ddt, mdb, 0), dl = ddt;\n var llm = hMap(lct, mlcb, 0);\n wbits(out, p, nlc - 257);\n wbits(out, p + 5, ndc - 1);\n wbits(out, p + 10, nlcc - 4);\n p += 14;\n for (var i = 0; i < nlcc; ++i)\n wbits(out, p + 3 * i, lct[clim[i]]);\n p += 3 * nlcc;\n var lcts = [lclt, lcdt];\n for (var it = 0; it < 2; ++it) {\n var clct = lcts[it];\n for (var i = 0; i < clct.length; ++i) {\n var len = clct[i] & 31;\n wbits(out, p, llm[len]), p += lct[len];\n if (len > 15)\n wbits(out, p, clct[i] >>> 5 & 127), p += clct[i] >>> 12;\n }\n }\n } else {\n lm = flm, ll = flt, dm = fdm, dl = fdt;\n }\n for (var i = 0; i < li; ++i) {\n if (syms[i] > 255) {\n var len = syms[i] >>> 18 & 31;\n wbits16(out, p, lm[len + 257]), p += ll[len + 257];\n if (len > 7)\n wbits(out, p, syms[i] >>> 23 & 31), p += fleb[len];\n var dst = syms[i] & 31;\n wbits16(out, p, dm[dst]), p += dl[dst];\n if (dst > 3)\n wbits16(out, p, syms[i] >>> 5 & 8191), p += fdeb[dst];\n } else {\n wbits16(out, p, lm[syms[i]]), p += ll[syms[i]];\n }\n }\n wbits16(out, p, lm[256]);\n return p + ll[256];\n};\nvar deo = /* @__PURE__ */ new u32([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]);\nvar dflt = function(dat, lvl, plvl, pre, post, lst) {\n var s = dat.length;\n var o = new u8(pre + s + 5 * (1 + Math.floor(s / 7e3)) + post);\n var w = o.subarray(pre, o.length - post);\n var pos = 0;\n if (!lvl || s < 8) {\n for (var i = 0; i <= s; i += 65535) {\n var e = i + 65535;\n if (e < s) {\n pos = wfblk(w, pos, dat.subarray(i, e));\n } else {\n w[i] = lst;\n pos = wfblk(w, pos, dat.subarray(i, s));\n }\n }\n } else {\n var opt = deo[lvl - 1];\n var n = opt >>> 13, c = opt & 8191;\n var msk_1 = (1 << plvl) - 1;\n var prev = new u16(32768), head = new u16(msk_1 + 1);\n var bs1_1 = Math.ceil(plvl / 3), bs2_1 = 2 * bs1_1;\n var hsh = function(i2) {\n return (dat[i2] ^ dat[i2 + 1] << bs1_1 ^ dat[i2 + 2] << bs2_1) & msk_1;\n };\n var syms = new u32(25e3);\n var lf = new u16(288), df = new u16(32);\n var lc_1 = 0, eb = 0, i = 0, li = 0, wi = 0, bs = 0;\n for (; i < s; ++i) {\n var hv = hsh(i);\n var imod = i & 32767;\n var pimod = head[hv];\n prev[imod] = pimod;\n head[hv] = imod;\n if (wi <= i) {\n var rem = s - i;\n if ((lc_1 > 7e3 || li > 24576) && rem > 423) {\n pos = wblk(dat, w, 0, syms, lf, df, eb, li, bs, i - bs, pos);\n li = lc_1 = eb = 0, bs = i;\n for (var j = 0; j < 286; ++j)\n lf[j] = 0;\n for (var j = 0; j < 30; ++j)\n df[j] = 0;\n }\n var l = 2, d = 0, ch_1 = c, dif = imod - pimod & 32767;\n if (rem > 2 && hv == hsh(i - dif)) {\n var maxn = Math.min(n, rem) - 1;\n var maxd = Math.min(32767, i);\n var ml = Math.min(258, rem);\n while (dif <= maxd && --ch_1 && imod != pimod) {\n if (dat[i + l] == dat[i + l - dif]) {\n var nl = 0;\n for (; nl < ml && dat[i + nl] == dat[i + nl - dif]; ++nl)\n ;\n if (nl > l) {\n l = nl, d = dif;\n if (nl > maxn)\n break;\n var mmd = Math.min(dif, nl - 2);\n var md = 0;\n for (var j = 0; j < mmd; ++j) {\n var ti = i - dif + j + 32768 & 32767;\n var pti = prev[ti];\n var cd = ti - pti + 32768 & 32767;\n if (cd > md)\n md = cd, pimod = ti;\n }\n }\n }\n imod = pimod, pimod = prev[imod];\n dif += imod - pimod + 32768 & 32767;\n }\n }\n if (d) {\n syms[li++] = 268435456 | revfl[l] << 18 | revfd[d];\n var lin = revfl[l] & 31, din = revfd[d] & 31;\n eb += fleb[lin] + fdeb[din];\n ++lf[257 + lin];\n ++df[din];\n wi = i + l;\n ++lc_1;\n } else {\n syms[li++] = dat[i];\n ++lf[dat[i]];\n }\n }\n }\n pos = wblk(dat, w, lst, syms, lf, df, eb, li, bs, i - bs, pos);\n }\n return slc(o, 0, pre + shft(pos) + post);\n};\nvar adler = function() {\n var a = 1, b = 0;\n return {\n p: function(d) {\n var n = a, m = b;\n var l = d.length;\n for (var i = 0; i != l; ) {\n var e = Math.min(i + 5552, l);\n for (; i < e; ++i)\n n += d[i], m += n;\n n %= 65521, m %= 65521;\n }\n a = n, b = m;\n },\n d: function() {\n return (a >>> 8 << 16 | (b & 255) << 8 | b >>> 8) + ((a & 255) << 23) * 2;\n }\n };\n};\nvar dopt = function(dat, opt, pre, post, st) {\n return dflt(dat, opt.level == null ? 6 : opt.level, opt.mem == null ? Math.ceil(Math.max(8, Math.min(13, Math.log(dat.length))) * 1.5) : 12 + opt.mem, pre, post, !st);\n};\nvar wbytes = function(d, b, v) {\n for (; v; ++b)\n d[b] = v, v >>>= 8;\n};\nvar zlh = function(c, o) {\n var lv = o.level, fl2 = lv == 0 ? 0 : lv < 6 ? 1 : lv == 9 ? 3 : 2;\n c[0] = 120, c[1] = fl2 << 6 | (fl2 ? 32 - 2 * fl2 : 1);\n};\nvar zlv = function(d) {\n if ((d[0] & 15) != 8 || d[0] >>> 4 > 7 || (d[0] << 8 | d[1]) % 31)\n throw \"invalid zlib data\";\n if (d[1] & 32)\n throw \"invalid zlib data: preset dictionaries not supported\";\n};\nfunction zlibSync(data, opts) {\n if (opts === void 0) {\n opts = {};\n }\n var a = adler();\n a.p(data);\n var d = dopt(data, opts, 2, 4);\n return zlh(d, opts), wbytes(d, d.length - 4, a.d()), d;\n}\nfunction unzlibSync(data, out) {\n return inflt((zlv(data), data.subarray(2, -4)), out);\n}\nfunction strToU8(str, latin1) {\n var l = str.length;\n if (!latin1 && typeof TextEncoder != \"undefined\")\n return new TextEncoder().encode(str);\n var ar = new u8(str.length + (str.length >>> 1));\n var ai = 0;\n var w = function(v) {\n ar[ai++] = v;\n };\n for (var i = 0; i < l; ++i) {\n if (ai + 5 > ar.length) {\n var n = new u8(ai + 8 + (l - i << 1));\n n.set(ar);\n ar = n;\n }\n var c = str.charCodeAt(i);\n if (c < 128 || latin1)\n w(c);\n else if (c < 2048)\n w(192 | c >>> 6), w(128 | c & 63);\n else if (c > 55295 && c < 57344)\n c = 65536 + (c & 1023 << 10) | str.charCodeAt(++i) & 1023, w(240 | c >>> 18), w(128 | c >>> 12 & 63), w(128 | c >>> 6 & 63), w(128 | c & 63);\n else\n w(224 | c >>> 12), w(128 | c >>> 6 & 63), w(128 | c & 63);\n }\n return slc(ar, 0, ai);\n}\nfunction strFromU8(dat, latin1) {\n var r = \"\";\n if (!latin1 && typeof TextDecoder != \"undefined\")\n return new TextDecoder().decode(dat);\n for (var i = 0; i < dat.length; ) {\n var c = dat[i++];\n if (c < 128 || latin1)\n r += String.fromCharCode(c);\n else if (c < 224)\n r += String.fromCharCode((c & 31) << 6 | dat[i++] & 63);\n else if (c < 240)\n r += String.fromCharCode((c & 15) << 12 | (dat[i++] & 63) << 6 | dat[i++] & 63);\n else\n c = ((c & 15) << 18 | (dat[i++] & 63) << 12 | (dat[i++] & 63) << 6 | dat[i++] & 63) - 65536, r += String.fromCharCode(55296 | c >> 10, 56320 | c & 1023);\n }\n return r;\n}\nconst MARK = \"v1\";\nexport {\n MARK as M,\n strToU8 as a,\n strFromU8 as s,\n unzlibSync as u,\n zlibSync as z\n};\n//# sourceMappingURL=base-BrE4jft0.js.map\n","import { M as MARK, s as strFromU8, z as zlibSync, a as strToU8 } from \"./base-BrE4jft0.js\";\nconst pack = (event) => {\n const _e = {\n ...event,\n v: MARK\n };\n return strFromU8(zlibSync(strToU8(JSON.stringify(_e))), true);\n};\nexport {\n pack\n};\n//# sourceMappingURL=pack.js.map\n","import { getGlobalScope } from '@amplitude/analytics-core';\nimport { pack } from '@amplitude/rrweb-packer';\nimport type { eventWithTime } from '@amplitude/rrweb-types';\nimport { SessionReplayJoinedConfig } from '../config/types';\nimport { SessionReplayEventsManager } from '../typings/session-replay';\n\ninterface TaskQueue {\n event: eventWithTime;\n sessionId: string | number;\n}\n\nconst DEFAULT_TIMEOUT = 2000;\nexport class EventCompressor {\n taskQueue: TaskQueue[] = [];\n isProcessing = false;\n eventsManager?: SessionReplayEventsManager<'replay' | 'interaction', string>;\n config: SessionReplayJoinedConfig;\n deviceId: string | undefined;\n canUseIdleCallback: boolean | undefined;\n timeout: number;\n worker?: Worker;\n\n constructor(\n eventsManager: SessionReplayEventsManager<'replay' | 'interaction', string>,\n config: SessionReplayJoinedConfig,\n deviceId: string | undefined,\n workerScript?: string,\n ) {\n const globalScope = getGlobalScope();\n this.canUseIdleCallback = globalScope && 'requestIdleCallback' in globalScope;\n this.eventsManager = eventsManager;\n this.config = config;\n this.deviceId = deviceId;\n this.timeout = config.performanceConfig?.timeout || DEFAULT_TIMEOUT;\n\n if (workerScript) {\n config.loggerProvider.log('[Experimental] Enabling web worker for compression');\n\n const worker = new Worker(URL.createObjectURL(new Blob([workerScript], { type: 'application/javascript' })));\n worker.onerror = (e) => {\n config.loggerProvider.error(e);\n };\n worker.onmessage = (e) => {\n const { compressedEvent, sessionId } = e.data as Record<string, string>;\n this.addCompressedEventToManager(compressedEvent, sessionId);\n };\n\n this.worker = worker;\n }\n }\n\n // Schedule processing during idle time\n public scheduleIdleProcessing(): void {\n if (!this.isProcessing) {\n this.isProcessing = true;\n requestIdleCallback(\n (idleDeadline) => {\n this.processQueue(idleDeadline);\n },\n { timeout: this.timeout },\n );\n }\n }\n\n // Add an event to the task queue if idle callback is supported or compress the event directly\n public enqueueEvent(event: eventWithTime, sessionId: string | number): void {\n if (this.canUseIdleCallback && this.config.performanceConfig?.enabled) {\n this.config.loggerProvider.debug('Enqueuing event for processing during idle time.');\n this.taskQueue.push({ event, sessionId });\n this.scheduleIdleProcessing();\n } else {\n this.config.loggerProvider.debug('Processing event without idle callback.');\n this.addCompressedEvent(event, sessionId);\n }\n }\n\n // Process the task queue during idle time\n public processQueue(idleDeadline: IdleDeadline): void {\n // Process tasks while there's idle time or until the max number of tasks is reached\n while (this.taskQueue.length > 0 && (idleDeadline.timeRemaining() > 0 || idleDeadline.didTimeout)) {\n const task = this.taskQueue.shift();\n if (task) {\n const { event, sessionId } = task;\n this.addCompressedEvent(event, sessionId);\n }\n }\n\n // If there are still tasks in the queue, schedule the next idle callback\n if (this.taskQueue.length > 0) {\n requestIdleCallback(\n (idleDeadline) => {\n this.processQueue(idleDeadline);\n },\n { timeout: this.timeout },\n );\n } else {\n this.isProcessing = false;\n }\n }\n\n compressEvent = (event: eventWithTime) => {\n const packedEvent = pack(event);\n return JSON.stringify(packedEvent);\n };\n\n private addCompressedEventToManager = (compressedEvent: string, sessionId: string | number) => {\n if (this.eventsManager && this.deviceId) {\n this.eventsManager.addEvent({\n event: { type: 'replay', data: compressedEvent },\n sessionId,\n deviceId: this.deviceId,\n });\n }\n };\n\n public addCompressedEvent = (event: eventWithTime, sessionId: string | number) => {\n if (this.worker) {\n // This indirectly compresses the event.\n try {\n this.worker.postMessage({ event, sessionId });\n } catch (err: any) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (err.name === 'DataCloneError') {\n // fallback: serialize\n this.worker.postMessage(JSON.stringify({ event, sessionId }));\n } else {\n this.config.loggerProvider.warn('Unexpected error while posting message to worker:', err);\n }\n }\n } else {\n const compressedEvent = this.compressEvent(event);\n this.addCompressedEventToManager(compressedEvent, sessionId);\n }\n };\n\n public terminate = () => {\n this.worker?.terminate();\n };\n}\n","export const UNEXPECTED_ERROR_MESSAGE = 'Unexpected error occurred';\nexport const UNEXPECTED_NETWORK_ERROR_MESSAGE = 'Network error occurred, event batch rejected';\nexport const MAX_RETRIES_EXCEEDED_MESSAGE = 'Session replay event batch rejected due to exceeded retry count';\nexport const STORAGE_FAILURE = 'Failed to store session replay events in IndexedDB';\nexport const MISSING_DEVICE_ID_MESSAGE = 'Session replay event batch not sent due to missing device ID';\nexport const MISSING_API_KEY_MESSAGE = 'Session replay event batch not sent due to missing api key';\n","// Autogenerated by `yarn version-file`. DO NOT EDIT\nexport const VERSION = '1.28.16';\n","import { BaseTransport, ILogger, Status } from '@amplitude/analytics-core';\nimport { getCurrentUrl, getServerUrl } from './helpers';\nimport {\n MAX_RETRIES_EXCEEDED_MESSAGE,\n MISSING_API_KEY_MESSAGE,\n MISSING_DEVICE_ID_MESSAGE,\n UNEXPECTED_ERROR_MESSAGE,\n UNEXPECTED_NETWORK_ERROR_MESSAGE,\n} from './messages';\nimport {\n SessionReplayTrackDestination as AmplitudeSessionReplayTrackDestination,\n SessionReplayDestination,\n SessionReplayDestinationContext,\n} from './typings/session-replay';\nimport { VERSION } from './version';\nimport { MAX_URL_LENGTH, KB_SIZE } from './constants';\n\nexport type PayloadBatcher = ({ version, events }: { version: number; events: string[] }) => {\n version: number;\n events: unknown[];\n};\n\nexport class SessionReplayTrackDestination implements AmplitudeSessionReplayTrackDestination {\n loggerProvider: ILogger;\n storageKey = '';\n trackServerUrl?: string;\n retryTimeout = 1000;\n private scheduled: ReturnType<typeof setTimeout> | null = null;\n payloadBatcher: PayloadBatcher;\n queue: SessionReplayDestinationContext[] = [];\n\n constructor({\n trackServerUrl,\n loggerProvider,\n payloadBatcher,\n }: {\n trackServerUrl?: string;\n loggerProvider: ILogger;\n payloadBatcher?: PayloadBatcher;\n }) {\n this.loggerProvider = loggerProvider;\n this.payloadBatcher = payloadBatcher ? payloadBatcher : (payload) => payload;\n this.trackServerUrl = trackServerUrl;\n }\n\n sendEventsList(destinationData: SessionReplayDestination) {\n this.addToQueue({\n ...destinationData,\n attempts: 0,\n timeout: 0,\n });\n }\n\n addToQueue(...list: SessionReplayDestinationContext[]) {\n const tryable = list.filter((context) => {\n if (context.attempts < (context.flushMaxRetries || 0)) {\n context.attempts += 1;\n return true;\n }\n this.completeRequest({\n context,\n err: MAX_RETRIES_EXCEEDED_MESSAGE,\n });\n return false;\n });\n tryable.forEach((context) => {\n this.queue = this.queue.concat(context);\n if (context.timeout === 0) {\n this.schedule(0);\n return;\n }\n\n setTimeout(() => {\n context.timeout = 0;\n this.schedule(0);\n }, context.timeout);\n });\n }\n\n schedule(timeout: number) {\n if (this.scheduled) return;\n this.scheduled = setTimeout(() => {\n void this.flush(true).then(() => {\n if (this.queue.length > 0) {\n this.schedule(timeout);\n }\n });\n }, timeout);\n }\n\n async flush(useRetry = false) {\n const list: SessionReplayDestinationContext[] = [];\n const later: SessionReplayDestinationContext[] = [];\n this.queue.forEach((context) => (context.timeout === 0 ? list.push(context) : later.push(context)));\n this.queue = later;\n\n if (this.scheduled) {\n clearTimeout(this.scheduled);\n this.scheduled = null;\n }\n\n await Promise.all(list.map((context) => this.send(context, useRetry)));\n }\n\n async send(context: SessionReplayDestinationContext, useRetry = true) {\n const apiKey = context.apiKey;\n if (!apiKey) {\n return this.completeRequest({ context, err: MISSING_API_KEY_MESSAGE });\n }\n const deviceId = context.deviceId;\n if (!deviceId) {\n return this.completeRequest({ context, err: MISSING_DEVICE_ID_MESSAGE });\n }\n const url = getCurrentUrl();\n const version = VERSION;\n const sampleRate = context.sampleRate;\n const urlParams = new URLSearchParams({\n device_id: deviceId,\n session_id: `${context.sessionId}`,\n type: `${context.type}`,\n });\n const sessionReplayLibrary = `${context.version?.type || 'standalone'}/${context.version?.version || version}`;\n const payload = this.payloadBatcher({\n version: 1,\n events: context.events,\n });\n\n if (payload.events.length === 0) {\n this.completeRequest({ context });\n return;\n }\n\n try {\n const options: RequestInit = {\n headers: {\n 'Content-Type': 'application/json',\n Accept: '*/*',\n Authorization: `Bearer ${apiKey}`,\n 'X-Client-Version': version,\n 'X-Client-Library': sessionReplayLibrary,\n 'X-Client-Url': url.substring(0, MAX_URL_LENGTH), // limit url length to 1000 characters to avoid ELB 400 error\n 'X-Client-Sample-Rate': `${sampleRate}`,\n },\n body: JSON.stringify(payload),\n method: 'POST',\n };\n\n const serverUrl = `${getServerUrl(context.serverZone, this.trackServerUrl)}?${urlParams.toString()}`;\n const res = await fetch(serverUrl, options);\n if (res === null) {\n this.completeRequest({ context, err: UNEXPECTED_ERROR_MESSAGE });\n return;\n }\n if (!useRetry) {\n let responseBody = '';\n try {\n responseBody = JSON.stringify(res.body, null, 2);\n } catch {\n // to avoid crash, but don't care about the error, add comment to avoid empty block lint error\n }\n this.completeRequest({ context, success: `${res.status}: ${responseBody}` });\n } else {\n this.handleReponse(res.status, context);\n }\n } catch (e) {\n this.completeRequest({ context, err: e as string });\n }\n }\n\n handleReponse(status: number, context: SessionReplayDestinationContext) {\n const parsedStatus = new BaseTransport().buildStatus(status);\n switch (parsedStatus) {\n case Status.Success:\n this.handleSuccessResponse(context);\n break;\n case Status.Failed:\n this.handleOtherResponse(context);\n break;\n default:\n this.completeRequest({ context, err: UNEXPECTED_NETWORK_ERROR_MESSAGE });\n }\n }\n\n handleSuccessResponse(context: SessionReplayDestinationContext) {\n const sizeOfEventsList = Math.round(new Blob(context.events).size / KB_SIZE);\n this.completeRequest({\n context,\n success: `Session replay event batch tracked successfully for session id ${context.sessionId}, size of events: ${sizeOfEventsList} KB`,\n });\n }\n\n handleOtherResponse(context: SessionReplayDestinationContext) {\n this.addToQueue({\n ...context,\n timeout: context.attempts * this.retryTimeout,\n });\n }\n\n completeRequest({\n context,\n err,\n success,\n }: {\n context: SessionReplayDestinationContext;\n err?: string;\n success?: string;\n }) {\n void context.onComplete();\n if (err) {\n this.loggerProvider.warn(err);\n } else if (success) {\n this.loggerProvider.log(success);\n }\n }\n}\n","import { MAX_EVENT_LIST_SIZE, MAX_INTERVAL, MIN_INTERVAL } from '../constants';\nimport { Events, EventsStore, SendingSequencesReturn } from '../typings/session-replay';\nimport { ILogger } from '@amplitude/analytics-core';\n\nexport type InstanceArgs = {\n loggerProvider: ILogger;\n minInterval?: number;\n maxInterval?: number;\n maxPersistedEventsSize?: number;\n};\n\nexport abstract class BaseEventsStore<KeyType> implements EventsStore<KeyType> {\n protected readonly loggerProvider: ILogger;\n private minInterval = MIN_INTERVAL;\n private maxInterval = MAX_INTERVAL;\n private maxPersistedEventsSize = MAX_EVENT_LIST_SIZE;\n private interval = this.minInterval;\n private _timeAtLastSplit = Date.now(); // Initialize this so we have a point of comparison when events are recorded\n\n public get timeAtLastSplit() {\n return this._timeAtLastSplit;\n }\n\n constructor(args: InstanceArgs) {\n this.loggerProvider = args.loggerProvider;\n this.minInterval = args.minInterval ?? this.minInterval;\n this.maxInterval = args.maxInterval ?? this.maxInterval;\n this.maxPersistedEventsSize = args.maxPersistedEventsSize ?? this.maxPersistedEventsSize;\n }\n\n abstract addEventToCurrentSequence(\n sessionId: string | number,\n event: string,\n ): Promise<SendingSequencesReturn<KeyType> | undefined>;\n abstract getSequencesToSend(): Promise<SendingSequencesReturn<KeyType>[] | undefined>;\n abstract storeCurrentSequence(sessionId: number): Promise<SendingSequencesReturn<KeyType> | undefined>;\n abstract storeSendingEvents(sessionId: string | number, events: Events): Promise<KeyType | undefined>;\n abstract cleanUpSessionEventsStore(sessionId: number, sequenceId: KeyType): Promise<void>;\n\n /**\n * Calculates the character length of a string as size approximation\n * Note: String length closely approximates byte size for most content\n */\n private getStringSize(str: string): number {\n return str.length;\n }\n\n /**\n * Calculates the total character length of events array\n * Accounts for JSON serialization overhead when sent to backend\n */\n private getEventsArraySize(events: Events): number {\n let totalSize = 0;\n for (const event of events) {\n totalSize += this.getStringSize(event);\n }\n\n // Additional overhead from using length instead of byte size\n // - Array brackets: [] = 2 characters\n // - Commas between events: events.length - 1\n // - Double quotes around each event: events.length * 2\n const overhead = 2 + Math.max(0, events.length - 1) + events.length * 2;\n\n return totalSize + overhead;\n }\n\n /**\n * Determines whether to send the events list to the backend and start a new\n * empty events list, based on the size of the list as well as the last time sent\n * @param nextEventString\n * @returns boolean\n */\n shouldSplitEventsList = (events: Events, nextEventString: string): boolean => {\n const sizeOfNextEvent = this.getStringSize(nextEventString);\n const sizeOfEventsList = this.getEventsArraySize(events);\n\n // Check size constraint first (most likely to trigger)\n if (sizeOfEventsList + sizeOfNextEvent >= this.maxPersistedEventsSize) {\n return true;\n }\n if (Date.now() - this.timeAtLastSplit > this.interval && events.length) {\n this.interval = Math.min(this.maxInterval, this.interval + this.minInterval);\n this._timeAtLastSplit = Date.now();\n return true;\n }\n return false;\n };\n}\n","import { SessionReplayRemoteConfig } from '../config/types';\nimport { Events } from '../typings/session-replay';\n\nexport enum RecordingStatus {\n RECORDING = 'recording',\n SENT = 'sent',\n}\n\nexport interface IDBStoreSequence {\n events: Events;\n status: RecordingStatus;\n}\n\ninterface IDBRemoteConfig {\n config: SessionReplayRemoteConfig;\n lastFetchedSessionId: number | undefined;\n}\nexport interface IDBStoreSession {\n currentSequenceId: number;\n sessionSequences: {\n [sequenceId: number]: IDBStoreSequence;\n };\n}\n\nexport interface IDBStore {\n remoteConfig?: IDBRemoteConfig;\n [sessionId: number]: IDBStoreSession;\n}\n","import { STORAGE_PREFIX, getGlobalScope } from '@amplitude/analytics-core';\nimport { DBSchema, IDBPDatabase, openDB } from 'idb';\nimport { STORAGE_FAILURE } from '../messages';\nimport { EventType, Events, SendingSequencesReturn } from '../typings/session-replay';\nimport { BaseEventsStore, InstanceArgs as BaseInstanceArgs } from './base-events-store';\nimport { IDBStore, IDBStoreSession, RecordingStatus } from './legacy-idb-types';\n\nexport const currentSequenceKey = 'sessionCurrentSequence';\nexport const sequencesToSendKey = 'sequencesToSend';\nexport const remoteConfigKey = 'remoteConfig';\n\nexport interface SessionReplayDB extends DBSchema {\n sessionCurrentSequence: {\n key: number;\n value: Omit<SendingSequencesReturn<number>, 'sequenceId'>;\n };\n sequencesToSend: {\n key: number;\n value: Omit<SendingSequencesReturn<number>, 'sequenceId'>;\n indexes: { sessionId: string | number };\n };\n}\n\nexport const keyValDatabaseExists = function (): Promise<IDBDatabase | void> {\n const globalScope = getGlobalScope();\n return new Promise((resolve, reject) => {\n if (!globalScope) {\n return reject(new Error('Global scope not found'));\n }\n\n if (!globalScope.indexedDB) {\n return reject(new Error('Session Replay: cannot find indexedDB'));\n }\n\n try {\n const request = globalScope.indexedDB.open('keyval-store');\n request.onupgradeneeded = function () {\n if (request.result.version === 1) {\n request.result.close();\n request.transaction && request.transaction.abort();\n globalScope.indexedDB.deleteDatabase('keyval-store');\n resolve();\n }\n };\n request.onsuccess = function () {\n resolve(request.result);\n };\n request.onerror = function () {\n reject(request.error);\n };\n } catch (e) {\n reject(e);\n }\n });\n};\n\nconst batchPromiseAll = async (promiseBatch: Promise<any>[]) => {\n while (promiseBatch.length > 0) {\n const chunkSize = 10;\n const batch = promiseBatch.splice(0, chunkSize);\n await Promise.all(batch);\n }\n};\n\nexport const defineObjectStores = (db: IDBPDatabase<SessionReplayDB>) => {\n let sequencesStore;\n let currentSequenceStore;\n if (!db.objectStoreNames.contains(currentSequenceKey)) {\n currentSequenceStore = db.createObjectStore(currentSequenceKey, {\n keyPath: 'sessionId',\n });\n }\n if (!db.objectStoreNames.contains(sequencesToSendKey)) {\n sequencesStore = db.createObjectStore(sequencesToSendKey, {\n keyPath: 'sequenceId',\n autoIncrement: true,\n });\n sequencesStore.createIndex('sessionId', 'sessionId');\n }\n return {\n sequencesStore,\n currentSequenceStore,\n };\n};\n\nexport const createStore = async (dbName: string) => {\n return await openDB<SessionReplayDB>(dbName, 1, {\n upgrade: defineObjectStores,\n });\n};\n\ntype InstanceArgs = {\n apiKey: string;\n db: IDBPDatabase<SessionReplayDB>;\n} & BaseInstanceArgs;\n\nexport class SessionReplayEventsIDBStore extends BaseEventsStore<number> {\n private readonly apiKey: string;\n private readonly db: IDBPDatabase<SessionReplayDB>;\n\n constructor(args: InstanceArgs) {\n super(args);\n this.apiKey = args.apiKey;\n this.db = args.db;\n }\n\n static async new(\n type: EventType,\n args: Omit<InstanceArgs, 'db'>,\n sessionId?: string | number,\n ): Promise<SessionReplayEventsIDBStore | undefined> {\n try {\n const dbSuffix = type === 'replay' ? '' : `_${type}`;\n const dbName = `${args.apiKey.substring(0, 10)}_amp_session_replay_events${dbSuffix}`;\n const db = await createStore(dbName);\n const eventsIDBStore = new SessionReplayEventsIDBStore({\n ...args,\n db,\n });\n await eventsIDBStore.transitionFromKeyValStore(sessionId);\n return eventsIDBStore;\n } catch (e) {\n args.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return;\n }\n\n async getCurrentSequenceEvents(sessionId?: number) {\n if (sessionId) {\n const events = await this.db.get('sessionCurrentSequence', sessionId);\n if (!events) {\n return undefined;\n }\n return [events];\n }\n\n const allEvents = [];\n for (const events of await this.db.getAll('sessionCurrentSequence')) {\n allEvents.push(events);\n }\n\n return allEvents;\n }\n\n getSequencesToSend = async (): Promise<SendingSequencesReturn<number>[] | undefined> => {\n try {\n const sequences: SendingSequencesReturn<number>[] = [];\n let cursor = await this.db.transaction('sequencesToSend').store.openCursor();\n while (cursor) {\n const { sessionId, events } = cursor.value;\n sequences.push({\n events,\n sequenceId: cursor.key,\n sessionId,\n });\n cursor = await cursor.continue();\n }\n\n return sequences;\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return undefined;\n };\n\n storeCurrentSequence = async (sessionId: number) => {\n try {\n const currentSequenceData = await this.db.get<'sessionCurrentSequence'>(currentSequenceKey, sessionId);\n if (!currentSequenceData) {\n return undefined;\n }\n\n const sequenceId = await this.db.put<'sequencesToSend'>(sequencesToSendKey, {\n sessionId: sessionId,\n events: currentSequenceData.events,\n });\n\n await this.db.put<'sessionCurrentSequence'>(currentSequenceKey, {\n sessionId,\n events: [],\n });\n\n return {\n ...currentSequenceData,\n sessionId,\n sequenceId,\n };\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return undefined;\n };\n\n addEventToCurrentSequence = async (sessionId: number, event: string) => {\n try {\n const tx = this.db.transaction<'sessionCurrentSequence', 'readwrite'>(currentSequenceKey, 'readwrite');\n const sequenceEvents = await tx.store.get(sessionId);\n if (!sequenceEvents) {\n await tx.store.put({ sessionId, events: [event] });\n return;\n }\n let eventsToSend;\n if (this.shouldSplitEventsList(sequenceEvents.events, event)) {\n eventsToSend = sequenceEvents.events;\n // set store to empty array\n await tx.store.put({ sessionId, events: [event] });\n } else {\n // add event to array\n const updatedEvents = sequenceEvents.events.concat(event);\n await tx.store.put({ sessionId, events: updatedEvents });\n }\n\n await tx.done;\n if (!eventsToSend) {\n return undefined;\n }\n\n const sequenceId = await this.storeSendingEvents(sessionId, eventsToSend);\n\n if (!sequenceId) {\n return undefined;\n }\n\n return {\n events: eventsToSend,\n sessionId,\n sequenceId,\n };\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return undefined;\n };\n\n storeSendingEvents = async (sessionId: number, events: Events) => {\n try {\n const sequenceId = await this.db.put<'sequencesToSend'>(sequencesToSendKey, {\n sessionId: sessionId,\n events: events,\n });\n return sequenceId;\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return undefined;\n };\n\n cleanUpSessionEventsStore = async (_sessionId: number, sequenceId?: number) => {\n if (!sequenceId) {\n return;\n }\n try {\n await this.db.delete<'sequencesToSend'>(sequencesToSendKey, sequenceId);\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n };\n\n transitionFromKeyValStore = async (sessionId?: string | number) => {\n try {\n const keyValDb = await keyValDatabaseExists();\n if (!keyValDb) {\n return;\n }\n\n const transitionCurrentSessionSequences = async (numericSessionId: number, sessionStore: IDBStoreSession) => {\n const currentSessionSequences = sessionStore.sessionSequences;\n const promisesToBatch: Promise<number | SendingSequencesReturn<number> | undefined>[] = [];\n\n Object.keys(currentSessionSequences).forEach((sequenceId) => {\n const numericSequenceId = parseInt(sequenceId, 10);\n const sequence = currentSessionSequences[numericSequenceId];\n if (numericSequenceId === sessionStore.currentSequenceId) {\n const eventAddPromises: Promise<SendingSequencesReturn<number> | undefined>[] = sequence.events.map(\n async (event) => this.addEventToCurrentSequence(numericSessionId, event),\n );\n promisesToBatch.push(...eventAddPromises);\n } else if (sequence.status !== RecordingStatus.SENT) {\n promisesToBatch.push(this.storeSendingEvents(numericSessionId, sequence.events));\n }\n });\n\n await batchPromiseAll(promisesToBatch);\n };\n\n const storageKey = `${STORAGE_PREFIX}_${this.apiKey.substring(0, 10)}`;\n try {\n const getAllRequest = keyValDb.transaction('keyval').objectStore('keyval').getAll(storageKey);\n const transitionPromise = new Promise<void>((resolve) => {\n getAllRequest.onsuccess = async (e) => {\n const storedReplaySessionContextList = e && ((e.target as IDBRequest).result as IDBStore[]);\n const storedReplaySessionContexts = storedReplaySessionContextList && storedReplaySessionContextList[0];\n if (storedReplaySessionContexts) {\n const promisesToBatch: Promise<any>[] = [];\n\n Object.keys(storedReplaySessionContexts).forEach((storedSessionId) => {\n const numericSessionId = parseInt(storedSessionId, 10);\n const oldSessionStore = storedReplaySessionContexts[numericSessionId];\n\n if (sessionId === numericSessionId) {\n promisesToBatch.push(transitionCurrentSessionSequences(numericSessionId, oldSessionStore));\n } else {\n const oldSessionSequences = oldSessionStore.sessionSequences;\n Object.keys(oldSessionSequences).forEach((sequenceId) => {\n const numericSequenceId = parseInt(sequenceId, 10);\n if (oldSessionSequences[numericSequenceId].status !== RecordingStatus.SENT) {\n promisesToBatch.push(\n this.storeSendingEvents(numericSessionId, oldSessionSequences[numericSequenceId].events),\n );\n }\n });\n }\n });\n\n await batchPromiseAll(promisesToBatch);\n }\n resolve();\n };\n });\n\n await transitionPromise;\n const globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.indexedDB.deleteDatabase('keyval-store');\n }\n } catch (e) {\n this.loggerProvider.warn(`Failed to transition session replay events from keyval to new store: ${e as string}`);\n }\n } catch (e) {\n this.loggerProvider.warn(\n `Failed to access keyval store: ${\n e as string\n }. For more information, visit: https://www.docs.developers.amplitude.com/session-replay/sdks/standalone/#indexeddb-best-practices`,\n );\n }\n };\n}\n","import { Events, SendingSequencesReturn } from '../typings/session-replay';\nimport { BaseEventsStore } from './base-events-store';\n\nexport class InMemoryEventsStore extends BaseEventsStore<number> {\n private finalizedSequences: Record<number, { sessionId: string | number; events: string[] }> = {};\n private sequences: Record<string | number, string[]> = {};\n private sequenceId = 0;\n\n private resetCurrentSequence(sessionId: string | number) {\n this.sequences[sessionId] = [];\n }\n\n private addSequence(sessionId: string | number): SendingSequencesReturn<number> {\n const sequenceId = this.sequenceId++;\n const events = [...this.sequences[sessionId]];\n this.finalizedSequences[sequenceId] = { sessionId, events };\n this.resetCurrentSequence(sessionId);\n return { sequenceId, events, sessionId };\n }\n\n async getSequencesToSend(): Promise<SendingSequencesReturn<number>[] | undefined> {\n return Object.entries(this.finalizedSequences).map(([sequenceId, { sessionId, events }]) => ({\n sequenceId: Number(sequenceId),\n sessionId,\n events,\n }));\n }\n\n async storeCurrentSequence(sessionId: string | number): Promise<SendingSequencesReturn<number> | undefined> {\n if (!this.sequences[sessionId]) {\n return undefined;\n }\n return this.addSequence(sessionId);\n }\n\n async addEventToCurrentSequence(\n sessionId: number,\n event: string,\n ): Promise<SendingSequencesReturn<number> | undefined> {\n if (!this.sequences[sessionId]) {\n this.resetCurrentSequence(sessionId);\n }\n\n let sequenceReturn: SendingSequencesReturn<number> | undefined;\n if (this.shouldSplitEventsList(this.sequences[sessionId], event)) {\n sequenceReturn = this.addSequence(sessionId);\n }\n\n this.sequences[sessionId].push(event);\n\n return sequenceReturn;\n }\n\n async storeSendingEvents(sessionId: number, events: Events): Promise<number | undefined> {\n this.finalizedSequences[this.sequenceId] = { sessionId, events };\n\n return this.sequenceId++;\n }\n\n async cleanUpSessionEventsStore(_sessionId: number, sequenceId?: number): Promise<void> {\n if (sequenceId !== undefined) {\n delete this.finalizedSequences[sequenceId];\n }\n }\n}\n","import {\n SessionReplayEventsManager as AmplitudeSessionReplayEventsManager,\n EventsStore,\n EventType,\n StoreType,\n} from '../typings/session-replay';\n\nimport { SessionReplayJoinedConfig } from '../config/types';\nimport { getStorageSize } from '../helpers';\nimport { PayloadBatcher, SessionReplayTrackDestination } from '../track-destination';\nimport { SessionReplayEventsIDBStore } from './events-idb-store';\nimport { InMemoryEventsStore } from './events-memory-store';\n\nexport const createEventsManager = async <Type extends EventType>({\n config,\n sessionId,\n minInterval,\n maxInterval,\n type,\n payloadBatcher,\n storeType,\n}: {\n config: SessionReplayJoinedConfig;\n type: Type;\n minInterval?: number;\n maxInterval?: number;\n sessionId?: string | number;\n payloadBatcher?: PayloadBatcher;\n storeType: StoreType;\n}): Promise<AmplitudeSessionReplayEventsManager<Type, string>> => {\n const trackDestination = new SessionReplayTrackDestination({\n ...config,\n loggerProvider: config.loggerProvider,\n payloadBatcher,\n });\n\n const getMemoryStore = (): EventsStore<number> => {\n return new InMemoryEventsStore({\n loggerProvider: config.loggerProvider,\n maxInterval,\n minInterval,\n });\n };\n\n const getIdbStoreOrFallback = async (): Promise<EventsStore<number>> => {\n const store = await SessionReplayEventsIDBStore.new(\n type,\n {\n loggerProvider: config.loggerProvider,\n minInterval,\n maxInterval,\n apiKey: config.apiKey,\n },\n sessionId,\n );\n config.loggerProvider.log('Failed to initialize idb store, falling back to memory store.');\n return store ?? getMemoryStore();\n };\n\n const store: EventsStore<number> = storeType === 'idb' ? await getIdbStoreOrFallback() : getMemoryStore();\n\n /**\n * Immediately sends events to the track destination.\n */\n const sendEventsList = ({\n events,\n sessionId,\n deviceId,\n sequenceId,\n }: {\n events: string[];\n sessionId: string | number;\n deviceId: string;\n sequenceId?: number;\n }) => {\n if (config.debugMode) {\n getStorageSize()\n .then(({ totalStorageSize, percentOfQuota, usageDetails }) => {\n config.loggerProvider.debug(\n `Total storage size: ${totalStorageSize} KB, percentage of quota: ${percentOfQuota}%, usage details: ${usageDetails}`,\n );\n })\n .catch(() => {\n // swallow error\n });\n }\n\n trackDestination.sendEventsList({\n events: events,\n sessionId: sessionId,\n flushMaxRetries: config.flushMaxRetries,\n apiKey: config.apiKey,\n deviceId: deviceId,\n sampleRate: config.sampleRate,\n serverZone: config.serverZone,\n version: config.version,\n type,\n onComplete: async () => {\n await store.cleanUpSessionEventsStore(sessionId, sequenceId);\n return;\n },\n });\n };\n\n const sendCurrentSequenceEvents = ({ sessionId, deviceId }: { sessionId: number; deviceId: string }) => {\n store\n .storeCurrentSequence(sessionId)\n .then((currentSequence) => {\n if (currentSequence) {\n sendEventsList({\n sequenceId: currentSequence.sequenceId,\n events: currentSequence.events,\n sessionId: currentSequence.sessionId,\n deviceId,\n });\n }\n })\n .catch((e) => {\n config.loggerProvider.warn('Failed to get current sequence of session replay events for session:', e);\n });\n };\n\n const sendStoredEvents = async ({ deviceId }: { deviceId: string }) => {\n const sequencesToSend = await store.getSequencesToSend();\n sequencesToSend &&\n sequencesToSend.forEach((sequence) => {\n sendEventsList({\n sequenceId: sequence.sequenceId,\n events: sequence.events,\n sessionId: sequence.sessionId,\n deviceId,\n });\n });\n };\n\n const addEvent = ({\n event,\n sessionId,\n deviceId,\n }: {\n event: { type: Type; data: string };\n sessionId: number;\n deviceId: string;\n }) => {\n store\n .addEventToCurrentSequence(sessionId, event.data)\n .then((sequenceToSend) => {\n return (\n sequenceToSend &&\n sendEventsList({\n sequenceId: sequenceToSend.sequenceId,\n events: sequenceToSend.events,\n sessionId: sequenceToSend.sessionId,\n deviceId,\n })\n );\n })\n .catch((e) => {\n config.loggerProvider.warn('Failed to add event to session replay capture:', e);\n });\n };\n\n async function flush(useRetry = false) {\n return trackDestination.flush(useRetry);\n }\n\n return {\n sendCurrentSequenceEvents,\n addEvent,\n sendStoredEvents,\n flush,\n };\n};\n","import {\n SessionReplayEventsManager as AmplitudeSessionReplayEventsManager,\n EventsManagerWithType,\n} from '../typings/session-replay';\n\n/**\n * \"Registers\" events managers internally. When an event is added this class routes the event to the correct\n * manager. For all send or flush methods this will invoke the event for all registered managers.\n */\nexport class MultiEventManager<EventType, EventDataType>\n implements AmplitudeSessionReplayEventsManager<EventType, EventDataType>\n{\n private managers: Map<EventType, AmplitudeSessionReplayEventsManager<EventType, EventDataType>>;\n\n constructor(...managers: EventsManagerWithType<EventType, EventDataType>[]) {\n const managersMap = new Map<EventType, AmplitudeSessionReplayEventsManager<EventType, EventDataType>>();\n managers.forEach((t) => {\n managersMap.set(t.name, t.manager);\n });\n this.managers = managersMap;\n }\n\n async sendStoredEvents(opts: { deviceId: string }): Promise<void> {\n const promises: Promise<void>[] = [];\n this.managers.forEach((manager) => {\n promises.push(manager.sendStoredEvents(opts));\n });\n await Promise.all(promises);\n }\n\n addEvent({\n sessionId,\n event,\n deviceId,\n }: {\n sessionId: number;\n event: { type: EventType; data: EventDataType };\n deviceId: string;\n }): void {\n this.managers.get(event.type)?.addEvent({ sessionId, event, deviceId });\n }\n\n sendCurrentSequenceEvents({ sessionId, deviceId }: { sessionId: number; deviceId: string }): void {\n this.managers.forEach((manager) => {\n manager.sendCurrentSequenceEvents({ sessionId, deviceId });\n });\n }\n\n async flush(useRetry?: boolean | undefined): Promise<void> {\n const promises: Promise<void>[] = [];\n this.managers.forEach((manager) => {\n promises.push(manager.flush(useRetry));\n });\n await Promise.all(promises);\n }\n}\n","const testableAccessors = {\n Node: [\"childNodes\", \"parentNode\", \"parentElement\", \"textContent\"],\n ShadowRoot: [\"host\", \"styleSheets\"],\n Element: [\"shadowRoot\", \"querySelector\", \"querySelectorAll\"],\n MutationObserver: []\n};\nconst testableMethods = {\n Node: [\"contains\", \"getRootNode\"],\n ShadowRoot: [\"getSelection\"],\n Element: [],\n MutationObserver: [\"constructor\"]\n};\nconst untaintedBasePrototype = {};\nfunction angularZoneUnpatchedAlternative(key) {\n var _a, _b;\n const angularUnpatchedVersionSymbol = (_b = (_a = globalThis == null ? void 0 : globalThis.Zone) == null ? void 0 : _a.__symbol__) == null ? void 0 : _b.call(_a, key);\n if (angularUnpatchedVersionSymbol && globalThis[angularUnpatchedVersionSymbol]) {\n return globalThis[angularUnpatchedVersionSymbol];\n } else {\n return void 0;\n }\n}\nfunction getUntaintedPrototype(key) {\n if (untaintedBasePrototype[key])\n return untaintedBasePrototype[key];\n const candidate = angularZoneUnpatchedAlternative(key) || globalThis[key];\n const defaultPrototype = candidate.prototype;\n const accessorNames = key in testableAccessors ? testableAccessors[key] : void 0;\n const isUntaintedAccessors = Boolean(\n accessorNames && // @ts-expect-error 2345\n accessorNames.every(\n (accessor) => {\n var _a, _b;\n return Boolean(\n (_b = (_a = Object.getOwnPropertyDescriptor(defaultPrototype, accessor)) == null ? void 0 : _a.get) == null ? void 0 : _b.toString().includes(\"[native code]\")\n );\n }\n )\n );\n const methodNames = key in testableMethods ? testableMethods[key] : void 0;\n const isUntaintedMethods = Boolean(\n methodNames && methodNames.every(\n // @ts-expect-error 2345\n (method) => {\n var _a;\n return typeof defaultPrototype[method] === \"function\" && ((_a = defaultPrototype[method]) == null ? void 0 : _a.toString().includes(\"[native code]\"));\n }\n )\n );\n if (isUntaintedAccessors && isUntaintedMethods) {\n untaintedBasePrototype[key] = candidate.prototype;\n return candidate.prototype;\n }\n try {\n const iframeEl = document.createElement(\"iframe\");\n document.body.appendChild(iframeEl);\n const win = iframeEl.contentWindow;\n if (!win) return candidate.prototype;\n const untaintedObject = win[key].prototype;\n document.body.removeChild(iframeEl);\n if (!untaintedObject) return defaultPrototype;\n return untaintedBasePrototype[key] = untaintedObject;\n } catch {\n return defaultPrototype;\n }\n}\nconst untaintedAccessorCache = {};\nfunction getUntaintedAccessor(key, instance, accessor) {\n var _a;\n const cacheKey = `${key}.${String(accessor)}`;\n if (untaintedAccessorCache[cacheKey])\n return untaintedAccessorCache[cacheKey].call(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedAccessor = (_a = Object.getOwnPropertyDescriptor(\n untaintedPrototype,\n accessor\n )) == null ? void 0 : _a.get;\n if (!untaintedAccessor) return instance[accessor];\n untaintedAccessorCache[cacheKey] = untaintedAccessor;\n return untaintedAccessor.call(instance);\n}\nconst untaintedMethodCache = {};\nfunction getUntaintedMethod(key, instance, method) {\n const cacheKey = `${key}.${String(method)}`;\n if (untaintedMethodCache[cacheKey])\n return untaintedMethodCache[cacheKey].bind(\n instance\n );\n const untaintedPrototype = getUntaintedPrototype(key);\n const untaintedMethod = untaintedPrototype[method];\n if (typeof untaintedMethod !== \"function\") return instance[method];\n untaintedMethodCache[cacheKey] = untaintedMethod;\n return untaintedMethod.bind(instance);\n}\nfunction childNodes(n) {\n return getUntaintedAccessor(\"Node\", n, \"childNodes\");\n}\nfunction parentNode(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentNode\");\n}\nfunction parentElement(n) {\n return getUntaintedAccessor(\"Node\", n, \"parentElement\");\n}\nfunction textContent(n) {\n return getUntaintedAccessor(\"Node\", n, \"textContent\");\n}\nfunction contains(n, other) {\n return getUntaintedMethod(\"Node\", n, \"contains\")(other);\n}\nfunction getRootNode(n) {\n return getUntaintedMethod(\"Node\", n, \"getRootNode\")();\n}\nfunction host(n) {\n if (!n || !(\"host\" in n)) return null;\n return getUntaintedAccessor(\"ShadowRoot\", n, \"host\");\n}\nfunction styleSheets(n) {\n return n.styleSheets;\n}\nfunction shadowRoot(n) {\n if (!n || !(\"shadowRoot\" in n)) return null;\n return getUntaintedAccessor(\"Element\", n, \"shadowRoot\");\n}\nfunction querySelector(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelector\")(selectors);\n}\nfunction querySelectorAll(n, selectors) {\n return getUntaintedAccessor(\"Element\", n, \"querySelectorAll\")(selectors);\n}\nfunction mutationObserverCtor() {\n return getUntaintedPrototype(\"MutationObserver\").constructor;\n}\nconst index = {\n childNodes,\n parentNode,\n parentElement,\n textContent,\n contains,\n getRootNode,\n host,\n styleSheets,\n shadowRoot,\n querySelector,\n querySelectorAll,\n mutationObserver: mutationObserverCtor\n};\nexport {\n childNodes,\n contains,\n index as default,\n getRootNode,\n getUntaintedAccessor,\n getUntaintedMethod,\n getUntaintedPrototype,\n host,\n mutationObserverCtor,\n parentElement,\n parentNode,\n querySelector,\n querySelectorAll,\n shadowRoot,\n styleSheets,\n textContent\n};\n//# sourceMappingURL=rrweb-utils.js.map\n","import { getGlobalScope } from '@amplitude/analytics-core';\nimport dom from '@amplitude/rrweb-utils';\nimport type { eventWithTime, scrollCallback } from '@amplitude/rrweb-types';\n\n// These functions are not exposed in rrweb package, so we will define it here to use\n// Ignoring this function since this is copied from rrweb\n/* istanbul ignore next */\nexport function getWindowScroll(win: Window) {\n const doc = win.document;\n return {\n left: doc.scrollingElement\n ? doc.scrollingElement.scrollLeft\n : win.pageXOffset !== undefined\n ? win.pageXOffset\n : doc.documentElement.scrollLeft ||\n (doc?.body && dom.parentElement(doc.body)?.scrollLeft) ||\n doc?.body?.scrollLeft ||\n 0,\n top: doc.scrollingElement\n ? doc.scrollingElement.scrollTop\n : win.pageYOffset !== undefined\n ? win.pageYOffset\n : doc?.documentElement.scrollTop ||\n (doc?.body && dom.parentElement(doc.body)?.scrollTop) ||\n doc?.body?.scrollTop ||\n 0,\n };\n}\n\nexport function getWindowHeight(): number {\n const globalScope = getGlobalScope();\n return (\n globalScope?.innerHeight ||\n (document.documentElement && document.documentElement.clientHeight) ||\n (document.body && document.body.clientHeight) ||\n 0\n );\n}\n\nexport function getWindowWidth(): number {\n const globalScope = getGlobalScope();\n return (\n globalScope?.innerWidth ||\n (document.documentElement && document.documentElement.clientWidth) ||\n (document.body && document.body.clientWidth) ||\n 0\n );\n}\n\nexport type Mirror = {\n getNode: (id: number) => Node | null;\n};\n\nexport type RecordFunction = {\n (options: {\n emit: (event: eventWithTime) => void;\n inlineStylesheet?: boolean;\n hooks?: {\n mouseInteraction?: any;\n scroll?: scrollCallback;\n };\n maskAllInputs?: boolean;\n maskTextClass?: string;\n blockClass?: string;\n blockSelector?: string;\n maskInputFn?: (text: string, element: HTMLElement | null) => string;\n maskTextFn?: (text: string, element: HTMLElement | null) => string;\n maskTextSelector?: string;\n recordCanvas?: boolean;\n slimDOMOptions?: {\n script?: boolean;\n comment?: boolean;\n };\n errorHandler?: (error: unknown) => boolean;\n plugins?: any[];\n applyBackgroundColorToBlockedElements?: boolean;\n }): (() => void) | undefined;\n addCustomEvent: (eventName: string, eventData: any) => void;\n mirror: Mirror;\n};\n","/* istanbul ignore file */\n\n// DO NOT EDIT (unless you know what you're doing)\n// Taken directly from git@github.com:antonmedv/finder.git@77d33158440dfffee4a300d2975b43a5283004ab\n\n/* eslint-disable @typescript-eslint/no-unnecessary-type-assertion */\n/* eslint-disable prefer-const */\n\n// License: MIT\n// Author: Anton Medvedev <anton@medv.io>\n// Source: https://github.com/antonmedv/finder\n\ntype Knot = {\n name: string;\n penalty: number;\n level?: number;\n};\n\ntype Path = Knot[];\n\nexport type Options = {\n root: Element;\n idName: (name: string) => boolean;\n className: (name: string) => boolean;\n tagName: (name: string) => boolean;\n attr: (name: string, value: string) => boolean;\n seedMinLength: number;\n optimizedMinLength: number;\n threshold: number;\n maxNumberOfTries: number;\n timeoutMs: number | undefined;\n};\n\nlet config: Options;\nlet rootDocument: Document | Element;\nlet start: Date;\n\nexport function finder(input: Element, options?: Partial<Options>): string {\n start = new Date();\n if (input.nodeType !== Node.ELEMENT_NODE) {\n throw new Error(`Can't generate CSS selector for non-element node type.`);\n }\n if ('html' === input.tagName.toLowerCase()) {\n return 'html';\n }\n const defaults: Options = {\n root: document.body,\n idName: (_name: string) => true,\n className: (_name: string) => true,\n tagName: (_name: string) => true,\n attr: (_name: string, _value: string) => false,\n seedMinLength: 1,\n optimizedMinLength: 2,\n threshold: 1000,\n maxNumberOfTries: 10000,\n timeoutMs: undefined,\n };\n\n config = { ...defaults, ...options };\n rootDocument = findRootDocument(config.root, defaults);\n\n let path = bottomUpSearch(input, 'all', () =>\n bottomUpSearch(input, 'two', () => bottomUpSearch(input, 'one', () => bottomUpSearch(input, 'none'))),\n );\n\n if (path) {\n const optimized = sort(optimize(path, input));\n if (optimized.length > 0) {\n path = optimized[0];\n }\n return selector(path);\n } else {\n throw new Error(`Selector was not found.`);\n }\n}\n\nfunction findRootDocument(rootNode: Element | Document, defaults: Options) {\n if (rootNode.nodeType === Node.DOCUMENT_NODE) {\n return rootNode;\n }\n if (rootNode === defaults.root) {\n return rootNode.ownerDocument as Document;\n }\n return rootNode;\n}\n\nfunction bottomUpSearch(\n input: Element,\n limit: 'all' | 'two' | 'one' | 'none',\n fallback?: () => Path | null,\n): Path | null {\n let path: Path | null = null;\n let stack: Knot[][] = [];\n let current: Element | null = input;\n let i = 0;\n while (current) {\n const elapsedTime = new Date().getTime() - start.getTime();\n if (config.timeoutMs !== undefined && elapsedTime > config.timeoutMs) {\n throw new Error(`Timeout: Can't find a unique selector after ${elapsedTime}ms`);\n }\n let level: Knot[] = maybe(id(current)) ||\n maybe(...attr(current)) ||\n maybe(...classNames(current)) ||\n maybe(tagName(current)) || [any()];\n const nth = index(current);\n if (limit == 'all') {\n if (nth) {\n level = level.concat(level.filter(dispensableNth).map((node) => nthChild(node, nth)));\n }\n } else if (limit == 'two') {\n level = level.slice(0, 1);\n if (nth) {\n level = level.concat(level.filter(dispensableNth).map((node) => nthChild(node, nth)));\n }\n } else if (limit == 'one') {\n const [node] = (level = level.slice(0, 1));\n if (nth && dispensableNth(node)) {\n level = [nthChild(node, nth)];\n }\n } else if (limit == 'none') {\n level = [any()];\n if (nth) {\n level = [nthChild(level[0], nth)];\n }\n }\n for (let node of level) {\n node.level = i;\n }\n stack.push(level);\n if (stack.length >= config.seedMinLength) {\n path = findUniquePath(stack, fallback);\n if (path) {\n break;\n }\n }\n current = current.parentElement;\n i++;\n }\n if (!path) {\n path = findUniquePath(stack, fallback);\n }\n if (!path && fallback) {\n return fallback();\n }\n return path;\n}\n\nfunction findUniquePath(stack: Knot[][], fallback?: () => Path | null): Path | null {\n const paths = sort(combinations(stack));\n if (paths.length > config.threshold) {\n return fallback ? fallback() : null;\n }\n for (let candidate of paths) {\n if (unique(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nfunction selector(path: Path): string {\n let node = path[0];\n let query = node.name;\n for (let i = 1; i < path.length; i++) {\n const level = path[i].level || 0;\n if (node.level === level - 1) {\n query = `${path[i].name} > ${query}`;\n } else {\n query = `${path[i].name} ${query}`;\n }\n node = path[i];\n }\n return query;\n}\n\nfunction penalty(path: Path): number {\n return path.map((node) => node.penalty).reduce((acc, i) => acc + i, 0);\n}\n\nfunction unique(path: Path) {\n const css = selector(path);\n switch (rootDocument.querySelectorAll(css).length) {\n case 0:\n throw new Error(`Can't select any node with this selector: ${css}`);\n case 1:\n return true;\n default:\n return false;\n }\n}\n\nfunction id(input: Element): Knot | null {\n const elementId = input.getAttribute('id');\n if (elementId && config.idName(elementId)) {\n return {\n name: '#' + CSS.escape(elementId),\n penalty: 0,\n };\n }\n return null;\n}\n\nfunction attr(input: Element): Knot[] {\n const attrs = Array.from(input.attributes).filter((attr) => config.attr(attr.name, attr.value));\n return attrs.map(\n (attr): Knot => ({\n name: `[${CSS.escape(attr.name)}=\"${CSS.escape(attr.value)}\"]`,\n penalty: 0.5,\n }),\n );\n}\n\nfunction classNames(input: Element): Knot[] {\n const names = Array.from(input.classList).filter(config.className);\n return names.map(\n (name): Knot => ({\n name: '.' + CSS.escape(name),\n penalty: 1,\n }),\n );\n}\n\nfunction tagName(input: Element): Knot | null {\n const name = input.tagName.toLowerCase();\n if (config.tagName(name)) {\n return {\n name,\n penalty: 2,\n };\n }\n return null;\n}\n\nfunction any(): Knot {\n return {\n name: '*',\n penalty: 3,\n };\n}\n\nfunction index(input: Element): number | null {\n const parent = input.parentNode;\n if (!parent) {\n return null;\n }\n let child = parent.firstChild;\n if (!child) {\n return null;\n }\n let i = 0;\n while (child) {\n if (child.nodeType === Node.ELEMENT_NODE) {\n i++;\n }\n if (child === input) {\n break;\n }\n child = child.nextSibling;\n }\n return i;\n}\n\nfunction nthChild(node: Knot, i: number): Knot {\n return {\n name: node.name + `:nth-child(${i})`,\n penalty: node.penalty + 1,\n };\n}\n\nfunction dispensableNth(node: Knot) {\n return node.name !== 'html' && !node.name.startsWith('#');\n}\n\nfunction maybe(...level: (Knot | null)[]): Knot[] | null {\n const list = level.filter(notEmpty);\n if (list.length > 0) {\n return list;\n }\n return null;\n}\n\nfunction notEmpty<T>(value: T | null | undefined): value is T {\n return value !== null && value !== undefined;\n}\n\nfunction* combinations(stack: Knot[][], path: Knot[] = []): Generator<Knot[]> {\n if (stack.length > 0) {\n for (let node of stack[0]) {\n yield* combinations(stack.slice(1, stack.length), path.concat(node));\n }\n } else {\n yield path;\n }\n}\n\nfunction sort(paths: Iterable<Path>): Path[] {\n return [...paths].sort((a, b) => penalty(a) - penalty(b));\n}\n\ntype Scope = {\n counter: number;\n visited: Map<string, boolean>;\n};\n\nfunction* optimize(\n path: Path,\n input: Element,\n scope: Scope = {\n counter: 0,\n visited: new Map<string, boolean>(),\n },\n): Generator<Knot[]> {\n if (path.length > 2 && path.length > config.optimizedMinLength) {\n for (let i = 1; i < path.length - 1; i++) {\n if (scope.counter > config.maxNumberOfTries) {\n return; // Okay At least I tried!\n }\n scope.counter += 1;\n const newPath = [...path];\n newPath.splice(i, 1);\n const newPathKey = selector(newPath);\n if (scope.visited.has(newPathKey)) {\n return;\n }\n if (unique(newPath) && same(newPath, input)) {\n yield newPath;\n scope.visited.set(newPathKey, true);\n yield* optimize(newPath, input, scope);\n }\n }\n }\n}\n\nfunction same(path: Path, input: Element) {\n return rootDocument.querySelector(selector(path)) === input;\n}\n","import type { mouseInteractionCallBack } from '@amplitude/rrweb-types';\nimport { MouseInteractions } from '@amplitude/rrweb-types';\nimport { getWindowScroll, Mirror } from '../utils/rrweb';\nimport { SessionReplayEventsManager as AmplitudeSessionReplayEventsManager } from '../typings/session-replay';\nimport { PayloadBatcher } from 'src/track-destination';\nimport { finder } from '../libs/finder';\nimport { getGlobalScope, ILogger } from '@amplitude/analytics-core';\nimport { UGCFilterRule } from 'src/config/types';\nimport { getPageUrl } from '../helpers';\n\n// exported for testing\nexport type ClickEvent = {\n timestamp: number;\n x: number;\n y: number;\n viewportWidth: number;\n viewportHeight: number;\n pageUrl: string;\n selector?: string;\n type: 'click';\n};\n\n// exported for testing\nexport type ClickEventWithCount = ClickEvent & { count: number };\n\ntype Options = {\n sessionId: string | number;\n deviceIdFn: () => string | undefined;\n eventsManager: AmplitudeSessionReplayEventsManager<'interaction', string>;\n mirror: Mirror;\n ugcFilterRules: UGCFilterRule[];\n};\n\nconst HOUR_IN_MILLISECONDS = 3_600_000;\n\nexport const clickNonBatcher: PayloadBatcher = ({ version, events }) => {\n const clickEvents: ClickEvent[] = [];\n events.forEach((evt: string) => {\n const record = JSON.parse(evt) as Record<string, unknown>;\n record.count = 1;\n if (record.type === 'click') {\n clickEvents.push(record as ClickEvent);\n }\n });\n return { version, events: clickEvents };\n};\n\nexport const clickBatcher: PayloadBatcher = ({ version, events }) => {\n const clickEvents: ClickEvent[] = [];\n events.forEach((evt: string) => {\n const record = JSON.parse(evt) as Record<string, unknown>;\n if (record.type === 'click') {\n clickEvents.push(record as ClickEvent);\n }\n });\n\n const reduced = clickEvents.reduce<Record<string, ClickEventWithCount>>((prev, curr) => {\n const { x, y, selector, timestamp } = curr;\n\n // round down to nearest hour.\n const hour = timestamp - (timestamp % HOUR_IN_MILLISECONDS);\n\n const k = `${x}:${y}:${selector ?? ''}:${hour}`;\n if (!prev[k]) {\n prev[k] = { ...curr, timestamp: hour, count: 1 };\n } else {\n prev[k].count += 1;\n }\n return prev;\n }, {});\n\n return { version, events: Object.values(reduced) };\n};\n\nexport const clickHook: (logger: ILogger, options: Options) => mouseInteractionCallBack =\n (logger, { eventsManager, sessionId, deviceIdFn, mirror, ugcFilterRules }) =>\n (e) => {\n if (e.type !== MouseInteractions.Click) {\n return;\n }\n\n const globalScope = getGlobalScope();\n if (!globalScope) {\n return;\n }\n\n const { location, innerHeight, innerWidth } = globalScope;\n // it only makes sense to send events if a pageUrl exists\n if (!location) {\n return;\n }\n\n const { x, y } = e;\n if (x === undefined || y === undefined) {\n return;\n }\n\n const node = mirror.getNode(e.id);\n let selector;\n if (node) {\n try {\n selector = finder(node as Element);\n } catch (err) {\n logger.debug('error resolving selector from finder');\n }\n }\n\n const { left: scrollX, top: scrollY } = getWindowScroll(globalScope as unknown as Window);\n\n const pageUrl = getPageUrl(location.href, ugcFilterRules);\n\n const event: ClickEvent = {\n x: x + scrollX,\n y: y + scrollY,\n selector,\n\n viewportHeight: innerHeight,\n viewportWidth: innerWidth,\n pageUrl,\n timestamp: Date.now(),\n type: 'click',\n };\n const deviceId = deviceIdFn();\n if (deviceId) {\n eventsManager.addEvent({ sessionId, event: { type: 'interaction', data: JSON.stringify(event) }, deviceId });\n }\n };\n","import { getGlobalScope } from '@amplitude/analytics-core';\nimport { SessionReplayJoinedConfig } from './config/types';\nimport { SessionReplayDestinationSessionMetadata } from './typings/session-replay';\nimport { getServerUrl } from './helpers';\n\ntype BeaconSendFn<T> = (pageUrl: string, payload: T) => boolean;\n\n/**\n * For very small payloads it's preferable to use the [Beacon API](https://developer.mozilla.org/en-US/docs/Web/API/Beacon_API).\n * While it doesn't provide 100% guarantees on sends, it greatly helps with overall reliability and page load performance. As\n * the Beacon API has a potential to fail due to size constraints we want to fall back to XHR if need be. This is mostly to\n * be used with 'pagehide' or 'beforeunload' events.\n *\n * Note there are only 3 CORS safelisted Content-Types you can send:\n *\n * - application/x-www-form-urlencoded\n * - multipart/form-data\n * - text/plain\n *\n * If we do not send one of these, some browsers like Chrome may not send this at all. Also we incur the overhead of a preflight\n * request. In our case we will add no additional content-type header. If you are trying to ping a server that requires this\n * header, you may want to use the regular fetch API or a different mechanism.\n */\nexport class BeaconTransport<T> {\n private sendBeacon: BeaconSendFn<T>;\n private sendXhr: BeaconSendFn<T>;\n private readonly basePageUrl: string;\n private readonly context: Omit<SessionReplayDestinationSessionMetadata, 'deviceId'>;\n private readonly apiKey: string;\n\n constructor(context: Omit<SessionReplayDestinationSessionMetadata, 'deviceId'>, config: SessionReplayJoinedConfig) {\n const globalScope = getGlobalScope();\n if (globalScope && globalScope.navigator && typeof globalScope.navigator.sendBeacon === 'function') {\n this.sendBeacon = (pageUrl, payload) => {\n try {\n if (globalScope.navigator.sendBeacon(pageUrl, JSON.stringify(payload))) {\n return true;\n }\n } catch (e) {\n // not logging error, since it would be hard to view and just adds overhead.\n }\n return false;\n };\n } else {\n this.sendBeacon = () => false;\n }\n\n this.sendXhr = (pageUrl, payload) => {\n const xhr = new XMLHttpRequest();\n xhr.open('POST', pageUrl, true);\n xhr.setRequestHeader('Accept', '*/*');\n xhr.send(JSON.stringify(payload));\n return true;\n };\n\n this.basePageUrl = getServerUrl(config.serverZone, config.trackServerUrl);\n this.apiKey = config.apiKey;\n this.context = context;\n }\n\n send(deviceId: string, payload: T) {\n const { sessionId, type } = this.context;\n const urlParams = new URLSearchParams({\n device_id: deviceId,\n session_id: String(sessionId),\n type: String(type),\n api_key: this.apiKey,\n });\n\n const pageUrl = `${this.basePageUrl}?${urlParams.toString()}`;\n\n // ideally send using the beacon API, but there is a chance it may fail, possibly due to a payload\n // size limit. in this case, try best effort to send using xhr.\n this.sendBeacon(pageUrl, payload) || this.sendXhr(pageUrl, payload);\n }\n}\n","import { getWindowHeight, getWindowWidth } from '../utils/rrweb';\nimport type { scrollCallback, scrollPosition } from '@amplitude/rrweb-types';\nimport { BeaconTransport } from '../beacon-transport';\nimport { getGlobalScope } from '@amplitude/analytics-core';\nimport { SessionReplayJoinedConfig } from '../config/types';\nimport { SessionReplayDestinationSessionMetadata } from '../typings/session-replay';\nimport { getPageUrl } from '../helpers';\n\nexport type ScrollEvent = {\n timestamp: number; // Timestamp the event occurred\n maxScrollX: number; // Max window scroll X on a page\n maxScrollY: number; // Max window scroll Y on a page\n maxScrollHeight: number; // Max window scroll Y + window height on a page\n maxScrollWidth: number; // Max window scroll X + window width on a page\n viewportWidth: number;\n viewportHeight: number;\n pageUrl: string;\n type: 'scroll';\n};\n\nexport type ScrollEventPayload = { version: number; events: ScrollEvent[] };\n\n/**\n * This is intended to watch and update max scroll activity when loaded for a particular page.\n * A new instance should be created if the page URL changes, since by default it does not reset\n * it's max scroll state. It is intended to send very few and very small events utilizing the\n * Beacon API.\n * @see {@link BeaconTransport} for more details on Beacon API usage.\n */\nexport class ScrollWatcher {\n private timestamp = Date.now();\n private _maxScrollX: number;\n private _maxScrollY: number;\n private _maxScrollWidth: number;\n private _maxScrollHeight: number;\n private readonly transport: BeaconTransport<ScrollEventPayload>;\n private readonly config: Pick<SessionReplayJoinedConfig, 'loggerProvider' | 'interactionConfig'>;\n\n static default(\n context: Omit<SessionReplayDestinationSessionMetadata, 'deviceId'>,\n config: SessionReplayJoinedConfig,\n ): ScrollWatcher {\n return new ScrollWatcher(new BeaconTransport<ScrollEventPayload>(context, config), config);\n }\n\n constructor(\n transport: BeaconTransport<ScrollEventPayload>,\n config: Pick<SessionReplayJoinedConfig, 'loggerProvider' | 'interactionConfig'>,\n ) {\n this._maxScrollX = 0;\n this._maxScrollY = 0;\n this._maxScrollWidth = getWindowWidth();\n this._maxScrollHeight = getWindowHeight();\n this.config = config;\n\n this.transport = transport;\n }\n\n public get maxScrollX(): number {\n return this._maxScrollX;\n }\n\n public get maxScrollY(): number {\n return this._maxScrollY;\n }\n\n public get maxScrollWidth(): number {\n return this._maxScrollWidth;\n }\n\n public get maxScrollHeight(): number {\n return this._maxScrollHeight;\n }\n\n update(e: scrollPosition) {\n const now = Date.now();\n if (e.x > this._maxScrollX) {\n const width = getWindowWidth();\n this._maxScrollX = e.x;\n const maxScrollWidth = e.x + width;\n if (maxScrollWidth > this._maxScrollWidth) {\n this._maxScrollWidth = maxScrollWidth;\n }\n this.timestamp = now;\n }\n\n if (e.y > this._maxScrollY) {\n const height = getWindowHeight();\n this._maxScrollY = e.y;\n const maxScrollHeight = e.y + height;\n if (maxScrollHeight > this._maxScrollHeight) {\n this._maxScrollHeight = maxScrollHeight;\n }\n this.timestamp = now;\n }\n }\n\n hook: scrollCallback = (e: scrollPosition) => {\n this.update(e);\n };\n\n send: (deviceIdFn: () => string | undefined) => (_: PageTransitionEvent | Event) => void = (deviceIdFn) => (_) => {\n const deviceId = deviceIdFn();\n const globalScope = getGlobalScope();\n if (globalScope && deviceId) {\n this.transport.send(deviceId, {\n version: 1,\n events: [\n {\n maxScrollX: this._maxScrollX,\n maxScrollY: this._maxScrollY,\n maxScrollWidth: this._maxScrollWidth,\n maxScrollHeight: this._maxScrollHeight,\n\n viewportHeight: getWindowHeight(),\n viewportWidth: getWindowWidth(),\n pageUrl: getPageUrl(globalScope.location.href, this.config.interactionConfig?.ugcFilterRules ?? []),\n timestamp: this.timestamp,\n type: 'scroll',\n },\n ],\n });\n }\n };\n}\n","import { generateSessionReplayId } from './helpers';\nimport { SessionIdentifiers as ISessionIdentifiers } from './typings/session-replay';\n\nexport class SessionIdentifiers implements ISessionIdentifiers {\n deviceId?: string;\n sessionId?: string | number;\n sessionReplayId?: string;\n\n constructor({ sessionId, deviceId }: { sessionId?: string | number; deviceId?: string }) {\n this.deviceId = deviceId;\n this.sessionId = sessionId;\n\n if (sessionId && deviceId) {\n this.sessionReplayId = generateSessionReplayId(sessionId, deviceId);\n }\n }\n}\n","import { Logger as ILogger } from '@amplitude/analytics-types';\nimport { DBSchema, IDBPDatabase, openDB } from 'idb';\n\nexport const MAX_IDB_STORAGE_LENGTH = 1000 * 60 * 60 * 24 * 2; // 2 days\n\nexport interface SessionReplayTargetingDB extends DBSchema {\n sessionTargetingMatch: {\n key: string;\n value: {\n sessionId: string;\n targetingMatch: boolean;\n lastUpdated: number;\n };\n };\n}\n\nexport class TargetingIDBStore {\n dbs: { [apiKey: string]: IDBPDatabase<SessionReplayTargetingDB> } = {};\n\n createStore = async (dbName: string) => {\n return await openDB<SessionReplayTargetingDB>(dbName, 1, {\n upgrade: (db: IDBPDatabase<SessionReplayTargetingDB>) => {\n if (!db.objectStoreNames.contains('sessionTargetingMatch')) {\n db.createObjectStore('sessionTargetingMatch', {\n keyPath: 'sessionId',\n });\n }\n },\n });\n };\n\n openOrCreateDB = async (apiKey: string) => {\n if (this.dbs && this.dbs[apiKey]) {\n return this.dbs[apiKey];\n }\n const dbName = `${apiKey.substring(0, 10)}_amp_session_replay_targeting`;\n const db = await this.createStore(dbName);\n this.dbs[apiKey] = db;\n return db;\n };\n\n getTargetingMatchForSession = async ({\n loggerProvider,\n apiKey,\n sessionId,\n }: {\n loggerProvider: ILogger;\n apiKey: string;\n sessionId: string | number;\n }) => {\n try {\n const db = await this.openOrCreateDB(apiKey);\n const sessionIdStr = String(sessionId);\n const targetingMatchForSession = await db.get<'sessionTargetingMatch'>('sessionTargetingMatch', sessionIdStr);\n\n return targetingMatchForSession?.targetingMatch;\n } catch (e) {\n loggerProvider.warn(`Failed to get targeting match for session id ${sessionId}: ${e as string}`);\n }\n return undefined;\n };\n\n storeTargetingMatchForSession = async ({\n loggerProvider,\n apiKey,\n sessionId,\n targetingMatch,\n }: {\n loggerProvider: ILogger;\n apiKey: string;\n sessionId: string | number;\n targetingMatch: boolean;\n }) => {\n try {\n const db = await this.openOrCreateDB(apiKey);\n const sessionIdStr = String(sessionId);\n const targetingMatchForSession = await db.put<'sessionTargetingMatch'>('sessionTargetingMatch', {\n targetingMatch,\n sessionId: sessionIdStr,\n lastUpdated: Date.now(),\n });\n\n return targetingMatchForSession;\n } catch (e) {\n loggerProvider.warn(`Failed to store targeting match for session id ${sessionId}: ${e as string}`);\n }\n return undefined;\n };\n\n clearStoreOfOldSessions = async ({\n loggerProvider,\n apiKey,\n currentSessionId,\n }: {\n loggerProvider: ILogger;\n apiKey: string;\n currentSessionId: string | number;\n }) => {\n try {\n const db = await this.openOrCreateDB(apiKey);\n const currentSessionIdStr = String(currentSessionId);\n const tx = db.transaction<'sessionTargetingMatch', 'readwrite'>('sessionTargetingMatch', 'readwrite');\n const allTargetingMatchObjs = await tx.store.getAll();\n for (let i = 0; i < allTargetingMatchObjs.length; i++) {\n const targetingMatchObj = allTargetingMatchObjs[i];\n const amountOfTimeSinceSession = Date.now() - targetingMatchObj.lastUpdated;\n if (targetingMatchObj.sessionId !== currentSessionIdStr && amountOfTimeSinceSession > MAX_IDB_STORAGE_LENGTH) {\n await tx.store.delete(targetingMatchObj.sessionId);\n }\n }\n await tx.done;\n } catch (e) {\n loggerProvider.warn(`Failed to clear old targeting matches for sessions: ${e as string}`);\n }\n };\n}\nexport const targetingIDBStore = new TargetingIDBStore();\n","import { getPageUrl } from '../helpers';\nimport { UGCFilterRule } from '../config/types';\nimport { DEFAULT_URL_CHANGE_POLLING_INTERVAL } from '../constants';\nimport { RecordPlugin } from '@amplitude/rrweb-types';\n\n/**\n * Event emitted when URL changes are detected by the plugin\n * Contains the current page URL, title, and viewport dimensions\n */\nexport interface URLChangeEvent {\n /** The current page URL (may be filtered if UGC rules are applied) */\n href: string;\n /** The current page title */\n title: string;\n /** Viewport height in pixels */\n viewportHeight: number;\n /** Viewport width in pixels */\n viewportWidth: number;\n /** The type of URL change event */\n type: string;\n}\n\n/**\n * Configuration options for the URL tracking plugin\n */\nexport interface URLTrackingPluginOptions {\n /** Rules for filtering sensitive URLs (User Generated Content) */\n ugcFilterRules?: UGCFilterRule[];\n /** Whether to use polling instead of history API events for URL detection */\n enablePolling?: boolean;\n /** Interval in milliseconds for polling URL changes (default: 1000ms) */\n pollingInterval?: number;\n /** Whether to capture document title in URL change events (default: false) */\n captureDocumentTitle?: boolean;\n}\n\n/**\n * Creates a URL tracking plugin for rrweb record function\n *\n * This plugin monitors URL changes in the browser and emits events when the URL changes.\n * It supports three tracking modes:\n * 1. Polling (if explicitly enabled) - periodically checks for URL changes\n * 2. History API + Hash routing (default) - patches pushState/replaceState, listens to popstate and hashchange\n * 3. Hash routing only (fallback) - listens to hashchange events when History API is unavailable\n *\n * The plugin handles edge cases gracefully:\n * - Missing or null location objects\n * - Undefined, null, or empty location.href values\n * - Temporal dead zone issues with variable declarations\n * - Consistent URL normalization across all code paths\n *\n * @param options Configuration options for URL tracking\n * @returns RecordPlugin instance that can be used with rrweb\n */\nexport function createUrlTrackingPlugin(\n options: URLTrackingPluginOptions = {},\n): RecordPlugin<URLTrackingPluginOptions> {\n return {\n name: 'amplitude/url-tracking@1',\n observer(cb, globalScope, pluginOptions?: URLTrackingPluginOptions) {\n // Merge options with plugin-level options taking precedence over constructor options\n const config = { ...options, ...pluginOptions };\n const ugcFilterRules = config.ugcFilterRules || [];\n const enablePolling = config.enablePolling ?? false;\n const pollingInterval = config.pollingInterval ?? DEFAULT_URL_CHANGE_POLLING_INTERVAL;\n const captureDocumentTitle = config.captureDocumentTitle ?? false;\n\n // Early return if no global scope is available\n if (!globalScope) {\n return () => {\n // No cleanup needed if no global scope available\n };\n }\n\n // Track the last URL to prevent duplicate events\n // Initialize to undefined to ensure first call always emits an event\n let lastTrackedUrl: string | undefined = undefined;\n\n // Helper functions\n /**\n * Gets the current URL with proper normalization\n * Handles edge cases where location.href might be undefined, null, or empty\n * Ensures consistent behavior across all code paths\n * @returns Normalized URL string (empty string if location unavailable)\n */\n const getCurrentUrl = (): string => {\n if (!globalScope.location) return '';\n return globalScope.location.href || '';\n };\n\n /**\n * Creates a URL change event with current page information\n * Applies UGC filtering if rules are configured\n * Uses getCurrentUrl() for consistent URL normalization\n * @returns URLChangeEvent with current page state\n */\n const createUrlChangeEvent = (): URLChangeEvent => {\n const { innerHeight, innerWidth, document } = globalScope;\n const currentUrl = getCurrentUrl();\n let currentTitle = '';\n if (captureDocumentTitle) {\n currentTitle = document?.title || '';\n }\n\n // Apply UGC filtering if rules are provided, otherwise use original URL\n const filteredUrl = ugcFilterRules.length > 0 ? getPageUrl(currentUrl, ugcFilterRules) : currentUrl;\n\n return {\n href: filteredUrl,\n title: currentTitle,\n viewportHeight: innerHeight,\n viewportWidth: innerWidth,\n type: 'url-change-event',\n };\n };\n\n /**\n * Emits a URL change event if the URL has actually changed\n * Always emits on first call (when lastTrackedUrl is undefined)\n * Prevents duplicate events for the same URL on subsequent calls\n * Handles edge cases like undefined/null/empty URLs gracefully\n */\n const emitUrlChange = (): void => {\n const currentUrl = getCurrentUrl();\n\n // Always emit on first call, or if URL actually changed\n if (lastTrackedUrl === undefined || currentUrl !== lastTrackedUrl) {\n lastTrackedUrl = currentUrl;\n const event = createUrlChangeEvent();\n cb(event);\n }\n };\n\n /**\n * Creates a patched version of history methods (pushState/replaceState)\n * that calls the original method and then emits a URL change event\n * Ensures URL changes are detected even when history methods are called programmatically\n * @param originalMethod The original history method to patch\n * @returns Patched function that calls original method then emits URL change event\n */\n const createHistoryMethodPatch = <T extends typeof history.pushState | typeof history.replaceState>(\n originalMethod: T,\n ) => {\n return function (this: History, ...args: Parameters<T>) {\n // Call the original history method first\n const result = originalMethod.apply(this, args);\n // Then emit URL change event\n emitUrlChange();\n return result;\n };\n };\n\n // Hashchange event handler - delegates to emitUrlChange for consistency\n const hashChangeHandler = () => {\n emitUrlChange();\n };\n\n // 1. if explicitly enable polling → use polling\n if (enablePolling) {\n // Use polling (covers everything)\n const urlChangeInterval = globalScope.setInterval(() => {\n emitUrlChange();\n }, pollingInterval);\n\n // Emit initial URL immediately\n emitUrlChange();\n\n // Return cleanup function to stop polling\n return () => {\n if (urlChangeInterval) {\n globalScope.clearInterval(urlChangeInterval);\n }\n };\n }\n\n // 2. if polling not enabled → check history, if exist, use history\n if (globalScope.history) {\n // Use History API + hashchange (covers History API + hash routing)\n // Store original history methods for restoration during cleanup\n const originalPushState = globalScope.history.pushState.bind(globalScope.history);\n const originalReplaceState = globalScope.history.replaceState.bind(globalScope.history);\n\n /**\n * Sets up history method patching to intercept pushState and replaceState calls\n * This ensures URL changes are detected even when history methods are called programmatically\n */\n const setupHistoryPatching = (): void => {\n // Patch pushState to emit URL change events\n globalScope.history.pushState = createHistoryMethodPatch(originalPushState);\n\n // Patch replaceState to emit URL change events\n globalScope.history.replaceState = createHistoryMethodPatch(originalReplaceState);\n };\n\n // Apply history method patches\n setupHistoryPatching();\n\n // Listen to popstate events for browser back/forward navigation\n globalScope.addEventListener('popstate', emitUrlChange);\n // Listen to hashchange events for hash routing\n globalScope.addEventListener('hashchange', hashChangeHandler);\n\n // Emit initial URL immediately\n emitUrlChange();\n\n // Return cleanup function to restore original state\n return () => {\n // Restore original history methods\n globalScope.history.pushState = originalPushState;\n globalScope.history.replaceState = originalReplaceState;\n\n // Remove popstate event listener\n globalScope.removeEventListener('popstate', emitUrlChange);\n // Remove hashchange event listener\n globalScope.removeEventListener('hashchange', hashChangeHandler);\n };\n }\n\n // 3. if not, then the framework is probably using hash router → do hash\n // Fallback: just hashchange (for pure hash routing)\n globalScope.addEventListener('hashchange', hashChangeHandler);\n emitUrlChange();\n return () => {\n globalScope.removeEventListener('hashchange', hashChangeHandler);\n };\n },\n options,\n };\n}\n\n/**\n * Default URL tracking plugin instance with default options\n * Can be used directly without custom configuration\n */\nexport const urlTrackingPlugin = createUrlTrackingPlugin();\n","import {\n getAnalyticsConnector,\n getGlobalScope,\n ILogger,\n Logger,\n LogLevel,\n returnWrapper,\n SpecialEventType,\n} from '@amplitude/analytics-core';\n\n// Import only specific types to avoid pulling in the entire rrweb-types package\nimport { eventWithTime, EventType as RRWebEventType, scrollCallback } from '@amplitude/rrweb-types';\nimport { TargetingParameters } from '@amplitude/targeting';\nimport { createSessionReplayJoinedConfigGenerator } from './config/joined-config';\nimport {\n LoggingConfig,\n SessionReplayJoinedConfig,\n SessionReplayJoinedConfigGenerator,\n SessionReplayLocalConfig,\n SessionReplayMetadata,\n SessionReplayRemoteConfig,\n} from './config/types';\nimport {\n BLOCK_CLASS,\n CustomRRwebEvent,\n DEFAULT_SESSION_REPLAY_PROPERTY,\n INTERACTION_MAX_INTERVAL,\n INTERACTION_MIN_INTERVAL,\n MASK_TEXT_CLASS,\n SESSION_REPLAY_DEBUG_PROPERTY,\n} from './constants';\nimport { EventCompressor } from './events/event-compressor';\nimport { createEventsManager } from './events/events-manager';\nimport { MultiEventManager } from './events/multi-manager';\nimport { generateHashCode, isTimestampInSample } from '@amplitude/analytics-core';\nimport { getDebugConfig, getPageUrl, getStorageSize, maskFn } from './helpers';\nimport { clickBatcher, clickHook, clickNonBatcher } from './hooks/click';\nimport { ScrollWatcher } from './hooks/scroll';\nimport { SessionIdentifiers } from './identifiers';\nimport { SafeLoggerProvider } from './logger';\nimport { evaluateTargetingAndStore } from './targeting/targeting-manager';\nimport {\n AmplitudeSessionReplay,\n SessionReplayEventsManager as AmplitudeSessionReplayEventsManager,\n DebugInfo,\n EventsManagerWithType,\n EventType,\n SessionIdentifiers as ISessionIdentifiers,\n SessionReplayOptions,\n} from './typings/session-replay';\nimport { VERSION } from './version';\n\n// Import only the type for NetworkRequestEvent to keep type safety\nimport type { NetworkObservers, NetworkRequestEvent } from './observers';\nimport { createUrlTrackingPlugin } from './plugins/url-tracking-plugin';\nimport type { RecordFunction } from './utils/rrweb';\n\ntype PageLeaveFn = (e: PageTransitionEvent | Event) => void;\n\nexport class SessionReplay implements AmplitudeSessionReplay {\n name = '@amplitude/session-replay-browser';\n config: SessionReplayJoinedConfig | undefined;\n joinedConfigGenerator: SessionReplayJoinedConfigGenerator | undefined;\n identifiers: ISessionIdentifiers | undefined;\n eventsManager?: AmplitudeSessionReplayEventsManager<'replay' | 'interaction', string>;\n loggerProvider: ILogger;\n recordCancelCallback: ReturnType<RecordFunction> | null = null;\n eventCount = 0;\n eventCompressor: EventCompressor | undefined;\n sessionTargetingMatch = false;\n private lastTargetingParams?: Pick<TargetingParameters, 'event' | 'userProperties'>;\n private lastShouldRecordDecision?: boolean;\n\n // Visible for testing only\n pageLeaveFns: PageLeaveFn[] = [];\n private scrollHook?: scrollCallback;\n private networkObservers?: NetworkObservers;\n private metadata: SessionReplayMetadata | undefined;\n\n // Cache the dynamically imported record function\n private recordFunction: RecordFunction | null = null;\n\n constructor() {\n this.loggerProvider = new SafeLoggerProvider(new Logger());\n }\n\n init(apiKey: string, options: SessionReplayOptions) {\n return returnWrapper(this._init(apiKey, options));\n }\n\n private teardownEventListeners = (teardown: boolean) => {\n const globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.removeEventListener('blur', this.blurListener);\n globalScope.removeEventListener('focus', this.focusListener);\n !teardown && globalScope.addEventListener('blur', this.blurListener);\n !teardown && globalScope.addEventListener('focus', this.focusListener);\n // prefer pagehide to unload events, this is the standard going forward. it is not\n // 100% reliable, but is bfcache-compatible.\n if (globalScope.self && 'onpagehide' in globalScope.self) {\n globalScope.removeEventListener('pagehide', this.pageLeaveListener);\n !teardown && globalScope.addEventListener('pagehide', this.pageLeaveListener);\n } else {\n // this has performance implications, but is the only way we can reliably send events\n // in browser that don't support pagehide.\n globalScope.removeEventListener('beforeunload', this.pageLeaveListener);\n !teardown && globalScope.addEventListener('beforeunload', this.pageLeaveListener);\n }\n }\n };\n\n protected async _init(apiKey: string, options: SessionReplayOptions) {\n this.loggerProvider = new SafeLoggerProvider(options.loggerProvider || new Logger());\n Object.prototype.hasOwnProperty.call(options, 'logLevel') &&\n this.loggerProvider.enable(options.logLevel as LogLevel);\n this.identifiers = new SessionIdentifiers({ sessionId: options.sessionId, deviceId: options.deviceId });\n this.joinedConfigGenerator = await createSessionReplayJoinedConfigGenerator(apiKey, options);\n const { joinedConfig, localConfig, remoteConfig } = await this.joinedConfigGenerator.generateJoinedConfig(\n this.identifiers.sessionId,\n );\n this.config = joinedConfig;\n\n this.setMetadata(\n options.sessionId,\n joinedConfig,\n localConfig,\n remoteConfig,\n options.version?.version,\n VERSION,\n options.version?.type,\n );\n\n if (options.sessionId && this.config.interactionConfig?.enabled) {\n const scrollWatcher = ScrollWatcher.default(\n {\n sessionId: options.sessionId,\n type: 'interaction',\n },\n this.config,\n );\n this.pageLeaveFns = [scrollWatcher.send(this.getDeviceId.bind(this)).bind(scrollWatcher)];\n this.scrollHook = scrollWatcher.hook.bind(scrollWatcher);\n }\n\n const managers: EventsManagerWithType<EventType, string>[] = [];\n let { storeType } = this.config;\n if (storeType === 'idb' && !getGlobalScope()?.indexedDB) {\n storeType = 'memory';\n this.loggerProvider.warn('Could not use preferred indexedDB storage, reverting to in memory option.');\n }\n this.loggerProvider.log(`Using ${storeType} for event storage.`);\n try {\n const rrwebEventManager = await createEventsManager<'replay'>({\n config: this.config,\n sessionId: this.identifiers.sessionId,\n type: 'replay',\n storeType,\n });\n managers.push({ name: 'replay', manager: rrwebEventManager });\n } catch (error) {\n const typedError = error as Error;\n this.loggerProvider.warn(`Error occurred while creating replay events manager: ${typedError.toString()}`);\n }\n\n if (this.config.interactionConfig?.enabled) {\n const payloadBatcher = this.config.interactionConfig.batch ? clickBatcher : clickNonBatcher;\n try {\n const interactionEventManager = await createEventsManager<'interaction'>({\n config: this.config,\n sessionId: this.identifiers.sessionId,\n type: 'interaction',\n minInterval: this.config.interactionConfig.trackEveryNms ?? INTERACTION_MIN_INTERVAL,\n maxInterval: INTERACTION_MAX_INTERVAL,\n payloadBatcher,\n storeType,\n });\n managers.push({ name: 'interaction', manager: interactionEventManager });\n } catch (error) {\n const typedError = error as Error;\n this.loggerProvider.warn(`Error occurred while creating interaction events manager: ${typedError.toString()}`);\n }\n }\n\n this.eventsManager = new MultiEventManager<'replay' | 'interaction', string>(...managers);\n // To prevent too many threads.\n if (this.eventCompressor) {\n this.eventCompressor.terminate();\n }\n\n let workerScript = undefined;\n const globalScope = getGlobalScope();\n if (this.config.experimental?.useWebWorker && globalScope && globalScope.Worker) {\n const { compressionScript } = await import('./worker');\n\n workerScript = compressionScript;\n }\n\n this.eventCompressor = new EventCompressor(this.eventsManager, this.config, this.getDeviceId(), workerScript);\n\n await this.initializeNetworkObservers();\n\n this.loggerProvider.log('Installing @amplitude/session-replay-browser.');\n\n this.teardownEventListeners(false);\n\n await this.evaluateTargetingAndCapture({ userProperties: options.userProperties }, true);\n }\n\n setSessionId(sessionId: string | number, deviceId?: string) {\n return returnWrapper(this.asyncSetSessionId(sessionId, deviceId));\n }\n\n async asyncSetSessionId(\n sessionId: string | number,\n deviceId?: string,\n options?: { userProperties?: { [key: string]: any } },\n ) {\n this.sessionTargetingMatch = false;\n this.lastShouldRecordDecision = undefined; // Reset targeting decision for new session\n\n const previousSessionId = this.identifiers && this.identifiers.sessionId;\n if (previousSessionId) {\n this.sendEvents(previousSessionId);\n }\n\n const deviceIdForReplayId = deviceId || this.getDeviceId();\n this.identifiers = new SessionIdentifiers({\n sessionId: sessionId,\n deviceId: deviceIdForReplayId,\n });\n\n // If there is no previous session id, SDK is being initialized for the first time,\n // and config was just fetched in initialization, so no need to fetch it a second time\n if (this.joinedConfigGenerator && previousSessionId) {\n const { joinedConfig } = await this.joinedConfigGenerator.generateJoinedConfig(this.identifiers.sessionId);\n this.config = joinedConfig;\n }\n\n if (this.config?.targetingConfig) {\n await this.evaluateTargetingAndCapture({ userProperties: options?.userProperties });\n } else {\n await this.recordEvents();\n }\n }\n\n getSessionReplayProperties() {\n const config = this.config;\n const identifiers = this.identifiers;\n if (!config || !identifiers) {\n this.loggerProvider.warn('Session replay init has not been called, cannot get session replay properties.');\n return {};\n }\n\n const shouldRecord = this.getShouldRecord();\n let eventProperties: { [key: string]: string | null } = {};\n\n if (shouldRecord) {\n eventProperties = {\n [DEFAULT_SESSION_REPLAY_PROPERTY]: identifiers.sessionReplayId ? identifiers.sessionReplayId : null,\n };\n if (config.debugMode) {\n eventProperties[SESSION_REPLAY_DEBUG_PROPERTY] = JSON.stringify({\n appHash: generateHashCode(config.apiKey).toString(),\n });\n }\n }\n\n void this.addCustomRRWebEvent(\n CustomRRwebEvent.GET_SR_PROPS,\n {\n shouldRecord,\n eventProperties: eventProperties,\n },\n this.eventCount === 10,\n );\n if (this.eventCount === 10) {\n this.eventCount = 0;\n }\n this.eventCount++;\n\n return eventProperties;\n }\n\n blurListener = () => {\n this.sendEvents();\n };\n\n focusListener = () => {\n // Restart recording on focus to ensure that when user\n // switches tabs, we take a full snapshot\n void this.recordEvents(false);\n };\n\n /**\n * This is an instance member so that if init is called multiple times\n * it doesn't add another listener to the page leave event. This is to\n * prevent duplicate listener actions from firing.\n */\n private pageLeaveListener = (e: PageTransitionEvent | Event) => {\n this.pageLeaveFns.forEach((fn) => {\n fn(e);\n });\n };\n\n evaluateTargetingAndCapture = async (\n targetingParams: Pick<TargetingParameters, 'event' | 'userProperties'>,\n isInit = false,\n ) => {\n if (!this.identifiers || !this.identifiers.sessionId || !this.config) {\n if (this.identifiers && !this.identifiers.sessionId) {\n this.loggerProvider.log('Session ID has not been set yet, cannot evaluate targeting for Session Replay.');\n } else {\n this.loggerProvider.warn('Session replay init has not been called, cannot evaluate targeting.');\n }\n return;\n }\n\n // Handle cases where there's no targeting config\n if (!this.config.targetingConfig) {\n if (isInit) {\n this.loggerProvider.log('Targeting config has not been set yet, cannot evaluate targeting.');\n } else {\n this.loggerProvider.log('No targeting config set, skipping initialization/recording for event.');\n return;\n }\n }\n\n // Store targeting parameters for use in getShouldRecord\n this.lastTargetingParams = targetingParams;\n\n if (this.config.targetingConfig && !this.sessionTargetingMatch) {\n let eventForTargeting = targetingParams.event;\n if (\n eventForTargeting &&\n Object.values(SpecialEventType).includes(eventForTargeting.event_type as SpecialEventType)\n ) {\n eventForTargeting = undefined;\n }\n\n // We're setting this on this class because fetching the value from idb\n // is async, we need to access this value synchronously (for record\n // and for getSessionReplayProperties - both synchronous fns)\n this.sessionTargetingMatch = await evaluateTargetingAndStore({\n sessionId: this.identifiers.sessionId,\n targetingConfig: this.config.targetingConfig,\n loggerProvider: this.loggerProvider,\n apiKey: this.config.apiKey,\n targetingParams: { userProperties: targetingParams.userProperties, event: eventForTargeting },\n });\n\n // Log the targeting config to debug\n this.loggerProvider.debug(\n JSON.stringify(\n {\n name: 'targeted replay capture config',\n sessionTargetingMatch: this.sessionTargetingMatch,\n event: eventForTargeting,\n targetingParams: targetingParams,\n },\n null,\n 2,\n ),\n );\n }\n\n if (isInit) {\n void this.initialize(true);\n } else {\n await this.recordEvents();\n }\n };\n\n sendEvents(sessionId?: string | number) {\n const sessionIdToSend = sessionId || this.identifiers?.sessionId;\n const deviceId = this.getDeviceId();\n this.eventsManager &&\n sessionIdToSend &&\n deviceId &&\n this.eventsManager.sendCurrentSequenceEvents({ sessionId: sessionIdToSend, deviceId });\n }\n\n async initialize(shouldSendStoredEvents = false) {\n if (!this.identifiers?.sessionId) {\n this.loggerProvider.log(`Session is not being recorded due to lack of session id.`);\n return Promise.resolve();\n }\n\n const deviceId = this.getDeviceId();\n if (!deviceId) {\n this.loggerProvider.log(`Session is not being recorded due to lack of device id.`);\n return Promise.resolve();\n }\n this.eventsManager && shouldSendStoredEvents && void this.eventsManager.sendStoredEvents({ deviceId });\n\n return this.recordEvents();\n }\n\n shouldOptOut() {\n let identityStoreOptOut: boolean | undefined;\n if (this.config?.instanceName) {\n const identityStore = getAnalyticsConnector(this.config.instanceName).identityStore;\n identityStoreOptOut = identityStore.getIdentity().optOut;\n }\n\n return identityStoreOptOut !== undefined ? identityStoreOptOut : this.config?.optOut;\n }\n\n getShouldRecord() {\n if (!this.identifiers || !this.config || !this.identifiers.sessionId) {\n this.loggerProvider.warn(`Session is not being recorded due to lack of config, please call sessionReplay.init.`);\n return false;\n }\n if (!this.config.captureEnabled) {\n this.loggerProvider.log(\n `Session ${this.identifiers.sessionId} not being captured due to capture being disabled for project or because the remote config could not be fetched.`,\n );\n return false;\n }\n\n if (this.shouldOptOut()) {\n this.loggerProvider.log(`Opting session ${this.identifiers.sessionId} out of recording due to optOut config.`);\n return false;\n }\n\n let shouldRecord = false;\n let message = '';\n let matched = false;\n\n // If targetingConfig exists, we'll use the sessionTargetingMatch to determine whether to record\n // Otherwise, we'll evaluate the session against the overall sample rate\n if (this.config.targetingConfig) {\n if (!this.sessionTargetingMatch) {\n message = `Not capturing replays for session ${this.identifiers.sessionId} due to not matching targeting conditions.`;\n this.loggerProvider.log(message);\n shouldRecord = false;\n matched = false;\n } else {\n message = `Capturing replays for session ${this.identifiers.sessionId} due to matching targeting conditions.`;\n this.loggerProvider.log(message);\n shouldRecord = true;\n matched = true;\n }\n } else {\n const isInSample = isTimestampInSample(this.identifiers.sessionId, this.config.sampleRate);\n if (!isInSample) {\n message = `Opting session ${this.identifiers.sessionId} out of recording due to sample rate.`;\n this.loggerProvider.log(message);\n shouldRecord = false;\n matched = false;\n } else {\n shouldRecord = true;\n matched = true;\n }\n }\n\n // Only send custom rrweb event for targeting decision when the decision changes\n if (this.lastShouldRecordDecision !== shouldRecord && this.config.targetingConfig) {\n void this.addCustomRRWebEvent(CustomRRwebEvent.TARGETING_DECISION, {\n message,\n sessionId: this.identifiers.sessionId,\n matched,\n targetingParams: this.lastTargetingParams,\n });\n this.lastShouldRecordDecision = shouldRecord;\n }\n\n return shouldRecord;\n }\n\n getBlockSelectors(): string | string[] | undefined {\n // For some reason, this defaults to empty array ([]) if undefined in the compiled script.\n // Empty arrays cause errors when being evaluated in Safari.\n // Force the selector to be undefined if it's an empty array.\n const blockSelector = this.config?.privacyConfig?.blockSelector ?? [];\n if (blockSelector.length === 0) {\n return undefined;\n }\n return blockSelector;\n }\n\n getMaskTextSelectors(): string | undefined {\n if (this.config?.privacyConfig?.defaultMaskLevel === 'conservative') {\n return '*';\n }\n\n const maskSelector = this.config?.privacyConfig?.maskSelector;\n if (!maskSelector) {\n return;\n }\n\n return maskSelector as unknown as string;\n }\n\n async getRecordingPlugins(loggingConfig: LoggingConfig | undefined) {\n const plugins = [];\n\n // Add URL tracking plugin\n try {\n const urlTrackingPlugin = createUrlTrackingPlugin({\n ugcFilterRules: this.config?.interactionConfig?.ugcFilterRules || [],\n enablePolling: this.config?.enableUrlChangePolling || false,\n pollingInterval: this.config?.urlChangePollingInterval,\n captureDocumentTitle: this.config?.captureDocumentTitle,\n });\n\n plugins.push(urlTrackingPlugin);\n } catch (error) {\n this.loggerProvider.warn('Failed to create URL tracking plugin:', error);\n }\n\n // Default plugin settings -\n // {\n // level: ['info', 'log', 'warn', 'error'],\n // lengthThreshold: 10000,\n // stringifyOptions: {\n // stringLengthLimit: undefined,\n // numOfKeysLimit: 50,\n // depthOfLimit: 4,\n // },\n // logger: window.console,\n // }\n if (loggingConfig?.console?.enabled) {\n try {\n // Dynamic import keeps console plugin separate and only loads when needed\n const { getRecordConsolePlugin } = await import('@amplitude/rrweb-plugin-console-record');\n plugins.push(getRecordConsolePlugin({ level: loggingConfig.console.levels }));\n } catch (error) {\n this.loggerProvider.warn('Failed to load console plugin:', error);\n }\n }\n\n return plugins.length > 0 ? plugins : undefined;\n }\n\n private async getRecordFunction(): Promise<RecordFunction | null> {\n if (this.recordFunction) {\n return this.recordFunction;\n }\n\n try {\n const { record } = await import('@amplitude/rrweb-record');\n this.recordFunction = record;\n return record;\n } catch (error) {\n this.loggerProvider.warn('Failed to load rrweb-record module:', error);\n return null;\n }\n }\n\n async recordEvents(shouldLogMetadata = true) {\n const config = this.config;\n const shouldRecord = this.getShouldRecord();\n const sessionId = this.identifiers?.sessionId;\n if (!shouldRecord || !sessionId || !config) {\n return;\n }\n this.stopRecordingEvents();\n\n const recordFunction = await this.getRecordFunction();\n\n // May be undefined if cannot import rrweb-record\n if (!recordFunction) {\n return;\n }\n\n await this.initializeNetworkObservers();\n\n this.networkObservers?.start((event: NetworkRequestEvent) => {\n void this.addCustomRRWebEvent(CustomRRwebEvent.FETCH_REQUEST, event);\n });\n const { privacyConfig, interactionConfig, loggingConfig } = config;\n\n const hooks = interactionConfig?.enabled\n ? {\n mouseInteraction:\n this.eventsManager &&\n clickHook(this.loggerProvider, {\n eventsManager: this.eventsManager,\n sessionId,\n deviceIdFn: this.getDeviceId.bind(this),\n mirror: recordFunction.mirror,\n ugcFilterRules: interactionConfig.ugcFilterRules ?? [],\n }),\n scroll: this.scrollHook,\n }\n : {};\n\n const ugcFilterRules =\n interactionConfig?.enabled && interactionConfig.ugcFilterRules ? interactionConfig.ugcFilterRules : [];\n\n this.loggerProvider.log(`Session Replay capture beginning for ${sessionId}.`);\n\n try {\n this.recordCancelCallback = recordFunction({\n emit: (event: eventWithTime) => {\n if (this.shouldOptOut()) {\n this.loggerProvider.log(`Opting session ${sessionId} out of recording due to optOut config.`);\n this.stopRecordingEvents();\n this.sendEvents();\n return;\n }\n\n if (event.type === RRWebEventType.Meta) {\n event.data.href = getPageUrl(event.data.href, ugcFilterRules);\n }\n\n if (this.eventCompressor) {\n // Schedule processing during idle time if the browser supports requestIdleCallback\n this.eventCompressor.enqueueEvent(event, sessionId);\n }\n },\n inlineStylesheet: config.shouldInlineStylesheet,\n hooks,\n maskAllInputs: true,\n maskTextClass: MASK_TEXT_CLASS,\n blockClass: BLOCK_CLASS,\n blockSelector: this.getBlockSelectors() as string | undefined,\n applyBackgroundColorToBlockedElements: config.applyBackgroundColorToBlockedElements,\n maskInputFn: maskFn('input', privacyConfig),\n maskTextFn: maskFn('text', privacyConfig),\n maskTextSelector: this.getMaskTextSelectors(),\n recordCanvas: false,\n slimDOMOptions: {\n script: config.omitElementTags?.script,\n comment: config.omitElementTags?.comment,\n },\n errorHandler: (error: unknown) => {\n const typedError = error as Error & { _external_?: boolean };\n\n // styled-components relies on this error being thrown and bubbled up, rrweb is otherwise suppressing it\n if (typedError.message.includes('insertRule') && typedError.message.includes('CSSStyleSheet')) {\n throw typedError;\n }\n\n // rrweb does monkey patching on certain window functions such as CSSStyleSheet.proptype.insertRule,\n // and errors from external clients calling these functions can get suppressed. Styled components depend\n // on these errors being re-thrown.\n if (typedError._external_) {\n throw typedError;\n }\n\n this.loggerProvider.warn('Error while capturing replay: ', typedError.toString());\n // Return true so that we don't clutter user's consoles with internal rrweb errors\n return true;\n },\n plugins: await this.getRecordingPlugins(loggingConfig),\n });\n\n void this.addCustomRRWebEvent(CustomRRwebEvent.DEBUG_INFO);\n if (shouldLogMetadata) {\n void this.addCustomRRWebEvent(CustomRRwebEvent.METADATA, this.metadata);\n }\n } catch (error) {\n this.loggerProvider.warn('Failed to initialize session replay:', error);\n }\n }\n\n addCustomRRWebEvent = async (\n eventName: CustomRRwebEvent,\n eventData: { [key: string]: any } = {},\n addStorageInfo = true,\n ) => {\n try {\n let debugInfo: DebugInfo | undefined = undefined;\n const config = this.config;\n // Only add debug info for non-metadata events\n if (config && eventName !== CustomRRwebEvent.METADATA) {\n debugInfo = {\n config: getDebugConfig(config),\n version: VERSION,\n };\n if (addStorageInfo) {\n const storageSizeData = await getStorageSize();\n debugInfo = {\n ...storageSizeData,\n ...debugInfo,\n };\n }\n }\n // Check first to ensure we are recording\n if (this.recordCancelCallback && this.recordFunction) {\n this.recordFunction.addCustomEvent(eventName, {\n ...eventData,\n ...debugInfo,\n });\n } else {\n this.loggerProvider.debug(\n `Not able to add custom replay capture event ${eventName} due to no ongoing recording.`,\n );\n }\n } catch (e) {\n this.loggerProvider.debug('Error while adding custom replay capture event: ', e);\n }\n };\n\n stopRecordingEvents = () => {\n try {\n this.loggerProvider.log('Session Replay capture stopping.');\n this.recordCancelCallback && this.recordCancelCallback();\n this.recordCancelCallback = null;\n this.networkObservers?.stop();\n } catch (error) {\n const typedError = error as Error;\n this.loggerProvider.warn(`Error occurred while stopping replay capture: ${typedError.toString()}`);\n }\n };\n\n getDeviceId() {\n return this.identifiers?.deviceId;\n }\n\n getSessionId() {\n return this.identifiers?.sessionId;\n }\n\n async flush(useRetry = false) {\n return this.eventsManager?.flush(useRetry);\n }\n\n shutdown() {\n this.teardownEventListeners(true);\n this.stopRecordingEvents();\n this.sendEvents();\n }\n\n private mapSDKType(sdkType: string | undefined) {\n if (sdkType === 'plugin') {\n return '@amplitude/plugin-session-replay-browser';\n }\n\n if (sdkType === 'segment') {\n return '@amplitude/segment-session-replay-plugin';\n }\n\n return null;\n }\n\n private setMetadata(\n sessionId: string | number | undefined,\n joinedConfig: SessionReplayJoinedConfig,\n localConfig: SessionReplayLocalConfig,\n remoteConfig: SessionReplayRemoteConfig | undefined,\n replaySDKVersion: string | undefined,\n standaloneSDKVersion: string | undefined,\n sdkType: string | undefined,\n ) {\n const hashValue = sessionId?.toString() ? generateHashCode(sessionId.toString()) : undefined;\n\n this.metadata = {\n joinedConfig,\n localConfig,\n remoteConfig,\n sessionId,\n hashValue,\n sampleRate: joinedConfig.sampleRate,\n replaySDKType: this.mapSDKType(sdkType),\n replaySDKVersion,\n standaloneSDKType: '@amplitude/session-replay-browser',\n standaloneSDKVersion,\n };\n }\n\n private async initializeNetworkObservers(): Promise<void> {\n if (this.config?.loggingConfig?.network?.enabled && !this.networkObservers) {\n try {\n const { NetworkObservers: NetworkObserversClass } = await import('./observers');\n this.networkObservers = new NetworkObserversClass();\n } catch (error) {\n this.loggerProvider.warn('Failed to import or instantiate NetworkObservers:', error);\n }\n }\n }\n}\n","import type { TargetingParameters } from '@amplitude/targeting';\nimport { TargetingConfig } from '../config/types';\nimport { Logger } from '@amplitude/analytics-types';\nimport { targetingIDBStore } from './targeting-idb-store';\n\nexport const evaluateTargetingAndStore = async ({\n sessionId,\n targetingConfig,\n loggerProvider,\n apiKey,\n targetingParams,\n}: {\n sessionId: string | number;\n targetingConfig: TargetingConfig;\n loggerProvider: Logger;\n apiKey: string;\n targetingParams?: Pick<TargetingParameters, 'event' | 'userProperties'>;\n}) => {\n await targetingIDBStore.clearStoreOfOldSessions({\n loggerProvider: loggerProvider,\n apiKey: apiKey,\n currentSessionId: sessionId,\n });\n\n const idbTargetingMatch = await targetingIDBStore.getTargetingMatchForSession({\n loggerProvider: loggerProvider,\n apiKey: apiKey,\n sessionId: sessionId,\n });\n if (idbTargetingMatch === true) {\n return true;\n }\n\n // If the targeting config is undefined or an empty object,\n // assume the response was valid but no conditions were set,\n // so all users match targeting\n let sessionTargetingMatch = true;\n try {\n // Dynamic import of the targeting package\n const { evaluateTargeting: evaluateTargetingPackage } = await import('@amplitude/targeting');\n\n const targetingResult = await evaluateTargetingPackage({\n ...targetingParams,\n flag: targetingConfig,\n sessionId: sessionId,\n apiKey: apiKey,\n loggerProvider: loggerProvider,\n });\n if (targetingResult && targetingResult.sr_targeting_config) {\n sessionTargetingMatch = targetingResult.sr_targeting_config.key === 'on';\n }\n\n void targetingIDBStore.storeTargetingMatchForSession({\n loggerProvider: loggerProvider,\n apiKey: apiKey,\n sessionId: sessionId,\n targetingMatch: sessionTargetingMatch,\n });\n } catch (err: unknown) {\n const knownError = err as Error;\n loggerProvider.warn(knownError.message);\n }\n return sessionTargetingMatch;\n};\n","import { AnalyticsConnector } from '@amplitude/analytics-connector';\nimport { DEFAULT_INSTANCE_NAME } from './types/constants';\nexport var getAnalyticsConnector = function (instanceName) {\n if (instanceName === void 0) { instanceName = DEFAULT_INSTANCE_NAME; }\n return AnalyticsConnector.getInstance(instanceName);\n};\nexport var setConnectorUserId = function (userId, instanceName) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n getAnalyticsConnector(instanceName).identityStore.editIdentity().setUserId(userId).commit();\n};\nexport var setConnectorDeviceId = function (deviceId, instanceName) {\n getAnalyticsConnector(instanceName).identityStore.editIdentity().setDeviceId(deviceId).commit();\n};\n//# sourceMappingURL=analytics-connector.js.map","import { debugWrapper, LogConfig } from '@amplitude/analytics-core';\nimport { getDefaultConfig } from './config/local-config';\nimport { SessionReplay } from './session-replay';\nimport { AmplitudeSessionReplay } from './typings/session-replay';\n\nexport const getLogConfig = (sessionReplay: SessionReplay) => (): LogConfig => {\n const { config } = sessionReplay;\n const { loggerProvider: logger, logLevel } = config || getDefaultConfig();\n return {\n logger,\n logLevel,\n };\n};\n\nconst createInstance: () => AmplitudeSessionReplay = () => {\n const sessionReplay = new SessionReplay();\n return {\n init: debugWrapper(sessionReplay.init.bind(sessionReplay), 'init', getLogConfig(sessionReplay)),\n evaluateTargetingAndCapture: debugWrapper(\n sessionReplay.evaluateTargetingAndCapture.bind(sessionReplay),\n 'evaluateTargetingAndRecord',\n getLogConfig(sessionReplay),\n ),\n setSessionId: debugWrapper(\n sessionReplay.setSessionId.bind(sessionReplay),\n 'setSessionId',\n getLogConfig(sessionReplay),\n ),\n getSessionId: debugWrapper(\n sessionReplay.getSessionId.bind(sessionReplay),\n 'getSessionId',\n getLogConfig(sessionReplay),\n ),\n getSessionReplayProperties: debugWrapper(\n sessionReplay.getSessionReplayProperties.bind(sessionReplay),\n 'getSessionReplayProperties',\n getLogConfig(sessionReplay),\n ),\n flush: debugWrapper(sessionReplay.flush.bind(sessionReplay), 'flush', getLogConfig(sessionReplay)),\n shutdown: debugWrapper(sessionReplay.shutdown.bind(sessionReplay), 'shutdown', getLogConfig(sessionReplay)),\n };\n};\n\nexport default createInstance();\n","import sessionReplay from './session-replay-factory';\nexport const {\n init,\n setSessionId,\n getSessionId,\n getSessionReplayProperties,\n flush,\n shutdown,\n evaluateTargetingAndCapture,\n} = sessionReplay;\nexport { SessionReplayOptions, StoreType } from './typings/session-replay';\nexport { SafeLoggerProvider } from './logger';\nexport { AmplitudeSessionReplay } from './typings/session-replay';\n"],"names":["IdentifyOperation","SpecialEventType","Status","STORAGE_PREFIX","concat","DEFAULT_INSTANCE_NAME","AMPLITUDE_SERVER_URL","LogLevel","getGlobalScope","ampIntegrationContextName","globalThis","window","self","global","returnWrapper","awaitable","promise","Promise","resolve","PREFIX","Logger","this","logLevel","None","prototype","disable","enable","Warn","log","args","_i","arguments","length","Verbose","console","join","warn","error","Error","debug","Debug","getDefaultConfig","flushMaxRetries","flushQueueSize","flushIntervalMillis","instanceName","loggerProvider","offline","optOut","serverUrl","serverZone","useBatch","Config","options","_a","_b","_c","_d","_optOut","defaultConfig","apiKey","minIdLength","plan","ingestionMetadata","undefined","storageProvider","transportProvider","serverConfig","createServerConfig","Object","defineProperty","get","set","enumerable","configurable","getServerUrl","_serverZone","includes","ApplicationContextProviderImpl","getApplicationContext","versionName","language","getLanguage","platform","os","deviceModel","navigator","languages","EventBridgeImpl","queue","logEvent","event","receiver","push","setEventReceiver","forEach","__assign","assign","t","s","i","n","p","hasOwnProperty","call","apply","__values","o","Symbol","iterator","m","next","value","done","TypeError","__read","r","e","ar","SuppressedError","isEqual","obj1","obj2","e_1","typeA","primitive_1","primitive_1_1","e_1_1","return","isArrayA","Array","isArray","isArrayB","sorted1","keys","sort","sorted2","result_1","key","entries","obj","ownProps","resArray","ServerZone","IdentityStoreImpl","identity","userProperties","listeners","Set","editIdentity","actingUserProperties","actingIdentity","setUserId","userId","setDeviceId","deviceId","setUserProperties","setOptOut","updateUserProperties","actions","e_2","e_3","actingProperties","_e","_f","action","properties","_g","_h","_j","e_2_1","_k","_l","e_3_1","commit","setIdentity","getIdentity","originalIdentity","listener","addIdentityListener","add","removeIdentityListener","delete","safeGlobal","AnalyticsConnector","identityStore","eventBridge","applicationContextProvider","getInstance","debugWrapper","fn","fnName","getLogConfig","getStates","fnContext","logger","ignoreDepth","debugContext","type","name","stacktrace","stack","split","slice","map","text","trim","time","start","Date","toISOString","states","before","result","then","after","end","JSON","stringify","generateHashCode","str","hash","charCodeAt","BaseTransport","send","_serverUrl","_payload","buildResponse","responseJSON","_m","_o","_p","_q","_r","_s","_t","_u","_v","_w","_x","statusCode","code","status","buildStatus","Success","body","eventsIngested","events_ingested","payloadSizeBytes","payload_size_bytes","serverUploadTime","server_upload_time","Invalid","missingField","missing_field","eventsWithInvalidFields","events_with_invalid_fields","eventsWithMissingFields","events_with_missing_fields","eventsWithInvalidIdLengths","events_with_invalid_id_lengths","epsThreshold","eps_threshold","exceededDailyQuotaDevices","exceeded_daily_quota_devices","silencedDevices","silenced_devices","silencedEvents","silenced_events","throttledDevices","throttled_devices","throttledEvents","throttled_events","PayloadTooLarge","RateLimit","throttledUsers","throttled_users","exceededDailyQuotaUsers","exceeded_daily_quota_users","Timeout","Failed","Unknown","FetchTransport","_super","__extends","payload","__awaiter","response","responseText","__generator","label","fetch","headers","Accept","method","sent","parse","DEFAULT_EVENT_PROPERTY_PREFIX","DEFAULT_SESSION_REPLAY_PROPERTY","DEFAULT_SERVER_ZONE","US","DEFAULT_PERFORMANCE_CONFIG","enabled","SESSION_REPLAY_DEBUG_PROPERTY","MASK_TEXT_CLASS","CustomRRwebEvent","SafeLoggerProvider","constructor","getSafeMethod","__rrweb_original__","bind","DEFAULT_MASK_LEVEL","isMaskedForLevel","elementType","level","element","inputType","hasAttribute","toLowerCase","getInputType","autocomplete","startsWith","maskFn","config","defaultMaskLevel","closest","shouldMask","maskSelector","some","selector","shouldUnmask","unmaskSelector","isMasked","replace","trackServerUrl","STAGING","EU","globToRegex","glob","escaped","RegExp","getPageUrl","pageUrl","ugcFilterRules","rule","regex","test","replacement","getStorageSize","globalScope","usage","quota","usageDetails","storage","estimate","totalStorageSize","Math","round","percentOfQuota","Number","EPSILON","getDebugConfig","debugConfig","substring","SessionReplayLocalConfig","super","sampleRate","configServerUrl","shouldInlineStylesheet","version","performanceConfig","storeType","applyBackgroundColorToBlockedElements","enableUrlChangePolling","urlChangePollingInterval","captureDocumentTitle","privacyConfig","interactionConfig","every","isValidGlobUrl","globUrl","validateUGCFilterRules","debugMode","experimental","omitElementTags","EventType","EventType2","MouseInteractions","MouseInteractions2","TIMEOUT_MESSAGE","UNEXPECTED_ERROR_MESSAGE","RemoteConfigFetch","localConfig","configKeys","_this","retryTimeout","attempts","sessionTargetingMatch","metrics","getRemoteNamespaceConfig","configNamespace","sessionId","fetchStartTime","configAPIResponse","remoteConfig","now","fetchWithTimeout","configs","fetchTimeAPISuccess","fetchTimeAPIFail","getRemoteConfig","namespaceConfig","controller","timeoutId","AbortController","setTimeout","abort","fetchRemoteConfig","signal","clearTimeout","urlParams","configKey","res","knownError","lastFetchedSessionId","completeRequest","err","aborted","trys","URLSearchParams","api_key","append","String","toString","parseAndStoreConfig","retryFetch","message","json","success","createRemoteConfigFetch","SessionReplayJoinedConfigGenerator","remoteConfigFetch","generateJoinedConfig","captureEnabled","samplingConfig","sr_sampling_config","sr_privacy_config","targetingConfig","sr_targeting_config","sr_interaction_config","loggingConfig","sr_logging_config","joinedConfig","remotePrivacyConfig","capture_enabled","sample_rate","localPrivacyConfig","joinedPrivacyConfig","blockSelector","privacyConfigSelectorMap","selectorMap","selectorType","fragment","document","createDocumentFragment","dropInvalidSelectors","selectors","filter","querySelector","removeInvalidSelectorsFromPrivacyConfig","u8","Uint8Array","u16","Uint16Array","u32","Uint32Array","fleb","fdeb","clim","freb","eb","b","j","fl","revfl","revfd","rev","x","hMap","cd","mb","l","co","le","rvb","sv","r_1","v","flt","fdt","flm","fdm","shft","slc","subarray","wbits","d","wbits16","hTree","f","t2","a","i0","i1","i2","maxSym","tr","mbt","ln","dt","lft","cst","i2_1","i2_2","i2_3","max","lc","c","cl","cli","cln","cls","w","clen","cf","wfblk","out","pos","dat","wblk","final","syms","lf","df","li","bs","bl","_a2","dlt","mlb","_b2","ddt","mdb","lclt","nlc","lcdt","ndc","lcfreq","lct","mlcb","nlcc","lm","ll","dm","dl","flen","ftlen","dtlen","llm","lcts","it","clct","len","dst","deo","dopt","opt","pre","post","st","lvl","plvl","lst","floor","msk_1","prev","head","bs1_1","ceil","bs2_1","hsh","lc_1","wi","hv","imod","pimod","rem","ch_1","dif","maxn","min","maxd","ml","nl","mmd","md","ti","lin","din","dflt","mem","zlibSync","data","opts","adler","lv","fl2","wbytes","pack","latin1","TextDecoder","decode","fromCharCode","strFromU8","TextEncoder","encode","ai","strToU8","EventCompressor","eventsManager","workerScript","taskQueue","isProcessing","compressEvent","packedEvent","addCompressedEventToManager","compressedEvent","addEvent","addCompressedEvent","worker","postMessage","terminate","canUseIdleCallback","timeout","Worker","URL","createObjectURL","Blob","onerror","onmessage","scheduleIdleProcessing","requestIdleCallback","idleDeadline","processQueue","enqueueEvent","timeRemaining","didTimeout","task","shift","STORAGE_FAILURE","VERSION","SessionReplayTrackDestination","payloadBatcher","storageKey","scheduled","sendEventsList","destinationData","addToQueue","list","context","schedule","flush","useRetry","later","all","url","location","href","getCurrentUrl","device_id","session_id","sessionReplayLibrary","events","Authorization","handleReponse","responseBody","handleSuccessResponse","handleOtherResponse","sizeOfEventsList","size","onComplete","BaseEventsStore","timeAtLastSplit","_timeAtLastSplit","minInterval","maxInterval","maxPersistedEventsSize","interval","shouldSplitEventsList","nextEventString","sizeOfNextEvent","getStringSize","getEventsArraySize","totalSize","RecordingStatus","currentSequenceKey","sequencesToSendKey","batchPromiseAll","promiseBatch","chunkSize","batch","splice","defineObjectStores","db","sequencesStore","currentSequenceStore","objectStoreNames","contains","createObjectStore","keyPath","autoIncrement","createIndex","SessionReplayEventsIDBStore","getSequencesToSend","sequences","cursor","transaction","store","openCursor","sequenceId","continue","storeCurrentSequence","currentSequenceData","put","addEventToCurrentSequence","tx","sequenceEvents","eventsToSend","updatedEvents","storeSendingEvents","cleanUpSessionEventsStore","_sessionId","transitionFromKeyValStore","keyValDb","reject","indexedDB","request","open","onupgradeneeded","close","deleteDatabase","onsuccess","keyValDatabaseExists","transitionCurrentSessionSequences","numericSessionId","sessionStore","currentSessionSequences","sessionSequences","promisesToBatch","numericSequenceId","parseInt","sequence","currentSequenceId","eventAddPromises","SENT","getAllRequest","objectStore","getAll","transitionPromise","storedReplaySessionContextList","target","storedReplaySessionContexts","storedSessionId","oldSessionStore","oldSessionSequences","dbSuffix","dbName","openDB","upgrade","createStore","eventsIDBStore","getCurrentSequenceEvents","allEvents","InMemoryEventsStore","finalizedSequences","resetCurrentSequence","addSequence","sequenceReturn","createEventsManager","trackDestination","getMemoryStore","new","catch","sendCurrentSequenceEvents","currentSequence","sequenceToSend","sendStoredEvents","sequencesToSend","MultiEventManager","managers","managersMap","Map","manager","promises","testableAccessors","Node","ShadowRoot","Element","MutationObserver","testableMethods","untaintedBasePrototype","getUntaintedPrototype","candidate","angularUnpatchedVersionSymbol","Zone","__symbol__","angularZoneUnpatchedAlternative","defaultPrototype","accessorNames","isUntaintedAccessors","Boolean","accessor","getOwnPropertyDescriptor","methodNames","isUntaintedMethods","iframeEl","createElement","appendChild","win","contentWindow","untaintedObject","removeChild","untaintedAccessorCache","getUntaintedAccessor","instance","cacheKey","untaintedPrototype","untaintedAccessor","untaintedMethodCache","getUntaintedMethod","untaintedMethod","index","childNodes","parentNode","parentElement","textContent","other","getRootNode","host","styleSheets","shadowRoot","querySelectorAll","mutationObserver","getWindowHeight","innerHeight","documentElement","clientHeight","getWindowWidth","innerWidth","clientWidth","rootDocument","finder","input","nodeType","ELEMENT_NODE","tagName","defaults","root","idName","_name","className","attr","_value","seedMinLength","optimizedMinLength","threshold","maxNumberOfTries","timeoutMs","rootNode","DOCUMENT_NODE","ownerDocument","findRootDocument","path","bottomUpSearch","optimized","optimize","limit","fallback","current","elapsedTime","getTime","maybe","id","classNames","penalty","nth","dispensableNth","node","nthChild","findUniquePath","paths","combinations","unique","query","reduce","acc","css","elementId","getAttribute","CSS","escape","attrs","from","attributes","classList","parent","child","firstChild","nextSibling","notEmpty","scope","counter","visited","newPath","newPathKey","has","same","clickNonBatcher","clickEvents","evt","record","count","clickBatcher","reduced","curr","y","timestamp","hour","k","values","clickHook","deviceIdFn","mirror","Click","getNode","left","scrollX","top","scrollY","doc","scrollingElement","scrollLeft","pageXOffset","dom","scrollTop","pageYOffset","getWindowScroll","viewportHeight","viewportWidth","BeaconTransport","sendBeacon","sendXhr","xhr","XMLHttpRequest","setRequestHeader","basePageUrl","ScrollWatcher","transport","hook","update","_","maxScrollX","_maxScrollX","maxScrollY","_maxScrollY","maxScrollWidth","_maxScrollWidth","maxScrollHeight","_maxScrollHeight","width","height","SessionIdentifiers","sessionReplayId","generateSessionReplayId","targetingIDBStore","dbs","openOrCreateDB","getTargetingMatchForSession","sessionIdStr","targetingMatchForSession","targetingMatch","storeTargetingMatchForSession","lastUpdated","clearStoreOfOldSessions","currentSessionId","currentSessionIdStr","allTargetingMatchObjs","targetingMatchObj","amountOfTimeSinceSession","createUrlTrackingPlugin","observer","cb","pluginOptions","enablePolling","pollingInterval","lastTrackedUrl","emitUrlChange","currentUrl","currentTitle","title","createUrlChangeEvent","createHistoryMethodPatch","originalMethod","hashChangeHandler","urlChangeInterval","setInterval","clearInterval","history","originalPushState","pushState","originalReplaceState","replaceState","setupHistoryPatching","addEventListener","removeEventListener","SessionReplay","recordCancelCallback","eventCount","pageLeaveFns","recordFunction","teardownEventListeners","teardown","blurListener","focusListener","pageLeaveListener","sendEvents","recordEvents","evaluateTargetingAndCapture","targetingParams","isInit","identifiers","lastTargetingParams","eventForTargeting","event_type","evaluateTargeting","evaluateTargetingPackage","import","targetingResult","flag","evaluateTargetingAndStore","initialize","addCustomRRWebEvent","eventName","eventData","addStorageInfo","debugInfo","METADATA","storageSizeData","addCustomEvent","stopRecordingEvents","networkObservers","stop","typedError","init","_init","joinedConfigGenerator","createSessionReplayJoinedConfigGenerator","setMetadata","scrollWatcher","default","getDeviceId","scrollHook","rrwebEventManager","interactionEventManager","trackEveryNms","eventCompressor","useWebWorker","compressionScript","initializeNetworkObservers","setSessionId","asyncSetSessionId","lastShouldRecordDecision","previousSessionId","deviceIdForReplayId","getSessionReplayProperties","shouldRecord","getShouldRecord","eventProperties","appHash","GET_SR_PROPS","sessionIdToSend","shouldSendStoredEvents","shouldOptOut","identityStoreOptOut","matched","hashNumber","abs","TARGETING_DECISION","getBlockSelectors","getMaskTextSelectors","getRecordingPlugins","plugins","urlTrackingPlugin","getRecordConsolePlugin","levels","getRecordFunction","shouldLogMetadata","FETCH_REQUEST","hooks","mouseInteraction","scroll","emit","RRWebEventType","Meta","inlineStylesheet","maskAllInputs","maskTextClass","blockClass","maskInputFn","maskTextFn","maskTextSelector","recordCanvas","slimDOMOptions","script","comment","errorHandler","_external_","DEBUG_INFO","metadata","getSessionId","shutdown","mapSDKType","sdkType","replaySDKVersion","standaloneSDKVersion","hashValue","replaySDKType","standaloneSDKType","network","NetworkObservers","NetworkObserversClass","sessionReplay","createInstance"],"mappings":"0EAAO,IAAIA,EAqBAC,GApBX,SAAWD,GAEPA,EAAuB,IAAI,OAC3BA,EAA4B,SAAI,WAEhCA,EAAuB,IAAI,OAC3BA,EAA0B,OAAI,UAC9BA,EAA2B,QAAI,WAC/BA,EAA0B,OAAI,UAE9BA,EAA6B,UAAI,aACjCA,EAA8B,WAAI,cAElCA,EAAyB,MAAI,SAC7BA,EAA6B,UAAI,WACpC,CAfD,CAeGA,IAAsBA,EAAoB,CAAE,IAM/C,SAAWC,GACPA,EAA2B,SAAI,YAC/BA,EAAiC,eAAI,iBACrCA,EAA0B,QAAI,gBACjC,CAJD,CAIGA,IAAqBA,EAAmB,CAAA,ICzBpC,ICAIC,EDCAC,EAAiB,GAAGC,OADD,MAC0B,WAC7CC,EAAwB,oBACxBC,EAAuB,wCCFlC,SAAWJ,GAEPA,EAAgB,QAAI,UAEpBA,EAAgB,QAAI,UAEpBA,EAAgB,QAAI,UAEpBA,EAAkB,UAAI,aAEtBA,EAAwB,gBAAI,oBAE5BA,EAAgB,QAAI,UAEpBA,EAAe,OAAI,SAEnBA,EAAgB,QAAI,UAEpBA,EAAoB,YAAI,aAC3B,CAnBD,CAmBGA,IAAWA,EAAS,CAAA,ICnBb,ICFCK,EDEAC,EAAiB,WAGxB,IAAIC,EAA4B,wBAChC,MAA0B,oBAAfC,iBAA+E,IAA1CA,WAAWD,GAChDC,WAAWD,GAEI,oBAAfC,WACAA,WAEW,oBAAXC,OACAA,OAES,oBAATC,KACAA,KAEW,oBAAXC,OACAA,YADX,CAIJ,EEtBWC,EAAgB,SAAUC,GAAa,MAAQ,CACtDC,QAASD,GAAaE,QAAQC,UAC7B,GDDL,SAAWX,GACPA,EAASA,EAAe,KAAI,GAAK,OACjCA,EAASA,EAAgB,MAAI,GAAK,QAClCA,EAASA,EAAe,KAAI,GAAK,OACjCA,EAASA,EAAkB,QAAI,GAAK,UACpCA,EAASA,EAAgB,MAAI,GAAK,OACrC,CAND,CAMGA,IAAaA,EAAW,CAAA,IEN3B,IAAIY,EAAS,oBACTC,EAAwB,WACxB,SAASA,IACLC,KAAKC,SAAWf,EAASgB,IAC5B,CAiDD,OAhDAH,EAAOI,UAAUC,QAAU,WACvBJ,KAAKC,SAAWf,EAASgB,IACjC,EACIH,EAAOI,UAAUE,OAAS,SAAUJ,QACf,IAAbA,IAAuBA,EAAWf,EAASoB,MAC/CN,KAAKC,SAAWA,CACxB,EACIF,EAAOI,UAAUI,IAAM,WAEnB,IADA,IAAIC,EAAO,GACFC,EAAK,EAAGA,EAAKC,UAAUC,OAAQF,IACpCD,EAAKC,GAAMC,UAAUD,GAErBT,KAAKC,SAAWf,EAAS0B,SAG7BC,QAAQN,IAAI,GAAGxB,OAAOe,EAAQ,WAAWf,OAAOyB,EAAKM,KAAK,MAClE,EACIf,EAAOI,UAAUY,KAAO,WAEpB,IADA,IAAIP,EAAO,GACFC,EAAK,EAAGA,EAAKC,UAAUC,OAAQF,IACpCD,EAAKC,GAAMC,UAAUD,GAErBT,KAAKC,SAAWf,EAASoB,MAG7BO,QAAQE,KAAK,GAAGhC,OAAOe,EAAQ,YAAYf,OAAOyB,EAAKM,KAAK,MACpE,EACIf,EAAOI,UAAUa,MAAQ,WAErB,IADA,IAAIR,EAAO,GACFC,EAAK,EAAGA,EAAKC,UAAUC,OAAQF,IACpCD,EAAKC,GAAMC,UAAUD,GAErBT,KAAKC,SAAWf,EAAS+B,OAG7BJ,QAAQG,MAAM,GAAGjC,OAAOe,EAAQ,aAAaf,OAAOyB,EAAKM,KAAK,MACtE,EACIf,EAAOI,UAAUe,MAAQ,WAErB,IADA,IAAIV,EAAO,GACFC,EAAK,EAAGA,EAAKC,UAAUC,OAAQF,IACpCD,EAAKC,GAAMC,UAAUD,GAErBT,KAAKC,SAAWf,EAASiC,OAI7BN,QAAQN,IAAI,GAAGxB,OAAOe,EAAQ,aAAaf,OAAOyB,EAAKM,KAAK,MACpE,EACWf,CACX,ICpDWqB,EAAmB,WAAc,MAAQ,CAChDC,gBAAiB,GACjBC,eAAgB,IAChBC,oBAAqB,IACrBC,aAAcxC,EACdiB,SAAUf,EAASoB,KACnBmB,eAAgB,IAAI1B,EACpB2B,SAAS,EACTC,QAAQ,EACRC,UAAW3C,EACX4C,WAAY,KACZC,UAAU,IAEVC,EAAwB,WACxB,SAASA,EAAOC,GACZ,IAAIC,EAAIC,EAAIC,EAAIC,EAChBpC,KAAKqC,SAAU,EACf,IAAIC,EAAgBlB,IACpBpB,KAAKuC,OAASP,EAAQO,OACtBvC,KAAKuB,oBAA6D,QAAtCU,EAAKD,EAAQT,2BAAwC,IAAPU,EAAgBA,EAAKK,EAAcf,oBAC7GvB,KAAKqB,gBAAkBW,EAAQX,iBAAmBiB,EAAcjB,gBAChErB,KAAKsB,eAAiBU,EAAQV,gBAAkBgB,EAAchB,eAC9DtB,KAAKwB,aAAeQ,EAAQR,cAAgBc,EAAcd,aAC1DxB,KAAKyB,eAAiBO,EAAQP,gBAAkBa,EAAcb,eAC9DzB,KAAKC,SAAuC,QAA3BiC,EAAKF,EAAQ/B,gBAA6B,IAAPiC,EAAgBA,EAAKI,EAAcrC,SACvFD,KAAKwC,YAAcR,EAAQQ,YAC3BxC,KAAKyC,KAAOT,EAAQS,KACpBzC,KAAK0C,kBAAoBV,EAAQU,kBACjC1C,KAAK0B,aAA8BiB,IAApBX,EAAQN,QAAwBM,EAAQN,QAAUY,EAAcZ,QAC/E1B,KAAK2B,OAAmC,QAAzBQ,EAAKH,EAAQL,cAA2B,IAAPQ,EAAgBA,EAAKG,EAAcX,OACnF3B,KAAK4B,UAAYI,EAAQJ,UACzB5B,KAAK6B,WAAaG,EAAQH,YAAcS,EAAcT,WACtD7B,KAAK4C,gBAAkBZ,EAAQY,gBAC/B5C,KAAK6C,kBAAoBb,EAAQa,kBACjC7C,KAAK8B,SAAuC,QAA3BM,EAAKJ,EAAQF,gBAA6B,IAAPM,EAAgBA,EAAKE,EAAcR,SACvF9B,KAAKyB,eAAepB,OAAOL,KAAKC,UAChC,IAAI6C,EAAeC,EAAmBf,EAAQJ,UAAWI,EAAQH,WAAYG,EAAQF,UACrF9B,KAAK6B,WAAaiB,EAAajB,WAC/B7B,KAAK4B,UAAYkB,EAAalB,SACjC,CAWD,OAVAoB,OAAOC,eAAelB,EAAO5B,UAAW,SAAU,CAC9C+C,IAAK,WACD,OAAOlD,KAAKqC,OACf,EACDc,IAAK,SAAUxB,GACX3B,KAAKqC,QAAUV,CAClB,EACDyB,YAAY,EACZC,cAAc,IAEXtB,CACX,IAEWuB,EAAe,SAAUzB,EAAYC,GAC5C,MAAmB,OAAfD,EACOC,ENnD4B,qCAFN,yCMuD1BA,ENtD6B,mCMsDW7C,CACnD,EACW8D,EAAqB,SAAUnB,EAAWC,EAAYC,GAI7D,QAHkB,IAAdF,IAAwBA,EAAY,SACrB,IAAfC,IAAyBA,EAAaT,IAAmBS,iBAC5C,IAAbC,IAAuBA,EAAWV,IAAmBU,UACrDF,EACA,MAAO,CAAEA,UAAWA,EAAWC,gBAAYc,GAE/C,IAAIY,EAAc,CAAC,KAAM,MAAMC,SAAS3B,GAAcA,EAAaT,IAAmBS,WACtF,MAAO,CACHA,WAAY0B,EACZ3B,UAAW0B,EAAaC,EAAazB,GAE7C,EC1EI2B,EAAgD,WAChD,SAASA,IACR,CAUD,OATAA,EAA+BtD,UAAUuD,sBAAwB,WAC7D,MAAO,CACHC,YAAa3D,KAAK2D,YAClBC,SAAUC,IACVC,SAAU,MACVC,QAAIpB,EACJqB,iBAAarB,EAEzB,EACWc,CACX,IACII,EAAc,WACd,MAA8B,oBAAdI,YACVA,UAAUC,WAAaD,UAAUC,UAAU,IACzCD,UAAUL,WACd,EACR,EAEIO,EAAiC,WACjC,SAASA,IACLnE,KAAKoE,MAAQ,EAChB,CAoBD,OAnBAD,EAAgBhE,UAAUkE,SAAW,SAAUC,GACtCtE,KAAKuE,SAMNvE,KAAKuE,SAASD,GALVtE,KAAKoE,MAAMzD,OAAS,KACpBX,KAAKoE,MAAMI,KAAKF,EAMhC,EACIH,EAAgBhE,UAAUsE,iBAAmB,SAAUF,GACnDvE,KAAKuE,SAAWA,EACZvE,KAAKoE,MAAMzD,OAAS,IACpBX,KAAKoE,MAAMM,SAAQ,SAAUJ,GACzBC,EAASD,EACzB,IACYtE,KAAKoE,MAAQ,GAEzB,EACWD,CACX,IAgBIQ,EAAW,WAQb,OAPAA,EAAW3B,OAAO4B,QAAU,SAAkBC,GAC5C,IAAK,IAAIC,EAAGC,EAAI,EAAGC,EAAItE,UAAUC,OAAQoE,EAAIC,EAAGD,IAE9C,IAAK,IAAIE,KADTH,EAAIpE,UAAUqE,GACO/B,OAAO7C,UAAU+E,eAAeC,KAAKL,EAAGG,KAAIJ,EAAEI,GAAKH,EAAEG,IAE5E,OAAOJ,CACX,EACSF,EAASS,MAAMpF,KAAMU,UAC9B,EACA,SAAS2E,EAASC,GAChB,IAAIR,EAAsB,mBAAXS,QAAyBA,OAAOC,SAC7CC,EAAIX,GAAKQ,EAAER,GACXC,EAAI,EACN,GAAIU,EAAG,OAAOA,EAAEN,KAAKG,GACrB,GAAIA,GAAyB,iBAAbA,EAAE3E,OAAqB,MAAO,CAC5C+E,KAAM,WAEJ,OADIJ,GAAKP,GAAKO,EAAE3E,SAAQ2E,OAAI,GACrB,CACLK,MAAOL,GAAKA,EAAEP,KACda,MAAON,EAEV,GAEH,MAAM,IAAIO,UAAUf,EAAI,0BAA4B,kCACtD,CACA,SAASgB,EAAOR,EAAGN,GACjB,IAAIS,EAAsB,mBAAXF,QAAyBD,EAAEC,OAAOC,UACjD,IAAKC,EAAG,OAAOH,EACf,IACES,EAEAC,EAHEjB,EAAIU,EAAEN,KAAKG,GAEbW,EAAK,GAEP,IACE,WAAc,IAANjB,GAAgBA,KAAM,MAAQe,EAAIhB,EAAEW,QAAQE,MAAMK,EAAGzB,KAAKuB,EAAEJ,MACrE,CAAC,MAAO3E,GACPgF,EAAI,CACFhF,MAAOA,EAEb,CAAY,QACR,IACM+E,IAAMA,EAAEH,OAASH,EAAIV,EAAU,SAAIU,EAAEN,KAAKJ,EACpD,CAAc,QACR,GAAIiB,EAAG,MAAMA,EAAEhF,KAChB,CACF,CACD,OAAOiF,CACT,CAC2B,mBAApBC,iBAAiCA,gBAMxC,IAAIC,EAAU,SAAUC,EAAMC,GAC1B,IAAIC,EAAKrE,EAELsE,SAAeH,EAEnB,GAAIG,WADeF,EAEf,OAAO,EAEX,IACI,IAAK,IAAIG,EAAcnB,EAPX,CAAC,SAAU,SAAU,UAAW,cAOAoB,EAAgBD,EAAYd,QAASe,EAAcb,KAAMa,EAAgBD,EAAYd,OAAQ,CAErI,GADQe,EAAcd,QACZY,EACN,OAAOH,IAASC,CAEvB,CACJ,CACD,MAAOK,GAASJ,EAAM,CAAEtF,MAAO0F,EAAU,CACjC,QACJ,IACQD,IAAkBA,EAAcb,OAAS3D,EAAKuE,EAAYG,SAAS1E,EAAGkD,KAAKqB,EAClF,CACO,QAAE,GAAIF,EAAK,MAAMA,EAAItF,KAAQ,CACxC,CAED,GAAY,MAARoF,GAAwB,MAARC,EAChB,OAAO,EAEN,GAAY,MAARD,GAAwB,MAARC,EACrB,OAAO,EAGX,GAAID,EAAKzF,SAAW0F,EAAK1F,OACrB,OAAO,EAGX,IAAIiG,EAAWC,MAAMC,QAAQV,GACzBW,EAAWF,MAAMC,QAAQT,GAC7B,GAAIO,IAAaG,EACb,OAAO,EAEX,IAAIH,IAAYG,EAQX,CAED,IAAIC,EAAUhE,OAAOiE,KAAKb,GAAMc,OAC5BC,EAAUnE,OAAOiE,KAAKZ,GAAMa,OAChC,IAAKf,EAAQa,EAASG,GAClB,OAAO,EAGX,IAAIC,GAAW,EAMf,OALApE,OAAOiE,KAAKb,GAAM1B,SAAQ,SAAU2C,GAC3BlB,EAAQC,EAAKiB,GAAMhB,EAAKgB,MACzBD,GAAW,EAE3B,IACeA,CACV,CArBG,IAAK,IAAIrC,EAAI,EAAGA,EAAIqB,EAAKzF,OAAQoE,IAC7B,IAAKoB,EAAQC,EAAKrB,GAAIsB,EAAKtB,IACvB,OAAO,EAoBnB,OAAO,CACX,EAMK/B,OAAOsE,UACRtE,OAAOsE,QAAU,SAAUC,GAIvB,IAHA,IAAIC,EAAWxE,OAAOiE,KAAKM,GACvBxC,EAAIyC,EAAS7G,OACb8G,EAAW,IAAIZ,MAAM9B,GAClBA,KACH0C,EAAS1C,GAAK,CAACyC,EAASzC,GAAIwC,EAAIC,EAASzC,KAE7C,OAAO0C,CACf,GAEA,IClMWC,EDkMPC,EAAmC,WACnC,SAASA,IACL3H,KAAK4H,SAAW,CAAEC,eAAgB,CAAE,GACpC7H,KAAK8H,UAAY,IAAIC,GACxB,CAoGD,OAnGAJ,EAAkBxH,UAAU6H,aAAe,WAEvC,IAAIzI,EAAOS,KACPiI,EAAuBtD,EAAS,CAAA,EAAI3E,KAAK4H,SAASC,gBAClDK,EAAiBvD,EAASA,EAAS,GAAI3E,KAAK4H,UAAW,CAAEC,eAAgBI,IAC7E,MAAO,CACHE,UAAW,SAAUC,GAEjB,OADAF,EAAeE,OAASA,EACjBpI,IACV,EACDqI,YAAa,SAAUC,GAEnB,OADAJ,EAAeI,SAAWA,EACnBtI,IACV,EACDuI,kBAAmB,SAAUV,GAEzB,OADAK,EAAeL,eAAiBA,EACzB7H,IACV,EACDwI,UAAW,SAAU7G,GAEjB,OADAuG,EAAevG,OAASA,EACjB3B,IACV,EACDyI,qBAAsB,SAAUC,GAC5B,IAAIpC,EAAKrE,EAAI0G,EAAKzG,EAAI0G,EAAKzG,EACvB0G,EAAmBX,EAAeL,gBAAkB,GACxD,IACI,IAAK,IAAIzF,EAAKiD,EAASrC,OAAOsE,QAAQoB,IAAWI,EAAK1G,EAAGsD,QAASoD,EAAGlD,KAAMkD,EAAK1G,EAAGsD,OAAQ,CACvF,IAAIqD,EAAKjD,EAAOgD,EAAGnD,MAAO,GAAIqD,EAASD,EAAG,GAAIE,EAAaF,EAAG,GAC9D,OAAQC,GACJ,IAjDZ,OAkDgB,IACI,IAAK,IAAIE,GAAMP,OAAM,EAAQtD,EAASrC,OAAOsE,QAAQ2B,KAAeE,EAAKD,EAAGxD,QAASyD,EAAGvD,KAAMuD,EAAKD,EAAGxD,OAAQ,CAC1G,IAAI0D,EAAKtD,EAAOqD,EAAGxD,MAAO,GAAI0B,EAAM+B,EAAG,GAAIzD,EAAQyD,EAAG,GACtDP,EAAiBxB,GAAO1B,CAC3B,CACJ,CACD,MAAO0D,GAASV,EAAM,CAAE3H,MAAOqI,EAAU,CACjC,QACJ,IACQF,IAAOA,EAAGvD,OAAS1D,EAAKgH,EAAGvC,SAASzE,EAAGiD,KAAK+D,EACnD,CACO,QAAE,GAAIP,EAAK,MAAMA,EAAI3H,KAAQ,CACxC,CACD,MACJ,IA/DV,SAgEc,IACI,IAAK,IAAIsI,GAAMV,OAAM,EAAQvD,EAASrC,OAAOiE,KAAKgC,KAAeM,EAAKD,EAAG5D,QAAS6D,EAAG3D,KAAM2D,EAAKD,EAAG5D,OAAQ,QAEhGmD,EADHxB,EAAMkC,EAAG5D,MAEhB,CACJ,CACD,MAAO6D,GAASZ,EAAM,CAAE5H,MAAOwI,EAAU,CACjC,QACJ,IACQD,IAAOA,EAAG3D,OAASzD,EAAKmH,EAAG3C,SAASxE,EAAGgD,KAAKmE,EACnD,CACO,QAAE,GAAIV,EAAK,MAAMA,EAAI5H,KAAQ,CACxC,CACD,MACJ,IA7EN,YA8EU6H,EAAmB,CAAA,EAG9B,CACJ,CACD,MAAOnC,GAASJ,EAAM,CAAEtF,MAAO0F,EAAU,CACjC,QACJ,IACQoC,IAAOA,EAAGlD,OAAS3D,EAAKG,EAAGuE,SAAS1E,EAAGkD,KAAK/C,EACnD,CACO,QAAE,GAAIkE,EAAK,MAAMA,EAAItF,KAAQ,CACxC,CAED,OADAkH,EAAeL,eAAiBgB,EACzB7I,IACV,EACDyJ,OAAQ,WAEJ,OADAlK,EAAKmK,YAAYxB,GACVlI,IACV,EAEb,EACI2H,EAAkBxH,UAAUwJ,YAAc,WACtC,OAAOhF,EAAS,CAAA,EAAI3E,KAAK4H,SACjC,EACID,EAAkBxH,UAAUuJ,YAAc,SAAU9B,GAChD,IAAIgC,EAAmBjF,EAAS,CAAE,EAAE3E,KAAK4H,UACzC5H,KAAK4H,SAAWjD,EAAS,CAAE,EAAEiD,GACxBzB,EAAQyD,EAAkB5J,KAAK4H,WAChC5H,KAAK8H,UAAUpD,SAAQ,SAAUmF,GAC7BA,EAASjC,EACzB,GAEA,EACID,EAAkBxH,UAAU2J,oBAAsB,SAAUD,GACxD7J,KAAK8H,UAAUiC,IAAIF,EAC3B,EACIlC,EAAkBxH,UAAU6J,uBAAyB,SAAUH,GAC3D7J,KAAK8H,UAAUmC,OAAOJ,EAC9B,EACWlC,CACX,IAEIuC,EAAmC,oBAAf7K,WAClBA,WACkB,oBAAXG,OACHA,OACAD,KAEN4K,EAAoC,WACpC,SAASA,IACLnK,KAAKoK,cAAgB,IAAIzC,EACzB3H,KAAKqK,YAAc,IAAIlG,EACvBnE,KAAKsK,2BAA6B,IAAI7G,CACzC,CAWD,OAVA0G,EAAmBI,YAAc,SAAU/I,GAQvC,OAPK0I,EAAwC,8BACzCA,EAAwC,4BAAI,IAE3CA,EAAwC,4BAAE1I,KAC3C0I,EAAwC,4BAAE1I,GACtC,IAAI2I,GAELD,EAAwC,4BAAE1I,EACzD,EACW2I,CACX,IE1QWK,EAAe,SAAUC,EAAIC,EAAQC,EAAcC,EAAWC,GAErE,YADkB,IAAdA,IAAwBA,EAAY,MACjC,WAEH,IADA,IAAIrK,EAAO,GACFC,EAAK,EAAGA,EAAKC,UAAUC,OAAQF,IACpCD,EAAKC,GAAMC,UAAUD,GAEzB,IAAIwB,EAAK0I,IAAgBG,EAAS7I,EAAG6I,OAAQ7K,EAAWgC,EAAGhC,SAE3D,GAAKA,GAAYA,EAAWf,EAASiC,QAAWlB,IAAa6K,EACzD,OAAOL,EAAGrF,MAAMyF,EAAWrK,GAE/B,IAvE6BuK,EAuEzBC,EAAe,CACfC,KAAM,uBACNC,KAAMR,EACNlK,KAAMA,EACN2K,YA3EyBJ,EA2EC,OA1Ed,IAAhBA,IAA0BA,EAAc,KAChC,IAAI9J,OAAQmK,OAAS,IAE5BC,MAAM,MACNC,MAAM,EAAIP,GACVQ,KAAI,SAAUC,GAAQ,OAAOA,EAAKC,MAAO,KAsEtCC,KAAM,CACFC,OAAO,IAAIC,MAAOC,eAEtBC,OAAQ,CAAE,GAEVlB,GAAaI,EAAac,SAC1Bd,EAAac,OAAOC,OAASnB,KAEjC,IAAIoB,EAASvB,EAAGrF,MAAMyF,EAAWrK,GAsBjC,OArBIwL,GAAUA,EAAOrM,QAEjBqM,EAAOrM,QAAQsM,MAAK,WACZrB,GAAaI,EAAac,SAC1Bd,EAAac,OAAOI,MAAQtB,KAE5BI,EAAaU,OACbV,EAAaU,KAAKS,KAAM,IAAIP,MAAOC,eAEvCf,EAAO5J,MAAMkL,KAAKC,UAAUrB,EAAc,KAAM,GAChE,KAGgBJ,GAAaI,EAAac,SAC1Bd,EAAac,OAAOI,MAAQtB,KAE5BI,EAAaU,OACbV,EAAaU,KAAKS,KAAM,IAAIP,MAAOC,eAEvCf,EAAO5J,MAAMkL,KAAKC,UAAUrB,EAAc,KAAM,KAE7CgB,CACf,CACA,EC9GWM,EAAmB,SAAUC,GACpC,IAAIC,EAAO,EACX,GAAmB,IAAfD,EAAI5L,OACJ,OAAO6L,EACX,IAAK,IAAIzH,EAAI,EAAGA,EAAIwH,EAAI5L,OAAQoE,IAAK,CAEjCyH,GAAQA,GAAQ,GAAKA,EADXD,EAAIE,WAAW1H,GAEzByH,GAAQ,CACX,CACD,OAAOA,CACX,ECTIE,EAA+B,WAC/B,SAASA,IACR,CA2FD,OA1FAA,EAAcvM,UAAUwM,KAAO,SAAUC,EAAYC,GACjD,OAAOjN,QAAQC,QAAQ,KAC/B,EACI6M,EAAcvM,UAAU2M,cAAgB,SAAUC,GAC9C,IAAI9K,EAAIC,EAAIC,EAAIC,EAAI0G,EAAIC,EAAIG,EAAIC,EAAIC,EAAIE,EAAIC,EAAIyD,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EACxF,GAA4B,iBAAjBX,EACP,OAAO,KAEX,IAAIY,EAAaZ,EAAaa,MAAQ,EAClCC,EAAS7N,KAAK8N,YAAYH,GAC9B,OAAQE,GACJ,KAAKhP,EAAOkP,QACR,MAAO,CACHF,OAAQA,EACRF,WAAYA,EACZK,KAAM,CACFC,eAAwD,QAAvChM,EAAK8K,EAAamB,uBAAoC,IAAPjM,EAAgBA,EAAK,EACrFkM,iBAA6D,QAA1CjM,EAAK6K,EAAaqB,0BAAuC,IAAPlM,EAAgBA,EAAK,EAC1FmM,iBAA6D,QAA1ClM,EAAK4K,EAAauB,0BAAuC,IAAPnM,EAAgBA,EAAK,IAGtG,KAAKtD,EAAO0P,QACR,MAAO,CACHV,OAAQA,EACRF,WAAYA,EACZK,KAAM,CACFhN,MAAqC,QAA7BoB,EAAK2K,EAAa/L,aAA0B,IAAPoB,EAAgBA,EAAK,GAClEoM,aAAoD,QAArC1F,EAAKiE,EAAa0B,qBAAkC,IAAP3F,EAAgBA,EAAK,GACjF4F,wBAA4E,QAAlD3F,EAAKgE,EAAa4B,kCAA+C,IAAP5F,EAAgBA,EAAK,CAAE,EAC3G6F,wBAA4E,QAAlD1F,EAAK6D,EAAa8B,kCAA+C,IAAP3F,EAAgBA,EAAK,CAAE,EAC3G4F,2BAAmF,QAAtD3F,EAAK4D,EAAagC,sCAAmD,IAAP5F,EAAgBA,EAAK,CAAE,EAClH6F,aAAoD,QAArC5F,EAAK2D,EAAakC,qBAAkC,IAAP7F,EAAgBA,EAAK,EACjF8F,0BAAgF,QAApD5F,EAAKyD,EAAaoC,oCAAiD,IAAP7F,EAAgBA,EAAK,CAAE,EAC/G8F,gBAA0D,QAAxC7F,EAAKwD,EAAasC,wBAAqC,IAAP9F,EAAgBA,EAAK,GACvF+F,eAAwD,QAAvCtC,EAAKD,EAAawC,uBAAoC,IAAPvC,EAAgBA,EAAK,GACrFwC,iBAA4D,QAAzCvC,EAAKF,EAAa0C,yBAAsC,IAAPxC,EAAgBA,EAAK,CAAE,EAC3FyC,gBAA0D,QAAxCxC,EAAKH,EAAa4C,wBAAqC,IAAPzC,EAAgBA,EAAK,KAGnG,KAAKrO,EAAO+Q,gBACR,MAAO,CACH/B,OAAQA,EACRF,WAAYA,EACZK,KAAM,CACFhN,MAAqC,QAA7BmM,EAAKJ,EAAa/L,aAA0B,IAAPmM,EAAgBA,EAAK,KAG9E,KAAKtO,EAAOgR,UACR,MAAO,CACHhC,OAAQA,EACRF,WAAYA,EACZK,KAAM,CACFhN,MAAqC,QAA7BoM,EAAKL,EAAa/L,aAA0B,IAAPoM,EAAgBA,EAAK,GAClE4B,aAAoD,QAArC3B,EAAKN,EAAakC,qBAAkC,IAAP5B,EAAgBA,EAAK,EACjFmC,iBAA4D,QAAzClC,EAAKP,EAAa0C,yBAAsC,IAAPnC,EAAgBA,EAAK,CAAE,EAC3FwC,eAAwD,QAAvCvC,EAAKR,EAAagD,uBAAoC,IAAPxC,EAAgBA,EAAK,CAAE,EACvF2B,0BAAgF,QAApD1B,EAAKT,EAAaoC,oCAAiD,IAAP3B,EAAgBA,EAAK,CAAE,EAC/GwC,wBAA4E,QAAlDvC,EAAKV,EAAakD,kCAA+C,IAAPxC,EAAgBA,EAAK,CAAE,EAC3GiC,gBAA0D,QAAxChC,EAAKX,EAAa4C,wBAAqC,IAAPjC,EAAgBA,EAAK,KAGnG,KAAK7O,EAAOqR,QACZ,QACI,MAAO,CACHrC,OAAQA,EACRF,WAAYA,GAGhC,EACIjB,EAAcvM,UAAU2N,YAAc,SAAUF,GAC5C,OAAIA,GAAQ,KAAOA,EAAO,IACf/O,EAAOkP,QAEL,MAATH,EACO/O,EAAOgR,UAEL,MAATjC,EACO/O,EAAO+Q,gBAEL,MAAThC,EACO/O,EAAOqR,QAEdtC,GAAQ,KAAOA,EAAO,IACf/O,EAAO0P,QAEdX,GAAQ,IACD/O,EAAOsR,OAEXtR,EAAOuR,OACtB,EACW1D,CACX,IC7FI2D,EAAgC,SAAUC,GAE1C,SAASD,IACL,OAAkB,OAAXC,GAAmBA,EAAOlL,MAAMpF,KAAMU,YAAcV,IAC9D,CAqCD,OAxCAuQ,EAAUF,EAAgBC,GAI1BD,EAAelQ,UAAUwM,KAAO,SAAU/K,EAAW4O,GACjD,OAAOC,EAAUzQ,UAAM,OAAQ,GAAQ,WACnC,IAAIgC,EAAS0O,EAAUC,EACvB,OAAOC,EAAY5Q,MAAM,SAAUiC,GAC/B,OAAQA,EAAG4O,OACP,KAAK,EAED,GAAqB,oBAAVC,MACP,MAAM,IAAI7P,MAAM,mCAUpB,OARAe,EAAU,CACN+O,QAAS,CACL,eAAgB,mBAChBC,OAAQ,OAEZhD,KAAM5B,KAAKC,UAAUmE,GACrBS,OAAQ,QAEL,CAAC,EAAaH,MAAMlP,EAAWI,IAC1C,KAAK,EAED,MAAO,CAAC,GADR0O,EAAWzO,EAAGiP,QACgB1F,QAClC,KAAK,EACDmF,EAAe1O,EAAGiP,OAClB,IAEI,MAAO,CAAC,EAAclR,KAAK8M,cAAcV,KAAK+E,MAAMR,IACvD,CACD,MAAOzO,GACH,MAAO,CAAC,EAAclC,KAAK8M,cAAc,CAAEc,KAAM8C,EAAS7C,SAC7D,CACD,MAAO,CAAC,GAEhC,GACA,GACA,EACWwC,CACX,CA1CkB,CA0ChB3D,IJxCF,SAAWhF,GACPA,EAAe,GAAI,KACnBA,EAAe,GAAI,KAInBA,EAAoB,QAAI,SAC3B,CAPD,CAOGA,IAAeA,EAAa,CAAA,IKTxB,MAAM0J,EAAgC,cAEhCC,EAAkC,GAAGD,sBAIrCE,EAAsB5J,EAAW6J,GACjCC,EAA6B,CAAEC,SAAS,GAGxCC,EAAgC,GAAGN,yBAGnCO,EAAkB,WAe/B,IAAYC,GAAZ,SAAYA,GACVA,EAAA,aAAA,eACAA,EAAA,WAAA,aACAA,EAAA,cAAA,gBACAA,EAAA,SAAA,WACAA,EAAA,mBAAA,oBACD,CAND,CAAYA,IAAAA,EAMX,CAAA,UClCYC,EAQX,WAAAC,CAAYrQ,GACVzB,KAAK8K,OAASrJ,EACdzB,KAAKO,IAAMP,KAAK+R,cAAc,OAC9B/R,KAAKe,KAAOf,KAAK+R,cAAc,QAC/B/R,KAAKgB,MAAQhB,KAAK+R,cAAc,SAChC/R,KAAKkB,MAAQlB,KAAK+R,cAAc,QACjC,CAEO,aAAAA,CAAuCd,SAC7C,IAAKjR,KAAK8K,OACR,WAEC,EAGH,MAAML,EAAKzK,KAAK8K,OAAOmG,GACvB,GAAkB,mBAAPxG,EAAmB,CAE5B,OADiF,QAA7DxI,EAAAwI,EAA2CuH,0BAAkB,IAAA/P,EAAAA,EAAIwI,GACnEwH,KAAKjS,KAAK8K,OAC7B,CAED,WAEC,CACF,CAED,MAAAzK,CAAOJ,GACLD,KAAK8K,OAAOzK,OAAOJ,EACpB,CAED,OAAAG,GACEJ,KAAK8K,OAAO1K,SACb,ECQI,MAAM8R,EAAqB,SC1BlC,MAAMC,EAAmB,CAACC,EAA+BC,EAAkBC,KACzE,OAAQD,GACN,IAAK,QAAS,CACZ,GAAoB,UAAhBD,EACF,OAAO,EAGT,MAAMG,EAAYD,ECrBlB,SAAuBA,GAE3B,MAAMrH,EAAQqH,EAA6BrH,KAE3C,OAAOqH,EAAQE,aAAa,uBACxB,WACAvH,EAEYA,EAjBLwH,cAkBP,IACN,CDWkCC,CAAaJ,GAAW,GAEpD,QAAKC,MAID,CAAC,WAAY,SAAU,QAAS,OAAO/O,SAAS+O,MAI/CD,EAA6BK,aAAaC,WAAW,OAK3D,CACD,IAAK,SACL,IAAK,eACH,OAAO,EACT,QACE,OAAOT,EAAiBC,EAAaF,EAAoBI,GAC5D,EA2CUO,EACX,CAACT,EAA+BU,IAChC,CAACtH,EAAc8G,IAnCA,EACfF,EACAU,EAAwB,CAAEC,iBAAkBb,GAC5CI,eAEA,GAAIA,EAAS,CAEX,GAAIA,EAAQU,QAAQ,IAAMrB,GACxB,OAAO,EAIT,MAAMsB,GAAiC,QAAnBhR,EAAA6Q,EAAOI,oBAAY,IAAAjR,EAAAA,EAAI,IAAIkR,MAAMC,GAAad,EAAQU,QAAQI,KAClF,GAAIH,EACF,OAAO,EAIT,GAAIX,EAAQU,QAAQ,eAClB,OAAO,EAKT,MAAMK,GAAqC,QAArBnR,EAAA4Q,EAAOQ,sBAAc,IAAApR,EAAAA,EAAI,IAAIiR,MAAMC,GAAad,EAAQU,QAAQI,KACtF,GAAIC,EACF,OAAO,CAEV,CAED,OAAOlB,EAAiBC,EAAwC,QAA3BjQ,EAAA2Q,EAAOC,wBAAoB,IAAA5Q,EAAAA,EAAA+P,EAAoBI,EAAQ,EAMnFiB,CAASnB,EAAaU,EAAQR,GAAW9G,EAAKgI,QAAQ,SAAU,KAAOhI,EAYrElI,EAAe,CAACzB,EAAsC4R,IAC7DA,IAIA5R,IAAe6F,EAAWgM,QHhGU,uDGoGpC7R,IAAe6F,EAAWiM,GHrGK,oDADI,kDGoHnCC,EAAeC,IAEnB,MAAMC,EAAUD,EACbL,QAAQ,oBAAqB,QAC7BA,QAAQ,MAAO,MACfA,QAAQ,MAAO,KAElB,OAAO,IAAIO,OAAO,IAAID,KAAW,EAetBE,EAAa,CAACC,EAAiBC,KAE1C,IAAK,MAAMC,KAAQD,EAAgB,CACjC,MAAME,EAAQR,EAAYO,EAAKf,UAE/B,GAAIgB,EAAMC,KAAKJ,GACb,OAAOA,EAAQT,QAAQY,EAAOD,EAAKG,YAEtC,CAED,OAAOL,CAAO,EAGHM,EAAiB,IAAiC9D,OAAA,OAAA,OAAA,GAAA,YAC7D,IACE,MAAM+D,EAAcrV,IACpB,GAAIqV,EAAa,CACf,MAAMC,MAAEA,EAAKC,MAAEA,EAAKC,aAAEA,SAA8CH,EAAYvQ,UAAU2Q,QAAQC,WAC5FC,EAAmBL,EAAQM,KAAKC,MAAMP,EHlJ3B,MGkJ8C,EAE/D,MAAO,CAAEK,mBAAkBG,eADJR,GAASC,EAAQK,KAAKC,MAAyC,KAAlCP,EAAQC,EAAQQ,OAAOC,UAAmB,IAAO,EAC1DR,aAAcvI,KAAKC,UAAUsI,GACzE,CACF,CAAC,MAAO3O,GAER,CACD,MAAO,CAAE8O,iBAAkB,EAAGG,eAAgB,EAAGN,aAAc,GACjE,IAEaS,EAAkBtC,IAC7B,MAAMuC,EAAWrS,OAAA4B,OAAA,CAAA,EACZkO,IAECvQ,OAAEA,GAAW8S,EAEnB,OADAA,EAAY9S,OAAS,OAAOA,EAAO+S,UAAU/S,EAAO5B,OAAS,KACtD0U,CAAW,EE3KPjU,EAAmB,KAAO,CACrCC,gBAAiB,EACjBpB,SAAUf,EAASoB,KACnBmB,eAAgB,IAAI1B,EACpB8C,kBAAmB,IAAIwN,IAGnB,MAAOkF,UAAiCxT,EAsB5C,WAAA+P,CAAYvP,EAAgBP,iBAC1B,MAAMM,EAAgBlB,IACtBoU,MAAKxS,OAAA4B,OAAA5B,OAAA4B,OAAA,CACH/B,kBAAmBP,EAAcO,kBACjCpB,eAAgB,IAAIoQ,EAAmB7P,EAAQP,gBAAkBa,EAAcb,iBAC5EO,GAAO,CACVO,YAEFvC,KAAKqB,qBACyBsB,IAA5BX,EAAQX,iBAAiCW,EAAQX,iBAAmBiB,EAAcjB,gBAC9EW,EAAQX,gBACRiB,EAAcjB,gBAEpBrB,KAAKuC,OAASA,EACdvC,KAAKyV,WAAazT,EAAQyT,YLtDK,EKuD/BzV,KAAK6B,WAAaG,EAAQH,YAAcyP,EACxCtR,KAAK0V,gBAAkB1T,EAAQ0T,gBAC/B1V,KAAKyT,eAAiBzR,EAAQyR,eAC9BzT,KAAK2V,uBAAyB3T,EAAQ2T,uBACtC3V,KAAK4V,QAAU5T,EAAQ4T,QACvB5V,KAAK6V,kBAAoB7T,EAAQ6T,mBAAqBrE,EACtDxR,KAAK8V,UAAiC,QAArB7T,EAAAD,EAAQ8T,iBAAa,IAAA7T,EAAAA,EAAA,MACtCjC,KAAK+V,sCAAyF,QAAjD7T,EAAAF,EAAQ+T,6CAAyC,IAAA7T,GAAAA,EAC9FlC,KAAKgW,uBAA2D,QAAlC7T,EAAAH,EAAQgU,8BAA0B,IAAA7T,GAAAA,EAChEnC,KAAKiW,yBAA+D,QAApC7T,EAAAJ,EAAQiU,gCAA4B,IAAA7T,EAAAA,EL7DrB,IK8D/CpC,KAAKkW,qBAAuD,QAAhCpN,EAAA9G,EAAQkU,4BAAwB,IAAApN,GAAAA,EAExD9G,EAAQmU,gBACVnW,KAAKmW,cAAgBnU,EAAQmU,eAE3BnU,EAAQoU,oBACVpW,KAAKoW,kBAAoBpU,EAAQoU,kBAG7BpW,KAAKoW,kBAAkBlC,gBF8DK,CAACA,IAErC,IAAKA,EAAemC,OAAOlC,GAAkC,iBAAlBA,EAAKf,UAAqD,iBAArBe,EAAKG,cACnF,MAAM,IAAIrT,MAAM,uFAIlB,IAAKiT,EAAemC,OAAOlC,IAASmC,MAvBb,iBADDC,EAwB6BpC,EAAKf,WAvBF,KAAnBmD,EAAQ9K,UACxB,0BACH4I,KAAKkC,GAHA,IAACA,CAwB2C,IAC/D,MAAM,IAAItV,MAAM,8DACjB,EEtEKuV,CAAuBxW,KAAKoW,kBAAkBlC,iBAG9ClS,EAAQyU,YACVzW,KAAKyW,UAAYzU,EAAQyU,WAEvBzU,EAAQ0U,eACV1W,KAAK0W,aAAe1U,EAAQ0U,cAE1B1U,EAAQ2U,kBACV3W,KAAK2W,gBAAkB3U,EAAQ2U,gBAElC,EC9FH,ICAWjP,GCCA7I,GFDP+X,GAA4B,CAAEC,IAChCA,EAAWA,EAA6B,iBAAI,GAAK,mBACjDA,EAAWA,EAAiB,KAAI,GAAK,OACrCA,EAAWA,EAAyB,aAAI,GAAK,eAC7CA,EAAWA,EAAgC,oBAAI,GAAK,sBACpDA,EAAWA,EAAiB,KAAI,GAAK,OACrCA,EAAWA,EAAmB,OAAI,GAAK,SACvCA,EAAWA,EAAmB,OAAI,GAAK,SAChCA,GARuB,CAS7BD,IAAa,CAAA,GAqBZE,GAAoC,CAAEC,IACxCA,EAAmBA,EAA4B,QAAI,GAAK,UACxDA,EAAmBA,EAA8B,UAAI,GAAK,YAC1DA,EAAmBA,EAA0B,MAAI,GAAK,QACtDA,EAAmBA,EAAgC,YAAI,GAAK,cAC5DA,EAAmBA,EAA6B,SAAI,GAAK,WACzDA,EAAmBA,EAA0B,MAAI,GAAK,QACtDA,EAAmBA,EAAyB,KAAI,GAAK,OACrDA,EAAmBA,EAA+B,WAAI,GAAK,aAC3DA,EAAmBA,EAAuC,mBAAI,GAAK,qBACnEA,EAAmBA,EAA6B,SAAI,GAAK,WACzDA,EAAmBA,EAAgC,YAAI,IAAM,cACtDA,GAZ+B,CAarCD,IAAqB,CAAA,IC1CxB,SAAWpP,GACPA,EAAe,GAAI,KACnBA,EAAe,GAAI,KACnBA,EAAoB,QAAI,SAC3B,CAJD,CAIGA,KAAeA,GAAa,CAAA,ICH/B,SAAW7I,GAEPA,EAAgB,QAAI,UAEpBA,EAAgB,QAAI,UAEpBA,EAAgB,QAAI,UAEpBA,EAAkB,UAAI,aAEtBA,EAAwB,gBAAI,oBAE5BA,EAAgB,QAAI,UAEpBA,EAAe,OAAI,SAEnBA,EAAgB,QAAI,UAEpBA,EAAoB,YAAI,aAC3B,CAnBD,CAmBGA,KAAWA,GAAS,CAAA,ICjBvB,IAAI6N,GAA+B,WAC/B,SAASA,IACR,CA2FD,OA1FAA,EAAcvM,UAAUwM,KAAO,SAAUC,EAAYC,GACjD,OAAOjN,QAAQC,QAAQ,KAC/B,EACI6M,EAAcvM,UAAU2M,cAAgB,SAAUC,GAC9C,IAAI9K,EAAIC,EAAIC,EAAIC,EAAI0G,EAAIC,EAAIG,EAAIC,EAAIC,EAAIE,EAAIC,EAAIyD,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EACxF,GAA4B,iBAAjBX,EACP,OAAO,KAEX,IAAIY,EAAaZ,EAAaa,MAAQ,EAClCC,EAAS7N,KAAK8N,YAAYH,GAC9B,OAAQE,GACJ,KAAKhP,GAAOkP,QACR,MAAO,CACHF,OAAQA,EACRF,WAAYA,EACZK,KAAM,CACFC,eAAwD,QAAvChM,EAAK8K,EAAamB,uBAAoC,IAAPjM,EAAgBA,EAAK,EACrFkM,iBAA6D,QAA1CjM,EAAK6K,EAAaqB,0BAAuC,IAAPlM,EAAgBA,EAAK,EAC1FmM,iBAA6D,QAA1ClM,EAAK4K,EAAauB,0BAAuC,IAAPnM,EAAgBA,EAAK,IAGtG,KAAKtD,GAAO0P,QACR,MAAO,CACHV,OAAQA,EACRF,WAAYA,EACZK,KAAM,CACFhN,MAAqC,QAA7BoB,EAAK2K,EAAa/L,aAA0B,IAAPoB,EAAgBA,EAAK,GAClEoM,aAAoD,QAArC1F,EAAKiE,EAAa0B,qBAAkC,IAAP3F,EAAgBA,EAAK,GACjF4F,wBAA4E,QAAlD3F,EAAKgE,EAAa4B,kCAA+C,IAAP5F,EAAgBA,EAAK,CAAE,EAC3G6F,wBAA4E,QAAlD1F,EAAK6D,EAAa8B,kCAA+C,IAAP3F,EAAgBA,EAAK,CAAE,EAC3G4F,2BAAmF,QAAtD3F,EAAK4D,EAAagC,sCAAmD,IAAP5F,EAAgBA,EAAK,CAAE,EAClH6F,aAAoD,QAArC5F,EAAK2D,EAAakC,qBAAkC,IAAP7F,EAAgBA,EAAK,EACjF8F,0BAAgF,QAApD5F,EAAKyD,EAAaoC,oCAAiD,IAAP7F,EAAgBA,EAAK,CAAE,EAC/G8F,gBAA0D,QAAxC7F,EAAKwD,EAAasC,wBAAqC,IAAP9F,EAAgBA,EAAK,GACvF+F,eAAwD,QAAvCtC,EAAKD,EAAawC,uBAAoC,IAAPvC,EAAgBA,EAAK,GACrFwC,iBAA4D,QAAzCvC,EAAKF,EAAa0C,yBAAsC,IAAPxC,EAAgBA,EAAK,CAAE,EAC3FyC,gBAA0D,QAAxCxC,EAAKH,EAAa4C,wBAAqC,IAAPzC,EAAgBA,EAAK,KAGnG,KAAKrO,GAAO+Q,gBACR,MAAO,CACH/B,OAAQA,EACRF,WAAYA,EACZK,KAAM,CACFhN,MAAqC,QAA7BmM,EAAKJ,EAAa/L,aAA0B,IAAPmM,EAAgBA,EAAK,KAG9E,KAAKtO,GAAOgR,UACR,MAAO,CACHhC,OAAQA,EACRF,WAAYA,EACZK,KAAM,CACFhN,MAAqC,QAA7BoM,EAAKL,EAAa/L,aAA0B,IAAPoM,EAAgBA,EAAK,GAClE4B,aAAoD,QAArC3B,EAAKN,EAAakC,qBAAkC,IAAP5B,EAAgBA,EAAK,EACjFmC,iBAA4D,QAAzClC,EAAKP,EAAa0C,yBAAsC,IAAPnC,EAAgBA,EAAK,CAAE,EAC3FwC,eAAwD,QAAvCvC,EAAKR,EAAagD,uBAAoC,IAAPxC,EAAgBA,EAAK,CAAE,EACvF2B,0BAAgF,QAApD1B,EAAKT,EAAaoC,oCAAiD,IAAP3B,EAAgBA,EAAK,CAAE,EAC/GwC,wBAA4E,QAAlDvC,EAAKV,EAAakD,kCAA+C,IAAPxC,EAAgBA,EAAK,CAAE,EAC3GiC,gBAA0D,QAAxChC,EAAKX,EAAa4C,wBAAqC,IAAPjC,EAAgBA,EAAK,KAGnG,KAAK7O,GAAOqR,QACZ,QACI,MAAO,CACHrC,OAAQA,EACRF,WAAYA,GAGhC,EACIjB,EAAcvM,UAAU2N,YAAc,SAAUF,GAC5C,OAAIA,GAAQ,KAAOA,EAAO,IACf/O,GAAOkP,QAEL,MAATH,EACO/O,GAAOgR,UAEL,MAATjC,EACO/O,GAAO+Q,gBAEL,MAAThC,EACO/O,GAAOqR,QAEdtC,GAAQ,KAAOA,EAAO,IACf/O,GAAO0P,QAEdX,GAAQ,IACD/O,GAAOsR,OAEXtR,GAAOuR,OACtB,EACW1D,CACX,IC5FIsK,GAAkB,8DAClBC,GAA2B,4BAI3BC,GAAmC,WACnC,SAASA,EAAkBjV,GACvB,IAAIkV,EAAclV,EAAGkV,YAAaC,EAAanV,EAAGmV,WAC9CC,EAAQrX,KACZA,KAAKsX,aAAe,IACpBtX,KAAKuX,SAAW,EAChBvX,KAAKwX,uBAAwB,EAC7BxX,KAAKyX,QAAU,GACfzX,KAAK0X,yBAA2B,SAAUC,EAAiBC,GAAa,OAAOnH,EAAU4G,OAAO,OAAQ,GAAQ,WAC5G,IAAIQ,EAAgBC,EAAmBC,EACvC,OAAOnH,EAAY5Q,MAAM,SAAUiC,GAC/B,OAAQA,EAAG4O,OACP,KAAK,EAED,OADAgH,EAAiBjM,KAAKoM,MACf,CAAC,EAAahY,KAAKiY,iBAAiBL,IAC/C,KAAK,EAED,OADAE,EAAoB7V,EAAGiP,UAEnB6G,EAAeD,EAAkBI,SAAWJ,EAAkBI,QAAQP,KAElE3X,KAAKyX,QAAQU,oBAAsBvM,KAAKoM,MAAQH,EACzC,CAAC,EAAcE,KAG9B/X,KAAKyX,QAAQW,iBAAmBxM,KAAKoM,MAAQH,EACtC,CAAC,OAAclV,IAE9C,GACS,GAAE,EACH3C,KAAKqY,gBAAkB,SAAUV,EAAiBtQ,EAAKuQ,GAAa,OAAOnH,EAAU4G,OAAO,OAAQ,GAAQ,WACxG,IAAIiB,EACJ,OAAO1H,EAAY5Q,MAAM,SAAUiC,GAC/B,OAAQA,EAAG4O,OACP,KAAK,EAAG,MAAO,CAAC,EAAa7Q,KAAK0X,yBAAyBC,EAAiBC,IAC5E,KAAK,EAED,MAAO,CAAC,EAAcU,OADtBA,EAAkBrW,EAAGiP,aAC0D,EAASoH,EAAgBjR,IAEhI,GACS,GAAE,EACHrH,KAAKiY,iBAAmB,SAAUL,GAAa,OAAOnH,EAAU4G,OAAO,OAAQ,GAAQ,WACnF,IAAIkB,EAAYC,EAAWT,EAC3B,OAAOnH,EAAY5Q,MAAM,SAAUiC,GAC/B,OAAQA,EAAG4O,OACP,KAAK,EAGD,OAFA0H,EAAa,IAAIE,gBACjBD,EAAYE,YAAW,WAAc,OAAOH,EAAWI,OAAQ,GAAI,KAC5D,CAAC,EAAa3Y,KAAK4Y,kBAAkBL,EAAWM,OAAQjB,IACnE,KAAK,EAGD,OAFAG,EAAe9V,EAAGiP,OAClB4H,aAAaN,GACN,CAAC,EAAcT,GAE9C,GACS,GAAE,EACH/X,KAAK4Y,kBAAoB,SAAUC,EAAQjB,GAAa,OAAOnH,EAAU4G,OAAO,OAAQ,GAAQ,WAC5F,IAAI0B,EAAW9W,EAAIC,EAAI8W,EAAWhX,EAASJ,EAAWqX,EAAmB3S,EAAK4S,EAC1EvQ,EAAKxG,EACLC,EACJ,OAAOwO,EAAY5Q,MAAM,SAAU8I,GAC/B,OAAQA,EAAG+H,OACP,KAAK,EACD,GAAI+G,IAAc5X,KAAKmZ,sBAAwBnZ,KAAKuX,UAAYvX,KAAKmX,YAAY9V,gBAC7E,MAAO,CAAC,EAAcrB,KAAKoZ,gBAAgB,CAAEC,IArEtC,8DAuEN,GAAIR,EAAOS,QACZ,MAAO,CAAC,EAActZ,KAAKoZ,gBAAgB,CAAEC,IAAKrC,MAE7CY,IAAc5X,KAAKmZ,uBACxBnZ,KAAKmZ,qBAAuBvB,EAC5B5X,KAAKuX,SAAW,GAEpBzO,EAAG+H,MAAQ,EACf,KAAK,EACD/H,EAAGyQ,KAAK/U,KAAK,CAAC,EAAG,EAAC,CAAI,IACtBuU,EAAY,IAAIS,gBAAgB,CAC5BC,QAASzZ,KAAKmX,YAAY5U,SAE9B,IACI,IAAKN,EAAKoD,EAASrF,KAAKoX,YAAalV,EAAKD,EAAGyD,QAASxD,EAAG0D,KAAM1D,EAAKD,EAAGyD,OACnEsT,EAAY9W,EAAGyD,MACfoT,EAAUW,OAAO,cAAeV,EAEvC,CACD,MAAO3P,GAASV,EAAM,CAAE3H,MAAOqI,EAAU,CACjC,QACJ,IACQnH,IAAOA,EAAG0D,OAASzD,EAAKF,EAAG0E,SAASxE,EAAGgD,KAAKlD,EACnD,CACO,QAAE,GAAI0G,EAAK,MAAMA,EAAI3H,KAAQ,CACxC,CAYD,OAXI4W,GACAmB,EAAU5V,IAAI,aAAcwW,OAAO/B,IAEvC5V,EAAU,CACN+O,QAAS,CACLC,OAAQ,OAEZC,OAAQ,OAEZrP,EAAY,GAAG7C,OAAOiB,KAAKsD,eAAgB,KAAKvE,OAAOga,EAAUa,YACjE5Z,KAAKuX,UAAY,EACV,CAAC,EAAazG,MAAMlP,EAAW+C,EAASA,EAAS,GAAI3C,GAAU,CAAE6W,OAAQA,MACpF,KAAK,EAED,GAAY,QADZI,EAAMnQ,EAAGoI,QAEL,MAAO,CAAC,EAAclR,KAAKoZ,gBAAgB,CAAEC,IAAKpC,MAGtD,QADe,IAAIvK,IAAgBoB,YAAYmL,EAAIpL,SAE/C,KAAKhP,GAAOkP,QAER,OADA/N,KAAKuX,SAAW,EACT,CAAC,EAAcvX,KAAK6Z,oBAAoBZ,IACnD,KAAKpa,GAAOsR,OACR,MAAO,CAAC,EAAcnQ,KAAK8Z,WAAWjB,EAAQjB,IAClD,QACI,MAAO,CAAC,EAAc5X,KAAKoZ,gBAAgB,CAAEC,IA5HtC,wDA+HnB,KAAK,EAGD,OAFA/S,EAAMwC,EAAGoI,OACTgI,EAAa5S,EACTuS,EAAOS,QACA,CAAC,EAActZ,KAAKoZ,gBAAgB,CAAEC,IAAKrC,MAE/C,CAAC,EAAchX,KAAKoZ,gBAAgB,CAAEC,IAAmC,QAA7BjX,EAAK8W,EAAWa,eAA4B,IAAP3X,EAAgBA,EAAK6U,MACjH,KAAK,EAAG,MAAO,CAAC,GAEpC,GACS,GAAE,EACHjX,KAAK8Z,WAAa,SAAUjB,EAAQjB,GAAa,OAAOnH,EAAU4G,OAAO,OAAQ,GAAQ,WACrF,IAAIA,EAAQrX,KACZ,OAAO4Q,EAAY5Q,MAAM,SAAUiC,GAC/B,OAAQA,EAAG4O,OACP,KAAK,EAAG,MAAO,CAAC,EAAa,IAAIjR,SAAQ,SAAUC,GAAW,OAAO6Y,WAAW7Y,EAASwX,EAAME,SAAWF,EAAMC,aAAgB,KAChI,KAAK,EAED,OADArV,EAAGiP,OACI,CAAC,EAAclR,KAAK4Y,kBAAkBC,EAAQjB,IAE7E,GACS,GAAE,EACH5X,KAAK6Z,oBAAsB,SAAUZ,GAAO,OAAOxI,EAAU4G,OAAO,OAAQ,GAAQ,WAChF,IAAIU,EACJ,OAAOnH,EAAY5Q,MAAM,SAAUiC,GAC/B,OAAQA,EAAG4O,OACP,KAAK,EAAG,MAAO,CAAC,EAAaoI,EAAIe,QACjC,KAAK,EAGD,OAFAjC,EAAgB9V,EAAGiP,OACnBlR,KAAKoZ,gBAAgB,CAAEa,QA3JnB,uCA4JG,CAAC,EAAclC,GAE9C,GACS,GAAE,EACH/X,KAAKmX,YAAcA,EACnBnX,KAAKoX,WAAaA,CACrB,CAsBD,OArBAF,EAAkB/W,UAAUmD,aAAe,WACvC,OAAItD,KAAKmX,YAAYzB,gBACV1V,KAAKmX,YAAYzB,gBAExB1V,KAAKmX,YAAYtV,aAAe6F,GAAWgM,QAlKT,mDAqKlC1T,KAAKmX,YAAYtV,aAAe6F,GAAWiM,GApKd,gDAFH,4CA0KtC,EACIuD,EAAkB/W,UAAUiZ,gBAAkB,SAAUnX,GACpD,IAAIoX,EAAMpX,EAAGoX,IAAKY,EAAUhY,EAAGgY,QAC/B,GAAIZ,EACA,MAAM,IAAIpY,MAAMoY,GAEXY,GACLja,KAAKmX,YAAY1V,eAAelB,IAAI0Z,EAEhD,EACW/C,CACX,IC5LWgD,GD8L0B,SAAUjY,GAC3C,IAAIkV,EAAclV,EAAGkV,YAAaC,EAAanV,EAAGmV,WAClD,OAAO3G,OAAU,OAAQ,OAAQ,GAAQ,WACrC,OAAOG,EAAY5Q,MAAM,SAAUkC,GAC/B,MAAO,CAAC,EAAc,IAAIgV,GAAkB,CAAEC,YAAaA,EAAaC,WAAYA,IAChG,GACA,GACA,QE9Ja+C,GAIX,WAAArI,CAAYsI,EAAiEjD,GAC3EnX,KAAKmX,YAAcA,EACnBnX,KAAKoa,kBAAoBA,CAC1B,CAEK,oBAAAC,CAAqBzC,wDACzB,MAAM9E,EAAyC9P,OAAA4B,OAAA,CAAA,EAAA5E,KAAKmX,aAMpD,IAAIY,EAJJjF,EAAOnR,OAAS3B,KAAKmX,YAAYxV,OAGjCmR,EAAOwH,gBAAiB,EAExB,IACE,MAAMhC,QAAwBtY,KAAKoa,kBAAkB1C,yBAAyB,gBAAiBE,GAC/F,GAAIU,EAAiB,CACnB,MAAMiC,EAAiBjC,EAAgBkC,mBACjCrE,EAAgBmC,EAAgBmC,kBAChCC,EAAkBpC,EAAgBqC,oBAElCzG,EAAyC,QAAxBjS,EAAA6Q,EAAOsD,yBAAiB,IAAAnU,OAAA,EAAAA,EAAEiS,eAEjDpB,EAAOsD,kBAAoBkC,EAAgBsC,sBACvC9H,EAAOsD,mBAAqBlC,IAC9BpB,EAAOsD,kBAAkBlC,eAAiBA,GAI5CpB,EAAO+H,cAAgBvC,EAAgBwC,mBAEnCP,GAAkBpE,GAAiBuE,KACrC3C,EAAe,CAAA,EACXwC,IACFxC,EAAayC,mBAAqBD,GAEhCpE,IACF4B,EAAa0C,kBAAoBtE,GAE/BuE,IACF3C,EAAa4C,oBAAsBD,GAGxC,CACF,CAAC,MAAOrB,GACP,MAAMH,EAAaG,EACnBrZ,KAAKmX,YAAY1V,eAAeV,KAAKmY,EAAWa,SAChDjH,EAAOwH,gBAAiB,CACzB,CAED,IAAKvC,EACH,MAAO,CACLZ,YAAanX,KAAKmX,YAClB4D,aAAcjI,EACdiF,gBAIJ,MACEyC,mBAAoBD,EACpBE,kBAAmBO,EACnBL,oBAAqBD,GACnB3C,EAmCJ,GAlCIwC,GAAkBvX,OAAOiE,KAAKsT,GAAgB5Z,OAAS,GACrDqC,OAAO7C,UAAU+E,eAAeC,KAAKoV,EAAgB,mBACvDzH,EAAOwH,eAAiBC,EAAeU,gBAEvCnI,EAAOwH,gBAAiB,EAGtBtX,OAAO7C,UAAU+E,eAAeC,KAAKoV,EAAgB,iBACvDzH,EAAO2C,WAAa8E,EAAeW,eAMrCpI,EAAOwH,gBAAiB,EACxBta,KAAKmX,YAAY1V,eAAeP,MAC9B,uGAkBA8Z,EAAqB,CACvB,MAAMG,EAAwD,QAApBjZ,EAAA4Q,EAAOqD,qBAAa,IAAAjU,EAAAA,EAAI,GAE5DkZ,EAA6E,CACjFrI,iBAA6F,QAA3E3Q,EAAoC,QAApCD,EAAA6Y,EAAoBjI,wBAAgB,IAAA5Q,EAAAA,EAAIgZ,EAAmBpI,wBAAgB,IAAA3Q,EAAAA,EAAI,SACjGiZ,cAAe,GACfnI,aAAc,GACdI,eAAgB,IAGZgI,EAA4BnF,cAChC,MAAMoF,EAA2D,CAAA,EACtB,iBAAhCpF,EAAckF,gBACvBlF,EAAckF,cAAgB,CAAClF,EAAckF,gBAG/C,IAAK,MAAMjI,KAA2C,QAA/BnR,EAAAkU,EAAckF,qBAAiB,IAAApZ,EAAAA,EAAA,GACpDsZ,EAAYnI,GAAY,QAE1B,IAAK,MAAMA,KAA0C,QAA9BlR,EAAAiU,EAAcjD,oBAAgB,IAAAhR,EAAAA,EAAA,GACnDqZ,EAAYnI,GAAY,OAE1B,IAAK,MAAMA,KAA4C,QAAhCjR,EAAAgU,EAAc7C,sBAAkB,IAAAnR,EAAAA,EAAA,GACrDoZ,EAAYnI,GAAY,SAE1B,OAAOmI,CAAW,EAGdA,EAAWvY,OAAA4B,OAAA5B,OAAA4B,OAAA,CAAA,EACZ0W,EAAyBH,IACzBG,EAAyBN,IAG9B,IAAK,MAAO5H,EAAUoI,KAAiBxY,OAAOsE,QAAQiU,GAC/B,SAAjBC,EACFJ,EAAoBlI,aAAa1O,KAAK4O,GACZ,UAAjBoI,EACTJ,EAAoBC,cAAc7W,KAAK4O,GACb,WAAjBoI,GACTJ,EAAoB9H,eAAe9O,KAAK4O,GAI5CN,EAAOqD,cA1K0C,EAACA,EAA8B1U,KAEpF,MAAMga,EAAWC,SAASC,yBAEpBC,EAAuB,CAACC,EAA+B,MAa3D,GAZyB,iBAAdA,IACTA,EAAY,CAACA,IAEfA,EAAYA,EAAUC,QAAQ1I,IAC5B,IACEqI,EAASM,cAAc3I,EACxB,CAAC,MAAMnR,GAEN,OADAR,EAAeV,KAAK,+CAA+CqS,6BAC5D,CACR,CACD,OAAO,CAAI,IAEY,IAArByI,EAAUlb,OAGd,OAAOkb,CAAS,EAKlB,OAHA1F,EAAckF,cAAgBO,EAAqBzF,EAAckF,eACjElF,EAAcjD,aAAe0I,EAAqBzF,EAAcjD,cAChEiD,EAAc7C,eAAiBsI,EAAqBzF,EAAc7C,gBAC3D6C,CAAa,EAiJO6F,CACrBZ,EACApb,KAAKmX,YAAY1V,eAEpB,CAUD,OARIiZ,GAAmB1X,OAAOiE,KAAKyT,GAAiB/Z,OAAS,IAC3DmS,EAAO4H,gBAAkBA,GAG3B1a,KAAKmX,YAAY1V,eAAeP,MAC9BkL,KAAKC,UAAU,CAAEnB,KAAM,+BAAgC4H,OAAQsC,EAAetC,IAAW,KAAM,IAG1F,CACLqE,YAAanX,KAAKmX,YAClB4D,aAAcjI,EACdiF,kBAEH,EC1MH,IAAIkE,GAAKC,WAAYC,GAAMC,YAAaC,GAAMC,YAC1CC,GAAO,IAAIN,GAAG,CAChB,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EAEA,EACA,EAEA,IAEEO,GAAO,IAAIP,GAAG,CAChB,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GAEA,EACA,IAEEQ,GAAO,IAAIR,GAAG,CAAC,GAAI,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,GAAI,EAAG,KAC7ES,GAAO,SAASC,EAAIhR,GAEtB,IADA,IAAIiR,EAAI,IAAIT,GAAI,IACPpX,EAAI,EAAGA,EAAI,KAAMA,EACxB6X,EAAE7X,GAAK4G,GAAS,GAAKgR,EAAG5X,EAAI,GAE9B,IAAIgB,EAAI,IAAIsW,GAAIO,EAAE,KAClB,IAAS7X,EAAI,EAAGA,EAAI,KAAMA,EACxB,IAAK,IAAI8X,EAAID,EAAE7X,GAAI8X,EAAID,EAAE7X,EAAI,KAAM8X,EACjC9W,EAAE8W,GAAKA,EAAID,EAAE7X,IAAM,EAAIA,EAG3B,MAAO,CAAC6X,EAAG7W,EACb,EACI9D,GAAKya,GAAKH,GAAM,GAAIO,GAAK7a,GAAG,GAAI8a,GAAQ9a,GAAG,GAC/C6a,GAAG,IAAM,IAAKC,GAAM,KAAO,GAG3B,IAFG,IAAiCC,GAA3BN,GAAKF,GAAM,GAA2B,GAC3CS,GAAM,IAAId,GAAI,OACTpX,GAAI,EAAGA,GAAI,QAASA,GAAG,CAC9B,IAAImY,IAAS,MAAJnY,MAAe,GAAS,MAAJA,KAAc,EAE3CmY,IAAS,OADTA,IAAS,MAAJA,MAAe,GAAS,MAAJA,KAAc,MACnB,GAAS,KAAJA,KAAa,EACtCD,GAAIlY,MAAW,MAAJmY,MAAe,GAAS,IAAJA,KAAY,KAAO,CACpD,CACA,IAAIC,GAAO,SAASC,EAAIC,EAAItX,GAI1B,IAHA,IAAIjB,EAAIsY,EAAGzc,OACPoE,EAAI,EACJuY,EAAI,IAAInB,GAAIkB,GACTtY,EAAID,IAAKC,IACZuY,EAAEF,EAAGrY,GAAK,GACd,IAIIwY,EAJAC,EAAK,IAAIrB,GAAIkB,GACjB,IAAKtY,EAAI,EAAGA,EAAIsY,IAAMtY,EACpByY,EAAGzY,GAAKyY,EAAGzY,EAAI,GAAKuY,EAAEvY,EAAI,IAAM,EAGlC,GAAIgB,EAAG,CACLwX,EAAK,IAAIpB,GAAI,GAAKkB,GAClB,IAAII,EAAM,GAAKJ,EACf,IAAKtY,EAAI,EAAGA,EAAID,IAAKC,EACnB,GAAIqY,EAAGrY,GAIL,IAHA,IAAI2Y,EAAK3Y,GAAK,EAAIqY,EAAGrY,GACjB4Y,EAAMN,EAAKD,EAAGrY,GACd6Y,EAAIJ,EAAGJ,EAAGrY,GAAK,MAAQ4Y,EAClBlY,EAAImY,GAAK,GAAKD,GAAO,EAAGC,GAAKnY,IAAKmY,EACzCL,EAAGN,GAAIW,KAAOH,GAAOC,CAI/B,MAEI,IADAH,EAAK,IAAIpB,GAAIrX,GACRC,EAAI,EAAGA,EAAID,IAAKC,EACnBwY,EAAGxY,GAAKkY,GAAIO,EAAGJ,EAAGrY,GAAK,QAAU,GAAKqY,EAAGrY,GAE7C,OAAOwY,CACT,EACIM,GAAM,IAAI5B,GAAG,KACjB,IAASlX,GAAI,EAAGA,GAAI,MAAOA,GACzB8Y,GAAI9Y,IAAK,EACX,IAASA,GAAI,IAAKA,GAAI,MAAOA,GAC3B8Y,GAAI9Y,IAAK,EACX,IAASA,GAAI,IAAKA,GAAI,MAAOA,GAC3B8Y,GAAI9Y,IAAK,EACX,IAASA,GAAI,IAAKA,GAAI,MAAOA,GAC3B8Y,GAAI9Y,IAAK,EACX,IAAI+Y,GAAM,IAAI7B,GAAG,IACjB,IAASlX,GAAI,EAAGA,GAAI,KAAMA,GACxB+Y,GAAI/Y,IAAK,EACR,IAACgZ,GAAsBZ,GAAKU,GAAK,EAAG,GACnCG,GAAsBb,GAAKW,GAAK,EAAG,GAiBnCG,GAAO,SAAShZ,GAClB,OAAQA,EAAI,EAAK,IAAU,EAAJA,GAAS,EAClC,EACIiZ,GAAM,SAASN,EAAG9Y,EAAGkB,IACd,MAALA,GAAaA,EAAI4X,EAAEjd,UACrBqF,EAAI4X,EAAEjd,QACR,IAAIqE,EAAI,IAAK4Y,aAAazB,GAAMA,GAAMyB,aAAavB,GAAMA,GAAMJ,IAAIjW,EAAIlB,GAEvE,OADAE,EAAE7B,IAAIya,EAAEO,SAASrZ,EAAGkB,IACbhB,CACT,EAoIIoZ,GAAQ,SAASC,EAAGpZ,EAAG2Y,GACzBA,IAAU,EAAJ3Y,EACN,IAAIK,EAAIL,EAAI,EAAK,EACjBoZ,EAAE/Y,IAAMsY,EACRS,EAAE/Y,EAAI,IAAMsY,IAAM,CACpB,EACIU,GAAU,SAASD,EAAGpZ,EAAG2Y,GAC3BA,IAAU,EAAJ3Y,EACN,IAAIK,EAAIL,EAAI,EAAK,EACjBoZ,EAAE/Y,IAAMsY,EACRS,EAAE/Y,EAAI,IAAMsY,IAAM,EAClBS,EAAE/Y,EAAI,IAAMsY,IAAM,EACpB,EACIW,GAAQ,SAASF,EAAGhB,GAEtB,IADA,IAAIxY,EAAI,GACCE,EAAI,EAAGA,EAAIsZ,EAAE1d,SAAUoE,EAC1BsZ,EAAEtZ,IACJF,EAAEL,KAAK,CAAEM,EAAGC,EAAGyZ,EAAGH,EAAEtZ,KAExB,IAAID,EAAID,EAAElE,OACN8d,EAAK5Z,EAAEyG,QACX,IAAKxG,EACH,MAAO,CAAC,IAAImX,GAAG,GAAI,GACrB,GAAS,GAALnX,EAAQ,CACV,IAAI8Y,EAAI,IAAI3B,GAAGpX,EAAE,GAAGC,EAAI,GAExB,OADA8Y,EAAE/Y,EAAE,GAAGC,GAAK,EACL,CAAC8Y,EAAG,EACZ,CACD/Y,EAAEqC,MAAK,SAASwX,EAAG9B,GACjB,OAAO8B,EAAEF,EAAI5B,EAAE4B,CACnB,IACE3Z,EAAEL,KAAK,CAAEM,GAAI,EAAG0Z,EAAG,QACnB,IAAIlB,EAAIzY,EAAE,GAAIkB,EAAIlB,EAAE,GAAI8Z,EAAK,EAAGC,EAAK,EAAGC,EAAK,EAE7C,IADAha,EAAE,GAAK,CAAEC,GAAI,EAAG0Z,EAAGlB,EAAEkB,EAAIzY,EAAEyY,EAAGlB,IAAGvX,KAC1B6Y,GAAM9Z,EAAI,GACfwY,EAAIzY,EAAEA,EAAE8Z,GAAIH,EAAI3Z,EAAEga,GAAIL,EAAIG,IAAOE,KACjC9Y,EAAIlB,EAAE8Z,GAAMC,GAAM/Z,EAAE8Z,GAAIH,EAAI3Z,EAAEga,GAAIL,EAAIG,IAAOE,KAC7Cha,EAAE+Z,KAAQ,CAAE9Z,GAAI,EAAG0Z,EAAGlB,EAAEkB,EAAIzY,EAAEyY,EAAGlB,IAAGvX,KAEtC,IAAI+Y,EAASL,EAAG,GAAG3Z,EACnB,IAASC,EAAI,EAAGA,EAAID,IAAKC,EACnB0Z,EAAG1Z,GAAGD,EAAIga,IACZA,EAASL,EAAG1Z,GAAGD,GAEnB,IAAIia,EAAK,IAAI5C,GAAI2C,EAAS,GACtBE,EAAMC,GAAGpa,EAAE+Z,EAAK,GAAIG,EAAI,GAC5B,GAAIC,EAAM3B,EAAI,CACRtY,EAAI,EAAR,IAAWma,EAAK,EACZC,EAAMH,EAAM3B,EAAI+B,EAAM,GAAKD,EAI/B,IAHAV,EAAGvX,MAAK,SAASwX,EAAG9B,GAClB,OAAOmC,EAAGnC,EAAE9X,GAAKia,EAAGL,EAAE5Z,IAAM4Z,EAAEF,EAAI5B,EAAE4B,CAC1C,IACWzZ,EAAID,IAAKC,EAAG,CACjB,IAAIsa,EAAOZ,EAAG1Z,GAAGD,EACjB,KAAIia,EAAGM,GAAQhC,GAIb,MAHA6B,GAAME,GAAO,GAAKJ,EAAMD,EAAGM,IAC3BN,EAAGM,GAAQhC,CAGd,CAED,IADA6B,KAAQC,EACDD,EAAK,GAAG,CACb,IAAII,EAAOb,EAAG1Z,GAAGD,EACbia,EAAGO,GAAQjC,EACb6B,GAAM,GAAK7B,EAAK0B,EAAGO,KAAU,IAE3Bva,CACL,CACD,KAAOA,GAAK,GAAKma,IAAMna,EAAG,CACxB,IAAIwa,EAAOd,EAAG1Z,GAAGD,EACbia,EAAGQ,IAASlC,MACZ0B,EAAGQ,KACHL,EAEL,CACDF,EAAM3B,CACP,CACD,MAAO,CAAC,IAAIpB,GAAG8C,GAAKC,EACtB,EACIC,GAAK,SAASja,EAAGsY,EAAGe,GACtB,OAAe,GAARrZ,EAAEF,EAAUiQ,KAAKyK,IAAIP,GAAGja,EAAEsY,EAAGA,EAAGe,EAAI,GAAIY,GAAGja,EAAEe,EAAGuX,EAAGe,EAAI,IAAMf,EAAEtY,EAAEF,GAAKuZ,CAC/E,EACIoB,GAAK,SAASC,GAEhB,IADA,IAAI5a,EAAI4a,EAAE/e,OACHmE,IAAM4a,IAAI5a,KAOjB,IALA,IAAI6a,EAAK,IAAIxD,KAAMrX,GACf8a,EAAM,EAAGC,EAAMH,EAAE,GAAII,EAAM,EAC3BC,EAAI,SAASnC,GACf+B,EAAGC,KAAShC,CAChB,EACW7Y,EAAI,EAAGA,GAAKD,IAAKC,EACxB,GAAI2a,EAAE3a,IAAM8a,GAAO9a,GAAKD,IACpBgb,MACC,CACH,IAAKD,GAAOC,EAAM,EAAG,CACnB,KAAOA,EAAM,IAAKA,GAAO,IACvBC,EAAE,OACAD,EAAM,IACRC,EAAED,EAAM,GAAKA,EAAM,IAAM,EAAI,MAAQA,EAAM,GAAK,EAAI,OACpDA,EAAM,EAEhB,MAAa,GAAIA,EAAM,EAAG,CAElB,IADAC,EAAEF,KAAQC,EACHA,EAAM,EAAGA,GAAO,EACrBC,EAAE,MACAD,EAAM,IACRC,EAAED,EAAM,GAAK,EAAI,MAAOA,EAAM,EACjC,CACD,KAAOA,KACLC,EAAEF,GACJC,EAAM,EACND,EAAMH,EAAE3a,EACT,CAEH,MAAO,CAAC4a,EAAGxB,SAAS,EAAGyB,GAAM9a,EAC/B,EACIkb,GAAO,SAASC,EAAIN,GAEtB,IADA,IAAIrC,EAAI,EACCvY,EAAI,EAAGA,EAAI4a,EAAGhf,SAAUoE,EAC/BuY,GAAK2C,EAAGlb,GAAK4a,EAAG5a,GAClB,OAAOuY,CACT,EACI4C,GAAQ,SAASC,EAAKC,EAAKC,GAC7B,IAAIvb,EAAIub,EAAI1f,OACR2E,EAAI2Y,GAAKmC,EAAM,GACnBD,EAAI7a,GAAS,IAAJR,EACTqb,EAAI7a,EAAI,GAAKR,IAAM,EACnBqb,EAAI7a,EAAI,GAAc,IAAT6a,EAAI7a,GACjB6a,EAAI7a,EAAI,GAAkB,IAAb6a,EAAI7a,EAAI,GACrB,IAAK,IAAIP,EAAI,EAAGA,EAAID,IAAKC,EACvBob,EAAI7a,EAAIP,EAAI,GAAKsb,EAAItb,GACvB,OAAqB,GAAbO,EAAI,EAAIR,EAClB,EACIwb,GAAO,SAASD,EAAKF,EAAKI,EAAOC,EAAMC,EAAIC,EAAI/D,EAAIgE,EAAIC,EAAIC,EAAI5b,GACjEmZ,GAAM+B,EAAKlb,IAAKsb,KACdE,EAAG,KAML,IALA,IAAIK,EAAMvC,GAAMkC,EAAI,IAAKM,EAAMD,EAAI,GAAIE,EAAMF,EAAI,GAC7CG,EAAM1C,GAAMmC,EAAI,IAAKQ,EAAMD,EAAI,GAAIE,EAAMF,EAAI,GAC7C9e,EAAKsd,GAAGsB,GAAMK,EAAOjf,EAAG,GAAIkf,EAAMlf,EAAG,GACrCC,EAAKqd,GAAGyB,GAAMI,EAAOlf,EAAG,GAAImf,EAAMnf,EAAG,GACrCof,EAAS,IAAIrF,GAAI,IACZpX,EAAI,EAAGA,EAAIqc,EAAKzgB,SAAUoE,EACjCyc,EAAiB,GAAVJ,EAAKrc,MACd,IAASA,EAAI,EAAGA,EAAIuc,EAAK3gB,SAAUoE,EACjCyc,EAAiB,GAAVF,EAAKvc,MAGd,IAFA,IAAI+D,EAAKyV,GAAMiD,EAAQ,GAAIC,EAAM3Y,EAAG,GAAI4Y,EAAO5Y,EAAG,GAC9C6Y,EAAO,GACJA,EAAO,IAAMF,EAAIhF,GAAKkF,EAAO,MAAOA,GAE3C,IAKIC,EAAIC,EAAIC,EAAIC,EALZC,EAAOnB,EAAK,GAAK,EACjBoB,EAAQjC,GAAKS,EAAI5C,IAAOmC,GAAKU,EAAI5C,IAAOnB,EACxCuF,EAAQlC,GAAKS,EAAIM,GAAOf,GAAKU,EAAIQ,GAAOvE,EAAK,GAAK,EAAIgF,EAAO3B,GAAKwB,EAAQC,IAAQ,EAAID,EAAO,IAAM,EAAIA,EAAO,IAAM,EAAIA,EAAO,KACnI,GAAIQ,GAAQC,GAASD,GAAQE,EAC3B,OAAOhC,GAAMC,EAAKlb,EAAGob,EAAIlC,SAASyC,EAAIA,EAAKC,IAG7C,GADAzC,GAAM+B,EAAKlb,EAAG,GAAKid,EAAQD,IAAShd,GAAK,EACrCid,EAAQD,EAAO,CACjBL,EAAKzE,GAAK4D,EAAKC,EAAK,GAAIa,EAAKd,EAAKe,EAAK3E,GAAK+D,EAAKC,EAAK,GAAIY,EAAKb,EAC/D,IAAIiB,EAAMhF,GAAKsE,EAAKC,EAAM,GAC1BtD,GAAM+B,EAAKlb,EAAGoc,EAAM,KACpBjD,GAAM+B,EAAKlb,EAAI,EAAGsc,EAAM,GACxBnD,GAAM+B,EAAKlb,EAAI,GAAI0c,EAAO,GAC1B1c,GAAK,GACL,IAASF,EAAI,EAAGA,EAAI4c,IAAQ5c,EAC1BqZ,GAAM+B,EAAKlb,EAAI,EAAIF,EAAG0c,EAAIhF,GAAK1X,KACjCE,GAAK,EAAI0c,EAET,IADA,IAAIS,EAAO,CAAChB,EAAME,GACTe,EAAK,EAAGA,EAAK,IAAKA,EACzB,KAAIC,EAAOF,EAAKC,GAChB,IAAStd,EAAI,EAAGA,EAAIud,EAAK3hB,SAAUoE,EAAG,CACpC,IAAIwd,EAAgB,GAAVD,EAAKvd,GACfqZ,GAAM+B,EAAKlb,EAAGkd,EAAII,IAAOtd,GAAKwc,EAAIc,GAC9BA,EAAM,KACRnE,GAAM+B,EAAKlb,EAAGqd,EAAKvd,KAAO,EAAI,KAAME,GAAKqd,EAAKvd,KAAO,GACxD,CANkB,CAQzB,MACI6c,EAAK7D,GAAK8D,EAAKhE,GAAKiE,EAAK9D,GAAK+D,EAAKjE,GAErC,IAAS/Y,EAAI,EAAGA,EAAI4b,IAAM5b,EACxB,GAAIyb,EAAKzb,GAAK,IAAK,CACbwd,EAAM/B,EAAKzb,KAAO,GAAK,GAC3BuZ,GAAQ6B,EAAKlb,EAAG2c,EAAGW,EAAM,MAAOtd,GAAK4c,EAAGU,EAAM,KAC1CA,EAAM,IACRnE,GAAM+B,EAAKlb,EAAGub,EAAKzb,KAAO,GAAK,IAAKE,GAAKsX,GAAKgG,IAChD,IAAIC,EAAgB,GAAVhC,EAAKzb,GACfuZ,GAAQ6B,EAAKlb,EAAG6c,EAAGU,IAAOvd,GAAK8c,EAAGS,GAC9BA,EAAM,IACRlE,GAAQ6B,EAAKlb,EAAGub,EAAKzb,KAAO,EAAI,MAAOE,GAAKuX,GAAKgG,GACzD,MACMlE,GAAQ6B,EAAKlb,EAAG2c,EAAGpB,EAAKzb,KAAME,GAAK4c,EAAGrB,EAAKzb,IAI/C,OADAuZ,GAAQ6B,EAAKlb,EAAG2c,EAAG,MACZ3c,EAAI4c,EAAG,IAChB,EACIY,GAAsB,IAAIpG,GAAI,CAAC,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,QAAS,QAAS,QAAS,UA8GjGqG,GAAO,SAASrC,EAAKsC,EAAKC,EAAKC,EAAMC,GACvC,OA9GS,SAASzC,EAAK0C,EAAKC,EAAMJ,EAAKC,EAAMI,GAC7C,IAAIne,EAAIub,EAAI1f,OACR2E,EAAI,IAAI2W,GAAG2G,EAAM9d,EAAI,GAAK,EAAIiQ,KAAKmO,MAAMpe,EAAI,MAAQ+d,GACrD9C,EAAIza,EAAE6Y,SAASyE,EAAKtd,EAAE3E,OAASkiB,GAC/BzC,EAAM,EACV,IAAK2C,GAAOje,EAAI,EACd,IAAK,IAAIC,EAAI,EAAGA,GAAKD,EAAGC,GAAK,MAAO,CAClC,IAAIiB,EAAIjB,EAAI,MACRiB,EAAIlB,EACNsb,EAAMF,GAAMH,EAAGK,EAAKC,EAAIlC,SAASpZ,EAAGiB,KAEpC+Z,EAAEhb,GAAKke,EACP7C,EAAMF,GAAMH,EAAGK,EAAKC,EAAIlC,SAASpZ,EAAGD,IAEvC,KACI,CAYL,IAXA,IAAI6d,EAAMF,GAAIM,EAAM,GAChB/d,EAAI2d,IAAQ,GAAIjD,EAAU,KAANiD,EACpBQ,GAAS,GAAKH,GAAQ,EACtBI,EAAO,IAAIjH,GAAI,OAAQkH,EAAO,IAAIlH,GAAIgH,EAAQ,GAC9CG,EAAQvO,KAAKwO,KAAKP,EAAO,GAAIQ,EAAQ,EAAIF,EACzCG,EAAM,SAAS5E,GACjB,OAAQwB,EAAIxB,GAAMwB,EAAIxB,EAAK,IAAMyE,EAAQjD,EAAIxB,EAAK,IAAM2E,GAASL,CACvE,EACQ3C,EAAO,IAAInE,GAAI,MACfoE,EAAK,IAAItE,GAAI,KAAMuE,EAAK,IAAIvE,GAAI,IAChCuH,EAAO,EAAG/G,EAAK,EAAUgE,GAAP5b,EAAI,EAAQ,GAAG4e,EAAK,EAAG/C,EAAK,EAC3C7b,EAAID,IAAKC,EAAG,CACjB,IAAI6e,EAAKH,EAAI1e,GACT8e,EAAW,MAAJ9e,EACP+e,EAAQT,EAAKO,GAGjB,GAFAR,EAAKS,GAAQC,EACbT,EAAKO,GAAMC,EACPF,GAAM5e,EAAG,CACX,IAAIgf,EAAMjf,EAAIC,EACd,IAAK2e,EAAO,KAAO/C,EAAK,QAAUoD,EAAM,IAAK,CAC3C3D,EAAME,GAAKD,EAAKN,EAAG,EAAGS,EAAMC,EAAIC,EAAI/D,EAAIgE,EAAIC,EAAI7b,EAAI6b,EAAIR,GACxDO,EAAK+C,EAAO/G,EAAK,EAAGiE,EAAK7b,EACzB,IAAK,IAAI8X,EAAI,EAAGA,EAAI,MAAOA,EACzB4D,EAAG5D,GAAK,EACV,IAASA,EAAI,EAAGA,EAAI,KAAMA,EACxB6D,EAAG7D,GAAK,CACX,CACD,IAAIS,EAAI,EAAGe,EAAI,EAAG2F,EAAOtE,EAAGuE,EAAMJ,EAAOC,EAAQ,MACjD,GAAIC,EAAM,GAAKH,GAAMH,EAAI1e,EAAIkf,GAI3B,IAHA,IAAIC,EAAOnP,KAAKoP,IAAInf,EAAG+e,GAAO,EAC1BK,EAAOrP,KAAKoP,IAAI,MAAOpf,GACvBsf,EAAKtP,KAAKoP,IAAI,IAAKJ,GAChBE,GAAOG,KAAUJ,GAAQH,GAAQC,GAAO,CAC7C,GAAIzD,EAAItb,EAAIuY,IAAM+C,EAAItb,EAAIuY,EAAI2G,GAAM,CAElC,IADA,IAAIK,EAAK,EACFA,EAAKD,GAAMhE,EAAItb,EAAIuf,IAAOjE,EAAItb,EAAIuf,EAAKL,KAAQK,GAEtD,GAAIA,EAAKhH,EAAG,CAEV,GADAA,EAAIgH,EAAIjG,EAAI4F,EACRK,EAAKJ,EACP,MACF,IAAIK,EAAMxP,KAAKoP,IAAIF,EAAKK,EAAK,GACzBE,EAAK,EACT,IAAS3H,EAAI,EAAGA,EAAI0H,IAAO1H,EAAG,CAC5B,IAAI4H,EAAK1f,EAAIkf,EAAMpH,EAAI,MAAQ,MAE3BO,EAAKqH,EADCrB,EAAKqB,GACK,MAAQ,MACxBrH,EAAKoH,IACPA,EAAKpH,EAAI0G,EAAQW,EACpB,CACF,CACF,CAEDR,IADAJ,EAAOC,IAAOA,EAAQV,EAAKS,IACL,MAAQ,KAC/B,CAEH,GAAIxF,EAAG,CACLmC,EAAKG,KAAQ,UAAY5D,GAAMO,IAAM,GAAKN,GAAMqB,GAChD,IAAIqG,EAAiB,GAAX3H,GAAMO,GAASqH,EAAiB,GAAX3H,GAAMqB,GACrC1B,GAAMJ,GAAKmI,GAAOlI,GAAKmI,KACrBlE,EAAG,IAAMiE,KACThE,EAAGiE,GACLhB,EAAK5e,EAAIuY,IACPoG,CACZ,MACUlD,EAAKG,KAAQN,EAAItb,KACf0b,EAAGJ,EAAItb,GAEZ,CACF,CACDqb,EAAME,GAAKD,EAAKN,EAAGkD,EAAKzC,EAAMC,EAAIC,EAAI/D,EAAIgE,EAAIC,EAAI7b,EAAI6b,EAAIR,EAC3D,CACD,OAAOlC,GAAI5Y,EAAG,EAAGsd,EAAM3E,GAAKmC,GAAOyC,EACrC,CAqBS+B,CAAKvE,EAAkB,MAAbsC,EAAItQ,MAAgB,EAAIsQ,EAAItQ,MAAkB,MAAXsQ,EAAIkC,IAAc9P,KAAKwO,KAAuD,IAAlDxO,KAAKyK,IAAI,EAAGzK,KAAKoP,IAAI,GAAIpP,KAAKxU,IAAI8f,EAAI1f,WAAmB,GAAKgiB,EAAIkC,IAAKjC,EAAKC,GAAOC,EACrK,EAeA,SAASgC,GAASC,EAAMC,QACT,IAATA,IACFA,EAAO,CAAA,GAET,IAAItG,EAxCM,WACV,IAAIA,EAAI,EAAG9B,EAAI,EACf,MAAO,CACL3X,EAAG,SAASoZ,GAGV,IAFA,IAAIrZ,EAAI0Z,EAAGjZ,EAAImX,EACXU,EAAIe,EAAE1d,OACDoE,EAAI,EAAGA,GAAKuY,GAAK,CAExB,IADA,IAAItX,EAAI+O,KAAKoP,IAAIpf,EAAI,KAAMuY,GACpBvY,EAAIiB,IAAKjB,EACHU,GAAXT,GAAKqZ,EAAEtZ,GACTC,GAAK,MAAOS,GAAK,KAClB,CACDiZ,EAAI1Z,EAAG4X,EAAInX,CACZ,EACD4Y,EAAG,WACD,OAAQK,IAAM,GAAK,IAAU,IAAJ9B,IAAY,EAAIA,IAAM,GAAyB,IAAd,IAAJ8B,IAAY,GACnE,EAEL,CAsBUuG,GACRvG,EAAEzZ,EAAE8f,GACJ,IAhBiBrF,EACbwF,EAAcC,EAed9G,EAAIqE,GAAKqC,EAAMC,EAAM,EAAG,GAC5B,OAjBiBtF,EAiBNrB,EAhBP6G,EAgBUF,EAhBH3S,MAAO8S,EAAY,GAAND,EAAU,EAAIA,EAAK,EAAI,EAAU,GAANA,EAAU,EAAI,EACjExF,EAAE,GAAK,IAAKA,EAAE,GAAKyF,GAAO,GAAKA,EAAM,GAAK,EAAIA,EAAM,GANzC,SAAS9G,EAAGzB,EAAGgB,GAC1B,KAAOA,IAAKhB,EACVyB,EAAEzB,GAAKgB,EAAGA,KAAO,CACrB,CAkBuBwH,CAAO/G,EAAGA,EAAE1d,OAAS,EAAG+d,EAAEL,KAAMA,CACvD,CAgDA,MCrqBMgH,GAAQ/gB,IACZ,MAAMwE,EAAK,IACNxE,EACHsZ,EDkqBS,MChqBX,OD+oBF,SAAmByC,EAAKiF,GACtB,IAAIvf,EAAI,GACR,IAAKuf,GAAgC,oBAAfC,YACpB,OAAO,IAAIA,aAAcC,OAAOnF,GAClC,IAAK,IAAItb,EAAI,EAAGA,EAAIsb,EAAI1f,QAAU,CAChC,IAAI+e,EAAIW,EAAItb,KACR2a,EAAI,KAAO4F,EACbvf,GAAK4T,OAAO8L,aAAa/F,GAClBA,EAAI,IACX3Z,GAAK4T,OAAO8L,cAAkB,GAAJ/F,IAAW,EAAe,GAAXW,EAAItb,MACtC2a,EAAI,IACX3Z,GAAK4T,OAAO8L,cAAkB,GAAJ/F,IAAW,IAAiB,GAAXW,EAAItb,OAAc,EAAe,GAAXsb,EAAItb,OAErE2a,IAAU,GAAJA,IAAW,IAAiB,GAAXW,EAAItb,OAAc,IAAiB,GAAXsb,EAAItb,OAAc,EAAe,GAAXsb,EAAItb,MAAa,MAAOgB,GAAK4T,OAAO8L,aAAa,MAAQ/F,GAAK,GAAI,MAAY,KAAJA,GAClJ,CACD,OAAO3Z,CACT,CC/pBS2f,CAAUZ,GDonBnB,SAAiBvY,EAAK+Y,GACpB,IAAIhI,EAAI/Q,EAAI5L,OACZ,IAAK2kB,GAAgC,oBAAfK,YACpB,OAAO,IAAIA,aAAcC,OAAOrZ,GAMlC,IALA,IAAItG,EAAK,IAAIgW,GAAG1P,EAAI5L,QAAU4L,EAAI5L,SAAW,IACzCklB,EAAK,EACL9F,EAAI,SAASnC,GACf3X,EAAG4f,KAAQjI,CACf,EACW7Y,EAAI,EAAGA,EAAIuY,IAAKvY,EAAG,CAC1B,GAAI8gB,EAAK,EAAI5f,EAAGtF,OAAQ,CACtB,IAAIqE,EAAI,IAAIiX,GAAG4J,EAAK,GAAKvI,EAAIvY,GAAK,IAClCC,EAAE7B,IAAI8C,GACNA,EAAKjB,CACN,CACD,IAAI0a,EAAInT,EAAIE,WAAW1H,GACnB2a,EAAI,KAAO4F,EACbvF,EAAEL,GACKA,EAAI,MACXK,EAAE,IAAML,IAAM,GAAIK,EAAE,IAAU,GAAJL,IACnBA,EAAI,OAASA,EAAI,OACmCK,EAAE,KAA7DL,EAAI,OAAa,QAAJA,GAAwC,KAAtBnT,EAAIE,aAAa1H,MAAyB,IAAKgb,EAAE,IAAML,IAAM,GAAK,IAAKK,EAAE,IAAML,IAAM,EAAI,IAAKK,EAAE,IAAU,GAAJL,KAErIK,EAAE,IAAML,IAAM,IAAKK,EAAE,IAAML,IAAM,EAAI,IAAKK,EAAE,IAAU,GAAJL,GACrD,CACD,OAAOxB,GAAIjY,EAAI,EAAG4f,EACpB,CC9oB4BC,CAAQ1Z,KAAKC,UAAUvD,MAAO,EAAK,QCMlDid,GAUX,WAAAjU,CACEkU,EACAlT,EACAxK,EACA2d,SAbFjmB,KAASkmB,UAAgB,GACzBlmB,KAAYmmB,cAAG,EAsFfnmB,KAAAomB,cAAiB9hB,IACf,MAAM+hB,EAAchB,GAAK/gB,GACzB,OAAO8H,KAAKC,UAAUga,EAAY,EAG5BrmB,KAAAsmB,4BAA8B,CAACC,EAAyB3O,KAC1D5X,KAAKgmB,eAAiBhmB,KAAKsI,UAC7BtI,KAAKgmB,cAAcQ,SAAS,CAC1BliB,MAAO,CAAE2G,KAAM,SAAU8Z,KAAMwB,GAC/B3O,YACAtP,SAAUtI,KAAKsI,UAElB,EAGItI,KAAAymB,mBAAqB,CAACniB,EAAsBsT,KACjD,GAAI5X,KAAK0mB,OAEP,IACE1mB,KAAK0mB,OAAOC,YAAY,CAAEriB,QAAOsT,aAClC,CAAC,MAAOyB,GAEU,mBAAbA,EAAInO,KAENlL,KAAK0mB,OAAOC,YAAYva,KAAKC,UAAU,CAAE/H,QAAOsT,eAEhD5X,KAAK8S,OAAOrR,eAAeV,KAAK,oDAAqDsY,EAExF,KACI,CACL,MAAMkN,EAAkBvmB,KAAKomB,cAAc9hB,GAC3CtE,KAAKsmB,4BAA4BC,EAAiB3O,EACnD,GAGI5X,KAAS4mB,UAAG,WACJ,QAAb3kB,EAAAjC,KAAK0mB,cAAQ,IAAAzkB,GAAAA,EAAA2kB,WAAW,EA5GxB,MAAMpS,EAAcrV,IAOpB,GANAa,KAAK6mB,mBAAqBrS,GAAe,wBAAyBA,EAClExU,KAAKgmB,cAAgBA,EACrBhmB,KAAK8S,OAASA,EACd9S,KAAKsI,SAAWA,EAChBtI,KAAK8mB,SAAoC,QAA1B7kB,EAAA6Q,EAAO+C,yBAAmB,IAAA5T,OAAA,EAAAA,EAAA6kB,UAtBrB,IAwBhBb,EAAc,CAChBnT,EAAOrR,eAAelB,IAAI,sDAE1B,MAAMmmB,EAAS,IAAIK,OAAOC,IAAIC,gBAAgB,IAAIC,KAAK,CAACjB,GAAe,CAAEhb,KAAM,6BAC/Eyb,EAAOS,QAAWnhB,IAChB8M,EAAOrR,eAAeT,MAAMgF,EAAE,EAEhC0gB,EAAOU,UAAaphB,IAClB,MAAMugB,gBAAEA,EAAe3O,UAAEA,GAAc5R,EAAE+e,KACzC/kB,KAAKsmB,4BAA4BC,EAAiB3O,EAAU,EAG9D5X,KAAK0mB,OAASA,CACf,CACF,CAGM,sBAAAW,GACArnB,KAAKmmB,eACRnmB,KAAKmmB,cAAe,EACpBmB,qBACGC,IACCvnB,KAAKwnB,aAAaD,EAAa,GAEjC,CAAET,QAAS9mB,KAAK8mB,UAGrB,CAGM,YAAAW,CAAanjB,EAAsBsT,SACpC5X,KAAK6mB,qBAAqD,QAA/B5kB,EAAAjC,KAAK8S,OAAO+C,yBAAmB,IAAA5T,OAAA,EAAAA,EAAAwP,UAC5DzR,KAAK8S,OAAOrR,eAAeP,MAAM,oDACjClB,KAAKkmB,UAAU1hB,KAAK,CAAEF,QAAOsT,cAC7B5X,KAAKqnB,2BAELrnB,KAAK8S,OAAOrR,eAAeP,MAAM,2CACjClB,KAAKymB,mBAAmBniB,EAAOsT,GAElC,CAGM,YAAA4P,CAAaD,GAElB,KAAOvnB,KAAKkmB,UAAUvlB,OAAS,IAAM4mB,EAAaG,gBAAkB,GAAKH,EAAaI,aAAa,CACjG,MAAMC,EAAO5nB,KAAKkmB,UAAU2B,QAC5B,GAAID,EAAM,CACR,MAAMtjB,MAAEA,EAAKsT,UAAEA,GAAcgQ,EAC7B5nB,KAAKymB,mBAAmBniB,EAAOsT,EAChC,CACF,CAGG5X,KAAKkmB,UAAUvlB,OAAS,EAC1B2mB,qBACGC,IACCvnB,KAAKwnB,aAAaD,EAAa,GAEjC,CAAET,QAAS9mB,KAAK8mB,UAGlB9mB,KAAKmmB,cAAe,CAEvB,EClGI,MAGM2B,GAAkB,qDCFlBC,GAAU,gBCqBVC,GASX,WAAAlW,EAAY2B,eACVA,EAAchS,eACdA,EAAcwmB,eACdA,IAVFjoB,KAAUkoB,WAAG,GAEbloB,KAAYsX,aAAG,IACPtX,KAASmoB,UAAyC,KAE1DnoB,KAAKoE,MAAsC,GAWzCpE,KAAKyB,eAAiBA,EACtBzB,KAAKioB,eAAiBA,GAAkC,CAACzX,GAAYA,GACrExQ,KAAKyT,eAAiBA,CACvB,CAED,cAAA2U,CAAeC,GACbroB,KAAKsoB,WACAtlB,OAAA4B,OAAA5B,OAAA4B,OAAA,CAAA,EAAAyjB,GACH,CAAA9Q,SAAU,EACVuP,QAAS,IAEZ,CAED,UAAAwB,IAAcC,GACIA,EAAKzM,QAAQ0M,GACvBA,EAAQjR,UAAYiR,EAAQnnB,iBAAmB,IACjDmnB,EAAQjR,UAAY,GACb,IAETvX,KAAKoZ,gBAAgB,CACnBoP,UACAnP,IF3DoC,qEE6D/B,KAED3U,SAAS8jB,IACfxoB,KAAKoE,MAAQpE,KAAKoE,MAAMrF,OAAOypB,GACP,IAApBA,EAAQ1B,QAKZpO,YAAW,KACT8P,EAAQ1B,QAAU,EAClB9mB,KAAKyoB,SAAS,EAAE,GACfD,EAAQ1B,SAPT9mB,KAAKyoB,SAAS,EAOG,GAEtB,CAED,QAAAA,CAAS3B,GACH9mB,KAAKmoB,YACTnoB,KAAKmoB,UAAYzP,YAAW,KACrB1Y,KAAK0oB,OAAM,GAAMzc,MAAK,KACrBjM,KAAKoE,MAAMzD,OAAS,GACtBX,KAAKyoB,SAAS3B,EACf,GACD,GACDA,GACJ,CAEK,KAAA4B,CAAMC,GAAW,4CACrB,MAAMJ,EAA0C,GAC1CK,EAA2C,GACjD5oB,KAAKoE,MAAMM,SAAS8jB,GAAiC,IAApBA,EAAQ1B,QAAgByB,EAAK/jB,KAAKgkB,GAAWI,EAAMpkB,KAAKgkB,KACzFxoB,KAAKoE,MAAQwkB,EAET5oB,KAAKmoB,YACPrP,aAAa9Y,KAAKmoB,WAClBnoB,KAAKmoB,UAAY,YAGbvoB,QAAQipB,IAAIN,EAAKhd,KAAKid,GAAYxoB,KAAK2M,KAAK6b,EAASG,QAC5D,CAEK,IAAAhc,CAAK6b,EAA0CG,GAAW,oDAC9D,MAAMpmB,EAASimB,EAAQjmB,OACvB,IAAKA,EACH,OAAOvC,KAAKoZ,gBAAgB,CAAEoP,UAASnP,IFtGN,+DEwGnC,MAAM/Q,EAAWkgB,EAAQlgB,SACzB,IAAKA,EACH,OAAOtI,KAAKoZ,gBAAgB,CAAEoP,UAASnP,IF3GJ,iEE6GrC,MAAMyP,EfZmB,MAC3B,MAAMtU,EAAcrV,IACpB,OAAOqV,eAAAA,EAAauU,UAAWvU,EAAYuU,SAASC,KAAO,EAAE,EeU/CC,GACNrT,EAAUmS,GACVtS,EAAa+S,EAAQ/S,WACrBsD,EAAY,IAAIS,gBAAgB,CACpC0P,UAAW5gB,EACX6gB,WAAY,GAAGX,EAAQ5Q,YACvB3M,KAAM,GAAGud,EAAQvd,SAEbme,EAAuB,IAAkB,UAAfZ,EAAQ5S,eAAO,IAAA3T,OAAA,EAAAA,EAAEgJ,OAAQ,yBAAgB/I,EAAAsmB,EAAQ5S,8BAASA,UAAWA,IAC/FpF,EAAUxQ,KAAKioB,eAAe,CAClCrS,QAAS,EACTyT,OAAQb,EAAQa,SAGlB,GAA8B,IAA1B7Y,EAAQ6Y,OAAO1oB,OAKnB,IACE,MAAMqB,EAAuB,CAC3B+O,QAAS,CACP,eAAgB,mBAChBC,OAAQ,MACRsY,cAAe,UAAU/mB,IACzB,mBAAoBqT,EACpB,mBAAoBwT,EACpB,eAAgBN,EAAIxT,UAAU,ElBhHV,KkBiHpB,uBAAwB,GAAGG,KAE7BzH,KAAM5B,KAAKC,UAAUmE,GACrBS,OAAQ,QAGJrP,EAAY,GAAG0B,EAAaklB,EAAQ3mB,WAAY7B,KAAKyT,mBAAmBsF,EAAUa,aAClFX,QAAYnI,MAAMlP,EAAWI,GACnC,GAAY,OAARiX,EAEF,YADAjZ,KAAKoZ,gBAAgB,CAAEoP,UAASnP,IFtJA,8BEyJlC,GAAKsP,EASH3oB,KAAKupB,cAActQ,EAAIpL,OAAQ2a,OATlB,CACb,IAAIgB,EAAe,GACnB,IACEA,EAAepd,KAAKC,UAAU4M,EAAIjL,KAAM,KAAM,EAC/C,CAAC,MAAM7L,GAEP,CACDnC,KAAKoZ,gBAAgB,CAAEoP,UAASvO,QAAS,GAAGhB,EAAIpL,WAAW2b,KAC5D,CAGF,CAAC,MAAOxjB,GACPhG,KAAKoZ,gBAAgB,CAAEoP,UAASnP,IAAKrT,GACtC,MAtCChG,KAAKoZ,gBAAgB,CAAEoP,cAuC1B,CAED,aAAAe,CAAc1b,EAAgB2a,GAE5B,QADqB,IAAI9b,GAAgBoB,YAAYD,IAEnD,KAAKhP,EAAOkP,QACV/N,KAAKypB,sBAAsBjB,GAC3B,MACF,KAAK3pB,EAAOsR,OACVnQ,KAAK0pB,oBAAoBlB,GACzB,MACF,QACExoB,KAAKoZ,gBAAgB,CAAEoP,UAASnP,IFlLQ,iDEoL7C,CAED,qBAAAoQ,CAAsBjB,GACpB,MAAMmB,EAAmB5U,KAAKC,MAAM,IAAIkS,KAAKsB,EAAQa,QAAQO,KlB7J1C,MkB8JnB5pB,KAAKoZ,gBAAgB,CACnBoP,UACAvO,QAAS,kEAAkEuO,EAAQ5Q,8BAA8B+R,QAEpH,CAED,mBAAAD,CAAoBlB,GAClBxoB,KAAKsoB,WACAtlB,OAAA4B,OAAA5B,OAAA4B,OAAA,GAAA4jB,IACH1B,QAAS0B,EAAQjR,SAAWvX,KAAKsX,eAEpC,CAED,eAAA8B,EAAgBoP,QACdA,EAAOnP,IACPA,EAAGY,QACHA,IAMKuO,EAAQqB,aACTxQ,EACFrZ,KAAKyB,eAAeV,KAAKsY,GAChBY,GACTja,KAAKyB,eAAelB,IAAI0Z,EAE3B,QC1MmB6P,GAQpB,mBAAWC,GACT,OAAO/pB,KAAKgqB,gBACb,CAED,WAAAlY,CAAYtR,aAVJR,KAAWiqB,YnBWO,ImBVlBjqB,KAAWkqB,YnBWO,ImBVlBlqB,KAAsBmqB,uBnBMG,ImBLzBnqB,KAAAoqB,SAAWpqB,KAAKiqB,YAChBjqB,KAAAgqB,iBAAmBpe,KAAKoM,MAuDhChY,KAAAqqB,sBAAwB,CAAChB,EAAgBiB,KACvC,MAAMC,EAAkBvqB,KAAKwqB,cAAcF,GAI3C,OAHyBtqB,KAAKyqB,mBAAmBpB,GAG1BkB,GAAmBvqB,KAAKmqB,2BAG3Cve,KAAKoM,MAAQhY,KAAK+pB,gBAAkB/pB,KAAKoqB,UAAYf,EAAO1oB,UAC9DX,KAAKoqB,SAAWrV,KAAKoP,IAAInkB,KAAKkqB,YAAalqB,KAAKoqB,SAAWpqB,KAAKiqB,aAChEjqB,KAAKgqB,iBAAmBpe,KAAKoM,OACtB,EAEG,EA7DZhY,KAAKyB,eAAiBjB,EAAKiB,eAC3BzB,KAAKiqB,YAAkC,QAApBhoB,EAAAzB,EAAKypB,mBAAe,IAAAhoB,EAAAA,EAAAjC,KAAKiqB,YAC5CjqB,KAAKkqB,YAAkC,QAApBhoB,EAAA1B,EAAK0pB,mBAAe,IAAAhoB,EAAAA,EAAAlC,KAAKkqB,YAC5ClqB,KAAKmqB,uBAAwD,QAA/BhoB,EAAA3B,EAAK2pB,8BAA0B,IAAAhoB,EAAAA,EAAAnC,KAAKmqB,sBACnE,CAeO,aAAAK,CAAcje,GACpB,OAAOA,EAAI5L,MACZ,CAMO,kBAAA8pB,CAAmBpB,GACzB,IAAIqB,EAAY,EAChB,IAAK,MAAMpmB,KAAS+kB,EAClBqB,GAAa1qB,KAAKwqB,cAAclmB,GASlC,OAAOomB,GAFU,EAAI3V,KAAKyK,IAAI,EAAG6J,EAAO1oB,OAAS,GAAqB,EAAhB0oB,EAAO1oB,OAG9D,EC7DH,IAAYgqB,IAAZ,SAAYA,GACVA,EAAA,UAAA,YACAA,EAAA,KAAA,MACD,CAHD,CAAYA,KAAAA,GAGX,CAAA,ICCM,MAAMC,GAAqB,yBACrBC,GAAqB,kBAgD5BC,GAAyBC,GAAgCta,OAAA,OAAA,OAAA,GAAA,YAC7D,KAAOsa,EAAapqB,OAAS,GAAG,CAC9B,MAAMqqB,EAAY,GACZC,EAAQF,EAAaG,OAAO,EAAGF,SAC/BprB,QAAQipB,IAAIoC,EACnB,CACH,IAEaE,GAAsBC,IACjC,IAAIC,EACAC,EAaJ,OAZKF,EAAGG,iBAAiBC,SAASZ,MAChCU,EAAuBF,EAAGK,kBAAkBb,GAAoB,CAC9Dc,QAAS,eAGRN,EAAGG,iBAAiBC,SAASX,MAChCQ,EAAiBD,EAAGK,kBAAkBZ,GAAoB,CACxDa,QAAS,aACTC,eAAe,IAEjBN,EAAeO,YAAY,YAAa,cAEnC,CACLP,iBACAC,uBACD,EAcG,MAAOO,WAAoC/B,GAI/C,WAAAhY,CAAYtR,GACVgV,MAAMhV,GA2CRR,KAAkB8rB,mBAAG,IAAkErb,EAAAzQ,UAAA,OAAA,GAAA,YACrF,IACE,MAAM+rB,EAA8C,GACpD,IAAIC,QAAehsB,KAAKorB,GAAGa,YAAY,mBAAmBC,MAAMC,aAChE,KAAOH,GAAQ,CACb,MAAMpU,UAAEA,EAASyR,OAAEA,GAAW2C,EAAOrmB,MACrComB,EAAUvnB,KAAK,CACb6kB,SACA+C,WAAYJ,EAAO3kB,IACnBuQ,cAEFoU,QAAeA,EAAOK,UACvB,CAED,OAAON,CACR,CAAC,MAAO/lB,GACPhG,KAAKyB,eAAeV,KAAK,GAAG+mB,OAAoB9hB,IACjD,CAEH,IAEAhG,KAAAssB,qBAA8B1U,GAAqBnH,EAAAzQ,UAAA,OAAA,GAAA,YACjD,IACE,MAAMusB,QAA4BvsB,KAAKorB,GAAGloB,IAA8B0nB,GAAoBhT,GAC5F,IAAK2U,EACH,OAGF,MAAMH,QAAmBpsB,KAAKorB,GAAGoB,IAAuB3B,GAAoB,CAC1EjT,UAAWA,EACXyR,OAAQkD,EAAoBlD,SAQ9B,aALMrpB,KAAKorB,GAAGoB,IAA8B5B,GAAoB,CAC9DhT,YACAyR,OAAQ,KAILrmB,OAAA4B,OAAA5B,OAAA4B,OAAA,GAAA2nB,IACH3U,YACAwU,cAEH,CAAC,MAAOpmB,GACPhG,KAAKyB,eAAeV,KAAK,GAAG+mB,OAAoB9hB,IACjD,CAEH,IAEAhG,KAAAysB,0BAA4B,CAAO7U,EAAmBtT,IAAiBmM,EAAAzQ,UAAA,OAAA,GAAA,YACrE,IACE,MAAM0sB,EAAK1sB,KAAKorB,GAAGa,YAAmDrB,GAAoB,aACpF+B,QAAuBD,EAAGR,MAAMhpB,IAAI0U,GAC1C,IAAK+U,EAEH,kBADMD,EAAGR,MAAMM,IAAI,CAAE5U,YAAWyR,OAAQ,CAAC/kB,MAG3C,IAAIsoB,EACJ,GAAI5sB,KAAKqqB,sBAAsBsC,EAAetD,OAAQ/kB,GACpDsoB,EAAeD,EAAetD,aAExBqD,EAAGR,MAAMM,IAAI,CAAE5U,YAAWyR,OAAQ,CAAC/kB,SACpC,CAEL,MAAMuoB,EAAgBF,EAAetD,OAAOtqB,OAAOuF,SAC7CooB,EAAGR,MAAMM,IAAI,CAAE5U,YAAWyR,OAAQwD,GACzC,CAGD,SADMH,EAAG9mB,MACJgnB,EACH,OAGF,MAAMR,QAAmBpsB,KAAK8sB,mBAAmBlV,EAAWgV,GAE5D,IAAKR,EACH,OAGF,MAAO,CACL/C,OAAQuD,EACRhV,YACAwU,aAEH,CAAC,MAAOpmB,GACPhG,KAAKyB,eAAeV,KAAK,GAAG+mB,OAAoB9hB,IACjD,CAEH,IAEAhG,KAAA8sB,mBAAqB,CAAOlV,EAAmByR,IAAkB5Y,EAAAzQ,UAAA,OAAA,GAAA,YAC/D,IAKE,aAJyBA,KAAKorB,GAAGoB,IAAuB3B,GAAoB,CAC1EjT,UAAWA,EACXyR,OAAQA,GAGX,CAAC,MAAOrjB,GACPhG,KAAKyB,eAAeV,KAAK,GAAG+mB,OAAoB9hB,IACjD,CAEH,IAEAhG,KAAA+sB,0BAA4B,CAAOC,EAAoBZ,IAAuB3b,EAAAzQ,UAAA,OAAA,GAAA,YAC5E,GAAKosB,EAGL,UACQpsB,KAAKorB,GAAGnhB,OAA0B4gB,GAAoBuB,EAC7D,CAAC,MAAOpmB,GACPhG,KAAKyB,eAAeV,KAAK,GAAG+mB,OAAoB9hB,IACjD,CACH,IAEAhG,KAAAitB,0BAAmCrV,GAA+BnH,EAAAzQ,UAAA,OAAA,GAAA,YAChE,IACE,MAAMktB,QA7OwB,WAClC,MAAM1Y,EAAcrV,IACpB,OAAO,IAAIS,SAAQ,CAACC,EAASstB,KAC3B,IAAK3Y,EACH,OAAO2Y,EAAO,IAAIlsB,MAAM,2BAG1B,IAAKuT,EAAY4Y,UACf,OAAOD,EAAO,IAAIlsB,MAAM,0CAG1B,IACE,MAAMosB,EAAU7Y,EAAY4Y,UAAUE,KAAK,gBAC3CD,EAAQE,gBAAkB,WACO,IAA3BF,EAAQrhB,OAAO4J,UACjByX,EAAQrhB,OAAOwhB,QACfH,EAAQpB,aAAeoB,EAAQpB,YAAYtT,QAC3CnE,EAAY4Y,UAAUK,eAAe,gBACrC5tB,IAEJ,EACAwtB,EAAQK,UAAY,WAClB7tB,EAAQwtB,EAAQrhB,OAClB,EACAqhB,EAAQlG,QAAU,WAChBgG,EAAOE,EAAQrsB,MACjB,CACD,CAAC,MAAOgF,GACPmnB,EAAOnnB,EACR,IAEL,CA8M6B2nB,GACvB,IAAKT,EACH,OAGF,MAAMU,EAAoC,CAAOC,EAA0BC,IAAiCrd,EAAAzQ,UAAA,OAAA,GAAA,YAC1G,MAAM+tB,EAA0BD,EAAaE,iBACvCC,EAAkF,GAExFjrB,OAAOiE,KAAK8mB,GAAyBrpB,SAAS0nB,IAC5C,MAAM8B,EAAoBC,SAAS/B,EAAY,IACzCgC,EAAWL,EAAwBG,GACzC,GAAIA,IAAsBJ,EAAaO,kBAAmB,CACxD,MAAMC,EAA0EF,EAAS/E,OAAO9d,KACvFjH,qCAAU,OAAAtE,KAAKysB,0BAA0BoB,EAAkBvpB,EAAM,MAE1E2pB,EAAgBzpB,QAAQ8pB,EACzB,MAAUF,EAASvgB,SAAW8c,GAAgB4D,MAC7CN,EAAgBzpB,KAAKxE,KAAK8sB,mBAAmBe,EAAkBO,EAAS/E,QACzE,UAGGyB,GAAgBmD,EACxB,IAEM/F,EAAa,GAAGppB,KAAkBkB,KAAKuC,OAAO+S,UAAU,EAAG,MACjE,IACE,MAAMkZ,EAAgBtB,EAASjB,YAAY,UAAUwC,YAAY,UAAUC,OAAOxG,GAC5EyG,EAAoB,IAAI/uB,SAAeC,IAC3C2uB,EAAcd,UAAmB1nB,GAAKyK,EAAAzQ,UAAA,OAAA,GAAA,YACpC,MAAM4uB,EAAiC5oB,GAAOA,EAAE6oB,OAAsB7iB,OAChE8iB,EAA8BF,GAAkCA,EAA+B,GACrG,GAAIE,EAA6B,CAC/B,MAAMb,EAAkC,GAExCjrB,OAAOiE,KAAK6nB,GAA6BpqB,SAASqqB,IAChD,MAAMlB,EAAmBM,SAASY,EAAiB,IAC7CC,EAAkBF,EAA4BjB,GAEpD,GAAIjW,IAAciW,EAChBI,EAAgBzpB,KAAKopB,EAAkCC,EAAkBmB,QACpE,CACL,MAAMC,EAAsBD,EAAgBhB,iBAC5ChrB,OAAOiE,KAAKgoB,GAAqBvqB,SAAS0nB,IACxC,MAAM8B,EAAoBC,SAAS/B,EAAY,IAC3C6C,EAAoBf,GAAmBrgB,SAAW8c,GAAgB4D,MACpEN,EAAgBzpB,KACdxE,KAAK8sB,mBAAmBe,EAAkBoB,EAAoBf,GAAmB7E,QAEpF,GAEJ,WAGGyB,GAAgBmD,EACvB,CACDpuB,GACF,GAAC,UAGG8uB,EACN,MAAMna,EAAcrV,IAChBqV,GACFA,EAAY4Y,UAAUK,eAAe,eAExC,CAAC,MAAOznB,GACPhG,KAAKyB,eAAeV,KAAK,wEAAwEiF,IAClG,CACF,CAAC,MAAOA,GACPhG,KAAKyB,eAAeV,KAClB,kCACEiF,qIAGL,CACH,IAzOEhG,KAAKuC,OAAS/B,EAAK+B,OACnBvC,KAAKorB,GAAK5qB,EAAK4qB,EAChB,CAED,UAAa,CACXngB,EACAzK,EACAoX,4CAEA,IACE,MAAMsX,EAAoB,WAATjkB,EAAoB,GAAK,IAAIA,IACxCkkB,EAAS,GAAG3uB,EAAK+B,OAAO+S,UAAU,EAAG,gCAAgC4Z,IACrE9D,OA7Be,CAAO+D,GAAkB1e,OAAA,OAAA,OAAA,GAAA,YAClD,aAAa2e,EAAwBD,EAAQ,EAAG,CAC9CE,QAASlE,IAEb,IAyBuBmE,CAAYH,GACvBI,EAAiB,IAAI1D,kCACtBrrB,GAAI,CACP4qB,QAGF,aADMmE,EAAetC,0BAA0BrV,GACxC2X,CACR,CAAC,MAAOvpB,GACPxF,EAAKiB,eAAeV,KAAK,GAAG+mB,OAAoB9hB,IACjD,IAEF,CAEK,wBAAAwpB,CAAyB5X,4CAC7B,GAAIA,EAAW,CACb,MAAMyR,QAAerpB,KAAKorB,GAAGloB,IAAI,yBAA0B0U,GAC3D,IAAKyR,EACH,OAEF,MAAO,CAACA,EACT,CAED,MAAMoG,EAAY,GAClB,IAAK,MAAMpG,WAAgBrpB,KAAKorB,GAAGsD,OAAO,0BACxCe,EAAUjrB,KAAK6kB,GAGjB,OAAOoG,IACR,EC3IG,MAAOC,WAA4B5F,GAAzC,WAAAhY,uBACU9R,KAAkB2vB,mBAAqE,GACvF3vB,KAAS+rB,UAAsC,GAC/C/rB,KAAUosB,WAAG,CA0DtB,CAxDS,oBAAAwD,CAAqBhY,GAC3B5X,KAAK+rB,UAAUnU,GAAa,EAC7B,CAEO,WAAAiY,CAAYjY,GAClB,MAAMwU,EAAapsB,KAAKosB,aAClB/C,EAAS,IAAIrpB,KAAK+rB,UAAUnU,IAGlC,OAFA5X,KAAK2vB,mBAAmBvD,GAAc,CAAExU,YAAWyR,UACnDrpB,KAAK4vB,qBAAqBhY,GACnB,CAAEwU,aAAY/C,SAAQzR,YAC9B,CAEK,kBAAAkU,4CACJ,OAAO9oB,OAAOsE,QAAQtH,KAAK2vB,oBAAoBpkB,KAAI,EAAE6gB,GAAcxU,YAAWyR,cAAe,CAC3F+C,WAAYlX,OAAOkX,GACnBxU,YACAyR,eAEH,CAEK,oBAAAiD,CAAqB1U,4CACzB,GAAK5X,KAAK+rB,UAAUnU,GAGpB,OAAO5X,KAAK6vB,YAAYjY,KACzB,CAEK,yBAAA6U,CACJ7U,EACAtT,4CAMA,IAAIwrB,EAOJ,OAXK9vB,KAAK+rB,UAAUnU,IAClB5X,KAAK4vB,qBAAqBhY,GAIxB5X,KAAKqqB,sBAAsBrqB,KAAK+rB,UAAUnU,GAAYtT,KACxDwrB,EAAiB9vB,KAAK6vB,YAAYjY,IAGpC5X,KAAK+rB,UAAUnU,GAAWpT,KAAKF,GAExBwrB,IACR,CAEK,kBAAAhD,CAAmBlV,EAAmByR,4CAG1C,OAFArpB,KAAK2vB,mBAAmB3vB,KAAKosB,YAAc,CAAExU,YAAWyR,UAEjDrpB,KAAKosB,eACb,CAEK,yBAAAW,CAA0BC,EAAoBZ,iDAC/BzpB,IAAfypB,UACKpsB,KAAK2vB,mBAAmBvD,KAElC,EClDI,MAAM2D,GAAsB,EACjCjd,SACA8E,YACAqS,cACAC,cACAjf,OACAgd,iBACAnS,eAS+DrF,OAAA,OAAA,OAAA,GAAA,YAC/D,MAAMuf,EAAmB,IAAIhI,kCACxBlV,GAAM,CACTrR,eAAgBqR,EAAOrR,eACvBwmB,oBAGIgI,EAAiB,IACd,IAAIP,GAAoB,CAC7BjuB,eAAgBqR,EAAOrR,eACvByoB,cACAD,gBAmBEiC,EAA2C,QAAdpW,QAfoCrF,OAAA,OAAA,OAAA,GAAA,YACrE,MAAMyb,QAAcL,GAA4BqE,IAC9CjlB,EACA,CACExJ,eAAgBqR,EAAOrR,eACvBwoB,cACAC,cACA3nB,OAAQuQ,EAAOvQ,QAEjBqV,GAGF,OADA9E,EAAOrR,eAAelB,IAAI,iEACnB2rB,QAAAA,EAAS+D,GAClB,IAEyFA,IAKnF7H,EAAiB,EACrBiB,SACAzR,YACAtP,WACA8jB,iBAOItZ,EAAO2D,WACTlC,IACGtI,MAAK,EAAG6I,mBAAkBG,iBAAgBN,mBACzC7B,EAAOrR,eAAeP,MACpB,uBAAuB4T,8BAA6CG,sBAAmCN,IACxG,IAEFwb,OAAM,SAKXH,EAAiB5H,eAAe,CAC9BiB,OAAQA,EACRzR,UAAWA,EACXvW,gBAAiByR,EAAOzR,gBACxBkB,OAAQuQ,EAAOvQ,OACf+F,SAAUA,EACVmN,WAAY3C,EAAO2C,WACnB5T,WAAYiR,EAAOjR,WACnB+T,QAAS9C,EAAO8C,QAChB3K,OACA4e,WAAY,IAAWpZ,OAAA,OAAA,OAAA,GAAA,kBACfyb,EAAMa,0BAA0BnV,EAAWwU,EAEnD,KACA,EAiEJ,MAAO,CACLgE,0BA/DgC,EAAGxY,YAAWtP,eAC9C4jB,EACGI,qBAAqB1U,GACrB3L,MAAMokB,IACDA,GACFjI,EAAe,CACbgE,WAAYiE,EAAgBjE,WAC5B/C,OAAQgH,EAAgBhH,OACxBzR,UAAWyY,EAAgBzY,UAC3BtP,YAEH,IAEF6nB,OAAOnqB,IACN8M,EAAOrR,eAAeV,KAAK,uEAAwEiF,EAAE,GACrG,EAiDJwgB,SAjCe,EACfliB,QACAsT,YACAtP,eAMA4jB,EACGO,0BAA0B7U,EAAWtT,EAAMygB,MAC3C9Y,MAAMqkB,GAEHA,GACAlI,EAAe,CACbgE,WAAYkE,EAAelE,WAC3B/C,OAAQiH,EAAejH,OACvBzR,UAAW0Y,EAAe1Y,UAC1BtP,eAIL6nB,OAAOnqB,IACN8M,EAAOrR,eAAeV,KAAK,iDAAkDiF,EAAE,GAC/E,EAUJuqB,iBA/CuB,EAASjoB,cAAoCmI,OAAA,OAAA,OAAA,GAAA,YACpE,MAAM+f,QAAwBtE,EAAMJ,qBACpC0E,GACEA,EAAgB9rB,SAAS0pB,IACvBhG,EAAe,CACbgE,WAAYgC,EAAShC,WACrB/C,OAAQ+E,EAAS/E,OACjBzR,UAAWwW,EAASxW,UACpBtP,YACA,GAER,IAqCEogB,MARF,SAAqBC,GAAW,4CAC9B,OAAOqH,EAAiBtH,MAAMC,KAC/B,EAQH,UCnKa8H,GAKX,WAAA3e,IAAe4e,GACb,MAAMC,EAAc,IAAIC,IACxBF,EAAShsB,SAASG,IAChB8rB,EAAYxtB,IAAI0B,EAAEqG,KAAMrG,EAAEgsB,QAAQ,IAEpC7wB,KAAK0wB,SAAWC,CACjB,CAEK,gBAAAJ,CAAiBvL,4CACrB,MAAM8L,EAA4B,GAClC9wB,KAAK0wB,SAAShsB,SAASmsB,IACrBC,EAAStsB,KAAKqsB,EAAQN,iBAAiBvL,GAAM,UAEzCplB,QAAQipB,IAAIiI,KACnB,CAED,QAAAtK,EAAS5O,UACPA,EAAStT,MACTA,EAAKgE,SACLA,kBAMArG,EAAAjC,KAAK0wB,SAASxtB,IAAIoB,EAAM2G,sBAAOub,SAAS,CAAE5O,YAAWtT,QAAOgE,YAC7D,CAED,yBAAA8nB,EAA0BxY,UAAEA,EAAStP,SAAEA,IACrCtI,KAAK0wB,SAAShsB,SAASmsB,IACrBA,EAAQT,0BAA0B,CAAExY,YAAWtP,YAAW,GAE7D,CAEK,KAAAogB,CAAMC,4CACV,MAAMmI,EAA4B,GAClC9wB,KAAK0wB,SAAShsB,SAASmsB,IACrBC,EAAStsB,KAAKqsB,EAAQnI,MAAMC,GAAU,UAElC/oB,QAAQipB,IAAIiI,KACnB,ECtDH,MAAMC,GAAoB,CACxBC,KAAM,CAAC,aAAc,aAAc,gBAAiB,eACpDC,WAAY,CAAC,OAAQ,eACrBC,QAAS,CAAC,aAAc,gBAAiB,oBACzCC,iBAAkB,IAEdC,GAAkB,CACtBJ,KAAM,CAAC,WAAY,eACnBC,WAAY,CAAC,gBACbC,QAAS,GACTC,iBAAkB,CAAC,gBAEfE,GAAyB,CAAA,EAU/B,SAASC,GAAsBjqB,GAC7B,GAAIgqB,GAAuBhqB,GACzB,OAAOgqB,GAAuBhqB,GAChC,MAAMkqB,EAZR,SAAyClqB,GACvC,IAAIpF,EAAIC,EACR,MAAMsvB,EAAgI,OAA/FtvB,EAA6D,OAAvDD,EAAmB,MAAd5C,gBAAqB,EAASA,WAAWoyB,WAAgB,EAASxvB,EAAGyvB,iBAAsB,EAASxvB,EAAGiD,KAAKlD,EAAIoF,GAClK,OAAImqB,GAAiCnyB,WAAWmyB,GACvCnyB,WAAWmyB,QAElB,CAEJ,CAIoBG,CAAgCtqB,IAAQhI,WAAWgI,GAC/DuqB,EAAmBL,EAAUpxB,UAC7B0xB,EAAgBxqB,KAAO0pB,GAAoBA,GAAkB1pB,QAAO,EACpEyqB,EAAuBC,QAC3BF,GACAA,EAAcxb,OACX2b,IACC,IAAI/vB,EAAIC,EACR,OAAO6vB,QACkG,OAAtG7vB,EAA2E,OAArED,EAAKe,OAAOivB,yBAAyBL,EAAkBI,SAAqB,EAAS/vB,EAAGiB,UAAe,EAAShB,EAAG0X,WAAWpW,SAAS,iBAC/I,KAID0uB,EAAc7qB,KAAO+pB,GAAkBA,GAAgB/pB,QAAO,EAC9D8qB,EAAqBJ,QACzBG,GAAeA,EAAY7b,OAExBpF,IACC,IAAIhP,EACJ,MAA2C,mBAA7B2vB,EAAiB3gB,KAA8D,OAAlChP,EAAK2vB,EAAiB3gB,SAAmB,EAAShP,EAAG2X,WAAWpW,SAAS,iBAAiB,KAI3J,GAAIsuB,GAAwBK,EAE1B,OADAd,GAAuBhqB,GAAOkqB,EAAUpxB,UACjCoxB,EAAUpxB,UAEnB,IACE,MAAMiyB,EAAW1W,SAAS2W,cAAc,UACxC3W,SAAS1N,KAAKskB,YAAYF,GAC1B,MAAMG,EAAMH,EAASI,cACrB,IAAKD,EAAK,OAAOhB,EAAUpxB,UAC3B,MAAMsyB,EAAkBF,EAAIlrB,GAAKlH,UAEjC,OADAub,SAAS1N,KAAK0kB,YAAYN,GACrBK,EACEpB,GAAuBhqB,GAAOorB,EADRb,CAEjC,CAAI,MACA,OAAOA,CACR,CACH,CACA,MAAMe,GAAyB,CAAA,EAC/B,SAASC,GAAqBvrB,EAAKwrB,EAAUb,GAC3C,IAAI/vB,EACJ,MAAM6wB,EAAW,GAAGzrB,KAAOsS,OAAOqY,KAClC,GAAIW,GAAuBG,GACzB,OAAOH,GAAuBG,GAAU3tB,KACtC0tB,GAEJ,MAAME,EAAqBzB,GAAsBjqB,GAC3C2rB,EAGA,OAHqB/wB,EAAKe,OAAOivB,yBACrCc,EACAf,SACW,EAAS/vB,EAAGiB,IACzB,OAAK8vB,GACLL,GAAuBG,GAAYE,EAC5BA,EAAkB7tB,KAAK0tB,IAFCA,EAASb,EAG1C,CACA,MAAMiB,GAAuB,CAAA,EAC7B,SAASC,GAAmB7rB,EAAKwrB,EAAU5hB,GACzC,MAAM6hB,EAAW,GAAGzrB,KAAOsS,OAAO1I,KAClC,GAAIgiB,GAAqBH,GACvB,OAAOG,GAAqBH,GAAU7gB,KACpC4gB,GAEJ,MACMM,EADqB7B,GAAsBjqB,GACN4J,GAC3C,MAA+B,mBAApBkiB,EAAuCN,EAAS5hB,IAC3DgiB,GAAqBH,GAAYK,EAC1BA,EAAgBlhB,KAAK4gB,GAC9B,CAuCA,MAAMO,GAAQ,CACZC,WAvCF,SAAoBruB,GAClB,OAAO4tB,GAAqB,OAAQ5tB,EAAG,aACzC,EAsCEsuB,WArCF,SAAoBtuB,GAClB,OAAO4tB,GAAqB,OAAQ5tB,EAAG,aACzC,EAoCEuuB,cAnCF,SAAuBvuB,GACrB,OAAO4tB,GAAqB,OAAQ5tB,EAAG,gBACzC,EAkCEwuB,YAjCF,SAAqBxuB,GACnB,OAAO4tB,GAAqB,OAAQ5tB,EAAG,cACzC,EAgCEwmB,SA/BF,SAAkBxmB,EAAGyuB,GACnB,OAAOP,GAAmB,OAAQluB,EAAG,WAA9BkuB,CAA0CO,EACnD,EA8BEC,YA7BF,SAAqB1uB,GACnB,OAAOkuB,GAAmB,OAAQluB,EAAG,cAA9BkuB,EACT,EA4BES,KA3BF,SAAc3uB,GACZ,OAAKA,GAAO,SAAUA,EACf4tB,GAAqB,aAAc5tB,EAAG,QADZ,IAEnC,EAyBE4uB,YAxBF,SAAqB5uB,GACnB,OAAOA,EAAE4uB,WACX,EAuBEC,WAtBF,SAAoB7uB,GAClB,OAAKA,GAAO,eAAgBA,EACrB4tB,GAAqB,UAAW5tB,EAAG,cADH,IAEzC,EAoBE+W,cAnBF,SAAuB/W,EAAG6W,GACxB,OAAO+W,GAAqB,UAAW5tB,EAAG,gBAAnC4tB,CAAoD/W,EAC7D,EAkBEiY,iBAjBF,SAA0B9uB,EAAG6W,GAC3B,OAAO+W,GAAqB,UAAW5tB,EAAG,mBAAnC4tB,CAAuD/W,EAChE,EAgBEkY,iBAfF,WACE,OAAOzC,GAAsB,oBAAoBxf,WACnD,YCxGgBkiB,KACd,MAAMxf,EAAcrV,IACpB,OACEqV,aAAA,EAAAA,EAAayf,cACZvY,SAASwY,iBAAmBxY,SAASwY,gBAAgBC,cACrDzY,SAAS1N,MAAQ0N,SAAS1N,KAAKmmB,cAChC,CAEJ,UAEgBC,KACd,MAAM5f,EAAcrV,IACpB,OACEqV,aAAA,EAAAA,EAAa6f,aACZ3Y,SAASwY,iBAAmBxY,SAASwY,gBAAgBI,aACrD5Y,SAAS1N,MAAQ0N,SAAS1N,KAAKsmB,aAChC,CAEJ,CCdA,IAAIxhB,GACAyhB,GACA5oB,GAEY,SAAA6oB,GAAOC,EAAgBzyB,GAErC,GADA2J,GAAQ,IAAIC,KACR6oB,EAAMC,WAAa1D,KAAK2D,aAC1B,MAAM,IAAI1zB,MAAM,0DAElB,GAAI,SAAWwzB,EAAMG,QAAQniB,cAC3B,MAAO,OAET,MAAMoiB,EAAoB,CACxBC,KAAMpZ,SAAS1N,KACf+mB,OAASC,IAAkB,EAC3BC,UAAYD,IAAkB,EAC9BJ,QAAUI,IAAkB,EAC5BE,KAAM,CAACF,EAAeG,KAAmB,EACzCC,cAAe,EACfC,mBAAoB,EACpBC,UAAW,IACXC,iBAAkB,IAClBC,eAAW7yB,GAGbmQ,GAAc9P,OAAA4B,OAAA5B,OAAA4B,OAAA,GAAAiwB,GAAa7yB,GAC3BuyB,GAiBF,SAA0BkB,EAA8BZ,GACtD,GAAIY,EAASf,WAAa1D,KAAK0E,cAC7B,OAAOD,EAET,GAAIA,IAAaZ,EAASC,KACxB,OAAOW,EAASE,cAElB,OAAOF,CACT,CAzBiBG,CAAiB9iB,GAAOgiB,KAAMD,GAE7C,IAAIgB,EAAOC,GAAerB,EAAO,OAAO,IACtCqB,GAAerB,EAAO,OAAO,IAAMqB,GAAerB,EAAO,OAAO,IAAMqB,GAAerB,EAAO,cAG9F,GAAIoB,EAAM,CACR,MAAME,EAAY7uB,GAAK8uB,GAASH,EAAMpB,IAItC,OAHIsB,EAAUp1B,OAAS,IACrBk1B,EAAOE,EAAU,IAEZ3iB,GAASyiB,EACjB,CACC,MAAM,IAAI50B,MAAM,0BAEpB,CAYA,SAAS60B,GACPrB,EACAwB,EACAC,GAEA,IAAIL,EAAoB,KACpBzqB,EAAkB,GAClB+qB,EAA0B1B,EAC1B1vB,EAAI,EACR,KAAOoxB,GAAS,CACd,MAAMC,GAAc,IAAIxqB,MAAOyqB,UAAY1qB,GAAM0qB,UACjD,QAAyB1zB,IAArBmQ,GAAO0iB,WAA2BY,EAActjB,GAAO0iB,UACzD,MAAM,IAAIv0B,MAAM,+CAA+Cm1B,OAEjE,IAAI/jB,EAAgBikB,GAAMC,GAAGJ,KAC3BG,MAASpB,GAAKiB,KACdG,MAASE,GAAWL,KACpBG,GAAM1B,GAAQuB,KAAa,CAmIxB,CACLjrB,KAAM,IACNurB,QAAS,IApIT,MAAMC,EAAMtD,GAAM+C,GAClB,GAAa,OAATF,EACES,IACFrkB,EAAQA,EAAMtT,OAAOsT,EAAMyJ,OAAO6a,IAAgBprB,KAAKqrB,GAASC,GAASD,EAAMF,YAE5E,GAAa,OAATT,EACT5jB,EAAQA,EAAM/G,MAAM,EAAG,GACnBorB,IACFrkB,EAAQA,EAAMtT,OAAOsT,EAAMyJ,OAAO6a,IAAgBprB,KAAKqrB,GAASC,GAASD,EAAMF,YAE5E,GAAa,OAATT,EAAgB,CACzB,MAAOW,GAASvkB,EAAQA,EAAM/G,MAAM,EAAG,GACnCorB,GAAOC,GAAeC,KACxBvkB,EAAQ,CAACwkB,GAASD,EAAMF,IAE3B,KAAmB,QAATT,IACT5jB,EAAQ,CAkHL,CACLnH,KAAM,IACNurB,QAAS,IAnHHC,IACFrkB,EAAQ,CAACwkB,GAASxkB,EAAM,GAAIqkB,MAGhC,IAAK,IAAIE,KAAQvkB,EACfukB,EAAKvkB,MAAQtN,EAGf,GADAqG,EAAM5G,KAAK6N,GACPjH,EAAMzK,QAAUmS,GAAOsiB,gBACzBS,EAAOiB,GAAe1rB,EAAO8qB,GACzBL,GACF,MAGJM,EAAUA,EAAQ5C,cAClBxuB,GACD,CAID,OAHK8wB,IACHA,EAAOiB,GAAe1rB,EAAO8qB,KAE1BL,GAAQK,EACJA,IAEFL,CACT,CAEA,SAASiB,GAAe1rB,EAAiB8qB,GACvC,MAAMa,EAAQ7vB,GAAK8vB,GAAa5rB,IAChC,GAAI2rB,EAAMp2B,OAASmS,GAAOwiB,UACxB,OAAOY,EAAWA,IAAa,KAEjC,IAAK,IAAI3E,KAAawF,EACpB,GAAIE,GAAO1F,GACT,OAAOA,EAGX,OAAO,IACT,CAEA,SAASne,GAASyiB,GAChB,IAAIe,EAAOf,EAAK,GACZqB,EAAQN,EAAK1rB,KACjB,IAAK,IAAInG,EAAI,EAAGA,EAAI8wB,EAAKl1B,OAAQoE,IAAK,CACpC,MAAMsN,EAAQwjB,EAAK9wB,GAAGsN,OAAS,EAE7B6kB,EADEN,EAAKvkB,QAAUA,EAAQ,EACjB,GAAGwjB,EAAK9wB,GAAGmG,UAAUgsB,IAErB,GAAGrB,EAAK9wB,GAAGmG,QAAQgsB,IAE7BN,EAAOf,EAAK9wB,EACb,CACD,OAAOmyB,CACT,CAEA,SAAST,GAAQZ,GACf,OAAOA,EAAKtqB,KAAKqrB,GAASA,EAAKH,UAASU,QAAO,CAACC,EAAKryB,IAAMqyB,EAAMryB,GAAG,EACtE,CAEA,SAASkyB,GAAOpB,GACd,MAAMwB,EAAMjkB,GAASyiB,GACrB,OAAQtB,GAAaT,iBAAiBuD,GAAK12B,QACzC,KAAK,EACH,MAAM,IAAIM,MAAM,6CAA6Co2B,KAC/D,KAAK,EACH,OAAO,EACT,QACE,OAAO,EAEb,CAEA,SAASd,GAAG9B,GACV,MAAM6C,EAAY7C,EAAM8C,aAAa,MACrC,OAAID,GAAaxkB,GAAOiiB,OAAOuC,GACtB,CACLpsB,KAAM,IAAMssB,IAAIC,OAAOH,GACvBb,QAAS,GAGN,IACT,CAEA,SAASvB,GAAKT,GACZ,MAAMiD,EAAQ7wB,MAAM8wB,KAAKlD,EAAMmD,YAAY9b,QAAQoZ,GAASpiB,GAAOoiB,KAAKA,EAAKhqB,KAAMgqB,EAAKvvB,SACxF,OAAO+xB,EAAMnsB,KACV2pB,IAAgB,CACfhqB,KAAM,IAAIssB,IAAIC,OAAOvC,EAAKhqB,UAAUssB,IAAIC,OAAOvC,EAAKvvB,WACpD8wB,QAAS,MAGf,CAEA,SAASD,GAAW/B,GAElB,OADc5tB,MAAM8wB,KAAKlD,EAAMoD,WAAW/b,OAAOhJ,GAAOmiB,WAC3C1pB,KACVL,IAAgB,CACfA,KAAM,IAAMssB,IAAIC,OAAOvsB,GACvBurB,QAAS,KAGf,CAEA,SAAS7B,GAAQH,GACf,MAAMvpB,EAAOupB,EAAMG,QAAQniB,cAC3B,OAAIK,GAAO8hB,QAAQ1pB,GACV,CACLA,OACAurB,QAAS,GAGN,IACT,CASA,SAASrD,GAAMqB,GACb,MAAMqD,EAASrD,EAAMnB,WACrB,IAAKwE,EACH,OAAO,KAET,IAAIC,EAAQD,EAAOE,WACnB,IAAKD,EACH,OAAO,KAET,IAAIhzB,EAAI,EACR,KAAOgzB,IACDA,EAAMrD,WAAa1D,KAAK2D,cAC1B5vB,IAEEgzB,IAAUtD,IAGdsD,EAAQA,EAAME,YAEhB,OAAOlzB,CACT,CAEA,SAAS8xB,GAASD,EAAY7xB,GAC5B,MAAO,CACLmG,KAAM0rB,EAAK1rB,KAAO,cAAcnG,KAChC0xB,QAASG,EAAKH,QAAU,EAE5B,CAEA,SAASE,GAAeC,GACtB,MAAqB,SAAdA,EAAK1rB,OAAoB0rB,EAAK1rB,KAAK0H,WAAW,IACvD,CAEA,SAAS0jB,MAASjkB,GAChB,MAAMkW,EAAOlW,EAAMyJ,OAAOoc,IAC1B,OAAI3P,EAAK5nB,OAAS,EACT4nB,EAEF,IACT,CAEA,SAAS2P,GAAYvyB,GACnB,OAAOA,OACT,CAEA,SAAUqxB,GAAa5rB,EAAiByqB,EAAe,IACrD,GAAIzqB,EAAMzK,OAAS,EACjB,IAAK,IAAIi2B,KAAQxrB,EAAM,SACd4rB,GAAa5rB,EAAME,MAAM,EAAGF,EAAMzK,QAASk1B,EAAK92B,OAAO63B,eAG1Df,CAEV,CAEA,SAAS3uB,GAAK6vB,GACZ,MAAO,IAAIA,GAAO7vB,MAAK,CAACwX,EAAG9B,IAAM6Z,GAAQ/X,GAAK+X,GAAQ7Z,IACxD,CAOA,SAAUoZ,GACRH,EACApB,EACA0D,EAAe,CACbC,QAAS,EACTC,QAAS,IAAIzH,MAGf,GAAIiF,EAAKl1B,OAAS,GAAKk1B,EAAKl1B,OAASmS,GAAOuiB,mBAC1C,IAAK,IAAItwB,EAAI,EAAGA,EAAI8wB,EAAKl1B,OAAS,EAAGoE,IAAK,CACxC,GAAIozB,EAAMC,QAAUtlB,GAAOyiB,iBACzB,OAEF4C,EAAMC,SAAW,EACjB,MAAME,EAAU,IAAIzC,GACpByC,EAAQpN,OAAOnmB,EAAG,GAClB,MAAMwzB,EAAanlB,GAASklB,GAC5B,GAAIH,EAAME,QAAQG,IAAID,GACpB,OAEEtB,GAAOqB,IAAYG,GAAKH,EAAS7D,WAC7B6D,EACNH,EAAME,QAAQl1B,IAAIo1B,GAAY,SACvBvC,GAASsC,EAAS7D,EAAO0D,GAEnC,CAEL,CAEA,SAASM,GAAK5C,EAAYpB,GACxB,OAAOF,GAAaxY,cAAc3I,GAASyiB,MAAWpB,CACxD,CC9SA,MAEaiE,GAAkC,EAAG9iB,UAASyT,aACzD,MAAMsP,EAA4B,GAQlC,OAPAtP,EAAO3kB,SAASk0B,IACd,MAAMC,EAASzsB,KAAK+E,MAAMynB,GAC1BC,EAAOC,MAAQ,EACK,UAAhBD,EAAO5tB,MACT0tB,EAAYn0B,KAAKq0B,EAClB,IAEI,CAAEjjB,UAASyT,OAAQsP,EAAa,EAG5BI,GAA+B,EAAGnjB,UAASyT,aACtD,MAAMsP,EAA4B,GAClCtP,EAAO3kB,SAASk0B,IACd,MAAMC,EAASzsB,KAAK+E,MAAMynB,GACN,UAAhBC,EAAO5tB,MACT0tB,EAAYn0B,KAAKq0B,EAClB,IAGH,MAAMG,EAAUL,EAAYxB,QAA4C,CAAC/T,EAAM6V,KAC7E,MAAM/b,EAAEA,EAACgc,EAAEA,EAAC9lB,SAAEA,EAAQ+lB,UAAEA,GAAcF,EAGhCG,EAAOD,EAAaA,EA3BD,KA6BnBE,EAAI,GAAGnc,KAAKgc,KAAK9lB,QAAAA,EAAY,MAAMgmB,IAMzC,OALKhW,EAAKiW,GAGRjW,EAAKiW,GAAGP,OAAS,EAFjB1V,EAAKiW,GAAEr2B,OAAA4B,OAAA5B,OAAA4B,OAAA,CAAA,EAAQq0B,GAAM,CAAAE,UAAWC,EAAMN,MAAO,IAIxC1V,CAAI,GACV,CAAE,GAEL,MAAO,CAAExN,UAASyT,OAAQrmB,OAAOs2B,OAAON,GAAU,EAGvCO,GACX,CAACzuB,GAAUkb,gBAAepO,YAAW4hB,aAAYC,SAAQvlB,oBACxDlO,IACC,GAAIA,EAAEiF,OAAS6L,GAAkB4iB,MAC/B,OAGF,MAAMllB,EAAcrV,IACpB,IAAKqV,EACH,OAGF,MAAMuU,SAAEA,EAAQkL,YAAEA,EAAWI,WAAEA,GAAe7f,EAE9C,IAAKuU,EACH,OAGF,MAAM7L,EAAEA,EAACgc,EAAEA,GAAMlzB,EACjB,QAAUrD,IAANua,QAAyBva,IAANu2B,EACrB,OAGF,MAAMtC,EAAO6C,EAAOE,QAAQ3zB,EAAEuwB,IAC9B,IAAInjB,EACJ,GAAIwjB,EACF,IACExjB,EAAWohB,GAAOoC,EACnB,CAAC,MAAOvd,GACPvO,EAAO5J,MAAM,uCACd,CAGH,MAAQ04B,KAAMC,EAASC,IAAKC,GFpG1B,SAA0BxH,eAC9B,MAAMyH,EAAMzH,EAAI7W,SAChB,MAAO,CACLke,KAAMI,EAAIC,iBACND,EAAIC,iBAAiBC,gBACDv3B,IAApB4vB,EAAI4H,YACJ5H,EAAI4H,YACJH,EAAI9F,gBAAgBgG,aACnBF,eAAAA,EAAKhsB,QAAmC,QAA3B/L,EAAAm4B,GAAI7G,cAAcyG,EAAIhsB,aAAK,IAAA/L,OAAA,EAAAA,EAAEi4B,cAChC,QAAXh4B,EAAA83B,aAAG,EAAHA,EAAKhsB,YAAM,IAAA9L,OAAA,EAAAA,EAAAg4B,aACX,EACJJ,IAAKE,EAAIC,iBACLD,EAAIC,iBAAiBI,eACD13B,IAApB4vB,EAAI+H,YACJ/H,EAAI+H,aACJN,eAAAA,EAAK9F,gBAAgBmG,aACpBL,eAAAA,EAAKhsB,QAAmC,QAA3B7L,EAAAi4B,GAAI7G,cAAcyG,EAAIhsB,aAAK,IAAA7L,OAAA,EAAAA,EAAEk4B,aAChC,QAAXj4B,EAAA43B,aAAG,EAAHA,EAAKhsB,YAAM,IAAA5L,OAAA,EAAAA,EAAAi4B,YACX,EAER,CEgF4CE,CAAgB/lB,GAIlDlQ,EAAoB,CACxB4Y,EAAGA,EAAI2c,EACPX,EAAGA,EAAIa,EACP3mB,WAEAonB,eAAgBvG,EAChBwG,cAAepG,EACfpgB,QATcD,EAAW+U,EAASC,KAAM9U,GAUxCilB,UAAWvtB,KAAKoM,MAChB/M,KAAM,SAEF3C,EAAWkxB,IACblxB,GACF0d,EAAcQ,SAAS,CAAE5O,YAAWtT,MAAO,CAAE2G,KAAM,cAAe8Z,KAAM3Y,KAAKC,UAAU/H,IAAUgE,YAClG,QCtGQoyB,GAOX,WAAA5oB,CAAY0W,EAAoE1V,GAC9E,MAAM0B,EAAcrV,IAChBqV,GAAeA,EAAYvQ,WAAyD,mBAArCuQ,EAAYvQ,UAAU02B,WACvE36B,KAAK26B,WAAa,CAAC1mB,EAASzD,KAC1B,IACE,GAAIgE,EAAYvQ,UAAU02B,WAAW1mB,EAAS7H,KAAKC,UAAUmE,IAC3D,OAAO,CAEV,CAAC,MAAOxK,GAER,CACD,OAAO,CAAK,EAGdhG,KAAK26B,WAAa,KAAM,EAG1B36B,KAAK46B,QAAU,CAAC3mB,EAASzD,KACvB,MAAMqqB,EAAM,IAAIC,eAIhB,OAHAD,EAAIvN,KAAK,OAAQrZ,GAAS,GAC1B4mB,EAAIE,iBAAiB,SAAU,OAC/BF,EAAIluB,KAAKP,KAAKC,UAAUmE,KACjB,CAAI,EAGbxQ,KAAKg7B,YAAc13B,EAAawP,EAAOjR,WAAYiR,EAAOW,gBAC1DzT,KAAKuC,OAASuQ,EAAOvQ,OACrBvC,KAAKwoB,QAAUA,CAChB,CAED,IAAA7b,CAAKrE,EAAkBkI,GACrB,MAAMoH,UAAEA,EAAS3M,KAAEA,GAASjL,KAAKwoB,QAC3BzP,EAAY,IAAIS,gBAAgB,CACpC0P,UAAW5gB,EACX6gB,WAAYxP,OAAO/B,GACnB3M,KAAM0O,OAAO1O,GACbwO,QAASzZ,KAAKuC,SAGV0R,EAAU,GAAGjU,KAAKg7B,eAAejiB,EAAUa,aAIjD5Z,KAAK26B,WAAW1mB,EAASzD,IAAYxQ,KAAK46B,QAAQ3mB,EAASzD,EAC5D,QC7CUyqB,GASX,cAAO,CACLzS,EACA1V,GAEA,OAAO,IAAImoB,GAAc,IAAIP,GAAoClS,EAAS1V,GAASA,EACpF,CAED,WAAAhB,CACEopB,EACApoB,GAjBM9S,KAAAm5B,UAAYvtB,KAAKoM,MAmEzBhY,KAAAm7B,KAAwBn1B,IACtBhG,KAAKo7B,OAAOp1B,EAAE,EAGhBhG,KAAI2M,KAAwF6sB,GAAgB6B,YAC1G,MAAM/yB,EAAWkxB,IACXhlB,EAAcrV,IAChBqV,GAAelM,GACjBtI,KAAKk7B,UAAUvuB,KAAKrE,EAAU,CAC5BsN,QAAS,EACTyT,OAAQ,CACN,CACEiS,WAAYt7B,KAAKu7B,YACjBC,WAAYx7B,KAAKy7B,YACjBC,eAAgB17B,KAAK27B,gBACrBC,gBAAiB57B,KAAK67B,iBAEtBrB,eAAgBxG,KAChByG,cAAerG,KACfngB,QAASD,EAAWQ,EAAYuU,SAASC,KAAmD,QAA7C9mB,YAAAlC,KAAK8S,OAAOsD,wCAAmBlC,sBAAc,IAAAhS,EAAAA,EAAI,IAChGi3B,UAAWn5B,KAAKm5B,UAChBluB,KAAM,YAIb,EAzEDjL,KAAKu7B,YAAc,EACnBv7B,KAAKy7B,YAAc,EACnBz7B,KAAK27B,gBAAkBvH,KACvBp0B,KAAK67B,iBAAmB7H,KACxBh0B,KAAK8S,OAASA,EAEd9S,KAAKk7B,UAAYA,CAClB,CAED,cAAWI,GACT,OAAOt7B,KAAKu7B,WACb,CAED,cAAWC,GACT,OAAOx7B,KAAKy7B,WACb,CAED,kBAAWC,GACT,OAAO17B,KAAK27B,eACb,CAED,mBAAWC,GACT,OAAO57B,KAAK67B,gBACb,CAED,MAAAT,CAAOp1B,GACL,MAAMgS,EAAMpM,KAAKoM,MACjB,GAAIhS,EAAEkX,EAAIld,KAAKu7B,YAAa,CAC1B,MAAMO,EAAQ1H,KACdp0B,KAAKu7B,YAAcv1B,EAAEkX,EACrB,MAAMwe,EAAiB11B,EAAEkX,EAAI4e,EACzBJ,EAAiB17B,KAAK27B,kBACxB37B,KAAK27B,gBAAkBD,GAEzB17B,KAAKm5B,UAAYnhB,CAClB,CAED,GAAIhS,EAAEkzB,EAAIl5B,KAAKy7B,YAAa,CAC1B,MAAMM,EAAS/H,KACfh0B,KAAKy7B,YAAcz1B,EAAEkzB,EACrB,MAAM0C,EAAkB51B,EAAEkzB,EAAI6C,EAC1BH,EAAkB57B,KAAK67B,mBACzB77B,KAAK67B,iBAAmBD,GAE1B57B,KAAKm5B,UAAYnhB,CAClB,CACF,QC5FUgkB,GAKX,WAAAlqB,EAAY8F,UAAEA,EAAStP,SAAEA,IACvBtI,KAAKsI,SAAWA,EAChBtI,KAAK4X,UAAYA,EAEbA,GAAatP,IACftI,KAAKi8B,gB5B6F4B,EAACrkB,EAA4BtP,IAC3D,GAAGA,KAAYsP,I4B9FKskB,CAAwBtkB,EAAWtP,GAE7D,ECqGI,MAAM6zB,GAAoB,UApGjC,WAAArqB,GACE9R,KAAGo8B,IAAiE,GAEpEp8B,KAAAsvB,YAAqBH,GAAkB1e,EAAAzQ,UAAA,OAAA,GAAA,YACrC,aAAaovB,EAAiCD,EAAQ,EAAG,CACvDE,QAAUjE,IACHA,EAAGG,iBAAiBC,SAAS,0BAChCJ,EAAGK,kBAAkB,wBAAyB,CAC5CC,QAAS,aAEZ,GAGP,IAEA1rB,KAAAq8B,eAAwB95B,GAAkBkO,EAAAzQ,UAAA,OAAA,GAAA,YACxC,GAAIA,KAAKo8B,KAAOp8B,KAAKo8B,IAAI75B,GACvB,OAAOvC,KAAKo8B,IAAI75B,GAElB,MAAM4sB,EAAS,GAAG5sB,EAAO+S,UAAU,EAAG,mCAChC8V,QAAWprB,KAAKsvB,YAAYH,GAElC,OADAnvB,KAAKo8B,IAAI75B,GAAU6oB,EACZA,CACT,IAEAprB,KAA2Bs8B,4BAAG,EAC5B76B,iBACAc,SACAqV,eAKGnH,EAAAzQ,UAAA,OAAA,GAAA,YACH,IACE,MAAMorB,QAAWprB,KAAKq8B,eAAe95B,GAC/Bg6B,EAAe5iB,OAAO/B,GACtB4kB,QAAiCpR,EAAGloB,IAA6B,wBAAyBq5B,GAEhG,OAAOC,eAAAA,EAA0BC,cAClC,CAAC,MAAOz2B,GACPvE,EAAeV,KAAK,gDAAgD6W,MAAc5R,IACnF,CAEH,IAEAhG,KAAA08B,8BAAgC,EAC9Bj7B,iBACAc,SACAqV,YACA6kB,oBAMGhsB,EAAAzQ,UAAA,OAAA,GAAA,YACH,IACE,MAAMorB,QAAWprB,KAAKq8B,eAAe95B,GAC/Bg6B,EAAe5iB,OAAO/B,GAO5B,aANuCwT,EAAGoB,IAA6B,wBAAyB,CAC9FiQ,iBACA7kB,UAAW2kB,EACXI,YAAa/wB,KAAKoM,OAIrB,CAAC,MAAOhS,GACPvE,EAAeV,KAAK,kDAAkD6W,MAAc5R,IACrF,CAEH,IAEAhG,KAAuB48B,wBAAG,EACxBn7B,iBACAc,SACAs6B,sBAKGpsB,EAAAzQ,UAAA,OAAA,GAAA,YACH,IACE,MAAMorB,QAAWprB,KAAKq8B,eAAe95B,GAC/Bu6B,EAAsBnjB,OAAOkjB,GAC7BnQ,EAAKtB,EAAGa,YAAkD,wBAAyB,aACnF8Q,QAA8BrQ,EAAGR,MAAMwC,SAC7C,IAAK,IAAI3pB,EAAI,EAAGA,EAAIg4B,EAAsBp8B,OAAQoE,IAAK,CACrD,MAAMi4B,EAAoBD,EAAsBh4B,GAC1Ck4B,EAA2BrxB,KAAKoM,MAAQglB,EAAkBL,YAC5DK,EAAkBplB,YAAcklB,GAAuBG,EAvG7B,eAwGtBvQ,EAAGR,MAAMjiB,OAAO+yB,EAAkBplB,WAE3C,OACK8U,EAAG9mB,IACV,CAAC,MAAOI,GACPvE,EAAeV,KAAK,uDAAuDiF,IAC5E,CACH,GACD,GC7De,SAAAk3B,GACdl7B,EAAoC,IAEpC,MAAO,CACLkJ,KAAM,2BACN,QAAAiyB,CAASC,EAAI5oB,EAAa6oB,aAExB,MAAMvqB,EAAc9P,OAAA4B,OAAA5B,OAAA4B,OAAA,GAAA5C,GAAYq7B,GAC1BnpB,EAAiBpB,EAAOoB,gBAAkB,GAC1CopB,EAAoC,QAApBr7B,EAAA6Q,EAAOwqB,qBAAa,IAAAr7B,GAAAA,EACpCs7B,EAAwC,QAAtBr7B,EAAA4Q,EAAOyqB,uBAAe,IAAAr7B,EAAAA,EjCtDD,IiCuDvCgU,EAAkD,QAA3B/T,EAAA2Q,EAAOoD,4BAAoB,IAAA/T,GAAAA,EAGxD,IAAKqS,EACH,MAAO,OAOT,IAAIgpB,EASJ,MAAMvU,EAAgB,IACfzU,EAAYuU,UACVvU,EAAYuU,SAASC,MADM,GAoC9ByU,EAAgB,KACpB,MAAMC,EAAazU,IAGnB,QAAuBtmB,IAAnB66B,GAAgCE,IAAeF,EAAgB,CACjEA,EAAiBE,EACjB,MAAMp5B,EAhCmB,MAC3B,MAAM2vB,YAAEA,EAAWI,WAAEA,EAAU3Y,SAAEA,GAAalH,EACxCkpB,EAAazU,IACnB,IAAI0U,EAAe,GAQnB,OAPIznB,IACFynB,GAAejiB,aAAA,EAAAA,EAAUkiB,QAAS,IAM7B,CACL5U,KAHkB9U,EAAevT,OAAS,EAAIqT,EAAW0pB,EAAYxpB,GAAkBwpB,EAIvFE,MAAOD,EACPnD,eAAgBvG,EAChBwG,cAAepG,EACfppB,KAAM,mBACP,EAee4yB,GACdT,EAAG94B,EACJ,GAUGw5B,EACJC,GAEO,YAA4Bv9B,GAEjC,MAAMwL,EAAS+xB,EAAe34B,MAAMpF,KAAMQ,GAG1C,OADAi9B,IACOzxB,CACT,EAIIgyB,EAAoB,KACxBP,GAAe,EAIjB,GAAIH,EAAe,CAEjB,MAAMW,EAAoBzpB,EAAY0pB,aAAY,KAChDT,GAAe,GACdF,GAMH,OAHAE,IAGO,KACDQ,GACFzpB,EAAY2pB,cAAcF,EAC3B,CAEJ,CAGD,GAAIzpB,EAAY4pB,QAAS,CAGvB,MAAMC,EAAoB7pB,EAAY4pB,QAAQE,UAAUrsB,KAAKuC,EAAY4pB,SACnEG,EAAuB/pB,EAAY4pB,QAAQI,aAAavsB,KAAKuC,EAAY4pB,SA0B/E,MApB6B,MAE3B5pB,EAAY4pB,QAAQE,UAAYR,EAAyBO,GAGzD7pB,EAAY4pB,QAAQI,aAAeV,EAAyBS,EAAqB,EAInFE,GAGAjqB,EAAYkqB,iBAAiB,WAAYjB,GAEzCjpB,EAAYkqB,iBAAiB,aAAcV,GAG3CP,IAGO,KAELjpB,EAAY4pB,QAAQE,UAAYD,EAChC7pB,EAAY4pB,QAAQI,aAAeD,EAGnC/pB,EAAYmqB,oBAAoB,WAAYlB,GAE5CjpB,EAAYmqB,oBAAoB,aAAcX,EAAkB,CAEnE,CAMD,OAFAxpB,EAAYkqB,iBAAiB,aAAcV,GAC3CP,IACO,KACLjpB,EAAYmqB,oBAAoB,aAAcX,EAAkB,CAEnE,EACDh8B,UAEJ,OCzKa48B,GAuBX,WAAA9sB,GAtBA9R,KAAIkL,KAAG,oCAMPlL,KAAoB6+B,qBAAsC,KAC1D7+B,KAAU8+B,WAAG,EAEb9+B,KAAqBwX,uBAAG,EAKxBxX,KAAY++B,aAAkB,GAMtB/+B,KAAcg/B,eAA0B,KAUxCh/B,KAAAi/B,uBAA0BC,IAChC,MAAM1qB,EAAcrV,IAChBqV,IACFA,EAAYmqB,oBAAoB,OAAQ3+B,KAAKm/B,cAC7C3qB,EAAYmqB,oBAAoB,QAAS3+B,KAAKo/B,gBAC7CF,GAAY1qB,EAAYkqB,iBAAiB,OAAQ1+B,KAAKm/B,eACtDD,GAAY1qB,EAAYkqB,iBAAiB,QAAS1+B,KAAKo/B,eAGpD5qB,EAAYjV,MAAQ,eAAgBiV,EAAYjV,MAClDiV,EAAYmqB,oBAAoB,WAAY3+B,KAAKq/B,oBAChDH,GAAY1qB,EAAYkqB,iBAAiB,WAAY1+B,KAAKq/B,qBAI3D7qB,EAAYmqB,oBAAoB,eAAgB3+B,KAAKq/B,oBACpDH,GAAY1qB,EAAYkqB,iBAAiB,eAAgB1+B,KAAKq/B,oBAElE,EA+KHr/B,KAAYm/B,aAAG,KACbn/B,KAAKs/B,YAAY,EAGnBt/B,KAAao/B,cAAG,KAGTp/B,KAAKu/B,cAAa,EAAM,EAQvBv/B,KAAAq/B,kBAAqBr5B,IAC3BhG,KAAK++B,aAAar6B,SAAS+F,IACzBA,EAAGzE,EAAE,GACL,EAGJhG,KAA2Bw/B,4BAAG,CAC5BC,EACAC,GAAS,IACPjvB,EAAAzQ,UAAA,OAAA,GAAA,YACF,GAAKA,KAAK2/B,aAAgB3/B,KAAK2/B,YAAY/nB,WAAc5X,KAAK8S,OAA9D,CAUA,IAAK9S,KAAK8S,OAAO4H,gBAAiB,CAChC,IAAIglB,EAIF,YADA1/B,KAAKyB,eAAelB,IAAI,yEAFxBP,KAAKyB,eAAelB,IAAI,oEAK3B,CAKD,GAFAP,KAAK4/B,oBAAsBH,EAEvBz/B,KAAK8S,OAAO4H,kBAAoB1a,KAAKwX,sBAAuB,CAC9D,IAAIqoB,EAAoBJ,EAAgBn7B,MAEtCu7B,GACA78B,OAAOs2B,OAAO16B,GAAkB4E,SAASq8B,EAAkBC,cAE3DD,OAAoBl9B,GAMtB3C,KAAKwX,2BCjV8B,GACvCI,YACA8C,kBACAjZ,iBACAc,SACAk9B,qBAOGhvB,OAAA,OAAA,OAAA,GAAA,YAYH,SAXM0rB,GAAkBS,wBAAwB,CAC9Cn7B,eAAgBA,EAChBc,OAAQA,EACRs6B,iBAAkBjlB,KAQM,WALMukB,GAAkBG,4BAA4B,CAC5E76B,eAAgBA,EAChBc,OAAQA,EACRqV,UAAWA,KAGX,OAAO,EAMT,IAAIJ,GAAwB,EAC5B,IAEE,MAAQuoB,kBAAmBC,SAAmCC,OAAO,sBAAsBh0B,MAAA,SAAAjH,GAAA,OAAAA,EAAAD,CAAA,IAErFm7B,QAAwBF,iCACzBP,GAAe,CAClBU,KAAMzlB,EACN9C,UAAWA,EACXrV,OAAQA,EACRd,eAAgBA,KAEdy+B,GAAmBA,EAAgBvlB,sBACrCnD,EAAoE,OAA5C0oB,EAAgBvlB,oBAAoBtT,KAGzD80B,GAAkBO,8BAA8B,CACnDj7B,eAAgBA,EAChBc,OAAQA,EACRqV,UAAWA,EACX6kB,eAAgBjlB,GAEnB,CAAC,MAAO6B,GACP,MAAMH,EAAaG,EACnB5X,EAAeV,KAAKmY,EAAWa,QAChC,CACD,OAAOvC,CACT,IDuRyC4oB,CAA0B,CAC3DxoB,UAAW5X,KAAK2/B,YAAY/nB,UAC5B8C,gBAAiB1a,KAAK8S,OAAO4H,gBAC7BjZ,eAAgBzB,KAAKyB,eACrBc,OAAQvC,KAAK8S,OAAOvQ,OACpBk9B,gBAAiB,CAAE53B,eAAgB43B,EAAgB53B,eAAgBvD,MAAOu7B,KAI5E7/B,KAAKyB,eAAeP,MAClBkL,KAAKC,UACH,CACEnB,KAAM,iCACNsM,sBAAuBxX,KAAKwX,sBAC5BlT,MAAOu7B,EACPJ,gBAAiBA,GAEnB,KACA,GAGL,CAEGC,EACG1/B,KAAKqgC,YAAW,SAEfrgC,KAAKu/B,cArDZ,MANKv/B,KAAK2/B,cAAgB3/B,KAAK2/B,YAAY/nB,UACxC5X,KAAKyB,eAAelB,IAAI,kFAExBP,KAAKyB,eAAeV,KAAK,sEA0D/B,IA+RAf,KAAmBsgC,oBAAG,CACpBC,EACAC,EAAoC,CAAA,EACpCC,GAAiB,IACfhwB,EAAAzQ,UAAA,OAAA,GAAA,YACF,IACE,IAAI0gC,EACJ,MAAM5tB,EAAS9S,KAAK8S,OAEpB,GAAIA,GAAUytB,IAAc3uB,EAAiB+uB,WAC3CD,EAAY,CACV5tB,OAAQsC,EAAetC,GACvB8C,QAASmS,IAEP0Y,GAAgB,CAClB,MAAMG,QAAwBrsB,IAC9BmsB,EACK19B,OAAA4B,OAAA5B,OAAA4B,OAAA,GAAAg8B,GACAF,EAEN,CAGC1gC,KAAK6+B,sBAAwB7+B,KAAKg/B,eACpCh/B,KAAKg/B,eAAe6B,eAAeN,EAASv9B,OAAA4B,OAAA5B,OAAA4B,OAAA,CAAA,EACvC47B,GACAE,IAGL1gC,KAAKyB,eAAeP,MAClB,+CAA+Cq/B,iCAGpD,CAAC,MAAOv6B,GACPhG,KAAKyB,eAAeP,MAAM,mDAAoD8E,EAC/E,CACH,IAEAhG,KAAmB8gC,oBAAG,WACpB,IACE9gC,KAAKyB,eAAelB,IAAI,oCACxBP,KAAK6+B,sBAAwB7+B,KAAK6+B,uBAClC7+B,KAAK6+B,qBAAuB,KACL,QAAvB58B,EAAAjC,KAAK+gC,wBAAkB,IAAA9+B,GAAAA,EAAA++B,MACxB,CAAC,MAAOhgC,GACP,MAAMigC,EAAajgC,EACnBhB,KAAKyB,eAAeV,KAAK,iDAAiDkgC,EAAWrnB,aACtF,GA7mBD5Z,KAAKyB,eAAiB,IAAIoQ,EAAmB,IAAI9R,EAClD,CAED,IAAAmhC,CAAK3+B,EAAgBP,GACnB,OAAOvC,EAAcO,KAAKmhC,MAAM5+B,EAAQP,GACzC,CAuBe,KAAAm/B,CAAM5+B,EAAgBP,8DACpChC,KAAKyB,eAAiB,IAAIoQ,EAAmB7P,EAAQP,gBAAkB,IAAI1B,GAC3EiD,OAAO7C,UAAU+E,eAAeC,KAAKnD,EAAS,aAC5ChC,KAAKyB,eAAepB,OAAO2B,EAAQ/B,UACrCD,KAAK2/B,YAAc,IAAI3D,GAAmB,CAAEpkB,UAAW5V,EAAQ4V,UAAWtP,SAAUtG,EAAQsG,WAC5FtI,KAAKohC,2BtByF+C,EAAO7+B,EAAgBP,IAAiCyO,OAAA,OAAA,OAAA,GAAA,YAC9G,MAAM0G,EAAc,IAAI5B,EAAyBhT,EAAQP,GACnDoY,QAA0BF,GAAmD,CACjF/C,cACAC,WAAY,CAAC,mBAGf,OAAO,IAAI+C,GAAmCC,EAAmBjD,EACnE,IsBjGuCkqB,CAAyC9+B,EAAQP,GACpF,MAAM+Y,aAAEA,EAAY5D,YAAEA,EAAWY,aAAEA,SAAuB/X,KAAKohC,sBAAsB/mB,qBACnFra,KAAK2/B,YAAY/nB,WAcnB,GAZA5X,KAAK8S,OAASiI,EAEd/a,KAAKshC,YACHt/B,EAAQ4V,UACRmD,EACA5D,EACAY,EACe,QAAf9V,EAAAD,EAAQ4T,eAAO,IAAA3T,OAAA,EAAAA,EAAE2T,QACjBmS,GACiB,QAAjB7lB,EAAAF,EAAQ4T,eAAS,IAAA1T,OAAA,EAAAA,EAAA+I,MAGfjJ,EAAQ4V,YAA4C,QAA/BzV,EAAAnC,KAAK8S,OAAOsD,yBAAmB,IAAAjU,OAAA,EAAAA,EAAAsP,SAAS,CAC/D,MAAM8vB,EAAgBtG,GAAcuG,QAClC,CACE5pB,UAAW5V,EAAQ4V,UACnB3M,KAAM,eAERjL,KAAK8S,QAEP9S,KAAK++B,aAAe,CAACwC,EAAc50B,KAAK3M,KAAKyhC,YAAYxvB,KAAKjS,OAAOiS,KAAKsvB,IAC1EvhC,KAAK0hC,WAAaH,EAAcpG,KAAKlpB,KAAKsvB,EAC3C,CAED,MAAM7Q,EAAuD,GAC7D,IA4CIzK,GA5CAnQ,UAAEA,GAAc9V,KAAK8S,OACP,QAAdgD,IAAwC,QAAhB1T,EAAAjD,WAAgB,IAAAiD,OAAA,EAAAA,EAAEgrB,aAC5CtX,EAAY,SACZ9V,KAAKyB,eAAeV,KAAK,8EAE3Bf,KAAKyB,eAAelB,IAAI,SAASuV,wBACjC,IACE,MAAM6rB,QAA0B5R,GAA8B,CAC5Djd,OAAQ9S,KAAK8S,OACb8E,UAAW5X,KAAK2/B,YAAY/nB,UAC5B3M,KAAM,SACN6K,cAEF4a,EAASlsB,KAAK,CAAE0G,KAAM,SAAU2lB,QAAS8Q,GAC1C,CAAC,MAAO3gC,GACP,MAAMigC,EAAajgC,EACnBhB,KAAKyB,eAAeV,KAAK,wDAAwDkgC,EAAWrnB,aAC7F,CAED,GAAiC,QAA7B9Q,EAAA9I,KAAK8S,OAAOsD,yBAAiB,IAAAtN,OAAA,EAAAA,EAAE2I,QAAS,CAC1C,MAAMwW,EAAiBjoB,KAAK8S,OAAOsD,kBAAkB6U,MAAQ8N,GAAeL,GAC5E,IACE,MAAMkJ,QAAgC7R,GAAmC,CACvEjd,OAAQ9S,KAAK8S,OACb8E,UAAW5X,KAAK2/B,YAAY/nB,UAC5B3M,KAAM,cACNgf,YAAwD,QAA3ClhB,EAAA/I,KAAK8S,OAAOsD,kBAAkByrB,qBAAa,IAAA94B,EAAAA,ElCrJ1B,IkCsJ9BmhB,YlCrJ8B,IkCsJ9BjC,iBACAnS,cAEF4a,EAASlsB,KAAK,CAAE0G,KAAM,cAAe2lB,QAAS+Q,GAC/C,CAAC,MAAO5gC,GACP,MAAMigC,EAAajgC,EACnBhB,KAAKyB,eAAeV,KAAK,6DAA6DkgC,EAAWrnB,aAClG,CACF,CAED5Z,KAAKgmB,cAAgB,IAAIyK,MAAuDC,GAE5E1wB,KAAK8hC,iBACP9hC,KAAK8hC,gBAAgBlb,YAIvB,MAAMpS,EAAcrV,IACpB,IAA8B,QAA1B+J,EAAAlJ,KAAK8S,OAAO4D,oBAAc,IAAAxN,OAAA,EAAAA,EAAA64B,eAAgBvtB,GAAeA,EAAYuS,OAAQ,CAC/E,MAAMib,kBAAEA,SAA4B/B,OAAO,mBAE3Cha,EAAe+b,CAChB,CAEDhiC,KAAK8hC,gBAAkB,IAAI/b,GAAgB/lB,KAAKgmB,cAAehmB,KAAK8S,OAAQ9S,KAAKyhC,cAAexb,SAE1FjmB,KAAKiiC,6BAEXjiC,KAAKyB,eAAelB,IAAI,iDAExBP,KAAKi/B,wBAAuB,SAEtBj/B,KAAKw/B,4BAA4B,CAAE33B,eAAgB7F,EAAQ6F,iBAAkB,KACpF,CAED,YAAAq6B,CAAatqB,EAA4BtP,GACvC,OAAO7I,EAAcO,KAAKmiC,kBAAkBvqB,EAAWtP,GACxD,CAEK,iBAAA65B,CACJvqB,EACAtP,EACAtG,kDAEAhC,KAAKwX,uBAAwB,EAC7BxX,KAAKoiC,8BAA2Bz/B,EAEhC,MAAM0/B,EAAoBriC,KAAK2/B,aAAe3/B,KAAK2/B,YAAY/nB,UAC3DyqB,GACFriC,KAAKs/B,WAAW+C,GAGlB,MAAMC,EAAsBh6B,GAAYtI,KAAKyhC,cAQ7C,GAPAzhC,KAAK2/B,YAAc,IAAI3D,GAAmB,CACxCpkB,UAAWA,EACXtP,SAAUg6B,IAKRtiC,KAAKohC,uBAAyBiB,EAAmB,CACnD,MAAMtnB,aAAEA,SAAuB/a,KAAKohC,sBAAsB/mB,qBAAqBra,KAAK2/B,YAAY/nB,WAChG5X,KAAK8S,OAASiI,CACf,EAEc,UAAX/a,KAAK8S,cAAM,IAAA7Q,OAAA,EAAAA,EAAEyY,uBACT1a,KAAKw/B,4BAA4B,CAAE33B,eAAgB7F,eAAAA,EAAS6F,uBAE5D7H,KAAKu/B,iBAEd,CAED,0BAAAgD,GACE,MAAMzvB,EAAS9S,KAAK8S,OACd6sB,EAAc3/B,KAAK2/B,YACzB,IAAK7sB,IAAW6sB,EAEd,OADA3/B,KAAKyB,eAAeV,KAAK,kFAClB,GAGT,MAAMyhC,EAAexiC,KAAKyiC,kBAC1B,IAAIC,EAAoD,CAAA,EA0BxD,OAxBIF,IACFE,EAAkB,CAChBrxB,CAACA,GAAkCsuB,EAAY1D,gBAAkB0D,EAAY1D,gBAAkB,MAE7FnpB,EAAO2D,YACTisB,EAAgBhxB,GAAiCtF,KAAKC,UAAU,CAC9Ds2B,QAASr2B,EAAiBwG,EAAOvQ,QAAQqX,eAK1C5Z,KAAKsgC,oBACR1uB,EAAiBgxB,aACjB,CACEJ,eACAE,gBAAiBA,GAEC,KAApB1iC,KAAK8+B,YAEiB,KAApB9+B,KAAK8+B,aACP9+B,KAAK8+B,WAAa,GAEpB9+B,KAAK8+B,aAEE4D,CACR,CA2FD,UAAApD,CAAW1nB,SACT,MAAMirB,EAAkBjrB,IAA6B,QAAhB3V,EAAAjC,KAAK2/B,mBAAW,IAAA19B,OAAA,EAAAA,EAAE2V,WACjDtP,EAAWtI,KAAKyhC,cACtBzhC,KAAKgmB,eACH6c,GACAv6B,GACAtI,KAAKgmB,cAAcoK,0BAA0B,CAAExY,UAAWirB,EAAiBv6B,YAC9E,CAEK,UAAA+3B,CAAWyC,GAAyB,kDACxC,KAAqB,QAAhB7gC,EAAAjC,KAAK2/B,mBAAW,IAAA19B,OAAA,EAAAA,EAAE2V,WAErB,OADA5X,KAAKyB,eAAelB,IAAI,4DACjBX,QAAQC,UAGjB,MAAMyI,EAAWtI,KAAKyhC,cACtB,OAAKn5B,GAILtI,KAAKgmB,eAAiB8c,GAA+B9iC,KAAKgmB,cAAcuK,iBAAiB,CAAEjoB,aAEpFtI,KAAKu/B,iBALVv/B,KAAKyB,eAAelB,IAAI,2DACjBX,QAAQC,aAKlB,CAED,YAAAkjC,WACE,IAAIC,EACJ,GAAe,UAAXhjC,KAAK8S,cAAM,IAAA7Q,OAAA,EAAAA,EAAET,aAAc,CAE7BwhC,GE/YuCxhC,EF8YKxB,KAAK8S,OAAOtR,kBE7YrC,IAAjBA,IAA2BA,EAAexC,GACvCmL,EAAmBI,YAAY/I,IF4YkC4I,cAClCT,cAAchI,MACnD,CEhZ8B,IAAUH,EFkZzC,YAA+BmB,IAAxBqgC,EAAoCA,EAAiC,UAAXhjC,KAAK8S,cAAM,IAAA5Q,OAAA,EAAAA,EAAEP,MAC/E,CAED,eAAA8gC,GACE,IAAKziC,KAAK2/B,cAAgB3/B,KAAK8S,SAAW9S,KAAK2/B,YAAY/nB,UAEzD,OADA5X,KAAKyB,eAAeV,KAAK,yFAClB,EAET,IAAKf,KAAK8S,OAAOwH,eAIf,OAHAta,KAAKyB,eAAelB,IAClB,WAAWP,KAAK2/B,YAAY/nB,8HAEvB,EAGT,GAAI5X,KAAK+iC,eAEP,OADA/iC,KAAKyB,eAAelB,IAAI,kBAAkBP,KAAK2/B,YAAY/nB,qDACpD,EAGT,IAAI4qB,GAAe,EACfzoB,EAAU,GACVkpB,GAAU,EAId,GAAIjjC,KAAK8S,OAAO4H,gBACT1a,KAAKwX,uBAMRuC,EAAU,iCAAiC/Z,KAAK2/B,YAAY/nB,kDAC5D5X,KAAKyB,eAAelB,IAAIwZ,GACxByoB,GAAe,EACfS,GAAU,IARVlpB,EAAU,qCAAqC/Z,KAAK2/B,YAAY/nB,sDAChE5X,KAAKyB,eAAelB,IAAIwZ,GACxByoB,GAAe,EACfS,GAAU,OAOP,ErC/agC9J,EqCgbEn5B,KAAK2/B,YAAY/nB,UrChbRnC,EqCgbmBzV,KAAK8S,OAAO2C,WrC/a7EytB,EAAa52B,EAAiB6sB,EAAUvf,YAEZ,GADlB7E,KAAKouB,IAAID,GAEK,IACf,IAAUztB,IqCkbnB+sB,GAAe,EACfS,GAAU,IANVlpB,EAAU,kBAAkB/Z,KAAK2/B,YAAY/nB,iDAC7C5X,KAAKyB,eAAelB,IAAIwZ,GACxByoB,GAAe,EACfS,GAAU,EAKb,CrC1b4B,IAAU9J,EAAW1jB,EAC9CytB,EqCscJ,OAVIljC,KAAKoiC,2BAA6BI,GAAgBxiC,KAAK8S,OAAO4H,kBAC3D1a,KAAKsgC,oBAAoB1uB,EAAiBwxB,mBAAoB,CACjErpB,UACAnC,UAAW5X,KAAK2/B,YAAY/nB,UAC5BqrB,UACAxD,gBAAiBz/B,KAAK4/B,sBAExB5/B,KAAKoiC,yBAA2BI,GAG3BA,CACR,CAED,iBAAAa,aAIE,MAAMhoB,EAAyD,QAAzClZ,EAA0B,QAA1BD,EAAW,UAAXlC,KAAK8S,cAAM,IAAA7Q,OAAA,EAAAA,EAAEkU,qBAAa,IAAAjU,OAAA,EAAAA,EAAEmZ,qBAAa,IAAAlZ,EAAAA,EAAI,GACnE,GAA6B,IAAzBkZ,EAAc1a,OAGlB,OAAO0a,CACR,CAED,oBAAAioB,eACE,GAAqD,kBAArB,QAA5BphC,EAAa,QAAbD,EAAAjC,KAAK8S,cAAQ,IAAA7Q,OAAA,EAAAA,EAAAkU,qBAAe,IAAAjU,OAAA,EAAAA,EAAA6Q,kBAC9B,MAAO,IAGT,MAAMG,EAA2C,QAA5B9Q,EAAa,QAAbD,EAAAnC,KAAK8S,cAAQ,IAAA3Q,OAAA,EAAAA,EAAAgU,qBAAe,IAAA/T,OAAA,EAAAA,EAAA8Q,aACjD,OAAKA,QAAL,CAKD,CAEK,mBAAAqwB,CAAoB1oB,4DACxB,MAAM2oB,EAAU,GAGhB,IACE,MAAMC,EAAoBvG,GAAwB,CAChDhpB,gBAA8C,QAA9BhS,EAAW,QAAXD,EAAAjC,KAAK8S,cAAM,IAAA7Q,OAAA,EAAAA,EAAEmU,yBAAiB,IAAAlU,OAAA,EAAAA,EAAEgS,iBAAkB,GAClEopB,eAA0B,QAAXn7B,EAAAnC,KAAK8S,cAAM,IAAA3Q,OAAA,EAAAA,EAAE6T,0BAA0B,EACtDunB,wBAAiBn7B,EAAApC,KAAK8S,6BAAQmD,yBAC9BC,6BAAsBpN,EAAA9I,KAAK8S,6BAAQoD,uBAGrCstB,EAAQh/B,KAAKi/B,EACd,CAAC,MAAOziC,GACPhB,KAAKyB,eAAeV,KAAK,wCAAyCC,EACnE,CAaD,GAA4B,QAAxB+H,EAAA8R,aAAa,EAAbA,EAAeha,eAAS,IAAAkI,OAAA,EAAAA,EAAA0I,QAC1B,IAEE,MAAMiyB,uBAAEA,SAAiCzD,OAAO,2BAChDuD,EAAQh/B,KAAKk/B,EAAuB,CAAErxB,MAAOwI,EAAcha,QAAQ8iC,SACpE,CAAC,MAAO3iC,GACPhB,KAAKyB,eAAeV,KAAK,iCAAkCC,EAC5D,CAGH,OAAOwiC,EAAQ7iC,OAAS,EAAI6iC,OAAU7gC,IACvC,CAEa,iBAAAihC,4CACZ,GAAI5jC,KAAKg/B,eACP,OAAOh/B,KAAKg/B,eAGd,IACE,MAAMnG,OAAEA,SAAiBoH,OAAO,yBAEhC,OADAjgC,KAAKg/B,eAAiBnG,EACfA,CACR,CAAC,MAAO73B,GAEP,OADAhB,KAAKyB,eAAeV,KAAK,sCAAuCC,GACzD,IACR,IACF,CAEK,YAAAu+B,CAAasE,GAAoB,0DACrC,MAAM/wB,EAAS9S,KAAK8S,OACd0vB,EAAexiC,KAAKyiC,kBACpB7qB,EAA4B,QAAhB3V,EAAAjC,KAAK2/B,mBAAW,IAAA19B,OAAA,EAAAA,EAAE2V,UACpC,IAAK4qB,IAAiB5qB,IAAc9E,EAClC,OAEF9S,KAAK8gC,sBAEL,MAAM9B,QAAuBh/B,KAAK4jC,oBAGlC,IAAK5E,EACH,aAGIh/B,KAAKiiC,6BAEU,QAArB//B,EAAAlC,KAAK+gC,wBAAgB,IAAA7+B,GAAAA,EAAEyJ,OAAOrH,IACvBtE,KAAKsgC,oBAAoB1uB,EAAiBkyB,cAAex/B,EAAM,IAEtE,MAAM6R,cAAEA,EAAaC,kBAAEA,EAAiByE,cAAEA,GAAkB/H,EAEtDixB,GAAQ3tB,aAAiB,EAAjBA,EAAmB3E,SAC7B,CACEuyB,iBACEhkC,KAAKgmB,eACLuT,GAAUv5B,KAAKyB,eAAgB,CAC7BukB,cAAehmB,KAAKgmB,cACpBpO,YACA4hB,WAAYx5B,KAAKyhC,YAAYxvB,KAAKjS,MAClCy5B,OAAQuF,EAAevF,OACvBvlB,uBAAgB/R,EAAAiU,EAAkBlC,8BAAkB,KAExD+vB,OAAQjkC,KAAK0hC,YAEf,GAEExtB,GACJkC,aAAA,EAAAA,EAAmB3E,UAAW2E,EAAkBlC,eAAiBkC,EAAkBlC,eAAiB,GAEtGlU,KAAKyB,eAAelB,IAAI,wCAAwCqX,MAEhE,IACE5X,KAAK6+B,qBAAuBG,EAAe,CACzCkF,KAAO5/B,IACL,GAAItE,KAAK+iC,eAIP,OAHA/iC,KAAKyB,eAAelB,IAAI,kBAAkBqX,4CAC1C5X,KAAK8gC,2BACL9gC,KAAKs/B,aAIHh7B,EAAM2G,OAASk5B,GAAeC,OAChC9/B,EAAMygB,KAAKiE,KAAOhV,EAAW1P,EAAMygB,KAAKiE,KAAM9U,IAG5ClU,KAAK8hC,iBAEP9hC,KAAK8hC,gBAAgBra,aAAanjB,EAAOsT,EAC1C,EAEHysB,iBAAkBvxB,EAAO6C,uBACzBouB,QACAO,eAAe,EACfC,cAAe5yB,EACf6yB,WlCzlBmB,YkC0lBnBnpB,cAAerb,KAAKqjC,oBACpBttB,sCAAuCjD,EAAOiD,sCAC9C0uB,YAAa5xB,EAAO,QAASsD,GAC7BuuB,WAAY7xB,EAAO,OAAQsD,GAC3BwuB,iBAAkB3kC,KAAKsjC,uBACvBsB,cAAc,EACdC,eAAgB,CACdC,eAAQ1iC,EAAA0Q,EAAO6D,sCAAiBmuB,OAChCC,gBAASj8B,EAAAgK,EAAO6D,sCAAiBouB,SAEnCC,aAAehkC,IACb,MAAMigC,EAAajgC,EAGnB,GAAIigC,EAAWlnB,QAAQvW,SAAS,eAAiBy9B,EAAWlnB,QAAQvW,SAAS,iBAC3E,MAAMy9B,EAMR,GAAIA,EAAWgE,WACb,MAAMhE,EAKR,OAFAjhC,KAAKyB,eAAeV,KAAK,iCAAkCkgC,EAAWrnB,aAE/D,CAAI,EAEb4pB,cAAexjC,KAAKujC,oBAAoB1oB,KAGrC7a,KAAKsgC,oBAAoB1uB,EAAiBszB,YAC3CrB,GACG7jC,KAAKsgC,oBAAoB1uB,EAAiB+uB,SAAU3gC,KAAKmlC,SAEjE,CAAC,MAAOnkC,GACPhB,KAAKyB,eAAeV,KAAK,uCAAwCC,EAClE,IACF,CAoDD,WAAAygC,SACE,OAAuB,UAAhBzhC,KAAK2/B,mBAAW,IAAA19B,OAAA,EAAAA,EAAEqG,QAC1B,CAED,YAAA88B,SACE,OAAuB,UAAhBplC,KAAK2/B,mBAAW,IAAA19B,OAAA,EAAAA,EAAE2V,SAC1B,CAEK,KAAA8Q,CAAMC,GAAW,kDACrB,eAAO1mB,EAAAjC,KAAKgmB,oCAAe0C,MAAMC,KAClC,CAED,QAAA0c,GACErlC,KAAKi/B,wBAAuB,GAC5Bj/B,KAAK8gC,sBACL9gC,KAAKs/B,YACN,CAEO,UAAAgG,CAAWC,GACjB,MAAgB,WAAZA,EACK,2CAGO,YAAZA,EACK,2CAGF,IACR,CAEO,WAAAjE,CACN1pB,EACAmD,EACA5D,EACAY,EACAytB,EACAC,EACAF,GAEA,MAAMG,GAAY9tB,aAAA,EAAAA,EAAWgC,YAAatN,EAAiBsL,EAAUgC,iBAAcjX,EAEnF3C,KAAKmlC,SAAW,CACdpqB,eACA5D,cACAY,eACAH,YACA8tB,YACAjwB,WAAYsF,EAAatF,WACzBkwB,cAAe3lC,KAAKslC,WAAWC,GAC/BC,mBACAI,kBAAmB,oCACnBH,uBAEH,CAEa,0BAAAxD,sDACZ,YAAI9/B,EAA4B,QAA5BD,EAAa,UAAblC,KAAK8S,cAAQ,IAAA7Q,OAAA,EAAAA,EAAA4Y,qBAAe,IAAA3Y,OAAA,EAAAA,EAAA2jC,8BAASp0B,WAAYzR,KAAK+gC,iBACxD,IACE,MAAQ+E,iBAAkBC,SAAgC9F,OAAO,sBACjEjgC,KAAK+gC,iBAAmB,IAAIgF,CAC7B,CAAC,MAAO/kC,GACPhB,KAAKyB,eAAeV,KAAK,oDAAqDC,EAC/E,IAEJ,EG9vBI,MAAM2J,GAAgBq7B,GAAiC,KAC5D,MAAMlzB,OAAEA,GAAWkzB,GACXvkC,eAAgBqJ,EAAM7K,SAAEA,GAAa6S,GAAU1R,IACvD,MAAO,CACL0J,SACA7K,WACD,EAgCH,IAAA+lC,GA7BqD,MACnD,MAAMA,EAAgB,IAAIpH,GAC1B,MAAO,CACLsC,KAAM12B,EAAaw7B,EAAc9E,KAAKjvB,KAAK+zB,GAAgB,OAAQr7B,GAAaq7B,IAChFxG,4BAA6Bh1B,EAC3Bw7B,EAAcxG,4BAA4BvtB,KAAK+zB,GAC/C,6BACAr7B,GAAaq7B,IAEf9D,aAAc13B,EACZw7B,EAAc9D,aAAajwB,KAAK+zB,GAChC,eACAr7B,GAAaq7B,IAEfZ,aAAc56B,EACZw7B,EAAcZ,aAAanzB,KAAK+zB,GAChC,eACAr7B,GAAaq7B,IAEfzD,2BAA4B/3B,EAC1Bw7B,EAAczD,2BAA2BtwB,KAAK+zB,GAC9C,6BACAr7B,GAAaq7B,IAEftd,MAAOle,EAAaw7B,EAActd,MAAMzW,KAAK+zB,GAAgB,QAASr7B,GAAaq7B,IACnFX,SAAU76B,EAAaw7B,EAAcX,SAASpzB,KAAK+zB,GAAgB,WAAYr7B,GAAaq7B,IAC7F,EAGYC,GC1CF,MAAA/E,KACXA,GAAIgB,aACJA,GAAYkD,aACZA,GAAY7C,2BACZA,GAA0B7Z,MAC1BA,GAAK2c,SACLA,GAAQ7F,4BACRA,IACEwG"}